Как вычислить среднее значение в Python Pandas: подробное руководство

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

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

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

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

    Вычисление средних значений — краеугольный камень анализа данных, без которого не обходится ни один серьезный проект в Python. Библиотека Pandas превращает этот процесс из математического кошмара в элегантное решение одной строкой кода. Однако за кажущейся простотой скрывается множество нюансов, которые отличают начинающего аналитика от профессионала. В этом руководстве я раскрою все тонкости использования метода mean() в Pandas — от базовых операций до продвинутых техник, применяемых в реальных аналитических задачах. 📊

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

Основы вычисления среднего в Pandas: метод mean()

Метод mean() в Pandas — это мощный инструмент для вычисления среднего арифметического значения в DataFrame или Series. Его синтаксис прост, а возможности гибки, что делает его незаменимым в арсенале каждого аналитика данных.

Базовый синтаксис метода выглядит следующим образом:

Python
Скопировать код
# Для Series
series.mean(axis=0, skipna=True, level=None, numeric_only=None)

# Для DataFrame
dataframe.mean(axis=0, skipna=True, level=None, numeric_only=None)

Рассмотрим ключевые параметры:

  • axis — определяет направление вычисления: 0 (по умолчанию) для среднего по столбцам, 1 для среднего по строкам
  • skipna — указывает, следует ли исключать пропущенные значения (NaN) из расчета
  • level — используется при работе с многоуровневыми индексами
  • numeric_only — если True, включает только числовые столбцы

Давайте рассмотрим простой пример вычисления среднего значения для DataFrame с данными о продажах:

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

# Создаем DataFrame с данными о продажах
sales_data = pd.DataFrame({
'Product': ['A', 'B', 'C', 'D', 'E'],
'Price': [100, 200, 150, 300, 250],
'Quantity': [5, 3, 8, 2, 4],
'Revenue': [500, 600, 1200, 600, 1000]
})

# Вычисляем среднее по числовым столбцам
print("Среднее по столбцам:")
print(sales_data.mean())

# Вычисляем среднее для конкретного столбца
print("\nСреднее значение цены:")
print(sales_data['Price'].mean())

# Вычисляем среднее по строкам
print("\nСреднее по строкам:")
print(sales_data.mean(axis=1))

В результате выполнения этого кода мы получим:

Среднее по столбцам:
Price 200.0
Quantity 4.4
Revenue 780.0
dtype: float64

Среднее значение цены:
200.0

Среднее по строкам:
0 201.666667
1 267.666667
2 452.666667
3 300.666667
4 418.000000
dtype: float64

В практических задачах особенно полезны следующие применения mean():

СценарийКодПрименение
Среднее по всем числовым столбцамdf.mean()Общий обзор данных
Среднее по конкретному столбцуdf['column'].mean()Анализ отдельной переменной
Среднее по строкамdf.mean(axis=1)Агрегация данных по записям
Среднее с условиемdf[df['A'] > 0].mean()Фильтрованный анализ

При работе с большими датасетами важно помнить, что метод mean() автоматически оптимизирует вычисления, используя векторизованные операции, что существенно повышает производительность по сравнению с итеративными подходами. 🚀

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

Обработка пропущенных значений при расчете mean в Pandas

Реальные данные редко бывают идеальными. Пропущенные значения (NaN) — частая проблема, способная исказить результаты анализа. Pandas предлагает изящные решения для корректного вычисления mean() при наличии пустых ячеек.

Александр Петров, старший аналитик данных

В начале моей карьеры я работал над проектом анализа потребительских расходов, где столкнулся с серьезной проблемой. Клиент жаловался на неправдоподобные средние значения в отчетах. Причина оказалась прозаичной: датасет содержал значительное количество пропусков, которые некорректно интерпретировались при вычислении средних. Исправив подход к обработке NaN-значений с помощью правильных параметров метода mean(), мы увидели совершенно иную картину. Расходы по категориям выровнялись, а сезонные колебания стали более выраженными, что позволило выявить скрытые тренды. Этот случай навсегда заставил меня с особым вниманием относиться к пропущенным данным в аналитических проектах.

