Countplot Seaborn: создание и настройка счетного графика в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Для кого эта статья:

  • начинающие аналитики данных и студенты, изучающие визуализацию данных
  • профессионалы, работающие с данными в бизнесе и стремящиеся улучшить свои навыки
  • специалисты, заинтересованные в изучении библиотеки Seaborn и создании графиков в Python

    Погружаясь в мир анализа данных, мы часто сталкиваемся с необходимостью подсчета и визуализации категориальных переменных. Именно здесь на помощь приходит Countplot — мощный инструмент библиотеки Seaborn, позволяющий одним элегантным графиком ответить на вопрос "сколько элементов в каждой категории?". Этот недооцененный герой визуализации превращает монотонные таблицы с подсчетами в информативные, эстетически приятные графики, моментально раскрывающие закономерности в данных. Владение Countplot — это как владение заклинанием, которое мгновенно проясняет структуру ваших категориальных данных. 📊

Хотите продвинуться в визуализации данных и уверенно работать с Seaborn и другими инструментами Python? Курс «Аналитик данных» с нуля от Skypro включает углубленное изучение библиотек визуализации, где вы освоите не только создание базовых графиков, но и научитесь конструировать сложные визуализации для реальных бизнес-задач. Студенты отрабатывают навыки на практических кейсах, а эксперты-практики дают актуальные знания, востребованные на рынке труда в 2025 году.

Что такое Countplot в Seaborn и для чего он нужен

Countplot — это специализированный тип графика в библиотеке Seaborn, созданный для подсчета и визуализации частотности категориальных переменных. По сути, это гистограмма для категорий, где высота столбца показывает количество наблюдений в каждой категории. 🧮

В отличие от обычных bar plot, Countplot автоматически выполняет подсчет элементов, избавляя вас от необходимости предварительной агрегации данных. Это существенно ускоряет процесс исследовательского анализа и делает код более лаконичным.

Основные преимущества использования Countplot:

  • Мгновенная визуализация распределения категориальных данных
  • Автоматический подсчет частот без дополнительного кода
  • Интеграция с экосистемой Seaborn для согласованного стиля визуализации
  • Возможность группировки по дополнительным категориям (через параметр hue)
  • Высокая настраиваемость внешнего вида

Countplot особенно полезен в следующих сценариях анализа данных:

СценарийПрименение CountplotАльтернатива без Countplot
Анализ демографических данныхМгновенная визуализация распределения по полу, образованию, регионуНесколько строк кода с группировкой и созданием bar plot
Маркетинговые исследованияАнализ предпочтений клиентов по категориямРучная агрегация и несколько графиков
Анализ пользовательской активностиВизуализация частоты действий пользователейСложные запросы и дополнительная предобработка
Обработка результатов опросовБыстрая визуализация ответов на вопросыРучной подсчет и построение диаграмм

Алексей Петров, Lead Data Scientist

Когда я только начинал работать с данными клиентского сервиса, мне казалось, что десятки тысяч тикетов — это непроходимые джунгли информации. Ключом к пониманию стали именно countplot-графики. Помню, как директор запросил отчет о распределении обращений по категориям проблем, и у меня было всего 2 часа до презентации. Я быстро набросал пару строк кода с countplot, и внезапно хаотичный массив данных превратился в четкую картину — 70% обращений касались всего трех категорий из двадцати! Этот момент стал переломным для всей компании: мы перераспределили ресурсы службы поддержки, сократив время ожидания на 40% и повысив удовлетворенность клиентов на 25%. С тех пор countplot — первое, что я использую при анализе категориальных данных.

Кинга Идем в IT: пошаговый план для смены профессии

Базовый синтаксис и создание простого счетного графика

Создание базового Countplot в Seaborn требует минимального кода, что делает его идеальным инструментом для быстрой разведки данных. Прежде чем погрузиться в примеры, убедитесь, что у вас установлены необходимые библиотеки:

Python
Скопировать код
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Устанавливаем стиль для более элегантных графиков
sns.set_theme(style="whitegrid")

Базовый синтаксис функции countplot() предельно прост:

Python
Скопировать код
# Базовый синтаксис
sns.countplot(data=dataframe, x='категориальная_переменная')

# Альтернативный синтаксис для данных в формате массива
sns.countplot(x=array_data)

Рассмотрим практический пример с использованием встроенного датасета Seaborn:

Python
Скопировать код
# Загрузим демонстрационный датасет о чаевых
tips = sns.load_dataset('tips')

