Você pode dar uma olhada em scipy.stats
:
from pydoc import help
from scipy.stats.stats import pearsonr
help(pearsonr)
>>>
Help on function pearsonr in module scipy.stats.stats:
pearsonr(x, y)
Calculates a Pearson correlation coefficient and the p-value for testing
non-correlation.
The Pearson correlation coefficient measures the linear relationship
between two datasets. Strictly speaking, Pearson's correlation requires
that each dataset be normally distributed. Like other correlation
coefficients, this one varies between -1 and +1 with 0 implying no
correlation. Correlations of -1 or +1 imply an exact linear
relationship. Positive correlations imply that as x increases, so does
y. Negative correlations imply that as x increases, y decreases.
The p-value roughly indicates the probability of an uncorrelated system
producing datasets that have a Pearson correlation at least as extreme
as the one computed from these datasets. The p-values are not entirely
reliable but are probably reasonable for datasets larger than 500 or so.
Parameters
----------
x : 1D array
y : 1D array the same length as x
Returns
-------
(Pearson's correlation coefficient,
2-tailed p-value)
References
----------
http://www.statsoft.com/textbook/glosp.html#Pearson%20Correlation
A correlação de Pearson pode ser calculada com numpy
corrcoef
.fonte
Uma alternativa pode ser uma função scipy nativa do linregress que calcula:
E aqui está um exemplo:
retornará você:
fonte
lineregress(two_row_df)
Se você não deseja instalar o scipy, usei esse hack rápido, ligeiramente modificado em Programming Collective Intelligence :
(Editado para correção.)
fonte
TypeError: unsupported operand type(s) for -: 'itertools.imap' and 'float'
atnum = psum - (sum_x * sum_y/n)
O código a seguir é uma interpretação direta da definição :
Teste:
retorna
Isso concorda com o Excel, esta calculadora , SciPy (também NumPy ), que retorna 0,981980506 e 0,9819805060619657 e 0,98198050606196574, respectivamente.
R :
EDIT : Corrigido um bug apontado por um comentarista.
fonte
sum(x) / len(x)
você divide ints, não flutua. Entãosum([1,5,7]) / len([1,5,7]) = 13 / 3 = 4
, de acordo com a divisão inteira (enquanto você deseja13. / 3. = 4.33...
). Para corrigi-lo, reescreva esta linha comofloat(sum(x)) / float(len(x))
(um float é suficiente, pois o Python a converte automaticamente).Você também pode fazer isso com
pandas.DataFrame.corr
:Isto dá
fonte
Em vez de depender de numpy / scipy, acho que minha resposta deve ser a mais fácil de codificar e entender as etapas do cálculo do coeficiente de correlação de Pearson (PCC).
O significado do PCC é basicamente mostrar o quão fortemente correlacionadas as duas variáveis / listas estão. É importante observar que o valor do PCC varia de -1 a 1 . Um valor entre 0 e 1 indica uma correlação positiva. Valor de 0 = variação mais alta (sem correlação). Um valor entre -1 e 0 indica uma correlação negativa.
fonte
sum
função interna .Cálculo do coeficiente de Pearson usando pandas em python: sugiro tentar essa abordagem, pois seus dados contêm listas. Será fácil interagir com seus dados e manipulá-los no console, pois você pode visualizar sua estrutura de dados e atualizá-la como desejar. Você também pode exportar o conjunto de dados, salvá-lo e adicionar novos dados a partir do console python para análise posterior. Este código é mais simples e contém menos linhas de código. Suponho que você precise de algumas linhas rápidas de código para rastrear seus dados para análise posterior
Exemplo:
No entanto, você não publicou seus dados para ver o tamanho do conjunto de dados ou as transformações que podem ser necessárias antes da análise.
fonte
Hmm, muitas dessas respostas têm código longo e difícil de ler ...
Eu sugiro usar numpy com seus recursos bacanas ao trabalhar com matrizes:
fonte
Esta é uma implementação da função Correlação de Pearson usando numpy:
fonte
Aqui está uma variante da resposta do mkh que corre muito mais rápido que ela e scipy.stats.pearsonr, usando o numba.
fonte
Aqui está uma implementação para a correlação de pearson com base no vetor esparso. Os vetores aqui são expressos como uma lista de tuplas expressas como (índice, valor). Os dois vetores esparsos podem ter comprimentos diferentes, mas o tamanho de todo o vetor deverá ser o mesmo. Isso é útil para aplicativos de mineração de texto em que o tamanho do vetor é extremamente grande devido ao fato de a maioria dos recursos serem um conjunto de palavras e, portanto, os cálculos geralmente são realizados usando vetores esparsos.
Testes unitários:
fonte
Eu tenho uma solução muito simples e fácil de entender para isso. Para duas matrizes de comprimento igual, o coeficiente de Pearson pode ser facilmente calculado da seguinte maneira:
fonte
Você pode se perguntar como interpretar sua probabilidade no contexto de procurar uma correlação em uma direção específica (correlação negativa ou positiva). Aqui está uma função que escrevi para ajudar nisso. Pode até estar certo!
É baseado nas informações que eu colhi de http://www.vassarstats.net/rsig.html e http://en.wikipedia.org/wiki/Student%27s_t_distribution , graças a outras respostas postadas aqui.
fonte
Você pode dar uma olhada neste artigo. Este é um exemplo bem documentado para calcular a correlação com base nos dados históricos dos pares de moedas cambiais de vários arquivos usando a biblioteca pandas (para Python) e depois gerar um gráfico de mapa de calor usando a biblioteca marítima.
http://www.tradinggeeks.net/2015/08/calculating-correlation-in-python/
fonte
fonte