Дерева, у яких немає листя

Результат мрія
Facebook опублікував статтю про так званому aha-moment, в якій стверджувалося, що якщо користувач додає 7 друзів протягом 10 днів після реєстрації, то цей користувач залишається на сервісі.

Чому цей результат (aha-момент) такий привабливий?
Тому що він:
а) простий
б) осмислений
в) actionable


Коли є такий результат, сервісу залишається просто зробити все, щоб мотивувати користувачів додавати 7 друзів в перші 10 днів, і тим самим іти до більш високої мети: «збільшення retention rate».

А чи ми зможемо повторити?


Звичайно ж, будь-сервіс хоче знайти свій aha-moment. Причому бажано, щоб ось такий же простий, як у Facebook: щоб все просто і зрозуміло, і без всяких абстракцій аналітиків, латентних ознак і іншого.

Ми в Lingualeo спробували вирішити задачку: не стирити рішення у Facebook, а придумати своє, про який і розповість нижче Костянтин Терешин (як шкода, що він уже не з Лео)

Постановка завдання
Зробимо одне застереження: ми хотіли, щоб наш aha-moment був такий же простий і зрозумілий, як і результат Facebook, і редуцировался до конкретних дій користувача. Це було основною вимогою до результату.

Тепер до задачі
У будь-дослідної задачі перша справа — це визначитися з поняттями. Що ви будете мати на увазі під поняттями «користувач залишиться», «стане лояльним», «не оттечет» тощо. Тут у кожного своя правда, кожен сервіс розуміє це по-своєму. Ну, і ми ввели власне визначення лояльності. Не будемо втомлювати вас подробицями цієї дефініції. Тут важливо те, як ми працювали з цією ознакою. Єдине, що потрібно відзначити, лояльність — це біноміальна мінлива і приймає значення 0 — якщо користувач не став лояльним, 1 — якщо став. Це наша цільова змінна.

Тепер, коли ми визначилися з цільовим ознакою, залишилося формалізувати, що ж означає «знайти aha-moment»?

Наприклад, знайти змінну і значення, при якому ймовірність користувачів стати лояльними, максимальна.
Але це не варіант, оскільки так можна «закручувати гайки» до максимуму. Ясна річ, що чим більше користувач потренує (вивчить) слів, тим більше ймовірність, що він стат лояльним. Але це непростий результат.

Або, наприклад, можна піти за логікою асоціативних правил і знайти отранжированый по support список правил виду: значення змінної => подія лояльності.
Хороший варіант, АЛЕ, змінні у нас (про них пізніше) найчастіше мають широкий діапазон значень, і в результаті словник подій буде містити десятки тисяч позицій. Отже, значущих результатів ми не отримаємо.

У результаті ми зупинилися на наступній логіці: знайти змінну та її значення, яке визначає кордон зміни тренда ймовірності користувача стати лояльним.
Наприклад:
Нехай у нас є змінна. Ймовірність стати лояльним має наступний розподіл:


На графіку видно, що тренд кривої змінюється на значенні 5-6. Після цього ймовірність стати лояльним стрімко зростає. Тобто ми повинні знайти таку змінну і таке її значення, після якого ймовірність починає максимально рости.

Трохи про даних
Для нас було важливо визначити aha-moment на перших двох тижнях після реєстрації (кожен сам для себе визначає потрібний період, виходячи із специфіки бізнесу). Тому ми внимально подивилися на цей період і нагенерили близько 750 змінних для аналізу. Серед них: що робили користувачі, скільки разів робили, як часто робили, що робили в конкретний день після реєстрації і інше-інше-інше.

І ще кілька зауважень:
Аналіз ми проводили тільки за користувачам мобільних додатків Lingualeo
Окремо Android і iOS

У результаті:
Для Android отримали вибірку (кількість користувачів 240 862 х кількість змінних 751)
Для IOS отримали вибірку (кількість користувачів 73 712 х кількість змінних 751)

