Práctica de análisis de comportamiento de usuarios con Pandas
El análisis del comportamiento de los usuarios es una base importante para la optimización del producto. Este caso muestra cómo analizar datos de comportamiento de los usuarios, como visitas, retención y conversión.
Preparación de datos
Simulación de datos de comportamiento de usuarios
Ejemplo
import pandas as pd
import numpy as np
np.random.seed(42)
n_users = 500
n_events = 5000
# Información básica del usuario
users = pd.DataFrame({
"ID de usuario": range(1, n_users + 1),
"Fecha de registro": pd.date_range("2024-01-01", periods=n_users, freq="D")[:n_users],
"Canal": np.random.choice(["Búsqueda orgánica", "Publicidad", "Recomendación", "Social"], n_users),
"Dispositivo": np.random.choice(["PC", "Mobile", "Tablet"], n_users, p=[0.3, 0.6, 0.1])
})
# Eventos de comportamiento del usuario
events = pd.DataFrame({
"ID de evento": range(1, n_events + 1),
"ID de usuario": np.random.randint(1, n_users + 1, n_events),
"Tipo de evento": np.random.choice(
["Vista", "Clic", "Favorito", "Agregar al carrito", "Pedido", "Comentario"],
n_events,
p=[0.4, 0.25, 0.1, 0.1, 0.1, 0.05]
),
"Hora del evento": pd.date_range("2024-01-15", periods=n_events, freq="10min")
})
# Combinar datos
events = events.merge(users[["ID de usuario", "Canal", "Dispositivo"]], on="ID de usuario")
print("Datos de usuario:")
print(users.head())
print(f"\nNúmero de usuarios: {len(users)}")
print("\nDatos de eventos:")
print(events.head())
print(f"\nNúmero de eventos: {len(events)}")
import numpy as np
np.random.seed(42)
n_users = 500
n_events = 5000
# Información básica del usuario
users = pd.DataFrame({
"ID de usuario": range(1, n_users + 1),
"Fecha de registro": pd.date_range("2024-01-01", periods=n_users, freq="D")[:n_users],
"Canal": np.random.choice(["Búsqueda orgánica", "Publicidad", "Recomendación", "Social"], n_users),
"Dispositivo": np.random.choice(["PC", "Mobile", "Tablet"], n_users, p=[0.3, 0.6, 0.1])
})
# Eventos de comportamiento del usuario
events = pd.DataFrame({
"ID de evento": range(1, n_events + 1),
"ID de usuario": np.random.randint(1, n_users + 1, n_events),
"Tipo de evento": np.random.choice(
["Vista", "Clic", "Favorito", "Agregar al carrito", "Pedido", "Comentario"],
n_events,
p=[0.4, 0.25, 0.1, 0.1, 0.1, 0.05]
),
"Hora del evento": pd.date_range("2024-01-15", periods=n_events, freq="10min")
})
# Combinar datos
events = events.merge(users[["ID de usuario", "Canal", "Dispositivo"]], on="ID de usuario")
print("Datos de usuario:")
print(users.head())
print(f"\nNúmero de usuarios: {len(users)}")
print("\nDatos de eventos:")
print(events.head())
print(f"\nNúmero de eventos: {len(events)}")
Análisis de actividad de usuarios
Distribución de tipos de eventos
Ejemplo
# Estadísticas por tipo de evento
event_dist = events["Tipo de evento"].value_counts()
event_pct = events["Tipo de evento"].value_counts(normalize=True) * 100
print("=== Distribución de tipos de eventos ===\n")
event_analysis = pd.DataFrame({
"Frecuencia": event_dist,
"Proporción": event_pct.round(2)
})
print(event_analysis)
print()
# Número de usuarios por tipo de evento
event_users = events.groupby("Tipo de evento")["ID de usuario"].nunique()
print("Número de usuarios participantes por tipo de evento:")
print(event_users)
event_dist = events["Tipo de evento"].value_counts()
event_pct = events["Tipo de evento"].value_counts(normalize=True) * 100
print("=== Distribución de tipos de eventos ===\n")
event_analysis = pd.DataFrame({
"Frecuencia": event_dist,
"Proporción": event_pct.round(2)
})
print(event_analysis)
print()
# Número de usuarios por tipo de evento
event_users = events.groupby("Tipo de evento")["ID de usuario"].nunique()
print("Número de usuarios participantes por tipo de evento:")
print(event_users)
Participación de usuarios
Ejemplo
# Estadísticas de eventos de usuario
user_events = events.groupby("ID de usuario").agg({
"ID de evento": "count",
"Tipo de evento": lambda x: x.nunique()
}).rename(columns={
"ID de evento": "Total de eventos",
"Tipo de evento": "Número de tipos de evento"
})
print("=== Participación de usuarios ===\n")
print(fPromedio de eventos por usuario: {user_events['Eventototalbase'].mean():.1f})
print(fMediana: {user_events['Eventototalbase'].median():.0f})
print(f"Máximo: {user_events['事件总数'].max()}")
print()
# Segmentación de usuarios
user_events["Nivel de actividad"] = pd.cut(
user_events["Total de eventos"],
bins=[0, 3, 10, 20, float("inf")],
labels=["Baja actividad", "Normal", "Activo", "Alta actividad"]
)
print("Distribución de la actividad de los usuarios:")
print(user_events["Nivel de actividad"].value_counts())
user_events = events.groupby("ID de usuario").agg({
"ID de evento": "count",
"Tipo de evento": lambda x: x.nunique()
}).rename(columns={
"ID de evento": "Total de eventos",
"Tipo de evento": "Número de tipos de evento"
})
print("=== Participación de usuarios ===\n")
print(fPromedio de eventos por usuario: {user_events['Eventototalbase'].mean():.1f})
print(fMediana: {user_events['Eventototalbase'].median():.0f})
print(f"Máximo: {user_events['事件总数'].max()}")
print()
# Segmentación de usuarios
user_events["Nivel de actividad"] = pd.cut(
user_events["Total de eventos"],
bins=[0, 3, 10, 20, float("inf")],
labels=["Baja actividad", "Normal", "Activo", "Alta actividad"]
)
print("Distribución de la actividad de los usuarios:")
print(user_events["Nivel de actividad"].value_counts())
Análisis de embudo de conversión
Ruta de conversión
Ejemplo
# Calcular el número de usuarios por tipo de evento
funnel = events.groupby("Tipo de evento")["ID de usuario"].nunique()
funnel = funnel.reindex(["Vista", "Clic", "Favorito", "Agregar al carrito", "Pedido", "Comentario"])
# Calcular la tasa de conversión
funnel_df = pd.DataFrame({
"Número de usuarios": funnel,
"Tasa de conversión absoluta": (funnel / funnel["Vista"] * 100).round(2),
"Tasa de conversión por paso": (funnel / funnel.shift(1) * 100).round(2)
}).fillna(100)
print("=== Embudo de conversión ===\n")
print(funnel_df)
print()
# Visualizar los datos del embudo
print("Datos del embudo:")
for step, row in funnel_df.iterrows():
print(f{step}: {row['usuariobase']} personas ({row['绝SobreGirarTransformación率']:.1f}%))
funnel = events.groupby("Tipo de evento")["ID de usuario"].nunique()
funnel = funnel.reindex(["Vista", "Clic", "Favorito", "Agregar al carrito", "Pedido", "Comentario"])
# Calcular la tasa de conversión
funnel_df = pd.DataFrame({
"Número de usuarios": funnel,
"Tasa de conversión absoluta": (funnel / funnel["Vista"] * 100).round(2),
"Tasa de conversión por paso": (funnel / funnel.shift(1) * 100).round(2)
}).fillna(100)
print("=== Embudo de conversión ===\n")
print(funnel_df)
print()
# Visualizar los datos del embudo
print("Datos del embudo:")
for step, row in funnel_df.iterrows():
print(f{step}: {row['usuariobase']} personas ({row['绝SobreGirarTransformación率']:.1f}%))
Análisis de canales
Rendimiento por canal
Ejemplo
# Análisis de usuarios por canal
channel_analysis = events.groupby("Canal").agg({
"ID de usuario": "nunique",
"ID de evento": "count"
}).rename(columns={
"ID de usuario": "Número de usuarios",
"ID de evento": "Número de eventos"
})
channel_analysis["Promedio de eventos por usuario"] = (
channel_analysis["Número de eventos"] / channel_analysis["Número de usuarios"]
).round(2)
print("=== Análisis de canales ===\n")
print(channel_analysis)
print()
# Comparación de conversión por canal
channel_funnel = events[events["Tipo de evento"].isin(["Vista", "Pedido"])].groupby(
["Canal", "Tipo de evento"]
)["ID de usuario"].nunique().unstack()
channel_funnel["Tasa de conversión"] = (
channel_funnel["Pedido"] / channel_funnel["Vista"] * 100
).round(2)
print("Tasa de conversión por canal:")
print(channel_funnel)
channel_analysis = events.groupby("Canal").agg({
"ID de usuario": "nunique",
"ID de evento": "count"
}).rename(columns={
"ID de usuario": "Número de usuarios",
"ID de evento": "Número de eventos"
})
channel_analysis["Promedio de eventos por usuario"] = (
channel_analysis["Número de eventos"] / channel_analysis["Número de usuarios"]
).round(2)
print("=== Análisis de canales ===\n")
print(channel_analysis)
print()
# Comparación de conversión por canal
channel_funnel = events[events["Tipo de evento"].isin(["Vista", "Pedido"])].groupby(
["Canal", "Tipo de evento"]
)["ID de usuario"].nunique().unstack()
channel_funnel["Tasa de conversión"] = (
channel_funnel["Pedido"] / channel_funnel["Vista"] * 100
).round(2)
print("Tasa de conversión por canal:")
print(channel_funnel)
Análisis de dispositivos
Ejemplo
# Análisis de dispositivos
device_analysis = events.groupby("Dispositivo").agg({
"ID de usuario": "nunique",
"ID de evento": "count"
}).rename(columns={
"ID de usuario": "Número de usuarios",
"ID de evento": "Número de eventos"
})
device_analysis["Promedio de eventos por usuario"] = (
device_analysis["Número de eventos"] / device_analysis["Número de usuarios"]
).round(2)
print("=== Distribución de dispositivos ===\n")
print(device_analysis)
print()
# Tasa de conversión por dispositivo
device_funnel = events[events["Tipo de evento"].isin(["Vista", "Pedido"])].groupby(
["Dispositivo", "Tipo de evento"]
)["ID de usuario"].nunique().unstack()
device_funnel["Tasa de conversión"] = (
device_funnel["Pedido"] / device_funnel["Vista"] * 100
).round(2)
print("Tasa de conversión por dispositivo:")
print(device_funnel)
device_analysis = events.groupby("Dispositivo").agg({
"ID de usuario": "nunique",
"ID de evento": "count"
}).rename(columns={
"ID de usuario": "Número de usuarios",
"ID de evento": "Número de eventos"
})
device_analysis["Promedio de eventos por usuario"] = (
device_analysis["Número de eventos"] / device_analysis["Número de usuarios"]
).round(2)
print("=== Distribución de dispositivos ===\n")
print(device_analysis)
print()
# Tasa de conversión por dispositivo
device_funnel = events[events["Tipo de evento"].isin(["Vista", "Pedido"])].groupby(
["Dispositivo", "Tipo de evento"]
)["ID de usuario"].nunique().unstack()
device_funnel["Tasa de conversión"] = (
device_funnel["Pedido"] / device_funnel["Vista"] * 100
).round(2)
print("Tasa de conversión por dispositivo:")
print(device_funnel)
Análisis de retención
Ejemplo
# Análisis de retención simplificado
# Supongamos que la actividad dentro de los 7 días posteriores al registro se considera retención
users_with_events = events.groupby("ID de usuario")["Hora del evento"].agg(["min", "max"])
users_with_events.columns = ["Primera actividad", "Última actividad"]
# Combinar información de registro
users_analysis = users.merge(users_with_events, left_on="ID de usuario", right_index=True, how="left")
# Calcular días activos
users_analysis["Días activos"] = (
users_analysis["Última actividad"] - users_analysis["Primera actividad"]
).dt.days + 1
print("=== Análisis de retención de usuarios ===\n")
print(f"Usuarios con actividad: {len(users_with_events)}")
print(f"Promedio de días activos: {users_analysis['活跃天数'].mean():.1f} días")
print()
# Retención al día siguiente (simplificado)
retention_1d = len(users_analysis[users_analysis["Días activos"] >= 2]) / len(users_analysis) * 100
retention_3d = len(users_analysis[users_analysis["Días activos"] >= 3]) / len(users_analysis) * 100
print(f"Tasa de retención al día siguiente: {retention_1d:.1f}%")
print(f"Tasa de retención a 3 días: {retention_3d:.1f}%")
# Supongamos que la actividad dentro de los 7 días posteriores al registro se considera retención
users_with_events = events.groupby("ID de usuario")["Hora del evento"].agg(["min", "max"])
users_with_events.columns = ["Primera actividad", "Última actividad"]
# Combinar información de registro
users_analysis = users.merge(users_with_events, left_on="ID de usuario", right_index=True, how="left")
# Calcular días activos
users_analysis["Días activos"] = (
users_analysis["Última actividad"] - users_analysis["Primera actividad"]
).dt.days + 1
print("=== Análisis de retención de usuarios ===\n")
print(f"Usuarios con actividad: {len(users_with_events)}")
print(f"Promedio de días activos: {users_analysis['活跃天数'].mean():.1f} días")
print()
# Retención al día siguiente (simplificado)
retention_1d = len(users_analysis[users_analysis["Días activos"] >= 2]) / len(users_analysis) * 100
retention_3d = len(users_analysis[users_analysis["Días activos"] >= 3]) / len(users_analysis) * 100
print(f"Tasa de retención al día siguiente: {retention_1d:.1f}%")
print(f"Tasa de retención a 3 días: {retention_3d:.1f}%")
Resumen del análisis
Ejemplo
print("""
=== Resumen del análisis de comportamiento de usuarios ===
1. Participación de usuarios
- El tipo de evento predominante es la vista, seguida del clic
- El promedio de eventos por usuario es bajo, se necesita aumentar la fidelidad de los usuarios
2. Embudo de conversión
- Existe una pérdida significativa de usuarios, se debe optimizar la experiencia del usuario
- La tasa de conversión de vista a pedido es baja
3. Efectividad de canales
- Se recomienda priorizar la optimización de la ruta de conversión en los canales con mayor volumen de usuarios
- El rendimiento varía entre canales, se requiere una operación más precisa
4. Rendimiento por dispositivo
- Mobile es el dispositivo principal, se debe priorizar la optimización de la experiencia móvil
5. Recomendaciones de optimización
- 1) Optimizar la exhibición de productos para mejorar la conversión de vista a clic
- 2) Simplificar el proceso de compra para reducir la pérdida en el pedido
- 3) Optimizar la velocidad de carga de la página para dispositivos Mobile
- 4) Establecer un sistema de operación por segmentación de usuarios
""")
=== Resumen del análisis de comportamiento de usuarios ===
1. Participación de usuarios
- El tipo de evento predominante es la vista, seguida del clic
- El promedio de eventos por usuario es bajo, se necesita aumentar la fidelidad de los usuarios
2. Embudo de conversión
- Existe una pérdida significativa de usuarios, se debe optimizar la experiencia del usuario
- La tasa de conversión de vista a pedido es baja
3. Efectividad de canales
- Se recomienda priorizar la optimización de la ruta de conversión en los canales con mayor volumen de usuarios
- El rendimiento varía entre canales, se requiere una operación más precisa
4. Rendimiento por dispositivo
- Mobile es el dispositivo principal, se debe priorizar la optimización de la experiencia móvil
5. Recomendaciones de optimización
- 1) Optimizar la exhibición de productos para mejorar la conversión de vista a clic
- 2) Simplificar el proceso de compra para reducir la pérdida en el pedido
- 3) Optimizar la velocidad de carga de la página para dispositivos Mobile
- 4) Establecer un sistema de operación por segmentación de usuarios
""")