Módulo 2 · Datos
Visualización exploratoria
En esta páginaEl problema
El problema
Ya sabes que sensores-aula.csv contiene ocho observaciones sintéticas, cinco columnas y un faltante en humedad. Ahora necesitas responder otra pregunta: ¿cómo se distribuyen conjuntamente la temperatura y el CO₂, y dónde aparecen las tres zonas dentro de esas ocho filas?
Las columnas relevantes están completas:
| muestra_id | temperatura_c | co2_ppm | zona |
|---|---|---|---|
| A-001 | 22.4 | 420 | norte |
| A-002 | 23.1 | 435 | norte |
| A-003 | 21.8 | 415 | sur |
| A-004 | 25.0 | 470 | centro |
| A-005 | 24.6 | 510 | centro |
| A-006 | 19.9 | 495 | sur |
| A-007 | 20.5 | 530 | sur |
| A-008 | 26.2 | 455 | norte |
Cada fila aporta un par (temperatura_c, co2_ppm). Una gráfica de dispersión coloca la primera variable en el eje horizontal y la segunda en el vertical. Cada punto conserva una observación.
Una gráfica de líneas uniría las filas y sugeriría una secuencia. Este archivo no contiene tiempo ni otro orden continuo que justifique esa conexión. Una gráfica de barras podría comparar una sola medición por identificador, pero no mostraría con la misma claridad la relación entre las dos variables cuantitativas.
El resultado es una figura con una descripción y una tabla equivalente. Ni la figura ni la tabla, por sí solas, demuestran causalidad ni describen mediciones fuera de estas ocho filas.
Pregunta y canales visuales
Una figura asigna datos a canales visuales. Aquí la asignación responde directamente a la pregunta:
- posición horizontal → temperatura en grados Celsius
- posición vertical → CO₂ en partes por millón
- color y forma del marcador → zona
- un punto → una observación identificada en la tabla
Descarga sensores-aula.csv desde el panel de esta página y colócalo junto a tu cuaderno o archivo.
Pregunta. Sin dibujar, a partir de la tabla, ¿cuántos puntos tendrá la figura y qué rango cubrirá cada eje?
Primero comprueba que las columnas elegidas contienen los ocho pares esperados.
import pandas as pd
tabla = pd.read_csv("sensores-aula.csv")
vista = tabla[["muestra_id", "temperatura_c", "co2_ppm", "zona"]]
print(f"Filas: {len(vista)}")
print(
f"Temperatura: {vista['temperatura_c'].min():.1f} a "
f"{vista['temperatura_c'].max():.1f} °C"
)
print(f"CO2: {vista['co2_ppm'].min()} a {vista['co2_ppm'].max()} ppm")
print(f"Zonas: {sorted(vista['zona'].unique())}")
La salida esperada está oculta.
Gráfica de dispersión
Matplotlib crea la figura y el área de trazado. seaborn recibe el DataFrame y asigna columnas a los canales declarados. hue="zona" cambia el color. style="zona" también cambia el marcador. Esa redundancia permite distinguir las zonas aunque el color no se perciba. ax=ax dibuja los puntos en el área creada por plt.subplots. ax.set(...) fija el título y las etiquetas de los ejes, y ax.legend(title=...) nombra la leyenda.
Pregunta. Antes de ejecutar, a partir de la tabla, ¿esperas que cada zona forme un grupo separado en el plano temperatura–CO₂?
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots(figsize=(8, 5))
sns.scatterplot(
data=vista, x="temperatura_c", y="co2_ppm",
hue="zona", style="zona", s=90, ax=ax, # s: tamaño del marcador
)
ax.set(
title="Temperatura y CO₂ en ocho observaciones sintéticas",
xlabel="Temperatura (°C)",
ylabel="CO₂ (ppm)",
)
ax.legend(title="Zona")
print(f"Título: {ax.get_title()}")
print(f"Ejes: {ax.get_xlabel()} | {ax.get_ylabel()}")
plt.show()
La salida esperada está oculta.
Verificación con los datos
Usa la gráfica para localizar valores extremos. Usa la consulta para obtener sus identificadores y valores exactos. idxmax() devuelve la etiqueta de la fila donde aparece el máximo de una columna.
Pregunta. A partir de la tabla inicial, anticipa qué identificador y valor devolverá cada máximo.
co2_max = vista.loc[vista["co2_ppm"].idxmax()]
temperatura_max = vista.loc[vista["temperatura_c"].idxmax()]
print(
f"CO2 máximo: {co2_max['muestra_id']}, "
f"{co2_max['co2_ppm']} ppm, zona {co2_max['zona']}"
)
print(
f"Temperatura máxima: {temperatura_max['muestra_id']}, "
f"{temperatura_max['temperatura_c']:.1f} °C, "
f"zona {temperatura_max['zona']}"
)
La salida esperada está oculta.
Para dejar una evidencia que pueda recorrerse sin ver la gráfica, ordenamos los pares por CO₂. sort_values con una lista de columnas ordena primero por CO₂ y desempata por muestra_id; ascending=[False, True] fija el sentido de cada una.
Pregunta. Si ordenas de mayor a menor, ¿qué tres identificadores deberían aparecer primero?
evidencia = vista.sort_values(
["co2_ppm", "muestra_id"],
ascending=[False, True],
)
print(evidencia.head(3).to_string(index=False))
La salida esperada está oculta.
Descripción de los hallazgos
Una descripción útil responde qué se representó, cuántas observaciones aparecen, qué hallazgos se verificaron y qué límite tiene la lectura. Para este caso:
La dispersión compara temperatura (19.9–26.2 °C) y CO₂ (415–530 ppm) en ocho observaciones sintéticas. A-007 tiene el CO₂ máximo y A-008 la temperatura máxima. En el plano de esta figura, las zonas se mezclan y cada una contiene solo dos o tres filas. La figura describe estas observaciones. No demuestra causalidad ni permite generalizar a otras mediciones.
Evita frases como “la temperatura reduce el CO₂” o “la zona sur siempre tiene más CO₂”. La primera inventa una causa. La segunda contradice A-003, una observación de zona sur con el CO₂ mínimo.
Una figura y su evidencia equivalente
Localiza A-007 y A-008. Después, compara la gráfica con la descripción y la tabla. El color repite información que también aparece como marcador y texto.
- norte · círculo
- centro · cuadrado
- sur · triángulo
Descripción textual
La figura contiene ocho observaciones. La temperatura va de 19.9 a 26.2 °C y el CO₂ de 415 a 530 ppm. A-007 registra el CO₂ máximo; A-008, la temperatura máxima. Los máximos pertenecen a filas distintas. En el plano temperatura–CO₂, las zonas se mezclan: A-003 (sur) queda junto a A-001 y A-002 (norte). Con solo dos o tres observaciones por zona, no se puede establecer un patrón general.
| Muestra | Temperatura (°C) | CO₂ (ppm) | Zona |
|---|---|---|---|
| A-001 | 22.4 | 420 | norte |
| A-002 | 23.1 | 435 | norte |
| A-003 | 21.8 | 415 | sur |
| A-004 | 25.0 | 470 | centro |
| A-005 | 24.6 | 510 | centro |
| A-006 | 19.9 | 495 | sur |
| A-007 | 20.5 | 530 | sur |
| A-008 | 26.2 | 455 | norte |
Práctica
Traza guiada
Sin ejecutar, describe dónde esperarías estos tres puntos:
- A-005: temperatura 24.6 °C y CO₂ 510 ppm
- A-003: temperatura 21.8 °C y CO₂ 415 ppm
- A-006: temperatura 19.9 °C y CO₂ 495 ppm
Después localízalos en la figura y confirma sus valores en la tabla. Si tu predicción no coincide, revisa primero qué variable ocupa cada eje.
Pregunta alternativa
Pregunta ahora cómo se relacionan temperatura_c y humedad_pct. Antes de graficar, cuenta cuántas filas tienen ambas columnas disponibles.
Usa temperatura en x, humedad en y y conserva color más marcador para zona. La descripción debe indicar cuántas observaciones tienen ambas mediciones, no el total del archivo.
Evidencia para otra tabla
Elige una tabla local pequeña con dos variables cuantitativas y un identificador. Escribe primero una pregunta que necesite comparar pares. Conserva:
- la pregunta y la razón para elegir dispersión
- una figura con título, ejes y unidades
- una tabla o consulta con identificadores y valores exactos
- dos observaciones verificables
- una limitación que impida generalizar más allá de la tabla
Reto opcional
Ordena vista por temperatura y comprueba si los valores de CO₂ aumentan en el mismo orden. Explica por qué encontrar ascensos y descensos en ocho pares no basta para declarar ausencia o presencia de una relación poblacional. No calcules un coeficiente ni añadas una recta de tendencia.
Errores que revisar
- Si aparece una línea uniendo puntos, comprueba que usaste
scatterploty no una gráfica de líneas. - Si la figura tiene menos puntos de los previstos, compara el conteo con faltantes y filtros antes de interpretar.
- Si las zonas solo se distinguen por color, añade
style="zona"y conserva sus nombres en la leyenda y la tabla. - Si el título dice “efecto” o “causa”, vuelve a la pregunta: este ejercicio solo inspecciona pares observados.
- Si la tabla y la figura parecen contradecirse, revisa qué columna asignaste a cada eje y conserva
muestra_iddurante la comprobación.
Cierre
Redacta dos hallazgos y una limitación. Cada hallazgo debe poder comprobarse en la tabla y la limitación debe restringir la lectura a las filas observadas.
Lista de comprobación
- ¿La pregunta aparece antes que la gráfica?
- ¿Cada eje nombra variable y unidad?
- ¿La categoría tiene una alternativa al color?
- ¿La evidencia textual conserva identificadores y valores?
- ¿La descripción evita causas y generalizaciones no verificadas?
Documentación oficial
- Inicio rápido de Matplotlib:
Figure,Axes,plt.subplots, título y etiquetas. - Referencia de dispersión en un Axes: puntos ubicados mediante coordenadas x-y.
- Referencia de
seaborn.scatterplot:data,x,y,hue,style, leyenda yax. - Relaciones estadísticas en seaborn: cada punto como observación y uso cuidadoso de color, tamaño y marcador.
- Imágenes complejas en W3C WAI: descripción de gráficas y evidencia extensa equivalente.