Ящик с усами в Python Pandas: построение и анализ диаграммы

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

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

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

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

    Данные без визуализации – все равно что автомобиль без колес: мощность есть, но двигаться некуда. Диаграмма "ящик с усами" (boxplot) – это не просто способ красиво оформить числа, а инструмент для мгновенного обнаружения выбросов, сравнения распределений и принятия решений на основе данных. В 2025 году, когда объемы информации растут экспоненциально, умение быстро интерпретировать данные через визуализацию превращается из полезного навыка в критическую необходимость. Разберем, как превратить колонки цифр в мощный аналитический инструмент с помощью Python Pandas. 📊

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

Что такое ящик с усами: основы диаграммы размаха

Диаграмма размаха (boxplot) – один из самых информативных инструментов визуализации, позволяющий мгновенно оценить распределение данных. Название "ящик с усами" она получила из-за характерной формы: центральный прямоугольник (ящик) с линиями (усами), выходящими из него.

Ящик с усами отображает пять ключевых статистических показателей:

  • Минимальное значение (нижний "ус")
  • Первый квартиль (Q1) – нижняя граница ящика
  • Медиана – линия внутри ящика
  • Третий квартиль (Q3) – верхняя граница ящика
  • Максимальное значение (верхний "ус")

Высота ящика (межквартильный размах, IQR) показывает разброс центральных 50% данных. "Усы" охватывают значения в пределах 1.5 × IQR от границ ящика. Точки за пределами усов считаются выбросами и отображаются отдельными маркерами.

Элемент диаграммыСтатистический показательИнтерпретация
Верхний усQ3 + 1.5 × IQRВерхняя граница "нормальных" значений
Верх ящикаQ3 (75-й перцентиль)75% значений находятся ниже этой границы
Линия внутри ящикаМедиана (50-й перцентиль)Центральное значение, делящее данные пополам
Низ ящикаQ1 (25-й перцентиль)25% значений находятся ниже этой границы
Нижний усQ1 – 1.5 × IQRНижняя граница "нормальных" значений
Точки за усамиВыбросыАномальные значения, требующие особого внимания

В отличие от гистограммы, которая показывает частоту значений, boxplot позволяет быстро сравнивать распределения нескольких групп данных на одном графике. Это особенно полезно при анализе больших наборов данных, когда нужно быстро выявить закономерности и аномалии. 🔍

Алексей Петров, ведущий data-аналитик: Однажды наша команда столкнулась с странной ситуацией: модель машинного обучения показывала отличные результаты на тестовых данных, но проваливалась в продакшене. Запустив стандартную визуализацию с гистограммами, мы не увидели ничего необычного. Но когда я построил boxplot для каждого признака, картина мгновенно прояснилась — в продакшн-данных присутствовало несколько экстремальных выбросов, которых не было в тестовой выборке. Эти значения выходили за пределы усов и были четко видны на диаграмме. Мы добавили обработку этих случаев, и точность модели выросла на 27%. С тех пор boxplot — первый инструмент, который я использую при анализе данных, еще до построения сложных моделей.

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

Создание ящика с усами в Python Pandas: пошаговое руководство

Библиотека Pandas предоставляет элегантный и лаконичный способ создания диаграмм размаха. Рассмотрим процесс от импорта библиотек до получения готового графика. 🐼

Базовый код для создания ящика с усами в Pandas:

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

# Создаем тестовые данные
np.random.seed(42) # Для воспроизводимости результатов
df = pd.DataFrame({
'Группа A': np.random.normal(0, 1, 100),
'Группа B': np.random.normal(2, 1.5, 100),
'Группа C': np.random.normal(-1, 2, 100)
})

# Построение базовой диаграммы размаха
df.boxplot()
plt.title('Сравнение распределений для трех групп')
plt.ylabel('Значения')
plt.show()

Этот код создает простую диаграмму размаха для трех групп данных. Каждая группа представлена отдельным ящиком, что позволяет легко сравнивать их распределения.

Если вам нужно построить boxplot только для определенных столбцов DataFrame, используйте:

Python
Скопировать код
# Выбор конкретных столбцов
df[['Группа A', 'Группа C']].boxplot()
plt.show()

Для вертикальной ориентации графика (что является стандартным поведением) не требуется дополнительных параметров. Если необходимо изменить ориентацию на горизонтальную:

