Como encontrar o valor p do coeficiente de correlação em pandas
O coeficiente de correlação de Pearson pode ser usado para medir a associação linear entre duas variáveis.
Este coeficiente de correlação assume sempre um valor entre -1 e 1 onde:
- -1 : Correlação linear perfeitamente negativa entre duas variáveis.
- 0 : Nenhuma correlação linear entre duas variáveis.
- 1: Correlação linear perfeitamente positiva entre duas variáveis.
Para determinar se um coeficiente de correlação é estatisticamente significativo, você pode calcular a pontuação t e o valor p correspondentes.
A fórmula para calcular o escore t de um coeficiente de correlação (r) é:
t = r√ n-2 / √ 1-r 2
O valor p é calculado como o valor p bicaudal correspondente para a distribuição t com n-2 graus de liberdade.
Para calcular o valor p de um coeficiente de correlação de Pearson em pandas, você pode usar a função pearsonr() da biblioteca SciPy :
from scipy. stats import pearsonr pearsonr(df[' column1 '], df[' column2 '])
Esta função retornará o coeficiente de correlação de Pearson entre as colunas coluna1 e coluna2 junto com o valor p correspondente que nos diz se o coeficiente de correlação é estatisticamente significativo ou não.
Se quiser calcular o valor p para o coeficiente de correlação de Pearson de cada combinação possível de colunas em pares em um DataFrame, você pode usar a seguinte função personalizada para fazer isso:
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
Os exemplos a seguir mostram como calcular valores p para coeficientes de correlação na prática com o seguinte DataFrame do 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
Exemplo 1: Calcule o valor P para o coeficiente de correlação entre duas colunas no Pandas
O código a seguir mostra como calcular o coeficiente de correlação de Pearson e o valor p correspondente para as colunas x e y do 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)
Pelo resultado podemos ver:
- O coeficiente de correlação de Pearson é 0,4792 .
- O valor p correspondente é 0,2296 .
Como o coeficiente de correlação é positivo, isso indica que existe uma relação linear positiva entre as duas variáveis.
No entanto, como o valor p do coeficiente de correlação não é inferior a 0,05, a correlação não é estatisticamente significativa.
Observe que também podemos usar a seguinte sintaxe para extrair o valor p do coeficiente de correlação:
#extract p-value of correlation coefficient
pearsonr(df_new[' x '], df_new[' y '])[1]
0.22961622926360523
O valor p do coeficiente de correlação é 0,2296 .
Isso corresponde ao valor p da saída anterior.
Exemplo 2: Calcule o valor P para o coeficiente de correlação entre todas as colunas no Pandas
O código a seguir mostra como calcular o coeficiente de correlação de Pearson e o valor p correspondente para cada combinação de colunas em pares no DataFrame do 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
Pelo resultado podemos ver:
- O valor p para o coeficiente de correlação entre x e y é 0,2296 .
- O valor p para o coeficiente de correlação entre x e z é 0,0005 .
- O valor p para o coeficiente de correlação entre y e z é 0,4238 .
Observe que arredondamos os valores p para quatro casas decimais em nossa função personalizada.
Sinta-se à vontade para substituir o 4 na última linha da função por um número diferente para arredondar para um número diferente de casas decimais.
Nota : Você pode encontrar a documentação completa para a função SciPy pearsonr() aqui .
Recursos adicionais
Os tutoriais a seguir explicam como realizar outras tarefas comuns do panda:
Como calcular a correlação por grupo no Pandas
Como calcular a correlação deslizante em pandas
Como calcular a correlação de classificação de Spearman em pandas