【Python】Pandasで欠損値(NaN)をカウントする方法

Pythonのデータ操作ライブラリであるPandasを使って、データの欠損値(NaN)を確認し、カウントし、処理する方法を学びましょう。

この記事では、Pandasの基本的な使い方から始めて、欠損値の確認方法、カウント方法、可視化方法、そして欠損値の処理方法について、初心者にもわかりやすく解説します。

目次から探す

Pandasとは

Pandasは、Pythonでデータ操作を行うための強力なライブラリです。

特に、データ解析やデータサイエンスの分野で広く利用されています。

Pandasを使うことで、大量のデータを効率的に操作し、分析することが可能になります。

Pandasの概要

Pandasは、データ操作を簡単に行うための高レベルなデータ構造とツールを提供します。

特に、データフレーム(DataFrame)と呼ばれる2次元のデータ構造が特徴的です。

データフレームは、行と列からなる表形式のデータを扱うためのもので、Excelのスプレッドシートに似ています。

Pandasは、以下のような機能を提供します:

  • データの読み込みと書き出し(CSV、Excel、SQLなど)
  • データのクリーニングと前処理
  • データのフィルタリングと選択
  • データの集計とグループ化
  • 時系列データの操作

データ操作ライブラリとしての役割

Pandasは、データ操作ライブラリとして以下のような役割を果たします:

  1. データの読み込みと書き出し:Pandasは、さまざまな形式のデータを簡単に読み込むことができます。

例えば、CSVファイル、Excelファイル、SQLデータベースなどからデータを読み込むことができます。

また、処理したデータをこれらの形式で書き出すことも可能です。

  1. データのクリーニングと前処理:データ解析の前に、データのクリーニングや前処理が必要です。

Pandasは、欠損値の処理、重複データの削除、データ型の変換など、データのクリーニングに必要な機能を提供します。

  1. データのフィルタリングと選択:Pandasを使うことで、特定の条件に基づいてデータをフィルタリングしたり、特定の列や行を選択したりすることができます。

これにより、必要なデータだけを抽出して分析することができます。

  1. データの集計とグループ化:Pandasは、データの集計やグループ化を簡単に行うための機能を提供します。

例えば、特定の列の平均値や合計値を計算したり、特定の条件に基づいてデータをグループ化して集計したりすることができます。

  1. 時系列データの操作:Pandasは、時系列データの操作にも強力な機能を提供します。

例えば、日付や時間に基づいてデータをリサンプリングしたり、移動平均を計算したりすることができます。

データフレームの基本構造

データフレームは、Pandasの中心的なデータ構造であり、行と列からなる2次元のデータを扱います。

データフレームは、以下のようにして作成することができます:

import pandas as pd
# サンプルデータを辞書形式で作成
data = {
    '名前': ['太郎', '花子', '次郎'],
    '年齢': [23, 25, 22],
    '性別': ['男', '女', '男']
}
# データフレームの作成
df = pd.DataFrame(data)
# データフレームの表示
print(df)

上記のコードを実行すると、以下のようなデータフレームが表示されます:

名前  年齢 性別
0  太郎  23  男
1  花子  25  女
2  次郎  22  男

データフレームは、行と列のラベルを持ち、各セルにはデータが格納されています。

行ラベルはデフォルトで0から始まる整数インデックスが割り当てられますが、任意のラベルを指定することも可能です。

列ラベルは、データの属性名を表します。

Pandasを使うことで、このデータフレームに対してさまざまな操作を行うことができます。

例えば、特定の列を選択したり、条件に基づいてデータをフィルタリングしたり、データを集計したりすることができます。

欠損値の確認方法

データを扱う際に、欠損値(NaN: Not a Number)は避けられない問題の一つです。

Pandasを使用すると、欠損値の確認や処理が簡単に行えます。

ここでは、欠損値の確認方法について詳しく解説します。

データフレームの作成

まずは、Pandasのデータフレームを作成する方法を確認しましょう。

