Utilizar.corr para obtener la correlación entre dos columnas


Tengo el siguiente dataframe de pandas Top15: introduzca la descripción de la imagen aquí

Creo una columna que estima el número de documentos citables por persona:

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

Quiero saber la correlación entre el número de documentos citables per cápita y el suministro de energía per cápita. Así que uso el método .corr() (correlación de Pearson):

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

Quiero devolver un solo número, pero el resultado es: introduzca la descripción de la imagen aquí

Author: Cœur, 2017-03-03

6 answers

Sin datos reales es difícil responder a la pregunta, pero supongo que está buscando algo como esto: {[14]]}

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

Que calcula la correlación entre sus dos columnas 'Citable docs per Capita' y 'Energy Supply per Capita'.

Para dar un ejemplo:

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

Entonces

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

Da 1 como se esperaba.

Ahora, si cambia un valor, por ejemplo,

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

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

El comando

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

Devuelve

0.99586

Que todavía está cerca de 1, como se esperaba.

Si aplicas .corr directamente a tu dataframe, devolverá todas las correlaciones en pares entre tus columnas; es por eso que observas 1s en la diagonal de tu matriz (cada columna está perfectamente correlacionada consigo misma).

df.corr()

Por lo tanto, volverá

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

En el gráfico que muestra, solo se representa la esquina superior izquierda de la matriz de correlación (supongo).

Si desea filtrar entradas por encima / por debajo de un cierto umbral, puede comprobar esto pregunta. Si desea trazar un mapa de calor de los coeficientes de correlación, puede verificar esta respuesta y si luego se encuentra con el problema con etiquetas de eje superpuestas, verifique el siguiente post.

 82
Author: Cleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-20 22:23:48

Me encontré con el mismo problema. Parecía Citable Documents per Person que era un flotador, y python lo omite de alguna manera por defecto. Todas las demás columnas de mi dataframe estaban en formatos numpy, así que lo resolví convirtiendo la columna a np.float64

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

Recuerde que es exactamente la columna que usted mismo calculó

 6
Author: Gary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-11 06:17:31

Si desea las correlaciones entre todos los pares de columnas, podría hacer algo como esto:

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
Author: mgoldwasser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 18:34:30

Resolví este problema cambiando el tipo de datos. Si ves el 'Suministro de energía per Cápita' es un tipo numérico mientras que el 'docs Citable per Cápita' es un tipo de objeto. Convertí la columna a flotante usando astype. Tuve el mismo problema con algunas funciones np: count_nonzero y sum funcionaron mientras que mean y std no.

 0
Author: BID,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-03 17:41:44

Cuando llamas a esto:

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

Desde entonces, DataFrame.la función corr () realiza correlaciones de pares, tiene cuatro pares de dos variables. Por lo tanto, básicamente se obtiene valores diagonales como correlación automática (correlación consigo mismo, dos valores ya que tiene dos variables) y otros dos valores como correlaciones cruzadas de uno vs otro y viceversa.

O bien realizar correlación entre dos series para obtener un solo valor:

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)

O, si desea un solo valor de la misma función (corr de DataFrame):

single_value = correlation[0][1] 

Espero que esto ayude.

 0
Author: aumpen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-10 01:44:54

Mi solución sería después de convertir datos a tipo numérico:

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
 0
Author: ibozkurt79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-30 15:14:57