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

У меня есть следующий фрейм данных pandas Top15:

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

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

Я хочу вернуть одно число, но результат таков:

Комментарии к вопросу (6)
Решение

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

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 непосредственно к вашему датафрейму, [он вернет все парные корреляции между вашими столбцами] (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.corr.html); вот почему вы наблюдаете 1s на диагонали вашей матрицы (каждый столбец идеально коррелирован с самим собой).

df.corr()

вернет

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

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

Могут быть случаи, когда вы получаете NaN в вашем решении - посмотрите [это сообщение] (https://stackoverflow.com/q/52466844/1534017) для примера.

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

Комментарии (13)

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

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

Помните, что это именно тот столбец, который вы вычислили сами.

Комментарии (0)

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

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
Комментарии (1)

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

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

Так, Таблицы Данных.СОГГ() функция выполняет парных корреляций, у вас есть четыре пары с двумя переменными. Так что, в принципе, вы получаете значения по диагонали, как автоматической корреляции (корреляция с себя два значения, поскольку у вас есть две переменные), а другие два значения перекрестных корреляций одна против другой и наоборот.

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

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)

или, если вы хотите, чтобы одно значение из одной и той же функции (таблицы данных'ы СОГГ):

single_value = correlation[0][1] 

Надеюсь, что это помогает.

Комментарии (0)

Работает это так:

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'])
Комментарии (0)

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

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')])
Комментарии (0)

Я решил эту проблему путем изменения типа данных. Если вы видите, что 'энергоснабжение на душу населения' - это числовой тип, А 'цитируемых документах на душу населения' - Это тип объекта. Я обратился в столбце плавать, используя тип. У меня была такая же проблема с некоторыми функциями НП: count_nonzero и сумма работала значит и std и я'т.

Комментарии (0)