ch02 - Histogram

Page content

Intro

A picture is worth a thousand words — English Language Adage The simple graph has brought more information to the data analyst’s mind than any other device. — John Tukey

한장의 그림이 수천단어보다 가치가 있다는 영어속담과, 명료한 시각화가 데이터분석가에게 다른 어떤 도구보다 더 많은 정보를 제공한다는 유명한 데이터 과학자의 조언. 핵심은 시각화이다.

본 장에서는 ggplot2 패키지를 활용한 시각화를 먼저 보여줄 것이다. 먼저 간단하게 ggplot2 패키지에 소개하자면 Grammar of Graphics1의 철학을 담아서 R 생태계에서 유명한 학자 중, Hadley Wickham에 의해 주도적으로 개발되었다. 그래프에도 문법이 있다는 패키지의 철학 아래, R의 시각화는 괄목할만한 발전을 이루었고 이는 R의 대중화에도 큰 영향을 끼쳤다.

이제 본격적으로 R 시각화를 작성해보자.

I. 사전준비

본 장에서는 시각화를 위해서 ggplot2를 주요 패키지로 사용한다. ggplot2 패키지를 설치했다고 가정한다. 만약 처음 패키지를 설치하는 사람이라면 R 패키지 설치[^2]에서 다시 한번 R 패키지 주요 생태계에 대해 이해하도록 한다.

Studio를 열고 아래 코드를 실행하자:

library(ggplot2)

library(ggplot2)를 실행하면 Registered ~라는 문구가 나왔다면 컴퓨터내 시스템에서 RStudio 환경으로 ggplot2 패키지를 정상적으로 불러왔다는 뜻이다. 이제 패키지 내 다양한 함수를 사용할 수 있는 사전준비가 완료된 것으로 이해해도 좋다.

II. 데이터셋 - 텍사스 부동산 판매데이터

대한민국에서 가장 중요한 문제중의 하나인 부동산과 관련하여 시각화를 진행하려 한다. 지금은 ggplot2 패키지 내에 존재하는 텍사스 부동산 판매데이터를 통해 시각화를 진행하지만, 향후에는 국내 부동산 데이터를 직접 가져와서 시각화를 진행하기를 바란다.

txhousing 데이터는 총 8602개의 관측치와 9개의 변수로 구성이 되어 있다. txhousing 데이터의 출처 및 각 변수(Column)에 대해 조금 더 자세히 알고 싶다면 R 소스코드 에디터에서 help(txhousing)을 실행하여 도움말을 참고하기를 바란다.

III. ggplot2 with Histogram

히스토그램은 언제 그려야 할까?

산점도 그래프가 두개의 연속형 변수를 통해서 변수간의 관계를 파악하는 그래프라고 한다면, 히스토그램은 연속형 변수 1개를 활용하여 각 변수마다 고유의 분포를 보여주고 싶을 때 작성한다. txhousing 데이터에서 sales 변수를 가지고 데이터를 작성하도록 해보자.

우선 아래코드를 실행 후 결과를 확인해보자.

ggplot(data = txhousing, aes(x = sales)) + 
  geom_histogram()

위 그래프를 보면, 데이터가 오른쪽으로 꼬리모양 형태를 띠며 분포하고 있는 것을 그리고 있다. 특히, sales 값 중 > 7500 이상 되는 값도 눈에 띄는데, 이것을 통계적인 용어로 이상치(outlier)라고 부른다.

그런데, 이상치는 평균을 한쪽으로 치우치게 만들 뿐 아니라 표준편차를 부풀릴 뿐만 아니라 표준편차를 근간으로 하는 모든 통계적인 모델링에 악영향을 미친다.

(1) Add Color and fill

히스토그램의 대략적인 기능을 이해했다면, 이제 본격적으로 시각화에 집중해본다. 색상을 입혀보자.

ggplot(data = txhousing, aes(x = sales)) + 
  geom_histogram(color = "black", fill = "white") + 
  theme_bw()

(2) X축에 평균선을 그려보자.

  • 평균선을 그리려면, geom_vline() 함수를 추가해야 한다.
ggplot(data = txhousing, aes(x = sales)) + 
  geom_histogram(color = "black", fill = "white") + 
  geom_vline(aes(xintercept=mean(sales, na.rm = TRUE)), 
             color = "blue", linetype="dashed", size=1)

  • line types의 종류에는,“blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash”가 있다.

(3) Change Plot Colors by groups

우선 dplyr 패키지를 활용하여 월별 평균을 구해본다.

library(dplyr)
txhousing %>% 
  group_by(month) %>%
  summarise(grp.mean = mean(sales, na.rm = TRUE))
## # A tibble: 12 x 2
##    month grp.mean
##    <int>    <dbl>
##  1     1     357.
##  2     2     431.
##  3     3     563.
##  4     4     578.
##  5     5     650.
##  6     6     685.
##  7     7     666.
##  8     8     648.
##  9     9     530.
## 10    10     516.
## 11    11     462.
## 12    12     504.
  • 이번에는 data.table을 활용하여 평균을 구해본다.
library(data.table)
txhousing2 <- data.table(txhousing)
txhousing2[, .(Mean=mean(sales, na.rm = TRUE)), by = month]
##     month     Mean
##  1:     1 356.9289
##  2:     2 430.8285
##  3:     3 563.1863
##  4:     4 577.5174
##  5:     5 649.7366
##  6:     6 685.1188
##  7:     7 665.8299
##  8:     8 647.8975
##  9:     9 529.6961
## 10:    10 516.3344
## 11:    11 462.0295
## 12:    12 504.4146
  • 위 방법 중 마음에 드는 것을 선택해 mean_sales라고 저장한다.
library(dplyr)
txhousing %>% 
  group_by(month) %>%
  summarise(grp.mean = mean(sales, na.rm = TRUE)) -> mean_sales
head(mean_sales)
## # A tibble: 6 x 2
##   month grp.mean
##   <int>    <dbl>
## 1     1     357.
## 2     2     431.
## 3     3     563.
## 4     4     578.
## 5     5     650.
## 6     6     685.

이 때, 1월과 7월을 비교하는 그래프를 그려본다.

jan_jul <- txhousing %>% 
  filter(month %in% c(1, 7)) %>% 
  mutate(month = as.character(month))
mean_jan_jul <- mean_sales %>% 
  filter(month %in% c(1,7)) %>% 
  mutate(month = as.character(month))

ggplot(jan_jul, aes(x=sales, color=month)) +
  geom_histogram(fill='white', alpha=.5, position = "identity") + 
  geom_vline(data = mean_jan_jul, 
             aes(xintercept=grp.mean, color=month), 
             linetype='dashed') + 
  scale_x_log10() + 
  theme_bw() + 
  theme(legend.position="top")

  • 먼저, geom_vline(new_data, ~)함수 안에 새로운 데이터를 추가해서 작성하는 것도 가능하다.
  • scale_x_log10()을 추가하였는데, 로그변환을 통해서 정규변환 형태로 만든 이후에 그래프를 비교하면 보다 시각적으로 비교하는 데 용이하다.
  • 위와 같이 1월과 7월별로 히스토그램으로도 충분히 그래프를 비교할 수 있다.

IV. Assignment

  • It’s your turn.
  • 전체 평균 데이터셋을 구해서 geom_vline()함수를 추가해보자.

R 강의 소개


  1. Hadley Wickham이 작성한 ggplot2 패키지에 관한 논문을 읽어보는 것을 제안한다. “The Layered Grammar of Graphics”, http://vita.had.co.nz/papers/layered-grammar.pdf ↩︎