Как использовать quantile в pandas: вычисление квантилей данных

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

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

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

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

Работая с большими наборами данных, аналитики часто сталкиваются с необходимостью быстро понять распределение значений. Именно здесь на помощь приходят квантили — мощный статистический инструмент, позволяющий разделить данные на равные части и выявить ключевые пороговые значения. В библиотеке Pandas функция quantile() является незаменимым инструментом для такого анализа, позволяя одной строкой кода получить медиану, квартили или любые другие процентили. Эта функциональность критически важна при выявлении выбросов, создании сегментов данных и построении бизнес-метрик — от определения SLA до расчета ценовых порогов. 🔍

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

Основы квантилей в статистике и Pandas

Квантиль — это значение, которое делит набор данных на равные части. Простыми словами, q-й квантиль — это такое значение, ниже которого находится q доля (или процент) всех наблюдений. Например, медиана (0.5 квантиль) разделяет набор данных таким образом, что 50% значений находятся ниже этой точки, а 50% — выше.

Наиболее часто используемые виды квантилей:

  • Квартили — делят данные на 4 равные части (0.25, 0.5, 0.75)
  • Децили — делят данные на 10 равных частей (0.1, 0.2, ..., 0.9)
  • Процентили — делят данные на 100 равных частей (0.01, 0.02, ..., 0.99)

В Pandas метод quantile() реализует вычисление квантилей как для одномерных (Series), так и для многомерных (DataFrame) данных. Это позволяет аналитикам получать критические статистические показатели распределения данных всего одной строкой кода.

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

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

Вместо того, чтобы использовать среднее значение, которое искажалось из-за выбросов, мы применили квантильный анализ. Я написал следующий код:

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

# Загрузка данных о времени завершения модулей
completion_times = pd.read_csv('module_completion.csv')

# Расчет квантилей
quantiles = completion_times['days_to_complete'].quantile([0\.25, 0.5, 0.75, 0.9])
print(quantiles)

Результаты показали, что 50% студентов завершали модуль за 14 дней или меньше, а 90-й процентиль составлял 31 день. Мы настроили автоматические уведомления поддержки для студентов, которые приближались к 90-му процентилю времени завершения, что привело к снижению оттока на 23% за квартал.

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

МетрикаPandas методМатематическое значение
Медианаdf.median() или df.quantile(0.5)Значение, делящее выборку пополам
Первый квартиль (Q1)df.quantile(0.25)Значение, ниже которого 25% наблюдений
Третий квартиль (Q3)df.quantile(0.75)Значение, ниже которого 75% наблюдений
90-й процентильdf.quantile(0.9)Значение, ниже которого 90% наблюдений
Межквартильный размах (IQR)df.quantile(0.75) – df.quantile(0.25)Разница между Q3 и Q1, мера разброса данных
Кинга Идем в IT: пошаговый план для смены профессии

Синтаксис метода quantile() в Pandas

Метод quantile() в Pandas имеет гибкий синтаксис, позволяющий аналитикам точно настраивать вычисление квантилей в соответствии с их конкретными потребностями. Базовая форма вызова выглядит следующим образом:

Python
Скопировать код
# Для Series
series.quantile(q=0.5, interpolation='linear')

# Для DataFrame
dataframe.quantile(q=0.5, interpolation='linear', axis=0, numeric_only=True)

Рассмотрим основные параметры функции quantile():

  • q — квантиль или список квантилей, которые нужно вычислить. Может принимать значения от 0 до 1. По умолчанию 0.5 (медиана).
  • interpolation — метод интерполяции при расчете квантилей ('linear', 'lower', 'higher', 'midpoint', 'nearest'). По умолчанию 'linear'.
  • axis — ось, вдоль которой вычислять квантили (0 для строк, 1 для столбцов). По умолчанию 0.
  • numeric_only — учитывать только числовые столбцы. По умолчанию True.

Рассмотрим примеры использования разных вариантов синтаксиса quantile() на практике:

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

# Создаем пример данных
df = pd.DataFrame({
'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'B': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
'C': [5, 5, 6, 7, 8, 9, 10, 11, 12, 13]
})

# Расчет единичного квантиля (медианы) для всего DataFrame
print("Медиана по всем столбцам:")
print(df.quantile())

