Биннинг данных в Pandas (cut / qcut)

Биннинг данных (также называемый бакетированием) — это процесс дискретизации непрерывных переменных, обычно используемый при предварительной обработке данных, конструировании признаков и анализе данных.


cut: равноширинный биннинг

cutРазделите данные на интервалы равной ширины.

Пример

import pandas as pd
import numpy as np

# Создать данные о возрасте
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])

print("Исходные данные:")
print(ages.tolist())
print()

# Равноширинный биннинг (5 интервалов)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Ребёнок", "Молодёжь", "Средний возраст", "Предпожилой", "Пожилой"]

age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Результат равноширинного биннинга:")
print(age_bins)
print()

# Включить правую границу
age_bins2 = pd.cut(ages, bins=4)
print("Автоматическое разбиение на интервалы равной ширины:")
print(age_bins2)

Вернуть категории и границы

Пример

import pandas as pd
import numpy as np

ages = pd.Series([5, 15, 25, 35, 45])

# Вернуть индексы интервалов
result = pd.cut(ages, bins=4, labels=False)
print("Индексы интервалов:")
print(result)
print()

# Вернуть границы интервалов
result = pd.cut(ages, bins=4, retbins=True)
print("Границы интервалов:")
print(result[1])

qcut равночастотный биннинг

qcutРазделите данные на интервалы с примерно одинаковым количеством точек данных.

Пример

import pandas as pd
import numpy as np

# Неравномерно распределённые данные
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])

print("Исходные данные:")
print(data.tolist())
print()

# Равноширинный биннинг (может привести к неравномерному распределению)
cut_result = pd.cut(data, q=4)
print("Равноширинный биннинг:")
print(cut_result.value_counts())
print()

# Равночастотный биннинг (примерно одинаковое количество точек данных на интервал)
qcut_result = pd.qcut(data, q=4)
print("Равночастотный биннинг:")
print(qcut_result.value_counts())

Укажите квантили

Пример

import pandas as pd

data = pd.Series(range(1, 101))

# Разделить по указанным квантилям
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("Разделено по квантилям:")
print(result.value_counts().sort_index())

Практика: анализ данных

Пример

import pandas as pd
import numpy as np

# Смоделировать данные о расходах клиентов
np.random.seed(42)
customers = pd.DataFrame({
    "ID клиента": range(1, 101),
    "Сумма расходов": np.random.exponential(500, 100) + 100
})

# Разделить на разные уровни расходов
customers["Spending level"] = pd.cut(
    customers["Spending amount"],
    bins=[0, 300, 500, 800, float("inf")],
    labels=["Низкий", "Средний", "Высокий", "VIP"]
)

# Подсчитать количество клиентов на каждом уровне
print("Распределение по уровням расходов:")
print(customers["Spending level"].value_counts())
print()

# Вычислить средние расходы по уровням
print("Средние расходы по уровням:")
print(customers.groupby("Spending level")["Spending amount"].mean().round(2))
Другие расширения