Эффективное построение гистограмм признаков с 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')