Используйте.corr для получения корреляции между двумя столбцами

У меня есть следующий панда Top15: Top15: enter image description here

Я создаю столбец, который оценивает количество доступных документов на человека:

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

Я хочу знать взаимосвязь между количеством набираемых документов на душу населения и энергоснабжением на душу населения. Поэтому я использую метод .corr() (корреляция Пирсона):

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

Я хочу вернуть один номер, но результат: enter image description here

Ответы

Ответ 1

Без фактических данных трудно ответить на вопрос, но я думаю, вы ищете что-то вроде этого:

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

Это вычисляет соотношение между вашими двумя столбцами 'Citable docs per Capita' и 'Energy Supply per Capita'.

Чтобы привести пример:

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

Тогда

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

дает 1, как и ожидалось.

Теперь, если вы измените значение, например,

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

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

команда

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

возвращает

0.99586

который по-прежнему близок к 1, как и ожидалось.

Если вы примените .corr непосредственно к вашему фрейму данных, он вернет все попарные корреляции между вашими столбцами; вот почему вы затем наблюдаете 1s по диагонали вашей матрицы (каждый столбец идеально соотносится с самим собой).

df.corr()

поэтому вернет

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

На графике, который вы показываете, представлен только верхний левый angular матрицы корреляции (я полагаю).

Могут быть случаи, когда вы получаете NaN в своем решении - посмотрите этот пост для примера.

Если вы хотите отфильтровать записи выше/ниже определенного порога, вы можете проверить этот вопрос. Если вы хотите построить тепловую карту коэффициентов корреляции, вы можете проверить этот ответ, а если вы столкнетесь с проблемой с перекрывающимися метками осей, проверьте следующий пост.

Ответ 2

Я столкнулся с той же проблемой. Похоже, что Citable Documents per Person был float, и python каким-то образом пропускает его по умолчанию. Все остальные столбцы моего фреймворка были в numpy-форматах, поэтому я решил это, преобразов столбец в np.float64

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

Помните, что именно этот столбец вы сами подсчитали

Ответ 3

Мое решение было бы после преобразования данных в числовой тип:

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

Ответ 4

Когда вы вызываете это:

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

Поскольку функция DataFrame.corr() выполняет парные корреляции, у вас есть четыре пары из двух переменных. Таким образом, в основном вы получаете диагональные значения как автоматическую корреляцию (корреляция с самим собой, два значения, так как у вас есть две переменные) и другие два значения в качестве взаимных корреляций одного против другого и наоборот.

Либо выполните корреляцию между двумя рядами, чтобы получить одно значение:

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)

или, если вы хотите получить одно значение от одной и той же функции (DataFrame corr):

single_value = correlation[0][1] 

Надеюсь это поможет.

Ответ 5

Если вам нужны корреляции между всеми парами столбцов, вы можете сделать что-то вроде этого:

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

Это работает так:

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

Ответ 7

Я решил эту проблему, изменив тип данных. Если вы видите, что "Энергопотребление на душу населения" является числовым, а "Citable docs per Capita" - это тип объекта. Я преобразовал столбец в float, используя астип. У меня была та же проблема с некоторыми функциями np: count_nonzero и sum работала, а mean и std нет.