По умолчанию параметр skipna=True в методе mean() исключает пропущенные значения из расчетов. Это интуитивно понятное поведение, но не всегда оптимальное для конкретной задачи. Рассмотрим различные подходы к работе с NaN при вычислении средних значений:

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

# Создаем DataFrame с пропущенными значениями
df = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5],
'B': [5, np.nan, np.nan, 2, 1],
'C': [1, 2, 3, 4, 5]
})

# Стандартное поведение (игнорирование NaN)
print("Среднее с игнорированием NaN:")
print(df.mean())

# Включение NaN в результаты (превращает любое среднее в NaN при наличии хотя бы одного NaN)
print("\nСреднее с включением NaN:")
print(df.mean(skipna=False))

# Предварительное заполнение NaN значений
print("\nСреднее после заполнения NaN средними по столбцам:")
print(df.fillna(df.mean()).mean())

# Заполнение NaN медианными значениями перед вычислением среднего
print("\nСреднее после заполнения NaN медианами:")
print(df.fillna(df.median()).mean())

# Заполнение NaN интерполяцией перед вычислением среднего
print("\nСреднее после линейной интерполяции NaN:")
print(df.interpolate(method='linear').mean())

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

  • Просто игнорировать NaN (наиболее распространенный подход)
  • Заменять NaN средними или медианными значениями
  • Использовать более сложные методы импутации, такие как KNN или MICE
  • Применять временные ряды интерполяции для последовательных данных
  • Полностью исключать строки или столбцы с высокой долей пропусков

Важно понимать долю пропущенных значений в ваших данных. Для этого можно использовать следующий код:

Python
Скопировать код
# Анализ пропущенных значений
missing_percentage = df.isna().mean() * 100
print("\nПроцент пропущенных значений по столбцам:")
print(missing_percentage)
Метод обработки NaNПреимуществаНедостаткиРекомендуемый контекст
skipna=True (по умолчанию)Простота, сохранение распределенияВозможная систематическая ошибкаДанные с небольшим % пропусков
Заполнение среднимСохранение общего среднегоИскажение вариацииРавномерно распределенные пропуски
Заполнение медианойУстойчивость к выбросамИскажение распределенияДанные с выбросами
Линейная интерполяцияСохранение трендовТребует последовательных данныхВременные ряды

Правильная обработка пропущенных значений перед вычислением mean() может значительно повысить достоверность аналитических выводов и качество моделей машинного обучения, построенных на этих данных. ⚠️

Вычисление среднего по группам с groupby и mean в Pandas

Комбинация методов groupby() и mean() — это мощный инструмент разведочного анализа данных, позволяющий выявлять закономерности и тренды в структурированных датасетах. Этот подход позволяет агрегировать данные по категориям и получать средние значения для каждой группы, что критически важно для сегментации и сравнительного анализа.

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

# Создаем DataFrame с данными о продажах по регионам и категориям
sales_data = pd.DataFrame({
'Region': ['East', 'West', 'North', 'South', 'East', 'West', 'North', 'South', 'East', 'West'],
'Category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Furniture', 'Furniture', 
'Furniture', 'Furniture', 'Office', 'Office'],
'Sales': [10000, 15000, 12000, 9000, 5000, 12000, 7500, 8000, 9000, 7500],
'Profit': [2000, 3000, 1800, 1500, 1000, 2500, 1200, 1300, 1800, 1500],
'Units': [100, 150, 120, 90, 50, 120, 75, 80, 90, 75]
})

# Простая группировка по одному столбцу
region_avg = sales_data.groupby('Region').mean()
print("Средние значения по регионам:")
print(region_avg)

# Группировка по нескольким столбцам
category_region_avg = sales_data.groupby(['Category', 'Region']).mean()
print("\nСредние значения по категориям и регионам:")
print(category_region_avg)

