산점도, 공분산, 상관계수

2020. 7. 9. 23:17데이터 분석 기본

반응형

평균과 표준편차는 하나의 표본을 설명하는 대표적인 지표로써 활용되고 있습니다. 그렇다면 두 변수와의 관계를 나타낼 수 있는 방법은 무엇이 있을까요? 바로 대표적으로 산점도, 공분산, 상관계수가 있습니다.

[산점도]

만약 변수 x와 y에 대해 (x,y)가 짝을 이루고 있다고 가정해보겠습니다. 각 변수 x, y에만 관심이 있다면 x의 평균/표준편차, y의 평균/표준편차를 이용하여 x와 y의 특징을 나타낼 수 있을 것입니다. 하지만 저희는 x와 y의 관계를 알고 싶기 때문에 x와 y를 동시에 고려해야 합니다. 이 때 가장 쉽게 적용할 수 있는 방안이 산점도를 활용하는 것입니다.

산점도는 변수 x를 수평축에 놓고 변수 y를 수직축에 놓고 각 관측값의 짝을 표시하는 것입니다.

아래와 같은 자료가 주어졌다고 해보겠습니다.

  체중
A 170 70
B 180 80
C 165 65
D 150 55

위의 자료를 산점도로 나타내면 아래와 같이 나타낼 수 있습니다.

키, 체중 산점도

산점도로 표현하니 키와 체중이 강한 선형관계가 있음을 판단할 수 있습니다.

[공분산]

공분산은 두 개의 변수의 관계를 보여주는 값입니다. 다시 말하면, 변수 x와 y에 대해 x가 변할 때 y가 어떻게 변동하는지를 나타냅니다. 공분산은 각 변수 x, y의 편차의 기대값(평균)으로 나타낼 수 있습니다.

위 식에서 f(x,y)는 결합확률분포입니다. 변수 x와 y가 쌍으로 관찰될 확률정도로 이해해주시면 될 것 같습니다.

여기서 중요한 것은 위의 식에서 보는 것과 같이 x가 평균보다 커질 때 y도 평균보다 커진다면 0보다 큰 값을 가지게 될 것이고 x가 평균보다 작은 값을 가질 때 y는 평균보다 큰 값을 가지게 된다면 0보다 작은 값을 가지게 될 것입니다. 이와 같이 공분산이 음수인지, 양수인지에 따라 x와 y가 함께 움직이는지 다르게 움직이는지 판단할 수 있을 것입니다. 

Cov(X, Y) > 0    X가 증가 할 때 Y도 증가

Cov(X, Y) < 0    X가 증가 할 때 Y는 감소

Cov(X, Y) = 0     두 변수간에는 아무런 선형관계가 없음 (두 변수가 독립적이라면 공분산은 0이 되지만, 공분산이 0이라고 해서 항상 독립적이라고 할 수 없음)       

(출처: https://destrudo.tistory.com/15)

 

[상관계수]

공분산을 활용해서 변수 x와 y가 함께 변동하는지를 판단하는 척도로 활용할 수 있지만, "얼마나" 함께 움직이는지를 판단하기는 어렵습니다. 그 이유는 공분산은 변수 x, y의 단위에 따라 값의 변동이 크기 때문입니다.

예를 들어 x: (1,2,4) y:(5,10,15)라고 해보겠습니다. 이 때 공분산은 7.5가 됩니다. 만약 x:(10,20,40), y:(50,100,150)이라면 공분산은 어떻게 될까요? 750이 됩니다. 이와 같이 공분산은 x,y의 단위에 따라 값의 변동이 커져 "얼마나" 함께 움직이는지를 판단하기 어렵습니다.

따라서 상관계수를 활용해서 우리는 경향성의 정도를 파악하게 됩니다.

위의 수식에서 확인할 수 있듯이 x와 y 분산의 곱의 제곱근을 나눠줌으로써 단위의 영향을 줄여주게 됩니다. 이 때 상관계수는 1에 가까울 수록 양의 관계를, -1에 가까울 수록 음의 관계를 나타냅니다.

다시 위의 예로 돌아가 상관계수를 도출해보도록 하겠습니다. x: (1,2,4) y:(5,10,15) 일 때 x와 y의 상관계수는 0.98이 됩니다. x:(10,20,40), y:(50,100,150)일때는 어떻게 될까요? 이 때도 마찬가지로 상관계수가 0.98이 됩니다.

이처럼 상관계수를 활용하여 효과적으로 상관성이 얼마나 큰지 판단할 수 있게 됩니다.

아래는 이번 글에서 수행한 실습코드를 첨부하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
## Data 입력
import pandas as pd
 
dict_table = {"Height":pd.Series([170180165150], index=["A","B","C","D"]),
       "Weight":pd.Series([70,80,65,55], index=["A","B","C","D"])}
 
table_ = pd.DataFrame(dict_table)
table_
 
## 산점도 그리기
 
import matplotlib.pyplot as plt
 
plt.plot("Height","Weight", data= table_, linestyle="none",marker="o", color ="blue", alpha =0.2)
plt.title("Scatter Plot")
plt.xlabel("Height", fontsize = 10)
plt.ylabel("Weight", fontsize = 10)
plt.show()
 
## 공분산, 상관계수 구하기
 
import numpy as np
 
list1 = ([1,2,4])
list2 = ([5,10,15])
list3 = ([10,20,40])
list4 = ([50,100,150])
 
print("공분산-list1 vs list2",np.cov(list1, list2)[0][1])
print("공분산-list3 vs list4",np.cov(list3, list4)[0][1])
print("상관계수- list1 vs list2",np.corrcoef(list1,list2)[0][1])
print("상관계수- list3 vs list4",np.corrcoef(list3,list4)[0][1])
cs
반응형

'데이터 분석 기본' 카테고리의 다른 글

확률변수, 확률분포  (0) 2020.07.16
조건부 확률과 베이즈 정리  (2) 2020.07.14
확률의 기본 연산  (0) 2020.07.12
확률의 이해  (0) 2020.07.11
평균과 표준편차  (0) 2020.07.08