1 IoT 센서 데이터셋 1

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 바이트 남음"

2 센서 데이터셋 → R

이제 센서 데이터셋을 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()

3 탐색적 데이터 분석

3.1 시계열 그래프

가장 먼저 시계열 데이터라서 이를 시간대별 변화를 각 센서별로 시각화시킨다.

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 시")

3.2 heatmap

두번째는 각 변수별로 관계를 살펴보는 것이다.

library(ggcorrplot)

sensor_corr <- round(cor(sensor_df[, -1]), 2)
ggcorrplot(sensor_corr, hc.order = TRUE, 
           type = "lower", outline.col = "white", 
           lab = TRUE)

3.3 산점도

마지막으로 각 변수별로 관계를 산점도를 찍어서 시각화해본다.

library(GGally)
ggpairs(sensor_df)

4 센서 데이터 - 이상점 탐지

5 센서 시계열 데이터

6 기계학습