본문 바로가기
## 오래된 게시글 (미관리) ##/R

13. 상관분석

by #Glacier 2018. 11. 20.
반응형

안녕하세요. 포스팅하는데 너무 춥네여 커피숍이;; 

이번에는 상관분석에 대해 알아보겠습니다.


# 상관분석이란 ?

 -데이터 내의 두 변수간의 관계를 알아보기 위한 분석방법이며 상관계수를 이용해서 알아본다.

  상관분석은 연속형, 순서형 자료를 대상으로 하고, 범주형은 의미가 없으므로 상관관계 분석이 불가능하다.


# 특성

 -두 변수 간의 연관된 정도를 제시하는 것이며 인과관계가 반드시 있는 것은 아니다. 따라서 회귀분석을 통해 두 변수간의

  인과 관계를 살펴볼 수 있음.

 -등간성이나 비율성이 존재하지 않음

 -결정계수(R Square)는 상관계수를 제공하여 나오는 값으로, 회귀분석에서 설명력을 의미.


# 절차

1. 변수들 간의 산점도(Scatter plot)그리기 

2. 산점도를 통해 선형결합 파악

3. 상관계수 계산 

4. 해석

5. 상관관계의 유무, 정도에 따라 회귀분석 실시


# 종류


1. 피어슨 상관계수분석 : 등간척도 이상으로 측정된 두 변수들의 상관관계 측정 방식

                            연속형 변수, 정규성 가정 , 대부분 사용함. 피어슨의 r(적률상관계수)

2. 스피어만 순위상관분석 : 서열척도인 두 변수들의 상관관계측정방식. 순서형 변수, 비모수 방법

                               순위를 기준으로 상관관계 측정 (순위상관계수, (로))

3. 켄달의 타우 : 서열척도인 두 변수들이 상관관계 측정 방식. 순서형 변수, 비모수 방법 (%5Ctau%20%20, 타우)


 상관계수는 -1~+1사이의 값을 가집니다.


#결과 해석

 1. "상관계수는 0이다" 라는 귀무가설을 기각할 수 있는지 검정

 2. "유의 확률(양측검정) < 0.05 인 경우 상관관계가 있다"고 할 수 있음

 

#상관 관수의 해석

 |0.7|이상이면 상관관계가 강함

 |0.3|~|0.7|사이면 어느 정도 상관관계가 있다.

 |0.1|~|0.3|사이면 애매한(약한 상관관계)

 0~|0.1| 무시


#상관분석의 사례



#전에 다뤄봤던 airquality 데이터를 가지고 해보겠습니다.

data(airquality)
summary(airquality)


#summary결과를 보시면 NA가 나오고 있습니다.

NA를 다루는 방법은 많은데 결측을 대체해야만 한다면 결측을 대체하는 방법도 여러가지가 있는데 아직 그것은 숙련난이도이기 때문에.. na.omit()이라는 함수를 이용해서 결측이 있는 row전체를 다 날려버릴겁니다.


aq<-na.omit(airquality)
summary(aq)

# 써머리를 보시면 NA가 다 없어진걸 알 수 있죠. 자료를 이제 슬쩍 다듬었으니 이제 산점도를 그리고 선을 그려봐야겠죠?

  쉽게 상관관계가 있을거같은 오존량과 온도에 대해서 해보겠습니다.

  아까처럼 ggplot2를 이용할 겁니다. 껐다 키신분은 다시 설치와 라이브러리 불러들이는거 해주시구요. 저는 그대로 하겠습니다.


g<- ggplot(aq, aes(Ozone, Temp))
g + geom_point() + geom_smooth(method="lm")




# geom point는 점으로 찍는 것을 의미하고 smooth=lm이것은 선을 표현해주는 겁니다.

  딱 봐도 두 오존과 온도량에 선형 상관관계가 있다고 볼 수 있다. ( outlier도 존재하고 있지만 )


# R을 통해서 몇 가지 명령어를 더 써보면,

cor(aq$Ozone, aq$Temp)
[1] 0.6985414


# 예상했던 대로 오존량과 온도의 상관관계는 높은 편이다.

cor(aq[,c(1:4)])
             Ozone    Solar.R       Wind       Temp
Ozone    1.0000000  0.3483417 -0.6124966  0.6985414
Solar.R  0.3483417  1.0000000 -0.1271835  0.2940876
Wind    -0.6124966 -0.1271835  1.0000000 -0.4971897
Temp     0.6985414  0.2940876 -0.4971897  1.0000000


# correlation matrix를 만들어보니까 온도와 오존량이 가장 상관관계가 높았다.

cov(aq[,c(1:4)])
             Ozone   Solar.R      Wind      Temp
Ozone   1107.29009 1056.5835 -72.51124 221.52072
Solar.R 1056.58346 8308.7422 -41.24480 255.46765
Wind     -72.51124  -41.2448  12.65732 -16.85717
Temp     221.52072  255.4676 -16.85717  90.82031


# 공분산 행렬을 만들어보니까 오존과 Solar.R과의 공분산이 상대적으로 많이 높은편이였다.

  이제 대충 훑어봤으니 상관분석을 해봐야겠죠? 온도와 같은 자료들은 연속형 자료이므로 순서형자료가 아닙니다.

  따라서 피어슨상관분석을 해야겟져?


aq[,c(1:4)]

# 이렇게 치면 Ozone과 Solar.R, Wind, Temp 이 4가지 변수가 쭉 나옵니다 . 이것을 분석해보겠습니다.

cor(as.matrix(aq[,c(1:4)]), method="pearson")

