Анализ данных в век ИИ • большой проект в Orange

Привет, мама.
Я теперь аналитик данных.

Один рабочий день в Orange: от первой таблицы до честного финального теста и кластеров.

AMES, IOWA
🏠 + 🍊
500 РЕАЛЬНЫХ ПРОДАЖ

⬇ ДАННЫЕ ДЛЯ ПРОЕКТА

Скачайте архив до начала. В нём нет настоящих цен финальных 100 домов — сейф откроем только в конце.

⬇ Скачать данные

Привет, мама!

Помнишь, ты спрашивала, что делает аналитик данных? Сегодня мне дали историю продаж домов в Ames и сказали: «Научись оценивать цену нового дома. И пожалуйста, не обмани сам себя красивой моделью».

Я сначала обрадовался: сейчас нажму кнопку «искусственный интеллект», он всё посчитает, и можно идти пить кофе. Но оказалось, что работа аналитика начинается гораздо раньше модели — с вопроса «а что у нас вообще за данные?»

🍊 Мам, кстати: Orange — это и апельсин, и программа для анализа данных. Апельсин оставим на перерыв, а в Orange сегодня будем мучить дома.
Вязаный мир: молодой лысый студент-аналитик в очках пишет письмо маме рядом с Orange
Так начинается письмо: 25 лет, лысый, в очках, ещё больше студент, чем «важный аналитик», а рядом уже Orange и первая настоящая задача.
1

Сначала я ничего не моделировал

Мне дали 500 реальных продаж. Первым делом я спрятал 100 домов в сейф. До раздела 7 их вообще не трогаю: не смотрю цену, не считаю по ним статистику, не выбираю по ним модель. Всё до финального теста — только на 400 обучающих домах.

Мам, это как экзамен. Если заранее открыть ответы, потом уже непонятно, научился ты чему-нибудь или просто запомнил решение.

Что делаем в Orange
File → 01_обучение_400.csv.
В Select Columns: цена → Target, id → Meta. ID оставляем для расследования ошибок, но модель его видеть не должна.
📄
File
400 train
→
⚙
Select Columns
цена → Target; id → Meta
→
▦
Data Table
посмотреть строки
→
▥
Column Statistics
проверить столбцы
До сейфа работаем только с train.
Проверка качества данных: в нашей учебной версии пропусков уже нет. Например, Нет_гаража — не пустая ячейка, а настоящая категория. Это важно: «нет гаража» и «мы не знаем, есть ли гараж» — разные вещи.
Для Box Plot делаем отдельную ветку.
В основной ветке общее_качество остаётся числом. Только для Box Plot: Edit Domain → общее_качество → categorical. Тогда уровни качества появятся как группы. После графика возвращаемся к основной числовой ветке.
📄
File
качество = numeric
→
⚙
Edit Domain
только эта ветка
→
C
общее_качество
categorical
→
▣
Box Plot
цена по качеству
2

Мам, сначала я просто посмотрел на данные

На 400 обучающих домах средняя цена примерно $182,364, медиана — $165,800. Уже видно: дорогие дома тянут среднее вверх.

Distributions: форма распределения цены. Без нарисованных поверх линий среднего и медианы.
Box Plot: Variable = цена, Subgroup = общее_качество из отдельной categorical-ветки.
Ловушка: дорогой дом не удаляем только потому, что он «мешает красивому графику». Сначала выясняем, ошибка это или настоящий особняк.

Что связано с ценой?

Scatter Plot: X = общее_качество, Y = цена.

Корреляция цены с общим качеством около 0.80, с жилой площадью — около 0.75. Это сильные связи, но не доказательство причинности.

Стоп, проверяем: высокая корреляция отвечает на вопрос «связано ли?», но не на вопрос «почему?».
3

Первая модель — специально простая

Я начинаю с Linear Regression. Не потому что она обязана победить, а потому что её легко понять и потом есть с чем сравнивать.

Рядом ставлю Constant. Для регрессии он всегда предсказывает среднее обучающей выборки. Если наша модель не лучше Constant, весь героизм можно заканчивать.

