はじめに
「時系列データ」とは、時間の順序に沿って記録されたデータのことです。売上・気温・センサー値・株価など、日常的にあふれています。製造業では生産量・不良率・在庫数など、時系列データを扱う場面が非常に多いです。
僕が製造業でデータ分析を担当している中で、時系列予測には特別な配慮が必要だと学びました。普通の機械学習とは少し違う考え方が必要です。この記事では時系列データの機械学習を、基礎から実装まで解説します。
時系列データの特徴
時系列データには、通常のデータにはない特徴があります。
- 自己相関:過去の値が将来に影響する(昨日の売上は今日の売上と関連する)
- トレンド:長期的な増加・減少の傾向
- 季節性:月・曜日・年間サイクルで繰り返すパターン
- 外れ値:機器故障・祝日などによる突発的な変動
時系列特有の注意点
シャッフルしてはいけない
通常の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時間以下・リモート可の求人多数
※アフィリエイト広告を含みます
![]()
※本記事にはアフィリエイトリンクが含まれます。


コメント