LINEに「うつだ」と投稿すると天候・気圧差・寒暖差をもとにアドバイスをしてくれる「うつ天気分析くん」 Ver.1.0

# 改訂履歴
Ver1.0 2019/1/26 正式バージョン公開
- LINEユーザ毎にうつ天気情報データを格納し、分析結果を出力するように変更
- LINEの位置情報からOpenWeatherMapの最も近い観測値から天気データを出力するように変更
- 公開にあたり、マニュアルなどを整備
Ver0.9 2018/12/19 Firebaseデータベース以外のロジックを仮構築。

# はじめに
この作品はアーバンデータチャレンジ2018(http://urbandata-challenge.jp/2018submitstart)
に提出する予定の作品です。

事の発端は、「うつヌケ」の先生のTwitterの書き込みから。
https://twitter.com/keiichisennsei/status/637641192809721856
> 気温差や気圧差が「うつ」を誘発する

[田中圭一先生のゲーム開発者インタビュー](http://news.denfaminicogamer.jp/tag/若ゲのいたり〜ゲームクリエイターの青春〜)はクッソ面白いのでぜひ見るといいよ(ダイマ)

(自己分析)
「寒暖差・気圧差」がうつを引き起こす大きな要因であることは経験的に知っている
ただし、それが100%誰にでも起こるか、ということについては懐疑的。
むしろ、自分の心理状態と周辺の状況をアクティブに収集し続け、「自分だけの超属人的なデータに基づくデータ分析」こそが重要なのではないか

分析の結果、そんな気持ちになったので、
アーバンデータチャレンジ岐阜(https://www.softopia.or.jp/events/20181208udc/)
の合宿で「天気分析チャレンジ」を宣言し、製作開始しました。ハッカソンではないけど、もくもく作ったりスマブラやったり寿司食べたりした合宿でした。開催の様子は共有フォトもあるからそれを参考にしてほしい(丸投げ)
https://photos.app.goo.gl/sGcGvyYaJg73dZvh8

~~12/19現在では作業途中ですが、集中した作業時間の確保が難しい状況となっておりまして、
先行してドキュメントを仕上げています。
本アプリおよび本ドキュメントは1月のアーバンデータチャレンジ提出までにVer1.0を完成させる予定です。~~

# 最終的な目指す姿
アーバンデータチャレンジ合宿のときに参加者の皆さんと固めた内容からほぼ変えていません。
「伝える」「ためる」「分析する」「伝える」の4点で構成しています。

### 伝える
* LINEボットに話しかける
* 言葉が「うつだ」だった場合、次へ

### ためる
* お天気APIから気温、気圧、天気の情報を取得する
* 気温差、気圧差なども計測
* 計測結果についてデータベースで記録する

### 分析する
* 「うつだ」と話しかけた日の天気、気温差、気圧差などのパターンを分析する

### 伝える
* 寒暖差、気圧差が激しかった場合は「気圧差が激しいみたい」「気温差が激しいみたい」とコメントを返す
* (データがたまった後で)「うつなのは気圧差のせいなことが多い」「今日は気圧差が激しい」「温かいものを飲もう」などのコメントを自動で投稿できるようにする

# アプリ
以下のQRコードから友達申請してください。
![i0nDFp6AwV.png](https://qiita-image-store.s3.amazonaws.com/0/90313/1c5853f5-3d9f-b15a-df26-2df024ad8b18.png)
簡易マニュアルはこちら
https://github.com/iamakawa/utsuWeather

# 仕様
### アプリ構成図
大きく分けて以下のような構成になります。
![アプリケーション図-001.jpg](https://qiita-image-store.s3.amazonaws.com/0/90313/aaeb13ec-b1ed-cc36-199a-301ee002e95a.jpeg)
ただし、Ver.1.0では以下のような仕様としています。
- 位置情報をもとにOpenWeatherMapの最も近い観測ポイントを算出、OpenWeatherMapのAPIより直前、直前-3時間、直前-6時間の天候情報を取得、傾向を分析する
- 傾向の分析結果は、「過去のデータ蓄積情報の送信」とする
- 対応する言語は「うつだ」のみ(位置情報の送信を促す)

### LINE
単純に①⑨メッセージの受け渡しのみ。

### Google App Script(GAS)
ロジックの中心部。
②LINE Messaging APIからメッセージ/位置情報を受け取ったら、
③内部で言語処理(「うつだ」の単純言語比較)を行い、該当する場合のみ以降の処理を行う。
④LINEから位置情報を受け取った場合、緯度経度データからOpenWeatherMapの最も近い観測値を算出。
 (※観測値の緯度経度情報はOpenStreetMapの位置情報一覧jsonファイルを加工し、GoogleSpreadSheetで管理する
  https://openweathermap.org/current)
　OpenStreetMapのAPIを呼び出し、天候情報を取得する
⑥天候情報を計算し、寒暖差・気温差を計測する
⑦気温差を元にLINEBotに話させるメッセージを作成
　- 位置情報を本にした現在の気温、気圧
　- 気温、気圧の過去6時間での変化状況(→、↘、↗で表示)
　- 過去の変化状況の蓄積結果
⑧LINE Messaging APIにメッセージを渡す

### OpenStreetMap(天候API)
④GASの観測値ポイントをもとに、観測値の気圧・気温・天気を出力する(json)

### Firebase
「うつ天気分析データ」として、以下のデータを格納する。
⑤LINEのユーザIDをキーとして、以下の情報を格納する。
　- ユーザ情報：ユーザーネーム、過去の蓄積情報(気温差、気圧差、時刻)
　- 天気情報：天候データ、気温、気圧、時刻、気温/気圧の変化状況
　
# 実装
## アプリ画面
<img width="375" alt="LINE_capture_570196841.455071.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/90313/268f8d5d-c86e-c372-1664-e1bf792c156a.jpeg">

・「うつだ」と送信すると位置情報の出力を促し、位置情報を送信すると過去の分析データを出力する

## 実装するにあたって工夫したこと
一気につくるというよりかはちょっとずつ処理を増やしていく感じで作りました。
* LINE Messaging APIの受け渡しができるかどうか
* お天気APIを取得、jsonファイルの中から任意の値を入力できるかどうか
* ロジック(閾値ベースでの寒暖差計算ができるか・・・)など。
* OpenWeatherMapの観測値最近値計算。1,400箇所ある観測箇所全てを計算するのではなく、2分探索的に位置を絞って計算オーダをなるべく小さくできるようにした

## LINE Messaging API
LINE Developersアカウントの登録からGASとの接続まで下記を参考に作成。
https://qiita.com/hakshu/items/55c2584cf82718f47464
本当に30分でできた。まじか。

## Githubのコード
https://github.com/iamakawa/utsuWeather
※ユーザー情報などはGoogle Apps Scriptのスクリプトプロパティで隠蔽

# 考察
* そもそも気温差を地域の天気予報で見ることは適切なのか?
* 部屋の室温など、ウェアラブル端末で正確に計測するほうが良いかもしれない
* 寒暖差ではなく、瞳孔の開き具合や指の血流などから判定するアプリもある
* (最初の繰り返しになるけど)そもそも心理状態自体が非常にパーソナルな情報で、一般的なパターンが適応できるかどうか非常に懐疑的。それよりも、身の回りの見捨てられがちなデータをIoTやスマホを経由して取得し、自分だけの情報武装ができるかどうか、ということが大事だと感じた。

# おわりに
仮説を検証するためにも、ある程度の精度までアプリを完成させたいと思います。
ご意見等ありましたら、よろしくお願いいたします。

1/26追記
OpenWeatherMapでできる限りのデータ記録・見える化を実現できるようにしましたが、
レコメンド部分は未実装です。今後、どのようにレコメンドするかは自分でも使ってみて検討します。