상관계수 (Correlation Coefficient)
- numpy를 이용하여 데이터의 상관계수를 구하기
- python으로 직접구현하여 데이터의 상관계수를 구하기
물론 numpy를 사용하는 것이 퍼포먼스적으로 월등하게 좋지만, 연습겸 공부겸 하여 구현해보려고 한다.
data1 = [80, 85, 100, 90, 95]
data2 = [70, 80, 100, 95, 95]
data3 = [100, 90, 70, 90, 80]
분산(variance)
- 1개의 이산정도를 나타낸다.
- 편차(평균과의 차이) 제곱의 평균
- 표준편차 = 분산의 제곱근
python으로 직접 구현
def variance(data):
var = 0
x_ = sum(data) / len(data)
for xi in data:
var += (xi - x_) ** 2
return var / len(data)
variance(data1), variance(data2), variance(data3)
>> (50.0, 126.0, 104.0)
numpy를 이용하여 구하기
np.var(data1), np.var(data2), np.var(data3)
>> (50.0, 126.0, 104.0)
공분산(covariance)
- 2개의 확률변수의 상관정도를 나타낸다.
- 평균 평차곱
- 방향성은 보여줄 수 있으나 강도를 나타내는데 한계가 있다.
- 표본데이터의 크기에 따라서 값의 차이가 큰 단점이 있다.
python 으로 직접 구현
def covariance(x, y):
cov = 0
x_ = sum(x) / len(x)
y_ = sum(y) / len(y)
for xi, yi in zip(x, y):
cov += (xi - x_) * (yi - y_)
return cov / (len(x) - 1) # 여기서 -1은 자유도이다. 데이터가 전체 데이터가 아니라면 -1 추가해줌
covariance(data1, data2), covariance(data1, data3)
>> (93.75, -87.5)
numpy 사용하기
np.cov(data1, data2)[0, 1], np.cov(data1, data3)[0, 1]
>> (93.75, -87.5)
공분산의 한계 : 방향성은 보여줄 수 있으나, 강도는 보여줄 수 없다.
data4 = [data * 10 for data in data1]
data5 = [data * 10 for data in data3]
covariance(data1, data3), covariance(data4, data5)
>> (-87.5, -8750.0)
상관계수(correlation coefficient)
- 공분산의 한계를 극복하기 위해 만들어졌다.
- -1 ~ 1 까지의 수를 가지며 0과 가까울 수록 상관도가 적음을 의미한다.
- x의분산과 y의 분산을 곱한 결과의 제곱근을 나눠주면 x나 y의 변화량이 클수록 0에 가까워진다.
python 으로 직접 구현
def cc(x, y):
cov = covariance(x, y)
var = (variance(x) * variance(y)) ** 0.5
return cov / var
# 1과 가까울수로 강한 양의 상관관계
# -1과 가까울수록 강한 음의 상관관계
# 0과 가까울수록 관계없음
cc(data1, data2), cc(data1, data3), cc(data4, data5)
>> (0.944911182523068, -0.970725343394151, -0.970725343394151)
numpy 사용하기
np.corrcoef(data1, data2)[0, 1], np.corrcoef(data1, data3)[0, 1], np.corrcoef(data4, data5)[0, 1]
>> (0.9449111825230682, -0.970725343394151, -0.970725343394151)
결정계수(cofficient of determination: R-squared)
- x로부터 y를 예측할 수 있는 정도
- 상관계수의 제곱 ( 상관계수를 양수화)
- 수치가 클수록 회기분석을 통해 예측할 수 있는 수치의 정도가 더 정확함
cc(data1, data2) ** 2, cc(data1, data3) ** 2
>> (0.8928571428571428, 0.9423076923076923)
'데이터분석' 카테고리의 다른 글
[Pandas] 네이버 증권 사이트의 종목토론실 데이터 수집하기 (0) | 2023.01.12 |
---|---|
Conditional Probability : 조건부 확률 (0) | 2023.01.03 |