Python
Скопировать код
# Горизонтальная ориентация
df.boxplot(vert=False)
plt.show()

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

Python
Скопировать код
# Создадим DataFrame с категориальными данными
sales_df = pd.DataFrame({
'Менеджер': np.random.choice(['Иван', 'Мария', 'Алексей', 'Ольга'], 100),
'Продажи': np.random.normal(50000, 15000, 100)
})

# Построение boxplot с группировкой по категории
sales_df.boxplot(column='Продажи', by='Менеджер')
plt.title('Распределение продаж по менеджерам')
plt.suptitle('') # Убираем дополнительный заголовок
plt.ylabel('Объем продаж, руб.')
plt.show()

Ключевые параметры, которые следует учитывать при создании диаграммы размаха:

  • column: столбец DataFrame для построения boxplot
  • by: категориальная переменная для группировки
  • grid: включение/отключение сетки (True/False)
  • rot: угол поворота меток оси (в градусах)
  • fontsize: размер шрифта для меток
  • figsize: размер фигуры в дюймах (ширина, высота)

Для анализа данных часто требуется построить несколько диаграмм на одном графике. Это легко реализуется с помощью подграфиков:

Python
Скопировать код
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
df[['Группа A', 'Группа B']].boxplot(ax=axes[0])
df[['Группа C']].boxplot(ax=axes[1])
axes[0].set_title('Группы A и B')
axes[1].set_title('Группа C')
plt.tight_layout()
plt.show()

При работе с реальными данными, особенно если они содержат временные ряды, boxplot может помочь выявить сезонность и тренды. Например, для анализа продаж по месяцам:

Python
Скопировать код
# Создание тестовых данных с датами
dates = pd.date_range('2025-01-01', periods=365, freq='D')
sales = np.random.normal(1000, 200, 365) + np.sin(np.arange(365)/30)*300
time_df = pd.DataFrame({'Дата': dates, 'Продажи': sales})

# Добавим столбец с месяцем
time_df['Месяц'] = time_df['Дата'].dt.month_name()

# Построение boxplot по месяцам
time_df.boxplot(column='Продажи', by='Месяц')
plt.title('Распределение продаж по месяцам')
plt.suptitle('')
plt.xticks(rotation=45)
plt.ylabel('Объем продаж')
plt.show()

Настройка и стилизация диаграммы размаха в Pandas

Базовый boxplot в Pandas функционален, но для профессиональных презентаций или публикаций часто требуется более тонкая настройка внешнего вида. Рассмотрим, как превратить стандартную диаграмму размаха в информативное и эстетически привлекательное визуальное представление данных. ✨

Марина Соколова, руководитель аналитического отдела: В 2024 году нам пришлось представлять результаты исследования эффективности работы различных отделов компании совету директоров. Исходные диаграммы размаха смотрелись неубедительно — стандартные серые ящики, которые совет директоров мог неправильно интерпретировать. Я потратила час на кастомизацию диаграмм: добавила фирменные цвета, четкие подписи, выделила критические выбросы и добавила отдельно показатель целевого KPI пунктирной линией. Эффект превзошел ожидания — лица директоров озарились пониманием, когда они увидели, как распределены показатели по отделам и насколько они отклоняются от целевых значений. Грамотная визуализация тут же перевела техническую дискуссию на язык бизнес-решений. С тех пор я всегда говорю своей команде: "Кастомизация визуализации — это не про дизайн, это про коммуникацию результатов".

Основные параметры стилизации диаграммы размаха через метод boxplot() в Pandas:

Python
Скопировать код
# Расширенная настройка внешнего вида
df.boxplot(
patch_artist=True, # Заливка ящиков цветом
boxprops={'facecolor': 'lightblue'}, # Цвет заливки ящика
medianprops={'color': 'red', 'linewidth': 2}, # Стиль медианы
whiskerprops={'color': 'black', 'linestyle': '--'}, # Стиль усов
capprops={'color': 'green', 'linewidth': 2}, # Стиль границ усов
flierprops={'marker': 'o', 'markerfacecolor': 'red', # Стиль выбросов
'markersize': 8, 'markeredgecolor': 'black'},
grid=True, # Включение сетки
vert=True, # Вертикальная ориентация
notch=True, # Добавление выемки для оценки доверительного интервала медианы
sym='*', # Символ для выбросов
return_type='dict' # Тип возвращаемого значения для дальнейшей настройки
)

