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!