Как найти значение p коэффициента корреляции в пандах
Коэффициент корреляции Пирсона можно использовать для измерения линейной связи между двумя переменными.
Этот коэффициент корреляции всегда принимает значение от -1 до 1 , где:
- -1 : Совершенно отрицательная линейная корреляция между двумя переменными.
- 0 : Нет линейной корреляции между двумя переменными.
- 1: Совершенно положительная линейная корреляция между двумя переменными.
Чтобы определить, является ли коэффициент корреляции статистически значимым, вы можете вычислить соответствующие t-показатель и p-значение.
Формула для расчета t-показателя коэффициента корреляции (r):
t = r√ n-2 / √ 1-r 2
Значение p рассчитывается как соответствующее двустороннее значение p для t-распределения с n-2 степенями свободы.
Чтобы вычислить p-значение коэффициента корреляции Пирсона в pandas, вы можете использовать функцию pearsonr() из библиотеки SciPy :
from scipy. stats import pearsonr pearsonr(df[' column1 '], df[' column2 '])
Эта функция вернет коэффициент корреляции Пирсона между столбцами столбец1 и столбец2 вместе с соответствующим значением p, которое говорит нам, является ли коэффициент корреляции статистически значимым или нет.
Если вы хотите вычислить значение p для коэффициента корреляции Пирсона для каждой возможной попарной комбинации столбцов в DataFrame, вы можете использовать для этого следующую пользовательскую функцию:
def r_pvalues(df):
cols = pd. DataFrame (columns= df.columns )
p = cols. transpose (). join (cols, how=' outer ')
for r in df. columns :
for c in df. columns :
tmp = df[df[r]. notnull () & df[c]. notnull ()]
p[r][c] = round(pearsonr(tmp[r], tmp[c])[1], 4)
return p
В следующих примерах показано, как на практике рассчитать значения p для коэффициентов корреляции с помощью следующего DataFrame pandas:
import pandas as pd
#createDataFrame
df = pd. DataFrame ({' x ': [4, 5, 5, 7, 8, 10, 12, 13, 14, 15],
' y ': [10, 12, 14, 18, np.nan, 19, 13, 20, 14, np.nan],
' z ': [20, 24, 24, 23, 19, 15, 18, 14, 10, 12]})
#view DataFrame
print (df)
X Y Z
0 4 10.0 20
1 5 12.0 24
2 5 14.0 24
3 7 18.0 23
4 8 NaN 19
5 10 19.0 15
6 12 13.0 18
7 13 20.0 14
8 14 14.0 10
9 15 NaN 12
Пример 1: вычислить значение P для коэффициента корреляции между двумя столбцами в Pandas
Следующий код показывает, как вычислить коэффициент корреляции Пирсона и соответствующее значение p для столбцов x и y DataFrame:
from scipy. stats import pearsonr
#drop all rows with NaN values
df_new = df. dropna ()
#calculation correlation coefficient and p-value between x and y
pearsonr(df_new[' x '], df_new[' y '])
PearsonRResult(statistic=0.4791621985883838, pvalue=0.22961622926360523)
По результату мы видим:
- Коэффициент корреляции Пирсона составляет 0,4792 .
- Соответствующее значение p составляет 0,2296 .
Поскольку коэффициент корреляции положителен, это указывает на наличие положительной линейной связи между двумя переменными.
Однако, поскольку значение p коэффициента корреляции не менее 0,05, корреляция не является статистически значимой.
Обратите внимание, что мы также можем использовать следующий синтаксис для извлечения значения p из коэффициента корреляции:
#extract p-value of correlation coefficient
pearsonr(df_new[' x '], df_new[' y '])[1]
0.22961622926360523
Значение p для коэффициента корреляции составляет 0,2296 .
Это соответствует значению p из предыдущего результата.
Пример 2. Вычислите значение P для коэффициента корреляции между всеми столбцами в Pandas.
Следующий код показывает, как вычислить коэффициент корреляции Пирсона и соответствующее значение p для каждой парной комбинации столбцов в DataFrame pandas:
#create function to calculate p-values for each pairwise correlation coefficient
def r_pvalues(df):
cols = pd. DataFrame (columns= df.columns )
p = cols. transpose (). join (cols, how=' outer ')
for r in df. columns :
for c in df. columns :
tmp = df[df[r]. notnull () & df[c]. notnull ()]
p[r][c] = round(pearsonr(tmp[r], tmp[c])[1], 4)
return p
#use custom function to calculate p-values
r_pvalues(df)
X Y Z
x 0.0 0.2296 0.0005
y 0.2296 0.0 0.4238
z 0.0005 0.4238 0.0
По результату мы видим:
- Значение p для коэффициента корреляции между x и y составляет 0,2296 .
- Значение p для коэффициента корреляции между x и z составляет 0,0005 .
- Значение p для коэффициента корреляции между y и z составляет 0,4238 .
Обратите внимание, что в нашей пользовательской функции мы округлили значения p до четырех знаков после запятой.
Не стесняйтесь заменять 4 в последней строке функции другим числом для округления до другого количества десятичных знаков.
Примечание . Полную документацию по функции SciPy pearsonr() вы можете найти здесь .
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные задачи panda:
Как рассчитать корреляцию по группам в Pandas
Как рассчитать скользящую корреляцию в пандах
Как рассчитать ранговую корреляцию Спирмена в пандах