Saltar a contenido

Gráficos de barras y de líneas

Ejercicio bar-and-line-annex.pdf · PDF

Termina la partida y el juego te muestra dos pantallas. La primera es la clasificación: todos los jugadores ordenados por puntuación, el mejor arriba. La segunda es la cronología de la partida: qué pasó minuto a minuto, cuándo llegaron las bajas, cuándo se hundió tu equipo.

Dos pantallas, dos preguntas distintas. ¿Quién va primero? y ¿qué pasó con el tiempo? Nadie las confunde: una clasificación dibujada como cronología no tendría ningún sentido.

Esas dos pantallas son los dos gráficos que más vas a usar en tu vida: el gráfico de barras y el gráfico de líneas. Esta lección trata de construir ambos a partir de games_clean, y de la pregunta que decide cuál de los dos necesitas.

Qué aprenderás

  • Moverte por la vista Explore de Superset y decir para qué sirve cada una de sus cuatro zonas
  • Distinguir una dimensión de una métrica, y relacionar ambas con el GROUP BY y el agregado de una consulta SQL
  • Construir un gráfico de barras ordenado (un top 10) y decidir qué hacer con una categoría llamada Unknown
  • Construir un gráfico de líneas a lo largo del tiempo y cambiar su granularidad temporal de año a mes
  • Justificar barras frente a líneas: las categorías no tienen punto intermedio, el tiempo sí
  • Desactivar la trampa: por qué una línea que cruza categorías inventa una tendencia que no existe

Dimensión y métrica: las dos mitades de todo gráfico

En Percepción visual construiste tu primer gráfico, juegos por tramo de precio. Detrás hay una consulta que habrías podido escribir en la Unidad 1:

SELECT price_band, COUNT(*) FROM games_clean GROUP BY price_band;

Esa consulta tiene dos mitades, y también la tiene todo gráfico que construyas jamás.

Una dimensión es aquello por lo que agrupas: la columna cuyos valores se convierten en las barras, los puntos o los sectores.

Una métrica es lo que calculas para cada grupo: un recuento, una media, una suma.

Palabra En SQL En Superset En la clasificación
Dimensión La columna del GROUP BY X-axis, Dimensions Los nombres de los jugadores
Métrica El agregado: COUNT, AVG, SUM Metrics La puntuación
flowchart LR
    D["<b>Dimensión</b><br>price_band<br>(los nombres de los jugadores)"] --> Q["<b>GROUP BY</b> + agregado<br>Superset escribe el SQL"]
    M["<b>Métrica</b><br>COUNT(*)<br>(la puntuación)"] --> Q
    Q --> C["<b>Gráfico</b><br>una barra por grupo,<br>altura de la barra = métrica"]

Cuidado: dimensión y métrica no son palabras de Superset

Son el GROUP BY y el agregado, los mismos que escribiste en SQL Lab: grupos. Superset escribe ese SQL por ti, y puedes comprobarlo: abre el menú del gráfico (⋯, arriba a la derecha) y elige View query. Como aprendiste SQL primero, puedes leer lo que hace la herramienta y verificarlo.

La vista Explore

Todo gráfico de Superset se construye en una sola pantalla, la vista Explore. Abre desde Charts tu gráfico guardado UT3 · Games by price band y míralo de izquierda a derecha. Tiene cuatro zonas:

Zona Qué hay Para qué sirve
Panel del dataset (izquierda) Las columnas y las métricas guardadas de games_clean Arrastrar una columna a un control
Pestaña Data Tipo de gráfico, X-axis, Metrics, Dimensions, Filters, Row limit Decidir qué se calcula
Pestaña Customize Títulos, formatos de los ejes, orientación, leyenda Decidir cómo se ve
Gráfico y resultados La imagen y, debajo, las filas que la sostienen Comprobar los números

La pestaña Data es la consulta. La pestaña Customize es la pintura. Hoy trabajas casi solo en Data; la pintura tiene su propia lección, Configurar gráficos en Superset.

El gráfico de barras: una clasificación

Un gráfico de barras dibuja una barra por categoría. La longitud de la barra es la métrica. Responde a la pregunta ¿qué categoría es mayor?

Un gráfico de barras es una clasificación. La dimensión es una lista de categorías: valores sin punto intermedio, como editoras, tramos de precio o tipos de Pokémon. Cada una recibe una barra, todas las barras arrancan de la misma línea y comparas dónde acaban. Eso es posición sobre una escala común, rango 1 en la tabla de Cleveland y McGill.

