노력에는 지름길이 없으니까요

5.2 비모수 상관계수 본문

통계학

5.2 비모수 상관계수

데건 2024. 8. 5. 14:45
728x90

모수 상관계수, 비모수 상관계수로 나뉘어지는데,

대표적인 모수 상관계수가 피어슨 상관계수!

그리고 비모수 상관계수의 대표로는 스피어만, 켄달의 타우 상관계수가 있다.

 

모수통계방법 : 어떤 분포를 알며 모수값(예를 들면 평균이나 분산) 또한 안다는 가정하에 분석하는 방법

비모수통계방법:  모집단의 모수성을 가정을 하지 않고 하는 방법

정보가 없거나 모호할 경우에는 비모수 통계방법이 더 정확도가 높다.

 

 

  • 두 번째 그래프가 스피어만 상관계수 그림!
    • 초록색 점들로 나타내었으며, X와 Y의 순위 관계를 보여줍니다.
    • 스피어만 상관계수는 두 변수의 순위 간의 상관 관계를 측정합니다.
    • 값은 -1에서 1 사이로 해석됩니다.
  • 세 번째 그래프가 켄달의 타우 비선형 상관계수
    • 빨간색 점들로 나타내었으며, X와 Y의 비선형 관계를 보여줍니다.
    • 켄달의 타우는 두 변수 간의 순위 일관성을 측정합니다. 비선형 관계를 탐지하는 데 유용합니다.

 

☑️ 비모수 상관계수

  • 데이터가 정규분포를 따르지 않거나 변수들이 순서형 데이터일 때 사용하는 상관계수
  • 데이터의 분포에 대한 가정 없이 두 변수 간의 상관관계를 측정할 때 사용
  • 대표적으로 스피어만 상관계수와 켄달의 타우 상관계수가 있음

가. 스피어만 상관계수

  • 두 변수의 순위 간의 일관성을 측정 -> 순위가 같은 방향으로 가고 있냐 아니냐
  • 켄달의 타우 상관계수 보다 데이터 내 편차와 에러에 민감

나. 켄달의 타우 상관계수

  • 순위 간의 일치 쌍 및 불일치 쌍의 비율을 바탕으로 계산
  • ex) 예를들어 사람의 키와 몸무게에 대해 상관계수를 알고자 할 때 키가 크고 몸무게도 더 나가면 일치 쌍에 해당, 키가 크지만 몸무게가 더 적으면 불일치 쌍에 해당 이들의 개수 비율로 상관계수를 결정

 

☑️ 데이터의 분포에 대한 가정을 하지 못할 때

☑️ 순서형 데이터에서도 사용하고 싶을 때

 

 


 

스피어만과 켄달은 각각 어느 때에 쓰는 게 좋은지?

튜터님께 여쭤봤는데 좋은 답변을 주셨다.

 

결론: 데이터에 동점이 많거나 표본의 수가 적을 때는 켄달의 타우가 더 적절
이유: 켄달의 타우가 데이터 간의 순서 일치 여부를 더 정확히 반영하는데 반해, 스피어만은 동점이 발생하면 평균 순위를 사용하여 처리. 이는 동점이 많은 경우 정확한 순서 일치 여부를 반영하지 못함)

 

실무에서 켄달은 잘 안씀... 피어슨, 스피어만을 주로 쓴다고 알아두기.

회사에 따라 다르겠지만 모수가 크면 대부분 정규분포를 따른다고 가정한다고 배웠음

-> 중복 데이터가 많을 확률이 낮으니 스피어만을 써도 문제가 없음

게다가 데이터 크기가 클 수록 '모든 쌍을 구하는 켄달'이 계산량이 많기 때문에, 스피어만이 더 용이함

(표본의 크기가 적을 때 켄달을 주로 사용)

 

스피어만 -> 평균순위 사용
31242 -> 4 1 2.5 5 2.5


켄달 -> 모든 조합을 다 구함. 
(1,3) (2,1) ... 모든 쌍을 구한 다음에 방향이 같은지 

 

 


from scipy.stats import spearmanr, kendalltau

# 예시 데이터 생성
np.random.seed(0)
customer_satisfaction = np.random.rand(100)
repurchase_intent = 3 * customer_satisfaction + np.random.randn(100) * 0.5

# 데이터프레임 생성
df = pd.DataFrame({'Customer Satisfaction': customer_satisfaction, 'Repurchase Intent': repurchase_intent})

고객만족도와 재구매율 더미 데이터 생성

 

 

# 스피어만 상관계수 계산
spearman_corr, _ = spearmanr(df['Customer Satisfaction'], df['Repurchase Intent'])
print(f"스피어만 상관계수: {spearman_corr}")

# 켄달의 타우 상관계수 계산
kendall_corr, _ = kendalltau(df['Customer Satisfaction'], df['Repurchase Intent'])
print(f"켄달의 타우 상관계수: {kendall_corr}")

> 스피어만 상관계수: 0.8663546354635462
켄달의 타우 상관계수: 0.6690909090909092

 

이 경우 0.2 정도로 차이가 크게 나왔지만, 대부분의 데이터셋에서는 상관계수가 비슷하게 나온다고 함... 한 번 확인해봐야겠다

 

# 상관관계 히트맵 시각화
sns.heatmap(df.corr(method='spearman'),
            annot=True, #represent the cell values with text
            linewidth=.5, #Add lines between cells
            cmap='crest', 
            vmin=-1, vmax=1 #Set the colormap norm (data values corresponding to minimum and maximum points):
            )
plt.title('spearman coefficient heatmap')
plt.show()

728x90
반응형

'통계학' 카테고리의 다른 글

가설검정의 주의점 - 6.1 재현 가능성  (0) 2024.08.06
5.3 상호정보 상관계수  (0) 2024.08.05
5.1 피어슨 상관계수  (0) 2024.08.05
4.4 다항회귀, 스플라인 회귀  (0) 2024.08.05
4.3 범주형 변수  (0) 2024.08.05