Pandas & NumPy Academy · Aula

Análise de funil

Acompanhe quantos usuários chegam a cada etapa de um funil com várias etapas e calcule as taxas de conversão entre etapas consecutivas.

Aula 2 de 413 etapas

Análise de funil é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 2 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 é um funil de conversão

Um funil de conversão representa a jornada do usuário por uma sequência de etapas obrigatórias, por exemplo: Página inicial → Página do produto → Adicionar ao carrinho → Finalização da compra → Compra. Em cada etapa, alguns usuários abandonam o processo e nunca chegam à etapa seguinte. A análise de funil quantifica esses abandonos para que as equipes possam priorizar qual etapa melhorar primeiro. O resultado é uma tabela que mostra a contagem de usuários e a taxa de conversão em cada etapa.

import pandas as pd

FUNNEL_STEPS = [
    'homepage',
    'product_page',
    'add_to_cart',
    'checkout',
    'purchase'
]

df = pd.read_csv('clickstream.csv', parse_dates=['timestamp'])
print(df['event_type'].value_counts())

Contando usuários únicos em cada etapa

Para cada etapa do funil, conte o número de usuários únicos que acionaram esse evento pelo menos uma vez. Use df[df['event_type'] == step]['user_id'].nunique() dentro de um loop e reúna os resultados em um dicionário. Converter o resultado em um Series facilita os cálculos percentuais posteriores com uma única divisão.

step_counts = {}
for step in FUNNEL_STEPS:
    users = df[df['event_type'] == step]['user_id'].nunique()
    step_counts[step] = users

funnel = pd.Series(step_counts, name='users')
print(funnel)

Calculando as taxas de conversão entre etapas

A taxa de conversão entre etapas mostra qual fração dos usuários que concluíram a etapa N também concluiu a etapa N+1. Calcule-a com funnel.shift(1), que fornece a contagem da etapa anterior, e faça a divisão: funnel / funnel.shift(1) * 100. A primeira etapa não tem uma etapa anterior; portanto, sua taxa será NaN ou 100%, dependendo de como você definir a base de comparação.

funnel_df = funnel.to_frame()
funnel_df['prev_users'] = funnel_df['users'].shift(1)
funnel_df['step_conversion_%'] = (funnel_df['users'] / funnel_df['prev_users'] * 100).round(1)
print(funnel_df)

Calculando a taxa de conversão geral

A taxa de conversão geral mede qual fração de todos os usuários que entraram no funil na etapa 1 concluiu a etapa final. Divida a contagem de usuários da última etapa pela contagem da primeira. Uma conversão geral de 2% a 5% da página inicial até a compra é típica no comércio eletrônico; valores abaixo disso indicam um abandono crítico em algum ponto do funil.

overall_rate = funnel.iloc[-1] / funnel.iloc[0] * 100
print(f'Overall conversion rate: {overall_rate:.1f}%')

funnel_df['overall_conversion_%'] = (funnel_df['users'] / funnel_df['users'].iloc[0] * 100).round(1)
print(funnel_df[['users', 'overall_conversion_%']])

Funil ordenado: exigindo uma sequência de etapas

Uma simples contagem de usuários únicos considera válidas as entradas de usuários que foram diretamente para a finalização da compra sem visitar a página do produto, o que infla a conversão nas etapas iniciais. Para impor uma ordem, verifique se cada usuário chegou à etapa N somente depois de chegar à etapa N-1. Isso exige comparar carimbos de data e hora: o usuário deve ter um evento product_page antes do evento add_to_cart.

# Get first occurrence of each step per user
first_events = df.groupby(['user_id', 'event_type'])['timestamp'].min().unstack('event_type')

# Enforce ordering: each step must come after the previous
first_events['valid_to_cart'] = first_events['add_to_cart'] > first_events['product_page']
print(first_events[['product_page', 'add_to_cart', 'valid_to_cart']].head())

Funil por segmento: tipo de dispositivo

Diferentes segmentos de usuários podem apresentar taxas de conversão muito distintas. Execute o mesmo cálculo do funil separadamente para usuários de computadores e dispositivos móveis usando groupby('device_type'). Se os usuários de dispositivos móveis abandonarem o processo em grande número na etapa de finalização da compra, a página provavelmente terá um problema de usabilidade em telas pequenas. Funis segmentados revelam oportunidades de otimização direcionadas.

def funnel_for_group(group_df):
    counts = {}
    for step in FUNNEL_STEPS:
        counts[step] = group_df[group_df['event_type'] == step]['user_id'].nunique()
    return pd.Series(counts)

segmented_funnel = df.groupby('device_type').apply(funnel_for_group)
print(segmented_funnel)

Identificando a etapa com maior abandono