plt.title('Усовершенствованная диаграмма размаха', fontsize=14)
plt.ylabel('Значения', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7) # Настройка сетки только по оси Y
plt.tight_layout()
plt.show()

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

Python
Скопировать код
# Создание индивидуальных boxplot для каждой группы
fig, ax = plt.subplots(figsize=(10, 6))

# Определим цвета для каждой группы
colors = ['#3498db', '#e74c3c', '#2ecc71']

# Создаем boxplot с кастомными цветами
bplot = ax.boxplot([df['Группа A'], df['Группа B'], df['Группа C']],
patch_artist=True, # Заливка ящиков
notch=True, # Выемка для доверительного интервала
vert=True, # Вертикальная ориентация
widths=0.35) # Ширина ящиков

# Настраиваем цвета для каждого ящика
for patch, color in zip(bplot['boxes'], colors):
patch.set_facecolor(color)
patch.set_alpha(0.7)

# Настройка других элементов
for whisker in bplot['whiskers']:
whisker.set(color='#7f8c8d', linewidth=1.5, linestyle='--')

for cap in bplot['caps']:
cap.set(color='#7f8c8d', linewidth=2)

for median in bplot['medians']:
median.set(color='white', linewidth=2)

for flier in bplot['fliers']:
flier.set(marker='o', markerfacecolor='#e74c3c', 
markersize=6, markeredgecolor='none')

# Добавление меток, заголовка и сетки
ax.set_xticklabels(['Группа A', 'Группа B', 'Группа C'])
ax.set_ylabel('Значения', fontsize=12)
ax.set_title('Кастомизированная диаграмма размаха', fontsize=14)
ax.yaxis.grid(True, linestyle='--', alpha=0.7)

# Добавление легенды для интерпретации цветов
from matplotlib.patches import Patch
legend_elements = [Patch(facecolor=color, edgecolor='black',
alpha=0.7, label=f'Группа {label}')
for color, label in zip(colors, ['A', 'B', 'C'])]
ax.legend(handles=legend_elements, loc='upper right')

plt.tight_layout()
plt.show()

Для сравнения разных стилей визуализации, рассмотрим таблицу с основными параметрами настройки и их эффектом:

ПараметрЗначениеВизуальный эффектПрименение
patch_artistTrue/FalseЗаливка ящиков цветомУлучшение различимости групп
notchTrue/FalseВыемки вокруг медианыВизуализация доверительного интервала
widths0-1Ширина ящикаРегулирование плотности графика
sym'o', '*', '+', и др.Символ для выбросовПовышение заметности аномалий
vertTrue/FalseОриентация (вертикальная/горизонтальная)Адаптация под формат презентации
showmeansTrue/FalseОтображение среднего значенияСравнение среднего с медианой
meanlineTrue/FalseОтображение линии среднегоАльтернативный способ показа среднего
showfliersTrue/FalseОтображение выбросовФокус на центральном распределении

Интеграция с современными темами matplotlib позволяет создавать диаграммы, соответствующие актуальным дизайнерским трендам 2025 года:

Python
Скопировать код
# Использование современных стилей
plt.style.use('seaborn-v0_8-whitegrid') # или 'ggplot', 'fivethirtyeight'

# Построение графика
df.boxplot(return_type='dict')

# Настройка цветовой схемы
plt.rcParams['axes.prop_cycle'] = plt.cycler(color=['#2c3e50', '#e74c3c', '#3498db', 
'#2ecc71', '#f1c40f', '#9b59b6'])

plt.tight_layout()
plt.show()

Неуверенны, подойдет ли вам карьера аналитика данных? Тест на профориентацию от Skypro поможет определить, насколько ваши навыки и предпочтения соответствуют профессии визуализатора данных. Всего за 3 минуты вы получите персонализированный отчет, который подскажет, стоит ли вам погружаться в мир Python Pandas и визуальной аналитики или лучше рассмотреть другие направления в IT. Узнайте свою профессиональную совместимость с данными прямо сейчас!

Интерпретация данных ящика с усами: ключевая аналитика

Умение строить boxplot — лишь половина дела. Ключевая ценность диаграммы размаха раскрывается при правильной интерпретации данных, которые она отображает. Разберем основные аналитические выводы, которые можно сделать на основе диаграммы "ящик с усами". 📈

