Pandasで移動平均(Moving Average)を算出する方法について、基礎から応用まで詳しく解説します。
セクションごとにコード例を用意しますので、そのまま実行できます。
移動平均とは?
移動平均(Moving Average)は、一定期間のデータを平均化することで、データの変動を滑らかにし、トレンドを把握しやすくする手法です。
株価や時系列データの分析によく使われます。
基本的な移動平均の計算
Pandasでは rolling()
と mean()
を組み合わせて簡単に移動平均を求められます。
import pandas as pd
# サンプルデータ作成
data = {'value': [10, 20, 30, 40, 50, 60, 70]}
df = pd.DataFrame(data)
# 窓幅3の単純移動平均
df['SMA_3'] = df['value'].rolling(window=3).mean()
print(df)
window=3
は「直近3つのデータの平均」を意味します。
出力例では最初の2行は NaN
になります(3つ揃わないと平均が計算できないため)。
中心化された移動平均(center=True)
通常は「直近のデータ」を基準に平均しますが、center=True
を指定すると、前後のデータを含めた中心化移動平均が計算できます。
df['SMA_3_center'] = df['value'].rolling(window=3, center=True).mean()
print(df)
時系列データを滑らかにする際に便利です。
指数移動平均(Exponential Moving Average, EMA)
過去のデータより直近のデータを重視したい場合は、ewm()
を使います。
# 平滑化係数: span=3
df['EMA_3'] = df['value'].ewm(span=3, adjust=False).mean()
print(df)
span
が小さいほど直近の値に敏感に反応します。
株価分析でよく使われます。
欠損値の扱い(min_periods)
rolling()
ではデフォルトで「window数が揃わないとNaN」になりますが、min_periods
を指定すれば計算できるようになります。
# 窓幅3、最小1データから計算
df['SMA_3_min1'] = df['value'].rolling(window=3, min_periods=1).mean()
print(df)
最初から平均値が計算されるようになり、分析の途切れが減ります。
応用:複数の移動平均を計算して比較
株価や売上データの傾向を把握する際に、短期・中期・長期の移動平均を一度に計算します。
# サンプルデータ(日ごとの売上などを想定)
import numpy as np
df = pd.DataFrame({'value': np.random.randint(50, 150, 30)})
# 短期・中期・長期の移動平均
df['SMA_3'] = df['value'].rolling(window=3).mean()
df['SMA_7'] = df['value'].rolling(window=7).mean()
df['SMA_14'] = df['value'].rolling(window=14).mean()
print(df)
可視化すればトレンドがより見やすくなります。
可視化例(matplotlib)
移動平均はグラフと組み合わせると効果的です。
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
plt.plot(df['value'], label='Original Data')
plt.plot(df['SMA_3'], label='SMA 3')
plt.plot(df['SMA_7'], label='SMA 7')
plt.plot(df['SMA_14'], label='SMA 14')
plt.legend()
plt.show()
折れ線グラフで表示すると、短期の移動平均は細かく追随し、長期の移動平均は大きなトレンドを示すことがわかります。
まとめ
- 基本:
rolling().mean()
で単純移動平均(SMA)が計算可能 - 中心化:
center=True
で前後対称の移動平均 - 指数移動平均:
ewm()
で直近のデータを重視 - 欠損値対策:
min_periods
で柔軟に計算 - 応用: 複数の移動平均を組み合わせてトレンドを分析
以上、PythonのPandasの移動平均を算出する方法についてでした。
最後までお読みいただき、ありがとうございました。