時系列データの機械学習入門【製造業での需要予測に使える手法】

時系列データの機械学習入門【製造業での需要予測に使える手法】 AIツール・レビュー

はじめに

「時系列データ」とは、時間の順序に沿って記録されたデータのことです。売上・気温・センサー値・株価など、日常的にあふれています。製造業では生産量・不良率・在庫数など、時系列データを扱う場面が非常に多いです。

僕が製造業でデータ分析を担当している中で、時系列予測には特別な配慮が必要だと学びました。普通の機械学習とは少し違う考え方が必要です。この記事では時系列データの機械学習を、基礎から実装まで解説します。

時系列データの特徴

時系列データには、通常のデータにはない特徴があります。

  • 自己相関:過去の値が将来に影響する(昨日の売上は今日の売上と関連する)
  • トレンド:長期的な増加・減少の傾向
  • 季節性:月・曜日・年間サイクルで繰り返すパターン
  • 外れ値:機器故障・祝日などによる突発的な変動

時系列特有の注意点

シャッフルしてはいけない

通常のtrain_test_splitにはshuffleオプションがありますが、時系列データでは必ずFalseにします。未来のデータで過去を予測するという「データリーク」が発生するためです。

from sklearn.model_selection import train_test_split

# 時系列データでは時間順に分割
train_size = int(len(df) * 0.8)
train = df[:train_size]
test = df[train_size:]

# または
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)

特徴量の作り方

ラグ特徴量(過去の値を特徴量にする)

import pandas as pd
import numpy as np

df = pd.read_csv('sales.csv', parse_dates=['date'], index_col='date')

# ラグ特徴量
df['sales_lag1'] = df['sales'].shift(1)   # 1日前
df['sales_lag7'] = df['sales'].shift(7)   # 1週間前
df['sales_lag30'] = df['sales'].shift(30) # 1ヶ月前

移動平均

df['rolling_mean_7'] = df['sales'].rolling(window=7).mean()
df['rolling_std_7'] = df['sales'].rolling(window=7).std()
df['rolling_max_7'] = df['sales'].rolling(window=7).max()

時間特徴量

df['month'] = df.index.month
df['day_of_week'] = df.index.dayofweek
df['quarter'] = df.index.quarter
df['is_weekend'] = (df.index.dayofweek >= 5).astype(int)

# 周期性を三角関数でエンコード(月の周期性)
df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)

LightGBMでの時系列予測

import lightgbm as lgb
from sklearn.metrics import mean_absolute_error

# 特徴量とターゲットの準備
feature_cols = ['sales_lag1', 'sales_lag7', 'rolling_mean_7',
                'month', 'day_of_week', 'is_weekend']

df = df.dropna()  # ラグ特徴量の欠損値を除去

train = df[:'2024-12-31']
test = df['2025-01-01':]

X_train = train[feature_cols]
y_train = train['sales']
X_test = test[feature_cols]
y_test = test['sales']

# 学習
model = lgb.LGBMRegressor(
    n_estimators=1000,
    learning_rate=0.05,
    num_leaves=31,
    random_state=42
)
model.fit(
    X_train, y_train,
    eval_set=[(X_test, y_test)],
    callbacks=[lgb.early_stopping(50)]
)

y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f"MAE: {mae:.2f}")

Prophetを使った時系列予測

Facebookが開発したProphetは、時系列予測に特化したライブラリです。季節性・祝日・トレンドの変化点を自動で検出してくれます。コードが少なく、非エンジニアでも使いやすいのが特徴です。

from prophet import Prophet

# Prophetはds(日付)とy(目的変数)の列名が必要
df_prophet = df[['date', 'sales']].rename(columns={'date': 'ds', 'sales': 'y'})

model = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=True,
    daily_seasonality=False
)
model.fit(df_prophet)

# 未来の予測
future = model.make_future_dataframe(periods=30)  # 30日先を予測
forecast = model.predict(future)

# 可視化
model.plot(forecast)

まとめ

時系列の機械学習で押さえるべきポイントをまとめます。

  • データは時間順に分割する(シャッフルしない)
  • ラグ特徴量・移動平均・時間特徴量が基本
  • LightGBMは時系列予測で高精度・高速
  • Prophetは手軽に季節性・祝日を考慮できる

製造業でのセンサーデータ・生産量・品質データなど、時系列で記録されているデータは多いです。まずはラグ特徴量を作ってLightGBMで試してみることから始めてみてください。

💼 ITエンジニア転職特化

自分らしく働けるエンジニア転職を目指すなら【strategy career】

年収1000万・残業月30時間以下・リモート可の求人多数

💼 無料で転職相談する →

※アフィリエイト広告を含みます

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました