SORACOM で取得した圃場データを Amazon Forecast に食わせて時系列予測してみた（失敗編）

この記事は [SORACOM Advent Calendar 2019 ひとつめ](https://qiita.com/advent-calendar/2019/soracom) の 24日目 の記事です。

# はじめに
SORACOM UG 農業活用コミュニティ の中の人の @ko2a です。

最近、本業が炎上して忙しすぎてコミュニティ活動がままらない状況で、いい加減何か私もコミットせにゃあかんな・・・と焦っていました。

そんな中、2018年にコミュニティでお手伝いして IoT ボックスを導入した農家さんの [紹介記事](https://karuchibe.jp/read/7102/) を目撃し、以下の点について要望を頂いてしまいました。

>設置して1年。今のところはデータを記録して、関連性を調べているところだが、次に欲しい機能は、サジェスチョン機能だそう。

まあ確かにデータは1年分溜まってるし、そろそろ何かデータ活用考えないとなぁ・・・と思っていたら、やはり先方も同じことを考えていたみたいでしたorz

とりあえず私自身、機械学習とか AI をこねくり回すスキルはほぼ皆無なのでどうしようかと考えた結果、AWS の時系列予測サービスの [Amazon Forecast](https://aws.amazon.com/jp/forecast/) にデータを食わせて何か予測できないか試してみることにしました。

# おことわり
* 食わせたデータが良くなかった & Amazon Forecast の設定をインターネットの記事片手にざくっと設定したため、期待してたようなデータの予測ができませんでした。<br>時間あったら再挑戦するかも？

* SORACOM サービスの使い方とかそういったものは今回記載していません。<br>SORACOM サービスから Amazon Forecast へ食わせるデータの作成については、SORACOM Funnel から Amazon S3 へデータを保存するノウハウが既に公開されていますので、そちらをご覧ください。

[SORACOM Funnel の Kinesis Firehose アダプターを使用してクラウドにデータを収集する(コンソール版)](https://dev.soracom.io/jp/start/funnel_console/)
[RaspberryPiからSORACOM Funnel経由でS3やDynamoDBに書き込む](https://iot.kyoto/integration_case/2016/12/29/2538/)

# データを取ってくる

@chinoppy 力作の Django アプリから圃場データを CSV 形式で取得してきます。
![2019advent0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/e3940a43-d366-a880-c3f0-c845b24cafa0.png)

取得してきたのは 2019-09-01 ～ 2019-11-30 のハウスのデータです。
とりあえずヘッダーとタイムスタンプを利用しやすいように加工します。

![2019advent0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/0c39fb7f-c24f-2720-a422-2ff30a2b6279.png)

# Amazon Forecast の設定

## Create dataset group

適宜 Dataset group name をつけて、 Forecasting domain は "Custom" を選択しました。

![2019advent0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/f76ff6c8-1d4a-aef4-173c-b10590069c2f.png)

## Create target time series dataset

Dataset name は詳細な名前に、 Frequency of your data はデータの取得間隔が 10 分おきなので "10 minute(s)" とします。
Dataset schema は先ほど取得した CSV ファイルのヘッダー情報を JSON へ記載していきます。

![2019advent0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/33a9acb2-d07f-2d1d-7767-11638cde9af8.png)

が・・・必須の AttributeName (item_id, target_value) の定義がなかったり

![2019advent0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/e41392b6-8bef-1627-6917-63a467d77580.png)
![2019advent0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/697b07f7-2068-a7b9-e2b2-f0465e1bc163.png)

必須の AttributeName 以外は AttributeType をすべて "string" に設定しないと次へ進めない始末。
結局 CSV ファイルの列情報とかあれこれ修正して次へ進みました。ﾒﾝﾄﾞｯﾁｨ・・・・

![2019advent0007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/6727eed9-4d8d-9cc9-ec3c-0b741d12e832.png)

```text
{
        "Attributes": [
          {
            "AttributeName": "timestamp",
            "AttributeType": "timestamp"
          },
          {
            "AttributeName": "item_id",
            "AttributeType": "string"
          },
          {
            "AttributeName": "temp1",
            "AttributeType": "string"
          },
          {
            "AttributeName": "humi1",
            "AttributeType": "string"
          },
          {
            "AttributeName": "temp2",
            "AttributeType": "string"
          },
          {
            "AttributeName": "ground_temp",
            "AttributeType": "string"
          },
          {
            "AttributeName": "leaf_temp",
            "AttributeType": "string"
          },
          {
            "AttributeName": "solar_radiation",
            "AttributeType": "string"
          },
          {
            "AttributeName": "target_value",
            "AttributeType": "float"
          }
        ]
}
```

## Amazon S3 へ CSV データアップロード

適宜 S3 Bucket を作成して CSV データをアップロードします。
![2019advent0009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/bfd75974-5657-c6a3-a93d-0af1316afd7f.png)

## Import target time series data

S3 Bucket へアップロードした CSV ファイルをインポートするための設定をします。
![2019advent0010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/3ba06af8-a759-3762-c15d-5fd352b468dc.png)

## Import your data

インポートが開始すると、Dashboard 上でインポート状況を確認できます。
![2019advent0011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/2e41ad5c-2e33-0d85-b06e-17bc234c6449.png)

## Predictor training

インポートが完了すると Predictor training が有効になるので Start を押します。
![2019advent0013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/21869295-e260-a284-d143-46fde0b870ce.png)

Forecast horizon は予測数を入力します。
今回はとりあえず12時間分予測できればいいかな？ということで、"72" をセットしています。

Forecast frequency が "10 minute(s)" なので 1時間の予測をするのに Forecast horizon は "10 minute(s)" × "6" = "60 minute(s)" という計算となるため、"720 minute(s)" ÷ "10 minute(s)" = "72" ということで "72" をセットしています。
![2019advent0014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/16b14c37-3d58-9f36-b373-74bacc984c98.png)

## Train a predictor

Train predictor をセットすると、学習を開始するので待ちます。
![2019advent0015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/5699cebd-32b0-0ec7-7852-291b763803f3.png)

## Forecast generation

Train predictor が完了すると Forecast generation が有効になるので選択します。
![2019advent0016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/a84cb72f-80a4-62ea-7a13-faf0d08989f8.png)

## Create a forecast

作成した Predictor を選択して forecast を作成します。
![2019advent0017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/2b1eb805-b43c-8060-5405-be3cd6b8faa1.png)

![2019advent0018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/ca90e63f-0a72-8f0d-fc26-bfcec8aceb58.png)

## Forecast lookup

Forecast の作成が完了したら Lookup forecast を押して予測を確認します。
![2019advent0019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/3ceded61-3f1b-f638-7e03-14b43ce7e75d.png)

Start date は CSV データの最後尾データより前の日時を、End date は Predictor training で設定した予測数の範囲内に収める必要があります。（そうしないと予測を取得実行ができない

あと、Forecast key には item_id にセットした "pF" をセットします。
![2019advent0020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/9dfe8716-70e5-c9c6-eec4-d2cb5fb22845.png)

# Forecast 結果
![2019advent0021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/6bfeead1-8bbd-e6be-6a4d-335365c9df80.png)

えっ、なにこれまっすぐ？不変データ？これ予測してるの？？？
思ってたんと違う・・・

# なんでこんな予測になった？？？

よくよく投入したデータを見直したら、2019年11月最終週あたりのデータはあまり変化していなかったことが判明orz
![2019advent0023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/97edf15d-401b-97da-5a9c-908b820d7d36.png)

一番右の列が予測したかった土壌水分の値（マトリックスポテンシャル値）ですが、11月後半は2.7前後であまり変動していませんでしたorz

これが作物を育成している8月とかだと変動があるので、違う結果が予測できたかもしれません・・・
参考：2019/08/27 の土壌水分量値の変化
![2019advent0022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/291748ae-be4c-2469-71b8-6c847badc23f.png)

# おわりに
実は投稿前日の夜までノータッチな状態で、よるごはん食べた後資料見ながらポチポチ設定して3時間ぐらいでここまでできました（ほしかった予測結果は見れず失敗だったわけですがorz

今回扱った圃場のデータは時系列予測させるには結構様々な要素が絡んできたり、圃場の土壌環境によっても左右されるため、ほしい予測を得るにはもちっとうまく設定させる必要はありそうですが、マネジメントコンソールからこれだけできるのはすごい時代になりましたねぇ・・・~~（数式アレルギーもつ私でもへっちゃら~~

SORACOM サービス使って取得したデータはあるけども、どうやって利活用しようか？って悩んでいる方は、一度 Amazon Forecast へセットしてみてどんな結果が得られるか試してみるのは如何でしょう？

# 参考：AWS 利用料
us-west2 で 120.44 JPY
![2019advent0024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49240/7b34205a-dac9-1af2-a9ec-5581506c014a.png)


# 次回予告

失敗編で終わらせたままだとコミュニティの活動が続かなくなるので、2020年にはリトライする（かも

# 参考資料

[Amazon Forecastでお手軽に時系列予測](https://dev.classmethod.jp/cloud/aws/amazon-forecast-getting-start/)
[Amazon Forecast を使ってお手軽に時系列予測する（GUI編）](https://qiita.com/osamasao/items/7eef286ea9a0f73e88b0)