Análise de Cohort em Python

Bruno Godoi Eilliar
CargoX Tecnologia
Published in
5 min readAug 15, 2019
Cohort de usuários.

Imagine o seguinte cenário, o diretor de vendas vai ao setor de dados da sua startup e pergunta: Quantos dos nossos usuários são recorrentes? Quero entender o engajamento dos nossos usuários!

Como aspirante a cientista de dados, você levanta alguns questionamentos sobre o que seu interlocutor quer dizer com recorrência. Após uma conversa chegam à uma definição para o problema:

Nossos usuários utilizam constantemente nossa ferramenta ao longo do ano? Ou utilizam nossa solução no primeiro mês e logo abandonam nosso produto?

Parabéns, o que você tem em mãos é um problema de análise de Cohort!

Cohorts são extremamente úteis para exibir de maneira visual o comportamento de um conjunto de informações — também chamadas de “safras” — e possibilitar a análise de impacto de ações ao longo do tempo.

O desafio agora é utilizar as ferramentas disponíveis em seu toolbox para gerar o report. Você estuda o que tem em mãos: Metabase, Python, R e Google Sheets, mas não consegue encontrar uma forma fácil de transformar o conceito em realidade.

Já passamos por situação semelhante e nesse post vamos propor uma forma de solucionar esse problema utilizando apenas Pandas e Seaborn. Essa solução é voltada para os colegas que não têm acesso a ferramentas avançadas como Tableau ou Periscope Data.

Definição formal de Cohort.

O que é Cohort? De acordo o Cambridge Dictionary, cohort é um grupo de indivíduos que compartilham determinada característica.

A turma de negócio ou de analytics costuma entender cohort como um grupo de usuários especificamente agrupado por data de aquisição.

Estrutura dos dados de entrada.

Para montar uma matriz de cohort, precisamos de apenas 3 informações:

  • id da transação (deve ser único);
  • id do usuário que executou a transação;
  • data da transação.

Muito bem, no nosso exemplo temos o seguinte DataFrame (estou exibindo somente as 5 primeiras linhas aqui):

   transaction_id  user_id transaction_date
0 164519 17 2018-07-06
1 164519 17 2018-07-06
2 164586 17 2018-07-09
3 166425 17 2018-07-20
4 166425 17 2018-07-20

No nosso caso estamos interessados em analisar o cohort mensal dos nossos usuários, portanto, podemos tratar a coluna transaction_date e remover o dia:

   transaction_id  user_id transaction_date     date
0 164519 17 2018-07-06 2018-07
1 164519 17 2018-07-06 2018-07
2 164586 17 2018-07-09 2018-07
3 166425 17 2018-07-20 2018-07
4 166425 17 2018-07-20 2018-07

Para deixar as coisas mais organizadas, vamos nomear algumas colunas que vamos usar em seguida

Em seguida, vamos utilizar as funções descritas em cohort.py que criamos para auxiliar no desenvolvimento de nossa matriz de Cohort.

Definindo o grupo.

A primeira etapa é encontrar a qual grupo cada linha da nossa tabela pertence. Fazemos isso utilizando a função add_cohort_group_column.

   user_id  transaction_id     date cohort_group
0 17 164519 2018-07 2018-07
1 17 164586 2018-07 2018-07
2 17 166425 2018-07 2018-07
3 17 167990 2018-07 2018-07
4 17 168399 2018-07 2018-07

Montando o DataFrame de Cohort.

A seguir, utilizamos a função build_cohort_dataframe para montar nosso DataFrame de cohort e contar a quantidade de usuários por grupo x período.

                      total_user_id
cohort_group date
2018-03 2018-03 877
2018-04 342
2018-05 268
2018-06 261
2018-07 215

Acima podemos ver que 877 usuários entraram na nossa plataforma no mês 03/2018 (primeira linha do dataframe). Desses, apenas 342 continuaram usando a plataforma no mês seguinte (04/2018) e assim sucessivamente.

Vamos adicionar agora um número ao grupo do cohort, utilizando a função add_cohort_period_colum.

                      total_user_id  cohort_period
cohort_group date
2018-03 2018-03 877 1
2018-04 342 2
2018-05 268 3
2018-06 261 4
2018-07 215 5

Isso irá nos ajudar a montar uma visualização mais intuitiva posteriormente: dos 877 usuários que entraram em nossa plataforma em 03/2018, apenas 261 se mantinham ativos no quarto mês (cohort_period = 4).

Pivotando e contando a proporção.

O DataFrame acima já possui as informações de cohort, porém é de difícil interpretação. Então vamos utilizar a função build_cohort_matrix para pivotar e calcular as proporções de cada safra.

cohort_period   1         2         3         4         5         6   
cohort_group
2018-03 1.0 0.389966 0.305587 0.297605 0.245154 0.223489
2018-04 1.0 0.197368 0.180921 0.134868 0.133224 0.098684
2018-05 1.0 0.242424 0.171717 0.135354 0.107071 0.086869
2018-06 1.0 0.212377 0.154712 0.127989 0.105485 0.087201
2018-07 1.0 0.238095 0.130952 0.123016 0.091270 0.079365
2018-08 1.0 0.202670 0.150485 0.093447 0.066748 0.066748
2018-09 1.0 0.205780 0.122543 0.094798 0.076301 NaN
2018-10 1.0 0.173404 0.092553 0.077660 NaN NaN
2018-11 1.0 0.132732 0.100515 NaN NaN NaN
2018-12 1.0 0.189983 NaN NaN NaN NaN
2019-01 1.0 NaN NaN NaN NaN NaN

Por fim, queremos transformar essa informação em algo mais visual. Para isso podemos utilizar o heatmap do seaborn. Utilizando a função plot_cohort_matrix, obtemos o seguinte resultado:

Conclusão.

Assim que montamos o Cohort, é possível ver a taxa de recorrência por agrupamento mensal de usuários claramente. Todos os grupos tem 100% de recorrência no primeiro mês, mas a partir do segundo mês, a recorrência cai significativamente, sendo que em Abril de 2018 (segundo mês do cohort 2018–03), foi quando ela foi maior (39%).

E qual o benefício de ter uma tabela assim? Agora, o diretor de vendas tem uma ferramenta que exibe o impacto de suas ações em um determinado agrupamento. O Cohort está evidenciando o impacto dessas ações.

Em outras palavras, se for implantado algum plano para aumentar recorrência dos usuários — por exemplo, uma campanha de email marketing para trazer usuários de volta para a plataforma — quando o resultado do segundo mês do cohort 2019–01 for calculado, o impacto vai aparecer como um aumento na taxa na coluna 2 do Cohort.

Também é possível acompanhar se o efeito de uma ação tem alguma permanência ou se no terceiro mês o comportamento de determinada “safra” volta ao padrão anterior.

E mesmo que uma ação afete todos os usuários, é possível identificar se o impacto foi maior ou menor em uma “safra” ou se foi consistente em toda a base. O que faz de análises de Cohort uma ferramenta muito útil para um Cientista de Dados ter na manga. ;-)

Nesse jupyter notebook é possível verificar o código completo da análise descrita aqui.

Agradecimentos aos mestres Luiz Rocha e Jose William, que ajudaram a revisar e desovar esse post.

Referências.

--

--