Puedes echar un vistazo a 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
La correlación de Pearson se puede calcular con numpy's
corrcoef
.fuente
Una alternativa puede ser una función scipy nativa de linregress que calcula:
Y aquí hay un ejemplo:
te devolveré:
fuente
lineregress(two_row_df)
Si no tiene ganas de instalar scipy, he usado este truco rápido, ligeramente modificado de Programming Collective Intelligence :
(Editado para su corrección).
fuente
TypeError: unsupported operand type(s) for -: 'itertools.imap' and 'float'
atnum = psum - (sum_x * sum_y/n)
El siguiente código es una interpretación directa de la definición :
Prueba:
devoluciones
Esto concuerda con Excel, esta calculadora , SciPy (también NumPy ), que devuelve 0.981980506 y 0.9819805060619657 y 0.98198050606196574, respectivamente.
R :
EDITAR : se corrigió un error señalado por un comentarista.
fuente
sum(x) / len(x)
ustedes dividen ints, no flotadores. Entoncessum([1,5,7]) / len([1,5,7]) = 13 / 3 = 4
, de acuerdo con la división de enteros (mientras lo desee13. / 3. = 4.33...
). Para solucionarlo, vuelva a escribir esta línea comofloat(sum(x)) / float(len(x))
(un flotador es suficiente, ya que Python lo convierte automáticamente).También puedes hacer esto con
pandas.DataFrame.corr
:Esto da
fuente
En lugar de confiar en numpy / scipy, creo que mi respuesta debería ser la más fácil de codificar y comprender los pasos para calcular el coeficiente de correlación de Pearson (PCC).
La importancia de PCC es básicamente mostrarle cuán fuertemente correlacionadas están las dos variables / listas. Es importante tener en cuenta que el valor de PCC varía de -1 a 1 . Un valor entre 0 y 1 denota una correlación positiva. Valor de 0 = variación más alta (sin correlación alguna). Un valor entre -1 y 0 denota una correlación negativa.
fuente
sum
función integrada.Cálculo del coeficiente de Pearson usando pandas en python: sugeriría probar este enfoque ya que sus datos contienen listas. Será fácil interactuar con sus datos y manipularlos desde la consola, ya que puede visualizar su estructura de datos y actualizarla como desee. También puede exportar el conjunto de datos y guardarlo y agregar nuevos datos de la consola de Python para su posterior análisis. Este código es más simple y contiene menos líneas de código. Supongo que necesita algunas líneas rápidas de código para filtrar sus datos para un análisis posterior.
Ejemplo:
Sin embargo, no publicó sus datos para que yo vea el tamaño del conjunto de datos o las transformaciones que podrían ser necesarias antes del análisis.
fuente
Hmm, muchas de estas respuestas tienen un código largo y difícil de leer ...
Sugeriría usar numpy con sus ingeniosas características cuando trabaje con matrices:
fuente
Esta es una implementación de la función de correlación de Pearson usando numpy:
fuente
Aquí hay una variante en la respuesta de mkh que se ejecuta mucho más rápido que scipy.stats.pearsonr, usando numba.
fuente
Aquí hay una implementación para la correlación de Pearson basada en un vector disperso. Los vectores aquí se expresan como una lista de tuplas expresadas como (índice, valor). Los dos vectores dispersos pueden tener una longitud diferente, pero sobre todo el tamaño del vector tendrá que ser el mismo. Esto es útil para aplicaciones de minería de texto donde el tamaño del vector es extremadamente grande debido a que la mayoría de las características son bolsas de palabras y, por lo tanto, los cálculos generalmente se realizan usando vectores dispersos.
Pruebas unitarias:
fuente
Tengo una solución muy simple y fácil de entender para esto. Para dos matrices de igual longitud, el coeficiente de Pearson se puede calcular fácilmente de la siguiente manera:
fuente
Quizás se pregunte cómo interpretar su probabilidad en el contexto de buscar una correlación en una dirección particular (correlación negativa o positiva). Aquí hay una función que escribí para ayudar con eso. ¡Incluso podría ser correcto!
Se basa en la información que obtuve de http://www.vassarstats.net/rsig.html y http://en.wikipedia.org/wiki/Student%27s_t_distribution , gracias a otras respuestas publicadas aquí.
fuente
Puedes echar un vistazo a este artículo. Este es un ejemplo bien documentado para calcular la correlación basada en datos históricos de pares de divisas forex de múltiples archivos usando la biblioteca de pandas (para Python), y luego generar un diagrama de mapa de calor usando la biblioteca naciente.
http://www.tradinggeeks.net/2015/08/calculating-correlation-in-python/
fuente
fuente