Estatística Descritiva com Python
March 31, 2016
Introdução
Segundo o Google, a Estatística é o “ramo da matemática que trata da coleta, da análise, da interpretação e da apresentação de massas de dados numéricos”. Desta forma, a Estatística é também importante parte da Ciência de Dados, utilizada para analisar uma série de situações e problemas através de seus mais variados conceitos.
Este post não visa ser um curso completo de Estatística, mas uma introdução que apresente alguns conceitos e como aplicar estes conceitos com Python.
Aqui vamos focar na Estatística Descritiva, que é a parte da Estatística que visa descrever e sumarizar um conjunto de dados. Para isso, são usadas uma série de medidas, como a famosa média.
Nos exemplos vamos usar o Dataset do Titanic novamente, mas vamos também olhar um exemplo com uma série mais simples do Pandas, apenas para que se possa conferir que está tudo sendo calculado corretamente.
As medidas da Estatística Descritiva se dividem entre medidas de tendência central e medidas de dispersão.
Medidas de Tendência Central
As medidas de tendência central definem valores significativos, representativos e adequados para um conjunto de dados, dependendo do que se deseja analisar. São elas a média, mediana, quantis e a moda.
Média
A média é uma medida de tendência central que indica o valor onde estão concentrados os dados de um conjunto de valores, representando um valor significativo para o mesmo.
No caso dos Dataframes do Pandas, a média é calculada através da função mean()
dos Dataframes, que também está presente nas Series do Pandas. Vamos criar uma Series do Pandas e calcular sua média, e também vamos calcular a idade média dos passageiros do Titanic:
import pandas as pd
import numpy as np
train_df = pd.read_csv('train.csv')
example_series = pd.Series([1,5,10,30,50,30,15,40,45])
print(train_df['Age'].mean())
29.69911764705882
print(example_series.mean())
25.11111111111111
Mediana e Quantil
A mediana é o valor que separa a metade superior da metade inferior de uma distribuição de dados, ou o valor no centro da distribuição. Na prática, se o número de observações na distribuição é ímpar, ele é o valor central, e se o número de observações é par, ele será a média das duas observações mais centrais. Ela é calculada através da função median()
, novamente, presente em dataframes e series. Vejamos abaixo:
print(train_df['Age'].median())
28.0
print(example_series.median())
30.0
A mediana é um conceito menos suscetível a grandes valores discrepantes do que a média. Se o número de observações não é muito grande e você tem uma observação que é muito maior do que os outros, a sua média pode começar a ficar menos representativa com relação à maioria do seu grupo. Por exemplo, se você está analisando o rendimento de uma classe da faculdade e um deles é um milionário, enquanto o restante é o trabalhador médio da empresa, a mediana será, provavelmente, uma melhor representação dos rendimentos do grupo como um todo, uma vez que a média estará “contaminada” pelo valor discrepante.
Já o quantil pode ser entendido como uma generalização da mediana. O quantil é o valor abaixo do qual está um certo percentual dos dados. No caso da mediana, esse percentual é de 50%. Vejamos o código para o quantil, que pode ser calculado através da função quantile()
. Esta função, por padrão, adota o percentual (representado através do parâmetro q
) de 50%, ou seja, é uma mediana por padrão. Você pode configurar outros percentuais através deste mesmo parâmetro:
print(train_df['Age'].quantile())
28.0
print(example_series.quantile())
30.0
print(train_df['Age'].quantile(q=0.25))
20.125
print(example_series.quantile(q=0.25))
10.0
Moda
A moda é simples. Nada mais é que o valor que mais se repete dentro de um conjunto. No Pandas, a moda é calculada através da função mode()
. Vejamos os exemplos:
print(train_df['Age'].mode())
0 24
dtype: float64
print(example_series.mode())
0 30
dtype: int64
A função retorna os valores deste jeito pois, no caso de dois valores diferentes para a moda, a função retorna todos. Vejamos:
example_series_2 = pd.Series([1,5,10,30,50,30,15,40,45,45])
print(example_series_2.mode())
0 30
1 45
dtype: int64
Medidas de Dispersão
As medidas de dispersão são medidas que indicam o quão espalhados os dados estão, ou como eles variam. São elas a amplitude, a variância, o desvio padrão e o desvio absoluto.
Amplitude
A amplitude nada mais é do que a diferença entre o maior e o menor valor de um conjunto de dados. Para fazer este cálculo no Pandas, usaremos as funções max()
e min()
, que obviamente, retornam o valor máximo e mínimo de um conjunto de dados, e depois subtrairemos um do outro:
print(train_df['Age'].max() - train_df['Age'].min())
79.58
print(example_series.max() - example_series.min())
49
Variância
A variância é uma medida que expressa quanto os dados de um conjunto estão afastados de seu valor esperado. Calculamos a variância no Pandas através da função var()
:
print(train_df['Age'].var())
211.0191247463081
print(example_series.var())
325.1111111111111
Desvio Padrão
O desvio padrão também é uma medida de dispersão, que indica quanto os dados estão afastados da média. Um valor de desvio padrão alto indica que os valores estão mais espalhados, mais longe da média, e um desvio padrão baixo indica que os valores estão mais próximos da média. No Pandas fazemos o cálculo através da função std()
:
print(train_df['Age'].std())
14.526497332334044
print(example_series.std())
18.03083778173136
Desvio absoluto
O Desvio Absoluto é calculado da seguinte forma: primeiro, encontramos a média dos valores; depois, calculamos a distância de cada ponto desta média; somamos as distâncias e dividimos o resultado pela média destas distâncias.
No Pandas, a função mad()
faz este cálculo. Vejamos os exemplos:
print(train_df['Age'].mad())
11.322944471906405
print(example_series.mad())
15.432098765432098
Covariância e Correlação
Em alguns momentos, queremos saber se duas variáveis possuem alguma relação entre si dentro de um conjunto de dados. Para estes casos, calculamos a covariância e a correlação.
A covariância é uma medida numérica que indica a inter-dependência entre duas variáveis. A covariância indica como duas variáveis se comportam conjuntamente em relação às suas médias. Uma covariância igual a 0 indica que as duas variáveis são totalmente independentes, enquanto que uma covariância alta e positiva indica que uma variável é grande quando a outra é grande. Analogamente, uma covariância negativa e com valor absoluto alto indica que uma variável é pequena quando a outra é grande. A covariância pode ser calculada no Pandas através da função cov()
. Ela retorna uma matriz indicando a covariância de cada coluna com outra:
print(train_df.cov())
PassengerId Survived Pclass Age SibSp \
PassengerId 66231.000000 -0.626966 -7.561798 138.696504 -16.325843
Survived -0.626966 0.236772 -0.137703 -0.551296 -0.018954
Pclass -7.561798 -0.137703 0.699015 -4.496004 0.076599
Age 138.696504 -0.551296 -4.496004 211.019125 -4.163334
SibSp -16.325843 -0.018954 0.076599 -4.163334 1.216043
Parch -0.342697 0.032017 0.012429 -2.344191 0.368739
Fare 161.883369 6.221787 -22.830196 73.849030 8.748734
Parch Fare
PassengerId -0.342697 161.883369
Survived 0.032017 6.221787
Pclass 0.012429 -22.830196
Age -2.344191 73.849030
SibSp 0.368739 8.748734
Parch 0.649728 8.661052
Fare 8.661052 2469.436846
A covariância, entretanto, pode ser difícil de ser compreendida e comparada, pois ela nos dá valores em escalas que serão diferentes conforme as variáveis mudem. Para uma melhor comparação, normalizamos a covariância para ter um valor que sempre estará entre 1 e -1, que é a correlação. Logo, a correlação também é outra medida que indica o quanto duas variáveis estão relacionadas. Seu valor fica sempre entre -1, que indica uma anti-correlação perfeita, e 1, que indica uma correlação perfeita. Calculamos a correlação no Pandas com a função corr()
, que assim como a função cov()
, irá retornar uma matriz com a correlação de cada coluna com as outras colunas do Dataframe:
print(train_df.corr())
PassengerId Survived Pclass Age SibSp Parch \
PassengerId 1.000000 -0.005007 -0.035144 0.036847 -0.057527 -0.001652
Survived -0.005007 1.000000 -0.338481 -0.077221 -0.035322 0.081629
Pclass -0.035144 -0.338481 1.000000 -0.369226 0.083081 0.018443
Age 0.036847 -0.077221 -0.369226 1.000000 -0.308247 -0.189119
SibSp -0.057527 -0.035322 0.083081 -0.308247 1.000000 0.414838
Parch -0.001652 0.081629 0.018443 -0.189119 0.414838 1.000000
Fare 0.012658 0.257307 -0.549500 0.096067 0.159651 0.216225
Fare
PassengerId 0.012658
Survived 0.257307
Pclass -0.549500
Age 0.096067
SibSp 0.159651
Parch 0.216225
Fare 1.000000
Entretanto, é necessário cuidado ao avaliar as correlações. Alguns dados podem indicar uma correlação que não existe de fato, e é apenas obra do acaso, o que é possível em certos casos onde variáveis apresentam algum tipo de padrão que pode levar a este valor de correlação.
Por fim, também é importante atentar para o famoso conceito que diz que “correlação não implica causalidade”. O que isso quer dizer é, quando duas variáveis apresentam um alto valor de correlação, pode ser que a primeira variável cause este comportamento na segunda, que a segunda causa este comportamento na primeira, que ambas causam o comportamento na outra ou isso também pode não dizer nada, como nos casos que mencionamos acima. O segredo para não cair nesta armadilha é conhecer bem os dados, para que se possa fazer sempre uma avaliação criteriosa, caso a caso.
Bem, para uma introdução de Estatística Descritiva, acredito que seja um bom começo :)
Abraços!