Files
dano2025/README.md
2025-12-16 02:32:18 +03:00

122 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DANO 2025/2026 — исследование FinalTry.exe
Аналитический проект команды FinalTry.exe: исследуем связь пользовательских коммуникаций и заказов, проверяем форму зависимости (тренд, квадратичная регрессия) по общим и категорийным метрикам. Данные лежат в `dataset/ds.csv`, итог — собранная SQLite, статичные PNG и интерактивные HTML-графики.
## Table of Contents
- [Quickstart](#quickstart)
- [Repository Tree](#repository-tree)
- [Repository Structure Explained](#repository-structure-explained)
- [Reproduce the Analysis](#reproduce-the-analysis)
- [Methodology](#methodology)
- [Hypotheses](#hypotheses)
- [Results and Takeaways](#results-and-takeaways)
- [FAQ (for the jury)](#faq-for-the-jury)
- [Notes](#notes)
## Quickstart
```bash
# 1) создать окружение
python -m venv .venv
source .venv/bin/activate # win: .venv\Scripts\activate
# 2) установить зависимости
pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn altair vl-convert-python
# альтернатива для Altair: pip install altair_saver && установка node
# 3) подготовить данные
cp <your-ds.csv> dataset/ds.csv
python migrate.py # соберёт dataset/ds.sqlite
# 4) запустить ключевые скрипты
python main_hypot/best_model_and_plots.py # базовые облака/тренды (PNG)
python main_hypot/quadreg.py # общая квадратика (PNG)
python main_hypot/category_quadreg.py # категории: корреляции + квадратика (PNG)
python main_hypot/new_plots.py # интерактивные HTML-графики
python new_divided_scatters.py # интерактив: активные/пассивные/общие
```
## Repository Tree
```
.
├── dataset/ # вход: ds.csv; выход: ds.sqlite
├── migrations/ # шаги подготовки данных (0001, 0002)
├── migrate.py # исполнитель миграций
├── preanalysis/ # EDA-утилиты (нормализация, агрегаты)
├── main_hypot/ # основной пайплайн графиков/регрессий
│ ├── best_model_and_plots.py
│ ├── category_quadreg.py
│ ├── quadreg.py
│ └── new_plots.py
├── new_divided_scatters.py # интерактивные облака по типам показов
├── old_data/ # архив ранних скриптов/данных (не в основном пайплайне)
└── README.md
```
## Repository Structure Explained (folder + file guide)
- `dataset/`
- `ds.csv` — входной CSV (кладёте сами).
- `ds.sqlite` — результат миграций, таблица `communications`, источник для всех скриптов.
- `migrations/`
- `0001_csv_to_sqlite.py` — читает CSV чанками, нормализует дату, пишет таблицу, создаёт индексы.
- `0002_cap_orders_to_one.py` — каппинг заказов: все значения >1 приводятся к 1 по дневным категориям.
- `migrate.py` — менеджер миграций (`--list`, `--force`, настраиваемые пути); обновляет `migrations_state.json`.
- `preanalysis/`
- `eda_utils.py` — нормализация пола/платформы, возрастные группы, суммарные метрики, флаги, агрегации по дням и клиентам.
- `main_hypot/`
- `best_model_and_plots.py` — загрузка клиентов из SQLite, фильтр выбросов, тренды LOWESS/SavitzkyGolay, плотностные облака; PNG в `main_hypot/orders_amt_total/`.
- `quadreg.py` — накладывает квадратичную регрессию на общий график заказов; вывод в ту же папку.
- `category_quadreg.py` — агрегации по категориям/комбо, корреляции и квадратичные регрессии; PNG в `main_hypot/category_analysis/`.
- `new_plots.py` — интерактивные Altair-графики (total + категории); HTML в `main_hypot/new_plots/`.
- `new_divided_scatters.py` — интерактивные облака активных/пассивных/общих показов; HTML в `new_plots/final_result/`.
- `old_data/` — архив ранних скриптов/данных, не участвует в текущем пайплайне.
## Reproduce the Analysis
1) **Подготовить данные:** положить `dataset/ds.csv`.
2) **Собрать SQLite:** `python migrate.py` (или вручную 0001 → 0002). Итог: `dataset/ds.sqlite`.
3) **Базовые графики:** `python main_hypot/best_model_and_plots.py` → PNG в `main_hypot/orders_amt_total/`.
4) **Общая квадратика:** `python main_hypot/quadreg.py` → PNG в `main_hypot/orders_amt_total/`.
5) **Категории:** `python main_hypot/category_quadreg.py` → PNG/корреляции в `main_hypot/category_analysis/`.
6) **Интерактив:**
- `python main_hypot/new_plots.py` → HTML в `main_hypot/new_plots/`;
- `python new_divided_scatters.py` → HTML в `new_plots/final_result/`.
Все скрипты читают `dataset/ds.sqlite`; без него упадут.
## Methodology
- **Модели/метрики:** AUC для вероятности заказа, R² по тренду, p-value и коэффициенты b1/b2 квадратичной регрессии `y ~ 1 + x + x²`.
- **Тренды:** сглаживание LOWESS или SavitzkyGolay для выявления формы зависимости.
- **Квадратичная форма:** базовый способ поймать нелинейность и насыщение/спад заказов при росте показов.
- **Очистка:** фильтрация выбросов по IQR и ограничение диапазонов осей.
## Hypotheses
- **H0:** заказы не зависят от среднего числа показов.
- **H1:** больше показов → больше заказов (монотонный рост).
- **H_add:** для некоторых категорий (например, avia/hotel) при высоких показах эффект насыщается или разворачивается вниз (негативный b2).
Проверка: визуальные тренды, квадратичная регрессия, AUC/R² и значимость коэффициентов.
## Results and Takeaways
- Пайплайн выдаёт: очищенные облака, трендовые линии, квадратичные кривые и метрики AUC/R²/p-values.
- Для total и категорий видны зоны насыщения/редкого спроса, что помогает подобрать лимиты показов.
- Комбинации категорий (например, avia+hotel) позволяют увидеть перекрёстный спрос.
- Плотностные альфы показывают концентрации клиентов и помогают читать облака без шума.
- Корреляционные матрицы подсвечивают связки «показы → клики → заказы» внутри категорий.
Бизнес-применение:
1) Тестировать потолки показов в сегментах с убывающей отдачей.
2) Приоритизировать категории с устойчивым положительным b1/b2.
3) Для насыщенных категорий использовать частоту/каппинг или смену креативов.
4) Отдельно мониторить avia/hotel-комбинации для выявления сезонности/пересечений спроса.
5) Использовать AUC для оценки пригодности скорингов/сегментов на заказ.
## FAQ (for the jury)
- **Что такое корреляция?** Мера линейной связи (-1…1) между двумя величинами.
- **Почему корреляция ≠ причинность?** Связь может быть опосредована или вызвана третьим фактором; нужны эксперименты/каузальные методы.
- **Что означает AUC?** Площадь под ROC-кривой: шанс, что модель верно ранжирует случайную пару (позитив/негатив).
- **Что означает R²?** Доля объяснённой вариации целевой величины моделью.
- **Почему binarize orders (0/1)?** Для расчёта AUC по факту наличия заказа, независимо от суммы.
- **Ограничения исследования?** Зависимость от структуры `ds.csv`, чувствительность SavitzkyGolay к размеру выборки, отсутствуют продакшн-оптимизации.
- **Чем отличается avia+hotel?** Комбинированная категория для ловли перекрёстного спроса; может показывать насыщение или иной профиль b2.
## Notes
- Altair сохранение требует `vl-convert-python` или `altair_saver` + node.
- SavitzkyGolay окно по умолчанию большое (~501); на малых выборках уменьшайте, иначе будет ошибка.
- `old_data/` — архив, не трогает основной пайплайн.