March 29, 2022

Эффективное построение гистограмм признаков с Python

Рассмотрим, как быстро и красиво построить распределения значений для различных признаков таблицы данных. В качестве примера будем использовать датасет о цветках Ириса, который получим с помощью библиотеки Scikit-learn:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
from sklearn.datasets import load_iris

df, target = load_iris(return_X_y=True, as_frame=True)
df['petal_length>4'] = df['petal length (cm)']>4
df['target'] = target
df.head()

Как можно заметить, в демонстрационных целях мы добавили один индикаторный столбец - 'petal_length>4'. Визуализацию будем проводить с помощью библиотеки Seaborn, в которой для категориальных и числовых столбцов удобно использовать два разных метода countplot и histplot (читать подробнее). Поэтому сначала разделим наши признаки на группы по количеству уникальных значений (если их больше 10 считаем колонку числовой):

cols_ser = df.drop('target', axis=1).nunique()
cols_cat = cols_ser[cols_ser<=10].index.tolist()
cols_num = cols_ser[cols_ser>10].index.tolist()
print(f'категориальные столбцы - {cols_cat}\nчисловые столбцы - {cols_num}')

Разделив множество признаков, создадим полотно (подробнее здесь) с нужным количеством подграфиков и на каждом нарисуем подходящее распределение (с делением по значением target-а по параметру hue):

ncols = 3
nrows = (len(cols_cat)+len(cols_num))//ncols + 1
fig, axis = plt.subplots(nrows,ncols, figsize=(15,10))

for ax_i, col in zip(axis.flatten(),cols_num+cols_cat):
    if col in cols_cat:
        sns.countplot(data=df, x = col, ax = ax_i, hue='target')
    elif col in cols_num:
        sns.histplot(data=df, x=col, ax = ax_i, kde=True, hue='target')