City Puls, “Dataset Collection” 웹페이지를 통해서 사물인터넷 관련 탐색적 데이터 분석에 적합한 센서가 생성한 다양한 데이터를 받아낼 수 있다.
상기 센서데이터는 JSON 파일형태로 된 전형적인 IoT 센서 데이터라고 볼 수 있다.
library(tidyverse)
download.file(url="http://iot.ee.surrey.ac.uk:8080/datasets/weather/feb_jun_2014/raw_weather_data_aarhus.tar.gz", destfile = "data/raw_weather_data_aarhus.tar.gz")
dir.create("data/weather")
untar("data/raw_weather_data_aarhus.tar.gz", exdir = "data/weather")
즉, http://iot.ee.surrey.ac.uk:8080/datasets/weather/feb_jun_2014/raw_weather_data_aarhus.tar.gz
파일을 다운로드 받아 data/raw_weather_data_aarhus.tar.gz
파일명어로 저장하고 압축파일을 untar()
명령어로 압축을 푼다. 그리고 나서 system()
명령어로 압축이 풀린 것을 확인한다.
system("cmd.exe /c dir data\\weather", intern = TRUE)
[1] " D 드라이브의 볼륨에는 이름이 없습니다."
[2] " 볼륨 일련 번호: 1C4A-327C"
[3] ""
[4] " D:\\docs\\ingest-data\\data\\weather 디렉터리"
[5] ""
[6] "2019-05-01 오후 06:28 <DIR> ."
[7] "2019-05-01 오후 06:28 <DIR> .."
[8] "2014-11-04 오전 12:45 243,245 dewptm.txt"
[9] "2014-11-04 오전 12:45 238,641 hum.txt"
[10] "2014-11-04 오전 12:45 254,442 pressurem.txt"
[11] "2014-11-04 오전 12:45 244,864 tempm.txt"
[12] "2014-11-04 오전 12:45 249,436 vism.txt"
[13] "2014-11-04 오전 12:45 244,817 wdird.txt"
[14] "2014-11-04 오전 12:45 251,443 wspdm.txt"
[15] " 7개 파일 1,726,888 바이트"
[16] " 2개 디렉터리 11,804,725,248 바이트 남음"
이제 센서 데이터셋을 R로 불러읽어 들인다. JSON 파일형식이라 이것을 데이터프레임으로 변환을 시킨다. 그리고 나서 시간대별로 timestamp
날짜시간형태로 변환을 시키고, 습도, 온도, 압력, 풍속 등을 문자형에서 숫자형으로 변환을 시킨다.
library(rjson)
## 습도 데이터 ----
hum_list <- rjson::fromJSON(file = "data/weather/hum.txt")
hum_df <- tibble(
timestamp = names(hum_list),
humidity = map_chr(hum_list, 1)) %>%
mutate(timestamp = lubridate::ymd_hms(timestamp))
## 습도 데이터 ----
pressure_list <- rjson::fromJSON(file = "data/weather/pressurem.txt")
pressure_df <- tibble(
timestamp = names(pressure_list),
pressure = map_chr(pressure_list, 1)) %>%
mutate(timestamp = lubridate::ymd_hms(timestamp))
## 온도 데이터 ----
temp_list <- rjson::fromJSON(file = "data/weather/tempm.txt")
temp_df <- tibble(
timestamp = names(temp_list),
temp = map_chr(temp_list, 1)) %>%
mutate(timestamp = lubridate::ymd_hms(timestamp))
## 풍량 데이터 ----
wind_list <- rjson::fromJSON(file = "data/weather/wspdm.txt")
wind_df <- tibble(
timestamp = names(wind_list),
wind = map_chr(wind_list, 1)) %>%
mutate(timestamp = lubridate::ymd_hms(timestamp))
## 센서 데이터 병합 ----
sensor_df <- hum_df %>%
full_join(temp_df) %>%
full_join(pressure_df) %>%
full_join(wind_df) %>%
mutate_if(is_character, as.numeric)
sensor_df %>%
DT::datatable()
가장 먼저 시계열 데이터라서 이를 시간대별 변화를 각 센서별로 시각화시킨다.
sensor_df %>%
gather(sensor, value, -timestamp) %>%
ggplot(aes(x=timestamp, y=value, color=sensor)) +
geom_line(show.legend = FALSE) +
facet_wrap(~sensor, scales = "free") +
labs(x="", y="") +
scale_x_datetime(date_labels = "%H 시")
heatmap
두번째는 각 변수별로 관계를 살펴보는 것이다.
library(ggcorrplot)
sensor_corr <- round(cor(sensor_df[, -1]), 2)
ggcorrplot(sensor_corr, hc.order = TRUE,
type = "lower", outline.col = "white",
lab = TRUE)
마지막으로 각 변수별로 관계를 산점도를 찍어서 시각화해본다.
library(GGally)
ggpairs(sensor_df)