(An English translation is available here.)
Pythonでデータ分析をする際に、欠損値の出現パターンを簡単に可視化する方法を紹介します。
はじめに
データ分析をする際に、欠損値に対処する必要があります。方法は様々あります1が、対処法を考える前に、欠損値の数や出現パターンを知る必要があります。この記事では、Pythonを用いてデータ分析をする際に、欠損値の出現パターンを簡単に可視化する方法を紹介します。
なお、この記事で紹介する方法については、私のGitHub repoにJupyter notebookをアップロードしてあります。下のバッジをクリックすると、Binderで実行できます。
前提
以下、Kaggleから入手できるTitanicのtrain datasetを例として紹介します。以下のコードと実行結果があるものとします。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('train.csv')
# 各列ごとの欠損値の数を確認します。
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
方法1:seaborn.heatmap
はじめに、seaborn.heatmap
を使う方法を紹介します。次の一行で、大まかな欠損値の出現パターンが分かります。
sns.heatmap(df.isnull(), cbar=False)
Indexに対して、Ageは偏りなく少量、Cabinは偏りなく大量に、Embarkedは最初の方に少しだけ、という大まかな傾向がつかめます。今回のTitanic datasetではないですが、特に時系列データでは、同じ個数の欠損値でも、まとまっているかばらばらなのかを知る必要があります。この手法により、ひと目で分かります。また、仮に2つの列の欠損値の発生箇所に相関があれば、それもこの可視化によってある程度分かります。(今回のdatasetではそのような相関はなさそうです。このことも、一つの情報です。)たった一行のコードですが、heatmapを用いた欠損値の出現パターンの可視化によって、今述べたような情報を大まかに得ることができます。
方法2:missingno module
より様々な可視化をしたい場合は、missingnoというmoduleを使うとよいと思います。
まずはインストールし、importします。
pip install missingno
import missingno as msno
方法1のseaborn.heatmap
と同様の結果を得たい場合は、missingno.matrix
を使います。
msno.matrix(df)
方法1のseaborn.heatmap
相当の情報に加えて、右側にバーが表示されています。これは、各行ごとに、非欠損値の個数を線グラフとして表示したものです。このdatasetでは、全ての行が10 - 12個の非欠損値を持つことが分かります。(欠損値は、0 - 2個ということになります。)
更に、missingno.heatmap
を使うと、各列の欠損値の発生箇所についての相関が分かります。
msno.heatmap(df)
この他にも、各列の欠損値の個数の棒グラフ、欠損値の発生箇所の相関をもとに作成したデンドログラムなど、欠損値に関する様々な可視化ができますので、READMEを一読すると良いと思います。
おわりに
以上、Pythonでデータ分析をする際に、欠損値の出現パターンを簡単に可視化する方法を紹介しました。
まずはseaborn.heatmap
を使い、より多くの分析が必要な場合は、missingno moduleを使うと良いと思います。
-
主な例としては、欠損値の対処法 | ブログ | 統計WEBに解説があります。ただし、これだけで本が書けるぐらいに多種多様で、奥が深い領域だと思います。 ↩