Aquí tienes la clasificación de editoras (publishers) de Steam: las diez que han publicado más juegos en games_clean.

%%{init: {"themeVariables": {"xyChart": {"plotColorPalette": "#4051b5"}}}}%%
xychart-beta horizontal
    title "Top 10 editoras por número de juegos en Steam"
    x-axis ["Big Fish Games", "SEGA", "Strategy First", "Ubisoft", "Square Enix", "Sekai Project", "Choice of Games", "Dagestan Technology", "1C Entertainment", "THQ Nordic"]
    y-axis "Juegos" 0 --> 300
    bar [284, 141, 129, 123, 95, 94, 92, 89, 85, 84]

Dos decisiones hicieron legible este gráfico, y ninguna tiene que ver con el color:

Decisión Por qué
Ordenado por valor Una clasificación es un ranking. La respuesta a "¿quién va primero?" está arriba
Barras horizontales Nombres largos como Dagestan Technology se leen sin ladear la cabeza

Un top 10 no es toda la tabla

games_clean tiene 13,951 editoras distintas. Estas diez reúnen 1,216 de los 26,685 juegos, menos del 5 %. Un top 10 responde a "¿quiénes son las más grandes?", no a "¿quién domina el mercado?". Recuérdalo en Sectores, mapa de calor y otros, donde las mismas diez editoras forman un gráfico de sectores que miente.

El jugador fantasma llamado Unknown

Si construyes ese top 10 sin pensar, la quinta barra es una editora llamada Unknown, con 120 juegos.

¿Es Unknown una editora? No. Es la etiqueta que diste a los juegos sin editora cuando limpiaste los datos en la Unidad 2. En una clasificación es un jugador fantasma: 120 juegos que no pertenecen a nadie en concreto, plantados en quinto lugar.

Tienes dos opciones honestas:

Opción Cuándo
Filtrarla La pregunta trata de editoras reales. Unknown no lo es
Mantenerla y decirlo La pregunta trata de la calidad de los datos: "120 juegos no tienen editora conocida"

Lo que no puedes hacer es dejarla ahí en silencio y dejar que el lector piense que existe una empresa llamada Unknown.

Cuidado: Row limit 10 no da diez filas al azar

En un gráfico de barras, Superset ordena la consulta por la métrica, de mayor a menor, y luego corta: obtienes el top diez. Pero el corte ocurre después del filtro. Quita Unknown y entra una undécima editora: THQ Nordic, con 84 juegos.

El gráfico de líneas: una cronología

Un gráfico de líneas coloca un punto por cada momento del tiempo y une los puntos con una línea. Responde a la pregunta ¿cómo ha cambiado esto con el tiempo?

Un gráfico de líneas es la cronología de la partida. Su dimensión no es una lista de categorías. Es el tiempo, y el tiempo tiene dos propiedades que las categorías no tienen: tiene un orden y es continuo. Entre 2016 y 2018 hay un 2017.

Eso es lo que significa la línea. Unir dos puntos le dice al ojo: estos están conectados, lee la pendiente. Muy empinada hacia arriba, crecimiento rápido. Plana, no pasó nada.

Aquí tienes los juegos publicados en Steam cada año, a partir de la columna release_date:

%%{init: {"themeVariables": {"xyChart": {"plotColorPalette": "#4051b5"}}}}%%
xychart-beta
    title "Juegos publicados en Steam por año"
    x-axis ["2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018"]
    y-axis "Juegos" 0 --> 9000
    line [53, 58, 112, 143, 183, 334, 340, 364, 426, 556, 1352, 2544, 4503, 6871, 8845]

Lee la pendiente. Diez años de casi nada: 53 juegos en 2004, 556 en 2013. Luego la línea despega: 1,352 en 2014 y 8,845 en 2018.

¿Por qué salta 2014?

Valve, la empresa detrás de Steam, abrió la tienda a los desarrolladores pequeños. Steam Greenlight se lanzó el 30 de agosto de 2012 y dejaba que la comunidad votara los juegos que quería ver en la tienda. El 13 de junio de 2017 lo sustituyó Steam Direct, donde el desarrollador paga una tarifa y publica. Un gráfico te muestra que algo cambió. Descubrir por qué es tu trabajo.

Cuidado: un juego no tiene fecha