# Расчет нескольких квантилей сразу
print("\nКвартили (25%, 50%, 75%):")
print(df.quantile([0\.25, 0.5, 0.75]))

# Расчет квантилей по столбцам (ось 0)
print("\nМедиана по столбцам (ось 0):")
print(df.quantile(0.5, axis=0))

# Расчет квантилей по строкам (ось 1)
print("\nМедиана по строкам (ось 1):")
print(df.quantile(0.5, axis=1))

При работе с различными типами данных важно помнить, что метод quantile() по умолчанию работает только с числовыми столбцами. Если в DataFrame есть нечисловые данные, вы можете установить numeric_only=False, чтобы получить ошибку, или просто выбрать только числовые столбцы перед вычислением квантилей. 📊

Вычисление квантилей DataFrame и Series

Рассмотрим подробнее, как вычислять квантили для разных структур данных в Pandas. Начнем с Series — одномерных структур данных, аналогичных массивам или столбцам в таблицах.

Квантили для Series

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

# Создаем Series с данными о зарплатах сотрудников (в тысячах)
salaries = pd.Series([45, 50, 55, 60, 65, 70, 75, 80, 90, 150, 200, 250])

# Вычисляем медиану
median_salary = salaries.quantile(0.5)
print(f"Медианная зарплата: {median_salary} тыс.")

# Вычисляем несколько квантилей одновременно
salary_quantiles = salaries.quantile([0\.1, 0.25, 0.5, 0.75, 0.9])
print("\nРаспределение зарплат:")
print(salary_quantiles)

# Вычисляем межквартильный размах (IQR)
iqr = salaries.quantile(0.75) – salaries.quantile(0.25)
print(f"\nМежквартильный размах (IQR): {iqr} тыс.")

# Определяем выбросы по правилу 1.5*IQR
lower_bound = salaries.quantile(0.25) – 1.5 * iqr
upper_bound = salaries.quantile(0.75) + 1.5 * iqr
outliers = salaries[(salaries < lower_bound) | (salaries > upper_bound)]
print("\nВыбросы в данных:")
print(outliers)

Квантили для Series позволяют быстро получить представление о распределении данных по одному параметру. Особенно полезно для выявления выбросов и понимания центральных тенденций.

Квантили для DataFrame

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

Python
Скопировать код
# Создаем DataFrame с данными о клиентах банка
customer_data = pd.DataFrame({
'Age': [25, 30, 35, 40, 45, 50, 55, 60, 65, 70],
'Income': [35000, 40000, 50000, 55000, 60000, 65000, 70000, 80000, 90000, 100000],
'Credit_Score': [650, 700, 750, 800, 720, 680, 740, 780, 710, 690],
'Loan_Amount': [5000, 15000, 20000, 30000, 35000, 40000, 45000, 50000, 55000, 60000]
})

# Вычисляем квантили по столбцам (для каждого параметра)
column_quantiles = customer_data.quantile([0\.25, 0.5, 0.75])
print("Квантили по параметрам клиентов:")
print(column_quantiles)

# Вычисляем квантили по строкам (для каждого клиента)
row_quantiles = customer_data.quantile(0.5, axis=1)
print("\nМедианные значения по клиентам:")
print(row_quantiles)

# Вычисляем квантили только для выбранных столбцов
selected_quantiles = customer_data[['Income', 'Loan_Amount']].quantile([0\.1, 0.9])
print("\nДецили для доходов и сумм займа:")
print(selected_quantiles)

При работе с DataFrame важно понимать, что параметр axis определяет, как будут рассчитываться квантили:

  • axis=0 (по умолчанию) — вычисляет квантили для каждого столбца отдельно
  • axis=1 — вычисляет квантили по строкам (по всем значениям для каждой записи)
ОперацияSeriesDataFrame
Единичный квантильseries.quantile(0.5)df.quantile(0.5) — по столбцам
Множественные квантилиseries.quantile([0\.25, 0.5, 0.75])df.quantile([0\.25, 0.5, 0.75])
По строкамНеприменимоdf.quantile(0.5, axis=1)
Для подмножестваseries[condition].quantile()df[['col1', 'col2']].quantile()
С группировкойНеприменимоdf.groupby('category')['value'].quantile()

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

