paso - regresion lineal python numpy
Use.corr para obtener la correlaciĆ³n entre dos columnas (7)
Tengo el siguiente marco de
Top15
pandas
Top15
:
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.
Entonces 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:
Cuando llamas a esto:
data = Top15[[''Citable docs per Capita'',''Energy Supply per Capita'']]
correlation = data.corr(method=''pearson'')
Como la función DataFrame.corr () realiza correlaciones por pares, tiene cuatro pares de dos variables. Entonces, básicamente está obteniendo 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 frente a otro y viceversa.
Realice la correlación entre dos series para obtener un valor único:
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.
Funciona así:
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''])
Me encontré con el mismo problema.
Parecía que
Citable Documents per Person
era un flotador, y Python lo omite de alguna manera por defecto.
Todas las otras columnas de mi marco de datos 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 calculó usted mismo
Mi solución sería después de convertir datos a tipo numérico:
Top15[[''Citable docs per Capita'',''Energy Supply per Capita'']].corr()
Resolví este problema cambiando el tipo de datos.
Si ve que el "Suministro de energía per cápita" es un tipo numérico, mientras que el "Citable docs per Capita" es un tipo de objeto.
Convertí la columna para flotar usando un tipo.
Tuve el mismo problema con algunas funciones np:
count_nonzero
y
sum
funcionaron mientras que
mean
y
std
no.
Si desea las correlaciones entre todos los pares de columnas, puede 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'')])
Sin datos reales, es difícil responder la pregunta, pero supongo que está buscando algo como esto:
Top15[''Citable docs per Capita''].corr(Top15[''Energy Supply per Capita''])
Eso 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, p. Ej.
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''])
devoluciones
0.99586
que todavía está cerca de 1, como se esperaba.
Si aplica
.corr
directamente a su marco de datos,
devolverá todas las correlaciones por pares entre sus columnas
;
Es por eso que luego observa
1s
en la diagonal de su matriz (cada columna está perfectamente correlacionada consigo misma).
df.corr()
por lo tanto regresará
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).
Puede haber casos en los que obtenga
NaN
en su solución; consulte
esta publicación
para ver un ejemplo.
Si desea filtrar las entradas por encima / debajo de un cierto umbral, puede verificar esta 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 la superposición de etiquetas de eje, consulte la siguiente publicación .