EDA en público (Parte 2): Análisis profundo de productos y análisis de series temporales en Pandas

! ¡Bienvenidos de nuevo a la serie “EDA en público”! Esta es la Parte 2 de la serie; Si aún no has visto la Parte 1, léela aquí. Aquí hay un resumen de lo que conquistamos.

En la Parte 1, tomamos un archivo de ventas desordenado de medio millón de filas y lo pusimos en forma. Específicamente, nosotros:

Se tomaron muestras de los datos para un procesamiento más rápido. Se corrigieron los valores faltantes y las entradas de texto estandarizadas (como ‘EIRE’ a ‘Irlanda’). Filtrado todo el ruido: devoluciones, cancelaciones y transacciones con precio cero. Diseñamos nuestra característica más importante: la columna Ingresos. Logramos nuestra primera visión empresarial: los 10 principales países generadores de ingresos.

¡Ahora tenemos un Pandas DataFrame limpio y listo para generar ingresos, listo para ser explotado para obtener información valiosa! Al final de esta serie, quiero dominar el análisis de datos exploratorios utilizando Pandas. No dudes en seguirnos si eres un entusiasta de los datos.

Ahora cambiamos nuestro enfoque para ofrecer inteligencia empresarial verdaderamente impactante para NovaShop. Nuestro objetivo general para la Parte 2 es responder las preguntas fundamentales: ¿Qué productos tienen el mejor desempeño y cuándo es el mejor momento para venderlos?

Esta parte trata sobre el análisis utilizando potentes técnicas de agregación de Pandas (.groupby()) y la ingeniería de funciones utilizando la columna de fecha y hora (accesor .dt). Dividiremos nuestro análisis en dos áreas clave:

Análisis profundo del producto: identificar los productos que mueven la mayor cantidad de unidades versus aquellos que generan más efectivo. Timing de ventas (Series de tiempo): Descubrir la estacionalidad de las ventas (picos mensuales) y las tendencias operativas (hora de mayor actividad del día).

Sin más, vayamos a ello.

Cargando los datos limpios

Para mejorar el rendimiento, exportemos nuestro conjunto de datos limpios e importemos nuevamente para su análisis.

df.to_csv(‘online_retail_clean.csv’, índice=Falso)

Ahora puedo crear un nuevo proyecto y empezar de nuevo.

Al cargar archivos CSV que contienen columnas de fecha, intento usar el argumento parse_dates en pd.read_csv(). Esto me ahorra el paso de convertir manualmente el tipo de columna más adelante, asegurando que las características de fecha sean correctas desde el principio.

importar pandas como pd df = pd.read_csv(‘online_retail_clean.csv’, parse_dates=[‘InvoiceDate’]) print(f”Datos limpios cargados correctamente. Total de filas: {len(df)}”)

Producción:

Datos limpios cargados correctamente. Filas totales: 52933

Análisis profundo del producto: ¿Quiénes son los verdaderos creadores de dinero?

Con los datos limpios cargados, pasemos directamente al rendimiento del producto. Los productos pueden considerarse “más vendidos” de dos maneras diferentes: por volumen (unidades vendidas) o por valor (ingresos generados).

Insight 2: Los 10 más vendidos (por cantidad)

La lista de cantidades nos indica qué productos son populares y tienen una gran demanda, incluso si su precio es bajo. Esto es importante para el almacenamiento y la gestión de inventarios.

Agruparemos por descripción del producto, sumaremos la cantidad y lo ordenaremos de forma descendente.

# Los 10 más vendidos (por cantidad) df.groupby(‘Descripción’)[‘Quantity’].sum().sort_values(ascendente=Falso).head(10)

Producción:

