データ前処理の実装
年次データの月次化処理には、pandas.DataFrame()に実装されたresample()関数を使用しています。下のコードでは、人口データ(df_pop)を都道府県(prefecture)ごとに、年次データを線形補間(interpolate())してデータ粒度を月次に変更しています。
### データの前処理(1):月次データ化
・・・
df_list = []
for prefecture in df_pop['prefecture'].unique():
df_tmp = df_pop[df_pop['prefecture'] == prefecture]
df_tmp.set_index('datetime', inplace=True)
df_tmp = df_tmp.resample('1MS').interpolate()
df_tmp['prefecture'] = prefecture
df_tmp.reset_index(inplace=True)
df_list.append(df_tmp)
df_pop_month = pd.concat(df_list)
年次データを線形補間により月次化する際、本来は年間販売額のような変数は12(ヵ月)で割り月間販売額とする必要がありますが、今回のソースコードではその割り算を省略しています。これは、その後にデータスケーリングの処理を予定しており、スケーリングにて12分割していても、していなくても同じ値となるためです。
データの事前確認
学習器に掛けてモデルを作成する前に、前処理後のデータを確認しておきます。
以下は鹿児島県の例です。

予測対象(目的変数)とする月間転入者数(mig_in)が2008年1月から2013年12月までの間で変化しています。転入者数は毎年4月にピークがある周期性があることが分かります。
下は予測時の入力データ(説明変数)です。入力データはスケーリング(データの分布が平均0、標準偏差1となるよう標準化)されており、例えば2013年2月の月間転入者数の予測には、その1ヵ月前(変数名では「_lag1」で表現した)である2013年1月の全種類のデータを使っています。

年間の周期性として、(前月の)転入者数(mig_in_lag1)、転出者数(mig_out_lag1)、県内移動者数(mig_internal_lag1)は毎年5月にピークがあることが分かります。
労働者平均年齢(wag_age_lag1)は-2から2近くまで大きな変動がありますが、目的変数である転入者数と関係性があるようにはパッと見では分かりません。また、先に挙げた年間周期性がありそうな3つ以外のすべての変数も、同様に目的変数との関係性はこの時点では見えません。これらはすべて元々年次データであったものを月次に疑似化したデータであるため、やはり疑似化したこれらのデータはモデルに有効に寄与しないのではないか、というような懸念を持ちながら、モデル学習に臨みます。
ディープラーニングの実行
学習するネットワーク設計は前回と同じく、隠れ層を2層、そのノード数200個の全結合型ネットワークとして、ディープラーニングを実行します。
下は繰り返し学習(繰り返し数:epochs)の過程にて、評価指標が収束する様子です。

評価指標(縦軸)には平均二乗誤差(Mean Squared Error)を使用しています。年次データ予測とした前回記事では230回の繰り返しで学習が終了しましたが、今回は41回で学習終了しており、5回目ぐらいで収束が限界近くに達しているように見えます。
今回の学習回数が前回より少ない要因として、今回はデータの粒度を年次から月次に変更したことにより1サイクルで学習するデータ件数が増えていること(12倍)が考えられます。
モデルによる予測結果の確認
作成したモデルにより出力される予測結果を見てみます。以下は鹿児島県の例です。実際の転入者数(mig_in)とモデルが予測した転入者数(mig_in_pred)を出力しています。

グラフを全体的に眺めてみると、前月のデータを入力として、今月の転入者数を都道府県ごとに予測するモデルは作ることができているように見えます。
個々の値を詳細に見ると、実際の4月のピークの値に予測値が追従できていないこと(mig_inの最大値:6488に対してmig_in_predの最大値:5263)、時間的に予測値のピークが遅れていること(例えば2013年におけるmig_in_predの最大値:4699は5月であること)など、予測モデルとしての技術的課題があることが分かります。
このようなPoCにおいて、ある程度サービス性が満足できる実現の形が見えてくると、プロジェクトには次にどのようなことが起こるでしょうか。次回は技術的課題への取り組みとして、「時系列データ予測におけるモデルの表現力強化」を事例として紹介します。
