Saltar al contenido
Volver al inicio 100 Días de Código en Python — Día 100: Proyecto de portafolio — Análisis responsable de datos sensibles: Fatal Force

100 Días de Código en Python — Día 100: Proyecto de portafolio — Análisis responsable de datos sensibles: Fatal Force

Nivel: Grado décimo Área: Tecnología e Informática Modalidad: Tutorial práctico Fuente: Curso "100 Days of Code: The Complete Python Pro Bootcamp" (Angela Yu, App Brewery). Contenido del Día 100, proyecto de portafolio profesional (categoría Data Science).

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 cuaderno Fatal_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.csv y Share_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_rate y percent_completed_hs son texto con guiones ("-") en 201 y 197 filas; Median Income incluye "(X)", "-", "250,000+" y "2,500-"; los porcentajes de raza tienen "(X)" en 20 filas. Las fechas de Deaths_by_Police_US.csv están en formato día/mes/año y van del 2 de enero de 2015 al 31 de julio de 2017; se comprobó que pd.to_datetime sin formato interpreta 02/01/15 como 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

  1. Antes de empezar: trabajar con datos que son personas
  2. La tarea: Fatal Force
  3. 📖 Cinco errores de interpretación que debes evitar
  4. 📖 Exploración y limpieza de los cinco archivos
  5. 📝 Las preguntas del cuaderno, con pistas, valores de control y advertencias
  6. 🚀 Proyecto del día: construcción por etapas
  7. 🌟 Proyecto extra: un tema social de tu región con datos abiertos
  8. 🏗️ Mi Portafolio Profesional — Etapa final
  9. 🏆 Proyecto integrador final del curso
  10. 🧩 Comprueba lo aprendido
  11. 🤖 Programar con apoyo de IA
  12. 🛠️ Observaciones sobre el material original
  13. 📋 Matriz de trazabilidad
  14. 📦 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, groupby y merge (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

Python
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)

Python
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 2015

Sin 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

  1. Limpieza documentada de los 5 archivos (qué, por qué, cuántas filas afectó).
  2. Las preguntas de la sección 5 respondidas con la plantilla del Día 99: qué muestra, limitaciones, hipótesis marcadas como tales.
  3. Ningún nombre de persona en gráficos ni tablas.
  4. 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

  1. 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)

Python
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

Python
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

  1. Dos conjuntos de datos oficiales unidos por municipio o año (merge).
  2. Aplicar la tabla de errores de interpretación de la sección 3 a cada conclusión.
  3. Tasas en lugar de conteos cuando se comparen lugares de distinto tamaño.
  4. 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):

  1. Repositorio del Día 100 con el cuaderno ejecutado, el ensayo final y un README.md que incluya la sección "Consideraciones éticas".
  2. 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.
  3. 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.
  4. Diario de cierre: compara tu DIARIO.md del 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

  1. Usuarios y roles: visitante, estudiante, administrador (docente), con contraseñas con hash.
  2. 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.
  3. Una automatización programada (recordatorios semanales, importación de datos, copia de seguridad).
  4. Un tablero de datos con al menos 3 gráficos y conclusiones responsables (sección 3).
  5. Una integración con una API pública, con caché y manejo de errores (Día 96).
  6. 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

  1. ¿Por qué comparar conteos entre estados sin considerar la población lleva a conclusiones erróneas?
  2. Explica con un ejemplo propio la diferencia entre correlación y causalidad.
  3. ¿Qué es la falacia ecológica?
  4. ¿Por qué errors="coerce" es más honesto que fillna(0) en este proyecto?

Análisis de código

Python
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, merge con nombres de columna distintos, conteos sin población, correlación tomada como causa, años incompletos.