Análise qualitativa e quantitativa de dados
Resumo das principais medidas estatísticas e alguns estudos de caso.
import pandas as pd
from scipy.stats import mode, skewtest, variation, normaltest, skew
import numpy as np
from numpy import median, var, std
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
df = pd.read_excel(r'C:\Users\lucas\Desktop\People_Analytics.xlsx',
sheet_name= 'BaseDados', index_col = 'N')
df
O método info
mosta algumas informações como os tipos das variáveis, quantidade de dados não nulos e as colunas do dataframe.
df.info()
Para que o pandas identifique quais são as variáveis que são consideradas categoricas para necessário fazer essa distinção.
df[['estado_civil', 'grau_instrucao', 'reg_procedencia']] = df[['estado_civil', 'grau_instrucao', 'reg_procedencia']].astype('category')
DataFrame com as variáveis categóricas classificadas.
df.info()
df.groupby('grau_instrucao').size().plot.bar(figsize=(14,8))
df_melted = df[['n_filhos', 'salario', 'idade_anos']].melt()
sns.set_style(style='whitegrid')
sns.boxplot(data=df_melted, x='variable', y='value', palette='Set1')
sns.set(rc={'figure.figsize':(14,8)})
A função describe tem a função de retornar variáveis como: contagem, média, desvio padrão, valor mínimo, quartis, média, mediana e máximo.
df.describe()
print(df[['n_filhos', 'salario', 'idade_anos']].min())
print(20*'_')
print(df[['n_filhos', 'salario', 'idade_anos']].max())
df.mean()
print('A mediana do número de filhos é: %i' % median(df[['n_filhos']].dropna(axis=0)))
print('A mediana do salário é: %.2f' % median(df[['salario']]))
print('A mediana da idade é: %.2f' % median(df[['idade_anos']]))
for i in df.columns:
print('A moda para a coluna', str(i),'é:', mode(df[i])[0][0])
for i in ['n_filhos', 'salario', 'idade_anos']:
print('O coeficiente de assimetria da coluna %s é: %.2f' % (i, skew(df[i].dropna(axis=0))))
A variância populacional é a média aritmética dos desvios dos dados em relação a média.
A função que será utilizada é var
do numpy, documentação no link: https://numpy.org/doc/stable/reference/generated/numpy.var.html?highlight=var#numpy.var.
var(df)
O desvio padrão populacional é a raiz quadrada da variância populacional.
A função utilizada é std
do numpy, a documentação segue no link: https://numpy.org/doc/stable/reference/generated/numpy.std.html?highlight=std#numpy.std.
std(df)
A variância amostral é calculada praticamente igual a populacinal, todavia apresenta um penalidade de uma unidade no denominador.
Para calcular a variância amostral é somente penalizar o denominador, que é realizada acrescentando o argumento ddof = 1
na função var
.
var(df, ddof=1)
O desvio padrão amostral é a raiz quadrada da variância amostral.
std(df, ddof=1)
O coeficiente de variação é a variação relativa entre o desvio padrão e a média dos dados.
A documentação da função variation
no Scipy está no link: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.variation.html#scipy.stats.variation
for i in ['n_filhos', 'salario', 'idade_anos']:
print('O coeficiente de assimetria da coluna %s é: %.4f' % (i, variation(df[i].dropna(axis=0))))
variation(df[['n_filhos', 'salario', 'idade_anos']], nan_policy='omit')
Carregando a base de dados de clientes de uma financeira.
df_cred = pd.read_excel(r"C:\Users\lucas\Desktop\Exercícios.xlsx", sheet_name='Base de Dados 1')
df_cred.head()
Resumo estastístico.
df_cred.describe()
Não temos na base de dados valores faltantes (null
).
df_cred.info()
Qual a idade média dos clientes presentes no banco de dados?
print('A idade média dos clientes é: %.2f' % df_cred.Idade.mean())
df_cred.Idade.describe()
- Mínimo = 30
- Máximo = 94
- Mediana = 66
- 1º Quartil = 47
- 3º Quartil = 70
Existem clientes com idades discrepantes? Analise o boxplot.
sns.set_style(style='whitegrid')
sns.boxplot(data=df_cred.Idade, palette='Set1')
sns.set(rc={'figure.figsize':(14,8)})
Existem clientes que possuem rendimento total discrepante em relação aos demais clientes? Analise o boxplot.
sns.set_style(style='whitegrid')
sns.boxplot(data=df_cred['Rendimento Total'], palette='Set2')
sns.set(rc={'figure.figsize':(14,8)})
A partir de qual valor o rendimento é considerado discrepante?
#LIMITE SUPERIOR
2.5*df_cred['Rendimento Total'].describe()[6] - 1.5*df_cred['Rendimento Total'].describe()[4]
LS = Q3 + 1.5 IIQ = Q3 + 1.5 (Q3 - Q1) = 2.5 Q3 - 1.5 * Q1
#LIMITE INFERIOR
1.5*df_cred['Rendimento Total'].describe()[4] - 0.5*df_cred['Rendimento Total'].describe()[6]
A variável rendimento total pode ser considerada simétrica?
skew(df_cred['Rendimento Total'])
Resposta: Não, pois para ser considereada simetrica o coeficiente de assimetria (skewness) deverá ser próximo de zero. Que nesse caso indica que a distribuição tem uma calda a direita e a média é maior que a mediana, pois tem um valor é positivo.
Existem clientes que possuem salário discrepante em relação aos demais clientes? Analise o boxplot.
sns.set_style(style='whitegrid')
sns.boxplot(data=df_cred['Salário'], palette='Set3')
sns.set(rc={'figure.figsize':(14,8)})
A partir de qual valor o salário é considerado discrepante?
2.5*df_cred['Salário'].describe()[6] - 1.5*df_cred['Salário'].describe()[4]
A variável salário pode ser considerada simétrica?
skew(df_cred['Salário'])
Resposta: Não, pois para ser considereada simetrica o coeficiente de assimetria (skewness) deverá ser próximo de zero.
Existem clientes que possuem limite de cheque especial discrepante em relação aos demais clientes? Analise o boxplot.
sns.set_style(style='whitegrid')
sns.boxplot(data=df_cred['Limite do Cheque Especial'], palette='Spectral_r')
sns.set(rc={'figure.figsize':(14,8)})
A partir de qual valor o limite de cheque especial é considerado discrepante?
2.5*df_cred['Limite do Cheque Especial'].describe()[6] - 1.5*df_cred['Limite do Cheque Especial'].describe()[4]
A variável limite de cheque especial pode ser considerada simétrica?
skew(df_cred['Limite do Cheque Especial'])
Resposta: Não
Carregando a base de dados utilizando a biblioteca do pandas.
df_telecom = pd.read_excel(r"C:\Users\lucas\Desktop\Exercícios.xlsx", sheet_name='Base de Dados 2')
df_telecom.head()
df_telecom.info()
Quantos clientes a base de dados possui? Quantos são mulheres? E de forma relativa, quantas são mulheres?
#Quantos clientes a base de dados possui?
df_telecom.shape[0]
#Quantos são mulheres?
df_telecom.Sexo.loc[df_telecom.Sexo == 'Feminino'].count()
#E de forma relativa, quantas são mulheres?
fem_rel = (df_telecom.Sexo.loc[df_telecom.Sexo == 'Feminino'].count()/df_telecom.shape[0])*100
print('De forma relativa temos {} % mulheres em nosso banco de dados.'.format(fem_rel))
Quais são os valores da média, mediana, mínimo, máximo e quartis do tempo de relacionamento?
df_telecom['Tempo_relacionamento (anos)'].describe()
- Mínimo = 0
- Máximo = 10
- Mediana = 5
- 1º Quartil = 3
- 3º Quartil = 7
Com base na distribuição de frequências do tempo de relacionamento, qual a proporção de clientes que ainda não completaram um ano de relacionamento?
sns.set_style(style='whitegrid')
sns.distplot(df_telecom["Tempo_relacionamento (anos)"], kde=False)
sns.set(rc={'figure.figsize':(14,8)})
Qual a proporção de clientes que possuem 10 anos de relacionamento?
rel = (df_telecom[['Tempo_relacionamento (anos)']].loc[df_telecom['Tempo_relacionamento (anos)'] == 10].count()/df_telecom.shape[0])*100
print('De forma relativa temos {} % com 10 anos de relacionamento em nosso banco de dados.'.format(rel))
Qual o % de clientes tem 1 produto? E 2 produtos? Utilize a variável Num_de_Produtos.
prod_1 = (df_telecom.ID.loc[df_telecom.Num_de_Produtos == 1].count()/df_telecom.shape[0])*100
prod_2 = (df_telecom.ID.loc[df_telecom.Num_de_Produtos == 2].count()/df_telecom.shape[0])*100
print('O percentual de clientes com 1 produto: %.2f' % prod_1)
print('O percentual de clientes com 2 produto: %.2f' % prod_2)
Qual o total de clientes que já cancelaram os produtos? E que não cancelaram? Qual a frequencia relativa de cada categoria? Considere 1 para o cliente que cancelou e 0 para o cliente que nao cancelou.
can = df_telecom.Cancelou.loc[df_telecom.Cancelou == 1].count()
n_can = df_telecom.Cancelou.loc[df_telecom.Cancelou == 0].count()
print('Cancelou: %i \nNão cancelou: %i' % (can, n_can))
total = df_telecom.shape[0]
can_per = can*100/total
n_can_per = n_can*100/total
print('Cancelou: %.2f \nNão cancelou: %.2f' % (can_per, n_can_per))
Carregando a base de dados.
df_imb = pd.read_excel(r"C:\Users\lucas\Desktop\Exercícios.xlsx", sheet_name='Base de Dados 3')
df_imb.head()
df_imb.info()
Faça a distribuição de frequências da variável idade.
df_imb.groupby('Idade_imovel').count()['Id_Imovel']
O histograma da com a distribuição de frequência absolutas das idades dos imóveis.
df_imb.groupby('Idade_imovel').size().plot.bar()
Faça a distribuição de frequências da variável região.
df_imb.groupby('Região').count()['Id_Imovel']
df_imb.groupby('Região').size().plot.bar()
Faça a distribuição de frequências conjunta entre as variáveis idade do imóvel e região. Você acredita que a idade do imóvel sofre influência da região? Qual região se destaca por ter imóveis mais novos (até 10 anos)?
total_norte = df_imb.groupby(['Região','Idade_imovel']).size()['Norte'].sum()
total_sul = df_imb.groupby(['Região','Idade_imovel']).size()['Sul'].sum()
df_imb_gruped = df_imb.groupby(['Região','Idade_imovel']).size()
df_imb_gruped[0:3] = df_imb_gruped[0:3]/total_norte
df_imb_gruped[3:] = df_imb_gruped[3:]/total_sul
df_imb_gruped.unstack().plot.bar(stacked=True, figsize = (14,8))
Qual o valor do mínimo, máximo, mediana, Q1 e Q3 da variável distância ao metrô? Interprete os valores.
df_imb.Distancia_metro_Km.describe()
- Mínimo = 0.76
- Máximo = 2.14
- Mediana = 1.51
- 1º Quartil = 1.38
- 3º Quartil = 1.77
Qual o valor do mínimo, máximo, mediana, Q1 e Q3 da variável valor do imóvel (R$ mil) por m2? Interprete os valores.
df_imb.Mil_reais_m2.describe()
- Mínimo = 1.52
- Máximo = 15.66
- Mediana = 7.68
- 1º Quartil = 5.54
- 3º Quartil = 9.32
Faça o gráfico de dispersão entre a distância ao metrô e o valor do imóvel (R$ mil) por m2. Você acredita que, em geral, quanto maior a distância do imóvel até o metrô, menor o seu valor?
sns.scatterplot(data=df_imb, x = "Distancia_metro_Km", y = 'Mil_reais_m2', hue='Idade_imovel') #coloração definida pela idade do imóvel
sns.scatterplot(data=df_imb, x = "Distancia_metro_Km", y = 'Mil_reais_m2', hue='Região')