Summary

공공데이터포털의 자료를 이용해서 자료 정제 및 탐색적 데이터 분석을 연습해본다.

참고자료: 2012년 요일별 시간대별 교통사고

# 패키지 로딩
library(dplyr)
library(ggplot2)
library(tidyr)

데이터를 로딩한다. 다운로드 받은 csv 파일을 열고, 필요한 부분만 복사(ctrl + c 또는 command + c) 한다. os x에서는 read.table(pipe(“pbpaste”)) 를 이용하면 클립보드의 내용을 붙여넣기 할 수 있다.

# 데이터 로딩
df_clipboard <- read.table(pipe("pbpaste"), sep="\t", header=T)
names(df_clipboard)
names(df_clipboard) <- c('date', 'type', 'total', 'h2', 'h4', 'h6', 'h8', 'h10', 'h12', 'h14', 'h16',
                    'h18', 'h20', 'h22', 'h24')
write.csv(x = df_clipboard, file = '../160605-2012traffic.csv', row.names = FALSE)
df_file <- read.csv(file = '../data/160605-2012traffic.csv')


# total 항목은 불필요해서 삭제한다.
df_data <- tbl_df(df_file)
df_data <- select(df_data, -total)

데이터를 긴 포맷으로 변경한다.

head(df_data)
## Source: local data frame [6 x 14]
## 
##     date     type    h2    h4    h6    h8   h10   h12   h14   h16   h18
##   (fctr)   (fctr) (int) (int) (int) (int) (int) (int) (int) (int) (int)
## 1     일 발생건수  2640  1733  1416  1286  1550  2077  2402  2940  2993
## 2     일 사망자수    76    65    64    52    37    42    39    66    63
## 3     일 부상자수  4383  2946  2306  2144  2740  3658  4323  5543  5353
## 4     월 발생건수  1239   756   848  2125  3299  2719  2800  3336  3600
## 5     월 사망자수    30    31    70    66    63    71    61    74    73
## 6     월 부상자수  1960  1202  1261  3203  5018  4055  4195  5088  5213
## Variables not shown: h20 (int), h22 (int), h24 (int)
# gather(데이터, 키, 값, 제외컬럼 목록)
df_long <- gather(df_data, hour, count, -date, -type)

# 요일별, 시간대별 레벨을 조정해야 한다. 그래프 그릴때 순서적으로 보여진다.
# ordered=TRUE 옵션을 사용한다.
df_long$date <- factor(df_long$date, levels=c("일", "월", "화", "수", "목", "금", "토"), ordered=TRUE)
df_long$hour <- factor(df_long$hour, levels=c("h2", "h4", "h6", "h8", "h10", "h12", "h14", "h16", "h18", "h20", "h22", "h24"), ordered=TRUE)

요일별 발생건수, 부상자수, 사망자수의 분포를 확인한다.

g <- ggplot(df_long, aes(x = date, y = count, colour=type)) + geom_point() +
    theme(text = element_text(family='나눔명조'))
g

부상자 수의 분포가 요일별로 다양하게 보인다.
부상자의 수를 시간대별로 파악하고 요일별로 구분해 본다.

df_wounded <- filter(df_long, type == "부상자수")
head(df_wounded)
## Source: local data frame [6 x 4]
## 
##     date     type   hour count
##   (fctr)   (fctr) (fctr) (int)
## 1     일 부상자수     h2  4383
## 2     월 부상자수     h2  1960
## 3     화 부상자수     h2  3061
## 4     수 부상자수     h2  3183
## 5     목 부상자수     h2  3064
## 6     금 부상자수     h2  3295
# geom_line 사용 시 date를 그룹값으로 설정한다.
g <- ggplot(df_wounded, aes(x = hour, y = count, colour=date)) + 
    geom_point() + geom_line(aes(group=date)) +
    theme(text = element_text(family="나눔명조"))
g

그래프를 통해 알 수 있는 몇 가지 정보가 있다.

공공데이터포털의 자료를 이용하면서 한 가지 아쉬운 점이 있다. 자료를 집계된 형태로 제공하기 때문에 일별, 월별에 따른 분석이 어렵다. raw 데이터를 사용할 수 있게 해주면 좋을텐데…