Test & Score
Evaluation method: Cross-validation, 5 folds.
Главная метрика нашего проекта — R². MAE и RMSE оставляем рядом, чтобы понимать ошибку в долларах.

Контрольный ориентир: Constant даёт R² около 0, Linear Regression — примерно 0.85.

Не спрашиваю «модель умная?». Спрашиваю проще: она хотя бы лучше Constant?
4

Мам, два столбца могут рассказывать почти одно и то же

мест_в_гараже↔площадь_гаража
r ≈ 0.92
площадь_подвала↔площадь_первого_этажа
r ≈ 0.86
жилая_площадь↔комнат_всего
r ≈ 0.84
Корреляции посчитаны только на 400 обучающих домах.

Вот она, мультиколлинеарность. Прогноз может быть хорошим, но коэффициенты обычной линейной регрессии становятся менее устойчивыми: похожие признаки начинают делить между собой один и тот же вклад.

Пробуем Ridge
В Preprocess: Normalize → center by mean, scale by SD. Выход Preprocessor подключаем прямо к Test & Score, чтобы нормализация пересчитывалась внутри каждого fold.

В Linear Regression: Ridge (L2), Alpha = 10, Fit intercept = ON.
Ориентир: R² поднимается примерно с 0.85 до 0.86.
Почему Ridge, а не Lasso? Сейчас цель не обязательно выкинуть один из похожих признаков, а стабилизировать модель. Ridge обычно сохраняет оба; Lasso чаще зануляет часть коэффициентов.
Alpha = 10 не священное число. Это фиксированное значение для демонстрации. Финальный test для настройки Alpha не используем.
Ещё одна полезная проверка: выход Coefficients из Linear Regression → Data Table. Сравним коэффициенты обычной Linear и Ridge.
5

Теперь я впервые сам придумал признаки

До этого мы принимали таблицу как есть. Теперь через Formula создаём два новых столбца:

площадь_интерьера = жилая_площадь + площадь_подвала качество_x_площадь = общее_качество * жилая_площадь

Первый объединяет две площади. Второй добавляет взаимодействие: одинаковые квадратные метры у дома качества 4 и качества 9 могут стоить по-разному.

После двух признаков Ridge выходит примерно на R² ≈ 0.87.
Повторяем ровно тот же 5-fold CV.
Linear: примерно 0.86.
Ridge α=10: примерно 0.87.
То есть новые признаки помогают. Небольшой прирост — тоже прирост.

А теперь Rank

Rank открываем как исследовательский инструмент: кто наверху, какие признаки выглядят сильнее. Но не нажимаем автоматически «оставить первые десять и удалить всё остальное».

Честная проверка отбора: Preprocess → Select Relevant Features → Test & Score. Например, попробуйте оставить 10 лучших признаков. В нашем контрольном прогоне агрессивное сокращение ухудшает R² примерно до 0.84 против 0.87 на полном осмысленном наборе.
И это нормальный вывод: иногда правильное решение — ничего не выкидывать.
6

Теперь нормальный турнир моделей

Условия у всех одинаковые: те же 400 домов, те же два новых признака, те же 5 folds.

📄
Train + Formula
400 домов
→
⚗
Test & Score
5-fold CV
Constantпростая точка отсчёта
Linearбез regularization
Ridge α=10L2
Random Forest100 trees
Gradient Boosting100 trees; lr=0.1
kNNk=5; Euclidean
Для Random Forest и Gradient Boosting включаем Replicable training.
Настоящий Test and Score в Orange: сравнение Ridge, Linear Regression, Random Forest, AdaBoost и kNN
Вот что реально получилось у нас в Orange. 5-fold Cross-Validation, R²: Ridge = 0.880; Linear Regression = 0.864; Random Forest = 0.828; AdaBoost = 0.811; kNN = 0.766.
МодельR² ↑ — результат Orange
Ridge linear regression0.880
Linear Regression0.864
Random Forest0.828
AdaBoost0.811
kNN0.766

