Pandasでデータの「変化」を捉える!diffとpct_change徹底解説


 

Pandasで時系列データや数値データを扱う際、ある時点から次の時点への「変化」を分析したい場面はよくあります。そんな時に役立つのが、**diffpct_change**メソッドです。これらは、行や列の差分、変化率を簡単に計算するための強力なツールです。本記事では、それぞれのメソッドの基本的な使い方から応用例まで、分かりやすく解説します。


 

データの差分と変化率とは?

 

 

差分 (diff)

 

差分とは、現在の値とN個前の値との「数値的な差」を指します。例えば、日々の株価の差分を取れば、前日からの値上がり・値下がり額を把握できます。

 

変化率 (pct_change)

 

変化率とは、現在の値とN個前の値との「相対的な変化の割合」を指します。パーセンテージで表現されることが多く、株価の変化率であれば、前日比何%増減したかを示します。これにより、異なるスケールのデータの変化を比較しやすくなります。


 

Pandas diffメソッドで数値の「差分」を計算

 

diffメソッドは、SeriesまたはDataFrameの要素間の差分を計算します。

 

基本的な使い方:1つ前の行との差分

 

まずは、最も一般的な使い方である「1つ前の行との差分」を見てみましょう。

Python
 
import pandas as pd
import numpy as np

# サンプルSeriesの作成
s = pd.Series([10, 12, 15, 11, 18, 20])
print("元のSeries:\n", s)

# 1つ前の要素との差分を計算
s_diff = s.diff()
print("\n差分 (diff):\n", s_diff)

最初の要素は比較対象がないためNaNとなります。

 

periods引数: 比較する要素の間隔を指定

 

periods引数を使用すると、何個前の要素と比較するかを指定できます。デフォルトは1です。

Python
 
# 2つ前の要素との差分を計算
s_diff_2 = s.diff(periods=2)
print("\n2つ前の要素との差分 (diff(periods=2)):\n", s_diff_2)

 

DataFrameでのdiff:行方向・列方向の差分

 

DataFrameの場合、デフォルトでは行方向(インデックス方向)に差分を計算します。axis引数を使うことで、列方向の差分も計算できます。

Python
 
# サンプルDataFrameの作成
df = pd.DataFrame({
    'A': [10, 20, 30],
    'B': [5, 12, 18]
})
print("元のDataFrame:\n", df)

# 行方向の差分 (デフォルト)
df_diff_row = df.diff()
print("\n行方向の差分 (df.diff()):\n", df_diff_row)

# 列方向の差分
df_diff_col = df.diff(axis=1)
print("\n列方向の差分 (df.diff(axis=1)):\n", df_diff_col)

 

Pandas pct_changeメソッドでデータの「変化率」を計算

 

pct_changeメソッドは、SeriesまたはDataFrameの要素間の変化率を計算します。結果は小数で返され、%表示にする場合は100を掛けます。

 

基本的な使い方:1つ前の行との変化率

 

基本的な使い方はdiffと似ています。

Python
 
# 元のSeriesを使用
# s = pd.Series([10, 12, 15, 11, 18, 20])

# 1つ前の要素との変化率を計算
s_pct_change = s.pct_change()
print("\n変化率 (pct_change):\n", s_pct_change)

# %表示に変換
s_pct_change_percent = s.pct_change() * 100
print("\n変化率 (%表示):\n", s_pct_change_percent)

diffと同様に、最初の要素は比較対象がないためNaNとなります。

 

periods引数: 比較する要素の間隔を指定

 

diffと同様に、periods引数で比較する要素の間隔を指定できます。

Python
 
# 2つ前の要素との変化率を計算
s_pct_change_2 = s.pct_change(periods=2)
print("\n2つ前の要素との変化率 (pct_change(periods=2)):\n", s_pct_change_2)

 

DataFrameでのpct_change:行方向・列方向の変化率

 

DataFrameの場合も、デフォルトでは行方向に変化率を計算します。axis引数で列方向を指定できます。

Python
 
# 元のDataFrameを使用
# df = pd.DataFrame({
#     'A': [10, 20, 30],
#     'B': [5, 12, 18]
# })

# 行方向の変化率 (デフォルト)
df_pct_change_row = df.pct_change()
print("\n行方向の変化率 (df.pct_change()):\n", df_pct_change_row)

# 列方向の変化率
df_pct_change_col = df.pct_change(axis=1)
print("\n列方向の変化率 (df.pct_change(axis=1)):\n", df_pct_change_col)

 

diffpct_changeの使い分けと応用例

 

 

使い分けのポイント

 

  • diff: 絶対的な増減量を知りたい場合。

    • 例: 「昨日の売上から今日は1000円増えた」「気温が前日より3度上がった」

  • pct_change: 相対的な増減割合を知りたい場合。異なるスケールのデータを比較するのに適しています。

    • 例: 「この株は昨日から5%上昇した」「A商品の売上が20%増えた一方で、B商品は3%しか増えなかった」

 

応用例

 

 

株価分析 📈

 

日々の株価データから日次リターン(収益率)を計算する際にpct_changeは不可欠です。

Python
 
# 株価データの例
stock_prices = pd.Series([100, 102, 101, 105, 103, 108])
daily_returns = stock_prices.pct_change() * 100 # 日次リターンを%で表示
print("\n株価の日次リターン (%):\n", daily_returns)

 

売上データ分析 📊

 

月ごとの売上データの前月比増減を分析する際にdiffpct_changeが役立ちます。

Python
 
# 月次売上データの例
monthly_sales = pd.Series([500, 520, 480, 550, 600],
                          index=pd.to_datetime(['2024-01', '2024-02', '2024-03', '2024-04', '2024-05']))
monthly_sales_diff = monthly_sales.diff()
monthly_sales_pct_change = monthly_sales.pct_change() * 100
print("\n月次売上データ:\n", monthly_sales)
print("\n月次売上の差分:\n", monthly_sales_diff)
print("\n月次売上の変化率 (%):\n", monthly_sales_pct_change)

 

まとめ

 

Pandasの**diffpct_change**メソッドは、データの時間的・空間的な変化を分析するための基本的ながら非常に強力なツールです。

  • diff(): 要素間の絶対的な差分を計算します。

  • pct_change(): 要素間の相対的な変化率を計算します。

  • どちらもperiods引数で比較する間隔を、DataFrameではaxis引数で行・列方向を指定できます。

これらのメソッドを使いこなすことで、時系列データの傾向分析やビジネス指標の変動把握が格段に容易になります。ぜひ、ご自身のデータで活用してみてください。