Как использовать quantile в pandas: вычисление квантилей данных
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- аналитики данных и статистики
- студенты и начинающие специалисты в области анализа данных
- профессионалы, желающие углубить свои знания в использовании 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, мера разброса данных |

Синтаксис метода quantile() в Pandas
Метод quantile()
в Pandas имеет гибкий синтаксис, позволяющий аналитикам точно настраивать вычисление квантилей в соответствии с их конкретными потребностями. Базовая форма вызова выглядит следующим образом:
# Для 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()
на практике:
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
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 предлагает еще более гибкий подход, позволяя вычислять квантили как по столбцам, так и по строкам.
# Создаем 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 — вычисляет квантили по строкам (по всем значениям для каждой записи)
Операция | Series | DataFrame |
---|---|---|
Единичный квантиль | 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 — среднее между двумя ближайшими наблюдениями
Рассмотрим, как различные методы интерполяции влияют на результат:
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}")
Рассмотрим пример, когда выбор метода интерполяции критически важен:
# Данные о времени загрузки страницы (в мс)
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) — один из наиболее распространенных способов обнаружения аномалий:
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. Бинирование данных на основе квантилей
Разбиение непрерывных данных на категории часто делается с помощью квантилей:
# Данные о доходе клиентов (в тыс. $ в год)
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 (соглашений об уровне обслуживания) и оценки производительности систем:
# Данные о времени отклика 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-тестов:
# Моделирование данных 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 — это не просто статистическая функция, а мощный инструмент для принятия информированных решений в аналитике данных. От выявления выбросов и установления бизнес-метрик до сегментации клиентов и оптимизации систем — квантильный анализ помогает видеть данные в перспективе и находить значимые пороговые значения. Правильно применяя различные параметры интерполяции и адаптируя подход к конкретным задачам, аналитик может получить более глубокое понимание распределения данных и сделать более точные прогнозы. Помните, что за каждым числом в вашем наборе данных стоит история — и квантили помогают эту историю правильно прочитать.