Utiliser.corr pour obtenir la corrélation entre deux colonnes
j'ai le texte suivant pandas dataframe Top15
:
je crée une colonne qui estime le nombre de documents recevables 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 négociables par habitant et l'approvisionnement é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 retourner un seul numéro, mais le résultat est:
6 réponses
Sans données réelles, il est difficile de répondre à la question, mais je suppose que vous cherchez quelque chose comme ceci:
Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
qui 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 changez 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'])
retourne
0.99586
qui est toujours proche de 1, comme prévu.
si vous appliquez .corr
directement à votre dataframe, il retournera toutes les corrélations par paires entre vos colonnes; c'est pourquoi vous observez alors 1s
à la diagonale de votre matrice (chaque colonne est parfaitement corrélée avec elle-même).
df.corr()
sera donc de retour
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ée (je suppose).
si vous voulez filtrer les entrées au-dessus/au-dessous d'un certain seuil, vous pouvez cocher cette question . Si vous voulez tracer une heatmap des coefficients de corrélation, vous pouvez cocher cette réponse et si vous exécutez alors dans le problème avec axes imbriqués-les étiquettes vérifient le poteau suivant .
j'ai rencontré le même problème.
Il est apparu Citable Documents per Person
était un float, et python le saute d'une façon ou d'une autre par défaut. Toutes les autres colonnes de mon dataframe étaient en plusieurs formats, donc je l'ai résolu 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é vous-même
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')])
j'ai résolu ce problème en changeant le type de données. Si vous voyez la "fourniture D'énergie par habitant" est un type numérique tandis que le "Citable docs per Capita" 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.
quand vous appelez ça:
data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')
Depuis, DataFrame.corr () la fonction effectue des corrélations de pair-sage, vous avez quatre paires de deux variables. Donc, fondamentalement, vous obtenez des valeurs diagonales comme auto corrélation (corrélation avec lui-même, deux valeurs puisque vous avez deux variables), et deux autres valeurs comme corrélations croisées de l'un contre l'autre et vice versa.
soit effectuer la 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]
Espérons que cette aide.
ma solution serait après conversion des données en type numérique:
Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()