Descripción BOTE MEDIANO DE CERÁMICA 74698 PLANEADORES DE LA 2 GUERRA MUNDIAL DISEÑOS ASSTD 9419 SIGNO METÁLICO DIET GIN + TONIC 5016 ABANICO DE SEDA COLORES SURTIDOS 4684 BOLSA JUMBO ROJA RETROSPOT 4671 PAQUETE DE 72 FUNDAS PARA TARTAS RETROSPOT 3561 MINI SET DE PINTURA VINTAGE 3285 SURTIDOS ORNAMENTO PÁJARO COLOR 2783 MONEDERO ANILLO BROCADO 2525 PORTA PALOMITAS 2508 Nombre: Cantidad, tipo: int64

Insight 3: Los 10 principales generadores de ingresos (los verdaderos generadores de dinero)

Esto es lo que NovaShop realmente quiere saber. Estos productos impulsan la rentabilidad. Puede que no vendan tantas unidades como los artículos de la lista anterior, pero su precio más alto o sus pedidos al por mayor los hacen mucho más valiosos.

Seguimos el mismo proceso, pero esta vez agregamos en la columna Ingresos que diseñamos en la Parte 1.

# Los 10 principales generadores de ingresos (los verdaderos generadores de dinero) df.groupby(‘Descripción’)[‘Revenue’].sum().sort_values(ascendente=Falso).head(10)

Producción:

Descripción BOTE DE ALMACENAMIENTO SUPERIOR DE CERÁMICA MEDIANO 77785.74 FRANQUEO DOTCOM 18456.13 SOPORTE PARA TORTAS REGENCY 3 NIVEL 15093.38 TARIFA DE AMAZON 13541.33 BUNTING DE FIESTA 9491.60 LETRERO DE METAL PARA DIETA GIN + TONIC 9480.51 BOLSA JUMBO RETROSPOT ROJA 8996.65 Manual 8966.96 LUCES DE CHILE 8395.20 ENVÍO 7194.51 Nombre: Ingresos, tipo: float64

Discusión: Lo que estas listas le dicen a NovaShop

Aquí es donde realmente brilla el poder de EDA, porque estas dos listas cuentan una historia muy diferente:

El producto estrella: El “TARRO DE ALMACENAMIENTO SUPERIOR DE CERÁMICA MEDIANO” es claramente el ganador, dominando ambas listas por un margen enorme. Es un gran volumen y un gran valor. Este artículo debería ser el enfoque principal de NovaShop para el inventario, el marketing y la expansión. Una fuente de ingresos sorprendente: mientras exploraba los datos, noté elementos como “DOTCOM POSTAGE”, “AMAZON FEE”, “Manual” y “POSTAGE”. Estos no son productos reales: son tarifas de servicio y ajustes manuales. Sin embargo, juntos generan casi 48.000 libras esterlinas en ingresos. NovaShop debería volver a verificar si estas tarifas se cuentan en su beneficio bruto. Es fácil pasarlo por alto, pero podría ser una fuente de ingresos silenciosa y significativa escondida a simple vista. Los bienes físicos de alto valor: artículos como “REGENCY CAKESTAND 3 TIER” y “CHILLI LIGHTS” figuran en la lista de ingresos, pero no en la lista de cantidades. Esto nos dice que son artículos de alto precio que contribuyen significativamente al flujo de caja total y que merecen esfuerzos de marketing específicos.

Ahora tenemos una imagen completa de lo que NovaShop vende mejor. ¡Es hora de descubrir cuándo!

Preparación para el análisis de series temporales: ingeniería de funciones

Sabemos lo que se vendió bien. Ahora, averigüemos cuándo alcanzan su punto máximo las ventas. Nuestro objetivo es dividir la columna InvoiceDate en componentes que nos permitan agrupar y analizar las ventas por año, mes, día e incluso hora.

Este es un movimiento clásico de ingeniería de funciones. Como ya nos aseguramos de que InvoiceDate sea un objeto de fecha y hora de Pandas adecuado (¡gracias a parse_dates en nuestro paso de carga!), podemos usar el extremadamente útil descriptor de acceso .dt.

Extracción de componentes de tiempo

Para comprender la estacionalidad (mensual) y la eficiencia operativa (por horas), crearemos cuatro columnas nuevas.

