JINS MEME APIで生体データ可視化にチャレンジ！

※2021-10-08 こちらは旧世代JINS MEME向けの記事になります。現行機ではOffice/RunNext/Driveのデータは15秒間隔データに統合されています。詳細は[公式ドキュメント](https://jins-meme.github.io/sdkdoc2/)を御覧ください。

[国産Web API Advent Calendar 2018](https://qiita.com/advent-calendar/2018/apijp) の6日目は、ちょっと珍しい **生体データ** に関するAPIをご紹介したいと思います。

### JINS MEME と Web API について

JINSでは「客観性を持ってユーザーが自身を振り返ることで**より良い自分(Better me)**を実現する」というビジョンのもと2015年にメガネ型ウェアラブルデバイス、[JINS MEME](https://jins-meme.com/ja/) を発売しました。

![Screenshot 2018-12-04 at 10.07.56.png](https://qiita-image-store.s3.amazonaws.com/0/103775/97d3bb20-ded5-1d87-d579-b987f43a728e.png)

JINS MEMEは瞬き等を検出する眼電位センサー・頭部の動きを検出する6軸センサーを搭載しています。メガネで取得したデータをスマホにストリームし **集中・歩走行姿勢・運転時眠気（覚醒度）** といった高次データに変換しユーザーに通知するモバイルアプリを公開しています。

このような生体データはあまり一般的に流通していないため、JINS MEMEアプリのデータを他サービスで利用したいというご要望を継続的に頂いていましたが、今年10月 OAuth2に対応したWeb APIを正式にリリースしJINS MEMEのデータを一般利用することができるようになりました（サイレントローンチです）。
※ちなみに[SDK](https://jins-meme.github.io/sdkdoc/)ではJINS MEMEに直接接続できますが、瞬き・視線移動・加速度・角度などの生データのみ利用できます
※商用利用は来年以降有料化予定です。

### 取得できるデータの内容
####集中(Office)

![Screenshot 2018-12-04 at 11.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/103775/68916886-148d-afd2-8320-23b3c88a3594.png)

[JINS MEME Officeアプリ](https://jins-meme.com/ja/office/)で取得している、集中値（没頭、落ち着き、姿勢の要素と統合した集中値）を利用することができます。こちらの**集中**の指標は **どれだけ1つの作業に気持ちよく入れているか（一般的にゾーンと言われている状態）** を指標化したもので、デスクワーク時・勉強時の集中度合いをよく反映することを目指した指標です。


####歩走行姿勢(RunNext)

![Screenshot 2018-12-04 at 12.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/103775/09dd28d2-4aa1-eaec-cc00-3ebb5dfa1509.png)

[JINS MEME RunNextアプリ](https://jins-meme.com/ja/runnext/)で取得している、ランニング時のピッチ・前傾角・上下動・前後動・左右着地強度を利用することができます。これらの指標はいわゆる**ランエコノミー**と呼ばれるランニングにおいていかに効率的に走れているか、ケガしやすいフォームになっていないかを知るための指標群となります。

####運転時眠気(Drive)

![Screenshot 2018-12-04 at 13.54.14.png](https://qiita-image-store.s3.amazonaws.com/0/103775/157003e6-7419-7866-ee72-d6bc18abc8ad.png)

[JINS MEME Driveアプリ](https://jins-meme.com/ja/drive/)で取得している、運転時の眠気度合いを利用することができます。指標の特徴としては**目が覚めている状態から眠気が強くなってくる過程**を精度よく表しており、だんだん眠くなってきた場合のその推移を感度よく知ることができます。
(注1)運転できないぐらいの眠気、眠ってしまった状態では測定ができません
(注2)運転席での運転姿勢に特化したアルゴリズムのため、デスクワーク時などでは正しく取得できないことがあります。

## 集中データを取得してみる

サンプルとして集中データを抜いてみます。方式としては一般的な OAuth2 grant flow なので、お好きな言語で利用することができると思います。ここではRのhttrライブラリを使用して試しにデータを抜いてみます。流れは以下になります。

1. [アプリケーション登録](https://jins-meme.github.io/sdkdoc/api/register.html)
1. [認可](https://jins-meme.github.io/sdkdoc/api/web_integration.html)と[アクセストークン取得](https://jins-meme.github.io/sdkdoc/api/get_token.html)
1. [OFFICE データ取得](https://jins-meme.github.io/sdkdoc/api/get_office2.html)

(1)はオフィシャルマニュアルを見ながら進めていただくとして、(2)から実際のRのコードで説明します。

####認可
```r:grant.r
#ライブラリ読み込み
library(httr)
library(jsonlite)
library(dplyr)

### アプリID/SECRET
JINSMEME_API_CLIENT_ID <- "開発者サイトから取得したものを記述"
JINSMEME_API_CLIENT_SECRET <- "開発者サイトから取得したものを記述"

#OAuth2の実行
scope <- "run office drive"
jinsmeme_api_endpoint <- oauth_endpoint(authorize = "https://accounts.jins.com/jp/ja/oauth/authorize?service_id=meme", 
                                        access = "https://apis.jins.com/meme/v1/oauth/token")
myapp <- oauth_app("sample_jins_meme_app", key = JINSMEME_API_CLIENT_ID, secret = JINSMEME_API_CLIENT_SECRET)
jinsmeme_api_outh <- oauth2.0_token(jinsmeme_api_endpoint, myapp, scope)

```

ここではOAuth2をhttrというライブラリを使用します。grantflowではブラウザで認可コードを受け取る必要があるため、httrがlocalhostにwebサーバを立てそこでgrantコードを受け取るためにブラウザの画面が開きます。このコードを実行すると、ユーザーの認可画面に進みますので、自分のデータの連携を許可します。

![スクリーンショット 2018-12-05 21.10.02.png](https://qiita-image-store.s3.amazonaws.com/0/103775/b4924bb6-f132-ac19-0fea-698263f69ae3.png)
![スクリーンショット 2018-12-05 21.10.35.png](https://qiita-image-store.s3.amazonaws.com/0/103775/0de4fa6c-d287-1053-7419-116e8dea90e6.png)

↓のようなページが残った場合は閉じても大丈夫です
![スクリーンショット 2018-12-06 08.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/103775/c6c4a09c-67d1-2808-509b-f6b833c394e7.png)


####OFFICE データ取得
```r:retrive.r
#JINS MEME OFFICE 計測データ取得
jinsmeme_api_token <- jinsmeme_api_outh$credentials$access_token
date <- "2018-11-02"
p_update_from <- paste0(date,"T00:00:00+09:00")
p_update_to <- paste0(date,"T23:59:45+09:00")
query <- list(date_from = p_update_from, date_to = p_update_to)
r <- GET("https://apis.jins.com/meme/v1/users/me/office2/computed_data", query = query, add_headers(Accept = ""),
        add_headers(Authorization = paste("Bearer",jinsmeme_api_token),
         "Accept-Language" = "ja", Accept = "application/json"))
el <- fromJSON(content(r, "text", encoding = "UTF-8")) 
#データが1時間ごとにリストに分かるので、すべて平らにくっつける場合は以下を実行
df <- bind_rows(el$computed_data)
```

## 一日を可視化してみる!

さてデータは抜けましたでしょうか？それでは最後にVisualizationです。私はどうしてもデータに関わる仕事をしてきたので、**一目で良いか悪いかが数値的にも判断でき、かつ美しい**Visualizationをやりたくなってきてしまうのですが、社内のメンバーからこれは概念的に難しいんじゃないかということで却下されて自己満足で終わったVisualizationがこちらです、、。

![Screenshot 2018-12-05 at 09.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/103775/45707e83-871a-dd69-12c3-419878e0f994.png)

こちらのデモでは以下のデータを組み合わせたものをggplot2のpolar chartを使用することでSunburst的な外観を実現しました。**外側に広がっているほど昼間は集中して仕事ができていて夜はグッスリ寝れている状態**を示しています。

- JINS MEMEの集中データ
    - オレンジ：集中が深いほど外に伸びる
- Fitbitの睡眠時間・睡眠深さデータ
    - 青：睡眠が深いほど外に伸びる
- Moves(現在サービス停止)による行動分類データ
    - 中心の円が**居場所**で、自宅・職場の滞在時間を表示
    - 通勤や運動（ランニング：黄緑）の表示 

このような形で自分の1日を改めて見返してみると、1日で使える時間、さらにその中で集中して作業できている時間ってホントに貴重で、無駄な会議・業務とかに時間取られるのは想像以上にインパクトあると思います。Leanに生きましょう～。


## 【おまけ】今後の展望

JINS MEMEでは現行品の弱点（ハードウェアの価格が高い、メガネの種類が選べない）を克服しつつ、生体データを活用したサービスを拡充していくことを計画中です。個人的には、自分を客観的に振り返られるようになったことで、ひどい怪我をしたり疲れ過ぎたりしなくなることでパフォーマンスをあげられるようになったと感じていまして、このデータをより様々な方に使っていただけるようサービス向上に努めていこうと考えています。