.corr을 사용하여 두 열 간의 상관 관계 얻기


127

다음 pandas 데이터 프레임이 있습니다 Top15. 여기에 이미지 설명 입력

1 인당 인용 가능한 문서 수를 추정하는 열을 만듭니다.

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']

1 인당 인용 가능한 문서 수와 1 인당 에너지 공급 사이의 상관 관계를 알고 싶습니다. 그래서 나는 .corr()방법을 사용합니다 (Pearson의 상관 관계) :

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

단일 숫자를 반환하고 싶지만 결과는 다음과 같습니다. 여기에 이미지 설명 입력


그 쪽이 맞는 거 같아요. 그런데 왜 'data.corr (method ='pearson ')'이 에너지 공급과 에너지 서피 사이의 관계 만 반환하는지 말씀해 주시겠습니까?
tong zhu

1
그렇지 않습니다. 2x2 행렬을 반환해야합니다. 왼쪽 상단 항목을 표시합니다. .corr데이터 프레임에 직접 적용하면 모든 쌍별 상관 관계가 반환됩니다. 이것이 행렬의 대각선에서 1을 관찰하는 이유입니다 (각 열은 자체와 완벽하게 상관 됨). 아래 내 편집을 참조하십시오.
Cleb

1
고려하시기 바랍니다 받아들이는 당신이 귀하의 질문에 대답하고있다 생각하면 답을
MaxU

1
당신을 감사합니다, 당신의 대답을 수락 한
통 Zhu의

28
이 질문은 Coursera의 "Introduction to Data Science in Python"과정에서 직접 나온 것입니다. 특히 과제 3, 질문 9입니다. Chris Brooks 강사가 학생들에게 Stack Overflow에 질문을 게시하도록 권장했을 때, 그가 과제의 문제를 그대로 게시해야한다는 뜻은 아닙니다.
LS

답변:


209

실제 데이터가 없으면 질문에 답하기가 어렵지만 다음과 같은 것을 찾고있는 것 같습니다.

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데이터 프레임에 직접 적용하면 열 간의 모든 쌍별 상관 관계가 반환됩니다 . 이것이 바로 1s행렬의 대각선에서 관찰하는 이유입니다 (각 열은 자체와 완벽하게 상관 됨).

df.corr()

그러므로 돌아올 것이다

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

표시되는 그래픽에서는 상관 행렬의 왼쪽 상단 모서리 만 표시됩니다 (내가 가정).

NaN솔루션에서 s 를 얻는 경우가있을 수 있습니다 . 이 게시물 에서 예제를 확인하십시오 .

특정 임계 값 위 / 아래 항목을 필터링하려는 경우이 질문을 확인할 수 있습니다 . 상관 계수의 히트 맵을 그리려면 이 답변을 확인 하고 겹치는 축 레이블 문제가 발생 하면 다음 게시물을 확인 하십시오 .


이것은 행별로 적용될 수 있습니까?
Dr.DOOM

1
@ Dr.DOOM : 예, 시리즈 만 걸리므로 예를 들어도 df.loc[1, :].corr(df.loc[2, :])잘 작동합니다. 전체 데이터 프레임에 대해 간단히 전치 할 수 있습니다 df.T.corr()..
Cleb

귀하의 제안을 시도했지만 df.loc [2, 'B'] = 4.5를 사용하여 B 열의 a 값을 변경 한 후에도 계산은 여전히 ​​1을 반환합니다. 어쩌면 그냥 계산에 혼란 메신저
Dr.DOOM

@ Dr.DOOM : 코드를 모르기 때문에 도움이 어렵습니다. 위 1의 예가 대신 귀하의 경우에 반환된다는 것을 올바르게 이해 0.99586했습니까?
Cleb

1
@Cleb : 글쎄요, 제가 작업하고있는 맥락에서 모든 상위 수준의 다중 열 인덱스에는 동일한 하위 계층이 있습니다. : 내가 뭘하려고 오전이 질문을 참조하십시오 stackoverflow.com/questions/57513002/...
아드리안 엉덩이를 괴롭히는

7

나는 같은 문제에 부딪쳤다. 그것은 Citable Documents per Personfloat로 보였고 파이썬은 기본적으로 그것을 건너 뜁니다. 내 데이터 프레임의 다른 모든 열은 numpy-formats이므로 columnt를 다음과 같이 변환하여 해결했습니다.np.float64

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

직접 계산 한 열임을 기억하십시오.


6

내 솔루션은 데이터를 숫자 유형으로 변환 한 후입니다.

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()

열을 선택한 다음 .corr () 방법을 적용하는 것은 우리가 2 개 이상의 열 사이의 상관 페어를 계산할 수있는 좋은 옵션입니다
세바스티앙 Wieckowski

4

모든 열 쌍 간의 상관 관계를 원하는 경우 다음과 같이 할 수 있습니다.

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

3

이것을 호출 할 때 :

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

DataFrame.corr () 함수는 쌍별 상관 관계를 수행하므로 두 변수에서 네 쌍이 있습니다. 따라서 기본적으로 대각선 값은 자동 상관 (자체와의 상관, 두 개의 변수가 있기 때문에 두 값)으로, 다른 두 값은 서로의 상호 상관으로, 그 반대의 경우도 마찬가지입니다.

단일 값을 얻으려면 두 계열 간의 상관 관계를 수행하십시오.

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)

또는 동일한 함수 (DataFrame의 corr)에서 단일 값을 원하는 경우 :

single_value = correlation[0][1] 

도움이 되었기를 바랍니다.


3

다음과 같이 작동합니다.

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

1

데이터 유형을 변경하여이 문제를 해결했습니다. '1 인당 에너지 공급'은 숫자 유형이고 '인당 시민 문서'는 개체 유형입니다. astype을 사용하여 열을 float로 변환했습니다. 좀 순이익 기능과 같은 문제가 있었다 : count_nonzerosum동안 일을 mean하고 std하지 않았다.


0

상관 관계가 있기 전에 '인당 인용 가능한 문서'를 숫자로 변경하면 문제가 해결됩니다.

    Top15['Citable docs per Capita'] = pd.to_numeric(Top15['Citable docs per Capita'])
    data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
    correlation = data.corr(method='pearson')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.