# Домашнє завдання · Передобробка даних

> Лекція: [lecture.html](lecture.html) · Практика: [practice.ipynb](practice.ipynb) · Тест: [quiz.html](quiz.html)

Усі завдання — на тій самій дошці оголошень із практики. Якщо хочеш узяти інші дані,
підійде будь-яка таблиця, у якій є пропуски, текстова колонка й числові колонки в різних
одиницях (наприклад, `sklearn.datasets.fetch_openml("titanic")`).

---

## 🟢 Рівень 1 — База

Пройди по своїй таблиці всі чотири рішення й запиши наслідки кожного числами.

1. **Пропуски.** Порахуй для кожної колонки: скільки пропусків, який відсоток рядків,
   і чи відрізняється частка таргета в рядках із пропуском від решти.
2. **Прапорець.** Для колонки, де пропуск виявився не випадковим, зроби колонку
   `<назва>_немає` і виміряй її кореляцію з таргетом.
3. **Три шляхи.** Порахуй, скільки рядків лишиться після `dropna()`, після видалення
   найдірявішої колонки і після заповнення медіаною. Побудуй гістограму колонки до й
   після заповнення на одній парі осей.
4. **Категорії.** Закодуй текстову колонку прямим кодуванням і скажи, на скільки колонок
   виросла таблиця.

**Зроблено, якщо:** у зошиті є таблиця з чотирьох рядків — «спосіб → скільки рядків
лишилось → скільки одиниць таргета лишилось» — і під нею твоє рішення одним реченням,
який спосіб ти обираєш і чому саме для цих даних.

---

## 🟡 Рівень 2 — Плюс

Тепер про масштаб і порядок дій.

5. **Масштаб міняє відповідь.** Знайди у своїй таблиці **свою** трійку рядків, де
   «найближчий сусід» до базового різний у сирих одиницях і після стандартизації.
   Підказка: бери дві колонки з дуже різним розкидом; шукай пару, де одна різниця мала
   в одиницях, але велика у частках розкиду.
6. **Мінімакс проти викиду.** Порахуй, яка частка значень колонки лягає нижче 0.1 після
   мінімаксу. Потім прибери одне-єдине найбільше значення й порахуй ще раз.
7. **Логарифм.** Порахуй скошеність числової колонки до й після `log10`. Побудуй обидві
   гістограми поруч.

**Зроблено, якщо:** для завдання 5 у зошиті надруковані три рядки (базовий, А, Б),
дві відстані в кожному з двох режимів і рядок «ближче: …», у якому відповідь у двох
режимах **різна**; для завдання 6 — два числа й речення, що пояснює різницю між ними.

---

## 🔴 Рівень 3 — Виклик

Відтвори витік із сьомого розділу лекції на **своїх** даних і виміряй його.

8. Побудуй правило, яке щось вивчає з даних. Найпростіше — пара порогів «занадто мало /
   занадто багато» по одній числовій колонці, підібрана за F1.
9. Порахуй його якість двома способами: (а) статистики заповнення й пороги — на всій
   таблиці, потім поділ; (б) спершу поділ, потім усе тільки на train.
10. Повтори на 20 різних поділах і збери розподіл різниці між (а) і (б).
11. Зроби те саме з **різною кількістю груп**, у яких підбираються пороги: спільні для
    всіх; по одній категорійній колонці; по двох. Побудуй графік «скільки чисел вивчено
    з даних → середнє завищення».

**Зроблено, якщо:** графік із завдання 11 має щонайменше три точки; у зошиті є речення,
яке називає, у скількох поділах із 20 неправильний порядок завищив оцінку, і пояснює,
чому завищення майже завжди в один бік.

---

## Підказки

- Пропуск, який залежить від значення, якого немає, найлегше впіймати одним порівнянням:
  `дані.groupby(дані["колонка"].isna())["таргет"].mean()`. Дві сильно різні цифри —
  привід робити прапорець.
- Якщо після стандартизації середнє тестової частини вийшло **рівно** нулем — ти
  навчив масштабувальник на всій таблиці. Це не успіх, це діагноз.
- Завищення в завданні 10 буде тим більшим, чим більше чисел вивчає твоє правило.
  Якщо різниця вийшла майже нульовою — додай групування, а не більше даних.
- `ColumnTransformer` приймає списки колонок, а не самі колонки. Порядок колонок на
  виході — спершу всі числові, потім усі однобітні; імена можна дістати через
  `конвеєр.get_feature_names_out()`.