Анализируя форму и положение boxplot, можно извлечь следующие инсайты:

  • Центральная тенденция: положение медианной линии показывает типичное значение для данных
  • Разброс данных: размер ящика (межквартильный размах) указывает на вариативность центральных 50% наблюдений
  • Асимметрия распределения: если медиана смещена от центра ящика, это свидетельствует о скошенности распределения
  • Выбросы: точки за пределами усов указывают на аномальные значения, требующие отдельного анализа
  • Сравнение групп: сопоставление нескольких boxplot позволяет выявить различия между группами данных

Для практической демонстрации интерпретации создадим и проанализируем boxplot на реалистичном примере:

Python
Скопировать код
# Создаем реалистичные данные для анализа
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

# Генерируем данные с разными распределениями
np.random.seed(42)
normal_data = np.random.normal(100, 15, 1000) # Нормальное распределение
skewed_right = np.random.exponential(20, 1000) + 70 # Правосторонняя асимметрия
skewed_left = 130 – np.random.exponential(20, 1000) # Левосторонняя асимметрия
bimodal = np.concatenate([
np.random.normal(85, 10, 500), 
np.random.normal(115, 10, 500)
]) # Бимодальное распределение

# Собираем в DataFrame
analysis_df = pd.DataFrame({
'Нормальное': normal_data,
'Правосторонняя асимметрия': skewed_right,
'Левосторонняя асимметрия': skewed_left,
'Бимодальное': bimodal
})

# Строим диаграмму размаха
plt.figure(figsize=(14, 7))
boxplot = analysis_df.boxplot(return_type='dict')

plt.title('Сравнение различных распределений данных')
plt.ylabel('Значения')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

Анализируя этот boxplot, можно сделать следующие наблюдения:

  1. Нормальное распределение: медиана примерно в центре ящика, усы симметричны, минимальное количество выбросов
  2. Правосторонняя асимметрия: медиана смещена к нижней границе ящика, верхний ус длиннее нижнего, много выбросов на верхнем конце
  3. Левосторонняя асимметрия: медиана смещена к верхней границе ящика, нижний ус длиннее верхнего, выбросы преимущественно у нижней границы
  4. Бимодальное распределение: медиана находится между пиками распределения, размер ящика больше, чем у нормального распределения

Ключевые соотношения для интерпретации формы boxplot:

ХарактеристикаНаблюдение в boxplotИнтерпретация
Симметричное распределениеМедиана в центре ящика, усы примерно равной длиныДанные распределены симметрично, возможно нормальное распределение
Правосторонняя асимметрияМедиана ближе к нижней границе, верхний ус длиннееБольшая часть данных сосредоточена в нижнем диапазоне с "хвостом" в верхнем
Левосторонняя асимметрияМедиана ближе к верхней границе, нижний ус длиннееБольшая часть данных сосредоточена в верхнем диапазоне с "хвостом" в нижнем
Узкий межквартильный размахКомпактный ящикДанные имеют низкую вариабельность, центральные значения близки
Широкий межквартильный размахШирокий ящикДанные имеют высокую вариабельность, разброс центральных значений
Много выбросовМножество точек за пределами усовДанные содержат аномалии, требующие дополнительного исследования
Отсутствие выбросовНет точек за пределами усовВсе данные укладываются в ожидаемый диапазон распределения

При сравнении нескольких boxplot обращайте внимание на следующие аспекты:

  • Перекрытие ящиков: если ящики сильно перекрываются, различия между группами могут быть статистически незначимыми
  • Выемки (notches): если выемки двух ящиков не перекрываются, это указывает на статистически значимое различие медиан (с 95% уверенностью)
  • Положение медиан: сравнение медиан показывает разницу в типичных значениях для разных групп
  • Различия в размерах ящиков: указывают на разную вариабельность данных в группах

Важно помнить, что boxplot – это лишь один из инструментов визуализации, и для полноценного анализа его следует дополнять другими методами, такими как гистограммы, скрипичные диаграммы (violin plots) и статистическими тестами. 🔍

Продвинутые техники анализа выбросов с помощью Pandas boxplot

В 2025 году обнаружение и анализ выбросов становится критически важным для построения точных моделей машинного обучения и принятия обоснованных бизнес-решений. Диаграмма размаха в Python Pandas предлагает мощный инструментарий для продвинутого анализа аномальных значений. 🔬

