【Pandas累積計算】cumsum(), cumprod(), cummax(), cummin()で系列データの変化を追跡 📈
データ分析において、時間の経過や特定の順序に沿ったデータの累積的な変化を追跡することは非常に重要です。例えば、「日ごとの売上の合計が月末までにどれくらいになるか」や「投資のリターンが時間とともにどう増えていくか」といった情報を把握する際に、累積計算は欠かせません。
Pandasは、SeriesやDataFrameの数値データに対して、累積和(Cumulative Sum)、累積積(Cumulative Product)、累積最大値(Cumulative Maximum)、累積最小値(Cumulative Minimum)を効率的に計算するための便利なメソッドを提供しています。具体的には、cumsum()
, cumprod()
, cummax()
, **cummin()
**といった関数です。この記事では、これらのメソッドの基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。
累積計算とは?なぜ系列データの変化追跡が必要なのか?
累積計算とは、データの系列(Series)において、ある時点までの値の合計、積、最大値、最小値などを順次計算していくことです。
なぜデータ分析で累積的な変化の追跡が必要なのでしょうか?
トレンドの把握: 売上やアクセス数などの日次・月次データを累積することで、長期的なトレンドや成長を視覚的に把握できます。
進捗状況の確認: プロジェクトの進捗、予算消化状況、キャンペーンの目標達成度などを累積値で確認できます。
リスク・リターン分析: 投資ポートフォリオの累積リターンや、最大ドローダウン(累積最大値からの最大下落率)などを計算する際に利用されます。
異常値の特定: 累積グラフの急激な変化から、予期せぬイベントやデータの異常を特定する手がかりになります。
順位付けや相対比較: 累積比率などを用いることで、各要素が全体に占める累積的な貢献度を評価できます。
1. 累積和: cumsum()
cumsum()
メソッドは、SeriesまたはDataFrameの各要素に対して、それまでの要素の合計値を順次計算します。
Seriesで累積和を計算する
import pandas as pd
import numpy as np
# サンプルSeriesの作成 (日次売上)
s_daily_sales = pd.Series([100, 120, 90, 150, 110],
index=['Day1', 'Day2', 'Day3', 'Day4', 'Day5'])
print("元のSeries (日次売上):\n", s_daily_sales)
# 累積和を計算
s_cumulative_sales = s_daily_sales.cumsum()
print("\n累積売上:\n", s_cumulative_sales)
解説:
s_daily_sales.cumsum()
:s_daily_sales
の各要素に対して、その位置までの合計値を計算します。例:
Day1
は100
、Day2
は100 + 120 = 220
、Day3
は220 + 90 = 310
となります。
DataFrameで累積和を計算する
DataFrameに対してcumsum()
を適用すると、デフォルトで列ごと(axis=0
)に累積和が計算されます。
# サンプルDataFrameの作成 (支店別日次売上)
df_daily_sales = pd.DataFrame({
'東京': [100, 150, 80, 200, 120],
'大阪': [110, 160, 90, 180, 130]
}, index=['Day1', 'Day2', 'Day3', 'Day4', 'Day5'])
print("\n元のDataFrame (支店別日次売上):\n", df_daily_sales)
# 列ごとの累積売上を計算
df_cumulative_sales_col = df_daily_sales.cumsum()
print("\n列ごとの累積売上:\n", df_cumulative_sales_col)
解説:
df_daily_sales.cumsum()は、各列(’東京’, ‘大阪’)ごとに独立して累積和を計算します。
行ごとの累積和を計算 (axis=1
)
各行(例: 各日)において、列方向(例: 東京と大阪の合計)の累積和を計算したい場合はaxis=1
を指定します。
# 行ごとの累積売上を計算
df_cumulative_sales_row = df_daily_sales.cumsum(axis=1)
print("\n行ごとの累積売上:\n", df_cumulative_sales_row)
解説:
df_daily_sales.cumsum(axis=1)は、各行において左から右へ累積和を計算します。例えばDay1では、東京が100、大阪が100+110=210となります。
2. 累積積: cumprod()
cumprod()
メソッドは、SeriesまたはDataFrameの各要素に対して、それまでの要素の積を順次計算します。投資リターンの計算などによく用いられます。
# サンプルSeriesの作成 (日次リターン)
s_daily_returns = pd.Series([1.01, 1.005, 0.99, 1.02]) # 1%増、0.5%増、1%減、2%増
print("\n元のSeries (日次リターン):\n", s_daily_returns)
# 累積リターンを計算
s_cumulative_returns = s_daily_returns.cumprod()
print("\n累積リターン:\n", s_cumulative_returns)
解説:
s_daily_returns.cumprod(): 各要素までの積を計算します。1.01、1.01 * 1.005、1.01 * 1.005 * 0.99といった具合に計算されます。
3. 累積最大値: cummax()
cummax()
メソッドは、SeriesまたはDataFrameの各要素に対して、それまでの要素の中で最も大きい値を順次追跡します。
# サンプルSeriesの作成 (株価)
s_stock_price = pd.Series([100, 105, 98, 110, 102, 115])
print("\n元のSeries (株価):\n", s_stock_price)
# 累積最大値を計算 (高値更新を追跡)
s_cumulative_max_price = s_stock_price.cummax()
print("\n累積最大株価:\n", s_cumulative_max_price)
解説:
s_stock_price.cummax(): その時点までの最大値を保持し続けます。例えば、98の時点でも最大値は前の105が維持されますが、110の時点では110に更新されます。
4. 累積最小値: cummin()
cummin()
メソッドは、SeriesまたはDataFrameの各要素に対して、それまでの要素の中で最も小さい値を順次追跡します。
# サンプルSeriesの作成 (気温)
s_temperature = pd.Series([25, 22, 28, 20, 23, 18])
print("\n元のSeries (気温):\n", s_temperature)
# 累積最小値を計算 (最低気温更新を追跡)
s_cumulative_min_temp = s_temperature.cummin()
print("\n累積最低気温:\n", s_cumulative_min_temp)
解説:
s_temperature.cummin(): その時点までの最小値を保持し続けます。例えば、28の時点でも最小値は前の22が維持されますが、20の時点では20に、18の時点では18に更新されます。
5. 欠損値(NaN)の扱い
これら全ての累積計算メソッドは、デフォルトで欠損値(NaN)を無視して計算を進めます。skipna=False
を設定すると、NaNに出会った時点でそれ以降の累積値もNaNになります。
s_nan_data = pd.Series([10, 20, np.nan, 30, 40])
print("\nNaNを含むSeries:\n", s_nan_data)
print("\nNaNを無視した累積和 (デフォルト):\n", s_nan_data.cumsum())
print("\nNaNを考慮した累積和 (skipna=False):\n", s_nan_data.cumsum(skipna=False))
解説:
skipna=True
(デフォルト): NaNをスキップし、有効な数値だけを対象に計算を継続します。skipna=False
: NaNに遭遇すると、それ以降の累積値もNaNになります。
まとめ
Pandasのcumsum()
, cumprod()
, cummax()
, cummin()
メソッドは、SeriesやDataFrameの数値データに対して、累積的な変化を効率的に追跡するための非常に強力なツールです。これらの関数を使いこなすことで、時系列データのトレンド分析、パフォーマンス追跡、最大/最小値の動的な把握など、多岐にわたるデータ分析のニーズに対応できます。
cumsum()
: 合計の累積。cumprod()
: 積の累積。cummax()
: 最大値の累積。cummin()
: 最小値の累積。
これらの機能を活用し、あなたのデータから「時間とともに何がどう変化してきたか」という貴重な洞察を素早く引き出しましょう。