обработка данных
May 28, 2023

Библиотека missingno для исследования пропусков

Рассмотрим возможности инструмента missingno для изучения пропусков в датафрейме. Сначала сгенерируем тренировочный датасет:

import pandas as pd
import numpy as np
import missingno as msno

df = pd.DataFrame([['fourth_cat1', 'third_cat2', 1], 
                   ['first_cat1', 'third_cat2', 1], 
                   ['second_cat1', 'third_cat2', 2], 
                   [None, 'second_cat2', 5],
                   [None, None, np.nan],
                   [None, 'third_cat2', np.nan], 
                   ['second_cat1', 'third_cat2', 2], 
                   ['second_cat1', 'second_cat2', 2]], columns=['cat1', 'cat2', 'num'])

df

matrix

Функция matrix строит изображение, по которому можно визуально определить расположение пропусков в строках. Линия справа отражает форму заполненности, отмечая строки с минимальным и максимальным количеством заполнений:

msno.matrix(df)

bar

bar - это визуализация пропусков по колонкам. Шкала слева отображает долю наблюдений, справа - их абсолютное количество, а сверху - количество заполненных элементов по колонкам:

msno.bar(df)

heatmap

Тепловая карта heatmap показывает силу корреляции пропусков в разных колонках:

msno.heatmap(df)

Под капотом считается df.isnull().corr(), при этом выбрасываются переменные, которые полностью заполнены или не заполнены:

df.isnull().corr()

dendrogram

Еще одним инструментом получения знаний о взаимосвязи пропусков является построение дендрограммы, в которой переменные разбиваются на кластеры, а потом итеративно наиболее связанные объединяются в дополнительные кластера:

msno.dendrogram(df)

Дендрограмма строится на основе иерархической кластеризации, в которой в качестве наблюдений используются колонки, а признаков - индикатор наличия/отсутствия пропусков в конкретных ячейках:

from scipy.cluster.hierarchy import dendrogram, linkage

X = np.transpose(df.isnull().astype(int).values)
cluster_ar = linkage(X, method='ward', metric='euclidean')

link_df = pd.DataFrame(cluster_ar, index=[f'step {i+1}' for i in range(cluster_ar.shape[0])], 
                       columns=['cluster1', 'cluster2', 'dist', 'number elements'])

link_df
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(25, 10))
row_dendr = dendrogram(link_df, orientation='bottom')