温湿度ロガーInkbirdのデータをRで可視化する

北海道の博物館で静かに流行している温湿度ロガーのデータをエクスポートしてRで可視化する手法です。使用した温湿度ロガーは安価なので小規模博物館で重宝する[Inkbird](https://www.amazon.co.jp/inkbird)です。センサーの信頼性は高価なロガーに比較して低いかもしれませんが、必ず複数台購入するものなので、安価なことは非常にありがたいことです。


# Engbirdからデータをエクスポートする
Engbirdは温湿度ロガーInkbirdの制御ソフトです。ブルートゥースで接続してデータをスマートフォンにダウンロードすることができるので、展示室や収蔵庫を巡回するだけでスマホにデータが落ちてきます。
Engbirdのホーム画面から「Diagram」をタップします。

![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/112791f5-4fe3-f56c-388e-e354f3bf8445.jpeg)

右上の「L」マークをタップします。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/29d127d7-ab3e-096e-f904-f9ededa8b558.jpeg)

エクスポートマークをタップします。
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/91ed258c-6305-73b3-ad58-57d13e9f2939.jpeg)

1. エクスポートする期間の始点を指定します。
2. 「CONFIRM」をタップします。
期間の終点は自動的に最新ログになります。
![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/ce39f93a-4546-f0f3-cf1a-ef2f01661e9c.jpeg)

エクスポート先をいくつか選べるのですが、私はGoogleDriveを指定しました。出力データはこのような形で、1行目がメタデータ、2行目がヘッダ行となります。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/0b4b7e8d-73fd-70dc-41e6-994905470d5f.png)

# Rで読み込む
必要なパッケージは`tidyverse`と`lubridate`です。`lubridate`は日付・時間データを扱うためのパッケージです。
```R
# パッケージ読み込み
library(tidyverse)
library(lubridate)
```
データが3つのファイルに分かれているので、`list.files`関数でファイルのリストを作成して、`purrr::map`関数で一気に読み込みます。
文字コードがUTM-16なのがちょっとだけハマリポイント。
```R
data <-
  # 3箇所のロガーから読み込んだデータファイルのリストを作成
  list.files(path="data/",  
           pattern=".*\\.csv", 
           full.names=T) %>% 
  # purrr:map関数で読み込む
  purrr::map(read_tsv,
      locale = locale(encoding = "utf16"),  # 文字コードはUTF-16
      skip = 2,  # メタデータ行とヘッダ行をスキップする
      col_names = c("Time", "Temperature", "Humidity")) # 列名を指定する
```
Engbirdから出力される日付・時間データはPOSIXct形式の日付ー時刻データオブジェクトでした。ナイス！！
```R
# 読み込みデータ
> data
[[1]]
# A tibble: 387 × 3
   Time                Temperature Humidity
   <dttm>                    <dbl>    <dbl>
 1 2023-11-08 14:00:00        20.2     47  
 2 2023-11-08 14:30:00        19.7     48.6
 3 2023-11-08 15:00:00        19.2     50.1
 4 2023-11-08 15:30:00        18.7     51.7
 5 2023-11-08 16:00:00        18.2     53.2
 6 2023-11-08 16:30:00        17.7     54.8
 7 2023-11-08 17:00:00        17.2     56.3
 8 2023-11-08 17:30:00        16.7     57.9
 9 2023-11-08 18:00:00        16.2     59.4
10 2023-11-08 18:30:00        15.7     61.0
# ℹ 377 more rows
# ℹ Use `print(n = ...)` to see more rows

[[2]]
# A tibble: 387 × 3
   Time                Temperature Humidity
   <dttm>                    <dbl>    <dbl>
 1 2023-11-08 14:00:00        27.1     41.0
 2 2023-11-08 14:30:00        26.0     42.9
 3 2023-11-08 15:00:00        24.8     44.8
 4 2023-11-08 15:30:00        23.6     46.7
 5 2023-11-08 16:00:00        22.4     48.6
 6 2023-11-08 16:30:00        21.3     50.5
 7 2023-11-08 17:00:00        20.1     52.4
 8 2023-11-08 17:30:00        18.9     54.3
 9 2023-11-08 18:00:00        17.8     56.2
10 2023-11-08 18:30:00        16.6     58.1
# ℹ 377 more rows
# ℹ Use `print(n = ...)` to see more rows

[[3]]
# A tibble: 387 × 3
   Time                Temperature Humidity
   <dttm>                    <dbl>    <dbl>
 1 2023-11-08 14:00:00        21.5     46.3
 2 2023-11-08 14:30:00        20.8     48.1
 3 2023-11-08 15:00:00        20.1     49.9
 4 2023-11-08 15:30:00        19.4     51.6
 5 2023-11-08 16:00:00        18.7     53.4
 6 2023-11-08 16:30:00        18.0     55.2
 7 2023-11-08 17:00:00        17.3     57.0
 8 2023-11-08 17:30:00        16.6     58.8
 9 2023-11-08 18:00:00        15.9     60.5
10 2023-11-08 18:30:00        15.2     62.3
# ℹ 377 more rows
# ℹ Use `print(n = ...)` to see more rows
```

