Tabela de retenção por coorte
Crie uma matriz de retenção por coorte que mostre a porcentagem de usuários da semana 0 ainda ativos nas semanas seguintes usando pivot_table.
Tabela de retenção por coorte é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que é uma tabela de retenção por coorte
Uma tabela de retenção por coorte agrupa os usuários pela semana (ou mês) em que usaram o produto pela primeira vez e, em seguida, acompanha qual porcentagem de cada coorte continua ativa nas semanas seguintes. A linha 0 sempre mostra 100 %, pois a definição da semana 0 é a semana de cadastro. Os valores nas colunas posteriores revelam a rapidez com que o produto perde usuários — quanto mais lenta a queda, maior a retenção.
import pandas as pd
df = pd.read_csv('user_events.csv', parse_dates=['event_date'])
print(df.dtypes)
print(df.head())Atribuindo a cada usuário uma semana de coorte
A semana de coorte é a semana do primeiro evento de cada usuário. Use groupby('user_id')['event_date'].min() para encontrar a data do primeiro evento de cada usuário e, em seguida, converta-a em uma semana ISO com .dt.to_period('W'). Mescle esse rótulo de coorte de volta ao DataFrame principal de eventos para que cada linha saiba a qual semana de coorte seu usuário pertence.
cohort_week = df.groupby('user_id')['event_date'].min().dt.to_period('W').rename('cohort_week')
df = df.join(cohort_week, on='user_id')
df['event_week'] = df['event_date'].dt.to_period('W')
print(df[['user_id', 'event_date', 'cohort_week', 'event_week']].head())Calculando o número de semanas desde a coorte
O número da semana (também chamado de número do período ou idade) é a diferença entre a semana do evento e a semana de coorte. A subtração de períodos do Pandas retorna um deslocamento inteiro. A semana 0 significa que o usuário esteve ativo durante a semana de cadastro; a semana 4 significa que ele retornou quatro semanas depois. Essa coluna de deslocamento se torna o eixo das colunas da matriz de retenção.
df['week_number'] = (df['event_week'] - df['cohort_week']).apply(lambda x: x.n)
print(df[['user_id', 'cohort_week', 'event_week', 'week_number']].head(10))Contando usuários ativos por par de coorte e semana
Agrupe por cohort_week e week_number e conte os usuários únicos para obter a matriz bruta de contagens de retenção. Cada célula informa quantos usuários da coorte C estiveram ativos na semana N. A diagonal do canto superior esquerdo ao canto inferior direito (semana 0 de cada coorte) fornece os tamanhos das coortes, que são os denominadores usados para calcular as porcentagens.
retention_counts = (
df.groupby(['cohort_week', 'week_number'])['user_id']
.nunique()
.reset_index(name='active_users')
)
print(retention_counts.head(10))Transformando os dados em uma matriz de retenção
Use pivot_table() para transformar as contagens de retenção em formato longo em uma matriz ampla: as linhas são as semanas de coorte e as colunas são os números das semanas. O aggfunc='sum' lida com eventuais chaves duplicadas de groupby. Preencha com 0 as células referentes a semanas em que nenhum usuário daquela coorte esteve ativo. Essa matriz é o núcleo da análise de retenção.
retention_matrix = retention_counts.pivot_table(
index='cohort_week',
columns='week_number',
values='active_users',
aggfunc='sum'
).fillna(0)
print(retention_matrix.iloc[:5, :8])Calculando as porcentagens de retenção
Divida cada linha pelo seu valor na semana 0 para converter as contagens em porcentagens. A coluna da semana 0 é o tamanho da coorte, armazenado em retention_matrix[0]. Use divide(cohort_sizes, axis=0) e multiplique por 100. Arredonde para uma casa decimal para facilitar a leitura. O resultado é o mapa de calor de retenção padrão esperado em relatórios de análise de produtos.
cohort_sizes = retention_matrix[0]
retention_pct = retention_matrix.divide(cohort_sizes, axis=0) * 100
retention_pct = retention_pct.round(1)
print(retention_pct.iloc[:5, :8])Interpretando a curva de retenção
Leia a tabela de retenção na diagonal: cada linha diminui ao longo do tempo. Um produto com retenção forte apresentará valores como 100, 60, 50, 45, 42 — uma queda inicial rápida seguida por um patamar estável. Um produto com retenção ruim apresentará 100, 30, 15, 8, 4 — uma queda contínua, sem patamar. O nível do patamar (se houver) é chamado de taxa de retenção de longo prazo e é o KPI de retenção mais importante.
# Average retention rate per week number across all cohorts
avg_retention = retention_pct.mean(axis=0)
print('Average retention by week:')
print(avg_retention.round(1))Identificando as melhores e piores coortes
Compare o desempenho das coortes observando a retenção na semana 4 ou na semana 8 entre as coortes. A coorte com a maior retenção na semana 4 se beneficiou de uma melhoria no produto ou de um canal de aquisição eficaz; a pior coorte pode ter sido adquirida por meio de um canal de baixa qualidade. Use .loc[:, 4].sort_values(ascending=False) para classificar as coortes pela retenção na semana 4.
if 4 in retention_pct.columns:
week4 = retention_pct[4].sort_values(ascending=False)
print('Cohorts ranked by week-4 retention:')
print(week4)Visualizando a retenção como um mapa de calor
Um mapa de calor com cores é a visualização padrão para tabelas de retenção. Use sns.heatmap() com annot=True para mostrar o valor percentual dentro de cada célula e um mapa de cores divergente (retenção baixa = vermelho, alta = verde). Defina vmin=0 e vmax=100 para que as cores sejam comparáveis entre diferentes escalas de retenção.
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(14, 6))
sns.heatmap(retention_pct.iloc[:, :13],
annot=True, fmt='.0f',
cmap='RdYlGn', vmin=0, vmax=100,
ax=ax, linewidths=0.5)
ax.set_title('Weekly Cohort Retention (%)')
ax.set_xlabel('Week Number')
ax.set_ylabel('Cohort Week')
plt.tight_layout()
plt.show()Plotando a curva de retenção
Um gráfico de linhas da retenção média por semana comunica a curva geral de queda com mais clareza do que um mapa de calor quando apresentado a partes interessadas não técnicas. Plote a curva média de retenção com uma faixa sombreada que mostre mais ou menos um desvio padrão, indicando quanta variação existe entre as coortes. O patamar — onde a linha se estabiliza — é o piso natural de retenção do produto.
avg_ret = retention_pct.mean(axis=0)
std_ret = retention_pct.std(axis=0)
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(avg_ret.index, avg_ret.values, color='steelblue', linewidth=2, marker='o')
ax.fill_between(avg_ret.index, avg_ret - std_ret, avg_ret + std_ret, alpha=0.2)
ax.set_xlabel('Week Number')
ax.set_ylabel('Retention %')
ax.set_title('Average Cohort Retention Curve')
plt.tight_layout()
plt.show()Exportando a tabela de retenção
Exporte a tabela de retenção para o Excel para que os gerentes de produto possam compartilhá-la nas revisões semanais. Use to_excel() e aplique a formatação condicional manualmente no Excel ou use Styler.background_gradient() no Pandas para adicionar cores diretamente ao arquivo exportado. A tabela de retenção é um dos resultados mais solicitados em análises de produtos.
styled = retention_pct.style.background_gradient(cmap='RdYlGn', vmin=0, vmax=100)
styled.to_excel('retention_table.xlsx', engine='openpyxl')
print('Retention table saved to retention_table.xlsx')Verificação rápida
Teste sua compreensão dos conceitos de análise de dados desta lição.
Recapitulação da lição
Nesta lição, você aprendeu: a atribuir usuários a semanas de coorte e calcular deslocamentos semanais, a transformar os dados em uma matriz de retenção e converter contagens em porcentagens e a visualizar a retenção por coorte como um mapa de calor e uma curva de retenção média. A seguir, vamos explorar a visualização das jornadas dos usuários por meio de gráficos de barras de funil e mapas de calor.
Aprenda Python com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 30
- Aulas
- 120
Perguntas Frequentes
A aula “Tabela de retenção por coorte” é grátis?
Sim — o texto completo de “Tabela de retenção por coorte” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que vou aprender em “Tabela de retenção por coorte”?
Crie uma matriz de retenção por coorte que mostre a porcentagem de usuários da semana 0 ainda ativos nas semanas seguintes usando pivot_table. Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Pandas & NumPy Academy?
Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Tabela de retenção por coorte”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Pandas & NumPy Academy?
Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Sessões e sequência de eventos
- Análise de funil
- Tabela de retenção por coorte
- Visualizando jornadas de usuários