Как рассчитать корреляцию в Python
Один из способов количественной оценки взаимосвязи между двумя переменными – использовать Коэффициент корреляции Пирсона, который является мерой линейной связи между двумя переменными.\u00a0Он всегда принимает значение от -1 до 1, где:\n
-1 указывает на совершенно отрицательную линейную корреляцию между двумя переменные
- 0 указывает на отсутствие линейной корреляции между двумя переменными
- 1 указывает на совершенно положительную линейную корреляцию между двумя переменными
Чем дальше коэффициент корреляции от нуля, тем сильнее Связь между двумя переменными.
В этом руководстве объясняется, как вычислить корреляцию между переменными в Python.
Как рассчитать корреляцию в Python
Чтобы вычислить корреляцию между двумя переменными в Python, мы можем использовать функцию Numpy corrcoef()
import numpy as np np.random.seed(100) #создать массив из 50 случайных целых чисел от 0 до 10 var1 = np.random.randint(0, 10, 50) #создать положительно коррелированный массив с некоторым случайным шумом var2 = var1 + np.random.normal(0, 10, 50) #рассчитать корреляцию между двумя массивами np.corrcoef(var1, var2) # [[ 1. 0.335] # [ 0.335 1. ]]
Мы видим, что коэффициент корреляции между этими двумя переменными составляет 0,335 , что является положительной корреляцией.
По умолчанию эта функция создает матрицу коэффициентов корреляции. Если бы мы только хотели вернуть коэффициент корреляции между двумя переменными, мы могли бы используйте следующий синтаксис:
np.corrcoef(var1, var2)[0,1] #0.335
Чтобы проверить, является ли эта корреляция статистически значимой, мы можем рассчитать p-значение, связанное с коэффициентом корреляции Пирсона, с помощью Scipy pearsonr(), которая возвращает коэффициент корреляции Пирсона вместе с двусторонним p-значением.
from scipy.stats.stats import pearsonr pearsonr(var1, var2) #(0.335, 0.017398)
Коэффициент корреляции – 0,335, а двустороннее значение p – 0,017. Поскольку это значение p меньше 0,05, мы можем заключить, что существует статистически значимая корреляция между двумя переменными.
Если вас интересует вычисление корреляции между несколькими переменными в Pandas DataFrame, вы можете просто использовать функцию .corr()
import pandas as pd data = pd.DataFrame(np.random.randint(0, 10, size=(5, 3)), columns=['A', 'B', 'C']) data # A B C #0 8 0 9 #1 4 0 7 #2 9 6 8 #3 1 8 1 #4 8 0 8 #рассчитать коэффициенты корреляции для всех попарных комбинаций data.corr() # A B C # A 1.000000 -0.775567 -0.493769 # B -0.775567 1.000000 0.000000 # C -0.493769 0.000000 1.000000
И если вас интересует только расчет корреляции между двумя конкретными переменными в DataFrame, вы можете указать переменные:
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные задачи в Python:
Как создать корреляционную матрицу в Python
Чем дальше коэффициент корреляции от нуля, тем сильнее связь между двумя переменными.
Но в некоторых случаях мы хотим понять корреляцию между более чем одной парой переменных. В этих случаях мы можем создать матрица корреляции, представляющая собой квадратную таблицу, которая показывает коэффициенты корреляции между несколькими попарными комбинациями переменных.
В этом руководстве объясняется, как создать и интерпретировать корреляционную матрицу в Python.
Как создать матрицу корреляции в Python
Выполните следующие шаги, чтобы создать матрицу корреляции в Python.
Шаг 1. Создайте набор данных
import pandas as pd data = df = pd.DataFrame(data, columns=['assists','rebounds','points']) df # assist rebounds points #0 4 12 22 #1 5 14 24 #2 5 13 26 #3 6 7 26 #4 7 8 29 #5 8 8 32 #6 8 9 20 #7 10 13 14
Шаг 2. Создайте матрицу корреляции
#создать корреляционную матрицу df.corr() assists rebounds points assists 1.000000 -0.244861 -0.329573 rebounds -0.244861 1.000000 -0.522092 points -0.329573 -0.522092 1.000000 #создайте ту же матрицу корреляции с коэффициентами, округленными до 3 знаков после запятой df.corr().round(3) assists rebounds points assists 1.000 -0.245 -0.330 rebounds -0.245 1.000 -0.522 points -0.330 -0.522 1.000
Шаг 3. Интерпретация матрицы корреляции
Все коэффициенты корреляции по диагонали таблицы равны 1, потому что каждая переменная совершенна коррелирует сам с собой.
Все остальные коэффициенты корреляции указывают на корреляцию между различными попарными комбинациями переменных. Например:
- Коэффициент корреляции между передачами и подборами равен -0.245
- Коэффициент корреляции между передачами и очками равен -0.330 .
- Коэффициент корреляции между подборами и очками равен -0.522
Шаг 4. Визуализируйте матрицу корреляции (необязательно)
Вы можете визуализировать матрицу корреляции с помощью параметры стиля доступны в pandas:
corr = df.corr() corr.style.background_gradient(cmap='coolwarm')
Вы также можете изменить аргумент cmap , чтобы создать корреляционную матрицу с разными цветами.
corr = df.corr() corr.style.background_gradient(cmap='RdYlGn')
corr = df.corr() corr.style.background_gradient(cmap='bwr')
Примечание: Полный список аргументов cmap см. в документация по matplotlib.
pandas.DataFrame.corr#
Compute pairwise correlation of columns, excluding NA/null values.
Parameters method or callable
- pearson : standard correlation coefficient
- kendall : Kendall Tau correlation coefficient
- spearman : Spearman rank correlation
- callable: callable with input two 1d ndarrays and returning a float. Note that the returned matrix from corr will have 1 along the diagonals and will be symmetric regardless of the callable’s behavior.
Minimum number of observations required per pair of columns to have a valid result. Currently only available for Pearson and Spearman correlation.
numeric_only bool, default False
Include only float , int or boolean data.
Changed in version 2.0.0: The default value of numeric_only is now False .
Compute pairwise correlation with another DataFrame or Series.
Compute the correlation between two Series.
Pearson, Kendall and Spearman correlation are currently computed using pairwise complete observations.
>>> def histogram_intersection(a, b): . v = np.minimum(a, b).sum().round(decimals=1) . return v >>> df = pd.DataFrame([(.2, .3), (.0, .6), (.6, .0), (.2, .1)], . columns=['dogs', 'cats']) >>> df.corr(method=histogram_intersection) dogs cats dogs 1.0 0.3 cats 0.3 1.0
>>> df = pd.DataFrame([(1, 1), (2, np.nan), (np.nan, 3), (4, 4)], . columns=['dogs', 'cats']) >>> df.corr(min_periods=3) dogs cats dogs 1.0 NaN cats NaN 1.0