221 votes

Calcul de corrélation de Pearson et la signification en Python

Je suis à la recherche d’une fonction qui prend comme entrées deux listes et retourne la corrélation de Pearsonet l’importance de la corrélation. Je suis en utilisant Python.

Merci beaucoup.

Ariel

214voto

Sacha Points 1059

Vous pouvez jeter un oeil à scipy : http://docs.scipy.org/doc/scipy/reference/stats.html

120voto

winerd Points 127

La corrélation de Pearson peut être calculée avec numpy.

39voto

Jeff Hammerbacher Points 2020

Si vous ne vous sentez comme l’installation scipy, j’ai utilisé ce hack rapide, légèrement modifié de l’Intelligence Collective de programmation:

(Sous la direction d’exactitude).

31voto

dfrankow Points 2983

Le code suivant est une simple interprétation de la définition:

import math

def average(x):
    assert len(x) > 0
    return float(sum(x)) / len(x)

def pearson_def(x, y):
    assert len(x) == len(y)
    n = len(x)
    assert n > 0
    avg_x = average(x)
    avg_y = average(y)
    diffprod = 0
    xdiff2 = 0
    ydiff2 = 0
    for idx in range(n):
        xdiff = x[idx] - avg_x
        ydiff = y[idx] - avg_y
        diffprod += xdiff * ydiff
        xdiff2 += xdiff * xdiff
        ydiff2 += ydiff * ydiff

    return diffprod / math.sqrt(xdiff2 * ydiff2)

Test:

print pearson_def([1,2,3], [1,5,7])

retourne

0.981980506062

Ceci est en accord avec Excel, ce calculateur, SciPy (également NumPy), qui renvoient 0.981980506 et 0.9819805060619657, et 0.98198050606196574, respectivement.

R:

> cor( c(1,2,3), c(1,5,7))
[1] 0.9819805

EDIT: correction d'un bug signalé par un intervenant.

11voto

compski Points 80

Plutôt que de compter sur numpy/scipy, je pense que ma réponse doit être la plus simple à coder et à comprendre les étapes dans le calcul du Coefficient de Corrélation de Pearson (PCC) .

import math

# calculates the mean
def mean(x) 
    sum = 0.0
    for i in x:
         sum += i
    return sum / len(x) 

# calculates the sample standard deviation
def sampleStandardDeviation(x):
    sumv = 0.0
    for i in x:
         sumv += (i - mean(x))**2
    return math.sqrt(sumv/(len(x)-1))

# calculates the PCC using both the 2 functions above
def pearson(x,y):
    scorex = []
    scorey = []

    for i in x: 
        scorex.append((i - mean(x))/sampleStandardDeviation(x)) 

    for j in y:
        scorey.append((j - mean(y))/sampleStandardDeviation(y))

# multiplies both lists together into 1 list (hence zip) and sums the whole list   
    return (sum([i*j for i,j in zip(scorex,scorey)]))/(len(x)-1)

L' importance de la PCC est fondamentalement pour vous montrer comment fortement corrélée les deux variables/les listes sont. Il est important de noter que le PCC valeur varie de -1 à 1. Une valeur entre 0 à 1 indique une corrélation positive. Valeur 0 = variation la plus élevée (pas de corrélation que ce soit). Une valeur entre -1 à 0 indique une corrélation négative.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X