#!/usr/bin/env python # coding: utf-8 # # Análise Descritiva de Dados da PNAD 2015 # ## Importações # In[1]: import pandas as pd import numpy as np import seaborn as sns import scipy import os # In[2]: # Exibe as versões das bibliotecas importadas no ambiente de execução do Google Colab print(f'Versão do pandas: {pd.__version__}') print(f'Versão do numpy: {np.__version__}') print(f'Versão do seaborn: {sns.__version__}') print(f'Versão do scipy: {scipy.__version__}') # ## Conjunto de Dados do Projeto # A **Pesquisa Nacional por Amostra de Domicílios (PNAD)** investiga anualmente, de forma permanente, características gerais da população, de educação, trabalho, rendimento e habitação e outras, com periodicidade variável, de acordo com as necessidades de informação para o país, como as características sobre migração, fecundidade, nupcialidade, saúde, segurança alimentar, entre outros temas. O levantamento dessas estatísticas constitui, ao longo dos 49 anos de realização da pesquisa, um importante instrumento para formulação, validação e avaliação de políticas orientadas para o desenvolvimento socioeconômico e a melhoria das condições de vida no Brasil. # ### Variáveis Utilizadas # * **Renda**: rendimento mensal do trabalho principal para pessoas de 10 anos ou mais de idade. # * **Idade**: idade do morador na data de referência em anos. # * **Altura**: altura do morador em metros (elaboração própria). # * **UF**: estado da federação # * **Anos de Estudo**: anos de estudo do morador. # * **Cor**: cor declarada pelo morador. # # # ### Observações # # Os seguintes tratamentos foram realizados nos dados originais da pesquisa: # # # # 1. Forma eliminados os registros onde a renda inválida (999 999 999 999) # 2. Foram eliminados os registros onde a renda era missing # 3. Foram considerados somente os registros das pessoas de referência de cada domicílio (responsável pelo domicílio) # # # ## Análise dos Dados # ### Importação e Visualização dos Dados # In[3]: # Cria um dataframe com os resultados da pesquisa dados = pd.read_csv('dados.csv') # Exibe as 10 primeiras linhas do dataframe recém-criado dados.head(10) # In[41]: # Exibe a forma do dataframe dados.shape # # ### Análise do Comportamento da Variável Renda # #### Classes de Renda # # Já que a variável renda é quantitativa, vamos criar intervalos de renda nos quais os valores desta variável possam cair. Desta forma, poderemos construir uma tabela de frequências para determinar a quantidade de observações que pertencem a cada intervalo. # # São estes os intervalos: # # # # * **A**: Acima de 25 SM # * **B**: De 15 a 25 SM # * **C**: De 5 a 15 SM # * **D**: De 2 a 5 SM # * **E**: Até 2 SM # # Na época da pesquisa 1 salário mínimo (SM) valia R$ 788,00. # In[4]: menor_salario = dados['Renda'].min() maior_salario = dados['Renda'].max() # In[5]: print(f'Menor salário: {menor_salario}', f'Maior salário: {maior_salario}', sep='\n') # In[6]: # Definição das classes de salários classes = [menor_salario, 1576, 3940, 11820, 19700, maior_salario] classes # In[7]: # Rótulos para cada intervalo (classe de renda) rotulos = list('EDCBA') rotulos # In[8]: # Cria uma Series do pandas, categorizando cada valor de renda pd.cut( x=dados['Renda'], bins=classes, labels=rotulos, include_lowest=True ) # In[9]: # Cria uma tabela de frequências absolutas das classes de renda tabela_freq_absoluta = pd.value_counts( pd.cut( x=dados['Renda'], bins=classes, labels=rotulos, include_lowest=True ), sort=False ) tabela_freq_absoluta # In[10]: # Cria uma tabela de frequências relativas das classes de renda tabela_freq_relativa = pd.value_counts( pd.cut( x=dados['Renda'], bins=classes, labels=rotulos, include_lowest=True ), sort=False, normalize=True ) tabela_freq_relativa # In[11]: # Cria uma tabela com as distribuições de frequências distribuicao_freq = pd.DataFrame( { 'Freq Absoluta': tabela_freq_absoluta, 'Freq Relativa (%)': tabela_freq_relativa * 100 } ) distribuicao_freq # In[12]: distribuicao_freq.rename_axis('Classe de Renda', axis=1, inplace=True) # In[13]: distribuicao_freq.sort_index(axis= 0, ascending=True, inplace=True, key=lambda x: x.str.lower()) # In[14]: distribuicao_freq # In[15]: from matplotlib import pyplot as plt def adicionar_rotulos_dados(x, y): """Adiciona rótulos de dados no gráfico""" for i in range(len(x)): plt.text(i, y[i] + 500, y[i], ha='center') # Define o tamanho da figura plt.figure(figsize=(12,6)) # Plota um gráfico de barras distribuicao_freq['Freq Absoluta'].plot.bar(alpha=0.85) # Adiciona os rótulos de dados adicionar_rotulos_dados(x=distribuicao_freq.index, y=distribuicao_freq['Freq Absoluta']) # Título do gráfico plt.title('Distribuição de Frequências para Classes de Renda') # Rótulo do eixo x plt.xlabel('Classe de Renda') # Rótulo do eixo y plt.ylabel('Freq. Absoluta') # Linha de grade plt.grid(visible=False) # Exibe a figura plt.show() # #### Conclusões # A maioria das pessoas entrevistadas (64,75%) pertence à classe E, que é a das pessoas que ganham até 2 (dois) salários mínimos. # # É possível observar que há uma quantidade descrescente de pessoas que percentem às classes subsequentes, o que indica que uma pequena parcela dos entrevistados ganham altos salários. # ### Tabelas de Contingência para Sexo e Cor # In[16]: # Dicionário com os significados dos códigos dos sexos sexo = { 0: 'Masculino', 1: 'Feminino' } # Dicionário com os significados dos códigos das cores cor = { 0: 'Indígena', 2: 'Branca', 4: 'Preta', 6: 'Amarela', 8: 'Parda', 9: 'Sem declaração' } # In[17]: # Cria uma tabela de contingência de frequências absolutas tabela_contingencia_sexo_cor = pd.crosstab( index=dados['Sexo'], columns=dados['Cor'], margins=True, margins_name='Total' ) tabela_contingencia_sexo_cor # In[18]: # Renomeia os índices e as colunas da tabela tabela_contingencia_sexo_cor.rename(index=sexo, columns=cor, inplace=True) tabela_contingencia_sexo_cor # In[19]: tabela_contingencia_relativa_sexo_cor = pd.crosstab( index=dados['Sexo'], columns=dados['Cor'], margins=True, margins_name='Total', normalize='all' ) tabela_contingencia_relativa_sexo_cor # In[20]: tabela_contingencia_relativa_sexo_cor.rename(index=sexo, columns=cor, inplace=True) tabela_contingencia_relativa_sexo_cor # #### Conclusões # A maior parte dos entrevistados (69,29%) eram homens, dos quais a maioria eram da cor parda (32,51%). # # A maior parte dos entrevistados, incluindo homens e mulheres, eram pardos (46,75%). # ### Medidas de Tendência Central e de Dispersão para a Renda # In[21]: # Média da renda renda_media = dados['Renda'].mean() renda_media # In[22]: # Renda mediana renda_mediana = dados['Renda'].median() renda_mediana # In[23]: # Renda modal renda_modal = dados['Renda'].mode()[0] renda_modal # In[24]: renda_media > renda_mediana > renda_modal # Como `renda_media > renda_mediana > renda_modal`, a distribuição da variável renda tem uma assimetria à direita, sugerindo que há uma concentração elevada de valores de renda baixos. # In[25]: # Desvio absoluto média da renda dam_renda = (dados['Renda'] - dados['Renda'].mean()).abs().mean() dam_renda # In[26]: # Variância da renda variancia_renda = dados['Renda'].var() variancia_renda # In[27]: # Desvio padrão da renda desvio_padrao_renda = dados['Renda'].std() desvio_padrao_renda # In[28]: tabela_contingencia_sexo_cor_renda = pd.crosstab( index=dados['Cor'], columns=dados['Sexo'], values=dados['Renda'], aggfunc=['mean', 'median', 'max'], ) tabela_contingencia_sexo_cor_renda.rename( index=cor, columns={ 0: 'Masculino', 1: 'Feminino', 'mean': 'Média', 'median': 'Mediana', 'max': 'Máximo' } ) # In[29]: tabela_contingencia_sexo_cor_renda_dispersao = pd.crosstab( index=dados['Cor'], columns=dados['Sexo'], values=dados['Renda'], aggfunc=['std'] ) tabela_contingencia_sexo_cor_renda_dispersao.rename( index=cor, columns={ 0: 'Masculino', 1: 'Feminino', 'std': 'Desvio Padrão' }, inplace=True ) tabela_contingencia_sexo_cor_renda_dispersao.round(2) # #### Conclusões # No geral, os homens de todas as raças têm salários médios maiores que os das mulheres, exceto entre os indígenas. Esta exceção pode ser explicada por um registro de renda de R$120.000,00 entre as mulheres indígenas, o que deve ter elevado a renda média das mulheres indígenas. # # Em termos de renda mediana, homens e mulheres amarelos têm os maiores salários, ao passo que os indígenas têm os menores salários. # # O maior valor de renda (R$200.000,00) foi registrado para homens da cor branca. # # Entre os homens, há maior dispersão nos valores de renda para os amarelos e menor dispersão para os indígenas. # # Entre as mulheres, há maior dispersão nos valores de renda para as indígenas e menor dispersão para as pretas. # ### Diagramas de Caixa para a Renda # In[30]: # Cria um diagrama de caixa (boxplot) para a variável renda # Utiliza somente as observações em que a renda era inferior a R$ 10 mil ax = sns.boxplot( data=dados.query('Renda < 10000'), x='Renda', y='Cor', hue='Sexo', orient='h' ) # Define as dimensões da figura ax.figure.set_size_inches(14, 8) # Define o título ax.set_title('Renda por Cor e Sexo', fontsize=18) # Define o título do eixo x ax.set_xlabel('Renda (R$)', fontsize=12) # Define o título do eixo y ax.set_ylabel('Cor', fontsize=12) # Muda os marcores do eixo y ax.set_yticklabels(['Indígena', 'Branca', 'Preta', 'Amarela', 'Parda'], fontsize=12) # Obtém os identificadores e os rótulos da legenda do gráfico identificadores, rotulos = ax.get_legend_handles_labels() # Configura a legenda do gráfico ax.legend(handles=identificadores, labels=['Masculino', 'Feminino']) # Exibe o gráfico ax # #### Conclusões # Com este diagrama podemos notar que, no geral, a renda dos homens é superior a das mulheres. # # Nota-se também que há maior dispersão nos valores de renda de homens e mulheres amarelos do que nos valores de renda de pessoas de outras raças. # ### Análise de Percentis para a Variável Renda # In[31]: # Series com os valores de renda para cada percentil percentis_renda = dados['Renda'].quantile([i / 100 for i in range(1, 100)]) percentis_renda # In[32]: # Qual é o percentual de entrevistados da PNAD 2015 que ganham até 1 (um) salário mínimo? percentis_renda[percentis_renda <= 788] # Observa-se que 28% dos entrevistados ganhavam até 1 (um) salário mínimo, que era de R$788,00. # In[33]: # Percentual de pessoas que ganham até R$788,00 scipy.stats.percentileofscore(dados['Renda'], score=788, kind='weak') # In[34]: # Qual é o valor máximo ganho por 99% das pessoas do conjunto de dados? percentis_renda.loc[0.99] # ### Análise da Variável Renda Segundo Anos de Estudo # In[35]: # Dicionário com as traduções dos códigos para nos de estudo anos_de_estudo = { 1: 'Sem instrução e menos de 1 ano', 2: '1 ano', 3: '2 anos', 4: '3 anos', 5: '4 anos', 6: '5 anos', 7: '6 anos', 8: '7 anos', 9: '8 anos', 10: '9 anos', 11: '10 anos', 12: '11 anos', 13: '12 anos', 14: '13 anos', 15: '14 anos', 16: '15 anos ou mais', 17: 'Não determinados' } # In[36]: tabela_contingencia_anos_estudo_sexo_renda = pd.crosstab( index=dados['Anos de Estudo'], columns=dados['Sexo'], values=dados['Renda'], aggfunc=['mean', 'median', 'max', 'std'] ) tabela_contingencia_anos_estudo_sexo_renda.rename( index=anos_de_estudo, columns={ 0: 'Masculino', 1: 'Feminnino', 'mean': 'Média', 'median': 'Mediana', 'max': 'Máximo', 'std': 'Desvio Padrão' }, inplace=True ) tabela_contingencia_anos_estudo_sexo_renda # Observa-se que, no geral, a renda de pessoas com maior escolaridade tende a ser superior a das pessoas com menor escolaridade. # In[37]: # Cria um diagrama de caixa ax = sns.boxplot( data=dados.query('Renda < 10000'), x='Renda', y='Anos de Estudo', hue='Sexo', orient='h' ) # Define as dimensões da figura ax.figure.set_size_inches(24,18) # Define o título do gráfico ax.set_title('Boxplot da Renda por Anos de Estudo e Sexo', fontsize=16) # Define o rótulo do eixo x ax.set_xlabel('Renda (R$)', fontsize=14) # Define o rótulo do eixo y ax.set_ylabel('Anos de Estudo', fontsize=14) # Configura os rótulos dos marcadores do eixo y ax.set_yticklabels([valor for valor in anos_de_estudo.values()], fontsize=14) # Obtém os identificadores e os rótulos da legenda identificadores, rotulos = ax.get_legend_handles_labels() # Configura a legenda ax.legend(title='Sexos', loc='upper right', handles=identificadores, labels=['Masculino', 'Feminino'], fontsize=14) # Exibe o gráfico ax # #### Conclusões # No geral, as pessoas com maior grau de escolaridade têm salários maiores. # # Há diversas observações em que os homens com menor grau de escolaridade que as mulheres têm salários mais elevados. # ### Análise da Variável Renda para Unidades da Federação # In[38]: # Dicionário com as traduções dos códigos das UFs ufs = { 11: 'Rondônia', 12: 'Acre', 13: 'Amazonas', 14: 'Roraima', 15: 'Pará', 16: 'Amapá', 17: 'Tocantins', 21: 'Maranhão', 22: 'Piauí', 23: 'Ceará', 24: 'Rio Grande do Norte', 25: 'Paraíba', 26: 'Pernambuco', 27: 'Alagoas', 28: 'Sergipe', 29: 'Bahia', 31: 'Minas Gerais', 32: 'Espírito Santo', 33: 'Rio de Janeiro', 35: 'São Paulo', 41: 'Paraná', 42: 'Santa Catarina', 43: 'Rio Grande do Sul', 50: 'Mato Grosso do Sul', 51: 'Mato Grosso', 52: 'Goiás', 53: 'Distrito Federal' } # In[39]: renda_por_uf = dados.groupby('UF')['Renda'].agg(['mean', 'median', 'max', 'std']) renda_por_uf.rename( index=ufs, columns={ 'mean': 'Média', 'median': 'Mediana', 'max': 'Máximo', 'std': 'Desvio Padrão' }, inplace=True ) renda_por_uf # As três Unidades da Federação (UFs) com maior salário mediano, em ordem crescente, são estas: # # # # 1. Distrito Federal (2.000,00) # 2. Rio de Janeiro (1.800,00) # 3. São Paulo (1.600,00) # # As três UFs com menor salário mediano, em ordem crescente, são estas: # # # # 1. Maranhão (700,00) # 2. Piauí (750,00) # 3. Sergipe (788,00) # # A UF com maior dispersão de valores de renda era o Distrito Federa, seguido pelo Rio de Janeiro e pelo Paraná. # # # # In[40]: # Cria um boxplot para a variável renda versus a UF ax = sns.boxplot( data=dados.query('Renda < 10000'), x='Renda', y='UF', orient='h' ) # Define as dimensões da figura ax.figure.set_size_inches(21, 15) # Define o rótulo do eixo x ax.set_xlabel('Renda (R$)', fontsize=14) # Define o rótulo do eixo y ax.set_ylabel('UF', fontsize=14) # Define os rótulos do eixo y ax.set_yticklabels([uf for uf in ufs.values()], fontsize=14) # Define o título do gráfico ax.set_title('Distribuição da Renda por UF', fontsize=18) # Exibe o gráfico ax # Observa-se que os salários e a dispersão dos valores dos salários de entrevistados que moravam em estados das regiões sudeste, sul e centro-oeste eram superiores aos dos que moravam no norte e no nordeste.