Año: para comparaciones a largo plazo. Mes: para identificar picos estacionales (por ejemplo, picos del cuarto trimestre). DayName: para encontrar el día más ocupado de la semana. Hora: para determinar las horas operativas pico.

Generemos estas columnas:

print(“\n — — Extracción de características de series temporales — -”) # Extrae año, mes, nombre del día y hora de la columna FechaFactura df[‘Year’] = gl[‘InvoiceDate’].dt.año df[‘Month’] = gl[‘InvoiceDate’].dt.mes df[‘DayName’] = gl[‘InvoiceDate’].dt.nombre_día() df[‘Hour’] = gl[‘InvoiceDate’].dt.hour print(“Se agregaron nuevas funciones horarias: año, mes, nombre del día, hora”) print(df[[‘InvoiceDate’, ‘Year’, ‘Month’, ‘DayName’, ‘Hour’]].cabeza())

Producción:

— Extracción de funciones de series temporales — Se agregaron nuevas funciones horarias: año, mes, nombre del día, hora. FechaFactura Año Mes DíaNombre Hora 0 2011-06-01 12:05:00 2011 6 Miércoles 12 1 2011-05-27 17:14:00 2011 5 Viernes 17 2 2011-04-21 17:05:00 2011 4 Jueves 17 3 2011-11-16 10:39:00 2011 11 miércoles 10 4 2011-03-10 08:40:00 2011 3 jueves 8

¡Perfecto! Podemos pasar directamente al mapeo de los patrones de ventas en la siguiente sección.

Mapeo de patrones de ventas (perspectivas de series temporales)

Con nuestras funciones de tiempo listas, ahora podemos hacer y responder nuestras preguntas sobre cuándo ocurren las ventas. Comenzaremos en grande (tendencias mensuales) y profundizaremos en pequeñas (tendencias horarias).

Insight 4: Tendencias de ventas por mes (estacionalidad)

La agregación mensual es crucial para detectar la estacionalidad: el patrón predecible de ventas que se repite cada año. Estos datos se utilizan para la previsión financiera y la planificación de niveles de inventario para la temporada alta.

Agruparemos por la columna Mes y calcularemos los ingresos totales para cada uno.

print(“\n — — Insight 4: Tendencias de ventas por mes (estacionalidad) — -”) # Agrupe por mes y sume los ingresos ingresos_mensuales = df.groupby(‘Mes’)[‘Revenue’].sum().sort_values(ascending=False) # Imprime los resultados, que deberían mostrar los picos estacionales print(monthly_revenue)

Producción:

— Insight 4: Tendencias de ventas por mes (estacionalidad) — Mes 11 143576.360 1 142013.420 12 133178.980 10 119533.540 9 103929.420 3 72968.270 8 71302.890 5 70424.510 6 68722.520 7 68713.831 4 51882.010 2 50178.730 Nombre: Ingresos, tipo d: float64

Interpretación: La gran sorpresa del cuarto trimestre y de enero

Los datos muestran claramente que las ventas de NovaShop están muy sesgadas hacia finales de año, lo que confirma la típica fiebre minorista del cuarto trimestre (octubre, noviembre, diciembre).

Temporada alta: noviembre es el mes pico por un ligero margen, seguido de cerca por diciembre. Este es el momento de abastecerse de frascos de almacenamiento con tapa de cerámica medianos y publicar anuncios dirigidos. La oleada de enero: ¡el segundo mes más alto es enero! Esta es una excelente idea para NovaShop. Sugiere que los clientes pueden estar usando dinero de regalos de Navidad o aprovechando las ventas posteriores a las fiestas. Este período no debe tratarse como una crisis, sino como una oportunidad secundaria de ventas de gran volumen. Temporada baja: febrero y abril son los de menor rendimiento, lo que ayuda a NovaShop a planificar presupuestos de personal y marketing más bajos durante esos períodos.

Insight 5: Tendencias de ventas por día de la semana y hora (planificación operativa)