# Создадим базовый countplot по дням недели
plt.figure(figsize=(10, 6))
sns.countplot(data=tips, x='day')
plt.title('Количество посещений по дням недели')
plt.xlabel('День недели')
plt.ylabel('Количество посещений')
plt.show()

Этот простой код создаст элегантный график, показывающий распределение посещений ресторана по дням недели. Теперь добавим группировку по дополнительному признаку с помощью параметра hue:

Python
Скопировать код
# Добавим группировку по полу клиентов
plt.figure(figsize=(10, 6))
sns.countplot(data=tips, x='day', hue='sex')
plt.title('Количество посещений по дням недели и полу')
plt.xlabel('День недели')
plt.ylabel('Количество посещений')
plt.legend(title='Пол')
plt.show()

Основные параметры для базового использования Countplot:

ПараметрОписаниеПример значения
dataDataFrame с данными для визуализацииtips
x, yИмя переменной для подсчета (по оси X или Y)'day'
hueКатегориальная переменная для группировки'sex'
orderПоследовательность для сортировки категорий['Thur', 'Fri', 'Sat', 'Sun']
hue_orderПоследовательность для сортировки групп['Male', 'Female']
orientОриентация графика (вертикальная/горизонтальная)'h' для горизонтального

При работе с большими датасетами или сложными категориями может потребоваться горизонтальная ориентация графика для лучшей читаемости:

Python
Скопировать код
# Горизонтальный countplot
plt.figure(figsize=(10, 8))
sns.countplot(data=tips, y='day') # Используем 'y' вместо 'x'
plt.title('Количество посещений по дням недели')
plt.xlabel('Количество посещений')
plt.ylabel('День недели')
plt.show()

Настройка визуального стиля и цветовой гаммы Countplot

Стильное оформление графиков — ключевой аспект профессиональной визуализации данных. Seaborn предоставляет обширные возможности для настройки внешнего вида Countplot, от изменения цветовых палитр до тонкой настройки элементов графика. 🎨

Начнем с настройки базового стиля всего графика:

Python
Скопировать код
# Установка стиля Seaborn
sns.set_theme(style="whitegrid") # Другие варианты: darkgrid, white, dark, ticks

# Установка контекста (размера элементов)
sns.set_context("paper") # Другие варианты: notebook, talk, poster

Теперь рассмотрим управление цветовой гаммой с помощью параметра palette:

Python
Скопировать код
# Использование встроенной палитры
plt.figure(figsize=(10, 6))
sns.countplot(data=tips, x='day', palette='viridis')
plt.title('Количество посещений по дням недели')
plt.show()

# Использование другой встроенной палитры с группировкой
plt.figure(figsize=(10, 6))
sns.countplot(data=tips, x='day', hue='time', palette='Set2')
plt.title('Количество посещений по дням недели и времени суток')
plt.show()

Seaborn предлагает богатый выбор палитр для различных типов данных:

  • Категориальные палитры: 'deep', 'pastel', 'dark', 'bright', 'muted', 'colorblind'
  • Последовательные палитры: 'Blues', 'BuGn', 'BuPu', 'GnBu', 'Greens', 'Oranges', 'OrRd'
  • Дивергентные палитры: 'coolwarm', 'RdBu', 'RdGy', 'PRGn', 'PiYG', 'BrBG'
  • Кастомные палитры: список цветов, например ['#f72585', '#7209b7', '#3a0ca3', '#4361ee']

Для более точной настройки внешнего вида графика, можно использовать дополнительные параметры:

Python
Скопировать код
# Продвинутая настройка внешнего вида
plt.figure(figsize=(12, 7))
ax = sns.countplot(
data=tips, 
x='day',
palette='rocket',
saturation=0.8, # Насыщенность цветов (0-1)
alpha=0.9, # Прозрачность (0-1)
edgecolor='black', # Цвет границы столбцов
linewidth=1 # Толщина границы
)

# Настройка сетки
ax.grid(axis='y', linestyle='--', alpha=0.7)

# Настройка заголовка и осей
plt.title('Распределение посещений по дням недели', fontsize=16, pad=20)
plt.xlabel('День недели', fontsize=12)
plt.ylabel('Количество посещений', fontsize=12)

# Настройка меток осей
plt.xticks(fontsize=10, rotation=0)
plt.yticks(fontsize=10)

# Добавление значений над столбцами
for p in ax.patches:
height = p.get_height()
ax.text(
p.get_x() + p.get_width() / 2.,
height + 3,
'{:d}'.format(int(height)),
ha='center', fontsize=9
)

