【Stan】Rで iPhone から取得した歩数データ分析

昨年 iPhone6を購入してから全く意識してなかったのですが, 最近になって iOSが歩数をカウントしていたことに気づいたのでデータを取り出して分析してみました。データを iTunes にバックアップする場合, 2015/11時点だと「バックアップを暗号化」しないとヘルスケアデータはバックアップされないので注意が必要です。例えば, 暗号化せずにバックアップし復元で同期した場合に過去のヘルスケアデータは消失してしまいます。

iPhoneから歩数データの取得

QS Access というiOSアプリから HealthKit APIでアクセスできる歩数データを csvで取得できた。iPhone6を購入した日の 11-Dec-2014 から 01-Nov-2015 までの 1h単位の歩数データがある。

まずは, 時間帯別の歩数を見てみる。平日は通勤のために最寄り駅まで歩いており, この時間帯の歩数は安定している。一方で, 帰宅時の時間帯はバラツキがある。また, 土日は昼過ぎから夜にかけてあまり歩いていない。

steps-tile

1日あたりの歩数のヒストグラム。0 より大きくて, 分布は右に裾が長いので 0 < x < ∞ を表現できる対数正規分布が当てはまりそうな感じ。[1] steps-hist

時系列で見てみる。赤の破線が変化点と考えられる。この変化点は引越しをした日で, 通勤経路が変わり歩く時間も増えたので, 歩数が一定量増えたと推測できる。また, 土日は通勤がないため基本的に歩数が減る傾向にあるので T = 7(days) の周期性もありそう。

steps-line

状態空間モデル

dlm::dlmMLE を使って 最尤推定でパラメータを推定する。
図中で dlmFilter によりカルマンフィルタで処理されたモデルが fit, また dlmSmooth でスムージング処理されたのが smooth。

steps-dlm

ここ1年で歩数は上昇傾向にありそう。状態空間モデルはもう少し勉強しよう。

Stanで変化点検出

Stanを使って変化点 (引越しの影響により歩数の増加が始まった点)をデータから推定してみる。対数正規分布のパラメータ μ, σ と 変化点 c を推定した。stanのコードは下記。

data {
  int N;
  real d[N];
}

parameters {
  real mu;
  real sigma;
  real m_d;
  real s_d;
  real c;
}

model {
  for (i in 1:N){
    real m;
    real s;
    m <- mu + int_step(i-c) * m_d;
    s <- sigma + int_step(i-c) * s_d;
    d[i] ~ lognormal(m, s);
  }
}

generated quantities{
  real	zeta;
  real	late;
  zeta <- exp(mu);
  late <- exp(mu + m_d);
}

R^ を確認すると分散パラメータが怪しい結果となっている。
歩数/日 は変化点前は 平均 10374歩, 変化点後は 平均 12815歩と推定された。

Inference for Stan model: 130fd1283af58a55cafff08e0d98f03f.
3 chains, each with iter=2000; warmup=1000; thin=1;
post-warmup draws per chain=1000, total post-warmup draws=3000.

          mean se_mean     sd     2.5%      25%      50%      75%    97.5% n_eff Rhat
mu        9.25    0.00   0.02     9.21     9.23     9.25     9.26     9.29    33 1.10
sigma     0.32    0.01   0.02     0.29     0.30     0.31     0.33     0.35     5 1.29
m_d       0.21    0.01   0.04     0.15     0.19     0.21     0.23     0.28    49 1.03
s_d       0.09    0.01   0.04     0.02     0.06     0.09     0.12     0.17     9 1.48
c       196.52    2.46  15.53   172.66   187.11   192.49   206.15   229.01    40 1.08
zeta  10374.56   40.28 230.53  9964.69 10211.61 10371.78 10526.39 10850.98    33 1.10
late  12815.84   63.33 453.86 11996.51 12485.67 12793.14 13138.31 13703.81    51 1.02
lp__    179.88    0.29   1.64   176.28   178.83   180.04   181.13   182.38    33 1.08

plotしてみた図が下記。青の破線が変化点の推定値, 赤が実際に引越しを行った日。肝心の変化点は 2015-6-24 と推定され, 実際より 約1ヶ月前となった。

steps-stan-lognormal

CodeとDataは Githubに置いた。

おわりに

概ね引越しを境にして歩数が上昇傾向なのは確認できたけど, 実は体重も上昇傾向なので食べ過ぎには注意しないといけない...

{circular} [2]も興味があるので, 試してみたら追記します。

あと, 今回の stanを使ったモデリングは自分の理解が足りていない部分もあるかと思いますので, その点はご了承ください。


[1] 対数正規分布は年収や銀行の預金額などの分布に一致し易い。歩数に適用するに当たり, 対数正規分布の範囲は 0 < x < ∞ であるので, 1歩も歩いていない日がないと仮定を置いている。正しいかはわからない... [2] 循環する変数の統計モデリング