Este relatório foi compilado em: 07/10/2025 11:14:17.
library(reticulate) #para usar o python no RStudio#garantir que o reticulate vai usar o Python 3.12 que está presente nos pcs do labuse_virtualenv("~/.virtualenvs/r-reticulate", required =TRUE)py_run_string("import polars as pl; print(pl.__version__)")
1.33.1
#instalar pacotes dentro desse Python, apenas se o chunk logo abaixo não funcionarpy_install("pip", pip =TRUE)
Using virtual environment "\\smb/ra212974/Documentos/.virtualenvs/r-reticulate" ...
Utilizando o arquivo renda_adulta.csv e sabendo que ele não possui cabeçalho, faça a importação do banco de dados utilizando os nomes das colunas conforme apresentado acima e na sequência ali indicada. No momento da importação do arquivo, você deve, também, indicar os tipos de cada uma das colunas. Utilize o fato de que o símbolo ? representa valores faltantes.
#definindo os nomes das colunasnomes_colunas = ["idade", "classe_trabalho", "fnlwgt", "educacao", "num_educacao","estado_civil", "ocupacao", "relacionamento", "raca", "sexo","ganho_capital", "perda_capital", "horas_semanais", "pais_origem", "renda"]#definição dos tipos de cada colunatipos_colunas = {"idade": pl.Int64,"classe_trabalho": pl.Utf8,"fnlwgt": pl.Int64,"educacao": pl.Utf8,"num_educacao": pl.Int64,"estado_civil": pl.Utf8,"ocupacao": pl.Utf8,"relacionamento": pl.Utf8,"raca": pl.Utf8,"sexo": pl.Utf8,"ganho_capital": pl.Int64,"perda_capital": pl.Int64,"horas_semanais": pl.Int64,"pais_origem": pl.Utf8,"renda": pl.Utf8}#leitura do CSV sem cabeçalho, substituindo '?' por nulosrenda_adulta = pl.read_csv("renda_adulta.csv", has_header =False, #arquivo sem cabeçalho new_columns = nomes_colunas, #define os nomes schema_overrides = tipos_colunas, #define os tipos null_values ="?"#trata ? como valor faltante)#exibir as 5 primeiras linhasprint(renda_adulta.head())
#mostrando o tipo de cada coluna#o \n no início e no fim adiciona linhas em branco antes e depois da mensagem, para deixar a saída mais organizadaprint("\nTipos de cada coluna:\n")
Tipos de cada coluna:
for coluna, tipo in renda_adulta.schema.items():print(f"{coluna:<15} -> {tipo}")
Crie um objeto chamado renda_longo, no qual você transforma as colunas capital-gain e capital-loss (formato wide) para formato longo. Os valores destas variáveis devem ser armazenados numa nova coluna chamada Valor e os tipos de valores (gain e loss) devem ser armazenados numa coluna chamada tipo.
# remove espaços extras no início ou final dos valores da coluna 'renda'# isso evita problemas como comparar '>50K ' com '>50K'renda_adulta = renda_adulta.with_columns( pl.col("renda").str.strip_chars().alias("renda"))# transforma as colunas 'ganho_capital' e 'perda_capital' do formato wide → long# melt() "empilha" essas duas colunas em uma só chamada 'Valor'# e cria outra coluna chamada 'tipo' indicando se o valor vem de ganho ou perdarenda_longo = renda_adulta.unpivot( index = ["idade", "classe_trabalho", "fnlwgt", "educacao", "num_educacao","estado_civil", "ocupacao", "relacionamento", "raca", "sexo","horas_semanais", "pais_origem", "renda" ], # colunas que permanecem fixas on = ["ganho_capital", "perda_capital"], # colunas que serão empilhadas variable_name="tipo", # nova coluna que indica o tipo (ganho ou perda) value_name="Valor"# nova coluna que armazena os valores numéricos)# substitui os nomes longos das variáveis por versões curtas# "ganho_capital" → "gain"# "perda_capital" → "loss"renda_longo = renda_longo.with_columns( pl.col("tipo") .str.replace("ganho_capital", "gain") .str.replace("perda_capital", "loss"))#exibe as primeiras linhas do novo DataFrame em formato longoprint(renda_longo.head())
Quais são as médias de horas trabalhadas por classe salarial?
#calcular a média de horas por classe salarialmedia_horas = ( renda_adulta .group_by("renda") #agrupa pelos níveis de renda .agg(pl.col("horas_semanais").mean().alias("media_horas")) #calcula média)#ordenar para ficar mais legível (opcional)media_horas = media_horas.sort("renda")#exibir o resultadoprint(media_horas)
Se cada linha representa uma pessoa, quantas pessoas foram amostradas em cada profissão?
#remover espaços extras na coluna 'ocupacao'renda_adulta = renda_adulta.with_columns( pl.col("ocupacao").str.strip_chars().alias("ocupacao"))#contar o número de pessoas por ocupaçãocontagem_ocupacao = ( renda_adulta .group_by("ocupacao") #agrupa por profissão .agg(pl.len().alias("num_pessoas")) #conta quantas linhas/pessoas em cada grupo .sort("num_pessoas", descending =True) #opcional: ordena do maior para o menor)#exibir resultadoprint(contagem_ocupacao)
Crie um gráfico de barras que apresente o número médio de horas trabalhadas semanalmente em função do nível salarial.
#importando uma biblioteca necessáriaimport matplotlibmatplotlib.use("Agg") #backend que não abre janelas, adequado para renderização em qmdimport matplotlib.pyplot as plt#calculando a média de horas por nível salarialmedia_horas = ( renda_adulta .group_by("renda") .agg(pl.col("horas_semanais").mean().alias("media_horas")) .sort("renda") # opcional: ordena alfabeticamente pelos níveis de renda)#convertendo para listas para o matplotlibrenda_labels = media_horas["renda"].to_list()horas_medias = media_horas["media_horas"].to_list()#criando o gráfico de barrasplt.figure(figsize=(8, 5))plt.bar(renda_labels, horas_medias, color=["darkred", "darkblue"])plt.title("Média de Horas Trabalhadas por Semana por Nível Salarial")plt.xlabel("Nível Salarial")plt.ylabel("Média de Horas Semanais")plt.ylim(0, max(horas_medias) +5) # adiciona espaço acima das barras
(0.0, 50.473026399693914)
plt.show()
Desafio: existe alguma evidência de discriminação salarial entre gêneros biológicos?
#limpando espaços nas colunas de interesserenda_adulta = renda_adulta.with_columns([ pl.col("renda").str.strip_chars().alias("renda"), pl.col("sexo").str.strip_chars().alias("sexo")])#contando pessoas acima e abaixo de 50k por gênerocontagem_sexo_renda = ( renda_adulta .group_by(["sexo", "renda"]) .agg(pl.len().alias("quantidade")) .sort(["sexo", "renda"]))print("\nTabela 1: Contagem de pessoas por gênero e classe salarial")
Tabela 1: Contagem de pessoas por gênero e classe salarial
print(contagem_sexo_renda) #isso mostra, para cada gênero, quantas pessoas estão acima ou abaixo de 50K
#calculando proporção de renda por gênero#total por gênerototal_por_genero = ( renda_adulta.group_by("sexo") .agg(pl.len().alias("total")))#pessoas com renda >50Kacima_50k = ( renda_adulta.filter(pl.col("renda") ==">50K") .group_by("sexo") .agg(pl.len().alias("acima_50k")))#unir e calcular proporçãoproporcao = total_por_genero.join(acima_50k, on="sexo", how="left").with_columns( (pl.col("acima_50k") / pl.col("total") *100).alias("perc_acima_50k"))print("\nTabela 2: Proporção de pessoas com renda >50K")
Segundo a Tabela 1, é notável que Uma proporção maior de homens está na classe salarial >50K, enquanto mulheres têm menos representantes na faixa salarial alta.
De acordo com a Tabela 2, a proporção de pessoas com renda >50K é maior para homens comparado a mulheres. Em termos absolutos, mais homens ganham >50K, refletindo desigualdade salarial na amostra.