plt.tight_layout()
plt.show()

Мария Соколова, Data Visualization Expert

На одном из проектов для крупного e-commerce клиента мы столкнулись с задачей визуализации огромного массива данных о пользовательских предпочтениях. Директор по маркетингу хотел понять, какие категории товаров наиболее популярны в разные сезоны. Классические графики выглядели перегруженными — более 30 категорий и 4 сезона создавали визуальный хаос.

Решение пришло неожиданно: я использовала Countplot с тщательно подобранной цветовой гаммой 'coolwarm', отсортировала категории по популярности и применила горизонтальную ориентацию. Результат произвел фурор на презентации — график был одновременно информативным и эстетически привлекательным. Клиент сразу определил сезонные тренды и пересмотрел маркетинговую стратегию, что привело к росту продаж на 18% в следующем квартале.

Этот случай научил меня, что в визуализации данных эстетика — это не просто украшение, а мощный инструмент коммуникации, способный превратить сложные данные в понятные инсайты.

Продвинутые параметры и кастомизация Countplot Seaborn

Стандартные настройки Countplot отлично работают для базовых задач, но при решении сложных аналитических проблем требуется более глубокая кастомизация. Рассмотрим продвинутые техники, позволяющие превратить обычный Countplot в профессиональный инструмент визуализации. 🚀

Начнем с сортировки категорий для повышения информативности графика:

Python
Скопировать код
# Сортировка категорий по частоте
# Сначала вычислим порядок категорий
order = tips['day'].value_counts().index

# Применим этот порядок к графику
plt.figure(figsize=(10, 6))
sns.countplot(data=tips, x='day', order=order)
plt.title('Дни недели, отсортированные по частоте посещений')
plt.show()

Для создания многоуровневых графиков можно использовать возможности FacetGrid:

Python
Скопировать код
# Создание многоуровневого графика с разбивкой по колонкам
g = sns.FacetGrid(tips, col="time", height=5, aspect=0.7)
g.map(sns.countplot, "day")
g.add_legend()
plt.show()

# Создание многоуровневого графика с разбивкой по строкам и колонкам
g = sns.FacetGrid(tips, col="time", row="smoker", height=4)
g.map(sns.countplot, "day")
g.add_legend()
plt.show()

Нормализация данных позволяет сравнивать группы разных размеров:

Python
Скопировать код
# Создание countplot с нормализацией (в процентах)
# Сначала вычислим проценты для каждой группы
pct_data = (tips
.groupby(['day', 'time'])
.size()
.reset_index(name='count')
)
total_counts = tips.groupby('time')['day'].count().reset_index(name='total')
pct_data = pct_data.merge(total_counts, on='time')
pct_data['percentage'] = pct_data['count'] / pct_data['total'] * 100

# Создадим график
plt.figure(figsize=(12, 6))
ax = sns.barplot(data=pct_data, x='day', y='percentage', hue='time')
plt.title('Процентное распределение посещений по дням недели и времени суток')
plt.ylabel('Процент (%)')
plt.show()

Для сравнения нескольких категорий можно использовать группированные bar plots:

Python
Скопировать код
# Группированный countplot с dodge=True (по умолчанию)
plt.figure(figsize=(12, 6))
sns.countplot(data=tips, x='day', hue='time', dodge=True)
plt.title('Группированное распределение по дням и времени суток')
plt.show()

# Стекированный bar plot (только через barplot, не countplot)
count_data = tips.groupby(['day', 'time']).size().reset_index(name='count')
plt.figure(figsize=(12, 6))
sns.barplot(data=count_data, x='day', y='count', hue='time', dodge=False)
plt.title('Стекированное распределение по дням и времени суток')
plt.show()

Добавление статистических аннотаций и текста:

Python
Скопировать код
# Добавление статистических аннотаций
plt.figure(figsize=(12, 6))
ax = sns.countplot(data=tips, x='day')

# Добавим проценты от общего количества
total = len(tips)
for p in ax.patches:
height = p.get_height()
percentage = '{:.1f}%'.format(100 * height / total)
ax.text(p.get_x() + p.get_width()/2,
height + 5,
percentage,
ha='center')

plt.title('Распределение по дням с процентами')
plt.ylim(0, max(tips['day'].value_counts()) * 1.15) # Увеличим лимит оси Y для текста
plt.show()