Параметры интерполяции квантилей в Pandas

Когда мы вычисляем квантили, возникает вопрос: что делать, если точное квантильное значение попадает между двумя наблюдаемыми значениями? Именно для решения этой проблемы в методе quantile() существует параметр interpolation, определяющий стратегию интерполяции. Выбор метода интерполяции может существенно влиять на результаты, особенно при работе с небольшими наборами данных. 🔢

Pandas предоставляет следующие методы интерполяции:

  • linear (по умолчанию) — линейная интерполяция между ближайшими рангами
  • lower — выбирает наблюдение с рангом, не превышающим квантиль
  • higher — выбирает наблюдение с рангом, не меньшим квантиля
  • nearest — выбирает наблюдение с ближайшим рангом
  • midpoint — среднее между двумя ближайшими наблюдениями

Рассмотрим, как различные методы интерполяции влияют на результат:

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

# Создаем небольшой набор данных
small_series = pd.Series([10, 20, 30, 40, 50, 60])

# Сравниваем результаты разных методов интерполяции
interpolation_methods = ['linear', 'lower', 'higher', 'nearest', 'midpoint']
q_value = 0.35 # Выбираем квантиль, который попадет между наблюдениями

print(f"Вычисление {q_value}-квантиля с разными методами интерполяции:")
for method in interpolation_methods:
quantile_value = small_series.quantile(q_value, interpolation=method)
print(f"{method}: {quantile_value}")

Рассмотрим пример, когда выбор метода интерполяции критически важен:

Python
Скопировать код
# Данные о времени загрузки страницы (в мс)
load_times = pd.Series([95, 98, 102, 105, 110, 115, 120, 350, 400, 450])

# Вычисляем 90-й процентиль с разными методами
print("\nОценка производительности – 90-й процентиль времени загрузки:")
for method in interpolation_methods:
p90 = load_times.quantile(0.9, interpolation=method)
print(f"{method}: {p90} мс")

На практике выбор метода интерполяции может быть диктован требованиями предметной области:

  • Для финансового анализа и управления рисками часто используется 'higher', чтобы обеспечить консервативную оценку
  • В научных исследованиях часто предпочитают 'linear' или 'midpoint' для более сбалансированной оценки
  • При анализе производительности систем 'higher' поможет установить реалистичные SLA
  • Для оптимизации бизнес-процессов 'linear' обычно даст наиболее репрезентативные результаты

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

Квантильный анализ — мощный инструмент, который находит применение в различных сферах аналитики. Рассмотрим несколько практических примеров, демонстрирующих, как методы quantile() в Pandas применяются для решения реальных задач. 📈

1. Обнаружение выбросов в данных

Метод межквартильного размаха (IQR) — один из наиболее распространенных способов обнаружения аномалий:

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

# Данные о стоимости домов (в тыс. $)
house_prices = pd.Series([250, 280, 300, 320, 350, 370, 390, 
410, 430, 450, 470, 500, 800, 950, 1200])

# Расчет квартилей и IQR
q1 = house_prices.quantile(0.25)
q3 = house_prices.quantile(0.75)
iqr = q3 – q1

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

# Выявление выбросов
outliers = house_prices[(house_prices < lower_bound) | (house_prices > upper_bound)]
print(f"Границы нормального диапазона: ${lower_bound:.2f}K – ${upper_bound:.2f}K")
print(f"Выбросы: {outliers.values}")

# Очищенный набор данных
clean_data = house_prices[(house_prices >= lower_bound) & (house_prices <= upper_bound)]
print(f"\nСреднее до очистки: ${house_prices.mean():.2f}K")
print(f"Среднее после очистки: ${clean_data.mean():.2f}K")

2. Бинирование данных на основе квантилей

Разбиение непрерывных данных на категории часто делается с помощью квантилей:

Python
Скопировать код
# Данные о доходе клиентов (в тыс. $ в год)
customer_income = pd.Series([35, 40, 42, 45, 48, 50, 52, 55, 58, 60, 
65, 70, 75, 80, 85, 90, 100, 120, 150, 200])

# Разбиение на квартили
income_bins = pd.qcut(customer_income, q=4)
print("Распределение клиентов по квартилям дохода:")
print(income_bins.value_counts())

