Shikata Ga Nai

Private? There is no such things.

16. 時系列データの基本 〜トレンド・季節性の可視化〜

Hello there, ('ω')ノ

📌 1. 時系列データとは?

時系列データは、時間の流れに沿って記録されたデータ です。
例えば、以下のようなデータがあります。

日付 売上(万円)
2024-01-01 120
2024-01-02 135
2024-01-03 150
2024-01-04 125
2024-01-05 160

時系列データの分析では、以下のようなパターンを見つけることが重要です。

  1. トレンド(Trend):時間とともに増加 or 減少する傾向
  2. 季節性(Seasonality):一定の周期で繰り返すパターン(例:週ごと、月ごと、年ごと)
  3. 周期性(Cyclic):不規則な間隔で発生するパターン(例:景気の変動)
  4. ノイズ(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, (^^ゞ