Як знайти p значення коефіцієнта кореляції у панд
Коефіцієнт кореляції Пірсона можна використовувати для вимірювання лінійного зв’язку між двома змінними.
Цей коефіцієнт кореляції завжди приймає значення від -1 до 1 , де:
- -1 : Абсолютно негативна лінійна кореляція між двома змінними.
- 0 : немає лінійної кореляції між двома змінними.
- 1: Абсолютно позитивна лінійна кореляція між двома змінними.
Щоб визначити, чи є коефіцієнт кореляції статистично значущим, ви можете обчислити відповідний t-показник і p-значення.
Формула для розрахунку t-показника коефіцієнта кореляції (r):
t = r√ n-2 / √ 1-r 2
P-значення обчислюється як відповідне двостороннє p-значення для t-розподілу з n-2 ступенями свободи.
Щоб обчислити p-значення коефіцієнта кореляції Пірсона в пандах, ви можете скористатися функцією pearsonr() із бібліотеки SciPy :
from scipy. stats import pearsonr pearsonr(df[' column1 '], df[' column2 '])
Ця функція поверне коефіцієнт кореляції Пірсона між стовпцями column1 і column2 разом із відповідним 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:
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 .
Це відповідає р-значенню з попереднього результату.
Приклад 2: обчисліть значення P для коефіцієнта кореляції між усіма стовпцями в Pandas
Наступний код показує, як обчислити коефіцієнт кореляції Пірсона та відповідне значення p для кожної попарної комбінації стовпців у pandas DataFrame:
#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() тут .
Додаткові ресурси
У наступних посібниках пояснюється, як виконувати інші поширені завдання панди:
Як розрахувати кореляцію за групою в Pandas
Як розрахувати ковзну кореляцію в пандах
Як розрахувати кореляцію рангів Спірмена в пандах