공공데이터포털의 자료를 이용해서 자료 정제 및 탐색적 데이터 분석을 연습해본다.
참고자료: 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 데이터를 사용할 수 있게 해주면 좋을텐데…