Стандартное определение выбросов в boxplot следует правилу "1.5 × IQR", но для более тонкого анализа можно настроить этот порог:

Python
Скопировать код
# Настройка параметра whis для изменения определения выбросов
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Создаем данные с известными выбросами
np.random.seed(42)
base_data = np.random.normal(100, 15, 200)
outliers = np.array([160, 165, 25, 30, 210])
combined_data = np.concatenate([base_data, outliers])

df_outliers = pd.DataFrame({
'Стандартное определение (1.5 IQR)': combined_data,
'Строгое определение (1.0 IQR)': combined_data,
'Мягкое определение (2.0 IQR)': combined_data
})

# Создаем подграфики для сравнения
fig, axes = plt.subplots(1, 3, figsize=(15, 6), sharey=True)

# Разные пороги для выбросов
df_outliers['Стандартное определение (1.5 IQR)'].plot.box(ax=axes[0], whis=1.5)
df_outliers['Строгое определение (1.0 IQR)'].plot.box(ax=axes[1], whis=1.0)
df_outliers['Мягкое определение (2.0 IQR)'].plot.box(ax=axes[2], whis=2.0)

axes[0].set_title('Стандартный (1.5 IQR)')
axes[1].set_title('Строгий (1.0 IQR)')
axes[2].set_title('Мягкий (2.0 IQR)')

# Добавляем общий заголовок
fig.suptitle('Сравнение разных порогов определения выбросов', fontsize=16)
plt.tight_layout()
plt.show()

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

Python
Скопировать код
def analyze_outliers(dataframe, column, whis=1.5):
"""
Комплексный анализ выбросов в указанном столбце DataFrame.

Параметры:
- dataframe: pd.DataFrame – исходный датафрейм
- column: str – название анализируемого столбца
- whis: float – множитель для определения границ выбросов (default: 1.5)

Возвращает:
- dict – словарь с результатами анализа
"""
# Расчет квартилей и IQR
q1 = dataframe[column].quantile(0.25)
q3 = dataframe[column].quantile(0.75)
iqr = q3 – q1

# Определение границ для выбросов
lower_bound = q1 – (whis * iqr)
upper_bound = q3 + (whis * iqr)

# Идентификация выбросов
outliers = dataframe[(dataframe[column] < lower_bound) | 
(dataframe[column] > upper_bound)]

# Визуализация
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# Boxplot
dataframe.boxplot(column=column, ax=ax1, whis=whis)
ax1.set_title(f'Диаграмма размаха для {column} (whis={whis})')

# Гистограмма с отмеченными границами выбросов
dataframe[column].hist(bins=30, ax=ax2)
ax2.axvline(x=lower_bound, color='r', linestyle='--', 
label=f'Нижняя граница ({lower_bound:.2f})')
ax2.axvline(x=upper_bound, color='g', linestyle='--', 
label=f'Верхняя граница ({upper_bound:.2f})')
ax2.legend()
ax2.set_title(f'Распределение {column} с границами выбросов')

plt.tight_layout()
plt.show()

# Сбор статистики о выбросах
n_lower_outliers = sum(dataframe[column] < lower_bound)
n_upper_outliers = sum(dataframe[column] > upper_bound)
total_outliers = n_lower_outliers + n_upper_outliers
outlier_percentage = (total_outliers / len(dataframe)) * 100

results = {
'Общее количество наблюдений': len(dataframe),
'Количество выбросов': total_outliers,
'Процент выбросов': outlier_percentage,
'Нижних выбросов': n_lower_outliers,
'Верхних выбросов': n_upper_outliers,
'Q1': q1,
'Q3': q3,
'IQR': iqr,
'Нижняя граница': lower_bound,
'Верхняя граница': upper_bound,
'Выбросы': outliers
}

return results

Эта функция позволяет не только визуализировать выбросы с помощью boxplot, но и получить детальную статистику о них, включая точные значения и их долю в общем наборе данных.

Для сравнения разных методов обработки выбросов, можно создать панель с несколькими boxplot:

Python
Скопировать код
# Создаем данные с выбросами
np.random.seed(42)
base_values = np.random.normal(100, 15, 200)
outliers = np.array([160, 165, 25, 30, 210])
data_with_outliers = np.concatenate([base_values, outliers])

