Visualizando jornadas de usuários
Represente o funil como um gráfico de barras horizontal e a matriz de retenção como um mapa de calor para comunicar as conclusões às partes interessadas.
Visualizando jornadas de usuários é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 4 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.
Por que visualizar as jornadas dos usuários
Tabelas brutas de eventos e taxas de conversão expressas em números são difíceis de comunicar a partes interessadas não técnicas. Representações visuais das jornadas dos usuários — gráficos de funil, mapas de calor de retenção e diagramas de Sankey — tornam os padrões imediatamente evidentes. O objetivo não é substituir os números, mas apresentá-los de uma forma em que os insights sejam autoevidentes à primeira vista, reduzindo a carga cognitiva do público.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Assume funnel_summary and retention_pct are already computed
print('Visualisation libraries loaded')Gráfico de barras horizontais para o funil
Um gráfico de barras horizontais é a visualização de funil mais simples e mais amplamente compreendida. Cada barra representa uma etapa do funil; o comprimento da barra representa a quantidade de usuários. Ordene as etapas de cima para baixo, na ordem do funil, para que o gráfico seja lido como um funil que se alarga. Use uma única cor contrastante para todas as barras, mantendo o foco nos valores, e não na variedade de cores.
FUNNEL_STEPS = ['homepage', 'product_page', 'add_to_cart', 'checkout', 'purchase']
users = [10000, 7200, 4100, 2300, 980]
fig, ax = plt.subplots(figsize=(9, 5))
bars = ax.barh(FUNNEL_STEPS[::-1], users[::-1], color='steelblue', height=0.6)
ax.set_xlabel('Unique Users')
ax.set_title('Conversion Funnel')
plt.tight_layout()
plt.show()Anotando as taxas de conversão no gráfico
Adicione anotações das taxas de conversão na extremidade direita de cada barra usando ax.text(). Mostre tanto a quantidade absoluta de usuários quanto a porcentagem de conversão entre etapas, para que o gráfico comunique tudo o que é necessário sem uma tabela de dados separada. Posicione o texto ligeiramente para fora da extremidade da barra, com um pequeno deslocamento horizontal, para que ele não se sobreponha à cor de preenchimento da barra.
conversions = [None, 72.0, 56.9, 56.1, 42.6]
for i, (u, c) in enumerate(zip(users[::-1], conversions[::-1])):
label = f'{u:,} users'
if c is not None:
label += f' ({c}% conv)'
ax.text(u + 100, i, label, va='center', fontsize=9)
plt.tight_layout()
plt.show()Revisitando o mapa de calor de retenção
O mapa de calor de retenção é o resultado padrão da análise de coortes. Cada linha é uma coorte, cada coluna é um deslocamento semanal e cada célula recebe uma cor de acordo com a porcentagem de retenção. Use o mapa de cores RdYlGn (vermelho = baixa, verde = alta) com vmin=0, vmax=100 explícitos, para que a escala de cores seja consistente entre as apresentações e não seja redimensionada para cada mapa de calor.
import numpy as np
# Simulated retention data for illustration
data = [[100, 55, 42, 38, 35, 33],
[100, 52, 40, 36, 33, 0],
[100, 58, 45, 41, 0, 0],
[100, 60, 48, 0, 0, 0]]
retention_pct = pd.DataFrame(data, columns=range(6),
index=['Wk1', 'Wk2', 'Wk3', 'Wk4'])
fig, ax = plt.subplots(figsize=(10, 4))
sns.heatmap(retention_pct, annot=True, fmt='.0f', cmap='RdYlGn',
vmin=0, vmax=100, linewidths=0.5, ax=ax)
ax.set_title('Cohort Retention Heatmap')
plt.tight_layout()
plt.show()Mascarando células incompletas das coortes
As coortes mais recentes ainda não tiveram tempo de completar todos os deslocamentos semanais. Essas células devem aparecer em branco, e não como 0 %, para que os leitores não confundam a ausência de dados com retenção zero. Crie uma máscara booleana em que o valor da célula seja 0 e o índice da coluna exceda o número de semanas de existência da coorte; em seguida, passe-a para sns.heatmap(mask=...).
mask = retention_pct == 0 # cells with no data yet
fig, ax = plt.subplots(figsize=(10, 4))
sns.heatmap(retention_pct, annot=True, fmt='.0f', cmap='RdYlGn',
vmin=0, vmax=100, linewidths=0.5,
mask=mask, ax=ax)
ax.set_title('Cohort Retention (incomplete cells masked)')
plt.tight_layout()
plt.show()Plotando a curva de retenção média
Visualize a curva de retenção média plotando as médias das colunas da matriz de retenção. Essa única linha resume o perfil geral de retenção do produto. Adicione uma faixa sombreada de ±1 desvio padrão para mostrar a variabilidade entre as coortes. Uma faixa estreita significa que as coortes se comportam de maneira semelhante; uma faixa ampla sugere diferenças importantes entre coortes que merecem investigação.
avg = retention_pct.mean(axis=0)
std = retention_pct.std(axis=0)
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(avg.index, avg, marker='o', color='steelblue', linewidth=2)
ax.fill_between(avg.index, avg - std, avg + std, alpha=0.2, color='steelblue')
ax.set_xlabel('Week Number')
ax.set_ylabel('Avg Retention %')
ax.set_title('Average Cohort Retention Curve')
plt.tight_layout()
plt.show()Funil segmentado: computador e celular
Plotar funis para diferentes segmentos lado a lado revela se os problemas do produto são gerais ou específicos de um dispositivo. Crie um gráfico de barras agrupadas com dois grupos de barras por etapa do funil usando ax.bar() com um deslocamento no eixo x. Como alternativa, desenhe dois gráficos de funil separados em uma grade de subgráficos de 1×2 usando plt.subplots(1, 2) para uma comparação mais clara.
steps = ['Homepage', 'Product', 'Cart', 'Checkout', 'Purchase']
desktop = [5000, 3800, 2300, 1500, 700]
mobile = [5000, 3400, 1800, 900, 280]
x = range(len(steps))
fig, ax = plt.subplots(figsize=(10, 5))
ax.bar([i - 0.2 for i in x], desktop, width=0.4, label='Desktop', color='steelblue')
ax.bar([i + 0.2 for i in x], mobile, width=0.4, label='Mobile', color='darkorange')
ax.set_xticks(list(x))
ax.set_xticklabels(steps)
ax.legend()
ax.set_title('Funnel by Device Type')
plt.tight_layout()
plt.show()Distribuição da frequência de eventos
Visualizar a distribuição de eventos por sessão mostra se as sessões se concentram em um pequeno número de eventos (sugerindo que os usuários alcançam seu objetivo rapidamente) ou abrangem uma ampla faixa (sugerindo jornadas complexas ou confusão). Faça o gráfico com ax.hist() na coluna event_count, usando uma escala logarítmica no eixo y se a distribuição tiver forte assimetria à direita.
import numpy as np
event_counts = pd.Series([3, 5, 2, 8, 1, 12, 3, 4, 6, 20, 2, 3, 1, 7, 5])
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(event_counts, bins=15, color='steelblue', edgecolor='white')
ax.set_xlabel('Events per Session')
ax.set_ylabel('Number of Sessions')
ax.set_title('Session Event Frequency Distribution')
plt.tight_layout()
plt.show()Principais sequências de eventos
Mostre as sequências mais comuns de dois eventos (bigramas) no fluxo de cliques para entender os caminhos típicos dos usuários. Agrupe por sessão, ordene por event_rank e extraia pares consecutivos usando zip(events, events[1:]). Conte as frequências dos pares com um contador e plote os 10 principais como um gráfico de barras horizontais. Isso revela quais caminhos de navegação predominam no comportamento dos usuários.
from collections import Counter
events_per_session = [['homepage', 'product_page', 'add_to_cart'],
['homepage', 'search', 'product_page'],
['homepage', 'product_page', 'purchase']]
bigrams = Counter()
for session in events_per_session:
for pair in zip(session, session[1:]):
bigrams[pair] += 1
print(bigrams.most_common(5))Distribuição da duração das sessões
Um histograma das durações das sessões revela se os usuários se envolvem brevemente (por menos de 2 minutos), moderadamente ou profundamente. Use um eixo x em escala logarítmica se um pequeno número de sessões muito longas comprimir a maior parte dos dados na barra mais à esquerda. Sobreponha uma linha vertical na mediana com ax.axvline() para orientar a interpretação do público sobre a duração de uma sessão “típica”.
durations = pd.Series([1.2, 3.5, 0.5, 12.3, 2.1, 8.7, 1.8, 0.3, 45.1, 4.6])
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(durations, bins=20, color='steelblue', edgecolor='white')
ax.axvline(durations.median(), color='red', linestyle='--', label=f'Median: {durations.median():.1f} min')
ax.set_xlabel('Session Duration (min)')
ax.set_ylabel('Sessions')
ax.legend()
plt.tight_layout()
plt.show()Salvando a figura do painel
Combine várias visualizações em uma única figura de painel usando uma grade de subgráficos com plt.subplots(2, 2, figsize=(14, 10)). Atribua o gráfico de barras do funil, o mapa de calor de retenção, a curva de retenção média e a distribuição de eventos a cada painel. Salve em PNG para disponibilização na Web ou em PDF para relatórios impressos. Uma figura unificada é mais fácil de compartilhar do que quatro arquivos separados.
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# Panel 1: funnel
axes[0, 0].barh(FUNNEL_STEPS[::-1], users[::-1], color='steelblue')
axes[0, 0].set_title('Funnel')
# Panel 2: retention heatmap
sns.heatmap(retention_pct, ax=axes[0, 1], cmap='RdYlGn', annot=True, fmt='.0f', vmin=0, vmax=100)
axes[0, 1].set_title('Cohort Retention')
fig.suptitle('User Journey Dashboard', fontsize=16)
plt.tight_layout()
fig.savefig('user_journey_dashboard.png', dpi=150, bbox_inches='tight')
print('Dashboard saved')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 criar gráficos de barras de funil anotados e mapas de calor de retenção, a plotar curvas de retenção média com faixas de variabilidade e a combinar vários gráficos em uma única figura de painel salva em PNG. A seguir, vamos explorar a detecção e a remoção de registros duplicados na limpeza avançada de dados.
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 “Visualizando jornadas de usuários” é grátis?
Sim — o texto completo de “Visualizando jornadas de usuários” é 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 “Visualizando jornadas de usuários”?
Represente o funil como um gráfico de barras horizontal e a matriz de retenção como um mapa de calor para comunicar as conclusões às partes interessadas. 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 4 de 4.
Quanto tempo leva a aula “Visualizando jornadas de usuários”?
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