# Группировка с выбором конкретных столбцов для агрегации
profit_by_region = sales_data.groupby('Region')['Profit'].mean()
print("\nСреднее значение прибыли по регионам:")
print(profit_by_region)

# Несколько агрегирующих функций одновременно
multiple_aggs = sales_data.groupby('Region').agg({
'Sales': ['mean', 'sum', 'count'],
'Profit': ['mean', 'min', 'max']
})
print("\nНесколько агрегаций по регионам:")
print(multiple_aggs)

Метод groupby() обеспечивает значительную гибкость при анализе данных:

  • Поддерживает группировку по одному или нескольким столбцам
  • Позволяет выбирать конкретные столбцы для агрегации
  • Комбинируется с различными агрегирующими функциями, не только mean()
  • Работает с иерархическими индексами (MultiIndex)
  • Поддерживает пользовательские агрегирующие функции

Елена Соколова, руководитель отдела аналитики

В прошлом году мы работали над оптимизацией маркетингового бюджета для крупного онлайн-ритейлера. Изначально клиент просто "размазывал" бюджет равномерно по всем категориям и регионам. Применив group by + mean к историческим данным о продажах, мы обнаружили, что ROAS (возврат инвестиций на рекламу) кардинально различается между сегментами. Например, категория "Электроника" в Западном регионе приносила в 2.7 раза больше прибыли на рекламный рубль, чем та же категория на Востоке. Перераспределив бюджет с учетом этих инсайтов, мы повысили общую эффективность маркетинга на 23% без увеличения затрат. Это стало возможным только благодаря правильной сегментации и анализу средних значений в каждой группе.

Продвинутые техники использования groupby с mean() включают:

Python
Скопировать код
# Сортировка результатов по среднему значению
sorted_profits = sales_data.groupby('Region')['Profit'].mean().sort_values(ascending=False)
print("Регионы, отсортированные по средней прибыли (по убыванию):")
print(sorted_profits)

# Фильтрация групп на основе агрегированных результатов
high_sales_regions = sales_data.groupby('Region').filter(lambda x: x['Sales'].mean() > 10000)
print("\nДанные только для регионов с высокими средними продажами:")
print(high_sales_regions)

# Преобразование данных внутри каждой группы
normalized = sales_data.groupby('Region').transform(lambda x: (x – x.mean()) / x.std())
print("\nНормализованные данные внутри каждой группы (первые 5 строк):")
print(normalized.head())

# Вычисление кумулятивного среднего
sales_data['Cumulative_Avg'] = sales_data.groupby('Region')['Sales'].expanding().mean().reset_index(level=0, drop=True)
print("\nКумулятивное среднее продаж по регионам (первые 5 строк):")
print(sales_data[['Region', 'Sales', 'Cumulative_Avg']].head())

Метод groupby().mean() особенно ценен в следующих сценариях:

  • Сегментный анализ поведения пользователей или клиентов
  • Оценка эффективности бизнес-стратегий по различным категориям
  • Географический анализ показателей эффективности
  • Временной анализ с группировкой по периодам (дням, месяцам, кварталам)
  • Подготовка данных для визуализаций или дашбордов

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

Визуализация средних значений в DataFrame Pandas

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

Существует несколько подходов к визуализации средних значений:

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

# Создаем датасет для примера
np.random.seed(42)
dates = pd.date_range('20220101', periods=100)
df = pd.DataFrame({
'date': dates,
'category': np.random.choice(['A', 'B', 'C', 'D'], size=100),
'region': np.random.choice(['North', 'South', 'East', 'West'], size=100),
'sales': np.random.normal(1000, 200, size=100),
'profit': np.random.normal(200, 50, size=100)
})
df['date'] = pd.to_datetime(df['date'])
df['month'] = df['date'].dt.month
df['year'] = df['date'].dt.year

# Базовая визуализация с помощью встроенных методов Pandas
monthly_avg = df.groupby('month')['sales'].mean()
monthly_avg.plot(kind='bar', figsize=(10, 6), title='Средние продажи по месяцам')
plt.tight_layout()
plt.show()

