【Pandasデータ補間】欠損値NaNを前後の値で賢く埋めるinterpolateメソッド徹底解説 📈


 

データ分析において、欠損値(NaN)の存在は避けられない課題です。特に時系列データなど、値の順序に意味がある場合、NaNを単に削除したり固定値で埋めたりすると、データの持つ連続性やトレンドが失われてしまう可能性があります。Pandasの**interpolateメソッドは、このような欠損値を前後の値から推測して補間**するための強力な機能です。この記事では、interpolateの基本的な使い方から、知っておくと便利な補間方法まで、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

interpolateメソッドとは?なぜ時系列データで重要なのか?

 

interpolateメソッドは、PandasのDataFrameやSeriesに存在する欠損値(NaNなど)を、その前後の有効な値に基づいて「補間」(推測して埋める)するために使用されます。

特に時系列データでは、以下のような理由でinterpolateが重要になります。

  • データの連続性維持: 株価、気温、センサーデータなど、時間とともに連続的に変化するデータにおいて、欠損値を補間することでデータの自然な流れを保てます。

  • トレンドの維持: 欠損値があっても、前後の値から補間することで、データ全体のトレンドや季節性を維持しやすくなります。

  • 分析精度の向上: 欠損値が原因で分析結果が不正確になるのを防ぎ、より信頼性の高い予測や洞察を可能にします。


 

interpolateの基本的な使い方

 

まずは、interpolateメソッドの最も基本的な使い方を見ていきましょう。

 

線形補間(デフォルト)

 

interpolateメソッドは、デフォルトで線形補間(linear interpolation)を行います。これは、欠損値の前後の値を用いて、直線的に値を埋める方法です。

Python
 
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' (最近傍補間)

 

欠損値に最も近い有効な値で補間します。

Python
 
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)の多項式でデータをフィットさせ、欠損値を補間します。データのカーブに沿った補間が可能です。

Python
 
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)のスプライン関数を使って、滑らかな曲線で欠損値を補間します。多項式補間よりも滑らかな補間が必要な場合に利用されます。

Python
 
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を補間するかを指定します。

Python
 
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')」のいずれで行うかを指定します。

Python
 
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)ごとに独立して補間が行われます。

Python
 
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を設定します。

Python
 
# 例: 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を前後の値から賢く補間するための非常に強力な機能です。線形補間だけでなく、多項式補間やスプライン補間など、データの特性に応じた多様な補間方法が提供されています。特に時系列データの前処理では欠かせないツールであり、limitlimit_directionなどの引数を活用することで、より柔軟な補間戦略を立てることができます。interpolateを使いこなして、データの連続性を保ちながら、より信頼性の高い分析結果を得ましょう。