【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で累積和を計算する

 

Python
 
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)

解説:

  1. s_daily_sales.cumsum(): s_daily_salesの各要素に対して、その位置までの合計値を計算します。

  2. 例: Day1100Day2100 + 120 = 220Day3220 + 90 = 310となります。

 

DataFrameで累積和を計算する

 

DataFrameに対してcumsum()を適用すると、デフォルトで列ごとaxis=0)に累積和が計算されます。

Python
 
# サンプル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を指定します。

Python
 
# 行ごとの累積売上を計算
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の各要素に対して、それまでの要素の積を順次計算します。投資リターンの計算などによく用いられます。

Python
 
# サンプル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の各要素に対して、それまでの要素の中で最も大きい値を順次追跡します。

Python
 
# サンプル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の各要素に対して、それまでの要素の中で最も小さい値を順次追跡します。

Python
 
# サンプル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になります。

Python
 
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(): 最小値の累積。

これらの機能を活用し、あなたのデータから「時間とともに何がどう変化してきたか」という貴重な洞察を素早く引き出しましょう。