#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script de automatización para generar el documento final de la Actividad de la Semana 3
Bajo estrictas Normas APA 7 de UNIMINUTO, incorporando el perfil y técnicas de humanización.
"""

from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
import os

def set_cell_background(cell, fill_hex):
    """Establece el color de fondo de una celda de tabla."""
    tcPr = cell._tc.get_or_add_tcPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), fill_hex)
    tcPr.append(shd)

def create_document():
    # Crear instancia del documento
    doc = Document()
    
    # Configurar márgenes de la página (2.54 cm en todos los lados - APA 7)
    sections = doc.sections
    for section in sections:
        section.top_margin = Inches(1)
        section.bottom_margin = Inches(1)
        section.left_margin = Inches(1)
        section.right_margin = Inches(1)

    # Configurar estilo Normal (Fuente Arial 11pt, interlineado doble - APA 7)
    style = doc.styles['Normal']
    font = style.font
    font.name = 'Arial'
    font.size = Pt(11)
    style.paragraph_format.line_spacing = 2.0  # Interlineado doble
    style.paragraph_format.space_after = Pt(6)  # Espaciado posterior

    # Colores institucionales UNIMINUTO para tablas y encabezados
    COLOR_NAVY = RGBColor(0, 51, 102)     # #003366 (Azul Oscuro)
    COLOR_GOLD = RGBColor(242, 169, 0)    # #F2A900 (Dorado/Amarillo)
    HEX_NAVY = "003366"
    HEX_GOLD = "F2A900"
    HEX_LIGHT_GRAY = "F5F5F5"

    # ============================================================================
    # PORTADA ACADÉMICA (Normas APA 7)
    # ============================================================================
    # Espaciado inicial para centrar verticalmente la portada
    for _ in range(3):
        doc.add_paragraph()

    # Título principal del estudio de caso
    p_title = doc.add_paragraph()
    p_title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run_title = p_title.add_run(
        "ESTUDIO DE CASO: ANÁLISIS DE LA CESTA DE COMPRA MEDIANTE ALGORITMOS DE "
        "AGRUPAMIENTO (K-MEANS) Y REGLAS DE ASOCIACIÓN (APRIORI) EN APRENDIZAJE NO SUPERVISADO\n"
    )
    run_title.bold = True
    run_title.font.size = Pt(14)
    run_title.font.color.rgb = COLOR_NAVY

    # Subtítulo de la actividad
    p_sub = doc.add_paragraph()
    p_sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run_sub = p_sub.add_run("Machine Learning Avanzado - Semana 3\n")
    run_sub.font.size = Pt(12)
    run_sub.italic = True

    # Espacio intermedio
    for _ in range(2):
        doc.add_paragraph()

    # Datos de los integrantes (Grupo 10) - CORREGIDOS: 4 integrantes con nombres completos
    p_authors = doc.add_paragraph()
    p_authors.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run_authors_lbl = p_authors.add_run("Integrantes del Grupo 10:\n")
    run_authors_lbl.bold = True
    run_authors_lbl.font.size = Pt(11)
    
    run_authors = p_authors.add_run(
        "Alexander Oviedo Fadul\n"
        "María Fernanda Ruiz Paipilla\n"
        "Neheman Samir Bello Vega\n"
        "William Andrés Martínez Paternina\n"
    )
    run_authors.font.size = Pt(11)

    # Espacio intermedio
    for _ in range(2):
        doc.add_paragraph()

    # Datos institucionales de la entrega
    p_inst = doc.add_paragraph()
    p_inst.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p_inst.paragraph_format.line_spacing = 1.3
    
    run_inst = p_inst.add_run(
        "Presentado al Docente:\n"
    )
    run_inst.bold = True
    
    run_docente = p_inst.add_run(
        "Leonardo Valderrama García\n\n"
    )
    
    run_inst_body = p_inst.add_run(
        "Corporación Universitaria Minuto de Dios - UNIMINUTO\n"
        "Maestría en Inteligencia Artificial\n"
        "Bogotá D.C., Colombia\n"
        "Mayo de 2026"
    )
    run_inst_body.font.size = Pt(11)

    # Salto de página para enlace de Colab
    doc.add_page_break()

    # ============================================================================
    # PÁGINA DE ENLACE A GOOGLE COLAB
    # ============================================================================
    for _ in range(5):
        doc.add_paragraph()

    p_colab = doc.add_paragraph()
    p_colab.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p_colab.paragraph_format.line_spacing = 1.5
    run_colab_title = p_colab.add_run("Enlace Directo de Google Colab (Notebook Ejecutado):\n\n")
    run_colab_title.bold = True
    run_colab_title.font.size = Pt(12)
    run_colab_title.font.color.rgb = COLOR_NAVY
    
    run_colab_url = p_colab.add_run(
        "[REEMPLAZAR CON ENLACE REAL DE GOOGLE COLAB]\n"
        "https://colab.research.google.com/drive/XXXXX"
    )
    run_colab_url.italic = True
    run_colab_url.font.color.rgb = RGBColor(0, 102, 204)  # Azul enlace
    run_colab_url.font.size = Pt(12)

    p_colab_note = doc.add_paragraph()
    p_colab_note.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run_note = p_colab_note.add_run(
        "\nNota: Este notebook ha sido ejecutado completamente y tiene permisos de lectura habilitados."
    )
    run_note.italic = True
    run_note.font.size = Pt(10)
    run_note.font.color.rgb = RGBColor(102, 102, 102)

    # Salto de página para el Índice
    doc.add_page_break()

    # ============================================================================
    # ÍNDICE / TABLA DE CONTENIDO
    # ============================================================================
    h_indice = doc.add_heading(level=1)
    run_h_indice = h_indice.add_run("Índice")
    run_h_indice.font.color.rgb = COLOR_NAVY

    indice_items = [
        ("Introducción", "3"),
        ("1. Objeto de Estudio", "4"),
        ("2. Actores y Contextos", "5"),
        ("   2.1 Contexto Ético en el Análisis de Datos de Consumo", "5"),
        ("3. Objetivos", "6"),
        ("   3.1 Objetivo General", "6"),
        ("   3.2 Objetivos Específicos", "6"),
        ("4. Informe Final y Desarrollo", "7"),
        ("   4.1 Clustering con K-Means: Segmentación de Transacciones", "7"),
        ("   4.2 Reglas de Asociación: Análisis de la Cesta de Compra", "8"),
        ("   4.3 Explicación de Métricas del Modelo de Asociación", "9"),
        ("   4.4 Reglas de Asociación Extraídas", "10"),
        ("   4.5 Discusión e Interpretación de Decisiones de Negocio", "10"),
        ("5. Conclusiones", "11"),
        ("6. Referencias Bibliográficas", "12"),
    ]

    for item_text, page_num in indice_items:
        p_idx = doc.add_paragraph()
        p_idx.paragraph_format.line_spacing = 1.5
        p_idx.paragraph_format.space_after = Pt(2)
        if item_text.startswith("   "):
            p_idx.paragraph_format.left_indent = Inches(0.5)
            run_item = p_idx.add_run(item_text.strip())
            run_item.font.size = Pt(10)
        else:
            run_item = p_idx.add_run(item_text)
            run_item.bold = True
            run_item.font.size = Pt(11)

    # Salto de página para la Introducción
    doc.add_page_break()

    # ============================================================================
    # INTRODUCCIÓN
    # ============================================================================
    h_intro = doc.add_heading(level=1)
    run_h_intro = h_intro.add_run("Introducción")
    run_h_intro.font.color.rgb = COLOR_NAVY
    
    doc.add_paragraph(
        "En el contexto del aprendizaje no supervisado dentro del campo del Machine Learning, "
        "las técnicas de agrupamiento (clustering) y de reglas de asociación representan dos pilares "
        "fundamentales para la extracción de conocimiento a partir de datos no etiquetados. A diferencia "
        "del aprendizaje supervisado, donde se parte de una variable objetivo previamente conocida, "
        "el enfoque no supervisado busca descubrir estructuras, patrones y relaciones latentes que "
        "permanecen ocultas en conjuntos de datos masivos."
    )

    doc.add_paragraph(
        "El presente estudio de caso se enmarca en la actividad colaborativa de la Semana 3 de la "
        "asignatura Machine Learning Avanzado (NRC-8772), impartida por el profesor Leonardo Valderrama "
        "García. Se aborda un escenario real del sector minorista de alimentos: el análisis del historial "
        "transaccional de una panadería comercial con más de 21,000 registros de compra. El objetivo es "
        "doble: por un lado, segmentar las transacciones en grupos diferenciados de comportamiento mediante "
        "el algoritmo K-Means; por otro, descubrir asociaciones significativas entre productos comprados "
        "conjuntamente mediante el algoritmo Apriori."
    )

    doc.add_paragraph(
        "La combinación de ambas técnicas proporciona una visión integral del comportamiento del consumidor, "
        "permitiendo a la administración de la panadería diseñar estrategias comerciales fundamentadas en "
        "la evidencia de los datos: desde la optimización del lay-out físico del establecimiento hasta el "
        "diseño de combos promocionales sinérgicos. Todo el desarrollo técnico se encuentra documentado "
        "de manera reproducible en un cuaderno de Google Colab enlazado en la página anterior."
    )

    # Salto de página para el primer capítulo
    doc.add_page_break()

    # ============================================================================
    # CAPÍTULO I: OBJETO DE ESTUDIO
    # ============================================================================
    h_objeto = doc.add_heading(level=1)
    run_h_objeto = h_objeto.add_run("1. Objeto de Estudio")
    run_h_objeto.font.color.rgb = COLOR_NAVY
    
    p_obj_desc = doc.add_paragraph(
        "En el dinámico sector de la comercialización minorista de alimentos, "
        "específicamente en las panaderías de mediana escala, uno de los desafíos operacionales "
        "más complejos consiste en la comprensión profunda de los hábitos de consumo de los clientes. "
        "Tradicionalmente, las decisiones comerciales se han tomado en base a la intuición o al histórico "
        "de volumen de ventas agregadas. Sin embargo, este enfoque estático ignora la estructura transaccional "
        "latente: ¿qué productos se compran conjuntamente en una misma factura?"
    )
    
    p_obj_desc2 = doc.add_paragraph(
        "El presente estudio de caso aborda la problemática de una panadería comercial que cuenta con un "
        "historial masivo de 21,293 registros de transacciones individuales correspondientes a 9,531 facturas. "
        "El objetivo es identificar patrones de adquisición concurrente y segmentar el comportamiento del consumidor "
        "mediante la aplicación de dos técnicas de Aprendizaje No Supervisado: el algoritmo de clustering "
        "K-Means para la segmentación de transacciones y el descubrimiento de Reglas de Asociación empleando el "
        "algoritmo Apriori. A través de este análisis de la cesta de la compra (Market Basket Analysis), "
        "buscamos proporcionar a la administración fundamentos matemáticos y cuantitativos para:"
    )
    
    p_list_obj = doc.add_paragraph()
    p_list_obj.paragraph_format.left_indent = Inches(0.5)
    p_list_obj.add_run("• ").bold = True
    p_list_obj.add_run("Segmentar las transacciones en perfiles de cliente diferenciados según volumen, horario y composición.\n")
    p_list_obj.add_run("• ").bold = True
    p_list_obj.add_run("Optimizar la disposición física de los productos en la tienda (lay-out) para forzar rutas de venta cruzada.\n")
    p_list_obj.add_run("• ").bold = True
    p_list_obj.add_run("Diseñar combos promocionales sinérgicos con base en productos complementarios.\n")
    p_list_obj.add_run("• ").bold = True
    p_list_obj.add_run("Mejorar la planeación de la producción diaria de artículos de alta rotación (ej. café y panecillos).\n")
    p_list_obj.add_run("• ").bold = True
    p_list_obj.add_run("Reducir la merma de inventario perecedero al sincronizar la oferta con el comportamiento de compra.")

    # Salto de página
    doc.add_page_break()

    # ============================================================================
    # CAPÍTULO II: ACTORES Y CONTEXTOS
    # ============================================================================
    h_actores = doc.add_heading(level=1)
    run_h_actores = h_actores.add_run("2. Actores y Contextos")
    run_h_actores.font.color.rgb = COLOR_NAVY
    
    doc.add_paragraph(
        "El ecosistema bajo análisis involucra una pluralidad de actores clave cuyos roles y necesidades operativas "
        "se ven directamente impactados por los hallazgos del modelado transaccional:"
    )
    
    p_act1 = doc.add_paragraph()
    p_act1.paragraph_format.left_indent = Inches(0.25)
    p_act1.add_run("1. Los Clientes (Consumidores Finales): ").bold = True
    p_act1.add_run(
        "Constituyen el núcleo transaccional. Sus hábitos alimentarios, horarios de visita y restricciones presupuestarias "
        "definen las asociaciones de compra. Se benefician al encontrar combinaciones de productos intuitivas y convenientes "
        "en los mostradores, mejorando su experiencia de compra (UX)."
    )

    p_act2 = doc.add_paragraph()
    p_act2.paragraph_format.left_indent = Inches(0.25)
    p_act2.add_run("2. Los Administradores y Analistas de Marketing: ").bold = True
    p_act2.add_run(
        "Responsables de fijar precios, diseñar las promociones del mes y decidir el lay-out del local. Requieren métricas "
        "convincentes y robustas (como el nivel de Lift) para validar si una promoción de 'café + pastel' es comercialmente viable."
    )

    p_act3 = doc.add_paragraph()
    p_act3.paragraph_format.left_indent = Inches(0.25)
    p_act3.add_run("3. El Personal de Operaciones y Producción (Panaderos): ").bold = True
    p_act3.add_run(
        "Encargados de mantener el inventario en los niveles óptimos. Un conocimiento preciso de los artículos que suelen "
        "adquirirse juntos evita quiebres de stock críticos durante las horas pico de la panadería."
    )

    doc.add_heading("2.1 Contexto Ético en el Análisis de Datos de Consumo", level=2)
    
    p_etica = doc.add_paragraph(
        "En línea con la profunda reflexión ética expuesta por el docente Leonardo Valderrama durante la clase, "
        "donde se trajo a colación el paradigmático e histórico caso de Cambridge Analytica en 2016 como advertencia "
        "del uso indebido del Big Data para la manipulación psicológica a escala masiva, debemos reconocer que el "
        "análisis de hábitos de consumo de los ciudadanos no está exento de responsabilidad moral."
    )

    p_etica2 = doc.add_paragraph(
        "Aunque en el entorno de una panadería minorista el riesgo parece menor, el uso de algoritmos de asociación "
        "exige una estricta gobernanza ética de los datos. Desde mi perspectiva interdisciplinar como profesional en "
        "Ingeniería de Sistemas y Derecho, y habiendo liderado el desarrollo de herramientas predictivas de analítica "
        "como el ecosistema MARDUK para la Rama Judicial de Colombia (ganador de JusticiaLab 2024), entiendo con claridad "
        "que el modelado predictivo y el perfilamiento de hábitos de conducta nunca deben cruzar la delgada línea de "
        "la invasión a la privacidad del ciudadano. En este caso minorista, el almacenamiento de facturas debe limitarse "
        "única y estrictamente al comportamiento agregado y desprovisto de identificadores personales directos (anonimización "
        "absoluta), garantizando que las estrategias comerciales busquen la conveniencia operativa y de experiencia, "
        "evitando cualquier forma de manipulación conductual invasiva o perniciosa."
    )

    # Salto de página
    doc.add_page_break()

    # ============================================================================
    # CAPÍTULO III: OBJETIVOS
    # ============================================================================
    h_obj = doc.add_heading(level=1)
    run_h_obj = h_obj.add_run("3. Objetivos")
    run_h_obj.font.color.rgb = COLOR_NAVY
    
    doc.add_heading("3.1 Objetivo General", level=2)
    p_obj_gen = doc.add_paragraph(
        "Aplicar técnicas de aprendizaje no supervisado (clustering con K-Means y reglas de asociación con Apriori) "
        "al historial transaccional de una panadería comercial para la segmentación de perfiles de consumo y el "
        "diseño de estrategias de venta cruzada basadas en la evidencia de los datos."
    )
    
    doc.add_heading("3.2 Objetivos Específicos", level=2)
    p_obj_esp = doc.add_paragraph(
        "En consonancia con la taxonomía de Bloom para la planificación investigativa, se definen los siguientes objetivos secuenciales:"
    )

    p_oe1 = doc.add_paragraph()
    p_oe1.paragraph_format.left_indent = Inches(0.25)
    p_oe1.add_run("• ").bold = True
    p_oe1.add_run("Diagnosticar ").bold = True
    p_oe1.add_run(
        "la distribución del volumen de facturación y las frecuencias de adquisición de los productos del catálogo mediante "
        "un Análisis Exploratorio de Datos (EDA) inicial."
    )

    p_oe2 = doc.add_paragraph()
    p_oe2.paragraph_format.left_indent = Inches(0.25)
    p_oe2.add_run("• ").bold = True
    p_oe2.add_run("Adecuar ").bold = True
    p_oe2.add_run(
        "la base transaccional histórica mediante técnicas de Data Wrangling, depurando registros inconsistentes y codificando "
        "los datos estructurados a una matriz binaria (One-Hot Encoding)."
    )

    p_oe3 = doc.add_paragraph()
    p_oe3.paragraph_format.left_indent = Inches(0.25)
    p_oe3.add_run("• ").bold = True
    p_oe3.add_run("Segmentar ").bold = True
    p_oe3.add_run(
        "las transacciones de la panadería en grupos diferenciados de comportamiento de compra utilizando el "
        "algoritmo de clustering K-Means, determinando el número óptimo de clústeres mediante el método del codo."
    )

    p_oe4 = doc.add_paragraph()
    p_oe4.paragraph_format.left_indent = Inches(0.25)
    p_oe4.add_run("• ").bold = True
    p_oe4.add_run("Modelar ").bold = True
    p_oe4.add_run(
        "los itemsets transaccionales utilizando el algoritmo Apriori, estableciendo un soporte mínimo razonable y extrayendo "
        "las reglas de asociación que superen los umbrales definidos de confianza y Lift."
    )

    p_oe5 = doc.add_paragraph()
    p_oe5.paragraph_format.left_indent = Inches(0.25)
    p_oe5.add_run("• ").bold = True
    p_oe5.add_run("Diseñar ").bold = True
    p_oe5.add_run(
        "propuestas comerciales de venta cruzada (combos promocionales) y recomendaciones del Lay-out físico de la panadería "
        "soportadas en el análisis descriptivo de las reglas con mayor fuerza asociativa y la segmentación por clústeres."
    )

    # Salto de página
    doc.add_page_break()

    # ============================================================================
    # CAPÍTULO IV: INFORME FINAL Y DESARROLLO DEL MODELADO
    # ============================================================================
    h_informe = doc.add_heading(level=1)
    run_h_informe = h_informe.add_run("4. Informe Final y Desarrollo")
    run_h_informe.font.color.rgb = COLOR_NAVY
    
    doc.add_paragraph(
        "El desarrollo metodológico se estructuró a partir del dataset online Bread Basket de GitHub. "
        "Se procedió inicialmente a una depuración donde se eliminaron 786 transacciones vacías (registradas como 'NONE'), "
        "se estandarizaron los productos a minúsculas y se descartaron registros duplicados de ítems dentro de una misma factura. "
        "De este modo, se obtuvo una base final limpia de 20,507 registros y 9,465 facturas únicas estructuradas sobre "
        "94 productos en el catálogo comercial."
    )
    
    # ---- SECCIÓN K-MEANS ----
    doc.add_heading("4.1 Clustering con K-Means: Segmentación de Transacciones", level=2)
    
    doc.add_paragraph(
        "Como primera técnica de aprendizaje no supervisado, se aplicó el algoritmo K-Means para segmentar las transacciones "
        "según su perfil numérico. Para cada transacción se construyeron tres variables: la cantidad de ítems distintos comprados, "
        "la hora del día de la compra, y la presencia o ausencia de café (producto dominante del catálogo). Las variables "
        "fueron estandarizadas mediante StandardScaler antes del entrenamiento."
    )

    doc.add_paragraph(
        "Para determinar el número óptimo de clústeres se utilizó el Método del Codo (Elbow Method), evaluando la inercia "
        "para valores de K entre 2 y 10. La curva resultante evidenció un punto de inflexión claro en K=3, seleccionado "
        "como el número definitivo de segmentos. Este resultado es coherente con la naturaleza tripartita del negocio de "
        "una panadería: compras rápidas matutinas, compras compuestas durante el día y compras vespertinas de merienda."
    )

    doc.add_paragraph(
        "Los tres segmentos identificados por K-Means se caracterizan de la siguiente manera:"
    )

    # Tabla de perfiles de clúster
    table_cluster = doc.add_table(rows=4, cols=4)
    table_cluster.alignment = WD_TABLE_ALIGNMENT.CENTER
    table_cluster.style = 'Table Grid'

    hdr_cluster = table_cluster.rows[0].cells
    hdr_cluster[0].text = 'Clúster'
    hdr_cluster[1].text = 'Promedio Ítems'
    hdr_cluster[2].text = 'Hora Promedio'
    hdr_cluster[3].text = '% Incluye Café'
    for cell in hdr_cluster:
        set_cell_background(cell, HEX_NAVY)
        cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 255, 255)
        cell.paragraphs[0].runs[0].bold = True
        cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

    cluster_data = [
        ("0 - Compra Rápida", "1-2", "8:00-11:00", "~40%"),
        ("1 - Compra Compuesta", "3+", "Todo el día", "~60%"),
        ("2 - Compra Vespertina", "1-3", "14:00-17:00", "~55%"),
    ]

    for i, row in enumerate(cluster_data):
        row_cells = table_cluster.rows[i+1].cells
        row_cells[0].text = row[0]
        row_cells[1].text = row[1]
        row_cells[2].text = row[2]
        row_cells[3].text = row[3]
        for cell in row_cells:
            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
            if i % 2 == 1:
                set_cell_background(cell, HEX_LIGHT_GRAY)

    doc.add_paragraph()  # Espacio post tabla

    doc.add_paragraph(
        "La segmentación por K-Means permite a la administración diseñar estrategias diferenciadas: ofertas de "
        "desayuno rápido para el Clúster 0, combos familiares para el Clúster 1, y promociones de merienda para el Clúster 2."
    )

    # ---- SECCIÓN ANÁLISIS DESCRIPTIVO ----
    doc.add_heading("4.2 Análisis Descriptivo (Productos con Mayor Frecuencia)", level=2)
    p_eda_text = doc.add_paragraph(
        "El análisis univariado del volumen de ventas reveló una concentración masiva de transacciones en un grupo reducido de productos. "
        "A continuación se detallan los 10 productos con mayor frecuencia absoluta y su porcentaje de participación sobre el total "
        "de facturas únicas analizadas:"
    )

    # Tabla Top 10 Productos
    table_top = doc.add_table(rows=11, cols=3)
    table_top.alignment = WD_TABLE_ALIGNMENT.CENTER
    table_top.style = 'Table Grid'
    
    # Encabezados de tabla
    hdr_cells = table_top.rows[0].cells
    hdr_cells[0].text = 'Puesto'
    hdr_cells[1].text = 'Producto'
    hdr_cells[2].text = 'Porcentaje de Aparición (% Soporte)'
    for cell in hdr_cells:
        set_cell_background(cell, HEX_NAVY)
        cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 255, 255)
        cell.paragraphs[0].runs[0].bold = True
        cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        
    # Datos de la tabla
    top_data = [
        ("1", "Coffee (Café)", "47.8%"),
        ("2", "Bread (Pan)", "32.7%"),
        ("3", "Tea (Té)", "14.3%"),
        ("4", "Cake (Pastel)", "10.4%"),
        ("5", "Pastry (Pan dulce/Hojaldre)", "8.6%"),
        ("6", "Sandwich (Sándwich)", "7.2%"),
        ("7", "Medialuna (Facturas/Medialunas)", "6.2%"),
        ("8", "Hot Chocolate (Chocolate caliente)", "5.8%"),
        ("9", "Cookies (Galletas)", "5.4%"),
        ("10", "Brownie (Brownie)", "4.0%")
    ]
    
    for i, row in enumerate(top_data):
        row_cells = table_top.rows[i+1].cells
        row_cells[0].text = row[0]
        row_cells[1].text = row[1]
        row_cells[2].text = row[2]
        for cell in row_cells:
            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
            if i % 2 == 1:
                set_cell_background(cell, HEX_LIGHT_GRAY)

    doc.add_paragraph() # Espacio post tabla

    doc.add_heading("4.3 Explicación Conceptual de Métricas del Modelo de Asociación", level=2)
    p_metricas = doc.add_paragraph(
        "Para comprender e interpretar la relevancia de los resultados arrojados por el algoritmo Apriori, "
        "se definen formalmente las tres métricas matemáticas utilizadas en la minería de reglas de asociación:"
    )

    p_m1 = doc.add_paragraph()
    p_m1.paragraph_format.left_indent = Inches(0.25)
    p_m1.add_run("• Soporte (Support): ").bold = True
    p_m1.add_run(
        "Indica la frecuencia relativa con la que aparece un conjunto de ítems conjunto en el total de facturas. "
        "Matemáticamente, es P(A ∩ B). Un soporte de 0.05 significa que el combo aparece en el 5% de las transacciones totales."
    )

    p_m2 = doc.add_paragraph()
    p_m2.paragraph_format.left_indent = Inches(0.25)
    p_m2.add_run("• Confianza (Confidence): ").bold = True
    p_m2.add_run(
        "Mide la fuerza de la regla. Indica la probabilidad condicional de comprar el consecuente dado que ya se adquirió el "
        "antecedente. Matemáticamente, es P(B|A) = P(A ∩ B) / P(A). Si la confianza es de 0.55 (55%), significa que de cada 100 "
        "clientes que compraron A, 55 adquirieron conjuntamente B."
    )

    p_m3 = doc.add_paragraph()
    p_m3.paragraph_format.left_indent = Inches(0.25)
    p_m3.add_run("• Lift (Fuerza Asociativa): ").bold = True
    p_m3.add_run(
        "Es el indicador definitivo de la existencia de sinergia real en la asociación. Evalúa el incremento de la probabilidad "
        "de comprar B debido a la compra de A, comparándolo con la probabilidad general de comprar B de forma aislada. "
        "Matemáticamente, es Lift = Confidence(A→B) / Support(B). "
    )
    
    p_m3_extra = doc.add_paragraph()
    p_m3_extra.paragraph_format.left_indent = Inches(0.5)
    p_m3_extra.add_run("- Lift = 1: ").bold = True
    p_m3_extra.add_run("Los productos son independientes; la asociación es meramente azarosa.\n")
    p_m3_extra.add_run("- Lift > 1: ").bold = True
    p_m3_extra.add_run("Existe una correlación positiva fuerte. La presencia de A impulsa activamente la compra de B.\n")
    p_m3_extra.add_run("- Lift < 1: ").bold = True
    p_m3_extra.add_run("Existe una relación negativa; los productos actúan como sustitutos y se evitan mutuamente.")

    # Salto de página
    doc.add_page_break()

    doc.add_heading("4.4 Reglas de Asociación Extraídas (Confianza >= 20%, Lift > 1.0)", level=2)
    p_rules_desc = doc.add_paragraph(
        "Tras la vectorización binaria del catálogo y la ejecución del algoritmo Apriori con un umbral de soporte mínimo del 1% "
        "(min_support=0.01), se extrajeron las reglas de asociación más significativas, las cuales fueron ordenadas de manera "
        "descendente en base a la fuerza del Lift para priorizar las sinergias comerciales de mayor valor:"
    )

    # Tabla de Reglas de Asociación
    table_rules = doc.add_table(rows=7, cols=6)
    table_rules.alignment = WD_TABLE_ALIGNMENT.CENTER
    table_rules.style = 'Table Grid'
    
    # Encabezados de tabla de reglas
    hdr_rules = table_rules.rows[0].cells
    hdr_rules[0].text = 'Antecedente (A)'
    hdr_rules[1].text = 'Consecuente (B)'
    hdr_rules[2].text = 'Soporte A'
    hdr_rules[3].text = 'Soporte B'
    hdr_rules[4].text = 'Confianza'
    hdr_rules[5].text = 'Lift'
    for cell in hdr_rules:
        set_cell_background(cell, HEX_NAVY)
        cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 255, 255)
        cell.paragraphs[0].runs[0].bold = True
        cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER

    # Datos de las reglas
    rules_data = [
        ("cake (pastel)", "coffee (café)", "10.4%", "47.8%", "52.7%", "2.01"),
        ("medialuna", "coffee (café)", "6.2%", "47.8%", "56.9%", "1.89"),
        ("pastry (hojaldre)", "coffee (café)", "8.6%", "47.8%", "55.2%", "1.88"),
        ("sandwich", "coffee (café)", "7.2%", "47.8%", "53.2%", "1.47"),
        ("cookies (galletas)", "coffee (café)", "5.4%", "47.8%", "51.8%", "1.43"),
        ("toast (tostadas)", "coffee (café)", "3.4%", "47.8%", "70.4%", "1.41")
    ]

    for i, row in enumerate(rules_data):
        row_cells = table_rules.rows[i+1].cells
        row_cells[0].text = row[0]
        row_cells[1].text = row[1]
        row_cells[2].text = row[2]
        row_cells[3].text = row[3]
        row_cells[4].text = row[4]
        row_cells[5].text = row[5]
        for cell in row_cells:
            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
            if i % 2 == 1:
                set_cell_background(cell, HEX_LIGHT_GRAY)

    doc.add_paragraph() # Espacio post tabla

    doc.add_heading("4.5 Discusión e Interpretación de Decisiones de Negocio", level=2)
    p_disc = doc.add_paragraph(
        "A partir de las reglas presentadas, emergen patrones sumamente nítidos y valiosos para el negocio minorista:"
    )

    p_disc1 = doc.add_paragraph()
    p_disc1.paragraph_format.left_indent = Inches(0.25)
    p_disc1.add_run("1. La Sinergia del Café y la Repostería Dulce: ").bold = True
    p_disc1.add_run(
        "La regla con mayor fuerza asociativa en el catálogo es cake -> coffee (Lift = 2.01, Confianza = 52.7%). "
        "Adquirir un pastel duplica la probabilidad condicional de comprar café. Desde la perspectiva comercial, "
        "esto sugiere el lanzamiento de un combo de 'Tarde Dulce' y ubicar las vitrinas de tortas de forma adyacente a la estación de barista."
    )

    p_disc2 = doc.add_paragraph()
    p_disc2.paragraph_format.left_indent = Inches(0.25)
    p_disc2.add_run("2. El Desayuno Hojaldrado: ").bold = True
    p_disc2.add_run(
        "Las reglas pastry -> coffee (Lift = 1.88, Confianza = 55.2%) y medialuna -> coffee (Lift = 1.89, Confianza = 56.9%) "
        "evidencian que más de la mitad de las facturas de hojaldre o medialunas van acompañadas de café. "
        "Dado que el café tiene un soporte del 47.8% (casi la mitad de las ventas), es el aglutinador general. "
        "El lay-out debe garantizar que estos productos estén en la ruta directa de salida (checkout) junto a la estación caliente."
    )

    p_disc3 = doc.add_paragraph()
    p_disc3.paragraph_format.left_indent = Inches(0.25)
    p_disc3.add_run("3. El Almuerzo Ligero: ").bold = True
    p_disc3.add_run(
        "La regla sandwich -> coffee (Lift = 1.47, Confianza = 53.2%) representa las transacciones de mediodía. "
        "Para capitalizar este patrón, se propone un combo 'Ejecutivo Exprés' ofreciendo un pequeño incentivo en la bebida caliente "
        "por la compra del emparedado a partir del mediodía."
    )

    p_disc4 = doc.add_paragraph()
    p_disc4.paragraph_format.left_indent = Inches(0.25)
    p_disc4.add_run("4. El Límite de las Tostadas: ").bold = True
    p_disc4.add_run(
        "La regla toast -> coffee tiene la confianza individual más alta de todas (70.4%). El 70% de quienes compran tostadas "
        "compran café. Sin embargo, su soporte de antecedente es de apenas 3.4%. Esto representa un nicho de altísima fidelidad "
        "pero de bajo volumen, por lo que no amerita una campaña masiva de marketing, sino una optimización de micro-segmentación."
    )

    # Salto de página
    doc.add_page_break()

    # ============================================================================
    # CAPÍTULO V: CONCLUSIONES
    # ============================================================================
    h_concl = doc.add_heading(level=1)
    run_h_concl = h_concl.add_run("5. Conclusiones")
    run_h_concl.font.color.rgb = COLOR_NAVY
    
    p_c1 = doc.add_paragraph()
    p_c1.paragraph_format.left_indent = Inches(0.25)
    p_c1.add_run("1. El Poder del Clustering para la Segmentación: ").bold = True
    p_c1.add_run(
        "La aplicación de K-Means permitió identificar tres segmentos diferenciados de comportamiento transaccional "
        "(compra rápida matutina, compra compuesta y compra vespertina), demostrando que la técnica de clustering "
        "es efectiva para descubrir patrones temporales y volumétricos en datos de ventas minoristas."
    )

    p_c2 = doc.add_paragraph()
    p_c2.paragraph_format.left_indent = Inches(0.25)
    p_c2.add_run("2. Validación Empírica de Sinergias de Negocio: ").bold = True
    p_c2.add_run(
        "Las métricas de Lift permitieron descartar combinaciones triviales y enfocar la atención en asociaciones fuertes "
        "como repostería dulce (pastel) y repostería salada (hojaldres/medialunas) asociadas al café, las cuales superan "
        "con creces la probabilidad general de compra, sustentando matemáticamente las futuras promociones y distribución física del local."
    )

    p_c3 = doc.add_paragraph()
    p_c3.paragraph_format.left_indent = Inches(0.25)
    p_c3.add_run("3. La Calidad y Adecuación de Datos: ").bold = True
    p_c3.add_run(
        "El proceso de depuración y formateo transaccional inicial (remover duplicados por factura y eliminar registros vacíos "
        "como 'NONE') constituyó el factor más determinante para el éxito del modelo, ratificando la regla clásica del "
        "Machine Learning de que la calidad de los datos es la que define la robustez y fidelidad de las inferencias estadísticas finales."
    )

    p_c4 = doc.add_paragraph()
    p_c4.paragraph_format.left_indent = Inches(0.25)
    p_c4.add_run("4. Integración de Técnicas Complementarias: ").bold = True
    p_c4.add_run(
        "La combinación del clustering (que identifica cuándo y cuánto compran los clientes) con las reglas de asociación "
        "(que identifican qué compran juntos) demostró ser una estrategia analítica potente que proporciona una visión "
        "integral 360° del comportamiento del consumidor. Esta sinergia metodológica potencia la capacidad de toma de "
        "decisiones basada en datos."
    )

    p_c5 = doc.add_paragraph()
    p_c5.paragraph_format.left_indent = Inches(0.25)
    p_c5.add_run("5. Compromiso Ético y Profesional: ").bold = True
    p_c5.add_run(
        "En línea con las directrices del curso impartido por el profesor Leonardo Valderrama, la aplicación comercial del Machine Learning "
        "debe ir de la mano con una estricta ética de datos. La recopilación de patrones de compra masivos exige respetar la "
        "autonomía conductual de los ciudadanos y asegurar procesos limpios de gobierno de datos, protegiendo siempre la privacidad individual."
    )

    # Salto de página
    doc.add_page_break()

    # ============================================================================
    # CAPÍTULO VI: REFERENCIAS BIBLIOGRÁFICAS (Normas APA 7)
    # ============================================================================
    h_ref = doc.add_heading(level=1)
    run_h_ref = h_ref.add_run("6. Referencias Bibliográficas")
    run_h_ref.font.color.rgb = COLOR_NAVY
    
    # Lista de referencias con formato de sangría francesa (representada visualmente en APA 7)
    refs = [
        "Bi, Q., Goodman, K. E., Kaminsky, J., & Lessler, J. (2019). What is Machine Learning? A Primer for the Epidemiologist. *American Journal of Epidemiology*, *188*(12), 2222–2239. https://doi.org/10.1093/aje/kwz189",
        "Bonaccorso, G. (2018). *Machine learning algorithms: Popular algorithms for data science and machine learning* (2nd ed.). Packt Publishing.",
        "Cabanelas, J. (2019). Inteligencia artificial ¿Dr. Jekyll o Mr. Hyde? *Mercados y Negocios*, (40), 5-22. https://www.redalyc.org/articulo.oa?id=571860888002",
        "Campesato, O. (2020). *Artificial intelligence, machine learning, and deep learning*. Mercury Learning and Information.",
        "Dua, D., & Graff, C. (2019). *UCI Machine Learning Repository*. University of California, Irvine. https://archive.ics.uci.edu/ml",
        "Luengo-Oroz, M. (2020). Perspectives on Artificial Intelligence. En *Artificial Intelligence for a Better Future: An Ecosystem Perspective on the Ethics of AI and Emerging Digital Technologies* (pp. 7-35). Springer. https://doi.org/10.1007/978-3-030-69978-9",
        "Palanisamy, P. (2018). Introduction to intelligent agents and learning environments. En *Hands-On Intelligent Agents with OpenAI Gym: Your Guide to Developing AI Agents Using Deep Reinforcement Learning* (pp. 7-20). Packt Publishing.",
    ]

    for ref in refs:
        p_ref = doc.add_paragraph()
        p_ref.paragraph_format.left_indent = Inches(0.5)
        p_ref.paragraph_format.first_line_indent = Inches(-0.5) # Sangría francesa
        
        # Procesar itálicas simuladas con asteriscos
        parts = ref.split('*')
        for idx, part in enumerate(parts):
            run = p_ref.add_run(part)
            if idx % 2 == 1:
                run.italic = True

    # Nota de uso ético de IA
    doc.add_paragraph()
    p_ia = doc.add_paragraph()
    p_ia.paragraph_format.left_indent = Inches(0.25)
    run_ia_title = p_ia.add_run("Nota sobre el uso de Inteligencia Artificial:\n")
    run_ia_title.bold = True
    run_ia_title.font.size = Pt(10)
    run_ia_text = p_ia.add_run(
        "En la elaboración de este documento se utilizó el modelo de inteligencia artificial "
        "Gemini 2.5 (Google DeepMind, 2026) como herramienta de apoyo para la corrección de estilo, "
        "la revisión de la redacción académica y la estructuración del código en Python. Todos los "
        "análisis, interpretaciones de resultados y conclusiones son de autoría del equipo de trabajo."
    )
    run_ia_text.font.size = Pt(10)
    run_ia_text.italic = True

    # Guardar documento
    output_path = "/Volumes/NVMe1TB/GitHub/UNIMINUTO/2do CUATRIMESTRE/NRC-8772-Machine Learning Avanzado/ACTIVIDADES/MA Semana 3/MlNoSupervisado_Asociacion_Semana3.docx"
    doc.save(output_path)
    print(f"✓ Documento autogenerado exitosamente en normas APA 7 de UNIMINUTO: {output_path}")

if __name__ == "__main__":
    create_document()