Параметры для продвинутой кастомизации Countplot:

  • dodge – Смещение столбцов при использовании hue (True/False)
  • saturation – Насыщенность цветов (0.0-1.0)
  • errorbar – Тип отображаемых планок погрешностей ('ci', 'sd', 'se', None)
  • estimator – Функция для агрегации (обычно len для countplot)
  • n_boot – Количество бутстрап-выборок для расчета доверительных интервалов
  • orient – Ориентация графика ('v' для вертикальной, 'h' для горизонтальной)
  • capsize – Ширина "шляпок" на планках ошибок

Для интеграции с более сложными визуализациями, можно комбинировать Countplot с другими типами графиков:

Python
Скопировать код
# Создание комбинированного графика
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10), sharex=True)

# Countplot на верхней панели
sns.countplot(data=tips, x='day', ax=ax1)
ax1.set_title('Количество посещений по дням')
ax1.set_xlabel('') # Уберем подпись оси X на верхнем графике

# Barplot средних чаевых на нижней панели
sns.barplot(data=tips, x='day', y='tip', ax=ax2)
ax2.set_title('Средняя сумма чаевых по дням')
ax2.set_xlabel('День недели')

plt.tight_layout()
plt.show()

Хотите определить, подойдет ли вам карьера в аналитике данных? Тест на профориентацию от Skypro поможет оценить ваши базовые навыки и предрасположенность к работе с данными и визуализациями. Тест включает практические задания на анализ числовых данных и интерпретацию графиков, что поможет понять, насколько вам будет комфортно работать с инструментами вроде Seaborn и насколько вы готовы к освоению профессии аналитика данных.

Практические кейсы применения Countplot в анализе данных

Теория становится по-настоящему полезной, когда применяется к реальным задачам. Рассмотрим несколько практических кейсов, где Countplot становится незаменимым инструментом визуализации. 📈

Кейс 1: Анализ продаж в интернет-магазине

Python
Скопировать код
# Загрузим синтетический датасет продаж
# В реальной ситуации это был бы ваш собственный DataFrame
sales_data = pd.DataFrame({
'category': np.random.choice(['Электроника', 'Одежда', 'Книги', 'Спорт', 'Дом'], 1000),
'customer_type': np.random.choice(['Новый', 'Постоянный'], 1000, p=[0\.3, 0.7]),
'payment_method': np.random.choice(['Карта', 'PayPal', 'Наличные'], 1000),
'weekday': np.random.choice(['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'], 1000),
'amount': np.random.normal(5000, 2000, 1000)
})

# Визуализация распределения продаж по категориям
plt.figure(figsize=(12, 6))
category_order = sales_data['category'].value_counts().index
ax = sns.countplot(data=sales_data, x='category', order=category_order, palette='viridis')
plt.title('Распределение продаж по категориям товаров', fontsize=14)
plt.xlabel('Категория товара', fontsize=12)
plt.ylabel('Количество продаж', fontsize=12)

# Добавление подписей с количеством и процентами
total = len(sales_data)
for p in ax.patches:
height = p.get_height()
percentage = '{:.1f}%'.format(100 * height / total)
ax.text(p.get_x() + p.get_width()/2, height + 10, 
f'{int(height)}\n{percentage}', ha='center', fontsize=9)

plt.ylim(0, max(sales_data['category'].value_counts()) * 1.15)
plt.tight_layout()
plt.show()

# Сравнение распределения по типу клиента и способу оплаты
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

sns.countplot(data=sales_data, x='customer_type', ax=ax1, palette='Set2')
ax1.set_title('Распределение клиентов по типу')
ax1.set_xlabel('Тип клиента')

sns.countplot(data=sales_data, x='payment_method', ax=ax2, palette='Set2')
ax2.set_title('Распределение по способу оплаты')
ax2.set_xlabel('Способ оплаты')

plt.tight_layout()
plt.show()

Кейс 2: Анализ активности пользователей мобильного приложения

Python
Скопировать код
# Создаем синтетический датасет активности пользователей
user_data = pd.DataFrame({
'user_id': np.arange(500),
'age_group': np.random.choice(['18-24', '25-34', '35-44', '45-54', '55+'], 500),
'device': np.random.choice(['iOS', 'Android'], 500, p=[0\.45, 0.55]),
'subscription_type': np.random.choice(['Free', 'Basic', 'Premium'], 500, p=[0\.6, 0.3, 0.1]),
'sessions_per_week': np.random.choice(['1-2', '3-5', '6+'], 500, p=[0\.4, 0.4, 0.2]),
'retention_days': np.random.lognormal(3, 1, 500).astype(int)
})

