書籍のチャプタータイトルは、「商品の売上を予測しよう」と書いてあります。
しかし、説明と利用しているデータを見ると、カラム名が"visitor"となっていて、売上ではありません。
書籍を読むと、visitor = 来客者数の説明があります。
その結果、記事タイトルは、「来店者数を予測しよう」としました。
目的
・機械学習を行うためのシンプルな流れを理解する
・商品の売上予測するための来店者数予測を、機械学習での方法を学ぶ。
・短時間で、機械学習の処理の流れを理解する。
・アウトプットの目的もあり、コードはほぼ書籍と一緒。
・変数の中身を見てデータの確認をするため
分析の流れ
「実務で役立つ実践Python機械学習入門」翔泳社によると
以下のフェーズの大まかな流れになっていると紹介されています。
ウォーターフォールのような流れではないこともあるようです。
(再掲)
1. データ収集と前処理
2. 探索的データ分析
3. 特徴量エンジニアリング
4. アルゴリズムと評価指標の選定
5. モデル学習・評価
5のモデル学習・評価が終わったらそこで終わりではなく、
1や3、4に戻って繰り返して精度を改善していくことが
繰り返されます。
実行環境
・Google Colaboratory
プログラムの説明
今回紹介されたコードに説明と実行結果を加えて行きたいと思います。
Google Driveとの接続
利用するCSVファイルはGoogleDrive内に保存している。
以下のコードを実行してGoogleDriveとの接続を行う。
# GoogleDriveと接続する
from google.colab import drive
drive.mount('/content/drive')
ライブラリーとファイルの読み込み
# 変更しやすいように、パス名とファイル名の変数を分ける
import pandas as pd
folder_path = '/content/drive/MyDrive/Colab Notebooks/Training/実務で役立つPython機械学習入門/chapter3/3_2'
file_name = 'visitors.csv'
file_path = folder_path + '/'+ file_name
df = pd.read_csv(train_file_path)
df.head()
日付、天気、温度、来客数のデータが入っていることが確認できます。
データのカラム名、データ数、データの型を一覧で調べる場合は、
次のコードを実行すると便利ですね。
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 144 entries, 0 to 143
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 144 non-null object
1 weather 144 non-null object
2 temperature 144 non-null float64
3 visitors 144 non-null int64
dtypes: float64(1), int64(1), object(2)
memory usage: 4.6+ KB
利用するのは、時間を表すデータ、実際の予測したいデータを使います。
ライブラリーのインストール
時系列データ、時系列アルゴリズムを扱うために、Dartsライブラリーをインストールします。
・Darts
https://unit8co.github.io/darts/index.html
# Dartsインストール
!pip install u8darts
また、後半、コードを実行すると、ライブラリーが入っていないことが理由でエラーが起きるので、次のライブラリーもインストールしてください。
・PyTorch Lightning
https://github.com/Lightning-AI/pytorch-lightning
# PyTorch Lightningフレームワーク
!pip install pytorch-lightning
Dartsのライブラリーインポート
from darts.timeseries import TimeSeries
series = TimeSeries.from_dataframe(df, time_col="date", value_cols =["visitors"])
書籍によると、
Dartsを使ってモデルの学習をする場合、PandasのDataFrameではなく、
DartsのTimeSeriesを利用するようです。
データの中身を確認します。
series
DataFrameの時と比べると、表示が異なっていたので、ちょっと調べてみました。
# 一度DataFrameに変換して、info()を実行する
series.to_dataframe().info()
■実行結果
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 144 entries, 2022-08-10 to 2022-12-31
Freq: D
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 visitors 144 non-null float64
dtypes: float64(1)
memory usage: 2.2 KB
dateカラムがDataFrameのときは存在していたが、
TimeSeriesとして処理をすると、カラム名として存在していないようです。
次の処理をしてみました。
# indexを確認する
series.time_index
どうやら、dateのデータはインデックスとして設定されていました。
図で表してみます。
# 描画する
series.plot()
約5か月では、来客者数は上昇傾向のようです。
(※144日分のデータ ÷ 1ヶ月10日として計算すると、4.8ヶ月≒5ヶ月)
機械学習モデルの学習
import pytorch_lightning
from darts.models import ExponentialSmoothing
#モデルの学習
#インスタンス化
model = ExponentialSmoothing()
#モデルの学習
model.fit(series)
■機械学習モデルの評価
import matplotlib.pyplot as plt
prediction = model.predict(36)
series[-72:].plot()
prediction.plot(label="forecast")
plt.legend()
72日分のVisitorsデータと36日分のforecastデータを表示した結果です。
ここで、予測値がどれくらい正しいのか評価していきます。
評価は、クロスバリデーション(交差検証:Cross Validation)
を利用します。
クロスバリデーションは、データを学習用データとテスト用データに分けて評価をする方法です。
■データを分ける
train, test = series[:-36], series[-36:]
データの中身を確認します。
# 学習用データ
train.tail()
■実行結果

テスト用データの日付と近くの値を表示させるため、.tail()を使用する。
# テスト用データ
test.head()
■グラフ表示する。
train.plot(label="training")
test.plot(label="validation")
#インスタンス化
model = ExponentialSmoothing()
model.fit(train)
prediction = model.predict(18) #18期分まで予測
series[-122:].plot()# 直近122期分のみ表示する。
prediction.plot(label="forecast")
plt.legend()
大まかなトレンドは捉えられていると思います。
■評価をする
今回利用する評価指標は、
MAPEを利用します。
MAPEは平均絶対パーセント誤差(MAPE:Mean Absolute Percentage Error)です。
予測値と実測値の相対的な誤差の平均値を表します。
from darts.metrics.metrics import mape
mape = mape(prediction, test)
#小数点以下2位まで表示
print(f"{mape:.2f}")
■実行結果
13.56
この数字は、予測は正解データと比べて、おおむね13.56%程度ずれるということを理解しておく。
機械学習モデルを使った予測
model = ExponentialSmoothing()
model.fit(series)
prediction = model.predict(30) #30日分を予測
series.plot()
prediction.plot(label="forecast")
plt.legend()
参考
■実務で役立つPython機械学習入門
https://amzn.to/4tHQ3J5
■「実務で役立つPython機械学習入門 課題解決のためのデータ分析の基礎」サンプルコード
https://github.com/ml-pg-book/python-business-ml-starter










