본문으로 바로가기

통계 공부하다보면 공분산 얘기가 많이 나온다.

정리 차원에서 잠깐 끄적인다.


| 공분산이란
공분산(covariance)은 위키에서 다음과 같이 나와있다.

2개의 확률변수의 상관정도를 나타내는 값이다.  만약 2개의 변수 중 하나의 값이 상승하는 경향을 보일 때, 다른 값도 상승하는 경향의 상관관계에 있다면 공부산의 값은 양수가 될 것이다.  반대로 2개의 변수 중 하나의 값이 상승하는 경향을 보일 때, 다른 값이 하강하는 경향을 보인다면 공분산은 음수가 된다.  상관관계의 상승 혹은 하강하는 경향을 이해할 수는 있으나 2개의 변수의 측정 단위의 크기에 따라 달라지므로 정도를 파악하기에는 부적절하다.

그냥 쉽게 말해 A변수가 변할 때 B변수가 변하는 정도 라고 할 수 있다.
이를 식으로 적으면 다음과 같다.


이다. 

모수인 경우는 n으로 나누고 샘플인 경우는 n-1로 나눈다.

결국 위 수식대로라면 
x가 커질 때 y도 커지면 : 양수 * 양수 = 양수 
x가 작아질 때 y도 작아지면 : 음수 * 음수 = 양수

만약 반대로
x가 커질때 y가 작아지면 : 양수 * 음수 = 음수
x가 작아질 때 y가 커지면 : 음수 * 양수 = 음수

이다 결국 커질때 커지고 작아질때 얼마나 같이 작아지냐를 말한다. 

나중에 까먹을지 모르니 그냥 결론만 기억하자.
  • 공분산이 양수로 나오면 방향이 같이 변한다.
  • 공분산이 음수로 나오면 방향이 다르게 변한다.

그러나 사실 방향은 알 수 있어도 x와 y의 단위가 다르면 표준화되지 않아서 얼마나 상관이 큰지를 알 수 없다.
공분산을 표준화 한 상관계수를 활용해야 두 변수간의 상관 관계 정도를 가늠할 수 있다.


| 공분산을 구해보자
자 그러면 간단하게 R을 가지고 공분산을 구해보자
데이터는 MASS 패키지의 Cars93데이터이다.

> library(MASS)
> str(Cars93)
'data.frame': 93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ...

데이터 중 MPG.higway(고속도로 연비)와 Weight(무게)가 나오는데 
아마도 무게가 많이 나갈 수록 연비는 떨어지는 관계이지 않을까 추정하게 된다.
정말 그럴까? 

공분산을 구하면
> cov(x,y, method = c("pearson"))
[1] -2549.655
> x <- Cars93$MPG.highway
> y <- Cars93$Weight

#결측치확인
> sum(is.na(x))
[1] 0
> sum(is.na(y))
[1] 0
> cov(x,y, method = c("pearson"))
[1] -2549.655

수치를 보면 -2549.655 로 나왔다. 사실 이 값은 표준화가 안 되었기 때문에 수치만으로 얼마나 크게 변화하는지는 알 수 없다.
이것을 알기 위해서는 많이 들어봤던 상관계수값을 구해야 한다.

상관계수는 표준화된 공분산이다.

| 상관계수를 구해보자

우선 상관계수는 말한대로 표준화된 공분산이다
공식을 보자


R에서 상관계수를 구해보면 다음과 같다.
> cor(x,y, method = c("pearson"))
[1] -0.8106581
여기서는 피어슨 상관계수를 적용했다.  (피어슨, 스피어만 등 상관계수를 구하는것도 여러 종류가 있는데 여기서는 설명을 생략한다. )
참고 : http://m.blog.naver.com/lucifer246/180754322
결과는 -0.81정도로 강한 음의 상관이 있다는 것을 알 수 있다.
우리의 추측대로 무게가 올라갈 수록 연비도 떨어진다.


| 정리
공분산과 상관계수의 관계를 알아보았다.
주의할 것은 상관관계를 인과관계와 혼동해서는 안된다.
즉, x의 변화가 y의 원인이라던지,  혹은 그 반대라는 것은 아니다.
상관 관계는 그저 방향성이 없는 상관성만을 보는 것이다. 

또한, 상관관계가 없다고 해서 비선형관계까지 없다는 것은 아니다.
아래 그림을 보면 상관은 0 일지 모르지만 비성형적인 어떤 관계는 있는 것을 알 수 있다.

출처 : https://en.wikipedia.org/wiki/Pearson_correlation_coefficient



[참고]
http://blog.naver.com/ikek21/220003173213
http://rfriend.tistory.com/126



댓글을 달아 주세요