Un juego de games_clean no tiene release_date. La consulta devuelve para él una 16.ª fila, con el año vacío y un recuento de 1. No es un punto de la línea: un juego sin fecha no tiene lugar en un eje temporal.

Granularidad temporal: el zoom de la cronología

Una columna de fecha contiene días. Para dibujar una línea debes decidir cómo agrupar esos días: por año, por trimestre, por mes.

La granularidad temporal (time grain) es el tamaño del paso de tiempo en el eje X: cada punto de la línea suma todo lo que ocurrió dentro de un paso.

Cambia la granularidad de año a mes y los mismos datos dibujan otra imagen:

Gráfico de líneas de los juegos publicados en Steam cada mes de 2004 a 2018. La línea se queda cerca de cero hasta 2013, sube de forma empinada desde 2014 y hace zigzag en 2018, con un pico etiquetado de 853 juegos en marzo de 2018.

La línea por años decía "explotó". La línea por meses muestra cuándo, dentro de cada año. El punto más alto es marzo de 2018, con 853 juegos, seguido de mayo de 2018 (796), noviembre de 2018 (790) y octubre de 2017 (768).

Granularidad Puntos en la línea Qué puedes leer
Año 15 La historia grande: arranque lento, explosión tras 2013
Mes 180 El detalle: qué meses están cargados, dónde está el pico

Cuidado: el gráfico por años y el gráfico por meses no se contradicen

Mismas filas, mismo tipo de gráfico, distinta granularidad. Los 853 de marzo de 2018 forman parte de los 8,845 de 2018. La granularidad es parte de la pregunta, así que elígela a propósito y dila en el título: "por año", "por mes".

Cuidado: una línea que cae al final

Cuando una línea baja en su último punto, comprueba primero si el último periodo está completo. Si los datos se cortan a mitad de un año, ese año parece un desplome y solo es un recuento sin terminar. Aquí los datos acaban el 31 de diciembre de 2018, el último año está completo y la línea no cae.

¿Barras o líneas? Una pregunta decide

El tipo de gráfico sigue a la dimensión. Pregunta una sola cosa: ¿hay algo entre dos valores vecinos?

flowchart TB
    Q{"¿Qué hay en el eje X?"}
    Q -- "Categorías:<br>editoras, tramos, tipos" --> B["<b>Gráfico de barras</b><br>(la clasificación)<br>compara alturas"]
    Q -- "Tiempo:<br>días, meses, años" --> L["<b>Gráfico de líneas</b><br>(la cronología)<br>lee la pendiente"]
Pregunta Gráfico Por qué
¿Juegos por owners_tier? Barras Tres categorías. No hay nada entre Mid y Hit
¿Precio medio por año de lanzamiento? Líneas El tiempo es continuo y ordenado: la pendiente significa algo
¿Juegos por editora, top 10? Barras Diez empresas. Ninguna empresa está "entre" otras dos

¿Qué pasa si ignoras la regla? Aquí tienes la clasificación de editoras dibujada como línea. Este gráfico está mal a propósito.

%%{init: {"themeVariables": {"xyChart": {"plotColorPalette": "#4051b5"}}}}%%
xychart-beta
    title "Mal a propósito: una línea que cruza categorías"
    x-axis ["Big Fish", "SEGA", "Strategy First", "Ubisoft", "Square Enix", "Sekai Project"]
    y-axis "Juegos" 0 --> 300
    line [284, 141, 129, 123, 95, 94]

Tu ojo lee una caída dramática y luego un declive lento. ¿Un declive de qué? No hay camino de Big Fish Games a SEGA. A medio camino entre ellas no hay ninguna empresa con 212 juegos. La línea conecta cosas que no están conectadas, y la "tendencia" existe solo por el orden que alguien eligió para los nombres.

Cuidado: una línea no queda más profesional

Una línea le dice al ojo: estos puntos están conectados, lee la pendiente. En la cronología eso es verdad. En la clasificación es mentira. Categorías, barras. Tiempo, líneas.

Pruébalo: la clasificación y la cronología

Ambos gráficos usan el dataset games_clean (consulta Recursos para los datos).

Gráfico 2 — Top 10 editoras. ¿Qué editoras han publicado más juegos en Steam?