Si bien la estacionalidad tiene que ver con las finanzas y el inventario, las tendencias diarias y horarias tienen que ver con las operaciones. NovaShop puede utilizar esto para programar el personal del almacén, optimizar la inversión publicitaria y programar campañas de correo electrónico.
Aquí ejecutaremos dos agregaciones separadas: una para el día de la semana y otra para la hora del día.

Ingresos por día de la semana

# 1. Ventas por día de la semana daily_revenue = df.groupby(‘DayName’)[‘Revenue’].sum() print(“\n — — Ingresos por día de la semana — -”) print(daily_revenue)

Producción:

— Ingresos por día de la semana — DíaNombre Viernes 163861.320 Lunes 171026.230 Domingo 83125.890 Jueves 219342.980 Martes 282796.741 Miércoles 176271.320 Nombre: Ingresos, tipo d: float64

Interpretación: el martes es el Día del Poder

Los datos revelan un patrón claro y viable para la semana laboral:

Pico de ventas: el martes domina absolutamente la semana, generando casi un 30% más de ingresos que el siguiente día de mayor actividad, el jueves. Este es un día excelente para lanzar nuevos productos o realizar ventas flash de alto impacto. Días de caída: Como era de esperar, las ventas caen drásticamente el domingo. NovaShop podría considerar este un día de baja prioridad para el marketing por correo electrónico o la dotación de personal de servicio al cliente. Día faltante: el conjunto de datos no contiene transacciones para el sábado en nuestra muestra (o quizás el conjunto completo, que es común en los conjuntos de datos B2B).

Ingresos por hora del día

# 2. Ventas por hora del día hourly_revenue = df.groupby(‘Hour’)[‘Revenue’].sum().sort_index() print(“\n — — Ingresos por hora del día — -”) print(hourly_revenue)

Producción:

— Ingresos por hora del día — Hora 7 2830,910 8 26597,800 9 76768,750 10 209809,971 11 115233,600 12 142474,460 13 130348,290 14 119241,520 15 145178,980 16 70620,550 17 36148,030 18 14022,790 19 4397,130 20 2751,700

Interpretación: El auge de la última hora de la mañana

Los datos horarios apuntan directamente a las necesidades operativas:

Pico masivo: las ventas explotan a las 10 a. m. (hora 10), generando casi el doble de ingresos de las siguientes horas. Este es el momento óptimo para que NovaShop lance campañas de marketing por correo electrónico y redes sociales. Actividad sostenida: Las ventas se mantienen altas desde las 11 a. m. hasta las 3 p. m., lo que sugiere una fuerte ventana de compras al mediodía y después del almuerzo. Fin del día: la actividad cae bruscamente después de las 4 p. m., y se generan muy pocos ingresos por la noche (7 p. m. en adelante). Esto indica que la base de clientes de NovaShop se basa principalmente en escritorios y compran durante el horario laboral tradicional.

Conclusión: preparar el escenario para la segmentación de clientes

¡Hemos terminado oficialmente la EDA de servicio pesado! Sabemos qué se vende mejor (el tarro de cerámica y las tarifas), dónde las ventas son más fuertes (el Reino Unido) y cuándo se producen los picos de ventas (cuarto trimestre, los martes y las 10 a.m.).

Sin embargo, todavía nos falta la pieza más valiosa del rompecabezas: The Who. Las mejores empresas no sólo saben lo que se vende; saben quiénes son sus clientes más valiosos y cómo conservarlos.

En la Parte 3, profundizaremos en la técnica de análisis más avanzada de esta serie: Segmentación de clientes RFM (Recencia, Frecuencia, Monetaria). Esto nos permitirá clasificar a los clientes en niveles como “Campeones”, “Clientes leales” y “En riesgo”, lo que le brindará a NovaShop una verdadera hoja de ruta para el marketing personalizado.

Espero que este artículo te haya resultado útil. No dudes en saludarme en cualquiera de estas plataformas. Realmente aprecio tus comentarios.

Medio

LinkedIn

Gorjeo

YouTube