# Создаем DataFrame
methods_df = pd.DataFrame({
'Исходные данные': data_with_outliers,
'Винзоризация': pd.Series(data_with_outliers).clip(
lower=pd.Series(data_with_outliers).quantile(0.05),
upper=pd.Series(data_with_outliers).quantile(0.95)
),
'Удаление выбросов': pd.Series(data_with_outliers)[
(pd.Series(data_with_outliers) >= pd.Series(data_with_outliers).quantile(0.25) – 
1.5 * (pd.Series(data_with_outliers).quantile(0.75) – pd.Series(data_with_outliers).quantile(0.25))) &
(pd.Series(data_with_outliers) <= pd.Series(data_with_outliers).quantile(0.75) + 
1.5 * (pd.Series(data_with_outliers).quantile(0.75) – pd.Series(data_with_outliers).quantile(0.25)))
],
'Логарифмическое преобразование': np.log1p(data_with_outliers – min(data_with_outliers) + 1)
})

# Создаем панель с boxplot для каждого метода
methods_df.boxplot(figsize=(14, 7))
plt.title('Сравнение методов обработки выбросов', fontsize=16)
plt.ylabel('Значения')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

Для реальных приложений часто требуется определить не только сам факт наличия выбросов, но и их влияние на статистические показатели и модели. Рассмотрим, как boxplot помогает визуализировать это влияние:

Python
Скопировать код
# Анализ влияния выбросов на статистические показатели
def outliers_impact_analysis(data):
"""Анализ влияния выбросов на статистические показатели"""
# Рассчитываем границы выбросов
q1 = data.quantile(0.25)
q3 = data.quantile(0.75)
iqr = q3 – q1
lower_bound = q1 – 1.5 * iqr
upper_bound = q3 + 1.5 * iqr

# Определяем маску для выбросов
outlier_mask = (data < lower_bound) | (data > upper_bound)

# Данные без выбросов
data_clean = data[~outlier_mask]

# Статистические показатели
stats_with_outliers = {
'Среднее': data.mean(),
'Медиана': data.median(),
'Стандартное отклонение': data.std(),
'Минимум': data.min(),
'Максимум': data.max()
}

stats_without_outliers = {
'Среднее': data_clean.mean(),
'Медиана': data_clean.median(),
'Стандартное отклонение': data_clean.std(),
'Минимум': data_clean.min(),
'Максимум': data_clean.max()
}

# Создаем визуализацию
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# Boxplot для сравнения
pd.DataFrame({
'С выбросами': data,
'Без выбросов': data_clean
}).boxplot(ax=ax1)
ax1.set_title('Сравнение данных с выбросами и без них')

# Сравнение статистических показателей
comparison = pd.DataFrame({
'С выбросами': stats_with_outliers,
'Без выбросов': stats_without_outliers,
'Изменение (%)': {k: (stats_without_outliers[k] – stats_with_outliers[k]) / 
stats_with_outliers[k] * 100 for k in stats_with_outliers}
})

# Визуализация изменений в статистике
comparison['Изменение (%)'].plot(kind='bar', ax=ax2)
ax2.set_title('Влияние выбросов на статистические показатели (%)')
ax2.set_ylabel('Изменение (%)')
ax2.grid(axis='y', linestyle='--', alpha=0.7)

plt.tight_layout()
plt.show()

return comparison

# Применяем анализ к нашим данным
outliers_impact_analysis(pd.Series(data_with_outliers))

Анализ выбросов с помощью Pandas boxplot может быть интегрирован в процесс подготовки данных для машинного обучения, что значительно повышает качество моделей и точность прогнозов. В 2025 году такой подход стал стандартом в индустрии анализа данных. 🚀

Ящик с усами — это не просто красивая диаграмма, а мощный аналитический инструмент, превращающий абстрактные числа в визуальные инсайты. Освоив построение и интерпретацию boxplot в Python Pandas, вы получаете супер-способность: за секунды определять тренды, аномалии и закономерности в данных. Этот навык трансформирует вас из обычного программиста или аналитика в специалиста, способного предсказывать проблемы до их возникновения и принимать решения на основе реальной картины данных. В мире, переполненном информацией, умение быстро отделить сигнал от шума — не просто преимущество, а необходимость.