187 votes

Utilisez .corr pour obtenir la corrélation entre deux colonnes.

J'ai le dataframe pandas suivant Top15 : enter image description here

Je crée une colonne qui estime le nombre de documents cessibles par personne :

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']

Je veux connaître la corrélation entre le nombre de documents publiables par habitant et l'approvisionnement en énergie par habitant. J'utilise donc le .corr() (corrélation de Pearson) :

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

Je veux retourner un seul nombre, mais le résultat est : enter image description here

0 votes

Je pense que vous avez raison. Mais pouvez-vous me dire pourquoi la fonction 'data.corr(method='pearson')' ne renvoie que la relation entre l'offre et la demande d'énergie ?

1 votes

Ce n'est pas le cas. Il devrait vous renvoyer une matrice 2x2 ; vous montrez son entrée supérieure gauche. Si vous appliquez .corr directement à votre dataframe, il renverra toutes les corrélations par paire ; c'est pourquoi vous observez des 1 à la diagonale de votre matrice (chaque colonne est parfaitement corrélée avec elle-même). Voir mon édition ci-dessous.

1 votes

Veuillez considérer accepter une réponse si vous pensez qu'il a répondu à votre question

306voto

Cleb Points 9410

Sans données réelles, il est difficile de répondre à la question, mais je suppose que vous recherchez quelque chose comme ceci :

Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])

Cela calcule la corrélation entre vos deux colonnes. 'Citable docs per Capita' et 'Energy Supply per Capita' .

Pour donner un exemple :

import pandas as pd

df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})

   A  B
0  0  0
1  1  2
2  2  4
3  3  6

Puis

df['A'].corr(df['B'])

donne 1 comme prévu.

Maintenant, si vous modifiez une valeur, par exemple

df.loc[2, 'B'] = 4.5

   A    B
0  0  0.0
1  1  2.0
2  2  4.5
3  3  6.0

le commandement

df['A'].corr(df['B'])

renvoie à

0.99586

qui est toujours proche de 1, comme prévu.

Si vous appliquez .corr directement à votre cadre de données, elle renverra toutes les corrélations par paires entre vos colonnes ; c'est pourquoi vous observez ensuite 1s à la diagonale de votre matrice (chaque colonne est parfaitement corrélée avec elle-même).

df.corr()

retournera donc

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

Dans le graphique que vous montrez, seul le coin supérieur gauche de la matrice de corrélation est représenté (je suppose).

Il peut y avoir des cas, où vous obtenez NaN dans votre solution - vérifiez ce poste pour un exemple.

Si vous voulez filtrer les entrées au-dessus/en dessous d'un certain seuil, vous pouvez vérifier cette question . Si vous voulez tracer une carte thermique des coefficients de corrélation, vous pouvez vérifier cette réponse et si vous rencontrez ensuite le problème de chevauchement des étiquettes d'axe, vérifiez le poste suivant .

0 votes

Cela peut-il être appliqué par rangée ?

1 votes

@Dr.DOOM : Oui, ça prend juste des séries, donc par exemple. df.loc[1, :].corr(df.loc[2, :]) fonctionnera aussi très bien. Pour l'ensemble du cadre de données, vous pouvez simplement transposer : df.T.corr() .

0 votes

J'ai essayé votre suggestion mais le calcul renvoie toujours 1 même après avoir changé la valeur a dans la colonne B en utilisant df.loc[2, 'B'] = 4.5. Peut-être que je suis juste confus sur le calcul.

9voto

Gary Points 61

J'ai rencontré le même problème. Il est apparu Citable Documents per Person était un flottant, et python le saute en quelque sorte par défaut. Toutes les autres colonnes de mon dataframe étaient au format numpy, j'ai donc résolu le problème en convertissant la colonne en np.float64

Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])

Rappelez-vous que c'est exactement la colonne que vous avez calculée vous-même.

8voto

ibozkurt79 Points 53

Ma solution serait de convertir les données en type numérique :

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()

0 votes

Sélectionner des colonnes et ensuite appliquer la méthode .corr() est une bonne option car nous pouvons calculer la corrélation par paire entre plus de 2 colonnes.

5voto

mgoldwasser Points 377

Si vous voulez les corrélations entre toutes les paires de colonnes, vous pouvez faire quelque chose comme ceci :

import pandas as pd
import numpy as np

def get_corrs(df):
    col_correlations = df.corr()
    col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
    cor_pairs = col_correlations.stack()
    return cor_pairs.to_dict()

my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])

3voto

aumpen Points 21

Quand tu appelles ça :

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

Comme la fonction DataFrame.corr() effectue des corrélations par paire, vous avez quatre paires de deux variables. Ainsi, vous obtenez les valeurs diagonales en tant qu'autocorrélation (corrélation avec elle-même, deux valeurs puisque vous avez deux variables), et les deux autres valeurs en tant que corrélations croisées de l'une par rapport à l'autre et vice versa.

Soit effectuer une corrélation entre deux séries pour obtenir une seule valeur :

from scipy.stats.stats import pearsonr
docs_col = Top15['Citable docs per Capita'].values
energy_col = Top15['Energy Supply per Capita'].values
corr , _ = pearsonr(docs_col, energy_col)

ou, si vous voulez une seule valeur de la même fonction (corr de DataFrame) :

single_value = correlation[0][1] 

J'espère que cela vous aidera.

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