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

다음 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')

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



답변

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

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 를 얻는 경우가있을 수 있습니다 . 이 게시물 에서 예제를 확인하십시오 .

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


답변

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

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

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


답변

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

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


답변

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

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


답변

이것을 호출 할 때 :

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] 

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


답변

다음과 같이 작동합니다.

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 인당 에너지 공급’은 숫자 유형이고 ‘인당 시민 문서’는 개체 유형입니다. astype을 사용하여 열을 float로 변환했습니다. 좀 순이익 기능과 같은 문제가 있었다 : count_nonzerosum동안 일을 mean하고 std하지 않았다.