NumPyでnp.nanを気にせず合計・平均を算出!欠損値対応の集計テクニック


 

データ分析において、**欠損値(np.nan)**は頻繁に登場します。通常のNumPy関数でnp.nanを含む配列の合計や平均を計算しようとすると、結果がnanになってしまうことがあります。しかし、NumPyには欠損値を自動的に無視して集計を行う便利な関数が用意されています。この記事では、NumPy配列内のnp.nanを考慮しつつ、合計や平均を効率的に算出する方法について、具体的なサンプルコードを交えながら詳しく解説します。


 

np.nanが含まれると合計・平均がnanになる理由

 

NumPyの多くの集計関数(例: np.sum(), np.mean())は、配列内に一つでもnp.nanが存在すると、その結果もnanを返します。これは、欠損値が結果に不確定性をもたらすため、NumPyが明示的に「計算できない」ことを示す挙動です。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([1, 2, np.nan, 4, 5])

# 通常の合計と平均
sum_arr = np.sum(arr)
mean_arr = np.mean(arr)

print("通常の合計:", sum_arr)
print("通常の平均:", mean_arr)

 

出力例

 

通常の合計: nan
通常の平均: nan

 

欠損値を無視して集計するnp.nansum, np.nanmean

 

NumPyは、np.nanを無視して計算を行うための専用関数を提供しています。これらは関数名の冒頭にnanが付けられています。

 

1. 合計の算出:np.nansum()

 

np.nansum()は、配列内のnp.nan0として扱い、それ以外の数値要素の合計を計算します。これにより、欠損値があっても合計値が得られます。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([1, 2, np.nan, 4, 5])

# nanを無視して合計
nansum_arr = np.nansum(arr)
print("nanを無視した合計:", nansum_arr)

 

出力例

 

nanを無視した合計: 12.0

 

2. 平均の算出:np.nanmean()

 

np.nanmean()は、配列内のnp.nanを無視して、残りの数値要素の平均を計算します。分母となる要素数もnp.nanを除いた数になります。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([1, 2, np.nan, 4, 5])

# nanを無視して平均
nanmean_arr = np.nanmean(arr)
print("nanを無視した平均:", nanmean_arr)

 

出力例

 

nanを無視した平均: 3.0

 

その他の欠損値対応集計関数

 

合計と平均以外にも、np.nanを無視して計算を行う関数がNumPyには用意されています。

 

1. 中央値の算出:np.nanmedian()

 

np.nanmedian()は、配列内のnp.nanを無視して中央値を計算します。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([1, 2, np.nan, 4, 5, 100])

# nanを無視して中央値
nanmedian_arr = np.nanmedian(arr)
print("nanを無視した中央値:", nanmedian_arr)

 

出力例

 

nanを無視した中央値: 4.0

 

2. 最大値・最小値の算出:np.nanmax(), np.nanmin()

 

np.nanmax()np.nanmin()は、それぞれ配列内のnp.nanを無視して最大値と最小値を返します。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.array([1, 2, np.nan, 4, 5, 100])

# nanを無視して最大値
nanmax_arr = np.nanmax(arr)
print("nanを無視した最大値:", nanmax_arr)

# nanを無視して最小値
nanmin_arr = np.nanmin(arr)
print("nanを無視した最小値:", nanmin_arr)

 

出力例

 

nanを無視した最大値: 100.0
nanを無視した最小値: 1.0

 

3. 多次元配列での軸ごとの計算

 

これらのnan対応関数も、通常の集計関数と同様にaxis引数を使用して特定の軸に沿った計算が可能です。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.array([[1, 2, np.nan],
                   [4, np.nan, 6],
                   [7, 8, 9]])

# 各列のnanを無視した平均
mean_per_col = np.nanmean(arr_2d, axis=0)
print("各列のnanを無視した平均:", mean_per_col)

# 各行のnanを無視した合計
sum_per_row = np.nansum(arr_2d, axis=1)
print("各行のnanを無視した合計:", sum_per_row)

 

出力例

 

各列のnanを無視した平均: [4.         5.         7.5]
各行のnanを無視した合計: [ 3. 10. 24.]

 

まとめ

 

NumPyで欠損値np.nanを含む配列の合計や平均などの集計を行う際は、nan対応の関数を使用することが非常に重要です。

  • np.nansum(): np.nan0として扱い、合計を計算します。

  • np.nanmean(): np.nanを無視して、残りの要素の平均を計算します。

  • np.nanmedian(), np.nanmax(), np.nanmin(): 同様にnp.nanを無視して中央値、最大値、最小値を計算します。

これらの関数は、axis引数を使って特定の軸に沿った計算も可能です。これらの便利な関数を使いこなすことで、欠損値を含む実際のデータセットでも、正確かつ効率的な数値計算を行うことができます。ぜひ、あなたのデータ分析ワークフローに取り入れてみてください!