상관분석

순동·2022년 2월 17일
0

📌 상관분석

  • 두 변수 간의 선형적 관계를 상관이라고 하며, 이러한 관계에 대한 분석을 상관분석이라 한다.
  • 두 변수는 일반적으로 연속형 변수를 가정한다.
> library(MASS)
> str(cats)  # 고양이 성별에 따른 몸무게와 심장의 무게
'data.frame':	144 obs. of  3 variables:
 $ Sex: Factor w/ 2 levels "F","M": 1 1 1 1 1 1 1 1 1 1 ...
 $ Bwt: num  2 2 2 2.1 2.1 2.1 2.1 2.1 2.1 2.1 ...
 $ Hwt: num  7 7.4 9.5 7.2 7.3 7.6 8.1 8.2 8.3 8.5 ...

상관분석을 통해 고양이의 몸무게와 심장 무게 간의 관계를 분석한다. 상관분석을 수행하기 전에 대략적인 관계를 산점도로 살펴보자.

> plot(cats$Hwt ~ cats$Bwt, col="forestgreen", pch=19,
+      xlab="Body weight (kg)", ylab="Heart weight (g)",
+      main="Body weight and Heart weight of Cats")

📌 상관계수(Correlation coefficient)

두 변수 간의 선형관계의 강도를 측정

  • -1 ~ +1 사이의 값을 가진다.
  • -1 : 음의 상관관계
  • +1 : 양의 상관관계
  • 0 : 두 변수 간의 선형관계가 없다.
  • 대칭이어서 x와 y의 상관계수는 y와 x의 상관계수와 일치
  • 선형변환에 의해 영향을 받지 않는다
> cor(cats$Bwt, cats$Hwt)
[1] 0.8041274

고양이의 몸무게와 심장의 무게의 상관계수가 0.8041274로 1에 가까운 값을 갖는다. 양의 선형관계가 존재함을 알 수 있다.

method=c("pearson", "kendall", "spearman")

method 인수에 3가지 옵션을 지정할 수 있다.

  • 데이터셋이 연속형인 경우 "pearson"
  • 데이터셋이 서열 척도로 되어 있는 경우 "kendall", "searman"

📝 Pearson 상관계수 vs Spearman 상관계수

  • Pearson 상관계수는 정규성 가정 필요하다.
  • Spearman 상관계수는 정규성 가정을 충족하지 못하는 서열척도의 데이터를 바탕으로 계산되며, 이상점에 덜 민감하다.
  • Pearson 상관계수와 Spearman 상관계수가 많이 다르면 Pearson 상관계수에 큰 영향을 미치는 이상점이 데이터에 포함되어 있을 가능성이 있다.

cor() 함수는 상관계수를 계산해주지만 유의성 검정을 해주지는 않는다. 상관계수에 대한 유의성 검정은 cor.test() 함수를 이용한다.

귀무가설 : 모집단에 대한 상관계수가 0이다.
대립가설 : 모집단에 대한 상관계수가 0이 아니다.

> cor.test(cats$Bwt, cats$Hwt)

	Pearson's product-moment correlation

data:  cats$Bwt and cats$Hwt
t = 16.119, df = 142, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.7375682 0.8552122
sample estimates:
      cor 
0.8041274

p-value=2.2e-16 이므로 귀무가설을 기각한다.
즉, 고양이의 몸무게와 심장 무게 간에는 상관관계가 존재한다.

> cor.test(cats$Bwt, cats$Hwt, alternative="greater", conf.level=0.99)

	Pearson's product-moment correlation

data:  cats$Bwt and cats$Hwt
t = 16.119, df = 142, p-value < 2.2e-16
alternative hypothesis: true correlation is greater than 0
99 percent confidence interval:
 0.7231755 1.0000000
sample estimates:
      cor 
0.8041274 

alternative="greater"

귀무가설 : 상관계수가 0보다 작다.
대립가설 : 상관계수가 0보다 크다

p-value = 2.2e-16 이므로 귀무가설을 기각한다. 즉, 상관계수는 0보다 크다. 위와 같은 결과를 갖는다.

> cor.test(~ Bwt + Hwt, data=cats)

	Pearson's product-moment correlation

data:  Bwt and Hwt
t = 16.119, df = 142, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.7375682 0.8552122
sample estimates:
      cor 
0.8041274

포뮬려 형식을 이용하면 subset 별로 함수를 적용할 수 있다는 장점이 있다.

p-value = 0.0001186 이므로 귀무가설을 기각한다.
암컷 고양이에 대해서도 고양이의 몸무게와 심장 무게 간에 상관관계가 존재한다.

단, cor.test() 함수는 두 변수 간의 상관계수 유의성 검정만 사용 가능하다는 한계가 존재한다.

📌 상관계수 행렬

> str(iris)
'data.frame':	150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 

