ExploratoryとRを使って、Pythonよりもっと早く、歩数データを分析して、京都、東京、シリコンバレーで比較してみた

iphoneのアプリを使うと簡単に歩数のデータを見れるのをご存知ですか？　実は、今歩数を数えて分析することにハマっています。私は、2015年の10月ごろから、京都から東京にProgate株式会社でのソフトウェアエンジニアとしてのインターンシップで、上京しました。また、2016年の2月から、東京からアメリカのシリコンバレーのほうに留学でやってきました。上京前や留学前と後で歩数の変化に違いは見られたりするのでしょうか？　機械学習やデータサイエンスで有名なYhat社が、[ブログ](http://blog.yhat.com/posts/phone-steps-timeseries.html)で、歩数のデータをPythonを使って分析しています。これから、これをもとに、今度は私の方で、私のiPhoneからダウンロードした私の歩数のデータをもとに、RとExploratoryを使って、もっとシンプルにサクッと直感的に分析をしてみたいと思います。データはこちらからダウンロードすることができます。アプリは[こちら](https://itunes.apple.com/us/app/qs-access/id920297614?mt=8)からダウンロードできます。

##データをエクスポートする

時間ごとの歩数のデータが見たいので、1 Hourを選ぶ。

<img width="375" alt="hour-step.png" src="https://qiita-image-store.s3.amazonaws.com/0/91522/0197d64e-5f31-3528-2f48-626acede5e93.png">


歩数のデータが欲しいので、Stepを選んで、Create Tableを押します。

![step-chose.png](https://qiita-image-store.s3.amazonaws.com/0/91522/40d0f952-75bb-6e8b-4f6e-a7e0009d5359.png)


テーブルができました。これをエクスポートして準備完了です。

<img width="375" alt="table-chose.png" src="https://qiita-image-store.s3.amazonaws.com/0/91522/92ac5e79-f6c5-c802-a174-6b87baf1b2f7.png">


##データを準備するのがどれだけ簡単か

Pythonではデータをインポートするのにこのようになります


```
df_hour = pd.read_csv('health_data_hour.csv', parse_dates=[0,1], names=['start_time', 'steps'], usecols=[0, 2], skiprows=1, index_col=0)
```

Exploratoryだと、ボタン1つでインポートすることができます。

![import-table-step.png](https://qiita-image-store.s3.amazonaws.com/0/91522/047209d9-425f-ae71-5ba4-4462bd810f8e.png)


そして、簡単なサマリー画面も見ることができます。

![summary-step.png](https://qiita-image-store.s3.amazonaws.com/0/91522/d4c25077-c83b-3656-c8a9-32a4a774ed18.png)


次に、Pythonは、データタイプをcharacterからDateに変えるために、Pythonの`pandas.tseries.index.DatetimeIndex`を使っていますが、詳細については詳しく書かれていません。

一方、Rの場合は、dmy_hm関数を使うと、たった1行で、データ・タイプをcharacterからDateに変えることができます。

まず、Start列のヘッダーをクリックして、Convert toからDay,Month,Year,Hour,Minuteを選びます。

![dmy-hm-step.png](https://qiita-image-store.s3.amazonaws.com/0/91522/5e985269-7609-499a-92af-11a171d6102a.png)


下のようにコマンドが自動生成されます。

```
mutate(Start = dmy_hm(Start))
```

![dmy-hy.png](https://qiita-image-store.s3.amazonaws.com/0/91522/717bb5be-dae4-269f-b3fb-18bfe1072cba.png)


さらに、Finish列のデータタイプも変えておきましょう。

```
mutate(Start = dmy_hm(Start), Finish = dmy_hm(Finish))
```

![dmy-hm-step2.png](https://qiita-image-store.s3.amazonaws.com/0/91522/b60c2b99-46f1-3156-2a5c-5e849a155719.png)



データ・タイプをcharacterからDateに変えることができ歩数あたりの時間も出すことができました。たった1行です。


##タイムシリーズごとの歩数を計算する

さらに、Pythonを使って、このように分析しています。


```
df_hour.steps = df_hour.steps.apply(lambda x: int(float(x)))
df_hour.head()
type(df_hour.index)
type(df_hour.steps[1])
```

```
df_daily = pd.DataFrame()
df_daily['step_count'] = df_hour.steps.resample('D').sum()
df_daily.head()
p = ggplot(df_daily, aes(x='__index__', y='step_count')) + \
    geom_step() + \
    stat_smooth() + \
    scale_x_date(labels="%m/%Y") + \
    ggtitle("Daily Step Count") + \
    xlab("Date") + \
    ylab("Steps")
print p
```
```
df_weekly['step_mean'] = df_daily.step_count.resample('W').mean()
df_monthly['step_mean'] = df_daily.step_count.resample('M').mean()
```
![step-mean-simple0.png](https://qiita-image-store.s3.amazonaws.com/0/91522/d220ceef-6c29-8bd9-11e1-efa1523bc3cc.png)

これは、ビジュアライズしようとすると、1時間ごとの歩数数が計算されてしまったので、ビジュアライズをもっときれいにするために、時間ごとではなく、日付ごとのデータを計算しようしたり、合計数ではなく、月ごとの平均歩数を計算しようとしているからなんです。しかし、Exploratoryのチャートでは、タイムシリーズやAggregate関数をケアできているので、そもそもこのような冗長なコードを一切書かずに、一瞬で同じことをすることができます。

X軸で自由にタイムシリーズを選ぶことができます。

![step-mean-simple.png](https://qiita-image-store.s3.amazonaws.com/0/91522/ed266bd5-b047-af72-ec0d-b47088b25348.png)

また、関数も自由に選ぶことができます。

![step-mean-simple2.png](https://qiita-image-store.s3.amazonaws.com/0/91522/036bda17-0ccd-131a-ef6b-98a88fc1cbb0.png)


##平日と週末で歩数を比較する

さらに、Pythonを使うと、このような長いコードを書きながら、平日と週末を比較するためのデータをビジュアライズしていくことになります。


```
def weekendBool(day):
    if day not in ['Saturday', 'Sunday']:
        return False
    else:
        return True

df_daily['weekday'] = df_daily.index.weekday
df_daily['weekday_name'] = df_daily.index.weekday_name
df_daily['weekend'] = df_daily.weekday_name.apply(weekendBool)
df_daily.head()
```

```
ggplot(aes(x='step_count', color='weekend'), data=df_daily) + \
    stat_density() + \
    ggtitle("Comparing Weekend vs. Weekday Daily Step Count") + \
    xlab("Step Count")
```

Exploratoryでは、同じことをもっと簡潔にすることができます。

Step列を見てみると、歩数が0のときがよくあります。

![step-filter0.png](https://qiita-image-store.s3.amazonaws.com/0/91522/680117cc-d947-a005-6ba2-c4107f89711d.png)


意味のあるデータに絞るために、歩数が30以上のときにフィルタリングしましょう。

```
filter(`Steps (count)` > 30)
```
![step-filter.png](https://qiita-image-store.s3.amazonaws.com/0/91522/22aa8c2d-a237-3c49-d06c-d101d4ea6dff.png)



そして、Start列のヘッダーをクリックして、ExtractからDay of Weekを選びます。

![wday-step.png](https://qiita-image-store.s3.amazonaws.com/0/91522/b78eaeb2-c42d-0e0c-768a-d4c8deb063c9.png)


下のようにコマンドが自動生成されます。そして、Runボタンを押します。

```
mutate(weekday = wday(Start, label = TRUE))
```

![wday-step2.png](https://qiita-image-store.s3.amazonaws.com/0/91522/a764218a-a57c-088d-6447-ae528ccb1d74.png)



次に、if_else関数を使って、平日と週末で条件を分岐させましょう。

```
mutate(Weekend = if_else(weekday %in% c("Sun","Sat"),"Weekend","Weekday"))
```

![wday-mutate-if.png](https://qiita-image-store.s3.amazonaws.com/0/91522/a64dbdf0-b5ce-e917-0ad6-cbef09209b97.png)


そして、ビジュアライズしてみます。

![wday-mutate-if1.png](https://qiita-image-store.s3.amazonaws.com/0/91522/c062ded7-456b-1c36-309a-787fb9ea4579.png)


##京都、東京、シリコンバレーで比較する

最後に、せっかくなので、10月までいた京都とそれから2月までいた東京と現在滞在しているシリコンバレーで歩数に変化はあったのか比較してみたいと思います。
日付で京都と東京とシリコンバレーで条件分岐をするために、まずas.Date関数を使ってデータタイプをDate(日付)に変えます。

```
mutate(Start = as.Date(Start))
```
![wday-as.Date.png](https://qiita-image-store.s3.amazonaws.com/0/91522/ebd4f63d-8c31-44b4-bd91-9e6da5a56d07.png)


次に、if_else関数を使って条件分岐をします。

![wday-as.Date2.png](https://qiita-image-store.s3.amazonaws.com/0/91522/5b25ed21-7e53-f5af-0c61-67a81e840bda.png)


Runボタンを押します。

```
mutate(Place = if_else(between(Start,as.Date("2015-09-27"),as.Date("2015-10-01")),"Kyoto",if_else(between(Start,as.Date("2015-10-02"),as.Date("2016-02-07")),"Tokyo","Silicon_Valley")))
```

![wday-as.Date23.png](https://qiita-image-store.s3.amazonaws.com/0/91522/bb26e2aa-b85a-3d16-8cb4-7e825221e234.png)


これで、京都と東京とシリコンバレーを表すPlace列を作ることができました。これを使って、ビジュアライズしてみましょう。

![wday-as.Date3.png](https://qiita-image-store.s3.amazonaws.com/0/91522/5496de4a-4ff6-0ba7-453e-b403e036bdf0.png)


東京が多くなっていますね。これは、毎日、新大塚や浅草から渋谷まで徒歩と電車で通っていたからだと思います。そして、シリコンバレーは、車社会だから、やはり歩数が少なくなっていますね。あれ、でも京都が極端に少ないですね。それぞれの日数を見てみましょう。

![wday-as.Date4.png](https://qiita-image-store.s3.amazonaws.com/0/91522/162a96b4-4faf-749e-bb54-7c47325806b6.png)


京都がほとんどないので、フィルタリングをかけて東京とシリコンバレーだけで比較しましょう。

![wday-as.Date5.png](https://qiita-image-store.s3.amazonaws.com/0/91522/f8fc2fae-38b5-8cec-2895-3639a650345a.png)



##移動平均を計算してトレンドを見る

最後に１日当たりの歩数平均のトレンドを私の住んでた場所ごとに色で区分けしてビジュアライズしてみたいと思います。

移動平均はY軸の隣のアイコンから設定することができます。

![steps_per_min2.png](https://qiita-image-store.s3.amazonaws.com/0/91522/27b32095-cffb-5735-bffc-4dd909f260ec.png)


次に、ダイアログから移動平均の設定をすることができます。設定が終了すると、Applyボタンを押しましょう。

![steps_per_min25.png](https://qiita-image-store.s3.amazonaws.com/0/91522/c7df5cc5-debb-6c51-1434-11d8de59477c.png)


これで移動平均を出すことができました。

![steps_per_min3.png](https://qiita-image-store.s3.amazonaws.com/0/91522/ce6f1476-34ae-6ab8-503d-903bd6f49533.png)


##最後に

Pythonと比較して、ExploratoryでRを使うことがどれだけ簡単かおわかりいただけたでしょうか？　データはどこにでもあるものですが、ほとんどの人は分析の仕方を知らないものですよね。それは、データが整形されていない状態のときが多いからです。データを分析するには、データ分析についてあれこれ考える前に、データを分析可能な状態まで整形する必要があるのです。例えば、今回の歩数のデータは、Iphoneさえ持っていれば誰もが持っているデータです。しかし、今までなら、このようなデータを分析しようとすると、サードパーティのアプリにお金を払って、データを渡して、返ってきた作られたレポートを見るというのが一般的ではなかったでしょうか？　しかし、Exploratoryがあれば、サードパーティのアプリなどを使う必要は一切ありません。Exploratoryでは、複雑で冗長なコードを書くことなしに、文法を中心としたデータ分析とビジュアライゼーションによってこんなに簡単に、自分でデータをよりよく理解していくことができます。

##興味を持っていただいた方、実際に触ってみたい方へ

Exploratory Desktopは[こちら](https://exploratory.io/
)か登録した後にダウンロードしてすぐに使ってもらうことができます。もちろん、無料で始めることができます！

ExploratoryのTwitterアカウントは、[こちら](https://twitter.com/ExploratoryData
)です。

Exploratoryの日本ユーザー向けの[Facebookグループ](https://www.facebook.com/groups/1087437647994959/members/
)を作ったのでよろしかったらどうぞ

分析してほしいデータがある方や、データ分析のご依頼はhidetaka.koh@gmail.comまでどうぞ