欠損値の出現パターンを簡単に可視化する

###### (An English translation is available [here](https://dev.to/tomoyukiaota/visualizing-the-patterns-of-missing-value-occurrence-with-python-46dj).)

Pythonでデータ分析をする際に、欠損値の出現パターンを簡単に可視化する方法を紹介します。

# はじめに

データ分析をする際に、欠損値に対処する必要があります。方法は様々あります[^1]が、対処法を考える前に、欠損値の数や出現パターンを知る必要があります。この記事では、Pythonを用いてデータ分析をする際に、欠損値の出現パターンを簡単に可視化する方法を紹介します。

なお、この記事で紹介する方法については、[私のGitHub repo](https://github.com/TomoyukiAota/visualization_of_missing_value_location)にJupyter notebookをアップロードしてあります。下のバッジをクリックすると、Binderで実行できます。

[![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/TomoyukiAota/visualization_of_missing_value_location/master)

# 前提

以下、[Kaggleから入手できるTitanicのtrain dataset](https://www.kaggle.com/c/titanic/data)を例として紹介します。以下のコードと実行結果があるものとします。

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
```

```python
df = pd.read_csv('train.csv')
```

```python
# 各列ごとの欠損値の数を確認します。
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
```

# 方法１：seaborn.heatmap

はじめに、`seaborn.heatmap`を使う方法を紹介します。次の一行で、大まかな欠損値の出現パターンが分かります。

```python
sns.heatmap(df.isnull(), cbar=False)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185010/b9315abd-d6cf-150d-d14b-7fe01ddb94a1.png)

Indexに対して、Ageは偏りなく少量、Cabinは偏りなく大量に、Embarkedは最初の方に少しだけ、という大まかな傾向がつかめます。今回のTitanic datasetではないですが、特に時系列データでは、同じ個数の欠損値でも、まとまっているかばらばらなのかを知る必要があります。この手法により、ひと目で分かります。また、仮に２つの列の欠損値の発生箇所に相関があれば、それもこの可視化によってある程度分かります。（今回のdatasetではそのような相関はなさそうです。このことも、一つの情報です。）たった一行のコードですが、heatmapを用いた欠損値の出現パターンの可視化によって、今述べたような情報を大まかに得ることができます。

# 方法２：[missingno](https://github.com/ResidentMario/missingno) module

より様々な可視化をしたい場合は、[missingno](https://github.com/ResidentMario/missingno)というmoduleを使うとよいと思います。
まずはインストールし、importします。

```bash
pip install missingno
```

```python
import missingno as msno
```

方法１の`seaborn.heatmap`と同様の結果を得たい場合は、`missingno.matrix`を使います。

```python
msno.matrix(df)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185010/77325014-2637-9b4a-e6c2-02d81aadc436.png)

方法１の`seaborn.heatmap`相当の情報に加えて、右側にバーが表示されています。これは、各行ごとに、非欠損値の個数を線グラフとして表示したものです。このdatasetでは、全ての行が10 - 12個の非欠損値を持つことが分かります。（欠損値は、0 - 2個ということになります。）

更に、`missingno.heatmap`を使うと、各列の欠損値の発生箇所についての相関が分かります。

```python
msno.heatmap(df)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185010/38c72253-b4a2-66d6-75b3-5b14c0e8dcc9.png)

この他にも、各列の欠損値の個数の棒グラフ、欠損値の発生箇所の相関をもとに作成したデンドログラムなど、欠損値に関する様々な可視化ができますので、[README](https://github.com/ResidentMario/missingno)を一読すると良いと思います。

# おわりに

以上、Pythonでデータ分析をする際に、欠損値の出現パターンを簡単に可視化する方法を紹介しました。
まずは`seaborn.heatmap`を使い、より多くの分析が必要な場合は、[missingno](https://github.com/ResidentMario/missingno) moduleを使うと良いと思います。




[^1]: 主な例としては、[欠損値の対処法 | ブログ | 統計WEB](https://bellcurve.jp/statistics/blog/14238.html)に解説があります。ただし、これだけで本が書けるぐらいに多種多様で、奥が深い領域だと思います。