> iris.cor <- cor(iris[-5])
> iris.cor

             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

> class(iris.cor)  # 행렬 형식
[1] "matrix" "array

> iris.cor["Petal.Width", "Petal.Length"]
[1] 0.9628654
> library(psych)
>corr.test(iris[-5])
Call:corr.test(x = iris[-5])
Correlation matrix 
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length         1.00       -0.12         0.87        0.82
Sepal.Width         -0.12        1.00        -0.43       -0.37
Petal.Length         0.87       -0.43         1.00        0.96
Petal.Width          0.82       -0.37         0.96        1.00
Sample Size 
[1] 150
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length         0.00        0.15            0           0
Sepal.Width          0.15        0.00            0           0
Petal.Length         0.00        0.00            0           0
Petal.Width          0.00        0.00            0           0

 To see confidence intervals of the correlations, print with the short=FALSE option

1번째 : 상관계수 행렬
2번째 : 상관계수에 대한 p-value

📌 상관계수의 95% 신뢰구간

> print(corr.test(iris[-5]), short=FALSE)
Call:corr.test(x = iris[-5])
Correlation matrix 
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length         1.00       -0.12         0.87        0.82
Sepal.Width         -0.12        1.00        -0.43       -0.37
Petal.Length         0.87       -0.43         1.00        0.96
Petal.Width          0.82       -0.37         0.96        1.00
Sample Size 
[1] 150
Probability values (Entries above the diagonal are adjusted for multiple tests.) 
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length         0.00        0.15            0           0
Sepal.Width          0.15        0.00            0           0
Petal.Length         0.00        0.00            0           0
Petal.Width          0.00        0.00            0           0

 Confidence intervals based upon normal theory.  To get bootstrapped values, try cor.ci
            raw.lower raw.r raw.upper raw.p lower.adj upper.adj
Spl.L-Spl.W     -0.27 -0.12      0.04  0.15     -0.27      0.04
Spl.L-Ptl.L      0.83  0.87      0.91  0.00      0.81      0.91
Spl.L-Ptl.W      0.76  0.82      0.86  0.00      0.74      0.88
Spl.W-Ptl.L     -0.55 -0.43     -0.29  0.00     -0.58     -0.25
Spl.W-Ptl.W     -0.50 -0.37     -0.22  0.00     -0.51     -0.20
Ptl.L-Ptl.W      0.95  0.96      0.97  0.00      0.94      0.98

📌 상관계수 행렬 시각화

> str(state.x77)
 num [1:50, 1:8] 3615 365 2212 2110 21198 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" ...
  ..$ : chr [1:8] "Population" "Income" "Illiteracy" "Life Exp" ...
 
> cor(state.x77)
            Population     Income  Illiteracy    Life Exp     Murder     HS Grad      Frost        Area
Population  1.00000000  0.2082276  0.10762237 -0.06805195  0.3436428 -0.09848975 -0.3321525  0.02254384
Income      0.20822756  1.0000000 -0.43707519  0.34025534 -0.2300776  0.61993232  0.2262822  0.36331544
Illiteracy  0.10762237 -0.4370752  1.00000000 -0.58847793  0.7029752 -0.65718861 -0.6719470  0.07726113
Life Exp   -0.06805195  0.3402553 -0.58847793  1.00000000 -0.7808458  0.58221620  0.2620680 -0.10733194
Murder      0.34364275 -0.2300776  0.70297520 -0.78084575  1.0000000 -0.48797102 -0.5388834  0.22839021
HS Grad    -0.09848975  0.6199323 -0.65718861  0.58221620 -0.4879710  1.00000000  0.3667797  0.33354187
Frost      -0.33215245  0.2262822 -0.67194697  0.26206801 -0.5388834  0.36677970  1.0000000  0.05922910
Area        0.02254384  0.3633154  0.07726113 -0.10733194  0.2283902  0.33354187  0.0592291  1.00000000

> # 산점도, 히스토그램, 상관계수 동시에 보여줌
> pairs.panels(state.x77, pch=21, bg="red", hist.col="gold",
+              main="Correlation Plot of us States Data")

> library(corrgram)
> # 산점도, 히스토그램, 상관계수 동시에 보여줌
> pairs.panels(state.x77, pch=21, bg="red", hist.col="gold",
+              main="Correlation Plot of us States Data")
> corrgram(state.x77, lower.panel=panel.shade,
+          upper.panel=panel.pie, text.panel=panel.txt,
+          order=TRUE, main="Corrgram of us States Data")

> cols <- colorRampPalette(c("red", "pink", "green", "blue"))
> corrgram(state.x77, col.regions=cols,
+          lower.panel=panel.pie, upper.panel=panel.conf,
+          text.panel=panel.txt, order=FALSE,
+          main="Corrgram of us States Data")

0개의 댓글