# Визуализация средних значений с группировкой по категориям с помощью Seaborn
plt.figure(figsize=(12, 6))
sns.barplot(x='category', y='profit', data=df, estimator=np.mean)
plt.title('Средняя прибыль по категориям')
plt.show()

# Тепловая карта средних значений
pivot_table = df.pivot_table(
values='sales', 
index='region', 
columns='category',
aggfunc='mean'
)

plt.figure(figsize=(10, 8))
sns.heatmap(pivot_table, annot=True, cmap='Blues', fmt='.0f')
plt.title('Средние продажи по регионам и категориям')
plt.show()

# Line plot для временных рядов
time_series_avg = df.groupby(['year', 'month'])['sales'].mean().reset_index()
plt.figure(figsize=(12, 6))
sns.lineplot(x='month', y='sales', hue='year', data=time_series_avg, marker='o')
plt.title('Тренд средних продаж по месяцам')
plt.show()

# Boxplot для сравнения распределений вместе со средними значениями
plt.figure(figsize=(12, 6))
sns.boxplot(x='region', y='profit', data=df)
# Наложение средних значений поверх boxplot
sns.pointplot(x='region', y='profit', data=df, estimator=np.mean, color='k', scale=0.5)
plt.title('Распределение прибыли по регионам со средними значениями')
plt.show()

Выбор типа визуализации зависит от характера анализируемых данных и цели представления:

Тип визуализацииМетод созданияЛучшее применениеПреимущества
Bar Chartdf.plot(kind='bar')Категориальные сравненияПростота интерпретации
Line Chartdf.plot() или sns.lineplot()Временные ряды, трендыОтображение динамики
Heatmapsns.heatmap(pivot_table)Мультивариационный анализКомпактное представление
Boxplot + Meansns.boxplot() + sns.pointplot()Распределения с выбросамиКонтекст распределения
Scatter с группировкойsns.scatterplot()Корреляции между группамиВыявление кластеров

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

  • Добавлять полосы погрешности (error bars) для оценки вариативности данных
  • Использовать цветовое кодирование для выделения групп или категорий
  • Сортировать данные по средним значениям для улучшения восприятия
  • Применять логарифмические шкалы для данных с большим разбросом значений
  • Добавлять контекст с помощью аннотаций и текстовых меток
Python
Скопировать код
# Улучшенная визуализация с сортировкой, подписями и полосами погрешности
category_stats = df.groupby('category')['profit'].agg(['mean', 'std']).reset_index()
category_stats = category_stats.sort_values('mean', ascending=False)

plt.figure(figsize=(12, 7))
bars = plt.bar(category_stats['category'], category_stats['mean'], 
yerr=category_stats['std'], ecolor='black', capsize=10, alpha=0.7)

# Добавляем числовые метки над столбцами
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 5, f'{height:.1f}',
ha='center', va='bottom', fontweight='bold')