Вот здесь я уже не спорю с данными: на нашем реальном workflow Ridge победил по R². Причём выигрыш над обычной Linear Regression небольшой — 0.880 против 0.864. Значит, регуляризация помогает, но никакого «магического разгрома» нет.

Второй настоящий результат Orange: Ridge linear regression R2 0.914
В улучшенной ветке Ridge дошёл до R² = 0.914. Это уже очень сильный результат. Но хороший аналитик не говорит «рост произошёл из-за одной кнопки», пока не сравнил два полностью одинаковых пайплайна, отличающихся ровно одной операцией.
Стоп, проверяем. Первый скриншот — честное сравнение нескольких моделей в одинаковом Test & Score. Второй показывает результат улучшенной Ridge-ветки. Поэтому 0.914 фиксируем как достигнутый результат, но причинное объяснение улучшения требует отдельного эксперимента.
Вязаный мир: пожилая мама читает письмо сына-аналитика
А мама пока читает письмо и, кажется, понимает главное: сын не просто строит красивые графики — он учится честно проверять свои выводы.
↗

И тут я задал следующий вопрос: а как правильно готовить данные?

После этого результата я впервые почувствовал, что сама модель — только половина работы.

Мам, я уже умею сравнивать алгоритмы. Но теперь хочется понять другое: что делать с данными до модели?

Что мне теперь хочется уметь
• нормализовать числовые признаки;
• правильно кодировать категориальные переменные;
• понимать, когда нужен Impute и что делать с пропусками;
• не допускать leakage при preprocessing;
• отбирать признаки внутри cross-validation;
• собирать весь preprocessing в один воспроизводимый pipeline.

И вот здесь я останавливаюсь. Не потому что это неважно — наоборот. Просто preprocessing данных — отдельная большая тема следующих уроков. Сегодня достаточно понять, зачем она вообще появилась: модель уже хорошая, и следующий резерв качества лежит не только в выборе алгоритма, но и в правильной подготовке данных.

Хороший аналитик рано или поздно перестаёт спрашивать только «какую модель взять?» и начинает спрашивать: «а что именно я подаю этой модели на вход?»
7

Теперь можно открыть сейф

Берём 02_финальный_тест_СЛЕПОЙ_100.csv. Цены там нет. Пропускаем его через ту же Formula и выбранную Ridge-модель, получаем прогнозы.

📄
400 train
Formula → Ridge
→
🔒
100 blind
та же Formula
→
🎯
Predictions
сохраняем прогноз
→
🔓
Reveal
только теперь цена
После Reveal никаких новых настроек.

Только после фиксации прогнозов открываем 03_финальный_тест_ОТКРЫТЬ_В_КОНЦЕ_100.csv.

Выбранная заранее Ridge: CV R² ≈ 0.87; финальный test R² ≈ 0.91.
Финальный результат выбранной модели: R² ≈ 0.91, MAE ≈ $18.1k, RMSE ≈ $24.8k.
Стоп. После этого я не перебираю ещё 20 моделей. Иначе эти 100 домов перестают быть финальным тестом.
8

Хороший R² не означает, что модель нигде не ошибается

После Predictions сортируем по Absolute difference.

Что нашлиРезультат
Самый большой промах в final testдом id = 186
Реальная цена$475,000
Прогноз≈ $379,056
Абсолютная ошибка≈ $96k

Я не удаляю этот дом потому, что он «портит модель». Открываю строку и пытаюсь понять, чего модель не увидела.

Error analysis: метрика говорит, насколько больно. Конкретный дом помогает понять, почему.
9

И только теперь модели дали новый дом

Вот здесь она наконец работает, а не сдаёт экзамен. Через Create Instance задаём новый объект, затем через Formula создаём те же два признака и отправляем в Predictions.

🏠
Create Instance
новый дом
→
ƒ
Formula
+2 признака
→
🎯
Predictions
Ridge α=10
ПризнакЗначение
Общее качество7
Жилая площадь / подвал1700 / 1000
Гараж2 места, 500
Полных ванных / комнат2 / 7
Год постройки2000
РайонCollgCr
Фасад / кухня / подвалХорошее / Хорошее / Хорошее
Перед Predictions прошу аудиторию назвать свою цену. Контрольный прогноз нашей модели — примерно $214k. В Orange число может немного отличаться, но порядок должен быть тем же.
10

