상관계수, 결정계수
어제 배운 상관계수, 결정계수에 대해 복습하면서 더 공부하고,
부족한 부분을 채우기 위해 더 필요한 부분이 무엇인지 알아보자.
그 다음으로 수식을 Python을 통해 구현해볼 것이다.
마지막으로 numpy의 상관관계 내장 메서드를 알아볼 것이다.
주관적으로 이해한 상관계수란,
두 데이터 집단의 상관 정도와 얼마나 관계가 강한지 알수 있는 지표.
상관계수가 1에 가까울 수록 더 강한 양의 상관 관계를 가지고, -1에 가까울 수록 음의 상관 관계를 가진다. 0과 가까울 수록 두 데이터 집단은 관계가 없다고 볼 수 있다. 하지만 상관계수가 0이라고 해서 두 집단이 독립된 집단이라고 판단할 수는 없다.
많이 사용되는 상관계수로는 피어슨 상관계수, 스피어만 상관계수가 있다.
정도가 되겠다.
상관계수를 구하는 수식을 알아보자.
공분산을 x, y의 표준편차를 곱한 값으로 나눈다.
공분산은
각 지점(과거 ~ 지금)마다의 편차들의 곱을 통해
각 지점마다의 상관 정도를 구하고 그 상관 정도들의 평균을 구하여,
전체적으로 두 데이터 집단의 관계(방향성)을 판단하는 지표였다.
표준편차는
관측값과 평균값의 차이(편차)의 평균이었다.
즉, 상관 정도(편차들의 곱)의 평균을 편차의 평균으로 나누어,
각 지점마다의 상관 정도가 편차의 평균의 어느 정도 비율인지
계산한다는 말이 아닐까. 생각한다.
상관 정도의 평균이 편차의 평균과 값이 가까워질 수록,
그 상관 정도가 편차의 평균에 더 강력하게 붙어 있다는 뜻이 될테니까.
+-1에 가까울 수록 더 강력하게 관계가 있다고 생각하고,
0에 가까울 수록 더 관련이 없다고 생각한다는 의미와는 일단 일치한다.
정리해보자면,
상관 정도(편차들의 곱)의 평균을 편차의 평균으로 나누어,
상관 정도(편차들의 곱)의 평균이 편차의 평균의 어느 정도 비율인지 계산한다.
상관 정도(편차들의 곱)의 평균이 편차의 평균과의 차이가 작을 수록
+-1에 가까워질 것이고, 이 말은 곧 강력하게 상관이 있다는 말이겠다.
(+면 양의 상관 관계, -면 음의 상관 관계를 가지겠다.)
상관 정도(편차들의 곱)의 평균이 편차의 평균과의 차이가 클 수록
0에 가까워질 것이고, 이말은 곧 약하게 상관이 있다는 말이겠다.
(맞는 말인지는 모르겠으나, 나의 생각은 이렇다.)
자, 이어서 수식을 살펴보자.
길게 끌지 말고, 바로 구현해 보자.
힐링이 필요하다.
def correlation_coefficient(x, y):
var_x = var_y = cov = 0
avg_x, avg_y = sum(x) / len(x), sum(y) / len(y)
for xi, yi in zip(x, y):
var_x += (xi - avg_x) ** 2
var_y += (yi - avg_y) ** 2
cov += (xi - avg_x) * (yi - avg_y)
return cov / (var_x * var_y) ** 0.5
data1 = [80, 85, 100, 90, 95]
data2 = [70, 80, 100, 95, 95]
data3 = [100, 90, 70, 90, 80]
print(f'data1과 data2의 상관계수 : {correlation_coefficient(data1, data2)}')
print(f'data1과 data3의 상관계수 : {correlation_coefficient(data1, data3)}')
출력 결과 :
data1과 data2의 상관계수 : 0.944911182523068
data1과 data3의 상관계수 : -0.970725343394151
후.
numpy의 분산 내장 함수, corrcoef를 이용하면,
import numpy as np
print(f'data1과 data2의 상관계수 : {np.corrcoef(data1, data2)[0, 1]}')
print(f'data1과 data3의 상관계수 : {np.corrcoef(data1, data3)[0, 1]}')
출력 결과 :
data1과 data2의 상관계수 : 0.944911182523068
data1과 data3의 상관계수 : -0.970725343394151
이번엔 결정계수에 대해 알아보자.
주관적으로 이해한 결정계수란,
두 데이터 집단 x, y가 있을 때 x로 부터 y의 데이터를 예측할 수 있는 정도를 알 수 있는 지표.
회기 분석을 할 때 많이 사용된다. 'R-squared', 'R2' 등 여러 이름으로 불리는 듯하다.
y와 z의 데이터를 가지고, x를 예측하는 모델을 만든다고 가정해보자.
여기서 y의 데이터를 사용해야할 지, z의 데이터를 사용해야할 지 판단하기 위해 사용된다.
상관계수를 제곱하여 양수화를 시킨다.
정도가 되겠다.
즉 상관계수가 방향성과 강도를 알 수 있었다면,
결정계수는 방향성을 포기하고 강도에 집중한 지표라고 볼 수 있겠다.
구현이라고 하기에는 조금 민망하다.
def correlation_coefficient(x, y):
var_x = var_y = cov = 0
avg_x, avg_y = sum(x) / len(x), sum(y) / len(y)
for xi, yi in zip(x, y):
var_x += (xi - avg_x) ** 2
var_y += (yi - avg_y) ** 2
cov += (xi - avg_x) * (yi - avg_y)
return cov / (var_x * var_y) ** 0.5
data1 = [80, 85, 100, 90, 95]
data2 = [70, 80, 100, 95, 95]
data3 = [100, 90, 70, 90, 80]
print(f'data1과 data2의 결정계수 : {correlation_coefficient(data1, data2) ** 2}')
print(f'data1과 data3의 결정계수 : {correlation_coefficient(data1, data3) ** 2}')
출력 결과 :
data1과 data2의 결정계수 : 0.8928571428571428
data1과 data3의 결정계수 : 0.9423076923076923
즉, data1을 예측하는 모델을 만드려면,
data2보다 data3을 사용하여 모델링을 하는 것이
만들어진 모델의 예측 정확도가 더 높게 나올 것이다.
출처:
피어슨 상관 계수 - 위키백과
https://ko.wikipedia.org/wiki/피어슨_상관_계수
피어슨 상관 계수 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전.
ko.wikipedia.org