Lección 43 de 45 · Proyectos y cierre

Proyecto: analizar datos

Analizar datos no empieza con una fórmula. Empieza con una pregunta concreta y con la seguridad de que entiendes qué significa cada fila.

Paso a pasoPregunta → evidenciaAvanza a tu ritmo
Índice · Lección 43/45
Proyecto 2 · trabaja como un pequeño analista

Usaremos una colección de ventas para responder preguntas. La meta no es producir muchas métricas: es aprender un proceso que puedas repetir con cualquier conjunto pequeño de datos.

El recorrido será: mirar → limpiar → preguntar → calcular → comprobar → explicar.

Evidencia de aprendizaje

Responder una pregunta completa filtrando, agregando y agrupando un conjunto pequeño de datos.

Antes del cálculo, entiende qué representa una fila

Una lista de diccionarios se parece a una tabla: cada diccionario es una fila y cada clave funciona como una columna. Empieza inspeccionando una fila real, no imaginando qué debería contener.

Datos del proyecto
ventas = [
    {"producto": "Cuaderno", "categoria": "Papelería", "importe": 12.5},
    {"producto": "Bolígrafo", "categoria": "Papelería", "importe": 3.0},
    {"producto": "Cable", "categoria": "Tecnología", "importe": 9.5},
]

print(len(ventas))
print(ventas[0])

Antes de sumar nada, ya puedes responder: hay tres registros; importe es numérico; categoria contiene texto. Esa inspección evita muchos errores silenciosos.

Limpia únicamente lo que impide responder la pregunta

En datos reales puede aparecer un importe como texto, un campo vacío o una fila incompleta. “Limpiar” no significa transformar todo por costumbre. Significa corregir aquello que bloquea o invalida el análisis que quieres hacer.

Una conversión explícita y visible
fila = {"producto": "Agenda", "importe": "8.50"}

importe = float(fila["importe"])
print(importe + 1.5)

Resultado plausible ≠ resultado correcto. Si mezclas euros y céntimos, o números y textos, el programa puede fallar; peor aún, a veces puede producir un número que parece razonable. Comprueba unidades y tipos antes de interpretar.

Traduce cada pregunta a una operación concreta

Muchos análisis pequeños se reducen a tres movimientos. Reconocer cuál necesitas evita escribir código a ciegas.

  • Filtrar: ¿qué filas cumplen una condición?
  • Agregar: ¿cuánto suman, cuántas hay o cuál es el promedio?
  • Agrupar: ¿quiero el cálculo separado por categoría?
Pregunta: ¿cuánto vende Papelería?
ventas = [
    {"categoria": "Papelería", "importe": 12.5},
    {"categoria": "Papelería", "importe": 3.0},
    {"categoria": "Tecnología", "importe": 9.5},
]

papeleria = [v for v in ventas if v["categoria"] == "Papelería"]
total = sum(v["importe"] for v in papeleria)
print(total)

Primero seleccionamos las filas relevantes; después resumimos el campo numérico. Mantener esos pasos separados hace que sea fácil comprobar dónde aparece un resultado extraño.

Agrupar significa mantener varios totales a la vez

Cuando la pregunta cambia a “¿cuánto vende cada categoría?”, ya no basta con un único acumulador. Necesitamos un diccionario donde cada categoría tenga su propio total.

Un acumulador por grupo
ventas = [
    {"categoria": "A", "importe": 10},
    {"categoria": "B", "importe": 7},
    {"categoria": "A", "importe": 5},
]

totales = {}
for venta in ventas:
    categoria = venta["categoria"]
    totales[categoria] = totales.get(categoria, 0) + venta["importe"]

print(totales)

get(categoria, 0) significa: “dame el total anterior; si todavía no existe, empieza en cero”. Esa única idea aparece en muchos análisis de frecuencia y agrupación.

Responde una pregunta completa en tres checkpoints

Pregunta del proyecto: ¿cuánto vendió cada categoría y cuál vendió más?

Checkpoint 1 · filtrar

Quédate solo con las ventas de libros.

Salida esperada
2
datos_1.py
La salida aparecerá aquí.

Necesito una pista
  • Compara venta["categoria"] con "libros".
Ver una solución razonada
ventas = [
    {"categoria": "libros", "importe": 15},
    {"categoria": "juegos", "importe": 20},
    {"categoria": "libros", "importe": 10},
]
seleccionadas = [venta for venta in ventas if venta["categoria"] == "libros"]
print(len(seleccionadas))

Checkpoint 2 · agregar

Suma los importes de las ventas de libros. Con tres filas puedes comprobarlo a mano: 15 + 10 = 25.

Salida esperada
25
datos_2.py
La salida aparecerá aquí.

Necesito una pista
  • Suma v["importe"] para cada venta de libros.
Ver una solución razonada
ventas = [
    {"categoria": "libros", "importe": 15},
    {"categoria": "juegos", "importe": 20},
    {"categoria": "libros", "importe": 10},
]
libros = [v for v in ventas if v["categoria"] == "libros"]
total = sum(v["importe"] for v in libros)
print(total)

Checkpoint 3 · agrupar

Acumula un total por categoría y decide cuál tiene mayor importe.

Salida esperada
{'libros': 25, 'juegos': 20}
libros
datos_3.py
La salida aparecerá aquí.

Necesito una pista
  • Usa totales.get(categoria, 0) para partir de cero.
  • Suma el importe de la venta actual al total de esa categoría.
Ver una solución razonada
ventas = [
    {"categoria": "libros", "importe": 15},
    {"categoria": "juegos", "importe": 20},
    {"categoria": "libros", "importe": 10},
]
totales = {}
for venta in ventas:
    categoria = venta["categoria"]
    totales[categoria] = totales.get(categoria, 0) + venta["importe"]

print(totales)
print(max(totales, key=totales.get))
La frase final importa

“En este conjunto, libros suma 25 y juegos 20; libros es la categoría con mayor importe.” Un análisis termina cuando puedes explicar qué significa el número, no cuando consigues imprimirlo.

Un número sin contexto todavía no cuenta una historia

Imagina que el promedio de ventas es 40 €. ¿Es mucho o poco? Falta saber cuántas filas hay, de qué periodo son, si existen valores extremos y qué representa exactamente “venta”. Por eso un análisis termina explicando el resultado, no simplemente imprimiéndolo.

Comprobación mínima antes de confiar: revisa el número de registros, calcula un caso pequeño a mano y prueba también un conjunto vacío si tu función puede recibirlo.

Proyecto completado cuando…

puedes formular una pregunta sobre una lista de registros, identificar si necesitas filtrar/agregar/agrupar, obtener el resultado y explicar en una frase qué significa.