[Pythonで機械学習]日本の人口推移の予測というのをやってみた


このエントリーをはてなブックマークに追加

ここからちょっと広告です。

広告は以上です。

機械学習の勉強はじめてからどのくらい経ったかな……いまだに全くわけがわかりません

なにか必要な知識が根本的に足りてないのだと思うのですが、何が足りないのかもわからないという塩梅でして、わからないまま、いつもの「Tellus×TechAcademy 初心者向け Tellus 学習コース」で写経したり戻ったり、はたまた「Pythonではじめる機械学習」という本を買って、分厚いなぁ、開くのダルいなぁ、pdfとかでくれないかなぁ、と思いながら、まだ一度も開いてなかったりしています。

IMG_1609

そんな中、少しはオリジナリティを出そうと、今回は「日本の人口予測」というのをやってみました。

RESAS(地域経済分析システム)の人口推移のデータをダウンロードしてきて、utf-8に変換して、それを読み込ませます。

本当は、2100年くらいまでの人口予測をしたかったのですが、テストデータがない場合にどうやって予測を作るのかわからなかったので(本当に何もわからない)、現状は、以下のようなことをやっています。

  • データがそろっている1960年〜2018年までを対象
  • 2013年までを学習データにして、2014年〜2018年までを予測する
  • 実際の2014年〜2018年までのデータと見比べて、どのくらい予測が当たってたかを確認する

あまりにも意味がなくてモヤりますが、まあ今の地力がこんなもんということで……
もちと勉強したら、今回作った学習データを元に、2200年くらいまでの日本の人口予測を出したいと思います。
あとちょっとだと思うんだけどなー。時間が足りない……

コードは以下の通り。相変わらず「preで空行入れると、以下全部1行空けになってしまう」ので、空行を空けておらず見にくくてすみません……

#必要なライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
%matplotlib inline
#ファイル読み込み
df = pd.read_csv("downloaded_japan_population_utf8.csv")
#ベースとなるデータ作成
df_year = pd.pivot_table(df, index="集計年", values="総人口(人)", aggfunc=sum)
# 1960年から2018年までの東京都の総人口数データを機械学習にかける。
# ある年の総人口数を説明変数X、その翌年の総人口数を目的変数yに設定する
# (Xとyの両方とも、縦59行×横1列のndarrayで作成する)
X = np.empty((59, 1), dtype=np.uint32)
y = np.empty((59, 1), dtype=np.uint32)
#配列に人口を入れていく
for i in range(59):
    X[i, 0] = df_year.iloc[i, 0]
    y[i, 0] = df_year.iloc[i+1, 0]
#1960年から2012年までを訓練データ
#2013年から2018年までをテストデータとして分割する
X_train = X[:53]
X_test = X[53:]
y_train = y[:53]
y_test = y[53:]
#線形回帰モデルの作成と学習の実行
model = LinearRegression()
model.fit(X_train, y_train)
#テストデータで「翌年の総人口」予測の実施
y_pred = model.predict(X_test)
#予測値が実数値のため、整数値に変換
y_pred = y_pred.astype(np.uint32)
#正解値とグラフで比較するため
#実数値と予測値の連結させた配列を作成
y_pred_gr = np.concatenate([y_train, y_pred])
#正解値と予測値のグラフ表示
plt.plot(range(59), y_pred_gr, label="Predicted", color="red")
plt.plot(range(59), y, label="Actual", color="blue")
plt.xlabel("Years")
plt.ylabel("Popuration")
plt.title("Japan's population")
plt.grid(True)
plt.legend(loc = "upper left")

Japanpopulation20200620

最後のグラフが結果でございます。
赤が予測。青が実数。

今はそれほど間違ってないのですが、100年くらい経つと大きな間違いが出てきそうな学習データかな……と思いました。

RESASのデータには、2020年から2045年までの、5年ごとの予測データが入っているので、僕の作った学習データと照らし合わせて、どのくらいRESASに迫っているか確かめたい……です。いつの日か。

どうやってやるんだろう? とりあえず頑張ります。

Ads by Google

コメント

コメントは、Twitterやはてブに、以下のボタンから本記事のアドレスつきでツイート/ブクマしていただくと、上にあるzenbackのウィジェットに反映されます。
  このエントリーをはてなブックマークに追加
または同ウィジェット内のFacebookコメントでお願いしますー。

Facebookのシェアは……されても誰だかわからないのですが、シェア自体は嬉しいので、下にボタンを置かせていただきます。よろしくお願いします。