Разбор движка оценки (0–10) по строкам кода, пошаговые примеры по каждому компоненту, три полных прогона на пляжах-архетипах и адверсариальная оценка формулы на качество ранжирования.
Три железных правила движка (rating.engine.ts:365–437):
| score | badge | |
|---|---|---|
| ≥ 8.5 | excellent | отличный |
| ≥ 7.0 | good | хороший |
| ≥ 5.5 | average | средний |
| < 5.5 | poor | слабый |
| null | pending | нет рейтингового сигнала |
Факты о самом пляже: вода, инфраструктура, доступность, профиль, природа, климат, загрузка, награды.
Внешние оценки: Google/TripAdvisor рейтинги и объёмы, популярность (volume), согласованность.
Для каждого — точная формула из кода и числовой пример. Subscore всегда 0–10, потом × вес.
Чем меньше отзывов n, тем сильнее оценку тянет к среднему по региону. Цель — не дать пляжу «5.0 при 3 отзывах» взлететь на вершину.
| пляж | rating | отзывов n | C | → score (0–10) |
|---|---|---|---|---|
| популярный | 4.7 | 1200 | 250 | 9.26 |
| hidden gem | 4.9 | 35 | 250 | 8.40 |
| накрутка | 5.0 | 4 | 250 | 8.31 |
Применяется после суммы и отдельно от веса water_quality (0.10). Грязная вода обрезает итог независимо от всего остального.
poor станет ровно 6.0 (см. пляж В ниже). Падение на 2.3 очка — и вся разница между «8.3» и «6.5» стирается в одну точку 6.0.Пляжи-архетипы, специально подобранные, чтобы показать поведение формулы. Cohort-статы (Италия): сред. Google 4.3 / медиана 250 / P95 6000; сред. TA 4.2 / медиана 90 / P95 2000; volume P95 9000.
| компонент | subscore | вес | вклад |
|---|---|---|---|
| water_quality | excellent → 10.0 | 0.10 | 1.00 |
| infrastructure | 5 удобств → 6.25 | 0.08 | 0.50 |
| accessibility | аэропорт+0, лестницы → 4.0 | 0.06 | 0.24 |
| beach_profile | 5/8 → 7.75 | 0.05 | 0.39 |
| nature_environment | 8.75 | 0.04 | 0.35 |
| climate_seasonality | 25°C → 10.0 | 0.03 | 0.30 |
| crowding_comfort | 6.0 | 0.03 | 0.18 |
| awards | Голубой флаг → 10 | 0.01 | 0.10 |
| google_rating_bayesian | 4.8@2000 → 9.49 | 0.12 | 1.14 |
| google_reviews_score | 2000 → 8.74 | 0.07 | 0.61 |
| tripadvisor_rating_bayesian | 4.6@500 → 9.08 | 0.10 | 0.91 |
| tripadvisor_reviews_score | 500 → 8.18 | 0.06 | 0.49 |
| volume_score | 5000 → 9.35 | 0.12 | 1.12 |
| rating_consistency | Δ0.41 → 10 | 0.03 | 0.30 |
| source_coverage | completeness 90 → 9.0 | 0.04 | 0.36 |
| data_freshness | 30д → 10 | 0.03 | 0.30 |
| source_diversity | 9 источников → 10 | 0.03 | 0.30 |
| ИТОГО | cap нет (вода excellent) | 1.00 | 8.59 |
| компонент | subscore | вес | вклад |
|---|---|---|---|
| water_quality | excellent → 10.0 | 0.10 | 1.00 |
| infrastructure | нет данных | 0.08 | 0.00 |
| accessibility | дикий → 4.0 | 0.06 | 0.24 |
| beach_profile | 7.75 | 0.05 | 0.39 |
| nature_environment | 8.75 | 0.04 | 0.35 |
| climate_seasonality | 10.0 | 0.03 | 0.30 |
| crowding_comfort | пусто → 8.0 | 0.03 | 0.24 |
| awards | нет флага | 0.01 | 0.00 |
| google_rating_bayesian | 4.9@35, регион 4.1 → 8.40 | 0.12 | 1.01 |
| google_reviews_score | 35 отзывов → 4.12 | 0.07 | 0.29 |
| tripadvisor_rating_bayesian | нет TA | 0.10 | 0.00 |
| tripadvisor_reviews_score | нет TA | 0.06 | 0.00 |
| volume_score | малоизвестен → 5.83 | 0.12 | 0.70 |
| rating_consistency | нужны оба | 0.03 | 0.00 |
| source_coverage | completeness 55 → 5.5 | 0.04 | 0.22 |
| data_freshness | 10 | 0.03 | 0.30 |
| source_diversity | 6 источников → 10 | 0.03 | 0.30 |
| ИТОГО | cap нет | 1.00 | 5.33 |
| компонент | subscore | вес | вклад |
|---|---|---|---|
| water_quality | poor → 2.0 | 0.10 | 0.20 |
| infrastructure | 8 удобств → 10 | 0.08 | 0.80 |
| accessibility | город → 10 | 0.06 | 0.60 |
| beach_profile | 9.25 | 0.05 | 0.46 |
| nature_environment | cleaning → 5.0 | 0.04 | 0.20 |
| climate_seasonality | 10 | 0.03 | 0.30 |
| crowding_comfort | толпы → 3.0 | 0.03 | 0.09 |
| awards | нет | 0.01 | 0.00 |
| google_rating_bayesian | 4.4@8000 → 8.79 | 0.12 | 1.05 |
| google_reviews_score | 8000 → 10 | 0.07 | 0.70 |
| tripadvisor_rating_bayesian | 4.3@3000 → 8.59 | 0.10 | 0.86 |
| tripadvisor_reviews_score | 3000 → 10 | 0.06 | 0.60 |
| volume_score | 9000 → 10 | 0.12 | 1.20 |
| rating_consistency | Δ0.20 → 10 | 0.03 | 0.30 |
| source_coverage | 85 → 8.5 | 0.04 | 0.34 |
| data_freshness | 10 | 0.03 | 0.30 |
| source_diversity | 8 → 10 | 0.03 | 0.30 |
| сумма до кэпа | 8.31 | 8.31 | |
| ИТОГО | cap poor → min(8.31, 6.0) | 1.00 | 6.00 |
poor кэп 6.0 ≈ нижняя граница average), но дифференциация убита: и 8.3, и 6.5 станут одинаковыми 6.0.