SciPy - Estatísticas
Todas as funções estatísticas estão localizadas no sub-pacote scipy.stats e uma lista bastante completa dessas funções pode ser obtida usando info(stats)função. Uma lista de variáveis aleatórias disponíveis também pode ser obtida nodocstringpara o subpacote de estatísticas. Este módulo contém um grande número de distribuições de probabilidade, bem como uma biblioteca crescente de funções estatísticas.
Cada distribuição univariada tem sua própria subclasse, conforme descrito na tabela a seguir -
Sr. Não. | Classe e descrição |
---|---|
1 | rv_continuous Uma classe de variável aleatória contínua genérica destinada à subclasse |
2 | rv_discrete Uma classe de variável aleatória discreta genérica destinada a subclasses |
3 | rv_histogram Gera uma distribuição dada por um histograma |
Variável Aleatória Contínua Normal
Uma distribuição de probabilidade em que a variável aleatória X pode assumir qualquer valor é uma variável aleatória contínua. A palavra-chave location (loc) especifica a média. A palavra-chave de escala (escala) especifica o desvio padrão.
Como uma instância do rv_continuous classe, norm objeto herda dele uma coleção de métodos genéricos e os completa com detalhes específicos para esta distribuição particular.
Para calcular o CDF em vários pontos, podemos passar uma lista ou um array NumPy. Vamos considerar o seguinte exemplo.
from scipy.stats import norm
import numpy as np
print norm.cdf(np.array([1,-1., 0, 1, 3, 4, -2, 6]))
O programa acima irá gerar a seguinte saída.
array([ 0.84134475, 0.15865525, 0.5 , 0.84134475, 0.9986501 ,
0.99996833, 0.02275013, 1. ])
Para encontrar a mediana de uma distribuição, podemos usar a Função de Ponto Percentual (PPF), que é o inverso do CDF. Vamos entender usando o exemplo a seguir.
from scipy.stats import norm
print norm.ppf(0.5)
O programa acima irá gerar a seguinte saída.
0.0
Para gerar uma sequência de variáveis aleatórias, devemos usar o argumento de palavra-chave size, que é mostrado no exemplo a seguir.
from scipy.stats import norm
print norm.rvs(size = 5)
O programa acima irá gerar a seguinte saída.
array([ 0.20929928, -1.91049255, 0.41264672, -0.7135557 , -0.03833048])
A saída acima não é reproduzível. Para gerar os mesmos números aleatórios, use a função de semente.
Distribuição uniforme
Uma distribuição uniforme pode ser gerada usando a função uniforme. Vamos considerar o seguinte exemplo.
from scipy.stats import uniform
print uniform.cdf([0, 1, 2, 3, 4, 5], loc = 1, scale = 4)
O programa acima irá gerar a seguinte saída.
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
Construir distribuição discreta
Vamos gerar uma amostra aleatória e comparar as frequências observadas com as probabilidades.
Distribuição binomial
Como uma instância do rv_discrete class, a binom objectherda dele uma coleção de métodos genéricos e os completa com detalhes específicos para esta distribuição particular. Vamos considerar o seguinte exemplo.
from scipy.stats import uniform
print uniform.cdf([0, 1, 2, 3, 4, 5], loc = 1, scale = 4)
O programa acima irá gerar a seguinte saída.
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
Estatísticas descritivas
As estatísticas básicas, como Mín, Máx, Média e Variância, usam a matriz NumPy como entrada e retorna os respectivos resultados. Algumas funções estatísticas básicas disponíveis noscipy.stats package são descritos na tabela a seguir.
Sr. Não. | Descrição da função |
---|---|
1 | describe() Calcula várias estatísticas descritivas da matriz passada |
2 | gmean() Calcula a média geométrica ao longo do eixo especificado |
3 | hmean() Calcula a média harmônica ao longo do eixo especificado |
4 | kurtosis() Calcula a curtose |
5 | mode() Retorna o valor modal |
6 | skew() Testa a distorção dos dados |
7 | f_oneway() Executa uma ANOVA de 1 fator |
8 | iqr() Calcula o intervalo interquartil dos dados ao longo do eixo especificado |
9 | zscore() Calcula o escore z de cada valor da amostra, em relação à média e ao desvio padrão da amostra |
10 | sem() Calcula o erro padrão da média (ou erro padrão de medição) dos valores na matriz de entrada |
Várias dessas funções têm uma versão semelhante no scipy.stats.mstats, que funcionam para matrizes mascaradas. Vamos entender isso com o exemplo dado abaixo.
from scipy import stats
import numpy as np
x = np.array([1,2,3,4,5,6,7,8,9])
print x.max(),x.min(),x.mean(),x.var()
O programa acima irá gerar a seguinte saída.
(9, 1, 5.0, 6.666666666666667)
Teste t
Vamos entender como o T-test é útil no SciPy.
ttest_1samp
Calcula o teste T para a média de UM grupo de pontuações. Este é um teste bilateral para a hipótese nula de que o valor esperado (média) de uma amostra de observações independentes 'a' é igual à média da população dada,popmean. Vamos considerar o seguinte exemplo.
from scipy import stats
rvs = stats.norm.rvs(loc = 5, scale = 10, size = (50,2))
print stats.ttest_1samp(rvs,5.0)
O programa acima irá gerar a seguinte saída.
Ttest_1sampResult(statistic = array([-1.40184894, 2.70158009]),
pvalue = array([ 0.16726344, 0.00945234]))
Comparando duas amostras
Nos exemplos a seguir, há duas amostras, que podem vir da mesma distribuição ou de distribuições diferentes, e queremos testar se essas amostras têm as mesmas propriedades estatísticas.
ttest_ind- Calcula o teste T para as médias de duas amostras independentes de pontuação. Este é um teste bilateral para a hipótese nula de que duas amostras independentes têm valores médios (esperados) idênticos. Este teste assume que as populações têm variações idênticas por padrão.
Podemos usar este teste, se observarmos duas amostras independentes da mesma população ou de populações diferentes. Vamos considerar o seguinte exemplo.
from scipy import stats
rvs1 = stats.norm.rvs(loc = 5,scale = 10,size = 500)
rvs2 = stats.norm.rvs(loc = 5,scale = 10,size = 500)
print stats.ttest_ind(rvs1,rvs2)
O programa acima irá gerar a seguinte saída.
Ttest_indResult(statistic = -0.67406312233650278, pvalue = 0.50042727502272966)
Você pode testar o mesmo com uma nova matriz do mesmo comprimento, mas com uma média variada. Use um valor diferente emloc e teste o mesmo.