生体データと線形回帰で感情を分析する

約半年取り組んできたグループ研修が終わったので、書ける範囲でざっくり記録に残しておく。 *1 3人グループでテーマを決めて自由に進め、月一の中間報告でアドバイスをいただく、という形式。

テーマ

テーマの種をいくつか紹介いただき、そこから膨らませてグループでテーマを決める。 生体データからそのときの感情を分析し、ダイジェスト動画を自動生成しよう、というテーマにした。

生体データと感情分析について

生体データについては全くの素人なので、文献や論文をあたって調べた。

生体データ活用は様々な用途で検討されており、異常兆候の発見、感情の定量評価、新しいユーザインタフェース、などが挙げられる。 感情の定量評価として、心拍データから各種指標を抽出・分析する手法が知られている。

RRI

心電波形の波の最も大きいものをR波と呼ぶ。 R波とR波の間隔をRRI(R-R Interval)と呼ぶ。

RRIが小さい = 鼓動の間隔が短い = 心拍数が高い、となる。

このまま活用することもできるし、十分に精度の高いRRIがあれば、以下の指標を作り出す材料にもなる。

LF/HF

RRIを周波数分析し、0.05-0.20Hz(Low Frequency)成分を0.20-0.35Hz(High Frequency)成分で割ったもの。

心拍は一定のリズムのように思えるが実際は様々な要因で常にゆらいでいる。例えば呼吸など。

LFは交感神経の活性度、HFは副交感神経の活性度を表すと言われる。 LF/HFが高い = 交感神経優位 = ストレス状態、LF/HFが低い = 副交感神経優位 = リラックス状態、となる。

一般的なストレスセンサーは概ねこの指標に基づいていると思う(今までうさんくさいものと思ってたけど、理屈を学ぶとなるほどですね)。

SDNN

Standard Deviation of NN intervals, RRI標準偏差のこと。*2 先述の通り心拍は通常ゆらいでいるが、緊張状態・ストレス状態ではこのゆらぎが小さくなる傾向がある。 そのため、SDNNと緊張度合いには相関がある。

pNN50

1つ前のRRIとの差分が50msより大きいものの割合。SDNN同様、ゆらぎ度合いを表す。

バイス選定

心電データの取得にhitoeトランスミッターを使用した。 他に、瞬き・頭の動きを取得できるJINS meme ESを使用した。

両者に共通しているのは、十分な精度があり、かつ装着時の制約がないこと。 スマホと接続さえあれば他に動作上の制約がないため、屋外での使用やスポーツでの使用も問題ない。

プロトタイプ

各種生体指標に対して重みづけ・合計して感情を分析する、シンプルなモデル構成とした。 この時点で重みづけは適当。 合計した感情(仮)が高まっているところがハイライトシーンと推定される。

山登りシーン、運転シーン、で試してみた結果、 ハイライトシーンはなんとなく検出できている(と言えなくもない)と、無策にしてはボチボチな結果であった。

これをもって中間発表したところ、「なんとなくそれっぽいで終わってるのが残念」と鋭いご指摘をいただく。。 あわせて「多変量解析等取り入れてみては?」とアドバイスをいただいた。

多変量解析と線形回帰

多変量解析なるほど、と思いさっそく図書館で本を借りまくったものの、読んでも読んでもさっぱりわからん。。

もうむり。。。となりかけたところで、

多変量解析のはなし―複雑さから本質を探る (Best selected Business Books)

多変量解析のはなし―複雑さから本質を探る (Best selected Business Books)

が頭にすっと入ってきてとてもわかりやすかった。 いきなり理論と数式で始まるのではなく、目的とそのために確立された理論が順番に紹介されていく構成が良かった。 1985年発行ということで、出てくる例がエリマキトカゲやら猪八戒だったりするのも面白い。

計測できないもの(かっこよさ、味の好み、等)を計測できるもの(色、形、固さ、等)を用いて分析する、ということで、 まさに今必要としている技術の学問だった。 中でも、線形回帰モデルが今回のモデルに近い(というかそのもの)ので適用することにした。

計測できるテーマとしてのテトリス

線形回帰で学習しようにも、感情はそもそも計測できないので、正解データが作れない。 「なんとなくそれっぽい」止まりになってしまう本質的な原因がこれだった。

そこで、「計測できるテーマ」として、テトリスをプレイしているシーンの分析に変更した。 テトリスであれば、プレイ中の優勢劣勢を空きブロックの数でおおよそ計測できる。 「空きブロック数が少ない = 集中状態」と仮定し、これを正解データとして使用した。

最終プロトタイプ

テトリスを複数回・複数名でプレイしデータセットを蓄積。 プレイ動画から空きブロック数を分析し、正解データを作成。 線形回帰分析によってモデル(重みづけ)学習。 そのモデルを使用して、テストデータを分析した。

分析結果の集中度(仮)が高まったところをハイライトシーンとし、ダイジェスト動画を自動生成した。

100%満足のいく分析結果とはならなかったものの、それなりに検出できている動画となっており、 自分としては満足のいく成果となった。

まなび

多変量解析の考え方がとても勉強になった。 現在の機械学習にもつながってくる概念なので、今後も引き続き勉強していきたい。

また、「データ分析ならPythonかな」と安易に選定したものの、 流石Pythonは盤石の環境で、PandasとScikit-learnでなんでも簡単にできてとても助かった。 ただ、Pandasは慣れればシュッと書ける感じなんだけども、なかなか作法がわからず、しょうもないハマりを結構してしまった。 だいぶ慣れたので次があればもっとうまくやれる気がする。

生体データの分析は、学問としては研究されているものの、事業化されている前例は多くないようなので中々アツい分野だと思う。 簡単に手に入るデバイスも増えてきているので、個人でももうちょい試してみようかと思った。

*1:社内情報を含まないので問題ないと思うけど、怒られが発生したら消します

*2:RRIのことをNNIと呼ぶこともあるらしい