А теперь я вообще убрал цену

Это уже урок 10. Берём 04_кластеризация_500_без_цены.csv и ровно восемь числовых признаков:

общее_качество, жилая_площадь, мест_в_гараже, площадь_гаража, площадь_подвала, полных_ванных, комнат_всего, год_постройки.
📄
File 04
500 без цены
→
⚙
Select Columns
8 числовых
→
◎
k-Means
k=2…6; Normalize ON
Silhouetteвыбираем k
Scatter / PCAсмотрим группы
Лучший Silhouette среди k=2…6 получается у k=2, примерно 0.35.
Кластер 1Кластер 2
Домов250250
Общее качество5.27.1
Жилая площадь11971835
Гараж, мест1.22.2
Полных ванных1.12.0
Год постройки19521991

Один кластер в среднем старше, компактнее и проще. Второй — новее, больше и качественнее.

Иерархическая проверка: те же 8 признаков → Distances → Euclidean, normalized → Hierarchical Clustering. Сравниваем структуру с k-Means.
Но осторожно: k=2 — хороший результат алгоритма на выбранных признаках, а не доказательство, что в природе существуют ровно два вида домов.
Вязаный мир: студент объясняет маме кластеризацию домов
Финал письма: теперь мы уже не предсказываем цену, а пытаемся понять структуру самих домов. Это художественная сцена; реальные кластеры и Silhouette считаем только в Orange.

Мам, вот что я на самом деле делал весь день

Сначала отделил финальный тест. Потом посмотрел данные, построил простую модель, нашёл мультиколлинеарность, попробовал Ridge, придумал два признака, проверил Rank, сравнил модели на кросс-валидации, один раз открыл финальный тест, разобрал большие ошибки и только после этого дал модели новый дом.

А в конце вообще убрал цену и посмотрел на те же дома как на задачу кластеризации.

Саммари проекта — одно письмо, весь путь аналитика

1. Отделили 100 финальных домов и не подглядывали в них.
2. Проверили типы данных, распределения, Box Plot, Scatter Plot и корреляции.
3. Построили первую Linear Regression и сравнили её с простым простая точка отсчёта.
4. Нашли мультиколлинеарность и попробовали Ridge.
5. Создали новые признаки и посмотрели Rank.
6. Сравнили модели через 5-fold Cross-Validation.
7. В реальном Orange получили: Ridge 0.880, Linear 0.864, Random Forest 0.828, AdaBoost 0.811, kNN 0.766 по R².
8. В улучшенной Ridge-ветке получили R² = 0.914.
9. Проверили финальный test, разобрали большие ошибки и дали модели новый дом.
10. Убрали target и закончили проект кластеризацией.

Следующий вопрос студента: как правильно делать preprocessing данных? Это уже следующая большая тема.
Самая полезная кнопка аналитика не Run. Самая полезная фраза: «Стоп, проверяем!»

Теперь я могу объяснить маме свою работу совсем просто: аналитик строит модели, но ещё важнее — следит, чтобы эти модели не обманули его самого.

Твой сын ❤️

P.S. ИИ сегодня тоже помогал: предлагал гипотезы, объяснял ошибки, подсказывал, что проверить. Но последнее слово оставалось за данными.
Что я проверил перед уроком: до раздела «Сейф» используются только 400 обучающих строк; в финальных 100 нет новых категорий, которых модель не видела в train; все шаги можно собрать штатными виджетами Orange; численные результаты — контрольные ориентиры на тех же файлах.
О данных. Учебная компактная версия Ames Housing: 500 реальных продаж. 400 домов — разработка модели, 100 — фиксированный final test. Источник: Dean De Cock, “Ames, Iowa: Alternative to the Boston Housing Data as an End of Semester Regression Project”, Journal of Statistics Education, 2011.