plt.title('Средняя прибыль по категориям с доверительными интервалами', fontsize=14)
plt.xlabel('Категория', fontsize=12)
plt.ylabel('Средняя прибыль', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

Интерактивные визуализации с использованием Plotly позволяют получить еще больше инсайтов из средних значений:

Python
Скопировать код
import plotly.express as px

# Интерактивная визуализация средних значений
fig = px.bar(
category_stats, 
x='category', 
y='mean',
error_y='std',
title='Интерактивная визуализация средней прибыли по категориям',
labels={'mean': 'Средняя прибыль', 'category': 'Категория'}
)
fig.update_layout(xaxis_categoryorder='total descending')
fig.show()

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

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

Практические кейсы применения mean в Pandas для аналитики

В реальной аналитической практике метод mean() редко используется изолированно. Чаще всего он встроен в комплексные рабочие процессы, где средние значения служат ключевыми индикаторами или промежуточными шагами анализа. Рассмотрим несколько практических кейсов, демонстрирующих силу этого, казалось бы, простого метода.

Кейс 1: Анализ выбросов с помощью Z-score

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

# Создаем датасет с выбросами
np.random.seed(42)
df = pd.DataFrame({
'customer_id': range(1, 1001),
'purchase_amount': np.random.normal(100, 20, size=1000)
})

# Добавляем несколько выбросов
df.loc[df.sample(n=5).index, 'purchase_amount'] = np.random.normal(300, 50, size=5)

# Вычисляем Z-score с использованием mean()
mean_purchase = df['purchase_amount'].mean()
std_purchase = df['purchase_amount'].std()
df['z_score'] = (df['purchase_amount'] – mean_purchase) / std_purchase

# Выявляем выбросы (|Z| > 3)
outliers = df[abs(df['z_score']) > 3]

print(f"Обнаружено {len(outliers)} выбросов из {len(df)} записей")
print("\nПримеры выбросов:")
print(outliers.head())

# Визуализация выбросов
plt.figure(figsize=(12, 6))
plt.scatter(df.index, df['purchase_amount'], alpha=0.5)
plt.scatter(outliers.index, outliers['purchase_amount'], color='red', label='Outliers')
plt.axhline(y=mean_purchase, color='green', linestyle='--', label=f'Mean: {mean_purchase:.2f}')
plt.axhline(y=mean_purchase + 3*std_purchase, color='red', linestyle='--', 
label=f'Upper threshold: {mean_purchase + 3*std_purchase:.2f}')
plt.axhline(y=mean_purchase – 3*std_purchase, color='red', linestyle='--',
label=f'Lower threshold: {mean_purchase – 3*std_purchase:.2f}')
plt.legend()
plt.title('Выявление выбросов методом Z-score')
plt.tight_layout()
plt.show()

Кейс 2: Анализ эффективности маркетинговых каналов с ROI

Python
Скопировать код
# Создаем данные о маркетинговых каналах
channels_data = pd.DataFrame({
'channel': ['Search', 'Social', 'Email', 'Direct', 'Affiliate'] * 20,
'cost': np.random.normal(1000, 200, 100),
'revenue': np.random.normal(3000, 1000, 100),
'date': pd.date_range(start='2022-01-01', periods=100)
})

# Вычисляем ROI
channels_data['roi'] = (channels_data['revenue'] – channels_data['cost']) / channels_data['cost'] * 100

# Анализируем среднюю эффективность каналов
channel_performance = channels_data.groupby('channel').agg({
'cost': 'sum',
'revenue': 'sum',
'roi': 'mean'
}).sort_values('roi', ascending=False)

print("Эффективность маркетинговых каналов:")
print(channel_performance)

# Анализируем динамику по месяцам
channels_data['month'] = channels_data['date'].dt.month
monthly_performance = channels_data.groupby(['channel', 'month']).agg({
'roi': 'mean'
}).reset_index()

# Визуализируем динамику ROI по каналам
plt.figure(figsize=(14, 7))
for channel in channels_data['channel'].unique():
channel_data = monthly_performance[monthly_performance['channel'] == channel]
plt.plot(channel_data['month'], channel_data['roi'], marker='o', label=channel)

plt.title('Динамика среднего ROI по маркетинговым каналам')
plt.xlabel('Месяц')
plt.ylabel('Средний ROI, %')
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()

Кейс 3: Когортный анализ с использованием скользящих средних

Python
Скопировать код
# Создаем данные для когортного анализа
cohort_data = pd.DataFrame({
'user_id': np.repeat(range(1, 101), 6),
'cohort': np.repeat(['2022-01', '2022-02', '2022-03', '2022-04'], [150, 150, 150, 150]),
'month': np.tile(range(1, 7), 100),
'revenue': np.random.exponential(scale=50, size=600) * \
np.exp(-np.tile(range(0, 6), 100) * 0.1) # Моделируем затухание
})

# Вычисляем средний доход по когортам и месяцам
cohort_analysis = cohort_data.groupby(['cohort', 'month'])['revenue'].mean().unstack().round(2)
print("Средний доход по когортам и месяцам жизни:")
print(cohort_analysis)

# Вычисляем retention rate (относительно первого месяца)
retention = cohort_analysis.div(cohort_analysis[1], axis=0) * 100
retention = retention.round(1)
print("\nRetention rate по месяцам (%):")
print(retention)

# Визуализируем retention rate
plt.figure(figsize=(12, 8))
sns.heatmap(retention, annot=True, cmap='YlGnBu', 
fmt='.1f', linewidths=.5, cbar_kws={'label': 'Retention Rate, %'})
plt.title('Retention Rate по когортам')
plt.ylabel('Когорта')
plt.xlabel('Месяц жизни')
plt.tight_layout()
plt.show()

# Вычисляем скользящее среднее для сглаживания трендов
rolling_means = cohort_data.groupby(['cohort', 'month'])['revenue'].mean().groupby('cohort').rolling(window=3).mean()
rolling_means = rolling_means.reset_index().pivot(index='cohort', columns='month', values='revenue')
print("\nСкользящее среднее (окно=3) по когортам:")
print(rolling_means)

Кейс 4: Анализ A/B-теста с доверительными интервалами

Python
Скопировать код
from scipy import stats

# Создаем данные для A/B-теста
np.random.seed(42)
ab_data = pd.DataFrame({
'user_id': range(1, 1001),
'variant': np.random.choice(['A', 'B'], size=1000),
'conversion': np.random.choice([0, 1], size=1000, p=[0\.9, 0.1]), # Базовая конверсия 10%
})

# Повышаем вероятность конверсии для варианта B
ab_data.loc[ab_data['variant'] == 'B', 'conversion'] = \
np.random.choice([0, 1], size=len(ab_data[ab_data['variant'] == 'B']), p=[0\.85, 0.15])

# Вычисляем конверсию по группам
conversion_rates = ab_data.groupby('variant')['conversion'].mean() * 100
print("Конверсия по вариантам (%):")
print(conversion_rates)

# Вычисляем размеры выборок
sample_sizes = ab_data.groupby('variant').size()

# Вычисляем доверительные интервалы (95%)
confidence = 0.95
z_score = stats.norm.ppf((1 + confidence) / 2)

ci_a = z_score * np.sqrt((conversion_rates['A'] * (100 – conversion_rates['A'])) / sample_sizes['A'])
ci_b = z_score * np.sqrt((conversion_rates['B'] * (100 – conversion_rates['B'])) / sample_sizes['B'])

print(f"\nВариант A: {conversion_rates['A']:.2f}% ± {ci_a:.2f}%")
print(f"Вариант B: {conversion_rates['B']:.2f}% ± {ci_b:.2f}%")

# Визуализация результатов A/B-теста
plt.figure(figsize=(10, 6))
bars = plt.bar(['A', 'B'], conversion_rates, 
yerr=[ci_a, ci_b], capsize=10, alpha=0.7, color=['skyblue', 'lightgreen'])

# Добавляем числовые метки
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 0.5, f'{height:.2f}%',
ha='center', va='bottom', fontweight='bold')

plt.title('Результаты A/B-теста с 95% доверительными интервалами', fontsize=14)
plt.ylabel('Конверсия, %', fontsize=12)
plt.ylim(0, max(conversion_rates) * 1.3)
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()

Каждый из этих кейсов демонстрирует, как метод mean() становится частью более сложного аналитического процесса, где средние значения:

  • Служат контрольными точками для выявления аномалий
  • Работают как KPI для оценки эффективности
  • Формируют основу для сегментации и сравнения групп
  • Становятся индикаторами качества и тенденций
  • Предоставляют материал для обоснования бизнес-решений

Ключевое преимущество Pandas в том, что метод mean() оптимизирован для работы с большими объемами данных и легко интегрируется в различные аналитические рабочие процессы — от разведочного анализа до углубленных статистических исследований. 💡

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