Условие
В таблице task_1 есть колонки EDUCATION (категория образования: 2/3/4/5/6) и бинарный target (0/1). Посчитайте долю target=1 в каждой категории образования с округлением до 2 знаков.
Решение
Подход
Доля единичек в бинарной колонке считается как SUM(target)/COUNT(target) или эквивалентно AVG(target). Главное — понимать поведение типа: если target целочисленный, нужно либо привести к numeric/float, либо домножить на 1.0.
Реализация
Эталон из ответов автора задачи:
SELECT
education,
ROUND(SUM(target) * 1.0 / COUNT(target), 2) AS target_ratio
FROM task_1
GROUP BY education
ORDER BY education;Эквивалент через AVG (более лаконично, но требует типа с дробной частью):
SELECT
education,
ROUND(AVG(target::numeric), 2) AS target_ratio
FROM task_1
GROUP BY education
ORDER BY education;Развёрнутый вариант с FILTER
Если нужно ещё и абсолютные числа — удобно через FILTER:
SELECT
education,
COUNT(*) AS total,
COUNT(*) FILTER (WHERE target = 1) AS positives,
ROUND(COUNT(*) FILTER (WHERE target = 1) * 1.0 / COUNT(*), 2) AS target_ratio
FROM task_1
GROUP BY education
ORDER BY education;Подводные камни
- Целочисленное деление. В Postgres
SUM(target)/COUNT(target)при целочисленных типах вернёт0для всех «не 100%». Спасают* 1.0,::numericилиAVG. NULLвtarget.COUNT(target)не считаетNULL, аSUM(target)тоже их игнорирует — это корректное поведение. А вотCOUNT(*)посчитает строки сNULL, и доля поедет.- Несбалансированные группы. Если в категории всего 3–5 человек, доля «не значима» статистически. На презентации стоит добавить колонку с размером выборки.
- Сортировка. Без
ORDER BYкатегории идут в произвольном порядке. Для презентации добавляйтеORDER BY educationили сортировку по доле.
Эталонный ответ
SELECT education, ROUND(SUM(target) / COUNT(target), 2) AS target_ratio
FROM task_1
GROUP BY education;Категории с высоким target_ratio — самые «склонные к 1» сегменты. Это полезный baseline перед обучением модели и отправная точка для сегментации.