팬더와 가중치 상관 계수를 계산할 방법이 있습니까? 나는 R에 그런 방법이 있다는 것을 알았다. 또한 상관 관계의 p 값을 얻고 싶습니다. R에서 찾지 못했습니다. 가중치 상관 관계에 대한 설명을 위키 피 디아에 연결 : https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient#Weighted_correlation_coefficient팬더와의 가중 상관 계수
3
A
답변
5
이 기능을 구현하는 Python 패키지는 알 수 없지만 직접 구현을 롤업하는 것은 매우 쉽습니다.
def m(x, w):
"""Weighted Mean"""
return np.sum(x * w)/np.sum(w)
def cov(x, y, w):
"""Weighted Covariance"""
return np.sum(w * (x - m(x, w)) * (y - m(y, w)))/np.sum(w)
def corr(x, y, w):
"""Weighted Correlation"""
return cov(x, y, w)/np.sqrt(cov(x, x, w) * cov(y, y, w))
나는 기능이 상기와 밀접 가능한 위키 피 디아에서 수식을 일치하도록했지만, 몇 가지 잠재적 인 단순화와 성능 향상이있다 : 위키 피 디아 문서의 이름 지정 규칙을 사용하여. 예를 들어, @Alberto Garcia-Raboso가 지적한 것처럼 m(x, w)
은 실제로는 np.average(x, weights=w)
이므로 실제 함수를 작성할 필요가 없습니다.
함수는 계산을 수행하는 것만 큼 예쁜 베어 본입니다. 계산을 수행하기 전에 입력을 배열로 강제 적용하는 것을 고려할 수 있습니다 (예 : x = np.asarray(x)
). 목록이 전달 된 경우 이러한 함수가 작동하지 않으므로 x = np.asarray(x)
입니다. 길이가 같고 널이 아닌 값 등을 갖는 모든 입력을 검증하기위한 추가 점검도 구현 될 수 있습니다.
사용 예제는 :
# Initialize a DataFrame.
np.random.seed([3,1415])
n = 10**6
df = pd.DataFrame({
'x': np.random.choice(3, size=n),
'y': np.random.choice(4, size=n),
'w': np.random.random(size=n)
})
# Compute the correlation.
r = corr(df['x'], df['y'], df['w'])
P 값에 대한 토론 here있다. 일반 계산식처럼 보이지 않으며 실제로 가중치를 얻는 방법에 따라 다릅니다.
'np.average'는'weights' 인자를 허용하므로'm (x, w)'를'np.average (x, weights = w)'로 정의 할 수 있습니다. –
@ AlbertoGarcia-Raboso : 고마워, 그것에 관한 발언을 추가했습니다. 일관성을 위해 링크 된 위키 피 디아 문서의 수식과 최대한 일치하도록 코드를 그대로 두었습니다. – root