<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Блог об аналитике, визуализации данных, data science и BI, заметки с тегом: retention</title>
<link>http://test.leftjoin.ru/tags/retention/</link>
<description></description>
<generator>E2 (v3365; Aegea)</generator>

<item>
<title>Разница между Retention на основе 24-часовых окон и календарных дней</title>
<guid isPermaLink="false">66</guid>
<link>http://test.leftjoin.ru/all/retention-difference/</link>
<comments>http://test.leftjoin.ru/all/retention-difference/</comments>
<description>
&lt;p&gt;Вчера в Telegram мне написал читатель блога:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;Допустим, сегодня понедельник, я сделал 187 установок, и хочу посмотреть Retention первого дня, в какой день недели это можно сделать?&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Речь идет о &lt;a href="http://test.leftjoin.ru/all/retention-rate/"&gt;посте про Retention&lt;/a&gt;. Дам некоторые пояснения на этот счёт. Retention можно считать как на основе календарных дней, так и на основе 24-часовых окон. Retention нулевого дня в данном случае будет понедельник, а первого дня — вторник. Но здесь есть небольшая загвоздка.&lt;/p&gt;
&lt;p&gt;К примеру, если вы начали продвижение в понедельник 5 октября в 23:59, то все установки этой минуты через пару минут будут иметь Retention первого дня. Это проблема календарного исчисления. Для решения этой проблемы некоторые аналитики измеряют Retention не только по календарю, но и по 24-часовым окнам.&lt;/p&gt;
&lt;p&gt;Приложим эту идею к вышеописанному случаю:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retention нулевых суток в таком случае — все инсталлы с 5 октября 23:59 по 6 октября 23:59&lt;/li&gt;
&lt;li&gt;Retention первого дня: с 6 октября 23:59 по 7 октября 23:59&lt;/li&gt;
&lt;li&gt;И так далее со сдвигом 24-часового окна.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Как рассчитать Retention на основе 24-часовых окон с использованием SQL?&lt;/h2&gt;
&lt;p&gt;Вспомним &lt;a href="http://test.leftjoin.ru/all/retention-rate/"&gt;запрос из предыдущего поста&lt;/a&gt; в блоге. Там мы считали разницу в днях между датой установки и датой активности пользователя. Модифицируем запрос так, чтобы активность считалась в 24-часовых окнах: заменим расчёт &lt;i&gt;datediff&lt;/i&gt; на расчёт 24-часовых окон, обновив строки, выделенные жирным&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="SQL"&gt;
SELECT from_unixtime(user.installed_at, "yyyy-MM-dd") AS reg_date,
   &lt;b&gt;floor((cast(cs.created_at as int)-cast(installed_at as int))/(24*3600)) as date_diff,&lt;/b&gt;
   ndv(user.id) AS ret_base
   FROM USER
   LEFT JOIN client_session cs ON cs.user_id=user.id
   WHERE 1=1
     &lt;b&gt;AND floor((cast(cs.created_at as int)-cast(installed_at as int))/(24*3600)) between 0 and 30&lt;/b&gt;
     AND from_unixtime(user.installed_at)&gt;=date_add(now(), -60)
     AND from_unixtime(user.installed_at)&lt;=date_add(now(), -31)
   GROUP BY 1,2
&lt;/pre&gt;
&lt;/code&gt;&lt;p&gt;Обновленный запрос:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;SELECT 
       cohort.date_diff AS day_difference,
       avg(reg.users) AS cohort_size,
       avg(cohort.ret_base) AS retention_base,
       avg(cohort.ret_base)/avg(reg.users)*100 AS retention_rate
FROM
  (SELECT from_unixtime(user.installed_at, &amp;quot;yyyy-MM-dd&amp;quot;) AS reg_date,
          ndv(user.id) AS users
   FROM USER
   WHERE from_unixtime(user.installed_at)&amp;gt;=date_add(now(), -60)
     AND from_unixtime(user.installed_at)&amp;lt;=date_add(now(), -31)
   GROUP BY 1) reg
LEFT JOIN
  (SELECT from_unixtime(user.installed_at, &amp;quot;yyyy-MM-dd&amp;quot;) AS reg_date,
    floor((cast(cs.created_at as int)-cast(installed_at as int))/(24*3600)) as date_diff,
          ndv(user.id) AS ret_base
   FROM USER
   LEFT JOIN client_session cs ON cs.user_id=user.id
    WHERE 1=1
     AND floor((cast(cs.created_at as int)-cast(installed_at as int))/(24*3600)) between 0 and 30
     AND from_unixtime(user.installed_at)&amp;gt;=date_add(now(), -60)
     AND from_unixtime(user.installed_at)&amp;lt;=date_add(now(), -31)
   GROUP BY 1,2
  ) cohort ON reg.reg_date=cohort.reg_date
    GROUP BY 1        
    ORDER BY 1&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Результат:&lt;/h2&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://test.leftjoin.ru/pictures/newplot-(57).png" width="1170" height="400" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Сравним с результатам, полученным предыдущим скриптом:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://test.leftjoin.ru/pictures/newplot-(56).png" width="1170" height="400" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Заметно, что в первые дни Retention, посчитанный методом 24-часового окна, несколько ниже.&lt;/p&gt;
</description>
<pubDate>Thu, 08 Oct 2020 13:55:14 +0300</pubDate>
</item>


</channel>
</rss>