Hello there, ('ω')ノ
📌 1. 時系列データとは?
時系列データは、時間の流れに沿って記録されたデータ です。
例えば、以下のようなデータがあります。
日付 | 売上(万円) |
---|---|
2024-01-01 | 120 |
2024-01-02 | 135 |
2024-01-03 | 150 |
2024-01-04 | 125 |
2024-01-05 | 160 |
時系列データの分析では、以下のようなパターンを見つけることが重要です。
- トレンド(Trend):時間とともに増加 or 減少する傾向
- 季節性(Seasonality):一定の周期で繰り返すパターン(例:週ごと、月ごと、年ごと)
- 周期性(Cyclic):不規則な間隔で発生するパターン(例:景気の変動)
- ノイズ(Noise):ランダムな変動
➡ これらの要素を分解することで、時系列データの構造を理解し、予測に活かすことができる!
📌 2. 時系列データの読み込み
まずは、pandasを使って時系列データを読み込みます。
✅ データの準備
import pandas as pd # 仮の時系列データを作成 data = { "Date": pd.date_range(start="2024-01-01", periods=30, freq="D"), "Sales": [120, 135, 150, 125, 160, 180, 200, 190, 210, 220, 230, 210, 220, 240, 250, 260, 280, 270, 290, 300, 310, 320, 330, 310, 300, 280, 270, 260, 250, 240] } df = pd.DataFrame(data) # 日付をインデックスに設定 df.set_index("Date", inplace=True) # データの表示 print(df.head())
✅ ポイント
pd.date_range()
を使って日付データを作成set_index("Date")
で 日付をインデックスに設定Sales
は売上データ(例)
📌 3. 時系列データの可視化
まずは、データの傾向を確認するために、折れ線グラフを作成します。
✅ 売上データの推移を可視化
import matplotlib.pyplot as plt import japanize_matplotlib # ← 追加(matplotlibで日本語対応) plt.figure(figsize=(10,5)) plt.plot(df.index, df["Sales"], marker="o", linestyle="-", color="b") plt.xlabel("Date") plt.ylabel("Sales (万円)") plt.title("日別売上の推移") plt.grid() plt.show()
🔍 チェックポイント
- 売上が全体的に増加している → トレンドがある!
- 一定の間隔で変動が見られる → 季節性がある可能性!
📌 4. トレンドを抽出する
トレンドとは、データが時間とともに上昇 or 下降する傾向のことです。
移動平均(Moving Average) を使って、トレンドを滑らかに可視化できます。
✅ 移動平均(Rolling Mean)を計算
# 7日間の移動平均を計算 df["Moving_Avg"] = df["Sales"].rolling(window=7).mean() # グラフ描画 plt.figure(figsize=(10,5)) plt.plot(df.index, df["Sales"], label="Sales", linestyle="-", marker="o", color="b") plt.plot(df.index, df["Moving_Avg"], label="7-day Moving Avg", linestyle="-", color="r") plt.xlabel("Date") plt.ylabel("Sales (万円)") plt.title("売上のトレンド(7日間移動平均)") plt.legend() plt.grid() plt.show()
🔍 チェックポイント
- 青の折れ線が 元のデータ
- 赤の折れ線が 7日間の移動平均(トレンド)
- 移動平均を使うと、ノイズを除去し、全体的な傾向が見やすくなる!
📌 5. 季節性を分析する
季節性(Seasonality) とは、一定の周期で繰り返されるパターンのことです。
✅ 季節性を可視化
曜日ごとの売上平均を計算し、傾向を探ります。
# 曜日ごとの平均売上を計算(0: 月曜日, 6: 日曜日) df["DayOfWeek"] = df.index.dayofweek weekly_avg = df.groupby("DayOfWeek")["Sales"].mean() # グラフ描画 plt.figure(figsize=(8,5)) plt.bar(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], weekly_avg, color="c") plt.xlabel("Day of Week") plt.ylabel("Average Sales (万円)") plt.title("曜日ごとの売上平均") plt.grid() plt.show()
🔍 チェックポイント
- 週末(土日)の売上が高い → 消費パターンが反映されている可能性
- 平日は低め → ビジネスモデルの影響?
➡ 曜日ごとの売上の違いを分析し、ビジネス戦略に活用!
📌 6. トレンド・季節性・ノイズを分解
時系列データを、トレンド(Trend)・季節性(Seasonality)・ノイズ(Residual) に分解することもできます。
✅ statsmodels を使った分解
from statsmodels.tsa.seasonal import seasonal_decompose # データを分解 decomposed = seasonal_decompose(df["Sales"], model="additive", period=7) # 分解したデータをプロット plt.figure(figsize=(10,8)) plt.subplot(3,1,1) plt.plot(decomposed.trend, label="Trend") plt.legend() plt.subplot(3,1,2) plt.plot(decomposed.seasonal, label="Seasonality") plt.legend() plt.subplot(3,1,3) plt.plot(decomposed.resid, label="Residual") plt.legend() plt.show()
🔍 結果の解釈
- Trend(トレンド): 長期的な増加 or 減少傾向
- Seasonality(季節性): 一定の周期で繰り返すパターン
- Residual(ノイズ): ランダムな変動
🎯 まとめ
✅ 時系列データの特徴(トレンド・季節性・ノイズ)を理解しよう!
✅ 移動平均や曜日ごとの売上分析でパターンを見つけよう!
✅ トレンドと季節性を分解することで、データの構造を把握しやすくなる!
Best regards, (^^ゞ