```R
# 設置場所を追加
data[[1]]$place <- "館城展示ケース" 
data[[2]]$place <- "準備室"
data[[3]]$place <- "地下収蔵庫"
# すべてのデータを結合
data_df <- bind_rows(data)
```

結合したデータはこうなります。
```R
> data_df
# A tibble: 1,161 × 4
   Time                Temperature Humidity place         
   <dttm>                    <dbl>    <dbl> <chr>         
 1 2023-11-08 14:00:00        20.2     47   館城展示ケース
 2 2023-11-08 14:30:00        19.7     48.6 館城展示ケース
 3 2023-11-08 15:00:00        19.2     50.1 館城展示ケース
 4 2023-11-08 15:30:00        18.7     51.7 館城展示ケース
 5 2023-11-08 16:00:00        18.2     53.2 館城展示ケース
 6 2023-11-08 16:30:00        17.7     54.8 館城展示ケース
 7 2023-11-08 17:00:00        17.2     56.3 館城展示ケース
 8 2023-11-08 17:30:00        16.7     57.9 館城展示ケース
 9 2023-11-08 18:00:00        16.2     59.4 館城展示ケース
10 2023-11-08 18:30:00        15.7     61.0 館城展示ケース
# ℹ 1,151 more rows
# ℹ Use `print(n = ...)` to see more rows
```
# クリモグラフの出力

クリモグラフ（climograph）はY軸に湿度、X軸に温度をとった折れ線グラフの一種です。`ggplot`では`geom_path`を使います。
```R
data_df %>% 
  filter(Time > ymd_hms("2023-11-09 00:00:00")) %>% 
  ggplot(
    aes(x = Humidity, y = Temperature)
  ) +
  geom_path() +
  facet_wrap(~place)
```
さて、このクリモグラフ、ちょっと不思議なのは、普通は温度が上がると湿度が下がるのですが、「準備室」、「地下収蔵庫」は逆になっています。一方、「館城展示ケース」は常設展示室の展示ケース内のデータですが、湿度と温度の相関が全く見られません。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/11dee70a-b1a3-ac0a-8520-18781771a749.png)

# 温度の時系列変化

```R
data_df %>%
  filter(Time > ymd_hms("2023-11-09 00:00:00")) %>%
  ggplot(
    aes(x = Time, y = Temperature)
  ) +
  geom_line() +
  facet_wrap(~place, nrow =3)
```
11月に入って断続的に暖房が入り始めたので、暖房が入る展示室は日中に断続的に室温の上下が見られます。一方、暖房が入らない準備室と地下収蔵庫は徐々に気温が低下しています。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/f4b1283a-9188-e68f-bc5f-5c6dc547ca58.png)

# 湿度の時系列変化
```R
data_df %>%
  filter(Time > ymd_hms("2023-11-09 00:00:00")) %>%
  ggplot(
    aes(x = Time, y = Humidity)
  ) +
  geom_line() +
  facet_wrap(~place, nrow =3)
```
一方、湿度は「館城展示ケース」では一貫して60%台を保っています。展示ケースは調湿材（アートソーブ）が設置してあるのでその影響かもしれませんが、設定湿度は40%のはずなので、疑問が残ります。

「準備室」、「地下収蔵庫」は暖房が入り始めるとそれまで60%台だった湿度が急激に低下し50%前後で安定しています。準備室と地下収蔵庫の気温は一貫して低下しているので、相対湿度が低下する理由がよくわかりません。このあたりの温度と湿度の挙動はまだよくわからないです。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/c45de568-7712-02ed-6823-71da93e71068.png)

# まとめ
「資料環境の改善はまずは環境把握から」とはよく言われることです。しかし、「環境を知ったところでエアコンをつけられるわけでもないしな」と思って、ついつい地味な温湿度管理は敬遠しがちです。しかし、思っていた以上に資料をめぐる環境は複雑で、このデータの場合、湿度と温度の関係が本来は負の比例関係にあるところがなぜか正の比例関係にみえることや、展示ケース内の湿度が不気味なほど一定に保たれていることなど、現時点では理由がよくわからないことが多くあります。

まだ、データを取り始めて1週間ぐらいしかたっていませんので、これからデータを蓄積していけば謎はとけていくでしょう。いずれにせよ、まずは数字で把握するのはとても大切なことだと痛感しました。たった2変数（設置位置を入れると3変数）のデータでこんなわかることが多いとは思いませんでした。