データフレームは、行と列からなる二次元のデータ構造で、表形式のデータを扱うのに非常に便利です。

import pandas as pd
# データフレームの作成
data = {
    '名前': ['太郎', '花子', '次郎', '三郎'],
    '年齢': [23, 25, 22, None],
    '点数': [88, 92, None, 85]
}
df = pd.DataFrame(data)
print(df)

上記のコードでは、名前年齢点数の3つの列を持つデータフレームを作成しています。

年齢点数の列には欠損値(NaN)が含まれています。

サンプルデータの準備

次に、欠損値を含むサンプルデータを準備します。

以下のデータフレームを使用して、欠損値の確認方法を説明します。

# サンプルデータの表示
print(df)

実行結果は以下の通りです。

名前    年齢    点数
0  太郎  23.0  88.0
1  花子  25.0  92.0
2  次郎  22.0   NaN
3  三郎   NaN  85.0

欠損値の確認

欠損値を確認するための基本的な方法として、isna()メソッドisnull()メソッドがあります。

これらのメソッドは、データフレーム内の欠損値をTrue、欠損値でない値をFalseとして表示します。

isna()メソッドの使用

isna()メソッドを使用して、データフレーム内の欠損値を確認する方法を見てみましょう。

# isna()メソッドを使用して欠損値を確認
print(df.isna())

実行結果は以下の通りです。

名前    年齢    点数
0  False  False  False
1  False  False  False
2  False  False   True
3  False   True  False

この結果から、年齢列の3行目と点数列の2行目に欠損値があることがわかります。

isnull()メソッドの使用

isnull()メソッドisna()メソッドと同様に、データフレーム内の欠損値を確認するために使用されます。

実際には、isna()isnull()は同じ機能を持っています。

# isnull()メソッドを使用して欠損値を確認
print(df.isnull())

実行結果は以下の通りです。

名前    年齢    点数
0  False  False  False
1  False  False  False
2  False  False   True
3  False   True  False

isna()メソッドと同じ結果が得られます。

どちらのメソッドを使用しても問題ありません。

以上が、Pandasを使用して欠損値を確認する基本的な方法です。

次に、欠損値のカウント方法について詳しく見ていきましょう。

欠損値のカウント方法

データフレーム内の欠損値(NaN)をカウントする方法はいくつかあります。

ここでは、列ごと、行ごと、全体の欠損値をカウントする方法について詳しく解説します。

列ごとの欠損値のカウント

列ごとの欠損値をカウントする方法は、isna()またはisnull()メソッドを使用して、各列に含まれる欠損値の数を取得することです。

isna().sum()の使用

isna()メソッドは、データフレーム内の欠損値をTrue、それ以外をFalseとするブール値のデータフレームを返します。

これに対してsum()メソッドを適用することで、各列の欠損値の数をカウントできます。

