Contenido del curso

NumPy

Pandas

Visualización de ventas con Matplotlib

Resumen

Cuando terminas de limpiar y transformar tus datos, llega la pregunta clave: ¿qué te están diciendo realmente? La visualización de datos con Matplotlib te permite traducir miles de filas en gráficos que revelan patrones, tendencias y oportunidades que no verías solo mirando una tabla. Aquí trabajamos con un dataset de online retail ya procesado para construir gráficos de pastel y barras en Python.

¿Cómo identificar devoluciones en un dataset de ventas?

Antes de graficar, necesitas separar los datos. En un dataset de retail, las cantidades negativas suelen indicar devoluciones, mientras que las positivas representan ventas efectivas.

Para extraer las devoluciones, filtras tu DataFrame preguntando dónde la columna cantidad es menor a cero. Ese filtro produce un nuevo DataFrame con 8.872 transacciones devueltas. Para las ventas efectivas, aplicas el filtro contrario: cantidades mayores o iguales a cero [03:10].

¿Qué significa una cantidad negativa en un dataset de ventas? Representa una devolución. El signo negativo indica que el producto regresó al inventario en lugar de salir, así que filtrando por cantidad < 0 aíslas todas las devoluciones del periodo.

Usar shape[0] sobre cada DataFrame te devuelve el conteo exacto de filas, que es justo lo que necesitas para alimentar el siguiente gráfico.

¿Cómo crear un gráfico de pastel con Matplotlib?

Un pie chart es la forma más directa de mostrar proporciones entre dos o tres categorías, como devoluciones contra no devoluciones.

El flujo básico con matplotlib.pyplot es así:

  • Importas pyplot y defines la lista de labels con los nombres de cada porción.
  • Defines la lista de sizes con los totales numéricos de cada categoría.
  • Asignas una lista de colors, por ejemplo coral y verde claro.
  • Llamas a plt.figure(figsize=(8,8)) para fijar las dimensiones del lienzo.
  • Ejecutas plt.pie(sizes, labels=labels, colors=colors, startangle=140).
  • Añades plt.title("Porcentaje de transacciones con y sin devolución") y cierras con plt.show().

Un detalle que cuesta caro: si defines la lista colors pero olvidas pasarla como argumento dentro de plt.pie(), Matplotlib usará la paleta por defecto. El parámetro startangle=140 rota el círculo para que el corte inicial quede en una posición visualmente cómoda [05:50].

El resultado revela que la proporción de devoluciones es muy pequeña frente al total de ventas, algo que no era evidente solo viendo los conteos.

¿Cómo graficar la distribución de ventas por mes y año?

Cuando ya tienes columnas de año y mes separadas, agruparlas te permite ver la evolución temporal del negocio.

El patrón con pandas y Matplotlib es:

  1. Crear la figura con plt.figure(figsize=(12,6)).
  2. Aplicar df.groupby(['año','mes'])['total_amount'].sum() para obtener la suma de ventas por periodo.
  3. Encadenar .plot(kind='bar') directamente sobre el resultado.
  4. Etiquetar con plt.title("Distribución de ventas por mes y año"), plt.xlabel("Año-Mes") y plt.ylabel("Ventas totales").

Al mirar el gráfico aparece una tendencia ascendente clara, pero el último mes (diciembre) cae respecto al anterior. Y aquí viene lo interesante: antes de concluir que las ventas bajaron, debes verificar si los datos del mes están completos o si solo capturaste una parte del periodo [08:30].

¿Por qué agrupar por año y mes en lugar de solo por mes? Porque agrupar solo por mes mezcla años distintos y oculta la evolución real. Agrupar por la combinación año-mes preserva la línea de tiempo y te deja ver tendencias de crecimiento o estacionalidad.

¿Cómo construir un top 10 de productos más vendidos en Python?

Para rankear productos necesitas combinar agrupación, ordenamiento y merge con la tabla de descripciones.

El proceso paso a paso:

  • Aplicas groupby('stock_code')['cantidad'].sum() para obtener el total vendido por código de producto.
  • Encadenas .sort_values(ascending=False) para ordenar de mayor a menor.
  • Tomas .head(10) para quedarte con el top 10.
  • Ejecutas reset_index() para limpiar los índices antes de graficar.
  • Haces pd.merge() entre tu top y el DataFrame limpio para traer la descripción de cada stock_code, eliminando duplicados con drop_duplicates(subset='stock_code') y usando how='left'.

Para el gráfico final, las barras horizontales funcionan mejor que las verticales cuando los nombres de producto son largos:

  • plt.figure(figsize=(12,8)) define el lienzo.
  • plt.barh(top_productos['descripcion'], top_productos['cantidad']) dibuja las barras.
  • plt.gca().invert_yaxis() invierte el eje Y para que el producto más vendido quede arriba [12:15].
  • Etiquetas los ejes con plt.xlabel("Cantidad vendida") y plt.ylabel("Producto").

Si quieres un top 3 en lugar de top 10, solo cambias el argumento de head() y el resto del pipeline se adapta solo.

Qué descubres cuando NumPy, Pandas y Matplotlib trabajan juntos

La fuerza de este flujo está en encadenar herramientas: NumPy maneja los cálculos, pandas organiza y filtra el DataFrame, y Matplotlib convierte ese trabajo en gráficos que comunican.

Graficar no es decoración, es diagnóstico. La caída de diciembre en las ventas, la mínima proporción de devoluciones y la concentración de unidades en pocos productos top son hallazgos que solo aparecen al visualizar. También puedes crear una columna categórica nueva clasificando el monto total en alto, medio o bajo, y graficarla en otro pastel para ver cómo se distribuye el ticket de tus clientes.

Ahora te toca a ti: aplica este mismo flujo al dataset que elegiste, comparte tus gráficos en los comentarios y cuéntanos qué patrón inesperado encontraste.