# 위의 것을 매트릭스로 인식시키고, 피어슨 방식으로 cor를 구해보면,


             Ozone    Solar.R       Wind       Temp
Ozone    1.0000000  0.3483417 -0.6124966  0.6985414
Solar.R  0.3483417  1.0000000 -0.1271835  0.2940876
Wind    -0.6124966 -0.1271835  1.0000000 -0.4971897
Temp     0.6985414  0.2940876 -0.4971897  1.0000000


#이렇게 나왔네요. 위에 하나만 cor계산해본것과 값이 똑같죠? 그럼  피어슨방식이 default값이라는 것을 알 수 있습니다.


############################################## 세 가지 상관분석 비교 ########

이제 세 가지 상관분석 비교를 해볼까요? 서적에서 2013년 프로야구 선수 기록 발췌한 내용을 가지고 직접 타자쳐서 해보겠습니다.


Player<-c("LSY","CHW","KHS","BBH","KJH","NJW","CJ") # 선수명
BT<-c(443, 511, 434, 450, 450, 435, 434) # 타석수
H2<-c(24, 28,23,17,21,18,18) #2루타
HR<-c(13,29,16,37,22,21,28) #홈런
BB<-c(30,47,62,92,68,62,64) #볼넷 수
SO<-c(94,91,71,96,109,70,109) #삼진아웃 수
 

df<-data.frame(BT,H2,HR,BB,SO)
rownames(df)<-Player
df
     BT H2 HR BB  SO
LSY 443 24 13 30  94
CHW 511 28 29 47  91
KHS 434 23 16 62  71
BBH 450 17 37 92  96
KJH 450 21 22 68 109
NJW 435 18 21 62  70
CJ  434 18 28 64 109


# 선수명을 row이름에 각각 넣어줬구요 나머지는 각각 변수로 열에 들어가게 됩니다. 그것을

  df라는 변수에 데이터프레임형태로 저장해주구요. 한번 확인하면 잘들어갔죠~?

 순위를 기준으로 상관관계 측정을 할 수 있으므로 스피어만, 켄달 방식을 써보는게 좋을 것 같습니다.


일단 피어슨 / 스피어만 / 켄달 세 가지를 모두 해볼까요?




> cor(as.matrix(df))
           BT            H2               HR               BB         SO
BT  1.0000000  0.7095900  0.3640952 -0.2280972  0.1234326
H2  0.7095900  1.0000000 -0.3470344 -0.7117180 -0.1124650
HR  0.3640952 -0.3470344  1.0000000  0.7011778  0.3706620
BB -0.2280972 -0.7117180  0.7011778  1.0000000  0.1108934
SO  0.1234326 -0.1124650  0.3706620  0.1108934  1.0000000
> cor(as.matrix(df), method=c("spearman"))
           BT            H2               HR            BB             SO
BT 1.00000000  0.2660662  0.5091751  0.02752409  0.1467952
H2 0.26606624  1.0000000 -0.3964125 -0.80909091 -0.2636364
HR 0.50917508 -0.3964125  1.0000000  0.59461873  0.3783937
BB 0.02752409 -0.8090909  0.5946187  1.00000000  0.5454545
SO 0.14679517 -0.2636364  0.3783937  0.54545455  1.0000000
> cor(as.matrix(df), method=c("kendall"))
          BT            H2                 HR       BB         SO
BT 1.0000000  0.2051957  0.3504383  0.00000  0.1025978
H2 0.2051957  1.0000000 -0.3903600 -0.65000 -0.1500000
HR 0.3504383 -0.3903600  1.0000000  0.48795  0.1951800
BB 0.0000000 -0.6500000  0.4879500  1.00000  0.2500000
SO 0.1025978 -0.1500000  0.1951800  0.25000  1.0000000


# 그 결과,  세 가지 정말 꽤 다른 상관계수를 보여주고있죠?

일단 피어슨 상관계수를 보면, 타석수와 2루타가 상관관계가 0.71이나 되는 기염(ㅋㅋ)을 토하고있습니다.

볼넷과 홈런 수의 상관계수도 꽤 크게 측정됐네요.

이렇게 방법이 잘못되면 엉뚱한 답이 나올 수도 있다는 점.. 유의해주세요.


그렇다면 스피어만과 켄달방식을 볼까요? 두개 다 타석수에 따라서 어느정도 상관관계를 보여주고 있는데요.

제 생각은 켄달방식이 가장 일리가 있다고 생각되네요. 타석수가 늘어남에 따라서 2루타와 홈런, 삼진아웃의 가능성이 약간씩 있고..

2루타 수와 홈런 수의 값을 집어넣었던 것을 보면 가장..그나마 적절하게 표현된 것이 아닐까 싶네요.

물론 이것은 데이터가 작고, 정확하게 분석하기에는 조금 무리가 있는 감이 있습니다. 정확한 해석은 그 상황을 잘 이해해야 하기 때문이죠..  

예제니까 이쯤만 하고 넘어가도록 하겠습니다.


#오늘은 상관분석에 대해서 알아보았는데요~ 참고로, cor()함수로서 여러가지 방식을 할 수도있지만

Hmisc라는 패키지 안에 rcorr()이라는 상관관계를 구하는 함수가 있고, 타입에 따라서 스피어만과 피어슨으로 구할 수 있다고 합니다.

뭔가 기나긴 여정이었네요 항상 쓸 때는 보면 엄청 많이 쓴 것 같은데 올리고보면 별로 안되요 ;;

쨋든.. 다음번에는 회귀분석에 대해 알아보도록 하겠습니다.


반응형