見出し画像

【Goal設定】やりたいこと #09:データ分析はある程度極めたい

Aidemy(アイデミー)で勉強する

データに触れることが仕事柄多く、データ分析について常々勉強したいと考えていました。学校探しで重要視したのは「自分の好きな時間」に勉強できること。決まった曜日の決まった時間に受講するのはおそらく無理。今回は自分に合いそうなAidemyのデータ分析講座を受講することにしました。

Aidemyは好きな時間にオンラインで学ぶ形式。独学が好きな人や時間が不規則になりがちなサラリーマンに向いていると思います。また、自分のPCに開発環境を構築しなくても学習ができるため、その点もすごく良かったです。

Python、機械学習、ディープラーニング、自然言語処理、感情分析・株価予測など、実に多くのことを学びましたが、その中で「これ、すぐに仕事で使えるじゃん!」というものがありました。

時系列データ解析で将来を予測する

働いていると、今後この数字がどうなるだろうか、と予測したくなることが頻繁にあります。データのトレンドより頭の中では何となくイメージできるけど、実際に表現する術を知らない。

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

# --- Data Load + Preparation ---
df = pd.read_csv("./F_Weight.csv")
df['Date'] = pd.to_datetime(df['Date'])
df = df.drop(columns=['曜日', '腹痛', '頭痛', '血圧・上', '血圧・下', '睡眠6H以上', '朝食', '昼食', '夕食', '運動歩数'])

index = pd.date_range("2018-01-29","2021-09-30",freq="D")
df.index = index
del df["Date"]

# --- Modeling + Prediction ---
SARIMA_df = sm.tsa.statespace.SARIMAX(df,order=(0, 1, 1),seasonal_order=(0, 1, 1, 24), enforce_stationarity = True, enforce_invertibility = True).fit()
pred = SARIMA_df.predict("2020-09-30", "2022-12-31")

# --- Visualization ---
plt.rcParams["figure.figsize"] = (20, 16)
plt.plot(df)
plt.plot(pred, color="r")
plt.show()

# --- SARIMA info ---
SARIMA_df.summary()

このコードは何をしているかと言うと、2018年から記録している体重データから、今後2022年末までの体重予測をしています。たったこれだけのコードで実現できる。これってかなりすごいことだと思います。
実行結果は以下のグラフ。

画像2

2018年は74キロ以上あったらしい。恥ずかしい。。。
それはさておき、赤い線が将来予測。確かに下降トレンドなのでこのようになりそうですがちょっと見づらい。日次ベースのデータをそのまま使ったのが原因かも。これを毎月の平均値を使う方法に変えてみます。

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

# --- Data Load + Preparation ---
df = pd.read_csv("./F_Weight.csv")
df['Date'] = pd.to_datetime(df['Date'])
df = df.drop(columns=['曜日', '腹痛', '頭痛', '血圧・上', '血圧・下', '睡眠6H以上', '朝食', '昼食', '夕食', '運動歩数'])

index = pd.date_range("2018-01-29","2021-09-30",freq="D")
df.index = index
del df["Date"]
df = df.resample('M').mean()

# --- Modeling + Prediction ---
SARIMA_df = sm.tsa.statespace.SARIMAX(df,order=(0, 1, 1),seasonal_order=(0, 1, 1, 6), enforce_stationarity = False, enforce_invertibility = False).fit()
pred = SARIMA_df.predict("2020-09-30", "2022-12-31")

# --- Visualization ---
plt.rcParams["figure.figsize"] = (20, 16)
plt.plot(df)
plt.plot(pred, color="r")
plt.show()

# --- SARIMA info ---
SARIMA_df.summary()

先程のコードとの違いは、[Data Load + Preparation]の最終行に
 df = df.resample('M').mean()
を追加して毎月の平均を求めただけ。その結果が以下のグラフ。こちらの方が良いですね。

画像2

課題がある!

課題①は体重の将来予測にSARIMAモデルを使うことが正しかったのか、という根本的なこと。SARIMAとは、Seasonal AutoRegressive Integrated Moving Averageの略で時系列データを解析する手法ですが、体重は永遠に減るわけではないし、作ってみるとイマイチ納得感がない。うーん、この課題はもっと勉強してから回答を出したいと思います。

課題②は技術的な話。今回、SARIMAの[order]と[seasonal order]のパラメータはちょっとだけ適当です。本当は最適なパラメーターを探すべきですが、パラメータの数値を多少変えてもグラフに違いが出なかったため、この点を追求しませんでした。パラメータについてもっと勉強するつもりです。

課題③は数学の話。機械学習は数学の知識が必須です。数学は得意だったつもりでしたが完全に錆びついていました。特に機械学習で使用する数学については勉強し直しです。

このような課題はあるものの、ほんの10行程度のコードで将来予測のグラフを作れるようになりました。活用場面は多々あります。今回の学びは自分にとって大きな成長だったと言えます。

Goal設定

データ分析と言っても幅広いです。どこまで勉強しても限度がありません。とは言え、ここまでやったらもういいか、というゴールは欲しい。ということで多少曖昧にゴールを設定してみます。

データ分析コンペティションで良い成績を収める

現在は様々なコンペがあるため、これらにチャレンジしてみます。
kaggle
Nishika
Signate
良い成績ってなんだ??
いずれこのことを定義しないといけませんが、まずはコンペに参加して自分の実力を把握しないと。どのような成績になるか、お楽しみに!

(おわり)

この記事が気に入ったらサポートをしてみませんか?