Ir al contenido
wannacode

Qué gráfico para qué pregunta

En resumen: El tipo de gráfico se elige según la pregunta: barras ordenadas para una comparación, una línea para el cambio en el tiempo y otra vez barras, no un gráfico circular, para la parte de un todo.

Problema

Cuatro preguntas, un mismo conjunto de datos

El gerente tiene cuatro preguntas sobre el año:

  1. ¿Qué productos aportan más dinero?
  2. ¿Cómo van los ingresos día a día?
  3. ¿Qué parte de los ingresos es cada categoría?
  4. ¿Qué es un pedido habitual?

Los datos son los mismos: los pedidos y sus líneas. El gráfico, sin embargo, es distinto para cada pregunta. No hay un gráfico que las responda todas. Hay un gráfico que responde bien a una pregunta, y muchos que la responden mal.

La idea

Primero la pregunta, después el gráfico

No empieces por «quiero un gráfico circular» o «quiero una línea». Empieza por la pregunta y mira de qué tipo es:

  • comparación («cuál es mayor»): barras ordenadas por valor; con nombres largos, horizontales (ax.barh);
  • cambio en el tiempo («cómo va»): una línea;
  • parte de un todo («qué parte»): otra vez barras ordenadas, en porcentaje; un gráfico circular es más difícil de leer;
  • distribución («qué es habitual, cuánto se dispersa»): un histograma, en la próxima lección;
  • relación («crecen juntos»): un diagrama de dispersión, también en la próxima lección.

Veamos las tres primeras con los mismos datos.

La idea

Comparación: barras horizontales ordenadas

«¿Qué productos aportan más?» es una comparación de 25 productos. Sus nombres son largos, así que las barras son horizontales: ax.barh(names, values). Los nombres quedan a la izquierda y se pueden leer sin girarlos.

Ordenar con sort_values() convierte el gráfico en una clasificación. barh dibuja la primera fila abajo, así que el orden ascendente pone el mayor arriba. figsize=(7, 7) da a la figure un tamaño en pulgadas: 25 barras necesitan altura.

Pythondatos: las tablas de la tienda

El queso blanco aporta más: 10 325,30 €. Después vienen el café en grano (9585,10 €) y el queso kashkaval (8616,50 €). Ordenadas, las barras responden a la pregunta antes de que leas los números.

Más precisamente, para curiosos

Sin sort_values() los productos salen de groupby en orden alfabético. El orden alfabético es cómodo cuando buscas un producto por su nombre. Para la pregunta «cuál es el mayor» necesitas el orden por valor.

Pruébalo

Los más vendidos en unidades

¿Qué 10 productos vendieron más unidades en el año? Guárdalos en top (el producto es el índice, las unidades son el valor) y dibújalos como barras horizontales con el mayor arriba.

Pythondatos: las tablas de la tienda

La idea

Cambio en el tiempo: una línea

«¿Cómo van los ingresos día a día?» es un cambio en el tiempo. Una línea une cada día con el siguiente, y el ojo sigue la dirección. 365 barras serían una valla en la que no se ve nada.

Los ingresos diarios saltan por el ritmo semanal. Una segunda línea con la media de 7 días (rolling(7) de la lección sobre fechas) muestra la dirección bajo el ruido:

Pythondatos: las tablas de la tienda

Son 365 días. El más fuerte es el 26 de diciembre de 2025 con 852,90 €. La línea fina hace zigzag cada semana, y la gruesa muestra el gran pico de diciembre y las bajadas de enero y septiembre. Abajo hay fechas: ordered_at se ha convertido en fechas con pd.to_datetime, y matplotlib pone los meses por sí mismo.

La idea

Gráficos pequeños uno al lado del otro

En la lección anterior las siete categorías se enredaron en unos mismos axes. Otra manera es poner cada categoría en su propio gráfico pequeño y colocar los gráficos uno al lado del otro. Se llaman small multiples (múltiplos pequeños).