# Разбиение на произвольное число бинов с равным числом наблюдений
income_bins_custom = pd.qcut(customer_income, q=[0, 0.2, 0.4, 0.8, 1.0], 
labels=['Низкий', 'Ниже среднего', 'Выше среднего', 'Высокий'])
print("\nРаспределение клиентов по кастомным категориям дохода:")
print(income_bins_custom.value_counts())

# Применение к DataFrame
customer_df = pd.DataFrame({
'ID': range(1, len(customer_income) + 1),
'Income': customer_income,
'Spending': customer_income * 0.3 + np.random.normal(0, 5, len(customer_income))
})

customer_df['Income_Category'] = income_bins_custom
print("\nПример клиентов с категоризацией:")
print(customer_df.head())

3. Оценка SLA и метрик производительности

Квантили широко используются для установления SLA (соглашений об уровне обслуживания) и оценки производительности систем:

Python
Скопировать код
# Данные о времени отклика API (в мс)
response_times = pd.Series(np.concatenate([
np.random.normal(50, 10, 1000), # Нормальные запросы
np.random.normal(200, 30, 50) # Медленные запросы
]))

# Расчет персентилей для SLA
p50 = response_times.quantile(0.5)
p90 = response_times.quantile(0.9)
p95 = response_times.quantile(0.95)
p99 = response_times.quantile(0.99)

print("Метрики производительности API:")
print(f"Медиана (P50): {p50:.2f} мс")
print(f"90-й процентиль (P90): {p90:.2f} мс")
print(f"95-й процентиль (P95): {p95:.2f} мс")
print(f"99-й процентиль (P99): {p99:.2f} мс")

# Определение SLA на основе процентилей
sla_target = p95 # Например, устанавливаем целевой SLA по 95-му процентилю
print(f"\nРекомендуемый SLA: {sla_target:.2f} мс")
print(f"Процент запросов, превышающих SLA: {(response_times > sla_target).mean() * 100:.2f}%")

Мария Соколова, data scientist

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

Мы решили применить квантильный анализ отдельно для каждого региона:

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

# Загрузка данных о доставках
deliveries = pd.read_csv('delivery_times.csv')

# Группировка по регионам и расчет квантилей
regional_performance = deliveries.groupby('region')['delivery_time'].agg(
['mean', 'median', 
lambda x: x.quantile(0.9),
lambda x: x.quantile(0.95)]
).rename(columns={'<lambda_0>': 'p90', '<lambda_1>': 'p95'})

# Определение региональных SLA
regional_performance['sla_target'] = regional_performance['p95'] * 1.1

print(regional_performance)

Это позволило нам установить дифференцированные SLA для каждого региона, учитывающие местную специфику. После внедрения системы оповещения, основанной на этих порогах, мы сократили количество проблемных доставок на 37%, а удовлетворенность клиентов выросла на 18% за первый квартал.

4. A/B-тестирование и сравнение распределений

Квантили помогают более глубоко сравнивать распределения при проведении A/B-тестов:

Python
Скопировать код
# Моделирование данных A/B-теста
np.random.seed(42)
conversion_a = pd.Series(np.random.beta(10, 90, 1000)) # Конверсия группы A
conversion_b = pd.Series(np.random.beta(12, 88, 1000)) # Конверсия группы B

# Сравнение средних (классический подход)
print("A/B тест – сравнение средних:")
print(f"Группа A: {conversion_a.mean():.4f}")
print(f"Группа B: {conversion_b.mean():.4f}")
print(f"Относительное улучшение: {(conversion_b.mean() – conversion_a.mean()) / conversion_a.mean() * 100:.2f}%")

# Сравнение по квантилям
quantiles = [0\.1, 0.25, 0.5, 0.75, 0.9]
a_quantiles = conversion_a.quantile(quantiles)
b_quantiles = conversion_b.quantile(quantiles)

print("\nСравнение по квантилям:")
for q, a_val, b_val in zip(quantiles, a_quantiles, b_quantiles):
improvement = (b_val – a_val) / a_val * 100
print(f"{int(q*100)}-й процентиль: A = {a_val:.4f}, B = {b_val:.4f}, Улучшение: {improvement:.2f}%")

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