Paso Haz esto en Superset Deberías ver
1 Charts, + Chart, dataset games_clean, tipo de gráfico Bar Chart, Create new chart Un editor de gráficos vacío
2 X-axis: publisher. Metrics: COUNT(*). Row limit: 10. Create chart Diez barras en orden alfabético
3 X-Axis Sort By: COUNT(*). Desmarca X-Axis Sort Ascending. Update chart La barra más alta a la izquierda. Unknown es la quinta, con 120
4 Filters: publisher, operador Not equal to (≠), valor Unknown, Save. Update chart Diez editoras reales. THQ Nordic ha entrado
5 Pestaña Customize, Bar orientation: Horizontal Nombres legibles. Los controles de orden ahora se llaman Y-Axis Sort By y Y-Axis Sort Ascending
6 Save, nombre UT3 · Top 10 publishers El gráfico está en la lista de Charts

El gráfico debe coincidir con esta consulta:

SELECT publisher, COUNT(*) AS n FROM games_clean
WHERE publisher <> 'Unknown'
GROUP BY publisher ORDER BY n DESC LIMIT 10;
Editora Juegos Editora Juegos
Big Fish Games 284 Sekai Project 94
SEGA 141 Choice of Games 92
Strategy First 129 Dagestan Technology 89
Ubisoft 123 1C Entertainment 85
Square Enix 95 THQ Nordic 84

Gráfico 3 — Juegos publicados por año. ¿Cómo ha cambiado el número de lanzamientos entre 2004 y 2018?

Paso Haz esto en Superset Deberías ver
1 Gráfico nuevo sobre games_clean, tipo de gráfico Line Chart Un editor de gráficos vacío
2 X-axis: release_date. Time Grain: Year. Metrics: COUNT(*). Create chart Una línea que sube hacia la derecha, de 2004 a 2018
3 Save, nombre UT3 · Games released per year El gráfico está en la lista de Charts
4 Cambia Time Grain a Month. Update chart. Pasa el ratón para encontrar el punto más alto Una línea en zigzag con su pico en marzo de 2018
5 Save, luego Save as..., nombre UT3 · Games released per month Dos gráficos guardados: el de años no se sobrescribe

La línea no dibuja puntos por defecto: marca Customize, Marker si quieres ver los 15 puntos. Cuando pasas el ratón, el cuadro redondea el valor (8.85k para 2018); el número exacto está en Results, debajo del gráfico.

Si algo no se ve bien
  • Time Grain no aparece o está en gris. El eje X no es una columna de fecha. Usa release_date, no release_year.
  • Un gráfico de barras con miles de barras finas. Row limit se quedó en su valor por defecto (10,000). Ponlo en 10.
  • La línea es un solo punto. release_date fue a Dimensions en lugar de a X-axis.
  • El valor de filtro Unknown no encuentra nada. Distingue mayúsculas: U mayúscula.
  • Save sobrescribió el gráfico por años con la versión por meses. Vuelve a poner la granularidad en Year y guarda de nuevo; luego usa Save as... para la de meses.
Ve más allá: otra métrica en la misma cronología

De vuelta en la granularidad por años, sustituye la métrica: Metrics, pestaña Simple, columna price, agregado AVG. ¿Se encarecieron los juegos a medida que se hacían más numerosos?

No. El precio medio alcanza su máximo en 2013 con 11.21 y baja cada año después, hasta 7.12 en 2018. Más juegos, juegos más baratos. Ten en cuenta que los juegos gratuitos cuentan como 0 en esta media.

Ideas clave

  • Todo gráfico tiene una dimensión (aquello por lo que agrupas, la columna del GROUP BY) y una métrica (lo que calculas, el agregado). Superset escribe el SQL; View query te lo muestra.
  • La vista Explore tiene cuatro zonas: panel del dataset, pestaña Data (qué se calcula), pestaña Customize (cómo se ve), gráfico y resultados.
  • Un gráfico de barras compara categorías: es la clasificación. Ordénalo por valor, y hazlo horizontal cuando los nombres sean largos.
  • Un gráfico de líneas muestra el cambio en el tiempo: es la cronología. La línea dice "estos puntos están conectados, lee la pendiente".
  • La granularidad temporal es el zoom de la cronología. Año y mes muestran las mismas filas con una pregunta distinta.
  • Una línea que cruza categorías inventa una tendencia. Una etiqueta como Unknown no es una categoría real: fíltrala o explícala.

Comprobación rápida

1. En la consulta SELECT price_band, COUNT(*) FROM games_clean GROUP BY price_band, ¿qué parte es la dimensión?
  • COUNT(*)
  • price_band
  • games_clean
  • SELECT

