Este tutorial adapta pedagógicamente el Día 100. Las secciones 📝 Contenido original del curso provienen de los archivos de la carpeta:
dia100-tarea19.md(enunciado y reflexión, en inglés; aquí traducido), el cuadernoFatal_Force_(start).ipynb(introducción, carga de datos y preguntas del análisis, con las celdas de código vacías) y cinco archivos CSV (Deaths_by_Police_US.csv,Median_Household_Income_2015.csv,Pct_Over_25_Completed_High_School.csv,Pct_People_Below_Poverty_Level.csvyShare_of_Race_By_City.csv). El curso no ofrece solución y este tutorial no la entrega. Todo lo que no está en esos archivos (marco ético para datos sensibles, limpieza verificada, valores de control, errores de interpretación, retos 🟢🟡🟠🔴, proyecto extra, la etapa final de Mi Portafolio Profesional y el 🏆 Proyecto integrador final del curso) es creación de esta adaptación.
Nota sobre las verificaciones: el 28 de septiembre de 2026, con Python 3.14 y pandas 3.0.6, se ejecutó la limpieza de la sección 4 sobre los cinco CSV: se leyeron con
encoding="windows-1252"como indica el cuaderno;poverty_rateypercent_completed_hsson texto con guiones ("-") en 201 y 197 filas;Median Incomeincluye"(X)","-","250,000+"y"2,500-"; los porcentajes de raza tienen"(X)"en 20 filas. Las fechas deDeaths_by_Police_US.csvestán en formato día/mes/año y van del 2 de enero de 2015 al 31 de julio de 2017; se comprobó quepd.to_datetimesin formato interpreta02/01/15como 1 de febrero, sin error. Los valores de control de la sección 5 se calcularon con esa limpieza.
⚠️ Aviso de contenido: este proyecto analiza muertes de personas reales causadas por la policía en Estados Unidos. Es un tema doloroso y políticamente sensible. La sección 1 incluye orientaciones para el docente y para el trabajo en clase.
Tabla de contenidos
- Antes de empezar: trabajar con datos que son personas
- La tarea: Fatal Force
- 📖 Cinco errores de interpretación que debes evitar
- 📖 Exploración y limpieza de los cinco archivos
- 📝 Las preguntas del cuaderno, con pistas, valores de control y advertencias
- 🚀 Proyecto del día: construcción por etapas
- 🌟 Proyecto extra: un tema social de tu región con datos abiertos
- 🏗️ Mi Portafolio Profesional — Etapa final
- 🏆 Proyecto integrador final del curso
- 🧩 Comprueba lo aprendido
- 🤖 Programar con apoyo de IA
- 🛠️ Observaciones sobre el material original
- 📋 Matriz de trazabilidad
- 📦 Evidencias de aprendizaje del Día 100
1. Antes de empezar: trabajar con datos que son personas
(Sección creada para esta adaptación.)
Cada fila de Deaths_by_Police_US.csv es una persona que murió, con su nombre, edad y ciudad. Analizar estos datos es valioso (la sociedad necesita entender este problema), pero exige cuidado.
Principios para este proyecto
| Principio | En la práctica |
|---|---|
| Respeto | Trabaja con agregados (conteos, porcentajes). No muestres, ordenes ni comentes nombres de personas. No hagas bromas ni gráficos sensacionalistas. |
| Honestidad | Di qué pueden y qué no pueden mostrar los datos (sección 3). No elijas el gráfico que "confirma" lo que ya pensabas. |
| Contexto | Estos datos son de EE. UU., 2015–2017, recopilados por un periódico. No representan a otros países ni a otros años. |
| Lenguaje cuidadoso | "Personas con signos de enfermedad mental", no etiquetas despectivas. Usa las categorías de los datos explicando su significado. |
| Cuidado personal | Si el tema te afecta, está bien pausar y hablar con tu docente u orientación escolar. |
🏫 Para el docente: se recomienda presentar el tema con una conversación previa, acordar normas de respeto y ofrecer una alternativa equivalente (por ejemplo, el proyecto extra de la sección 7 con datos sociales de la región) a quien lo necesite. El objetivo pedagógico es el análisis crítico y responsable, no el tema en sí.
2. La tarea: Fatal Force
(Fuente: dia100-tarea19.md y la introducción de Fatal_Force_(start).ipynb)
📝 Contenido original del curso
Hoy harás un análisis profundo sobre un tema increíblemente sensible y políticamente cargado. Desde el 1 de enero de 2015, The Washington Post ha recopilado una base de datos de cada muerte por disparo causada por un policía en servicio en EE. UU. Analizarás este conjunto de datos junto con datos del censo de EE. UU. sobre tasa de pobreza, tasa de graduación de bachillerato, ingreso medio de los hogares y composición racial. Así entenderemos mejor las tendencias sociales y lo que ocurre con el uso de fuerza letal por la policía en Estados Unidos.
El cuaderno añade: aunque hay muchos desafíos en la recolección y el reporte de estos datos, el Post registra más de una docena de detalles de cada caso: raza, edad y género de la persona, si estaba armada y si atravesaba una crisis de salud mental. Obtuvo esa información de sitios web de las autoridades, noticias locales, redes sociales y bases de datos independientes ("Killed by police", "Fatal Encounters"), y en muchos casos hizo reportería adicional. Hay 4 conjuntos de datos adicionales del censo.
El cuaderno instala/actualiza plotly (en Colab), importa numpy, pandas, plotly express, matplotlib, seaborn y collections.Counter, configura el formato de números y carga los 5 CSV con encoding="windows-1252". Al final (Epílogo) invita a leer el análisis del Washington Post después de hacer el propio.
Pregunta de la tarea: cómo abordaste el proyecto; qué fue difícil y qué fácil; cómo mejorarías; tu mayor aprendizaje; qué harías distinto.
Prerequisitos: todo el bloque de ciencia de datos (Días 72–81), en especial limpieza,
groupbyymerge(Día 74), fechas (Día 75), plotly (Días 76 y 79), seaborn y regresión (Día 78) y distribuciones (Día 80); el Día 99.
3. 📖 Cinco errores de interpretación que debes evitar
(Sección creada para esta adaptación.)
En un tema sensible, un error de análisis no es solo una nota baja: puede difundir una idea falsa sobre grupos de personas.
| # | Error | Ejemplo en este proyecto | Cómo evitarlo |
|---|---|---|---|
| 1 | Contar sin comparar con la población | "California tiene más casos: es el estado más peligroso" | California es el estado más poblado. Compara tasas (casos por cada millón de habitantes). Los datos del curso no incluyen la población por estado: si quieres tasas, necesitas otra fuente oficial (y citarla). |
| 2 | Correlación no es causalidad | "La pobreza y la graduación se relacionan, así que una causa la otra" | Una correlación muestra que dos cosas varían juntas, no por qué. |
| 3 | Falacia ecológica | Concluir sobre personas a partir de promedios de ciudades o estados | Los datos del censo son por ciudad: hablan de lugares, no de individuos. |
| 4 | Datos faltantes ocultos | 195 casos sin raza registrada; 77 sin edad | Reporta cuántos faltan y cómo los trataste. |
| 5 | Rellenar con cero | El cuaderno sugiere "quizá sustituir por 0" los faltantes | En tasas de pobreza, 0 significa "nadie es pobre": un dato inventado. Verificado: cambia el promedio de un estado hasta en 1,17 puntos (sección 4). |
💡 Promedio de ciudades ≠ tasa del estado: promediar la tasa de pobreza de las ciudades de un estado da el mismo peso a un pueblo de 200 habitantes que a una ciudad de 2 millones. Es una aproximación útil para practicar, pero dilo en tus conclusiones.
4. 📖 Exploración y limpieza de los cinco archivos
(Desarrolla "Preliminary Data Exploration" y "Data Cleaning" del cuaderno. Verificado.)
📝 Preguntas originales del cuaderno
¿Qué forma tienen los DataFrames? ¿Cuántas filas y columnas? ¿Nombres de columnas? ¿Hay NaN o duplicados? Considera cómo tratar los NaN; "quizá sustituir por 0 sea apropiado".
Lo que encontrarás (verificado)
| Archivo | Forma | Problemas |
|---|---|---|
Deaths_by_Police_US.csv |
2535 × 14 | Fechas día/mes/año como texto; faltantes en race (195), age (77), flee (65), armed (9); contiene nombres |
Pct_People_Below_Poverty_Level.csv |
29 329 × 3 | poverty_rate es texto; "-" en 201 filas |
Pct_Over_25_Completed_High_School.csv |
29 329 × 3 | percent_completed_hs es texto; "-" en 197 filas |
Median_Household_Income_2015.csv |
29 322 × 3 | "(X)" (1113), "-" (740), "250,000+" (24), "2,500-" (9) y 51 NaN |
Share_of_Race_By_City.csv |
29 268 × 7 | "(X)" en 20 filas; la columna se llama Geographic area (con minúscula), distinta de los demás archivos |
Ninguno tiene filas duplicadas.
🔎 Ejemplo explicado
pobreza["poverty_rate"] = pd.to_numeric(pobreza["poverty_rate"], errors="coerce")errors="coerce" convierte "-" en NaN (dato faltante), que pandas ignora al calcular promedios. Es la opción honesta: "no sabemos", en vez de "es cero".
Tu turno: limpia Median Income. ¿Qué haces con "250,000+" (significa "250 000 o más") y con "2,500-" ("2500 o menos")? Decide, justifica y cuenta cuántas filas afecta.
🐞 La trampa de las fechas (verificada)
pd.to_datetime(muertes["date"]) # ❌ "02/01/15" → 1 de febrero de 2015
pd.to_datetime(muertes["date"], format="%d/%m/%y") # ✅ "02/01/15" → 2 de enero de 2015Sin formato, pandas supone mes/día (estilo estadounidense) cuando puede, y no avisa del error en esas filas (solo un aviso general de que no pudo inferir el formato). Cuando el día es mayor que 12 (14/12/15) sí lo lee bien. Resultado: fechas mezcladas sin ningún error visible. Comprueba siempre el rango: con el formato correcto va de 2015-01-02 a 2017-07-31.
⚠️ Errores frecuentes
| Error | Qué ocurre | Solución |
|---|---|---|
UnicodeDecodeError al leer |
Los archivos no están en UTF-8 | encoding="windows-1252" (como el cuaderno) |
.mean() sobre una columna de texto |
TypeError |
Convierte con pd.to_numeric |
fillna(0) en porcentajes |
Promedios falsos | Deja NaN y reporta cuántos faltan |
merge por estado que devuelve 0 filas |
Nombres de columna distintos (Geographic Area vs Geographic area) |
Renombra antes de unir |
| Fechas sin formato | Días y meses intercambiados | format="%d/%m/%y" |
5. 📝 Las preguntas del cuaderno, con pistas, valores de control y advertencias
(Las preguntas son originales del cuaderno, traducidas; las pistas, valores de control y advertencias son de esta adaptación.)
| # | Pregunta del cuaderno | Pista | Valor de control | ⚠️ Advertencia de interpretación |
|---|---|---|---|---|
| 1 | Tasa de pobreza por estado, de mayor a menor (¿cuál la más alta y la más baja?) | groupby("Geographic Area") y mean |
Promedio de ciudades: MS 26,88 (más alta), NJ 8,19 (más baja); 51 "estados" (incluye DC) | Es un promedio de ciudades, no la tasa oficial del estado |
| 2 | Tasa de graduación de bachillerato por estado, ascendente | Igual que la anterior | TX 75,69 (más baja); MA 92,40 (más alta) | Ídem |
| 3 | Relación entre pobreza y graduación: gráfico de líneas con dos ejes y | ax.twinx() (Día 75) |
— | Dos ejes pueden exagerar o esconder relaciones según la escala |
| 4 | La misma relación con sns.jointplot (KDE y/o dispersión) |
merge de las dos tablas por estado |
— | — |
| 5 | Regresión lineal con lmplot o regplot |
Día 78 | — | Correlación ≠ causalidad (error 2) |
| 6 | Barras con subsecciones: composición racial de cada estado | Promedio de share_* por estado; barras apiladas |
— | Promedio de ciudades (falacia ecológica) |
| 7 | Gráfico de dona de personas muertas por raza | value_counts() |
W 1201, B 618, H 423, sin dato 195 | Sin comparar con la población no se puede hablar de desproporción (error 1) |
| 8 | Total de muertes de hombres y mujeres | gender |
2428 hombres, 107 mujeres | — |
| 9 | Diagrama de caja: edad y forma de muerte, por género | px.box |
— | — |
| 10 | ¿Estaban armados? Porcentaje y tipos de arma; armas de fuego frente a desarmados | armed |
gun 1398 (55,15 %), unarmed 171 (6,75 %) |
Hay categorías ambiguas (undetermined, toy weapon): explica cómo las agrupas |
| 11 | Porcentaje de personas menores de 25 años | Decide si el denominador incluye las edades faltantes | 18,31 % (sin contar las 77 edades faltantes) | Di qué denominador usaste |
| 12 | Histograma y KDE de las edades | sns.histplot(kde=True) |
— | — |
| 13 | Un KDE por raza (¿difieren las distribuciones?) | hue="race" |
— | Grupos pequeños (A 39, N 31, O 28) dan curvas poco confiables |
| 14 | Total de personas muertas por raza | Barras | Igual que la 7 | Igual que la 7 |
| 15 | Porcentaje con enfermedad mental diagnosticada | signs_of_mental_illness |
24,97 % | La columna registra signos observados, no un diagnóstico: no es lo mismo |
| 16 | Top 10 de ciudades con más casos ("¿cuáles son las más peligrosas?") | value_counts().head(10) |
Los Angeles 39, Phoenix 31, Houston 27 | Más casos ≠ más peligrosa: faltan las poblaciones (error 1) |
| 17 | Tasa de muerte por raza en esas 10 ciudades, comparando con su composición | merge con Share_of_Race_By_City |
— | Los nombres de ciudades difieren entre archivos ("Los Angeles" vs "Los Angeles city"): requiere limpieza cuidadosa |
| 18 | Mapa coroplético por estado; compáralo con la pobreza | px.choropleth(locationmode="USA-states") |
CA 424, TX 225, FL 154 | Conteos, no tasas |
| 19 | Número de casos en el tiempo: ¿hay tendencia? | Remuestreo mensual (Día 75) | 2015: 991; 2016: 963; 2017: 581 | 2017 solo llega a julio: no hay "descenso" real |
| 20 | Epílogo: leer el análisis del Washington Post | — | — | Compara tus conclusiones con las de periodistas especializados |
6. 🚀 Proyecto del día: construcción por etapas
(Desarrolla la tarea dia100-tarea19.md y el cuaderno. Las etapas son una propuesta de esta adaptación.)
Problema
Analizar de forma rigurosa y responsable un conjunto de datos sensible, combinándolo con datos socioeconómicos.
Contexto
Un análisis de datos puede informar debates públicos… o desinformar. Tu cuaderno será evaluado tanto por su técnica como por su responsabilidad.
Objetivo
El cuaderno completo, con cada pregunta respondida (tabla, gráfico, conclusión, limitaciones) y un ensayo final sobre lo que los datos muestran y no muestran.
Requisitos funcionales
- Limpieza documentada de los 5 archivos (qué, por qué, cuántas filas afectó).
- Las preguntas de la sección 5 respondidas con la plantilla del Día 99: qué muestra, limitaciones, hipótesis marcadas como tales.
- Ningún nombre de persona en gráficos ni tablas.
- Un ensayo final de 1 página comparando tus conclusiones con las del Washington Post (epílogo).
Restricciones técnicas
- No rellenar faltantes con 0 sin justificarlo.
- Fechas con formato explícito.
- En cada gráfico de conteos, una nota sobre si se compara o no con la población.
Planificación
- Leer la sección 1 y conversar en clase. 2. Explorar. 3. Limpiar. 4. Responder por bloques. 5. Revisar valores de control. 6. Revisar la tabla de errores de interpretación en cada conclusión. 7. Revisión por un compañero centrada en la responsabilidad. 8. Ensayo final. 9. Corregir. 10. Publicar (sin datos personales).
Construcción por etapas
- Etapa 1 — Exploración y limpieza de los 5 archivos.
- Etapa 2 — Contexto socioeconómico (preguntas 1 a 6).
- Etapa 3 — Perfil de los casos (7 a 15).
- Etapa 4 — Geografía y tiempo (16 a 19).
- Etapa final — Epílogo y ensayo.
Pruebas (comprobaciones del análisis)
assert muertes["fecha"].min() == pd.Timestamp("2015-01-02")
assert muertes["fecha"].max() == pd.Timestamp("2017-07-31")
assert pobreza["poverty_rate"].isna().sum() == 201
assert (muertes["gender"] == "M").sum() == 2428🧪 Prueba y depuración
pobreza["poverty_rate"] = pobreza["poverty_rate"].replace("-", 0).astype(float)
muertes["fecha"] = pd.to_datetime(muertes["date"])
por_estado = pobreza.merge(raza, on="Geographic Area")
print(muertes.sort_values("age").head(10)[["name", "age", "city"]])Encuentra cuatro problemas: los guiones se convierten en 0 (dato inventado); las fechas sin formato se leen mal; el merge falla porque en raza la columna se llama Geographic area; y se imprimen nombres de personas (innecesario e irrespetuoso para el análisis). Además, unir por estado sin agrupar primero multiplica filas (cada ciudad con cada ciudad).
⭐ Extensión del proyecto
- 🟢 Reto 1 — Aplicación: gráfico de la columna
body_camera: ¿en qué porcentaje de casos había cámara corporal? ¿Cambió con los años? - 🟡 Reto 2 — Ampliación: con la población por estado de una fuente oficial (la Oficina del Censo de EE. UU.), calcula tasas por millón y compara el mapa de tasas con el de conteos. ¿Cambia el "estado más peligroso"?
- 🟠 Reto 3 — Desafío: repite la pregunta 7 con tasas por raza usando la composición de la población nacional (fuente oficial). Escribe con cuidado qué muestra y qué no.
- 🔴 Reto 4 — Pensamiento computacional: diseña un tablero (Días 76 y 96) que presente estos datos de forma responsable: qué gráficos incluirías, qué advertencias, qué no mostrarías y por qué. Pide a 3 personas que lo usen y anota qué conclusiones sacan: ¿son las correctas?
7. 🌟 Proyecto extra: un tema social de tu región con datos abiertos
(Proyecto creado para esta adaptación; no existe en el curso original. Sirve también como alternativa para quien no desee trabajar el tema original.)
Situación
Elige un tema social de tu municipio o departamento con datos en datos.gov.co o en entidades oficiales (por ejemplo, deserción escolar, cobertura de internet en colegios, calidad del agua, accidentes de tránsito) y combínalo con un indicador socioeconómico, como hizo el curso.
Requisitos
- Dos conjuntos de datos oficiales unidos por municipio o año (
merge). - Aplicar la tabla de errores de interpretación de la sección 3 a cada conclusión.
- Tasas en lugar de conteos cuando se comparen lugares de distinto tamaño.
- Un informe de 1 página para el consejo estudiantil o la junta de acción comunal.
Decisiones que debes tomar (y justificar)
- ¿Qué población usas como denominador de tus tasas y de qué año?
- ¿Qué recomendación harías con los datos y cuál no te permiten hacer?
Casos de prueba
- Cada gráfico cita fuente y fecha de consulta.
- Ninguna fila con datos personales llega al informe.
8. 🏗️ Mi Portafolio Profesional — Etapa final
(Proyecto integrador creado para esta adaptación; etapas anteriores en los Días 82 a 99.)
Etapa final (hoy):
- Repositorio del Día 100 con el cuaderno ejecutado, el ensayo final y un
README.mdque incluya la sección "Consideraciones éticas". - Cierre del portafolio: revisa tus 19 proyectos (Días 82 a 100) con la rúbrica del Día 83 y elige los 6 mejores para destacar en tu sitio.
- Actualiza tu sitio: página de inicio con los 6 destacados; página "Todos los proyectos" generada desde
proyectos.json; sección "Sobre mí" con lo que aprendiste en los 100 días. - Diario de cierre: compara tu
DIARIO.mddel Día 82 con el del Día 100. ¿Qué cambió en tu forma de enfrentar un proyecto sin guía?
9. 🏆 Proyecto integrador final del curso
(Proyecto creado para esta adaptación; no existe en el curso original. Integra los contenidos de los 100 días.)
Situación problema
En muchos colegios, la información útil para la comunidad está dispersa: horarios en un PDF, actividades en mensajes de chat, datos de la biblioteca en una hoja de cálculo, el menú del restaurante escolar en una cartelera. Nadie la encuentra cuando la necesita.
Contexto
Tu colegio (real o ficticio) necesita una plataforma de información escolar construida por estudiantes, con datos organizados, un sitio web, automatizaciones y análisis que ayuden a tomar decisiones.
Pregunta orientadora
¿Cómo podemos usar la programación para que la información de nuestra comunidad escolar sea más accesible, útil y segura?
Objetivo
Diseñar, construir, probar y presentar, en equipos de 3 o 4 personas, una plataforma que integre al menos seis de los grandes bloques del curso.
Bloques del curso que puede integrar
| Bloque (días) | Posible uso en la plataforma |
|---|---|
| Fundamentos de Python (1–14) | Lógica de negocio, validaciones, funciones probadas |
| Programación orientada a objetos (16–23) | Modelos: Actividad, Libro, Usuario |
| Archivos, CSV, JSON y excepciones (24–31) | Importar datos existentes; configuración |
| APIs y automatización con correo y fechas (32–40) | Clima para eventos al aire libre; recordatorios |
| HTML, CSS y Bootstrap (41–44, 58) | Interfaz accesible y adaptable |
| Web scraping y automatización (45–53, 93–94, 98) | Importar información pública del colegio (con permiso) |
| Flask, formularios, bases de datos y autenticación (54–69, 88–89, 97) | El sitio, el CRUD y los roles |
| Git, GitHub y despliegue (70–71) | Trabajo en equipo y publicación |
| Ciencia de datos (72–81, 99–100) | Tablero de uso de la biblioteca, asistencia a eventos |
| GUI de escritorio (27–31, 85–86, 90) | Una herramienta de administración sin conexión |
Requerimientos
- Usuarios y roles: visitante, estudiante, administrador (docente), con contraseñas con hash.
- Al menos tres módulos, por ejemplo: calendario de actividades (con estados, como el Kanban del Día 89), catálogo de la biblioteca con préstamos, menú semanal, directorio de clubes.
- Una automatización programada (recordatorios semanales, importación de datos, copia de seguridad).
- Un tablero de datos con al menos 3 gráficos y conclusiones responsables (sección 3).
- Una integración con una API pública, con caché y manejo de errores (Día 96).
- Accesibilidad y privacidad: cumplir las tablas de privacidad y de accesibilidad del Día 83; solo datos ficticios o autorizados.
Restricciones
- Python y Flask como base; librerías adicionales justificadas.
- Código en GitHub con ramas y pull requests revisados por otro integrante.
- Nada de claves ni datos personales reales en el repositorio.
- Pruebas automáticas para la lógica y las rutas principales.
Etapas de desarrollo
| Etapa | Duración sugerida | Producto |
|---|---|---|
| 1. Descubrimiento | 1 semana | Entrevistas a 5 miembros de la comunidad; lista de problemas priorizados |
| 2. Diseño | 1 semana | Especificación, modelo de datos, bocetos, lista de tareas en un tablero Kanban |
| 3. Núcleo | 2 semanas | Usuarios, roles y primer módulo con pruebas |
| 4. Módulos | 2 semanas | Resto de módulos, API y automatización |
| 5. Datos | 1 semana | Tablero de análisis con conclusiones |
| 6. Calidad | 1 semana | Pruebas, accesibilidad, seguridad, pruebas con usuarios reales |
| 7. Presentación | — | Demostración y reflexión |
Entregables
- Repositorio con
README.md(instalación, uso, arquitectura, decisiones, "Uso de IA", consideraciones éticas). - Diagrama de arquitectura y modelo de datos.
- Informe de pruebas (automáticas y con usuarios).
- Tablero de datos con conclusiones.
- Demostración en vivo de 10 minutos y un video de respaldo.
- Diario de equipo y reflexión individual (qué aportó cada integrante).
Casos de prueba mínimos
| # | Caso | Resultado esperado |
|---|---|---|
| 1 | Un visitante intenta crear una actividad | Redirección al login o 403 |
| 2 | Un estudiante intenta borrar la actividad de otro | 403 |
| 3 | La API externa no responde | La página funciona con un mensaje o con datos en caché |
| 4 | La automatización se ejecuta dos veces | No duplica datos (idempotencia) |
| 5 | Un formulario recibe datos inválidos o con <script> |
Se rechazan o se muestran escapados |
| 6 | Navegación solo con teclado | Todas las funciones principales son accesibles |
| 7 | Búsqueda en el repositorio de "password", "key", "secret" | Solo aparecen en .env.example sin valores reales |
Criterios técnicos de funcionamiento
| Criterio | Nivel básico | Nivel alto |
|---|---|---|
| Funcionalidad | Los módulos funcionan en el flujo principal | Casos límite resueltos; mensajes de error útiles |
| Código | Organizado en archivos y funciones | Modular, sin repetición, con nombres claros y documentación |
| Datos | Base de datos con relaciones correctas | Validación en el servidor, integridad, respaldo |
| Seguridad y privacidad | Contraseñas con hash; sin claves en el código | Roles bien probados; CSRF; datos mínimos; revisión de seguridad documentada |
| Pruebas | Algunas pruebas automáticas | Pruebas de lógica, rutas y permisos, más pruebas con usuarios |
| Análisis de datos | Gráficos correctos | Conclusiones responsables con limitaciones explícitas |
| Trabajo en equipo | Todos aportan commits | Ramas, pull requests con revisión y tablero de tareas al día |
Posibles extensiones
- Notificaciones por correo institucional (con autorización).
- Versión adaptada a celular o una aplicación de escritorio para el administrador.
- Modo sin conexión para la biblioteca.
- Publicación real para la comunidad, con autorización de las directivas.
Este proyecto admite muchas soluciones distintas: dos equipos pueden priorizar problemas diferentes y construir plataformas muy diferentes, ambas excelentes.
10. 🧩 Comprueba lo aprendido
Conceptuales
- ¿Por qué comparar conteos entre estados sin considerar la población lleva a conclusiones erróneas?
- Explica con un ejemplo propio la diferencia entre correlación y causalidad.
- ¿Qué es la falacia ecológica?
- ¿Por qué
errors="coerce"es más honesto quefillna(0)en este proyecto?
Análisis de código
pd.to_datetime(pd.Series(["02/01/15", "14/12/15"]), format="mixed")Verificado: devuelve 1 de febrero de 2015 y 14 de diciembre de 2015. ¿Por qué la primera fecha está mal y la segunda bien?
Predicción
Si 77 personas no tienen edad registrada, ¿el porcentaje de menores de 25 años es mayor o menor si divides entre todas las filas en lugar de solo las que tienen edad? Compruébalo (los dos valores verificados son 17,75 % y 18,31 %).
Depuración
"Mi gráfico por año muestra que los casos bajaron casi a la mitad en 2017." ¿Qué está pasando?
Modificación
Cambia el análisis de la pregunta 16 para mostrar, junto a cada ciudad, cuántos casos hubo por año.
Creación
Escribe resumen_faltantes(df) que devuelva, para cada columna, cuántos valores faltan y qué porcentaje representan, ordenado de mayor a menor. Aplícala a los 5 archivos.
11. 🤖 Programar con apoyo de IA
Ciclo de trabajo: formula el problema → inténtalo tú primero → consulta a la IA sobre un punto concreto → lee y entiende → prueba → compara con la documentación oficial → modifica → explica con tus palabras.
Actividad 1 — Interpretaciones con cuidado. Pega una tabla de conteos por raza y pide a una IA que la interprete. Revisa su respuesta con la tabla de errores de la sección 3: ¿comparó con la población? ¿habló de causas? Corrige lo necesario.
Actividad 2 — Verificar la limpieza. Pide a una IA código para convertir las fechas. Comprueba con el rango esperado (2015-01-02 a 2017-07-31) si lo hizo bien.
Actividad 3 — Fuentes. Si usas población por estado para los retos 2 y 3, no tomes las cifras de una IA: descárgalas de la fuente oficial y cítala.
Actividad 4 — Reflexión final del curso. Escribe (sin IA) una página sobre cómo cambió tu forma de usar la IA entre el Día 82 y el Día 100. Luego, si quieres, pide a una IA retroalimentación sobre claridad, no sobre contenido.
Declara el uso: sección "Uso de IA" en el README.md.
12. 🛠️ Observaciones sobre el material original
| Archivo | Observación | Tratamiento |
|---|---|---|
Fatal_Force_(start).ipynb |
Sugiere que "quizá sustituir por 0" los NaN sea apropiado | Se desaconseja para porcentajes (verificado: sesga promedios hasta 1,17 puntos) |
Fatal_Force_(start).ipynb |
Pregunta por las "ciudades más peligrosas" usando conteos | Advertencia sobre tasas (sección 3 y pregunta 16) |
Fatal_Force_(start).ipynb |
Pregunta por el porcentaje "diagnosticado" con enfermedad mental; la columna registra signos | Advertencia en la pregunta 15 |
Fatal_Force_(start).ipynb |
El enlace a la fuente del censo (factfinder.census.gov) corresponde a un servicio que la Oficina del Censo de EE. UU. retiró | Buscar la fuente actual en el sitio oficial de la Oficina del Censo |
Deaths_by_Police_US.csv |
Fechas día/mes/año; pd.to_datetime sin formato las lee mal sin error |
Sección 4 (verificado) |
Deaths_by_Police_US.csv |
Contiene nombres de personas fallecidas | Principio de respeto: solo agregados (sección 1) |
Deaths_by_Police_US.csv |
Datos hasta julio de 2017; el Post continuó actualizando su base | Advertencia en la pregunta 19; el epílogo remite a su análisis actualizado |
Share_of_Race_By_City.csv |
Columna Geographic area con nombre distinto al de los otros archivos |
Sección 4 (errores frecuentes) |
dia100-tarea19.md |
La pregunta de reflexión no tiene el título "Reflection Time" de los días anteriores | Se trata igual que en los días anteriores |
13. 📋 Matriz de trazabilidad
| Contenido original | Archivo de origen | Concepto desarrollado | Ejercicio original | Reto adicional | Proyecto relacionado |
|---|---|---|---|---|---|
| Tema sensible: muertes por disparos de la policía en EE. UU. (Washington Post) | dia100-tarea19.md, cuaderno |
Secciones 1 y 2 | Análisis Fatal Force | Reto 4 | Secciones 6 y 8 |
| Datos del censo: pobreza, graduación, ingreso, composición racial | dia100-tarea19.md, 4 CSV |
Secciones 3 y 4 | Preguntas 1–6 | Retos 2 y 3 | Etapa 2 |
| Exploración preliminar y limpieza (NaN, "quizá 0") | Cuaderno | Sección 4 | Preguntas de exploración | — | Etapa 1 |
| Pobreza y graduación por estado; dos ejes; jointplot; regresión | Cuaderno | Sección 5 (1–5) | Preguntas 1–5 | — | Etapa 2 |
| Composición racial por estado; dona por raza; hombres y mujeres; edad y forma de muerte | Cuaderno | Sección 5 (6–9, 14) | Preguntas 6–9 y 14 | Reto 3 | Etapa 3 |
| Armados; menores de 25; histograma y KDE por raza; enfermedad mental | Cuaderno | Sección 5 (10–13, 15) | Preguntas 10–13 y 15 | Reto 1 | Etapa 3 |
| Top 10 ciudades; tasa por raza en ciudades; coroplético por estado; tendencia temporal | Cuaderno | Sección 5 (16–19) | Preguntas 16–19 | Reto 2 | Etapa 4 |
| Epílogo: leer el análisis del Washington Post | Cuaderno | Sección 5 (20) | Epílogo | — | Etapa final (ensayo) |
| Reflexión | dia100-tarea19.md |
Sección 6 | Pregunta de reflexión | Actividad 4 de IA | Sección 8 |
| (No existe en el curso original) | — | Ética de datos, errores de interpretación | — | Tema social de tu región | Sección 7 |
| (No existe en el curso original) | — | Integración de los 100 días | — | — | 🏆 Proyecto integrador final (sección 9) |
14. 📦 Evidencias de aprendizaje del Día 100
- El cuaderno ejecutado, con conclusiones y limitaciones en cada pregunta.
- El registro de limpieza de los 5 archivos.
- El ensayo final comparando tus conclusiones con las del Washington Post.
- El portafolio completo actualizado y el diario de cierre (Día 82 frente a Día 100).
- La propuesta del equipo para el 🏆 Proyecto integrador final (etapas 1 y 2).
- Cuaderno de errores: codificación
windows-1252, porcentajes como texto,fillna(0)en tasas, fechas día/mes interpretadas como mes/día,mergecon nombres de columna distintos, conteos sin población, correlación tomada como causa, años incompletos.