import pandas as pd
# サンプルデータの作成
data = {
    'A': [1, 2, None, 4],
    'B': [None, 2, 3, 4],
    'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# 列ごとの欠損値のカウント
missing_values_per_column = df.isna().sum()
print(missing_values_per_column)
A    1
B    1
C    2
dtype: int64

isnull().sum()の使用

isnull()メソッドisna()メソッドと同様に動作します。

以下のコードは、isnull()を使用して列ごとの欠損値をカウントする例です。

# 列ごとの欠損値のカウント
missing_values_per_column = df.isnull().sum()
print(missing_values_per_column)

実行結果はisna()を使用した場合と同じです。

行ごとの欠損値のカウント

行ごとの欠損値をカウントする場合は、isna()またはisnull()メソッドaxis=1を指定してsum()メソッドを適用します。

isna().sum(axis=1)の使用

# 行ごとの欠損値のカウント
missing_values_per_row = df.isna().sum(axis=1)
print(missing_values_per_row)
0    1
1    1
2    2
3    0
dtype: int64

isnull().sum(axis=1)の使用

isnull()メソッドを使用して行ごとの欠損値をカウントする例です。

# 行ごとの欠損値のカウント
missing_values_per_row = df.isnull().sum(axis=1)
print(missing_values_per_row)

実行結果はisna()を使用した場合と同じです。

全体の欠損値のカウント

データフレーム全体の欠損値の数をカウントするには、isna().sum().sum()またはisnull().sum().sum()を使用します。

isna().sum().sum()の使用

# 全体の欠損値のカウント
total_missing_values = df.isna().sum().sum()
print(total_missing_values)
4

isnull().sum().sum()の使用

isnull()メソッドを使用して全体の欠損値をカウントする例です。

# 全体の欠損値のカウント
total_missing_values = df.isnull().sum().sum()
print(total_missing_values)

実行結果はisna()を使用した場合と同じです。

これらの方法を使用することで、データフレーム内の欠損値を簡単にカウントすることができます。

次に、欠損値の可視化方法について解説します。

欠損値の可視化

データ分析において、欠損値の存在はデータの品質に大きな影響を与えるため、欠損値の可視化は非常に重要です。

可視化することで、どの部分に欠損値が集中しているのか、どの程度の欠損があるのかを直感的に理解することができます。

ここでは、欠損値のヒートマップとバープロットを使った可視化方法について解説します。

欠損値のヒートマップ

ヒートマップは、データの欠損状況を視覚的に表現するための有効な手段です。

欠損値がある部分を色で示すことで、どの部分に欠損が集中しているのかを一目で把握できます。

seabornライブラリの使用

seabornは、Pythonのデータ可視化ライブラリで、ヒートマップを簡単に作成することができます。

以下に、seabornを使って欠損値のヒートマップを作成する方法を示します。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# サンプルデータの作成
data = {
    'A': [1, 2, None, 4, 5],
    'B': [None, 2, 3, None, 5],
    'C': [1, None, 3, 4, None]
}
df = pd.DataFrame(data)
# 欠損値のヒートマップを作成
plt.figure(figsize=(10, 6))
sns.heatmap(df.isna(), cbar=False, cmap='viridis')
plt.title('Heatmap of Missing Values')
plt.show()

このコードでは、seabornheatmap関数を使用して、データフレームの欠損値をヒートマップとして表示しています。

df.isna()は欠損値の位置をTrue/Falseで示すデータフレームを返し、それをヒートマップとして可視化しています。

欠損値のバープロット

バープロットは、各列の欠損値の数を棒グラフで示す方法です。

これにより、どの列にどれだけの欠損値があるのかを直感的に理解することができます。

matplotlibライブラリの使用

matplotlibは、Pythonの基本的なデータ可視化ライブラリで、バープロットを簡単に作成することができます。

以下に、matplotlibを使って欠損値のバープロットを作成する方法を示します。

import pandas as pd
import matplotlib.pyplot as plt
# サンプルデータの作成
data = {
    'A': [1, 2, None, 4, 5],
    'B': [None, 2, 3, None, 5],
    'C': [1, None, 3, 4, None]
}
df = pd.DataFrame(data)
# 欠損値の数をカウント
missing_values_count = df.isna().sum()
# 欠損値のバープロットを作成
plt.figure(figsize=(10, 6))
missing_values_count.plot(kind='bar')
plt.title('Number of Missing Values per Column')
plt.xlabel('Columns')
plt.ylabel('Number of Missing Values')
plt.show()

このコードでは、df.isna().sum()を使用して各列の欠損値の数をカウントし、それをmatplotlibplot関数を使ってバープロットとして表示しています。

これらの可視化手法を活用することで、データの欠損状況を直感的に把握し、適切な対策を講じることができます。

欠損値の処理方法

データ分析や機械学習の前処理において、欠損値(NaN)の処理は非常に重要です。

欠損値が存在するデータをそのまま使用すると、分析結果が歪んだり、モデルの精度が低下する可能性があります。

ここでは、Pandasを使用して欠損値を処理する方法について詳しく解説します。

欠損値の削除

欠損値を含む行や列を削除する方法は、データが少量で欠損値が多い場合に有効です。

Pandasでは、dropna()メソッドを使用して簡単に欠損値を削除できます。

dropna()メソッドの使用

dropna()メソッドは、欠損値を含む行や列を削除するために使用されます。

以下に具体的な使用例を示します。

import pandas as pd
# サンプルデータの作成
data = {
    'A': [1, 2, None, 4],
    'B': [None, 2, 3, 4],
    'C': [1, None, None, 4]
}
df = pd.DataFrame(data)
# 欠損値を含む行を削除
df_dropped_rows = df.dropna()
# 欠損値を含む列を削除
df_dropped_columns = df.dropna(axis=1)
print("元のデータフレーム:\n", df)
print("欠損値を含む行を削除:\n", df_dropped_rows)
print("欠損値を含む列を削除:\n", df_dropped_columns)

上記のコードでは、dropna()メソッドを使用して欠損値を含む行と列をそれぞれ削除しています。

axis=0(デフォルト)で行を削除し、axis=1で列を削除します。

欠損値の補完

欠損値を削除する代わりに、他の値で補完する方法もあります。

これにより、データの一貫性を保ちながら欠損値を処理できます。

Pandasでは、fillna()メソッドを使用して欠損値を補完できます。

fillna()メソッドの使用

fillna()メソッドは、指定した値で欠損値を補完するために使用されます。

以下に具体的な使用例を示します。

# 欠損値を0で補完
df_filled_zero = df.fillna(0)
# 欠損値を前の値で補完(前方補完)
df_filled_ffill = df.fillna(method='ffill')
# 欠損値を後の値で補完(後方補完)
df_filled_bfill = df.fillna(method='bfill')
print("欠損値を0で補完:\n", df_filled_zero)
print("前方補完:\n", df_filled_ffill)
print("後方補完:\n", df_filled_bfill)

上記のコードでは、fillna()メソッドを使用して欠損値を0、前の値、後の値でそれぞれ補完しています。

平均値・中央値・最頻値での補完

欠損値をデータの平均値、中央値、最頻値で補完する方法も一般的です。

以下に具体的な使用例を示します。

# 平均値で補完
df_filled_mean = df.fillna(df.mean())
# 中央値で補完
df_filled_median = df.fillna(df.median())
# 最頻値で補完
df_filled_mode = df.fillna(df.mode().iloc[0])
print("平均値で補完:\n", df_filled_mean)
print("中央値で補完:\n", df_filled_median)
print("最頻値で補完:\n", df_filled_mode)

上記のコードでは、fillna()メソッドを使用して欠損値を平均値、中央値、最頻値でそれぞれ補完しています。

欠損値の重要性

欠損値の処理はデータ分析や機械学習において非常に重要です。

欠損値を適切に処理しないと、分析結果が歪んだり、モデルの精度が低下する可能性があります。

欠損値の処理方法を選択する際には、データの特性や分析の目的に応じて適切な方法を選ぶことが重要です。

欠損値の確認とカウントの方法

欠損値の確認とカウントは、データの前処理において欠かせないステップです。

Pandasを使用して欠損値を確認し、カウントする方法については、前述のセクションで詳しく解説しました。

これらの方法を活用して、データの欠損状況を把握し、適切な処理を行いましょう。

欠損値の処理方法の選択

欠損値の処理方法を選択する際には、以下のポイントを考慮することが重要です。

  • データの特性:データの種類や分布に応じて適切な処理方法を選びます。
  • 分析の目的:分析の目的に応じて、欠損値の処理方法を選択します。
  • 欠損値の割合:欠損値の割合が多い場合は、削除よりも補完を検討します。

適切な欠損値の処理を行うことで、データの品質を向上させ、分析結果の信頼性を高めることができます。

目次から探す