Библиотека 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')