Pandas: Análisis práctico de datos de comercio electrónico

Esta sección utiliza un caso completo de análisis de datos de comercio electrónico para aplicar de manera integral las diversas funciones de Pandas en el análisis de datos.


Resumen del caso

Analiza los datos de pedidos de la plataforma de comercio electrónico, incluyendo dimensiones como tendencias de ventas, rendimiento de productos y análisis de clientes.

Preparación de datos

Ejemplo

import pandas as pd
import numpy as np

# Simular datos de pedidos de comercio electrónico
np.random.seed(42)
n_orders = 1000

orders = pd.DataFrame({
    "ID del pedido": range(1, n_orders + 1),
    "ID del cliente": np.random.randint(100, 200, n_orders),
    "ID del producto": np.random.randint(1, 20, n_orders),
    "Fecha del pedido": pd.date_range("2024-01-01", periods=n_orders, freq="30min"),
    "Cantidad": np.random.randint(1, 5, n_orders),
    "Precio unitario": np.random.uniform(10, 500, n_orders).round(2)
})

# Calcular el monto del pedido
orders["Monto del pedido"] = (orders["Cantidad"] * orders["Precio unitario"]).round(2)

print("Resumen de datos de pedidos:")
print(orders.head(10))
print(f"\nCantidad de datos: {len(orders)} registros")

Preprocesamiento de datos

Ejemplo

# Extraer características de fecha
orders["Fecha"] = orders["Fecha del pedido"].dt.date
orders["Hora"] = orders["Fecha del pedido"].dt.hour
orders["Día de la semana"] = orders["Fecha del pedido"].dt.day_name()
orders["Mes"] = orders["Fecha del pedido"].dt.month

print("Después de agregar las características temporales:")
print(orders.head())
print()

# Verificación de valores faltantes
print("Verificación de valores faltantes:")
print(orders.isnull().sum())

Análisis de ventas

Situación general de ventas

Ejemplo

# Indicadores generales de ventas
print("=== Situación general de ventas ===\n")
print(f"Total de pedidos: {len(orders):,}")
print(f"Volumen total de ventas: ¥{orders['Monto del pedido'].sum():,.2f}")
print(f"Monto promedio de pedido: ¥{orders['Monto del pedido'].mean():,.2f}")
print(f"Monto mediano de pedido: ¥{orders['Monto del pedido'].median():,.2f}")
print()

# Estadísticas mensuales
monthly = orders.groupby("Mes").agg({
    "ID del pedido": "count",
    "Monto del pedido": "sum",
    "ID del cliente": "nunique"
}).rename(columns={
    "ID del pedido": "Número de pedidos",
    "Monto del pedido": "Volumen de ventas",
    "ID del cliente": "Número de clientes"
})

print("Tendencia de ventas mensuales:")
print(monthly)

Análisis de productos

Ejemplo

# Ranking de ventas de productos
product_sales = orders.groupby("ID del producto").agg({
    "ID del pedido": "count",
    "Cantidad": "sum",
    "Monto del pedido": "sum"
}).rename(columns={
    "ID del pedido": "Número de pedidos",
    "Cantidad": "Unidades vendidas",
    "Monto del pedido": "Volumen de ventas"
}).sort_values("Volumen de ventas", ascending=False)

print("=== Ranking de ventas de productos Top 10 ===\n")
print(product_sales.head(10))
print()

# Productos más vendidos
print(f"Producto más vendido: Producto {product_sales.index)
print(f"Volumen de ventas: ¥{product_sales.iloc)

Análisis de clientes

Ejemplo

# Análisis de consumo de clientes
customer_sales = orders.groupby("ID del cliente").agg({
    "ID del pedido": "count",
    "Monto del pedido": "sum"
}).rename(columns={
    "ID del pedido": "Número de pedidos",
    "Monto del pedido": "Consumo total"
})

print("=== Análisis de clientes ===\n")
print(f"Número de clientes activos: {len(customer_sales)}")
print(f"Promedio de pedidos por cliente: {customer_sales['Número de pedidos'].mean():.1f}")
print(f"Consumo promedio por cliente: ¥{customer_sales['Consumo total'].mean():,.2f}")
print()

# Segmentación de clientes
customer_sales["Segmento"] = pd.cut(
    customer_sales["Consumo total"],
    bins=[0, 1000, 5000, 10000, float("inf")],
    labels=["Normal", "Plata", "Oro", "VIP"]
)

print("Estadísticas de segmentación de clientes:")
print(customer_sales["Segmento"].value_counts())

Análisis de tiempo

Ejemplo

# Análisis por franja horaria
hourly = orders.groupby("Hora")["Monto del pedido"].sum()

print("=== Análisis de ventas por franja horaria ===\n")
print(f"Franja horaria de mayor venta: {hourly.idxmax()} h")
print(f"Volumen de ventas en esa franja: ¥{hourly.max():,.2f}")
print()

# Análisis por día de la semana
weekday = orders.groupby("Día de la semana")["Monto del pedido"].sum().reindex([
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
])

print("Ventas por día de la semana:")
for day, amount in weekday.items():
    print(f"{day}: ¥{amount:,.2f}")

Resumen del análisis

Ejemplo

print("""
=== Resumen del análisis de datos de comercio electrónico ===

1. Resumen de ventas
- Total de pedidos: {0}
- Volumen total de ventas: ¥{1:,.2f}
- Ticket promedio por cliente: ¥{2:.2f}

2. Rendimiento de productos
- Producto más vendido: Producto {3}
- La distribución del volumen de ventas de los productos es desigual; los productos principales aportan gran parte de los ingresos.

3. Conocimiento del cliente
- Clientes activos: {4} personas
- Se recomienda dar prioridad a la retención de los clientes de alto valor.

4. Patrones temporales
- El pico de ventas es alrededor de las {5} h
- Se pueden ajustar las estrategias de marketing según las franjas horarias pico.

5. Sugerencias de optimización
- 1) Aumentar el inventario y la promoción de los productos más vendidos.
- 2) Ofrecer servicios personalizados a los clientes de alto valor.
- 3) Reforzar el equipo de atención al cliente durante las horas pico de ventas.
"""
.format(
    len(orders),
    orders["Monto del pedido"].sum(),
    orders["Monto del pedido"].mean(),
    product_sales.index[0],
    len(customer_sales),
    hourly.idxmax()
))
Otras extensiones