본문 바로가기
카테고리 없음

[CONNIE'S] 서울시 대기환경 정보 데이터를 사용한 상관계수(Correlation Coefficient) 개념 정리

by Connieee_n 2021. 3. 9.
반응형

안녕하세요! CONNIE 입니다. 이번에는 실제 데이터로 상관계수 개념을 공부해보면 어떨까 해서 서울시의 대기환경 정보를 가져왔어요. 미세먼지, 초미세먼지 농도는 한국의 포털 사이트 메인에 항상 나와있을 정도로, 우리가 거의 매일 확인하는 수치들이죠.

어서 미세먼지 없는 세상이 되었으면..ㅠㅠ [사진출처: 연합뉴스]

본격적으로 데이터 실습을 하기 앞서 우리가 배운 상관계수가 어떤 것이었는지 이론을 살짝 살펴보도록 하겠습니다!

Correlation Coefficient (상관계수)

상관계수란 두 변수 간의 선형(선형이라는 게 중요했어요!💃🕺) 상관관계를 수치로 표현해주는 값입니다. Scatter Plot(산점도)를 통해 두 변수 간의 관련성을 시각적으로 파악할 수 있다면, 상관계수란 이를 수치로 표현해주는 값이라 할 수 있습니다. 위키디피아의 정의는 다음과 같이 나와있습니다.

 

“상관계수란 X와 Y간의 선형 상관관계를 계량화한 수치”

 

통계에는 여러 유형의 상관계수가 존재하고(피어슨 상관계수, 스피어만 순위 상관계수, 켄달의 타우 등), 제각기 다른 정의와 특징이 있습니다. 그러나 공통적으로 상관계수란 다음과 같은 특징을 가집니다.

 

  • 상관계수는 두 변수의 선형적인 관계를 측정하는 지표이다.
  • $r$은 언제나 -1에서 1사이의 값을 갖는다.
  • $r>0$인 경우는 양의 상관성을, $r <0$인 경우는 음의 상관성을, $r=0$인 경우는 선형 상관성이 존재하지 않는 것을 나타낸다.
  • $r=0$은 두 변수사이의 관계가 존재하지 않는다는 것을 의미하진 않는다. 선형 상관이 아닌 다른 여러 가지 상관성이 존재한다.
  • 상관계수는 단위가 존재하지 않는다.

상관계수의 공식은 다음과 같습니다.

\[ r=\frac{1}{n-1}\sum_{i=1} ^{n}(\frac{x_{i}-\overline{x}}{S_{x}})(\frac{y_{i}-\overline{y}}{S_{y}}) \]

 

이 내용을 잘 생각하면서 실제 데이터에 적용해 보도록 할께요~!😎

실습 데이터 받기

실습 데이터로 간단히 쓰기 위해서 제가 편하게 파일을 편집하였습니다! 2021년 1월 한 달 동안 서울시의 미세먼지, 초미세먼지, 오존 농도를 한파일로 모아보았어요. (파일은 첨부파일 확인 혹은 여기 링크에서 다운로드할 수 있어요.)

Air pollution.csv
0.00MB

  • Date: 1월의 날짜
  • PM10: 미세먼지 농도
  • PM2.5: 미세먼지보다 입자가 작은 초미세먼지 농도
  • O3: 오존 농도

상관계수 구하기

상관계수에 대한 좀 더 자세한 설명은 Issac님의 강의를 한번 보시는 것을 추천드려요!

R에서는 cor()이라는 함수를 통해, 상관계수를 구할 수 있습니다. 미세먼지 농도와 초미세먼지 농도는 상관관계가 있을까요? 함수 cor()에 넣어 보았습니다.

data <- read.csv("Air pollution.csv")
head(data)
##       Date PM10 PM2.5    O3
## 1 2021.1.1   25    16 0.015
## 2 2021.1.2   31    11 0.025
## 3 2021.1.3   36    13 0.020
## 4 2021.1.4   37    21 0.009
## 5 2021.1.5   27    16 0.021
## 6 2021.1.6   23    13 0.017
cor(data$PM10, data$PM2.5)
## [1] 0.8329045

이렇게 0.8329045라는 수치가 출력되네요. 1에 가까우니 꽤 높은 수치인 것 같아요. 미세먼지 농도가 높으면 초미세먼지 농도도 높을 가능성이 높네요!

상관계수 공식을 그대로 사용해보기!

우리가 앞에서 살펴본 상관계수 공식을 그대로 사용했을 때, cor함수에 넣은 값과 같은 상관계수 값이 나오는지, 위의 수식을 따라 코딩해보았습니다. 결론은 cor함수에 넣은 것과 같은 값이 나와요.

n <-length (data$PM10) #변수의 개수
mean_x <- mean(data$PM10) #미세먼지농도의 평균
mean_y <- mean(data$PM2.5) #초미세먼지농도의 평균
s_x <- sd(data$PM10) #미세먼지농도의 표준편차
s_y <- sd(data$PM2.5) #초미세먼지농도의 표준편차
z_x <- (data$PM10-mean_x) / s_x #미세먼지농도 각 변수에서 평균을 뺀 값을 표준편차로 나눈 값
z_y <- (data$PM2.5 - mean_y) / s_y #초미세먼지농도 각 변수에서 평균을 뺀 값을 표준편차로 나눈 값

sum(z_x * z_y) / (n-1)
## [1] 0.8329045

그렇다면 미세먼지 농도와 오존 농도는 상관관계가 어떻게 나올까요? cor 함수를 이용해서 구해보았습니다.

cor(data$PM10, data$O3)
## [1] -0.4868927

마이너스 값 -0.4868927이 나왔습니다. 막연히 미세먼지 농도가 높으면 모든 대기오염 지수가 높으리라 생각했는데, 의외로 그렇지는 않네요.

시각화

1. ggplot으로 산점도 그려보기

위에서 구한 미세먼지 농도(PM10)와 초미세먼지농도(PM2.5), 그리고 오존 농도의 상관관계를 시각화해보았습니다. p에는 미세먼지 농도와 초미세먼지 농도와의 산점도를 할당해주었고, m에는 미세먼지 농도와 오존 농도의 산점도를 할당해주었어요. 그리고 gridExtra라는 패키지를 통해서 두 그래프를 하나의 레이아웃으로 표현을 해주었습니다.

library(ggplot2)
library(gridExtra)

theme_set(theme_bw())

p <-read.csv("Air pollution.csv")
p<- ggplot(data=p, aes(x=PM10, y=PM2.5))+
  geom_point(size = 3, color="sky blue", alpha=0.8)
    #alpha=투명도

m<- read.csv("Air Pollution.csv")
m<- ggplot(data=m, aes(x=PM10, y=O3))+
  geom_point(size= 3, color="pink", alpha=0.8)

grid.arrange(p,m,nrow=2)

이번에는 같은 그래프를 이중축(dual y axis)으로 그려보았습니다. ggplot으로 2중축 그래프를 그려 하나의 패널에 표현을 해준다면, 더 보기 쉬울 수도 있을 것 같아요.

2. ggplot으로 축 두 개인 그래프 그리기

축을 두 개로 만들기 위해서 먼저, 데이터 프레임을 p값에 할당한 후, ggplot(사용할 데이터셋, x축)을 지정해주었습니다. 여기에 geom_point를 두 개 추가했어요.

  • 왼쪽 y축(초미세먼지농도 PM2.5)을 기준으로 포인트 표시를 해준다는 코드. 색상은 블루로 지정했어요.
  • 오른쪽 y축(오존농도 O3)을 기준으로 포인트 표시를 해주는 코드. 색상을 핑크로 표시했어요.

이중축이기 때문에 왼쪽과 오른쪽의 단위/규모가 달라서 조정해주어야 합니다. scale_y_continuous를 사용했는데, 여기서 오른쪽 y축 단위/1000을 해주기 때문에, 오른쪽 y축을 사용하여 포인트를 표시하는 **y=O3값에 *1000**을 추가합니다.

library(ggplot2)

p <-read.csv("Air pollution.csv")

ggplot(data=p, aes(x=PM10))+ 
  geom_point(aes(y=PM2.5), size=3, color="sky blue", alpha=0.8)+
  geom_point(aes(y=O3*1000), 
             size=3, color="pink", alpha=0.8)+
  scale_y_continuous("PM2.5", sec.axis=sec_axis(~./1000, name="O3"))

 

이렇게 코드를 입력하여 두 가지 산점도를 그려보았어요. 그래프 두 개를 붙여 보는 방법과 하나의 패널에 이중축으로 표현하는 방법 두 가지 살펴봤습니다!

3. corrgram으로 상관행렬 그려보기

이번에는 상관행렬으로 시각화를 해보았습니다. (여기서 잠깐! 상관행렬이란?🤓)

 

상관행렬(Correlation Coefficiet Matrix)이란 여러 변수간의 상관계수가 행렬로 표시되는 것을 말한다.

 

대각선에는 변수의 이름이 나타나고, 좌측 하단에는 상관계수를 그림으로 표현해주고 있습니다. 파란색은 양의 상관관계, 빨간색 계열은 음의 상관관계를 표시하는 거겠죠. upper.panel=panel.conf는 신뢰구간을 우측 상단에 배치하여 함께 보겠다는 의미입니다!

위의 상관계수 구하는 함수 cor를 이용했을 때와 같은 값이 나오는 걸 확인할 수 있습니다 👏

library(corrgram)
data <- read.csv("Air pollution.csv")
corrgram(data, upper.panel = panel.conf)

상관계수의 종류

위에서 여러 유형의 상관계수가 존재한다고 언급했습니다. 어떤 유형과 유형에 따른 차이가 있는지 한 번 정리해보았습니다.

  1. Pearson correlation coefficient (피어슨 상관계수): 연속형 자료와 연속형 자료간의 선형 관계를 나타내는 상관계수. 피어슨 상관계수는 두 변수가 모두 정규성을 따른다는 가정이 필요하기 때문에 모수적 방법이라고 한다. 예를 들어, 국어 점수와 영어 점수 간의 상관계수는 피어슨 상관 계수로 계산할 수 있다.

(여기서 잠깐! 모수적 방법이란?)

  • 중심극한정리에 의해 본래의 분포에 상관없이 무작위로 복원 추출된 연속형 자료의 평균의 분포는 정규분포를 띤다. 비교하고자 하는 두 집단이 모두 정규분포를 띈다면, 그 두 집단은 평균을 비교함으로써 차이를 밝힐 수 있다. 이렇게 정규성을 갖는다는 모수적 특성을 이용한 통계적 방법을 모수적 방법(Parametric method)이라고 한다.
  • 비모수적 방법이란 정규분포를 따르지 않는다고 증명되거나 소규모 집단에서 정규분포임을 가정할 수 없을 때 사용하는 방법으로, 순위 척도를 이용하는 통계적 방법을 비모수적방법(Non-parametric method)이라 한다.
  1. Spearman rank correlation coefficient (스피어만 순위 상관계수): 두 변수가 정규성을 따르지 않을 경우, 피어슨 상관계수 대신 스피어만 순위 상관계수를 이용할 수 있다. 스피어만 상관계수는 순위가 매겨진 변수 간의 피어슨 상관계수로 정의된다. 순위를 이용하기 때문에 연속형(Continuous) 변수가 아닌 순서형(Ordinal) 변수, 이산형(Discrete) 변수에도 상관계수를 구할 수 있다. 피어슨 상관계수와 달리 비선형 관계의 연관성을 파악할 수 있어 유용하다. 예를 들어, 국어 성적 등수와 영어 성적 등수의 상관계수는 스피어만 상관계수로 계산할 수 있다. 스피어만 상관계수 수식은 아래와 같다. r에서는 cor() 함수를 사용하며, method=“spearman”옵션을 넣으면 된다.

\[ \rho = \frac{\sum_{i}(x_{i}-\overline{x})(y_{i}-\overline{y})} {\sqrt{\sum_{i}(x_{i}-\overline{x})^2} \sqrt{\sum_{i}(y_{i}-\overline{y})^2}} \]

  1. Kendal’s rank correlation coefficient (켄달의 순위 상관계수): 순위를 이용하여 상관계수를 구한다는 점에서 스피어만 순위 상관계수와 비슷한 점이 있다. (X,Y)형태의 순서쌍이 있다고 가정할 때, X가 커질 때 Y도 커지면 부합(Concordant), X가 커질 때 U가 작아지면 비 부합(Discordant)라고 한다. 켄달의 순위 상관계수는 수식은 아래와 같다. r에서는 cor() 함수를 사용하며, method=“kendall”옵션을 넣으면 된다.
  • \(X_{i}\) > \(X_{j}\), \(Y_{i}\) > \(Y_{j}\) 또는 \(X_{i}\) < \(X_{j}\), \(Y_{i}\) < \(Y_{j}\) = 부합
  • \(X_{i}\) > \(X_{j}\), \(Y_{i}\) < \(Y_{j}\) 또는 \(X_{i}\) < \(X_{j}\), \(Y_{i}\) > \(Y_{j}\) = 비 부합

\[ \tau = \frac{(부합 관측치 쌍의 수) - (비 부합 관측치 쌍의 수)} {\frac{1}{2}n(n-1)} \]

 

여기까지 상관계수란 무엇이고, 종류와 각각의 특징이 무엇인지 간단하게 살펴보았습니다. 앞으로는 실제 데이터에서 어떻게 상관계수를 이용하여 데이터를 분석할 수 있을지 많이 살펴보는 연습이 필요할 것 같아요.

 

혹시 내용에 오류가 있다면 언제든지 댓글/피드백 달아주세요 🎆 잘못된 내용 알려주시는 것 언제나 환영입니다 👩‍🚀

참고자료

반응형

댓글