fix(mera/лэндинг): убрать обещание про снятие объявлений и сроки без замера
FAQ обещал, что мы «отслеживаем снятие объявлений с публикации» и считаем по этому расхождение прогноза с реальностью. Ни того, ни другого нет: расхождение считают landing_showcase_deals.py и backtest_estimator.py, оба берут только цену ДКП; delisted/relisted listing_source_snapshot.py не пишет намеренно (не выводимы при покрытии обхода 10-35%), на проде 0 таких строк в listing_source_events, deals.days_on_market заполнена 0 из 108 623. Ответ приведён к тому, что делается, и прямо говорит, что снятие сделкой не считаем — двумя блоками выше AccuracyV3 по той же причине зовёт величину «экспозицией АКТИВНОГО объявления». Два срока без источника убраны, а не заменены числом: «против двух месяцев вашей жизни» (CostOfErrorV3) и «не зависли на полгода» (HeroV3). Измеренная экспозиция считается по тем, кто ещё висит, и сроком продажи не является — подставлять её на место этих сроков значило бы подменить величину. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
ba35c68eb2
commit
808a2e12e2
3 changed files with 32 additions and 6 deletions
|
|
@ -16,6 +16,14 @@
|
||||||
* единицу, которой её не мерили: подпись приведена к измеренному, а источник
|
* единицу, которой её не мерили: подпись приведена к измеренному, а источник
|
||||||
* назван прямо в ней, а не только в `note` под плиткой.
|
* назван прямо в ней, а не только в `note` под плиткой.
|
||||||
*
|
*
|
||||||
|
* ЗАГОЛОВОК БЕЗ СРОКА (аудит 30.08). Стояло «против двух месяцев вашей
|
||||||
|
* жизни»: величина вписана в компонент руками, тогда как обе цифры секции
|
||||||
|
* приходят из `/stats` с выборками, а «двух месяцев» нет ни в одном замере.
|
||||||
|
* Подставить измеренную экспозицию вместо неё нельзя — это другая величина:
|
||||||
|
* `median_listing_age_days` считается по объявлениям, которые ЕЩЁ ВИСЯТ
|
||||||
|
* (цензурированная выборка, см. public-api.ts), и сроком продажи не является.
|
||||||
|
* Поэтому срок убран, а не заменён числом.
|
||||||
|
*
|
||||||
* ЧЕГО ЗДЕСЬ БОЛЬШЕ НЕТ. Плитки «×2,4 дольше продаётся квартира с завышенной
|
* ЧЕГО ЗДЕСЬ БОЛЬШЕ НЕТ. Плитки «×2,4 дольше продаётся квартира с завышенной
|
||||||
* ценой»: замер даёт ×1,04 (79 дней против 76), и это уже с цензурой в пользу
|
* ценой»: замер даёт ×1,04 (79 дней против 76), и это уже с цензурой в пользу
|
||||||
* заявления. Её место заняла доля снижающих цену — измеренная величина про то
|
* заявления. Её место заняла доля снижающих цену — измеренная величина про то
|
||||||
|
|
@ -77,7 +85,7 @@ export function CostOfErrorV3({ stats }: { stats: LandingStats }) {
|
||||||
ПОЧЕМУ ЭТО ВАЖНО
|
ПОЧЕМУ ЭТО ВАЖНО
|
||||||
</div>
|
</div>
|
||||||
<h2 id="cost-v3-title" className={styles.costTitle}>
|
<h2 id="cost-v3-title" className={styles.costTitle}>
|
||||||
{`${SERVICE_PRICE_RUB} ₽ против двух месяцев вашей жизни`}
|
{`${SERVICE_PRICE_RUB} ₽ против ошибки в цене вашей квартиры`}
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,11 @@
|
||||||
* похожие объявления УЖЕ висят (`deals.days_on_market` пуст, сверять прогноз
|
* похожие объявления УЖЕ висят (`deals.days_on_market` пуст, сверять прогноз
|
||||||
* срока не с чем). Обещание приведено к этой величине.
|
* срока не с чем). Обещание приведено к этой величине.
|
||||||
*
|
*
|
||||||
|
* ПОДЗАГОЛОВОК БЕЗ СРОКА (аудит 30.08). Стояло «не зависли НА ПОЛГОДА» —
|
||||||
|
* длительность, которой нет ни в одном замере; ближайшая измеренная величина
|
||||||
|
* (медианная экспозиция активного объявления) считается по тем, кто ещё
|
||||||
|
* висит, и сроком продажи не является. Срок убран, а не заменён числом.
|
||||||
|
*
|
||||||
* ЧЕГО В ТЕКСТЕ БОЛЬШЕ НЕТ: обещания «каждый такой прогноз мы потом сверяем с
|
* ЧЕГО В ТЕКСТЕ БОЛЬШЕ НЕТ: обещания «каждый такой прогноз мы потом сверяем с
|
||||||
* фактом сделки». Контура сверки прогноза клиента с его сделкой в продукте не
|
* фактом сделки». Контура сверки прогноза клиента с его сделкой в продукте не
|
||||||
* существует (`trade_in_leads` — 4 строки без полей исхода), и обещать его
|
* существует (`trade_in_leads` — 4 строки без полей исхода), и обещать его
|
||||||
|
|
@ -105,7 +110,7 @@ export function HeroV3({ stats }: { stats: LandingStats }) {
|
||||||
|
|
||||||
<p className={styles.heroLead}>
|
<p className={styles.heroLead}>
|
||||||
Мы называем реальную цену вашей квартиры — чтобы вы не продали её
|
Мы называем реальную цену вашей квартиры — чтобы вы не продали её
|
||||||
дешевле и не зависли на полгода.
|
дешевле рынка и не зависли в продаже.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className={styles.heroChecklist}>
|
<div className={styles.heroChecklist}>
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,21 @@
|
||||||
*
|
*
|
||||||
* Ответы НЕ из макета (там реквизит рендера): собраны из уже выверенной
|
* Ответы НЕ из макета (там реквизит рендера): собраны из уже выверенной
|
||||||
* честной копии продукта — content.ts (FAQ), oferta/refund. Вопрос про факт
|
* честной копии продукта — content.ts (FAQ), oferta/refund. Вопрос про факт
|
||||||
* сделки отвечаем тем, что в продукте ЕСТЬ (сделки Росреестра + снятие
|
* сделки отвечаем тем, что в продукте ЕСТЬ (сделки Росреестра, сверка
|
||||||
* объявлений с публикации), а не макетной формулировкой про «отметки
|
* прогноза с ценой ДКП), а не макетной формулировкой про «отметки продавцов»,
|
||||||
* продавцов», механики которых не существует.
|
* механики которых не существует.
|
||||||
|
*
|
||||||
|
* СНЯТИЕ ОБЪЯВЛЕНИЙ ОТСЮДА УБРАНО (аудит 30.08). Ответ обещал, что мы
|
||||||
|
* «отслеживаем снятие объявлений с публикации» и считаем по этому расхождение
|
||||||
|
* прогноза с реальностью. Ни одного из двух не происходит: расхождение
|
||||||
|
* считается в `app/tasks/landing_showcase_deals.py` и
|
||||||
|
* `backend/scripts/backtest_estimator.py`, и оба берут ТОЛЬКО цену ДКП;
|
||||||
|
* признака снятия в данных нет вовсе — `listing_source_snapshot.py` не пишет
|
||||||
|
* delisted/relisted намеренно (не выводимы при покрытии обхода 10-35%), на
|
||||||
|
* проде 0 таких строк в `listing_source_events`, а `deals.days_on_market`
|
||||||
|
* заполнена 0 из 108 623. Страница при этом сама себе и противоречила:
|
||||||
|
* `AccuracyV3` двумя блоками выше зовёт ту же величину «медианной экспозицией
|
||||||
|
* АКТИВНОГО объявления» именно потому, что снятие сделкой не является.
|
||||||
*
|
*
|
||||||
* ВЕСЬ `FAQ` ИЗ content.ts ИМПОРТИРУЕТСЯ, А НЕ ПЕРЕПИСЫВАЕТСЯ. Так было не
|
* ВЕСЬ `FAQ` ИЗ content.ts ИМПОРТИРУЕТСЯ, А НЕ ПЕРЕПИСЫВАЕТСЯ. Так было не
|
||||||
* сразу: при переносе брались только `how-do-you-know` и `why-region`, а
|
* сразу: при переносе брались только `how-do-you-know` и `why-region`, а
|
||||||
|
|
@ -74,7 +86,8 @@ const ITEMS: readonly Objection[] = [
|
||||||
{
|
{
|
||||||
q: "Откуда вы знаете факт сделки?",
|
q: "Откуда вы знаете факт сделки?",
|
||||||
a: [
|
a: [
|
||||||
"К объявлениям мы добавляем зарегистрированные сделки Росреестра и отслеживаем снятие объявлений с публикации. По этим данным считается расхождение прогноза с реальностью — и честно показывается, на скольких объектах построен каждый расчёт.",
|
"Зарегистрированные сделки Росреестра — это цены договоров купли-продажи, а не пожелания продавцов. По ним же мы проверяем себя: прошлые сделки прогоняются через тот же расчёт, и прогноз сравнивается с ценой ДКП — медианное расхождение и число сделок, на которых оно посчитано, стоят в шапке этой страницы.",
|
||||||
|
"Снятие объявления с публикации сделкой не считаем: по нашим данным нельзя отличить продажу от того, что объявление просто убрали или до него не дошёл обход. И в отчёте, и здесь честно показывается, на скольких объектах построен расчёт.",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue