【Pandasデータ補間】欠損値NaNを前後の値で賢く埋めるinterpolateメソッド徹底解説 📈
データ分析において、欠損値(NaN)の存在は避けられない課題です。特に時系列データなど、値の順序に意味がある場合、NaNを単に削除したり固定値で埋めたりすると、データの持つ連続性やトレンドが失われてしまう可能性があります。Pandasの**interpolateメソッドは、このような欠損値を前後の値から推測して補間**するための強力な機能です。この記事では、interpolateの基本的な使い方から、知っておくと便利な補間方法まで、短いサンプルコードと丁寧な解説を交えてご紹介します。
interpolateメソッドとは?なぜ時系列データで重要なのか?
interpolateメソッドは、PandasのDataFrameやSeriesに存在する欠損値(NaNなど)を、その前後の有効な値に基づいて「補間」(推測して埋める)するために使用されます。
特に時系列データでは、以下のような理由でinterpolateが重要になります。
-
データの連続性維持: 株価、気温、センサーデータなど、時間とともに連続的に変化するデータにおいて、欠損値を補間することでデータの自然な流れを保てます。
-
トレンドの維持: 欠損値があっても、前後の値から補間することで、データ全体のトレンドや季節性を維持しやすくなります。
-
分析精度の向上: 欠損値が原因で分析結果が不正確になるのを防ぎ、より信頼性の高い予測や洞察を可能にします。
interpolateの基本的な使い方
まずは、interpolateメソッドの最も基本的な使い方を見ていきましょう。
線形補間(デフォルト)
interpolateメソッドは、デフォルトで線形補間(linear interpolation)を行います。これは、欠損値の前後の値を用いて、直線的に値を埋める方法です。
import pandas as pd
import numpy as np
# サンプルSeriesの作成
s = pd.Series([1, 2, np.nan, 4, 5])
print("オリジナルSeries:\n", s)
# 線形補間
s_interpolated = s.interpolate()
print("\n線形補間後Series:\n", s_interpolated)
解説:
インデックス2のnp.nanは、その前の値2と後ろの値4の中間である3.0で補間されています。interpolate()のmethod引数を省略した場合、デフォルトで’linear’が適用されます。
interpolateの様々な補間方法
interpolateメソッドは、method引数に様々な値を指定することで、線形補間以外の多様な補間方法をサポートしています。
method='nearest' (最近傍補間)
欠損値に最も近い有効な値で補間します。
s_nearest = pd.Series([1, 2, np.nan, 4, 5])
# 最近傍補間
s_interpolated_nearest = s_nearest.interpolate(method='nearest')
print("\n最近傍補間後Series:\n", s_interpolated_nearest)
解説:
インデックス2のnp.nanは、前後で値が等距離にあるため、デフォルトでは次の値(4)で補間されます。
method='polynomial' (多項式補間)
指定した次数(order)の多項式でデータをフィットさせ、欠損値を補間します。データのカーブに沿った補間が可能です。
s_poly = pd.Series([1, 4, np.nan, 16, 25]) # x^2の様なデータ
# 多項式補間 (2次)
s_interpolated_poly = s_poly.interpolate(method='polynomial', order=2)
print("\n多項式補間 (order=2) 後Series:\n", s_interpolated_poly)
解説:
データがx2のような二次関数的な傾向を持つ場合、order=2を指定することでより自然な補間が行われます。ここではnp.nanが9.0で埋められ、32に近い値になっています。
method='spline' (スプライン補間)
指定した次数(order)のスプライン関数を使って、滑らかな曲線で欠損値を補間します。多項式補間よりも滑らかな補間が必要な場合に利用されます。
s_spline = pd.Series([1, 2, np.nan, 4, 5, np.nan, 7])
# スプライン補間 (3次)
s_interpolated_spline = s_spline.interpolate(method='spline', order=3)
print("\nスプライン補間 (order=3) 後Series:\n", s_interpolated_spline)
解説:
order=3でより滑らかな補間が行われます。線形補間よりも複雑なデータのパターンを捉えるのに適しています。
limit引数とlimit_direction引数
補間を行う範囲や方向を制限したい場合に便利です。
limit引数: 連続するNaNの補間数
limit引数は、連続するNaNのうち、いくつのNaNを補間するかを指定します。
s_limit = pd.Series([1, np.nan, np.nan, np.nan, 5])
# 連続するNaNのうち、先頭から2つまでを補間
s_interpolated_limit = s_limit.interpolate(limit=2)
print("\nlimit=2で補間後Series:\n", s_interpolated_limit)
解説:
連続する3つのNaNのうち、最初の2つだけが補間され、3つ目のNaNは残っています。
limit_direction引数: 補間の方向
limit_directionは、補間を「前向き('forward')」、「後ろ向き('backward')」、「両方向('both')」のいずれで行うかを指定します。
s_direction = pd.Series([np.nan, 2, np.nan, 4, np.nan])
# 前向きに補間 (NaNは前の値で埋められる)
s_interpolated_forward = s_direction.interpolate(limit_direction='forward')
print("\n前向き補間後Series (forward):\n", s_interpolated_forward)
# 後ろ向きに補間 (NaNは次の値で埋められる)
s_interpolated_backward = s_direction.interpolate(limit_direction='backward')
print("\n後ろ向き補間後Series (backward):\n", s_interpolated_backward)
解説:
-
'forward'では、値が存在しない先頭のNaNは埋められません。 -
'backward'では、値が存在しない末尾のNaNは埋められません。
DataFrameでのinterpolate
interpolateはSeriesだけでなく、DataFrameに対しても適用できます。デフォルトでは各列(Series)ごとに独立して補間が行われます。
df = pd.DataFrame({
'A': [1, np.nan, 3, 4],
'B': [5, 6, np.nan, 8]
})
print("オリジナルDataFrame:\n", df)
# DataFrame全体に線形補間を適用
df_interpolated = df.interpolate()
print("\nDataFrame補間後:\n", df_interpolated)
解説:
‘A’列と’B’列でそれぞれ独立して線形補間が適用されています。
注意点: inplace引数
interpolateメソッドはデフォルトで、新しいSeriesまたはDataFrameを返します。元のオブジェクトを直接変更したい場合は、inplace=Trueを設定します。
# 例: inplace=Trueの使用(非推奨とされることが多い)
s_inplace = pd.Series([1, np.nan, 3])
print("inplace適用前Series:\n", s_inplace)
s_inplace.interpolate(inplace=True)
print("\ninplace適用後Series:\n", s_inplace)
解説:
inplace=Trueはメモリ効率が良いですが、元のデータを上書きしてしまうため、予期せぬ挙動につながる可能性があります。通常は、s_interpolated = s.interpolate()のように、新しい変数に代入する方が安全で推奨される方法です。
まとめ
Pandasのinterpolateメソッドは、欠損値NaNを前後の値から賢く補間するための非常に強力な機能です。線形補間だけでなく、多項式補間やスプライン補間など、データの特性に応じた多様な補間方法が提供されています。特に時系列データの前処理では欠かせないツールであり、limitやlimit_directionなどの引数を活用することで、より柔軟な補間戦略を立てることができます。interpolateを使いこなして、データの連続性を保ちながら、より信頼性の高い分析結果を得ましょう。