# Анализ распределения пользователей по типу подписки и устройству
plt.figure(figsize=(12, 6))
sns.countplot(data=user_data, x='subscription_type', 
hue='device', palette='coolwarm', 
order=['Free', 'Basic', 'Premium'])

plt.title('Распределение пользователей по типу подписки и устройству', fontsize=14)
plt.xlabel('Тип подписки', fontsize=12)
plt.ylabel('Количество пользователей', fontsize=12)
plt.legend(title='Устройство')

for container in plt.gca().containers:
plt.gca().bar_label(container, fmt='%d')

plt.tight_layout()
plt.show()

# Многоуровневый анализ активности пользователей
g = sns.FacetGrid(user_data, col="subscription_type", height=5, aspect=0.8,
col_order=['Free', 'Basic', 'Premium'])
g.map(sns.countplot, "sessions_per_week", order=['1-2', '3-5', '6+'])
g.set_axis_labels("Сеансов в неделю", "Количество пользователей")
g.set_titles("Подписка: {col_name}")
g.tight_layout()
plt.show()

Кейс 3: Анализ HR-данных и текучести кадров

Python
Скопировать код
# Создаем синтетический датасет HR-данных
hr_data = pd.DataFrame({
'department': np.random.choice(['IT', 'Маркетинг', 'Продажи', 'HR', 'Финансы'], 300),
'education': np.random.choice(['Среднее', 'Бакалавр', 'Магистр', 'PhD'], 300, p=[0\.1, 0.5, 0.3, 0.1]),
'experience_years': np.random.choice(['0-2', '3-5', '6-10', '10+'], 300),
'salary_level': np.random.choice(['Низкий', 'Средний', 'Высокий'], 300),
'left_company': np.random.choice([0, 1], 300, p=[0\.85, 0.15])
})

# Анализ текучести кадров по отделам
plt.figure(figsize=(12, 6))

# Здесь нам нужно сгруппировать данные, так как countplot не может
# напрямую показать пропорции по left_company
dept_turnover = hr_data.groupby(['department', 'left_company']).size().reset_index(name='count')

# Создаем график с отделами и группировкой по статусу ухода
sns.barplot(data=dept_turnover, x='department', y='count', hue='left_company', 
palette={0: 'lightblue', 1: 'salmon'})

plt.title('Текучесть кадров по отделам', fontsize=14)
plt.xlabel('Отдел', fontsize=12)
plt.ylabel('Количество сотрудников', fontsize=12)
plt.legend(title='Покинул компанию', labels=['Нет', 'Да'])

plt.tight_layout()
plt.show()

# Анализ факторов, влияющих на уход сотрудников
fig, axes = plt.subplots(2, 2, figsize=(15, 10))

factors = ['education', 'experience_years', 'salary_level', 'department']
positions = [(0,0), (0,1), (1,0), (1,1)]

for factor, pos in zip(factors, positions):
i, j = pos
sns.countplot(data=hr_data, x=factor, hue='left_company', 
palette={0: 'lightblue', 1: 'salmon'}, ax=axes[i,j])
axes[i,j].set_title(f'Распределение по {factor}')
axes[i,j].legend(title='Покинул компанию', labels=['Нет', 'Да'])

plt.tight_layout()
plt.show()

Сценарии применения Countplot в реальной аналитической работе:

ОтрасльЗадачаКак помогает Countplot
E-commerceАнализ популярности категорий товаровНаглядно показывает распределение продаж по категориям
МаркетингСегментация клиентской базыВизуализирует размеры различных сегментов аудитории
HR-аналитикаАнализ текучести кадровПозволяет выявить проблемные департаменты и причины ухода
ФинансыАнализ транзакций по типамПомогает выявить наиболее частые финансовые операции
ЗдравоохранениеРаспределение пациентов по диагнозамВизуализирует эпидемиологические данные и загрузку отделений

Визуализация данных с помощью Countplot в Seaborn — это не просто создание красивых графиков, а мощный инструмент для извлечения ценных инсайтов из категориальных данных. Освоив все возможности этого инструмента — от базовых настроек до продвинутой кастомизации — вы сможете эффективно коммуницировать паттерны в данных и принимать обоснованные решения. Помните, что лучший график — тот, который максимально четко передает нужное сообщение вашей аудитории. Экспериментируйте с параметрами, комбинируйте с другими типами визуализации и всегда учитывайте контекст и цель вашего анализа.