web-dev-qa-db-fra.com

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

J'ai les pandas dataframe suivants Top15: enter image description here

Je crée une colonne qui estime le nombre de documents pouvant être cités 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 pouvant être cités par habitant et l’offre énergétique par habitant. J'utilise donc la méthode .corr() (corrélation de Pearson):

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

Je veux renvoyer un numéro unique, mais le résultat est le suivant: enter image description here

67
tong zhu

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

Ensuite

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

la commande 

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

résultats

0.99586

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

Si vous appliquez .corr directement à votre image de données, toutes les corrélations par paire entre vos colonnes seront renvoyées. C'est pourquoi vous observez alors 1s en diagonale de votre matrice (chaque colonne est parfaitement corrélée à elle-même).

df.corr()

reviendra 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 NaNs dans votre solution - consultez this post pour un exemple.

Si vous souhaitez filtrer les entrées supérieures ou inférieures à un certain seuil, vous pouvez vérifier cette question . Si vous souhaitez tracer un diagramme thermique des coefficients de corrélation, vous pouvez vérifier cette réponse et si vous le souhaitez. puis rencontrez le problème avec chevauchement des étiquettes d’axe, vérifiez le post suivant .

122
Cleb

J'ai rencontré le même problème… .. Il est apparu que Citable Documents per Person était un float, et python l'ignore par défaut. Toutes les autres colonnes de mon cadre de données étaient au format numpy, je l’ai donc résolu en convertissant le columnt 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

6
Gary

Cela fonctionne comme ceci:

Top15['Citable docs per Capita']=np.float64(Top15['Citable docs per Capita'])

Top15['Energy Supply per Capita']=np.float64(Top15['Energy Supply per Capita'])

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

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')])
1
mgoldwasser

J'ai résolu ce problème en changeant le type de données. Si vous voyez «L'approvisionnement en énergie par habitant» est un type numérique tandis que le «Citable docs par habitant» est un type d'objet. J'ai converti la colonne en float en utilisant astype. J'ai eu le même problème avec certaines fonctions np: count_nonzero et sum fonctionnaient alors que mean et std ne fonctionnaient pas.

0
BID

Quand vous appelez ça:

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

Depuis, la fonction DataFrame.corr () effectue des corrélations par paires, vous avez quatre paires de deux variables. Donc, fondamentalement, vous obtenez des valeurs diagonales sous forme de corrélation automatique (corrélation avec lui-même, deux valeurs puisque vous avez deux variables), et deux autres valeurs sous forme de corrélations croisées de l'un par rapport à l'autre et inversement. 

Effectuez 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 t'aides.

0
aumpen

Ma solution serait après la conversion des données en type numérique:

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