interpolateメソッドを利用したpandasデータの欠損値の補完

データ分析を行う際、データセットに欠損値(NaNやNoneなど)が含まれていることはよくあります。これらの欠損値をどのように取り扱うかは、分析結果に大きな影響を及ぼすため、重要なステップとなります。

Pandasを使う場合、これらの欠損値に対応する一番簡易的な方法はfillna()を使った定数による補完です。もしくはdropna()を使ってそのデータを消す事もあるかもしれませんね。

しかし、状況によってはすべての欠損値を単一の値で補完するのは、データの分布や傾向を歪める可能性があります。また、時系列データなどでは欠損値が発生したレコードをdropできない事もあるかもしれません。周期がずれたりしますからね。

そこで使えるのが、掲題のinterpolate()メソッドです。これを使うとここの欠損値の前後の値を使った補完など多様な補完ができます。特に引数を指定しなければ線型補完です。

参考: pandas.Series.interpolate — pandas 2.0.3 documentation

まず基本的な使い方を見ていきましょう。欠損値を含む単純なSeriesデータを用意してやってみます。

import pandas as pd
import numpy as np


s = pd.Series([0, 2, np.nan, np.nan, np.nan, 10])
print(s)
"""
0     0.0
1     2.0
2     NaN
3     NaN
4     NaN
5    10.0
dtype: float64
"""

print(s.interpolate())
"""
0     0.0
1     2.0
2     4.0
3     6.0
4     8.0
5    10.0
dtype: float64
"""

はい、等差数列で補完してくれていますね。単純な例なのでとても自然な結果になっています。補完の方法はmethod引数で指定でき、デフォルトは”linear”です。
他には、次の様な値が使えます。
– linear ・・・ 線型補完。これがデフォルト値。
– ffill または pad ・・・ 前の値。
– bfill, backfill ・・・ 後ろの値。
– nearest ・・・ 最も近い値。
– polynomial ・・・多項式補完 (orderで次数を指定する)。
– spline ・・・スプライン補完 (orderで次数を指定する)。

他にも indexの値を考慮してくれるindexやvalue、時系列で使いやすそうなtimeなどもありますね。(実際に指定できる文字列は他にもあり、その種類はかなり多いです。公式ドキュメントの参照をお勧めします。)

いくつかやってみます。

s = pd.Series([0, 2, np.nan, np.nan, np.nan, 10, 9, np.nan, np.nan, 6])
print(s.values)
# [ 0.  2. nan nan nan 10.  9. nan nan  6.]

# 線型補完
print(s.interpolate(method='linear').values)
# [ 0.  2.  4.  6.  8. 10.  9.  8.  7.  6.]

# Pad。ffillも同じ結果。前の値を使う。
print(s.interpolate(method='pad').values)
# [ 0.  2.  2.  2.  2. 10.  9.  9.  9.  6.]

# bfill。backfill。後ろの値を使う。
print(s.interpolate(method='bfill').values)
# [ 0.  2. 10. 10. 10. 10.  9.  6.  6.  6.]

# 最も近い値。
print(s.interpolate(method='nearest').values)
# [ 0.  2.  2.  2. 10. 10.  9.  9.  6.  6.]

# 多項式補完
print(s.interpolate(method='polynomial', order=2).values)
# [ 0.          2.          4.43062201  7.29186603  9.50717703 10.
#  9.          7.88516746  6.88516746  6.        ]

# スプライン補完
print(s.interpolate(method='spline', order=2).values)
# [ 0.          2.          5.30198447  7.26402071  8.60569456 10.
#  9.          8.90854185  7.76876618  6.        ]

polynomial と spline の違いがわかりにくいと思いますが、ざっくり説明すると次の様になります。

polynomial:多項式補間では、欠損値を補完するために多項式関数が使用されます。指定した次数の多項式がデータにフィットされ、その多項式関数に基づいて欠損値が補完されます。しかし、データの点が多い場合や次数が高い場合、多項式補間はデータに過剰にフィットする(オーバーフィッティングする)傾向があります。

spline:スプライン補間では、データセット全体を通じて一つの関数が使用されるのではなく、各データ点の間に別々の多項式(通常は3次)がフィットされます。これらの多項式は、データ点において連続性と滑らかさを保つように選ばれます。スプライン補間は、より滑らかな曲線を生成し、オーバーフィッティングを避けるために通常は低次の多項式(たとえば3次)が使用されます。

この二つの選択に限った話ではありませんが、適切な補間方法を選択する際には、データの性質と分析の目的を考慮することが重要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です