A etapa com a maior perda absoluta de usuários é o alvo prioritário de otimização. Encontre-a calculando a diferença entre as contagens de usuários de etapas consecutivas com funnel.diff(): o valor mais negativo corresponde ao maior abandono. Apresente essa informação tanto numericamente quanto visualmente para as partes interessadas.

dropoffs = funnel.diff().abs()
biggest_drop = dropoffs.idxmax()
biggest_drop_count = dropoffs.max()

print(f'Biggest drop-off: {biggest_drop} ({biggest_drop_count:.0f} users lost)')

Tempo entre as etapas do funil

O tempo que os usuários levam para passar de uma etapa à seguinte revela pontos de atrito. Se os usuários esperarem horas entre adicionar um item ao carrinho e finalizar a compra, um e-mail sobre o carrinho abandonado poderá recuperá-los. Calcule o tempo mediano entre cada par de etapas usando o DataFrame first_events, subtraindo colunas adjacentes de carimbo de data e hora e calculando a mediana entre todos os usuários.

for i in range(1, len(FUNNEL_STEPS)):
    prev = FUNNEL_STEPS[i-1]
    curr = FUNNEL_STEPS[i]
    delta = (first_events[curr] - first_events[prev]).dt.total_seconds() / 60
    print(f'{prev} -> {curr}: median {delta.median():.1f} min, 90th pct {delta.quantile(0.9):.1f} min')

Tendência semanal do funil

Acompanhe se as taxas de conversão estão melhorando ou piorando semana a semana, calculando o funil separadamente para cada semana. Agrupe a tabela de primeiros eventos por semana usando first_events['homepage'].dt.isocalendar().week e calcule a taxa de conversão geral por semana. Uma queda repentina em uma semana específica pode coincidir com um lançamento de produto ou uma mudança de marketing.

df['week'] = df['timestamp'].dt.isocalendar().week

weekly_conv = []
for week, wdf in df.groupby('week'):
    top = wdf[wdf['event_type'] == FUNNEL_STEPS[0]]['user_id'].nunique()
    bot = wdf[wdf['event_type'] == FUNNEL_STEPS[-1]]['user_id'].nunique()
    weekly_conv.append({'week': week, 'conversion_%': bot/top*100 if top else 0})

print(pd.DataFrame(weekly_conv))

Criando o DataFrame de resumo do funil

Reúna todas as métricas do funil em um DataFrame de resumo organizado, que possa ser exportado para um relatório ou usado em uma visualização. Inclua colunas para o nome da etapa, a contagem de usuários, a conversão entre etapas, a conversão geral e os usuários perdidos. Esse único DataFrame deve ser o resultado final da análise de funil, compreensível tanto para engenheiros quanto para gerentes de produto.

summary = pd.DataFrame({
    'step': FUNNEL_STEPS,
    'users': [step_counts[s] for s in FUNNEL_STEPS]
})
summary['users_lost'] = summary['users'].shift(-1).rsub(summary['users'])
summary['step_conv_%'] = (summary['users'] / summary['users'].shift(1) * 100).round(1)
summary['overall_conv_%'] = (summary['users'] / summary['users'].iloc[0] * 100).round(1)
print(summary)

Visualizando o funil como um gráfico de barras

Represente o funil como um gráfico de barras horizontais, em que o comprimento de cada barra representa a quantidade de usuários nessa etapa. O formato de funil surge naturalmente quando as barras são ordenadas de cima (maior número de usuários) para baixo (menor número de usuários). Anote em cada barra a porcentagem de conversão de uma etapa para a seguinte, para que o gráfico seja autossuficiente e não dependa de uma tabela de dados separada para ser interpretado.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 5))
ax.barh(summary['step'][::-1], summary['users'][::-1], color='steelblue')
for i, row in summary[::-1].iterrows():
    ax.text(row['users'], i - summary.index[0], f'  {row['step_conv_%']}%', va='center')
ax.set_xlabel('Unique Users')
ax.set_title('Conversion Funnel')
plt.tight_layout()
plt.show()

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 contar usuários únicos em cada etapa do funil, a calcular as taxas de conversão entre etapas e a taxa geral de conversão e a segmentar funis por tipo de dispositivo e acompanhar as tendências semanais de conversão. A seguir, vamos explorar tabelas de retenção por coorte para acompanhar quantos usuários retornam semana após semana.

Grátis para começar

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 “Análise de funil” é grátis?

Sim — o texto completo de “Análise de funil” é 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 “Análise de funil”?

Acompanhe quantos usuários chegam a cada etapa de um funil com várias etapas e calcule as taxas de conversão entre etapas consecutivas. 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 2 de 4.

Quanto tempo leva a aula “Análise de funil”?

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

  1. Sessões e sequência de eventos
  2. Análise de funil
  3. Tabela de retenção por coorte
  4. Visualizando jornadas de usuários
← Voltar para Pandas & NumPy Academy