Як вирішували завдання
Ясна річ, що руками подивитися 750 змінних, знайти з них краще і те саме значення — це заняття не для ледачих. Тому хотілося все це автоматизувати.

Ми розбили завдання на 2 етапи:
Відбір «важливих» змінних
Пошук «вірною» кордону.

Почнемо з пошуку вірної кордону.
Нехай у нас є ознака 1 і цільовий ознака. Як знайти значення, яке розділить вибірку ідеально таким чином, щоб вловити зміну тренда?
Коли ми думали над цим завданням, виникла ідея побудувати дерево вирішення завглибшки 1 та однієї змінної.
Насправді, завдання дерева рішення — мінімізувати складність системи, тобто підібрати таке розщеплення за змінної, при якому рівень хаосу системи зменшиться, причому для оцінки хаосу є чіткий критерій. Ми використовували Энтропию.
Який у цьому сенс для нашого випадку? Так як ми маємо лише два класу в цільовому ознаці (0 — не лояльний, 1 — лояльний), то при побудові дерева рішення завглибшки 1 на ознаку 1 (priznak_1) ми отримаємо одне розщеплення виду (дані фейкові):


В результаті, межа підібрана таким чином, щоб був дотриманий баланс між ймовірністю класу 1 по одну сторону розщеплення і ймовірністю класу 0 — за іншу. Формально ж ми отримали максимальний «приріст інформації» (information gain).

По суті це і є межа, яка нам потрібна.

Важливий коментар: в кінцевому результаті ми все ж не вирішуємо завдання класифікації і нам не потрібно будувати більше грубокое дерево, тому про перенавчанні говорити немає сенсу, скоріше про underfitting. Але це нас влаштовує.

Тепер, коли ми розуміємо, як шукати кордон, потрібно відібрати і отранжіровани змінні.
Тут також нічого надприродного: багато ансамблеві методи навчання мають метод feature_importances_ в scikit-learn. Ми використовували random forest з 1000 дерев глибиною 10, в якості метрики використовували f1 score. На виході ми отримали отранжированный список змінних. Як це звичайно буває, важливість змінних має ступеневу розподіл (наш випадок не виняток), і найважливіша змінна з відривом йде вперед. Ми вирішили зупинитися на ній.

Що отримали
Найважливіша змінна — це кількість днів, протягом яких користувач отримував досвід на сервісі.

чи Хороший це результат?
І так, і ні. З одного боку, ми розуміємо після скількох днів на сервісі відбувається «переломний момент», користувач починає їм активно користуватися, і можемо це використовувати, з іншого — ми не розуміємо, що саме він робить.

І що нам робити далі, адже потрібного результату ми не досягли?
А далі все просто. Після того, як у нас з'явилася «базова» кордон, залишається зрозуміти, чим відрізняються користувачі ліворуч і праворуч від кордону. І ми пішли тим же шляхом, що і раніше, так як завдання знову ж полягала в пошуку ідеальної кордону, але вже за тим фічами, які відображають конкретні дії користувачів: тренування слів, додавання слів, вивчення тестів, тренування граматики і проходження курсів. Але тепер у нас відрізняється цільовий ознака: 1 — праворуч від «базової» кордону, 0 — ліворуч від неї.

В результаті, ми отримали орієнтири, які вказують, що повинен робити користувач, щоб стати лояльним, причому ці орієнтири виражені в конкретних діях користувачів.

Нам сподобалось вправа, сподіваємося, сподобається і вам:)

Але слід додати кілька коментарів з приводу результату, і як на нього треба реагувати.
1) Результат відображає поточну механіку взаємодії користувачів з сервісом. Якщо сервіс зміниться, може змінитися і вся логіка взаємодії з ним.
2) насправді, наш результат — суть сильні гіпотези, так як, якщо ми запровадимо продуктову фічу або маркетингову активність, мотивуємо користувачів досягати кордонів, які ми знайшли, далеко не факт, що вони відразу стануть лояльними. Це доведеться тестувати.

P.s.: а ще у нас є вакансії аналітиків! Приходьте до нас працювати!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.