plt.subplots(2, 3) da una figure con 2 filas y 3 columnas de axes. axes es un array de NumPy de forma (2, 3), y axes.flat los va entregando uno a uno. sharey=True les da a todos la misma escala vertical. fig.suptitle es un título para toda la figure. Abajo solo hay el número del mes (pv.index.str[5:]), para que quepa:

Pythondatos: las tablas de la tienda

Con una escala compartida se pueden comparar las alturas: los lácteos son lo más alto todo el año, y la cocina es baja con un pico en diciembre. Cada línea se lee por sí sola, sin leyenda y sin colores para distinguirlas.

La idea

Parte de un todo: barras frente a un gráfico circular

«¿Qué parte de los ingresos es cada categoría?» es una pregunta sobre proporciones. A menudo se dibuja como gráfico circular. Aquí están el círculo y las barras ordenadas con los mismos números, uno al lado del otro. plt.subplots(1, 2) da dos axes: aquí se llaman left y right:

Pythondatos: las tablas de la tienda

El círculo muestra que los lácteos son el sector más grande, un poco más de un cuarto. La limpieza (9,8 %) y la cocina (10,2 %), sin embargo, parecen iguales. El pan (11,9 %) también está cerca. Las barras de la derecha los ponen en orden, y las diferencias se ven.

1. Mira solo el gráfico circular de la izquierda. ¿Qué es mayor: cocina o limpieza?

La idea

Por qué un gráfico circular engaña

Las barras se comparan por la longitud desde la misma línea. El ojo lo hace bien. Un círculo hace que el ojo compare los ángulos y las áreas de sectores girados en direcciones distintas. El ojo lo hace mal, sobre todo cuando las proporciones son parecidas.

Un círculo tiene otros problemas:

  • con más de 4–5 sectores las etiquetas se amontonan;
  • dos círculos uno al lado del otro (diciembre frente al año) apenas se pueden comparar;
  • el color es lo único que une un sector con su nombre.

Un círculo cumple su función en un caso: dos o tres sectores y la pregunta «¿más o menos de la mitad?». Para todo lo demás, las barras ordenadas dicen lo mismo con más claridad.

La idea

Distribución y relación

Quedan dos tipos de pregunta. Necesitan gráficos que vienen en la próxima lección:

  • distribución: «¿qué es un pedido habitual?». La respuesta no es un número, sino cómo se reparten 10 459 pedidos: cuántos son pequeños y cuántos grandes. Un histograma lo muestra;
  • relación: «¿son más caros los pedidos con más líneas?». Cada pedido se convierte en un punto con dos números. La nube de puntos es un diagrama de dispersión.
1. El gerente pregunta: «¿Qué es un pedido habitual: la mayoría rondan los 5 € o los 20 €?». ¿Qué gráfico responde?
2. «¿Son más caros los pedidos con más líneas?». ¿Qué gráfico responde?

Ejercicio

Qué trae diciembre

Diciembre es el mes más fuerte. ¿Tiene más pedidos, o más grandes? Guarda en orders_n el número de pedidos de cada mes (sin los cancelados) y en avg el pedido medio en euros, y dibújalos como dos líneas en dos axes uno al lado del otro, cada uno con un título.

Pythondatos: las tablas de la tienda

¿Qué parte de los ingresos de diciembre de 2025 es cada categoría, con la tarjeta de regalo? Guarda la parte en porcentaje en share, ordenada, y dibújala como barras horizontales con la mayor arriba.

Pythondatos: las tablas de la tienda

Test

Ponte a prueba

1. Quieres comparar los ingresos de 25 productos con nombres largos. ¿Qué se lee mejor?
2. Has dibujado top = units.nlargest(10) con ax.barh. ¿Por qué el producto más vendido está abajo?
3. El número de pedidos y el pedido medio en euros por mes. ¿Por qué en dos axes uno al lado del otro y no en uno?
4. ¿Qué hace sharey=True en plt.subplots(2, 3, sharey=True)?
5. ¿Qué es lo primero que decides antes de dibujar un gráfico?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·