열렬히.뛰기

5. 탐색적 그래픽 그리기

수학 & 통계 > 탐색적 자료분석 > 탐색적 자료분석 : 목차 > 5. 탐색적 그래픽 그리기

개요

  • 데이터를 체크하기 위한 그래픽. 남들에게 보여주는 목적이 아니다.
  • 시각화는 굉장히 중요한 이슈!
  • 숫자만 보고서는 제대로 된 판단을 할 수 없기 때문.
  • “Debug” ⇒ 그림으로 그려서 판단하기

예시 : 미국의 공기오염

목적 = 표준 미세먼지 수치를 넘는 주가 미국 내에 존재하는가?

  • 여기서는 avgpm25.csv 를 사용한다.
  • 우리나라에도 비슷한 자료가 있음 ⇒ airkorea.or.kr/web 접속

데이터 가져오기 (출제가능성 100%)

  1. 변수 이름 : pollution
  2. 변수들의 타입 지정하기 (순서대로)
    • numeric, character, factor, numeric, numeric
    • (참고) R 변수 타입은 다음과 같이 5가지이다.
    • (참고) character, numeric, integer, logical, complex
  3. 데이터의 맨 위와 맨 아래 확인하기
해답
r
# class를 지정하지 않으면 R이 자동으로 만든다.

class = c("numeric", "character", "factor", "numeric", "numeric")
pollution = read.csv("avgpm25.csv", colClasses = class)

head(pollution)
str(pollution)

1차원 그래픽

  • 일반적인 데이터라면 산포도만으로도 충분할 수 있지만…
  • 빅데이터라면 그것만으로는 부족하다.
  1. 요약통계량
  2. Boxplot : 박스플롯
  3. Barplot : 바플롯
  4. 히스토그램 : 분포확인
  5. density plot : 곡선으로 확인하기

요약통계량

summary() 함수를 사용한다.

pollution 중 pm25의 요약 통계량을 보자.

해답
r
summary(pollution$pm25)

결과를 보면 다음과 같다

r
> summary(pollution$pm25)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.383   8.549  10.047   9.836  11.356  18.441
  • 크게 기울지는 않았다.
  • 상당수가 12를 넘고 있다.

Boxplot

pollution 중 pm25의 Boxplot을 보자.

이 그래프를 만드는 코드는?
r
# Boxplot of PM2.5 data
boxplot(pollution$pm25, col="blue")
  • 여기서 5와 15를 콧수염(whiskers)이라고 한다.
  • IQR = 사분위간 범위 = (3사분위수) - (1사분위수) = (전체 자료의 중간값)
  • whiskers를 벗어나는 경우를 이상치(outlier)로 볼 수 있나?
    • 꼭 그렇지는 않다. 다만 평균에서 먼 자료 정도로 보면 된다.

pm25가 15보다 큰 케이스를 살펴보자.

이 결과를 만드는 코드는?
r
# no.1
with(pollution, head(pm25[pm25 > 15]))

# no.2
subset(pollution, pm25 > 15)

# no.3
head(pollution[pollution$pm25 > 15,], 8)
  • 지역은 전부 서부라고 나온다.
  • west이면서 fips 코드 앞자리가 06인 곳 : 캘리포니아

Histogram

pm25의 히스토그램을 한번 보자.

breaks=100으로 해서 잘게 짜르고, 밀집도를 볼 수 있게 한다.

이 그래프를 만드는 코드는?
r
# hist of PM2.5
hist(pollution$pm25, col="green", breaks=100)
rug(pollution$pm25)

저수준 그래픽

그래프 위에 무언가를 씌울 때 사용한다.

주로 선을 그려 중위수나 기준을 표기한다.

pm25의 histogram. 기준선1을 10에, 기준선2를 12에 그려준다.

이 그래프를 만드는 코드는?
r
# hist of PM2.5
hist(pollution$pm25, col="green")
abline(v = 12, lwd=2) # 기준치
abline(v = median(pollution$pm25), col="blue", lwd=4) # 

pm25의 boxplot. 기준선을 파란색으로, y=12에 그려준다.

이 그래프를 만드는 코드는?
r
# boxplot + abline of pm25
boxplot(pollution$pm25)
abline(h = 12) # 기준치

Barplot

범주형 자료(categorical data)를 정리할 때 좋다.

먼저 table을 써서 정리를 한 다음, barplot을 그려준다.

지역별

이 그래프를 만드는 코드는?
r
barplot(table(pollution$region), col="wheat")

west와 east의 순서를 바꾸고 싶다면?

이 그래프를 만드는 코드는?

factor를 다시 지정해야 한다.

r
pollution$region = factor(pollution$region, levels = c("west", "east"))
barplot(table(pollution$region), col="purple")

2차원 그래픽

  1. 다차원 plot
  2. Scatterplot
  3. Smooth scatterplot

이해를 돕기 위해 다양한 요소를 넣어줄 수 있다. (저수준 함수)

  • 조건부 plot : 조건에 따라 플롯을 나눠주기
  • 차원 표기를 위한 색깔과 크기, 도형 넣기
  • 비추 : 회전, interactive 플롯 (너무 어지럽다)
  • 비추 : 진짜 3D 플롯 (역시 너무 어지럽다)

다차원 boxplot

문제 : 지역별 pm2.5

이 그래프를 만드는 코드는?
r
boxplot(pm25~region, data = pollution, col="red")

다차원 histogram

문제 : 지역별 pm2.5

이 그래프를 만드는 코드는?
r
par(mfrow=c(2,1))
hist(pollution[pollution$region == "west",]$pm25,
     col="green")
hist(pollution[pollution$region == "west",]$pm25,
     col="green")

Scatterplot

그냥 plot() 함수를 쓰면 된다.

문제 : latitude에 따른 pm2.5

이 그래프를 만드는 코드는?
r
plot(pollution$pm25~pollution$latitude,
     xlab="latitude", ylab="pm25")
abline(h=12, lty=2)

문제 : latitude에 따른 pm2.5. 색으로 region 구분해주기

이 그래프를 만드는 코드는?
r
plot(pollution$pm25~pollution$latitude,
     xlab="latitude", ylab="pm25",
     col=pollution$region)
abline(h=12, lty=2)

문제 : 지역에 따른 구분. latitude별 pm25

이 그래프를 만드는 코드는? (1번째 버전)
r
par(mfrow=c(1,2), mar=c(5, 4, 2, 1))
with(subset(pollution, region == "West"),
     plot(pollution$pm25~pollution$latitude, 
          main="West", ylab="pm25", 
          xlab="latitude"))
with(subset(pollution, region == "East"),
     plot(pollution$pm25~pollution$latitude, 
          main="East", ylab="pm25", 
          xlab="latitude"))
이 그래프를 만드는 코드는? (2번째 버전)
r
par(mfrow=c(1,2), mar=c(5, 4, 2, 1))
plot(pm25~latitude,data=pollution[pollution$region=="west",],main="West")
plot(pm25~latitude,data=pollution[pollution$region=="east",],main="East")
  • 여백을 지정할때 mar()을 사용한다.