#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para generar el documento .docx del taller de ML Semana 2
"""

from docx import Document
from docx.shared import Inches, Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.style import WD_STYLE_TYPE
import os

# Crear documento
doc = Document()

# Configurar estilos
style = doc.styles['Normal']
font = style.font
font.name = 'Arial'
font.size = Pt(11)

# ============================================================================
# PORTADA
# ============================================================================
doc.add_paragraph()
doc.add_paragraph()

title = doc.add_paragraph()
title_run = title.add_run("TALLER: ADQUISICIÓN Y ADECUACIÓN DE BASE DE DATOS")
title_run.bold = True
title_run.font.size = Pt(16)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER

doc.add_paragraph()

subtitle = doc.add_paragraph()
subtitle_run = subtitle.add_run("Machine Learning - Semana 2")
subtitle_run.font.size = Pt(14)
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER

doc.add_paragraph()
doc.add_paragraph()

# Datos del estudiante
info = doc.add_paragraph()
info.alignment = WD_ALIGN_PARAGRAPH.CENTER
info.add_run("Presentado por:\n").bold = True
info.add_run("Alexander Oviedo Fadul\n\n")
info.add_run("Presentado a:\n").bold = True
info.add_run("Docente de Machine Learning\n\n")
info.add_run("Curso:\n").bold = True
info.add_run("NRC-200 Machine Learning\n\n")
info.add_run("Corporación Universitaria Minuto de Dios\n")
info.add_run("Enero 2026")

doc.add_page_break()

# ============================================================================
# PÁGINA 1: INTRODUCCIÓN Y OBJETIVOS
# ============================================================================
doc.add_heading('1. Introducción', level=1)

doc.add_paragraph(
    "El presente documento presenta el análisis de limpieza y adecuación de datos "
    "realizado sobre dos conjuntos de datos del repositorio UCI Machine Learning: "
    "Adult Census Income y Congressional Voting Records. El objetivo principal es "
    "aplicar técnicas de tratamiento de datos que permitan preparar estos datasets "
    "para su uso en modelos de Machine Learning."
)

doc.add_heading('1.1 Objetivo', level=2)

doc.add_paragraph(
    "Aplicar el proceso de adecuación de datos (limpieza) a conjuntos de datos "
    "proporcionados para utilizarlos en modelos de Machine Learning."
)

doc.add_heading('1.2 Datasets Utilizados', level=2)

# Tabla de datasets
table = doc.add_table(rows=3, cols=4)
table.style = 'Table Grid'

# Encabezados
headers = table.rows[0].cells
headers[0].text = 'Dataset'
headers[1].text = 'Registros'
headers[2].text = 'Variables'
headers[3].text = 'Variable Objetivo'

# Dataset 1
row1 = table.rows[1].cells
row1[0].text = 'Adult Census Income'
row1[1].text = '32,561'
row1[2].text = '15'
row1[3].text = 'income (≤50K / >50K)'

# Dataset 2
row2 = table.rows[2].cells
row2[0].text = 'Congressional Voting'
row2[1].text = '435'
row2[2].text = '17'
row2[3].text = 'class (republican/democrat)'

doc.add_paragraph()

# ============================================================================
# PÁGINA 2: ANÁLISIS DATASET ADULT
# ============================================================================
doc.add_heading('2. Análisis del Dataset Adult Census Income', level=1)

doc.add_heading('2.1 Descripción', level=2)
doc.add_paragraph(
    "Este dataset proviene del Censo de EE.UU. de 1994 y contiene información "
    "demográfica y laboral. El objetivo es predecir si una persona gana más o "
    "menos de $50,000 al año."
)

doc.add_heading('2.2 Problemas Identificados', level=2)

# Lista de problemas
problems = doc.add_paragraph()
problems.add_run("• Valores faltantes: ").bold = True
problems.add_run("Se encontraron valores representados con '?' en las columnas "
                 "workclass (1,836), occupation (1,843) y native_country (583).\n")
problems.add_run("• Duplicados: ").bold = True
problems.add_run("Se identificaron 24 registros duplicados.\n")
problems.add_run("• Outliers: ").bold = True
problems.add_run("Las variables capital_gain y capital_loss presentan valores "
                 "extremadamente altos (máximo de 99,999).")

doc.add_heading('2.3 Tratamiento Aplicado', level=2)

treatment = doc.add_paragraph()
treatment.add_run("1. Imputación de valores faltantes: ").bold = True
treatment.add_run("Se utilizó la moda (valor más frecuente) para imputar las "
                  "variables categóricas:\n")
treatment.add_run("   - workclass → 'Private'\n")
treatment.add_run("   - occupation → 'Prof-specialty'\n")
treatment.add_run("   - native_country → 'United-States'\n\n")
treatment.add_run("2. Eliminación de duplicados: ").bold = True
treatment.add_run("Se removieron 24 registros duplicados.\n\n")
treatment.add_run("3. Outliers: ").bold = True
treatment.add_run("Se identificaron pero no se eliminaron, ya que representan "
                  "casos reales de altas ganancias de capital.")

doc.add_heading('2.4 Resultados', level=2)

results = doc.add_paragraph()
results.add_run("• Registros originales: 32,561\n")
results.add_run("• Registros finales: 32,537\n")
results.add_run("• Valores faltantes restantes: 0\n")
results.add_run("• Dataset listo para modelado: Sí")

# ============================================================================
# PÁGINA 3: ANÁLISIS DATASET VOTES
# ============================================================================
doc.add_heading('3. Análisis del Dataset Congressional Voting Records', level=1)

doc.add_heading('3.1 Descripción', level=2)
doc.add_paragraph(
    "Este dataset contiene los votos de los miembros del Congreso de EE.UU. "
    "en 16 temas clave durante 1984. El objetivo es clasificar si un congresista "
    "es Republicano o Demócrata basándose en sus patrones de votación."
)

doc.add_heading('3.2 Problemas Identificados', level=2)

problems2 = doc.add_paragraph()
problems2.add_run("• Valores faltantes: ").bold = True
problems2.add_run("El símbolo '?' representa abstenciones o votos no registrados. "
                  "Se encontraron valores faltantes en 16 de las 17 columnas, "
                  "con porcentajes entre 2% y 24%.\n")
problems2.add_run("• Variables: ").bold = True
problems2.add_run("Todas las variables son categóricas (y/n/?), lo cual es "
                  "apropiado para este tipo de análisis.")

doc.add_heading('3.3 Tratamiento Aplicado', level=2)

treatment2 = doc.add_paragraph()
treatment2.add_run("1. Imputación de valores faltantes: ").bold = True
treatment2.add_run("Se utilizó la moda para cada columna de votación. "
                   "Esto significa que las abstenciones fueron reemplazadas "
                   "por el voto mayoritario en cada tema.\n\n")
treatment2.add_run("2. Verificación de duplicados: ").bold = True
treatment2.add_run("No se encontraron registros duplicados en este dataset.")

doc.add_heading('3.4 Resultados', level=2)

results2 = doc.add_paragraph()
results2.add_run("• Registros originales: 435\n")
results2.add_run("• Registros finales: 435\n")
results2.add_run("• Valores faltantes restantes: 0\n")
results2.add_run("• Distribución de clases:\n")
results2.add_run("  - Demócratas: 267 (61.4%)\n")
results2.add_run("  - Republicanos: 168 (38.6%)")

# ============================================================================
# PÁGINA 4: CONCLUSIONES
# ============================================================================
doc.add_heading('4. Conclusiones', level=1)

doc.add_paragraph(
    "El tratamiento de datos es un paso fundamental en cualquier proyecto de "
    "Machine Learning. A través de este taller se evidenció la importancia de:"
)

conclusions = doc.add_paragraph()
conclusions.add_run("1. ").bold = True
conclusions.add_run("Explorar los datos antes de cualquier tratamiento para "
                    "identificar problemas de calidad.\n\n")
conclusions.add_run("2. ").bold = True
conclusions.add_run("Seleccionar estrategias de imputación apropiadas según "
                    "el tipo de variable (moda para categóricas, mediana para "
                    "numéricas con outliers).\n\n")
conclusions.add_run("3. ").bold = True
conclusions.add_run("Documentar cada decisión tomada durante el proceso de "
                    "limpieza para garantizar reproducibilidad.\n\n")
conclusions.add_run("4. ").bold = True
conclusions.add_run("Verificar el estado final de los datos para confirmar "
                    "que están listos para el modelado.")

doc.add_paragraph(
    "La calidad del modelo depende directamente de la calidad de los datos. "
    "Datos con errores, valores faltantes o ruido generan modelos poco confiables."
)

# ============================================================================
# PÁGINA 5: REFERENCIAS
# ============================================================================
doc.add_heading('5. Referencias Bibliográficas', level=1)

doc.add_paragraph(
    "Dua, D., & Graff, C. (2019). UCI Machine Learning Repository. "
    "University of California, Irvine. https://archive.ics.uci.edu/ml",
    style='List Bullet'
)

doc.add_paragraph(
    "Rothman, D. (2018). Artificial Intelligence by Example: Develop Machine "
    "Intelligence from Scratch Using Real Artificial Intelligence Use Cases "
    "(pp. 30-45). Packt Publishing.",
    style='List Bullet'
)

doc.add_paragraph(
    "Bishop, C. M. (2006). Pattern Recognition and Machine Learning "
    "(pp. 67-76, 136-182). Springer.",
    style='List Bullet'
)

doc.add_paragraph(
    "Boschetti, A., & Massaron, L. (2018). Python Data Science Essentials: "
    "A Practitioner's Guide Covering Essential Data Science Principles, "
    "Tools, and Techniques (3rd ed., pp. 35-58). Packt Publishing.",
    style='List Bullet'
)

# Guardar documento
output_path = "/Users/alexander/Library/CloudStorage/OneDrive-ConsejoSuperiordelaJudicatura/UNIMINUTO/1er CUATRIMESTRE/NRC-200-Machine Learning/ACTIVIDADES/MA Semana 2/ML_Semana2_Taller_Documento.docx"
doc.save(output_path)

print(f"✓ Documento generado exitosamente: {output_path}")
