Gebruik .corr om de correlatie tussen twee kolommen te krijgen

Ik heb het volgende panda’s-dataframe Top15:

Ik maak een kolom die het aantal citeerbare documenten per persoon schat:

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

Ik wil de correlatie weten tussen het aantal citeerbare documenten per hoofd van de bevolking en de energievoorziening per hoofd van de bevolking. Dus ik gebruik de .corr()methode (Pearson’s correlatie):

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

Ik wil een enkel getal retourneren, maar het resultaat is:


Antwoord 1, autoriteit 100%

Zonder feitelijke gegevens is het moeilijk om de vraag te beantwoorden, maar ik denk dat u op zoek bent naar iets als dit:

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

Dat berekent de correlatie tussen uw twee kolommen 'Citable docs per Capita'en 'Energy Supply per Capita'.

Om een voorbeeld te geven:

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

Dan

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

geeft 1zoals verwacht.

Als u nu een waarde wijzigt, bijvoorbeeld

df.loc[2, 'B'] = 4.5
   A    B
0  0  0.0
1  1  2.0
2  2  4.5
3  3  6.0

het commando

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

retouren

0.99586

wat nog steeds dicht bij 1 ligt, zoals verwacht.

Als u .corrrechtstreeks toepast op uw dataframe, het retourneert alle paarsgewijze correlaties tussen uw kolommen; daarom zie je dan 1sop de diagonaal van je matrix (elke kolom is perfect gecorreleerd met zichzelf).

df.corr()

komt daarom terug

         A         B
A  1.000000  0.995862
B  0.995862  1.000000

In de afbeelding die u laat zien, wordt alleen de linkerbovenhoek van de correlatiematrix weergegeven (ik neem aan).

Er kunnen gevallen zijn waarin u NaNs in uw oplossing krijgt – bekijk dit berichtvoor een voorbeeld.

Als je items boven/onder een bepaalde drempel wilt filteren, kun je deze vraag.
Als je een heatmap van de correlatiecoëfficiënten wilt plotten, kijk dan op dit antwoorden als u vervolgens het probleem met overlappende as-labels tegenkomt, controleer dan het volgende bericht.


Antwoord 2, autoriteit 4%

Ik kwam hetzelfde probleem tegen.
Het leek erop dat Citable Documents per Personeen float was, en python slaat het standaard op de een of andere manier over. Alle andere kolommen van mijn dataframe waren in numpy-formaten, dus ik heb het opgelost door de columnt te converteren naar np.float64

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

Onthoud dat dit precies de kolom is die je zelf hebt berekend


Antwoord 3, autoriteit 3%

Mijn oplossing zou zijn na het converteren van gegevens naar numeriek type:

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

Antwoord 4, autoriteit 2%

Het werkt als volgt:

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

Antwoord 5, autoriteit 2%

Als u de correlaties tussen alle paren kolommen wilt, kunt u zoiets als dit doen:

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

6

Wanneer u dit noemt:

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

Aangezien DATAFRAME.COR () functie Pair-Wise Correlations uitvoert, hebt u vier paar van twee variabelen. In principe krijg je diagonale waarden als auto-correlatie (correlatie met zichzelf, twee waarden, omdat je twee variabelen hebt) en andere twee waarden als kruisrelaties van één versus een ander en vice versa.

Voer de correlatie tussen twee series uit om een ​​enkele waarde te krijgen:

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)

of,
Als u een enkele waarde van dezelfde functie wilt (DATAFAME’S COR):

single_value = correlation[0][1] 

Ik hoop dat dit helpt.


Antwoord 7

‘Citable docs per Capita’ wijzigen in numeriek voordat correlatie het probleem oplost.

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

Antwoord 8

Het volgende werkt voor mij. Gebruik de correlatiematrix en filter vervolgens op variabelenamen:

cor_df = df.corr()  # take the correlation from the data
cor_df.loc['Citable docs per Capita','Energy Supply per Capita'] # only single value

als u variabelen in [] plaatst, worden ook de namen van variabelen geretourneerd:

cor_df.loc[['Citable docs per Capita'],['Energy Supply per Capita']]

Other episodes