Phyphoxで作ろう！自分だけの物理データセット！

至るところでデータ活用が叫ばれる現代日本。
データサイエンティストな皆さんは，普段どんなデータで分析をしていますか？

分析者として企業に属している方々は，業務であれば自社のサービスデータを活用して，分析を実施することが多いでしょう。
かたや，プライベートで分析しようと考えた時，企業で保有している大切なデータを使って分析はできないですよね。必然的にkaggleやアカデミックで公開されているオープンデータを使うことになります。

しかし！**公開されているオープンデータだけで，分析の欲求が満たされるとは限りません。**例えば次のような想いがあった場合は，どうでしょうか。

- **オープンデータよりも，もっとラベル付けの閾値・精度が明確なデータを触りたい！**
- **自分にとってより身近なデータを使って分析をエンジョイしたい！**
- **もはや自分でデータを作りたい！俺が俺のために作ったデータセットで！サイエンスがしたいんだ！**

マニアックですか？マニアックでいいんです。だって技術者だもの。
そして**この希望は簡単に叶えられます**。
そうクレバーでスマートなアプリ，**Phyphox**を使えばね。


## TL;DR
ドコモSI部3日目の本記事を通じ，伝えたいことは次の3点になります。

- [Phyphoxとは何か？](#phyphoxとは何か？)
    - いろんなデータがとれるすごいヤツ🙄✨
- [Phyphoxの使い方](#phyphoxの使い方)
    - さくさく測定できちゃうゾ🤔✨！
- [歩きスマホデータの作成と分析](#歩きスマホデータの作成と分析)
    - 自分で作った自分だけのオリジナルデータで分析できちゃいます☺️✨

## Phyphoxとは何か？

Phyphoxはドイツのアーヘン工科大学が公開している，オープンソース・ソフトウェアです。

https://phyphox.org

このアプリでは**ジャイロからスペクトルデータまで，多種多様な物理データを取得することが可能**です。今年の10月にも著名な物理学者の方が取り上げ，話題になりました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">phyphoxというアプリが最高に面白い。<br>加速度から磁力から音響から高度からなんでもリアルタイム計測してグラフ表示。スマホをそっと上に投げてみると、無重力が記録されてたり、自宅の地磁気が実は水平からずいぶんずれてたり！<a href="https://t.co/t91tTR1uiJ">https://t.co/t91tTR1uiJ</a> <a href="https://t.co/R6yeBRLT7C">pic.twitter.com/R6yeBRLT7C</a></p>&mdash; 橋本幸士 Koji Hashimoto (@hashimotostring) <a href="https://twitter.com/hashimotostring/status/1179883582497513472?ref_src=twsrc%5Etfw">2019年10月3日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


では，どんなデータを取得することができるのか。抜粋の上，一覧にまとめてみました。

| カテゴリ     | 項目                       | 説明                                                         |
| ------------ | -------------------------- | ------------------------------------------------------------ |
| センサー出力 | gを含まない加速度          | 静止状態を0としてx/y/z方向の加速度を時系列で取得             |
|              | ジャイロスコープ(回転速度) | x/y/z方向のジャイロスコープから取得した回転速度の時系列を取得 |
|              | 位置(GPS)                  | 緯度経度高度に関するGPS情報を取得                            |
|              | 光                         | 光センサーを用いて得られる時系列を取得                       |
|              | 圧力                       | 圧力センサーを用いて取得される時系列を取得                   |
|              | 磁力計                     | スマートフォンの内部磁場を補正した磁界を時系列で測定         |
|              | 重力加速度gを含む加速度    | 静止状態に重力加速度分を加えた時系列を取得                   |
| ツール       | 傾斜                       | スマートフォンの傾きの変化を時系列で取得                     |
|              | 加速度スペクトル           | 加速度計で計測したデータをフーリエ変換した周波数スペクトルを取得 |
|              | 磁力スペクトル             | 磁力計で計測したデータをフーリエ変換した周波数スペクトルを取得 |
|              | 磁力定規                   | 間隔が離れた磁石の上をスマートフォンを通過させ，磁力計の測定結果から移動距離を取得 |
| 力学・運動   | （非）弾性衝突             | ボールが壁に対して非弾性衝突し，跳ね返った際の音から，エネルギー損失を割り出し取得 |
|              | ばね                       | 設置された発振器に関して，周期と周波数を測定し取得           |
|              | 振り子                     | スマートフォンを振り子として用いた際の周期・周波数を取得     |
| 音響         | オーディオスペクトル       | マイクから音声を取得し，それをフーリエ変換して周波数スペクトルを計算 |
|              | ソナー                     | スマートフォンから発生させた音の反射音を利用し物体に対する距離を測定 |

注目されるだけあり**本当に多様なデータが取得できます**ね🤔 
(ちなみに，Phyphoxの機能もさることながら，スマートフォンのセンサーとしての優秀さにも驚きます......お主こんないろんな物理センサーを搭載しとるのか......やりおる......)

ただし，スマホのセンサーを用いて取得するので，当然そのスマホに該当のセンサーが無ければPhyphoxの一部機能は使えません。例えば私が実験で使用したiPhone Xだと，光センサーを用いた物理測定はできませんでした。

**公式でYoutubeも公開**されており，こちらでは具体的な実験方法や物理的イメージがより鮮明になるでしょう。例えば下記はYoutubeで公開されている，**ソナーを用いた実験例**です。ソナーの実験では発振した音波の跳ね返りから物理量を測定するのですが，音波が全方向に伝搬されるため，ターゲットとなる物体方向以外は吸収体で遮蔽することが好ましいです。その様子がわかりやすく示されています。

[![](https://img.youtube.com/vi/3JtJoJAAgKU/0.jpg)](https://www.youtube.com/watch?v=3JtJoJAAgKU)

また，Phyphoxはスマートフォンを用いた実験コミュニティの活動にも積極的です。Twitterも頻繁に更新されてるよ∧( 'Θ' )∧

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">This is an amazing way to summarize a conference. Enjoying every bit of the &quot;Smartphonique #2&quot; at the <a href="https://twitter.com/IUT_de_Bordeaux?ref_src=twsrc%5Etfw">@IUT_de_Bordeaux</a>. (Even without speaking French) <a href="https://t.co/muSxtxeZoP">pic.twitter.com/muSxtxeZoP</a></p>&mdash; phyphox (@rwth_phyphox) <a href="https://twitter.com/rwth_phyphox/status/1187338403123224576?ref_src=twsrc%5Etfw">2019年10月24日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## Phyphoxの使い方

では実際に，Phyphoxを用いて物理データセットを取得してみます。今回の記事で行う実験では，一律下記の条件を前提とします。


[](#端末条件)  

| 機種    | OS ver. | phyphox ver. |
| ------- | ------------ | ----------------- |
| iPhone X | 12.4.1       | 1.1.2             |

### 手順

1. 【**実験選択**】アプリを立ち上げると，前述した実験群が一覧で表示されます。今回は**回転速度を測定する実験**である**ジャイロスコープ**を選択します。
2. 【**測定実施**】遷移先で**▶︎**ボタンを押すと計測が開始されます。ほぼ全ての実験が時系列取得の実験であり，リアルタイムに処理が走ります。実験を終了したいときには**||**ボタンを押して下さい。
3. 【**データ出力**】終了後**︙**ボタンを押すと，実験に関するオプションがメニューとして表示されます。そのうち**データのエクスポート**を選択すると，Excelか CSVかの形式でRawデータを出力可能となります。今回はカンマ形式CSVを出力するものとします。
4. 【**データ共有**】ポップアップ下部の「データのエクスポート」を押すと，メールやクラウドといった形式でのデータ共有方法が現れるので，自分に適したものを選択してください。

![jikkenn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/b0e28d28-291a-d4ea-5565-840689194a02.png)

Phyphoxでは前述した多くのプリセット実験に加えて，自分自身で条件を設定した上で実験(**簡単なカスタム実験**)を行うことも可能です。設定可能な条件は下記の通りです。

- 【**センサーレート(周波数, Hz)**】0とすると最速処理
- 【**有効とするセンサー**】加速度センサー，線形加速，位置，ジャイロスコープ，磁界，圧力，接近度から選択

方法をまとめたので，良かったら自分だけの実験を作ってみて下さい📃

![カスタム実験.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/f3da2c46-1906-2b44-2c2e-c77c5b10c2e3.png)

### データ確認

以上に述べた手順のもとで得られたデータを見てみましょう。ジャイロスコープ実験で
**「椅子に座る」→「立ち上がる」**という動作を繰り返し行なった後の結果を，下記に示します。

<details><summary>プロットに用いたコード</summary>
<div>

```Python
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# データ読み込み
df = pd.read_csv('Raw Data.csv')

# スマホをポケットに出し入れする操作を除去
df = df.loc[(df['Time (s)'] >= 3.5) 
            & (df['Time (s)'] <= 20)]

# 2次元プロット
df.plot(x = 'Time (s)', 
        y = ['Gyroscope x (rad/s)', 
             'Gyroscope y (rad/s)',
             'Gyroscope z (rad/s)'])
plt.show()
```

</div>
</details>


![Unknown-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/674c63c7-75a5-9db0-a3bf-b964f4b8ac73.png)

phyphoxにおけるx,y,z軸は下図の通りに定義されています。[^1]

<img width="300" alt="ジャイロ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/4195e4ec-5dae-fdea-b4fd-7ebe7eb79506.png">

今回椅子に座り立ち上がる動作を行った時，スマートフォンの筐体はポケットに入ったままのため，ジャイロの振れ方も「座る動作」に対して「立つ動作」はちょうど逆の操作になり，図のような波形が生じたと考えられます。

## 歩きスマホデータの作成と分析

ではいよいよ自分による自分のための**俺々データセット**を作成しましょう。今回は**歩きスマホのデータ**を作って見ることにします。

### なぜ歩きスマホデータか？
ご存知の通り，歩きスマホは画面情報に注視してしまうことで，周囲への配慮がおろそかになる行為です。日本でも交通事故や転落事故が起きる等，危険な行為として社会問題化しています。英語では**Texting While Walking**として知られ，日本だけでなく世界でも問題になっています[^2]。

このような状態を，例えばスマホの物理データから推定できれば，歩きスマホの防止につなげることができるかも知れません。実際にアカデミックの現場でも，歩きスマホの検知に関する研究は進んでいます[^3]。ただ，端末自体で取得可能な物理ログは公開されていません（少なくともkaggle等にはなかった......あったらコメントまでお願いします🙇）。

そこで，今回は**歩きスマホを検知するため**にデータのサンプルを下記の条件で作成してみました。

| 事項   | 内容                                                         |
| ------ | ------------------------------------------------------------ |
| 端末/OS   | [前述を参照](#phyphoxの使い方)                                                   |
| 実験   | ジャイロスコープ, 線形加速度によるカスタム実験                  |
| 場所   | モードによって異なる。<br />1.**歩きスマホモード**：<br />　会議室や部屋など周囲に人がいない安全な場所<br />2.**その他のモード**：<br />　屋外，公道含む日常生活を送る場所 |
| モード | 1. ポケットに入れて歩行・移動するモード<br />2. 電車内スマホ操作モード[^4]<br />3.歩きスマホモード |
| 時間   | 1セッションあたり1分以上計測                     |

取得した結果を上から順に，
　1. ポケットに入れて歩行・移動するモード
　2. 電車内スマホ操作モード
　3. 歩きスマホモード
で示します。[Phyphoxの使い方](#phyphoxの使い方)でも行ったように，測定の開始・終了前後のログはノイズとなるため除去しています。

<details><summary>プロットに用いたコード</summary>
<div>

```Python
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# データ読み込み
accele_df = pd.read_csv('walking/Linear Accelerometer.csv')
gyro_df = pd.read_csv('walking/Gyroscope.csv')

accele_df = accele_df.loc[(accele_df['Time (s)'] >= 5) 
                & (accele_df['Time (s)'] <= 25)].copy()
gyro_df = gyro_df.loc[(gyro_df['Time (s)'] >= 5) 
                & (gyro_df['Time (s)'] <= 25)].copy()

# 線形加速の2次元プロット
accele_df.plot(x = 'Time (s)',  y = ['X (m/s^2)','Y (m/s^2)','Z (m/s^2)'], 
                     figsize = (15, 5))
plt.show()

# ジャイロの2次元プロット
gyro_df.plot(x = 'Time (s)', y = ['X (rad/s)', 'Y (rad/s)','Z (rad/s)'], 
             figsize = (15, 5))
plt.show()
```

</div>
</details>

**ポケットに入れて歩行・移動するモード**
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/db466415-dc89-7826-388c-a81c43902bf7.png)
![Unknown-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/02348d5c-e32a-3072-d941-7a8799dcb61f.png)
**電車内スマホ操作モード**
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/9b4510cc-9acf-8410-141a-856d73fbdd4d.png)
![Unknown-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/4f6c6579-5f5a-8780-a4b4-e709f18c7842.png)
**歩きスマホモード**
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/4ad20c43-382c-ae26-5715-cd3b59e2ac09.png)
![Unknown-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/3b25daf7-690a-cc11-e768-d94fe3e4d56e.png)

時系列を観察すると，次のことがわかります。
- 【ポケットに入れて歩行・移動するモード】加速度，ジャイロ共に周期的に変動
- 【電車内スマホ操作モード】突発的な変動が非周期的に発生
- 【歩きスマホモード】乱れてはいるが，周期構造が存在

ここから，**時系列をもとに各モードを見分けるキーは，周期性である**ことが想像されます。そこでこの構造を取り出すために，フーリエ変換をしてみることにしました。

<details><summary>高速フーリエ変換コード</summary>
<div>

```Python

# numpyのFFTを利用
F_accele = np.fft.fft(np.array(accele_df['X (m/s^2)']))
F_gyro = np.fft.fft(np.array(gyro_df['X (rad/s)']))

F_accele_abs = np.abs(F_accele)
F_gyro_abs = np.abs(F_gyro)
plt.plot(F_accele_abs[0:1000], label = 'accele')
plt.plot(F_gyro_abs[0:1000], label = 'gyro')
plt.legend(fontsize = 15)
plt.show()
```
</div>
</details>

**ポケットに入れて歩行・移動するモード**
![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/eacd6e19-9fdd-e43f-d706-f04f928e5b83.png)
**電車内スマホ操作モード**
![Unknown-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/b7bf6ac1-bd13-b787-ebe9-1ff363663026.png)
**歩きスマホモード**
![Unknown-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319675/4fdfc6b6-61e7-33b8-dee6-a76cb8384073.png)

結果を見て見ると，**歩行モードは複数の特徴的なピークが立っています**が，**電車内モードはほとんど失われてしまっている**ことが分かります。通常の歩行は一定のリズムを刻むため，周期構造が見えやすいと考えられます。一方で電車内モードは，基本的には直立状態で電車に揺られていますが，急減速時に身体や腕が振られてしまうため，図のような非周期なバーストが生じてしまうと考えられます。最後に**歩きスマホモードは，歩行によって一定の周期性をセンサーが検知しますが，不規則な画面操作によって筐体が揺さぶられるため，通常歩行に比べ周期性がかき消される**と考えられます。


### まとめ

本稿ではデータ取得アプリであるPhyphoxの紹介と，それを用いた実験データの取得を実施しました。一覧でも示しましたが，スマホのセンサーを利用して多くの実験を行うことができ，大変便利そうですね。今回はジャイロや加速度にフォーカスしましたが，磁気センサー等も用いればもっと高度な実験を簡単に実施できると思います📃 
また本稿ではサンプルデータの分析に留まりましたが，日常的に取得し十分なデータ量を確保することで，機械学習的な分析・分類アプローチも可能になるかと思います🤖 記事内では周期性をもとにモード判定について考えましたが，服装や電車内の状況，またデータを取得するユーザ間の個人差を吸収するには，十分なデータ量が必要でしょう。

本稿は以上です。みなさんもご自身で実験条件を考え作ったオリジナルなデータセットで，ぜひ分析ライフを充実させて下さい！Enjoy Your 分析ライフ！

[^1]: [phyphoxのSupported sensorsを参照。](https://phyphox.org/sensors/)
[^2]: [11月のNew York Timesの歩きスマホ記事](https://www.nytimes.com/2019/11/13/technology/personaltech/distracted-walking-twalking.html)
[^3]: [Recognition of Texting-While-Walking by Joint Features based on Arm and Head Poses, 画像系の研究です。](http://www.murase.m.is.nagoya-u.ac.jp/~ide/res/paper/E16-conference-shinmuraf-2.pdf)
[^4]: 総武線の電車に揺られながら作成しました。可能な限り満員電車を避け作成しています。満員電車辛いお......