La dimensión es la columna por la que agrupas: sus valores se convierten en las barras. COUNT(*) es la métrica, el número calculado para cada grupo. games_clean es el dataset.

2. ¿Qué zona de la vista Explore decide qué se calcula?
  • El panel del dataset
  • La pestaña Data
  • La pestaña Customize
  • La tabla de resultados bajo el gráfico

La pestaña Data contiene X-axis, Metrics, Filters y Row limit: es la consulta. La pestaña Customize cambia cómo se ve el gráfico, y la tabla de resultados solo muestra las filas que hay detrás de la imagen.

3. ¿Por qué un gráfico de líneas es la elección correcta para los juegos publicados por año?
  • Porque las líneas quedan más profesionales que las barras
  • Porque hay más de diez valores
  • Porque el tiempo es ordenado y continuo, así que la pendiente entre dos puntos significa algo
  • Porque un gráfico de barras no puede usar una columna de fecha

Una línea dice "estos puntos están conectados". Con el tiempo eso es verdad: entre 2016 y 2018 hay un 2017, y la pendiente muestra lo rápido que crecieron los lanzamientos. El número de valores no tiene nada que ver.

4. Cambias la Time Grain de Year a Month. ¿Qué cambia?
  • Las filas del dataset: se descartan algunos juegos
  • La métrica: se convierte en una media
  • El tamaño del paso de tiempo: cada punto suma ahora un mes en lugar de un año
  • El tipo de gráfico: se convierte en un gráfico de barras

La granularidad temporal es el zoom de la cronología. Mismas filas, misma métrica, mismo tipo de gráfico: solo cambia el paso. Por eso los 853 juegos de marzo de 2018 forman parte de los 8,845 del año.

5. Tu gráfico del top 10 de editoras muestra Unknown en quinto lugar con 120 juegos. ¿Qué es?
  • Una editora pequeña cuyo nombre es Unknown
  • Un error de Superset que se arregla recargando
  • La etiqueta que se dio en la Unidad 2 a los juegos sin editora
  • La suma de todas las editoras fuera del top 10

Unknown agrupa bajo una etiqueta 120 juegos sin editora conocida. No es una empresa. Fíltrala cuando la pregunta trate de editoras reales, o mantenla y di claramente qué es.

6. Después de filtrar Unknown con Row limit 10, el gráfico sigue teniendo diez barras. ¿Por qué?
  • Superset se inventa una décima editora para llenar el hueco
  • El límite se aplica después del filtro, así que la undécima editora (THQ Nordic) sube
  • El filtro no funcionó
  • Row limit cuenta juegos, no editoras

Superset ordena por la métrica, de mayor a menor, y luego corta a diez. El corte ocurre después del filtro, así que quitar una fila de arriba deja entrar a la siguiente: THQ Nordic, con 84 juegos.

7. Alguien dibuja el número de Pokémon por tipo (water, normal, grass...) como un gráfico de líneas. ¿Qué está mal?
  • Nada: cualquier gráfico con números puede ser de líneas
  • La línea debería ser más gruesa
  • Los tipos son categorías sin nada intermedio, así que la línea muestra una tendencia que no existe
  • Los gráficos de líneas necesitan al menos 100 puntos

No hay camino de water a normal ni ningún tipo a medio camino entre ellos. La pendiente depende solo del orden que alguien eligió para los nombres. Categorías, barras. Tiempo, líneas.

8. Tienes una tabla de estudiantes con enrolment_date y study_programme. Elige las dos opciones correctas.
  • Matrículas por programa: Bar Chart, dimensión study_programme, métrica COUNT(*)
  • Matrículas mes a mes: Line Chart, X-axis enrolment_date con granularidad Month, métrica COUNT(*)
  • Matrículas por programa: Line Chart, porque los programas tienen un orden alfabético
  • Matrículas mes a mes: Bar Chart con dimensión study_programme

Los programas son categorías: un gráfico de barras, sin granularidad temporal. Los meses son tiempo: un gráfico de líneas con la granularidad en Month. El orden alfabético no es un orden real (no hay nada entre dos programas), y study_programme no dice nada de cuándo se matricularon los estudiantes.

Una barra por categoría funciona cuando las categorías ya existen. Pero ¿y si el eje X es un número con cientos de valores distintos, como un precio? Una barra por cada precio exacto sería ilegible. Ese es el trabajo del siguiente gráfico: Histograma y diagrama de dispersión.