Cobertura Móvil del Azuay

Claro y Movistar · 2G / 3G / 4G · Semestre I 2025

Cronograma del trabajo de titulación

El mismo roadmap de la metodología, pero con fechas. Del 2026-09-21 al 2026-11-06: qué se hace cada día, cuántas horas, con qué se cierra cada bloque del diagrama y qué se sacrifica si el tiempo aprieta.

41días laborables
143.5horas de proyecto
85actividades fechadas
66bloques del diagrama
7semanas
3.5 hpor día
Lee esto antes que nada

El plan cabe, pero sin holgura. Son 41 días laborables x 3.5 h = 143.5 h, menos 7 h de reuniones = 136.5 h de trabajo efectivo, y el alcance completo consume prácticamente todas. El colchón real son 4.5 h del jueves 5 y viernes 6 de noviembre. Si algo se atrasa más de dos días, no se alarga el plazo: se activa la lista de tareas sacrificables, en el orden en que está escrita. La señal de alarma más importante es el sábado 24 de octubre: si ese día no existe el Producto 4 (ubicaciones recomendadas), la Etapa 4 no cabe completa. El supuesto más optimista del plan son las 13 h de redacción para los capítulos 4, 5 y 6: solo salen si cada tabla y cada figura ya existe cuando te sientas a escribir, que es justo para lo que el plan reparte la escritura semana a semana. Si aún así no alcanza, el plan B es el sacrificable número 7: entregar el capítulo 5 con sus tablas y texto esquemático, y pulirlo en las correcciones.

Sobre qué supuestos está construido este plan

Reparto de las 143.5 h por carril de trabajo: 1: 18.5 h · 2: 48.0 h · 3: 19.0 h · 4: 16.5 h · 5: 8.5 h · aprender: 10.5 h · gestion: 9.5 h · memoria: 13.0 h

Ver solo:
S1

Montar el taller: entorno, datos crudos y Random Forest con las manos

Lunes 21 de septiembre a Sabado 26 de septiembre · 6 días · 21.0 h

0 / 15

Objetivo de la semana: Terminar el sábado sabiendo ejecutar un Random Forest completo sobre tus propios datos y con las seis fuentes del roadmap ya normalizadas a EPSG:32717.

Lunes 21 de septiembre
Montar el entorno de trabajo y ver correr el algoritmo
3.5 h

Crear el esqueleto del pipeline y el entorno de Python

1.0 h Tyrone
  1. Crear Metodologia/pipeline/ con las subcarpetas datos/, datos/normalizado/, scripts/, salidas/, figuras/ y qgis/.
  2. Crear el entorno virtual e instalar geopandas, rasterio, rasterstats, scikit-learn, pandas, numpy, matplotlib, seaborn, scipy, joblib y openpyxl.
  3. Congelar las versiones en requirements.txt (la reproducibilidad es parte de la metodología y el tribunal la pregunta).
Entregable

Metodologia/pipeline/requirements.txt y el árbol de carpetas creado.

Está hecho cuando

El comando de comprobación imprime las versiones de geopandas, rasterio y scikit-learn sin ningún error de importación.

py -m venv .venv && .venv\Scripts\activate && pip install geopandas rasterio rasterstats scikit-learn pandas matplotlib seaborn scipy joblib openpyxl && pip freeze > requirements.txt

Sesión RF 1 - Ver el algoritmo correr de punta a punta

1.5 h Tyrone
  1. Ejecutar tal cual Metodologia/Random Forest/ejemplo_random_forest.py y comparar la salida con salida_ejemplo.txt: deben coincidir (semilla fija).
  2. Tocar tres cosas de una en una y anotar qué pasa: N = 200 y N = 5000; random_state = 7; n_estimators = 5.
  3. Localizar en el código las cuatro líneas que importan: train_test_split, RandomForestClassifier(...), .fit(X_train, y_train) y .predict(X_test).
  4. Escribir cinco líneas en bitacora_rf.md: qué hace cada una de esas cuatro líneas.
Entregable

Metodologia/pipeline/bitacora_rf.md con la sesión 1 anotada.

Está hecho cuando

Puedes explicar de memoria, sin mirar el código, qué son X, y, fit y predict, y por qué el resultado no cambia entre dos ejecuciones seguidas.

python "Metodologia/Random Forest/ejemplo_random_forest.py"

Para estudiar README_Random_Forest.md, secciones 1 a 4 (Metodologia/Random Forest/)

1.1 Inventariar las seis fuentes de datos

1.0 h Tyrone
  1. Abrir una por una las seis fuentes que ya tienes en el repositorio y anotar en una tabla: nombre, ruta real, formato, CRS declarado, número de entidades, fecha del dato, institución y licencia.
  2. Comprobar el CRS de cada capa con geopandas (no confiar en el nombre del archivo).
  3. Marcar en la tabla cuáles están en EPSG:32717 y cuáles habrá que reproyectar.
Entregable

pipeline/salidas/inventario_fuentes.csv con ocho columnas y seis filas.

Está hecho cuando

Las seis fuentes del diagrama (mapas 4G, radiobases, topografía, población, infraestructura y suelo) tienen ruta real verificada y CRS comprobado con código.

python -c "import geopandas as gpd; g=gpd.read_file(r'ruta.shp'); print(g.crs, len(g), g.columns.tolist())"
Martes 22 de septiembre
Sacar la población del PDOT y entender por qué la exactitud engaña
3.5 h

1.2 Extraer las tablas de población del PDOT

2.0 h Tyrone
  1. Localizar en Metodologia/Poblacion El Valle/PDOT-EL-Valle_completo.pdf las tablas 4-50 y 4-51 (población por comunidad) y anotar el número de página.
  2. Extraer el texto con pdftotext -layout acotado a esas páginas y limpiarlo a CSV.
  3. Verificar que la suma de las comunidades cuadra con el total parroquial que declara el propio PDOT; si no cuadra, anotar la diferencia y su causa.
  4. Dejar constancia del año del censo o proyección, porque esa fecha irá en la memoria.
Entregable

pipeline/datos/poblacion_comunidades.csv con columnas comunidad, población, anio, fuente.

Está hecho cuando

La suma de la columna población difiere menos del 1 % del total parroquial del PDOT, y el número de comunidades coincide con el de la tabla original.

pdftotext -layout -f 120 -l 124 "PDOT-EL-Valle_completo.pdf" poblacion.txt

Sesión RF 2 - Métricas: por qué la exactitud engaña

1.5 h Tyrone
  1. En el ejemplo sintético, forzar que solo el 10 % de las celdas sean 'adecuadas' (así será tu caso real) y volver a entrenar.
  2. Imprimir la matriz de confusión y anotar los cuatro números: VP, FP, VN, FN.
  3. Calcular a mano, con calculadora, precisión, recall y F1 a partir de esos cuatro números, y comprobar que coinciden con los de classification_report.
  4. Responder por escrito: en esta tesis, ¿qué error duele más, un falso positivo (recomendar un sitio malo) o un falso negativo (no recomendar un sitio bueno)?
Entregable

Bitácora RF sesión 2 con la matriz, el cálculo a mano y la respuesta escrita.

Está hecho cuando

Sabes señalar en la matriz cuál casilla es un falso negativo y explicar en una frase por qué la exactitud puede ser del 90 % con un modelo inservible.

from sklearn.metrics import confusion_matrix, classification_report

Para estudiar README_Random_Forest.md, sección de evaluación; popup 3.5 del roadmap (/roadmap -> bloque 'Evaluar con el 30 % de prueba')

Miercoles 23 de septiembre
Comunidades sobre el mapa y radiobases 4G reales
3.5 h

1.2 Convertir la población en capa de puntos

1.0 h Tyrone
  1. Unir el CSV del PDOT con las coordenadas que levanto Freddy.
  2. Revisar las comunidades que Freddy marcó en rojo y resolverlas con el mapa del PDOT.
  3. Exportar a comunidades_el_valle.gpkg en EPSG:32717.
Entregable

pipeline/datos/comunidades_el_valle.gpkg (puntos con población).

Está hecho cuando

Todos los puntos caen dentro del límite de El Valle y ninguna comunidad quedó sin coordenada.

gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lon, df.lat), crs=4326).to_crs(32717).to_file('comunidades_el_valle.gpkg')

1.3 Extraer las radiobases 4G de las tres operadoras

1.0 h Tyrone
  1. Leer las carpetas Ubicaciones de Radiobase/CONECEL, /OTECEL y /CNT.
  2. Quedarse solo con los registros de tecnología 4G/LTE y armar una tabla única con operador, lat, lon, altura de antena, azimut y banda si existen.
  3. Recortar a El Valle más un buffer de 5 km (las radiobases de fuera también cubren dentro, y eso importa para dist_rb4g_km).
Entregable

pipeline/datos/radiobases_4g.gpkg con el campo operador.

Está hecho cuando

El conteo por operador cuadra con el archivo original de ARCOTEL y todos los puntos caen dentro del bbox de El Valle ampliado 5 km.

Sesión RF 3 - Las perillas del bosque

1.5 h Tyrone
  1. Sobre el ejemplo, barrer n_estimators en 5, 25, 100 y 500 y anotar el F1 de cada uno.
  2. Barrer max_depth en 2, 5, 10 y None, y min_samples_leaf en 1, 5 y 20.
  3. Graficar F1 frente a cada perilla y guardar la figura.
  4. Escribir la conclusión práctica: cuál perilla movió más el resultado y cuál casi nada.
Entregable

pipeline/figuras/rf_hiperparámetros_demo.png + conclusión en la bitácora.

Está hecho cuando

Puedes decir, sin dudar, cuál de las tres perillas controla el sobreajuste y cuál solo hace el cálculo más lento.

for n in [5,25,100,500]: RandomForestClassifier(n_estimators=n, random_state=42)

Para estudiar Popup 3.3 del roadmap, 'Ajustar los hiperparámetros' (/roadmap -> Etapa 3)

Jueves 24 de septiembre
Depurar las radiobases y entender el sobreajuste
3.5 h

1.3 Depurar duplicados y sectores

2.0 h Tyrone
  1. Detectar torres repetidas: varios registros a menos de 25 m son sectores de la misma estación, no estaciones distintas.
  2. Agrupar por cercanía y dejar una fila por emplazamiento con un campo n_sectores.
  3. Contar cuántos emplazamientos 4G quedan dentro de El Valle. Anotar el número: con esos emplazamientos se calibran los umbrales del etiquetado (riesgo R2).
Entregable

radiobases_4g.gpkg depurado + conteo de emplazamientos dentro de la parroquia.

Está hecho cuando

No quedan dos puntos a menos de 25 m y el número de emplazamientos dentro de El Valle está escrito en la bitácora.

gdf.geometry.buffer(25).unary_union  # o sklearn.cluster.DBSCAN(eps=25, min_samples=1)

Sesión RF 4 - Sobreajuste: verlo, no solo entenderlo

1.5 h Tyrone
  1. Entrenar el ejemplo con max_depth=None e imprimir el F1 en entrenamiento y en prueba. Anotar la diferencia.
  2. Repetir con max_depth=3. Anotar de nuevo.
  3. Hacer lo mismo con un solo árbol (n_estimators=1) y con 500.
  4. Escribir la regla práctica que acabas de comprobar: cuando train sube y test baja, el modelo esta memorizando.
Entregable

Tabla de 4 filas (train F1 / test F1) en la bitácora.

Está hecho cuando

Puedes mostrar con números propios por qué un árbol solo no sirve y el bosque sí.

modelo.score(X_train, y_train) vs modelo.score(X_test, y_test)
Viernes 25 de septiembre
Primera reunión y revisión visual en QGIS
3.5 h

Reunión 1 con el director

1.0 h Los dos
  1. Presentar este cronograma y pedir que valide el plazo del 6 de noviembre.
  2. Validar el alcance completo: las 3 mallas de celdas, un modelo por malla.
  3. Plantear la decisión pendiente: qué significa exactamente 'buen sitio' (criterio de etiquetado). Pedir que la respuesta llegue antes del 14 de octubre.
  4. Acordar que en cada reunión se enseña un producto, no un avance verbal.
Entregable

Acta de una página en Documentos/actas/2026-09-25.md.

Está hecho cuando

El acta tiene la lista de acuerdos y la fecha límite de la decisión de etiquetado.

1.4 Revisar las seis capas en QGIS

2.5 h Tyrone
  1. Crear el proyecto pipeline/qgis/el_valle.qgz con el CRS fijado a EPSG:32717.
  2. Cargar las seis capas y mirarlas superpuestas sobre el límite de la parroquia.
  3. Anotar los tres defectos clasicos: capas desplazadas (CRS mal declarado), geometrías inválidas y huecos de cobertura donde debería haber dato.
  4. Dejar la lista de defectos escrita; mañana se corrigen.
Entregable

pipeline/qgis/el_valle.qgz + salidas/defectos_capas.md.

Está hecho cuando

Las seis capas se ven alineadas sobre el límite y la lista de defectos está escrita con el nombre de la capa afectada.

Sabado 26 de septiembre
Corregir los defectos y empezar el script que lo rehace todo
3.5 h

1.4 Corregir lo detectado

1.0 h Tyrone
  1. Reparar geometrías inválidas (Vectorial > Herramientas de geometría > Corregir).
  2. Recortar todas las capas al límite de El Valle más 2 km.
  3. Revisar el DEM: huecos, valores absurdos y unidades (metros).
Entregable

Capas corregidas en datos/normalizado/.

Está hecho cuando

gdf.is_valid.all() devuelve True para todas las capas vectoriales y el DEM no tiene celdas con valores fuera del rango 2300-3400 m.

1.5 Escribir 01_normalizar.py

1.0 h Tyrone
  1. Un script que lea cada fuente cruda, la reproyecte a EPSG:32717, valide la geometría y la guarde en datos/normalizado/.
  2. Nada de pasos manuales: si hubo un arreglo a mano en QGIS, se traduce a código.
  3. Que imprima un resumen por capa: entidades, CRS, extensión.
Entregable

pipeline/scripts/01_normalizar.py.

Está hecho cuando

Borrando datos/normalizado/ y ejecutando el script, todo se regenera idéntico sin tocar QGIS.

python scripts/01_normalizar.py

Sesión RF 5 - Guardar, cargar y no perder la reproducibilidad

1.5 h Tyrone
  1. Guardar el modelo del ejemplo con joblib.dump y volver a cargarlo en otro script.
  2. Comprobar que el modelo cargado predice exactamente lo mismo.
  3. Montar el mismo flujo dentro de un Pipeline de scikit-learn.
  4. Anotar la regla: toda semilla se fija y se escribe en la memoria.
Entregable

pipeline/scripts/demo_joblib.py + nota en la bitácora.

Está hecho cuando

Dos ejecuciones distintas del script dan exactamente la misma predicción para la misma celda.

import joblib; joblib.dump(modelo, 'modelo.pkl'); joblib.load('modelo.pkl')

En paralelo, Freddy

Tareas guiadas y verificables que corren aparte: no descuentan de las 3.5 h diarias de la línea principal.

Instalar Radio Mobile y cargar el terreno de El Valle

3 h

Descargar Radio Mobile 11.6.x, instalar en Windows, bajar los mosaicos SRTM de 1 arcosegundo que cubren -3.05/-2.80 lat y -79.05/-78.85 lon, y configurar la carpeta de terreno en Options > Internet > SRTM. Centrar un mapa de 20x20 km en El Valle.

Entregable

Captura del mapa de El Valle con relieve visible + carpeta SRTM con los .hgt.

Está hecho cuando

Se abre un mapa de 20x20 km centrado en El Valle y el perfil de terreno entre dos puntos cualesquiera muestra altitudes entre 2400 y 3300 m.

Georreferenciar las comunidades del PDOT

4 h

Con la lista de comunidades que te pase Tyrone, buscar cada centro poblado en Google Maps / OSM, copiar lat-lon en grados decimales y pegarla en la columna correspondiente de la hoja. Si una comunidad no aparece, marcarla en rojo y seguir con la siguiente.

Entregable

Hoja poblacion_comunidades.csv con las columnas lat y lon llenas.

Está hecho cuando

Todas las filas tienen coordenadas o están marcadas en rojo; ninguna queda en blanco sin marcar, y todas las coordenadas caen dentro del rectángulo de El Valle.

S2

Producto 1, diagnóstico del déficit 4G y las tres mallas

Lunes 28 de septiembre a Sabado 3 de octubre · 6 días · 21.0 h

0 / 12

Objetivo de la semana: Cerrar la Etapa 1 con la base de datos geoespacial y dejar delimitado, con números, donde falta 4G en El Valle.

Lunes 28 de septiembre
Consolidar todo en un solo archivo
3.5 h

1.5 Construir el GeoPackage único

2.0 h Tyrone
  1. Escribir 02_construir_geodb.py: toma las capas normalizadas y las escribe como tablas de un único GeoPackage el_valle.gpkg.
  2. Una tabla por capa, con nombres homogeneos en minuscula y sin tildes.
  3. Añadir una tabla metadatos con fuente, fecha y CRS de cada capa.
Entregable

pipeline/datos/el_valle.gpkg.

Está hecho cuando

gpd.list_layers('el_valle.gpkg') lista las seis capas más metadatos, y todas declaran EPSG:32717.

python scripts/02_construir_geodb.py

1.5 Control de calidad automático

1.5 h Tyrone
  1. Añadir al script un bloque de QC: conteo por capa, CRS, extensión, porcentaje de nulos por columna y geometrías inválidas.
  2. Volcar el resultado a salidas/qc_base.csv.
  3. Revisar fila por fila: cualquier porcentaje de nulos superior al 5 % se investiga.
Entregable

pipeline/salidas/qc_base.csv.

Está hecho cuando

Ninguna capa tiene geometrías inválidas y todas las columnas criticas (población, operador, altura) tienen 0 % de nulos.

Martes 29 de septiembre
Cerrar la Etapa 1
3.5 h

Decisión: ¿las capas son consistentes y completas?

1.5 h Tyrone
  1. Pasar la lista de verificación del diagrama: misma proyección, cubren todo el límite, sin duplicados, nombres de atributos homogeneos, sin huecos de dato.
  2. Si algo falla, se vuelve a 1.4 hoy mismo (hay margen).
  3. Escribir la respuesta con evidencia: cada punto de la lista con su número.
Entregable

salidas/checklist_d-capas.md con las cinco comprobaciones respondidas.

Está hecho cuando

Las cinco comprobaciones están en verde y firmadas con la fecha.

PRODUCTO 1: base de datos geoespacial

1.0 h Tyrone
  1. Escribir el diccionario de datos: para cada tabla, cada campo con su tipo, unidad, rango y fuente.
  2. Etiquetar la versión (el_valle_v1.gpkg) y anotar la fecha de congelación.
  3. Hacer copia de respaldo fuera de la PC.
Entregable

datos/el_valle.gpkg + datos/DICCIONARIO.md. Primer producto del roadmap cerrado.

Está hecho cuando

Otra persona puede abrir el GeoPackage y entender qué es cada campo sin preguntarte.

Memoria 4.1: recopilación y estructuración de datos

1.0 h Tyrone
  1. Redactar la sección con lo que realmente hiciste, no con lo que planeabas hacer.
  2. Incluir la tabla del inventario de fuentes y el diccionario resumido.
  3. Citar ARCOTEL y el PDOT con el formato de referencias.bib.
Entregable

Sección 4.1 en Memoria/sections/04_Metodologia.tex.

Está hecho cuando

El capítulo compila sin errores y la tabla de fuentes aparece referenciada en el texto.

cd Memoria && pdflatex TFG.tex
Miercoles 30 de septiembre
Cuánta cobertura 4G hay hoy en El Valle
3.5 h

2.1 Diagnosticar la cobertura 4G por área

2.0 h Tyrone
  1. Cruzar las bandas de cobertura 4G de Claro, Movistar y CNT con el límite parroquial.
  2. Calcular, por operador y por nivel de señal, el área en km2 y el porcentaje de la parroquia.
  3. Calcular el mapa de 'mejor nivel entre operadoras' (el que un usuario podría conseguir cambiando de operadora).
Entregable

salidas/diagnostico_area.csv + capa mejor_nivel_4g.gpkg.

Está hecho cuando

Los porcentajes por operador suman coherentemente y el área total cruzada coincide con el área de la parroquia declarada por el límite oficial.

2.1 Diagnosticar la cobertura por población

1.5 h Tyrone
  1. Cruzar la capa de comunidades con el mapa de mejor nivel.
  2. Calcular cuánta gente vive bajo cada nivel de señal.
  3. Generar la figura de barras por comunidad que irá a la memoria.
Entregable

salidas/diagnostico_poblacion.csv + figuras/cobertura_por_comunidad.png.

Está hecho cuando

La suma de población de la tabla es igual al total parroquial, y la figura esta a 300 dpi con la leyenda legible.

Jueves 1 de octubre
Dibujar el déficit
3.5 h

2.2 Definir el umbral y generar la capa de déficit

2.0 h Tyrone
  1. Fijar por escrito el criterio operativo de 'sin 4G útil': RSRP por debajo de -120 dBm o ausencia de banda 4G, en las tres operadoras a la vez.
  2. Generar deficit_4g.gpkg como la zona de El Valle que cumple ese criterio.
  3. Justificar el umbral con una cita del marco teórico (no inventarlo).
Entregable

datos/deficit_4g.gpkg + párrafo de justificación del umbral.

Está hecho cuando

La capa cubre solo zonas donde ninguna de las tres operadoras alcanza el umbral, comprobado visualmente en tres puntos al azar.

2.2 Cuantificar el déficit

1.5 h Tyrone
  1. Medir el déficit en km2 y en habitantes.
  2. Comparar con lo que declara el PDOT sobre conectividad: ¿coincide o contradice?
  3. Preparar el mapa del déficit para enseñarlo mañana al director.
Entregable

salidas/deficit_resumen.csv + figuras/mapa_deficit.png.

Está hecho cuando

Tienes una frase del tipo 'X km2 (Y % de la parroquia) y Z habitantes sin 4G útil', con los números reales.

Viernes 2 de octubre
Reunión y las tres mallas
3.5 h

Reunión 2 con el director

1.0 h Los dos
  1. Enseñar el Producto 1 y el mapa de déficit.
  2. Validar el umbral de -120 dBm: es la decisión metodológica más delicada de la Etapa 2 y conviene que quede respaldada por el director.
  3. Recordar la decisión pendiente de etiquetado (vence el 14 de octubre).
Entregable

Acta en Documentos/actas/2026-10-02.md.

Está hecho cuando

El umbral queda aprobado por escrito o con una alternativa acordada.

2.3 Crear las tres mallas de celdas

2.5 h Tyrone
  1. Generar mallas regulares de 100 m, 250 m y 500 m recortadas al límite de El Valle.
  2. Dar a cada celda un identificador estable (id_celda) y guardar su centroide.
  3. Anotar el número de celdas de cada malla. Orden de magnitud esperado: ~4200, ~680 y ~170 para una parroquia de unos 42 km2.
  4. ALERTA: si la malla de 500 m baja de 200 celdas, queda marcada como sacrificable (riesgo R1): con tan pocas filas el modelo no puede aprender nada sólido.
Entregable

datos/malla_100.gpkg, malla_250.gpkg, malla_500.gpkg + conteos.

Está hecho cuando

Las tres mallas cubren el límite completo, ningún id_celda se repite y los tres conteos están anotados en la bitácora.

Sabado 3 de octubre
Las primeras cuatro variables
3.5 h

2.4 Grupo cobertura: las 4 variables de señal

3.5 h Tyrone
  1. deficit_4g: porcentaje del área de la celda con RSRP por debajo de -120 dBm.
  2. clase_4g: nivel de RSRP predominante dentro de la celda.
  3. dist_rb4g_km: distancia al emplazamiento 4G más cercano (incluidas las de fuera de la parroquia).
  4. n_rb4g_2km: cuántas radiobases 4G hay a menos de 2 km del centroide.
  5. Calcularlas para las tres mallas con el mismo script parametrizado por tamaño.
Entregable

salidas/var_cobertura_{100,250,500}.csv + scripts/03_var_cobertura.py.

Está hecho cuando

Ninguna celda tiene nulos en las cuatro columnas y el histograma de cada variable se reviso a ojo en busca de valores imposibles.

python scripts/03_var_cobertura.py --malla 100

En paralelo, Freddy

Tareas guiadas y verificables que corren aparte: no descuentan de las 3.5 h diarias de la línea principal.

Digitalizar la infraestructura clave

5 h

Sobre el mapa de OSM y la lista del PDOT, marcar como puntos: escuelas, centros de salud y urbanizaciones o lotizaciones de El Valle. Una fila por sitio, con nombre y tipo. Si dudas si algo es escuela o colegio, ponlo como escuela y anotalo.

Entregable

pipeline/datos/infraestructura_el_valle.csv con columnas nombre, tipo, lat, lon.

Está hecho cuando

Cada escuela y centro de salud que aparece en el PDOT esta en la tabla, y ningún punto cae fuera del límite de la parroquia.

Cargar las radiobases existentes en Radio Mobile

4 h

Con el archivo radiobases_4g.gpkg exportado a CSV, crear en Radio Mobile una unidad por radiobase con su latitud, longitud y altura de antena. Usar siempre las mismas unidades y el mismo sistema de coordenadas. Seguir la checklist paso a paso.

Entregable

Archivo .net de Radio Mobile con todas las radiobases cargadas.

Está hecho cuando

El número de unidades en Radio Mobile es igual al número de filas del CSV, y al hacer clic en una unidad su altitud coincide con la del terreno.

S3

Las 19 variables por celda

Lunes 5 de octubre a Sabado 10 de octubre · 6 días · 21.0 h

0 / 11

Objetivo de la semana: Terminar el sábado con tres tablas (una por malla) de 19 columnas, revisadas y sin nulos. Es la semana con más riesgo de atasco técnico.

Lunes 5 de octubre
Topografía: altura y pendiente
3.5 h

2.4 Altitud media, altitud máxima y pendiente

2.0 h Tyrone
  1. Con rasterstats sobre dem_el_valle_utm17s_30m.tif, calcular por celda alt_media_m y alt_max_m.
  2. Generar el raster de pendiente y promediarlo por celda -> pendiente_deg.
  3. Comprobar tres celdas a mano en QGIS contra el valor del script.
Entregable

salidas/var_topografia_a_{100,250,500}.csv.

Está hecho cuando

Las tres celdas comprobadas a mano coinciden con el script, y ninguna pendiente sale fuera del rango 0-60 grados.

from rasterstats import zonal_stats; zonal_stats(malla, dem, stats=['mean','max'])

2.4 Posición topográfica (TPI)

1.5 h Tyrone
  1. Entender primero que mide el TPI: la diferencia entre la altura de la celda y la media de su vecindario. Positivo = loma, negativo = hondonada, cerca de 0 = ladera o llano.
  2. Calcularlo con una ventana móvil sobre el DEM y promediarlo por celda.
  3. Pintarlo en QGIS y comprobar que las lomas conocidas salen en positivo.
Entregable

tpi_m anadida a la tabla de topografía + figura de control.

Está hecho cuando

Al pintar el TPI sobre el relieve, las cimas aparecen claras y los cauces oscuros: si sale al reves, el signo esta invertido.

Martes 6 de octubre
La variable cara: visibilidad
3.5 h

2.4 Visibilidad: cuánto terreno ve cada celda

3.5 h Tyrone
  1. Calcular el viewshed desde el centroide de cada celda (antena a 30 m) y medir el área visible en km2 -> visibilidad_km2.
  2. Empezar por la malla de 500 m (pocas celdas) para medir cuánto tarda una celda; multiplicar por 4200 antes de lanzar la de 100 m.
  3. Límite DE TIEMPO: si la proyección pasa de 3.5 h, parar y aplicar el plan B del riesgo R3 (calcular en 250 m e interpolar, o sustituir por TPI más altura relativa a 2 km). No se negocia: esta variable no vale un día de atraso.
Entregable

visibilidad_km2 en las mallas que hayan cabido + decisión anotada.

Está hecho cuando

O bien las tres mallas tienen la variable, o está escrito en la bitácora que se aplicó el plan B y por qué.

gdal_viewshed / GRASS r.viewshed sobre el DEM, por lotes
Miercoles 7 de octubre
Beneficio social: repartir la población
3.5 h

2.4 Población y densidad por celda

2.0 h Tyrone
  1. Repartir la población de cada comunidad sobre el territorio con el método del círculo de área equivalente que describe el roadmap.
  2. Ponderar por el área de solape entre el círculo y cada celda.
  3. Obtener poblacion y densidad_hab_km2.
  4. Comprobación obligatoria: la suma de poblacion sobre todas las celdas debe dar el total parroquial.
Entregable

salidas/var_social_a_{100,250,500}.csv.

Está hecho cuando

La suma de la columna población en cada malla difiere menos del 2 % del total del PDOT; si no, el reparto tiene un error de área.

2.4 Población sin cobertura 4G

1.5 h Tyrone
  1. pob_sin_4g = población de la celda x fracción del área de la celda en déficit.
  2. Sumar sobre toda la parroquia y contrastar con el número del día 1 de octubre: deben parecerse.
  3. Si difieren mucho, el error esta en el reparto de población o en la capa de déficit.
Entregable

pob_sin_4g anadida.

Está hecho cuando

El total de pob_sin_4g esta dentro del 10 % del valor calculado el 1 de octubre por otro camino.

Jueves 8 de octubre
Equipamientos y validación cruzada espacial
3.5 h

2.4 Escuelas, salud y urbanizaciones

2.0 h Tyrone
  1. Cruzar la capa de infraestructura de Freddy con cada malla.
  2. Contar por celda: n_escuelas, n_salud, n_urbanizaciones.
  3. Revisar que ninguna escuela quede fuera de todas las celdas (error de recorte).
Entregable

n_escuelas, n_salud y n_urbanizaciones en la tabla social.

Está hecho cuando

La suma de n_escuelas sobre todas las celdas es igual al número de escuelas de la capa original. Lo mismo para salud y urbanizaciones.

Sesión RF 6 - Validación cruzada espacial

1.5 h Tyrone
  1. Entender el problema con un ejemplo: si dos celdas vecinas caen una en entrenamiento y otra en prueba, el modelo 'ya vio' la respuesta y el F1 sale inflado.
  2. Implementar GroupKFold sobre el ejemplo sintético usando bloques de 1 km como grupos.
  3. Comparar el F1 con KFold normal frente a GroupKFold: anotar cuánto baja.
  4. Escribir la conclusión: cuál de los dos números iría a la memoria y por qué.
Entregable

Comparación KFold vs GroupKFold escrita en la bitácora.

Está hecho cuando

Puedes justificar en una frase, ante el tribunal, por qué no usaste un split aleatorio corriente.

from sklearn.model_selection import GroupKFold, cross_val_score

Para estudiar Popup 2.8 del roadmap, 'Balancear y dividir cada tabla' (/roadmap -> Etapa 2)

Viernes 9 de octubre
Reunión y viabilidad de instalación
3.5 h

Reunión 3 con el director

1.0 h Los dos
  1. Enseñar las 19 variables calculadas y las tres mallas.
  2. CERRAR HOY la definición de 'buen sitio' (la decisión C5): sin ella no se puede etiquetar el miércoles 14.
  3. Enseñar el mapa de idoneidad de prueba si ya lo tienes.
Entregable

Acta con la definición de 'buen sitio' escrita y aprobada.

Está hecho cuando

La definición esta en el acta con sus umbrales, no como idea general.

2.4 Grupo viabilidad: las 4 últimas variables

2.5 h Tyrone
  1. dist_via_m: distancia del centroide a la vía más cercana (capa de Freddy).
  2. uso_suelo: clase dominante dentro de la celda.
  3. conductividad_S_m: traducir la clase de uso de suelo a conductividad y permitividad con la tabla de SUPERTEL; dejar la tabla de conversión documentada.
  4. exclusion: marcar con 1 las celdas donde no se puede construir (cauces, pendientes extremas, áreas protegidas).
Entregable

salidas/var_viabilidad_{100,250,500}.csv + tabla de conversión documentada.

Está hecho cuando

Ninguna celda tiene uso_suelo vacio y la tabla de conversión tiene una fila por clase de suelo presente en El Valle.

Sabado 10 de octubre
Juntar las 19 columnas
3.5 h

2.4 Consolidar las tres tablas de variables

2.0 h Tyrone
  1. Unir los cuatro grupos por id_celda para cada malla.
  2. Resultado: tabla_variables_{100,250,500}.csv con id_celda, x, y y las 19 variables.
  3. Fijar el orden de columnas y los nombres definitivos: a partir de aquí no se renombra nada.
Entregable

datos/tabla_variables_{100,250,500}.csv.

Está hecho cuando

Las tres tablas tienen exactamente las mismas 22 columnas en el mismo orden, y el número de filas coincide con el de celdas de cada malla.

2.4 Control de calidad de las variables

1.5 h Tyrone
  1. Buscar nulos, rangos imposibles y celdas de borde con área parcial.
  2. Decidir y documentar que se hace con las celdas de borde: descartarlas o normalizar sus variables por área.
  3. Guardar el informe de QC.
Entregable

salidas/qc_variables.csv + decisión sobre celdas de borde.

Está hecho cuando

Cero nulos en las 19 columnas de las tres tablas, y la regla de celdas de borde está escrita.

En paralelo, Freddy

Tareas guiadas y verificables que corren aparte: no descuentan de las 3.5 h diarias de la línea principal.

Digitalizar la red vial de El Valle

5 h

Descargar de OSM las vías de El Valle con el complemento QuickOSM de QGIS (key=highway). Revisar que no falte ninguna vía principal comparando con el mapa del PDOT. Exportar a GeoPackage en EPSG:32717. No editar geometrías: solo descargar, recortar al límite más 2 km y verificar.

Entregable

pipeline/datos/vias_el_valle.gpkg.

Está hecho cuando

Las vías cubren toda la parroquia, la capa está en EPSG:32717 y al superponerla sobre una imagen satelital las líneas caen sobre las carreteras.

Exportar los mapas de QGIS a figuras de la memoria

3 h

Con los proyectos QGIS ya armados, exportar cada mapa a PNG de 300 dpi usando el mismo Diseño de impresión: titulo, escala gráfica, flecha de norte y leyenda. Guardar en Memoria/fig/ con nombres en minuscula y sin espacios.

Entregable

Figuras del diagnóstico y del déficit listas en Memoria/fig/.

Está hecho cuando

Cada PNG abre a 300 dpi, tiene escala y norte, y su nombre sigue la convención de Memoria/ESTILO_FIGURAS.md.

S4

Explorar, etiquetar y construir las tres tablas de entrenamiento

Lunes 12 de octubre a Sabado 17 de octubre · 6 días · 21.0 h

0 / 12

Objetivo de la semana: Llegar al sábado con el Producto 2 cerrado: tres tablas (una por malla) balanceadas y divididas, listas para entrenar.

Lunes 12 de octubre
Mirar los datos antes de modelar
3.5 h

2.5 Estadísticos descriptivos e histogramas

2.0 h Tyrone
  1. Para cada variable y cada malla: mínimo, máximo, media, mediana, desviación y percentiles 5 y 95.
  2. Un histograma por variable, en una rejilla de figuras.
  3. Marcar las variables con distribuciones muy sesgadas: son candidatas a transformación logarítmica.
Entregable

salidas/exploratorio_descriptivos.csv + figuras/histogramas_{malla}.png.

Está hecho cuando

Tienes una frase por variable describiendo su forma, y las sesgadas están marcadas.

df.describe(percentiles=[.05,.25,.5,.75,.95])

2.5 Matriz de correlación

1.5 h Tyrone
  1. Calcular la correlación de Spearman entre las 19 variables (Spearman y no Pearson: no supone relación lineal).
  2. Dibujar el mapa de calor y ordenarlo por agrupamiento.
  3. Listar todos los pares con |rho| mayor que 0.8 para revisarlos mañana.
Entregable

figuras/correlacion_{malla}.png + lista de pares correlacionados.

Está hecho cuando

La figura es legible con las 19 etiquetas y la lista de pares está escrita.

df.corr(method='spearman')
Martes 13 de octubre
Quitar lo que sobra
3.5 h

Decisión: ¿hay variables que dicen casi lo mismo?

1.5 h Tyrone
  1. Aplicar la regla del diagrama: |rho| mayor que 0.9 significa que una de las dos sobra.
  2. Para cada par, decidir cuál se queda con un criterio escrito: la más interpretable para un ingeniero de telecomunicaciones.
  3. Ejemplo típico: alt_media_m y alt_max_m suelen ir juntas.
Entregable

salidas/decision_redundantes.md con cada par y la variable elegida.

Está hecho cuando

Cada par correlacionado tiene una decisión con su justificación de una línea.

2.6 Quitar redundancias y recalcular p

2.0 h Tyrone
  1. Eliminar las columnas descartadas de las tres tablas.
  2. Anotar el nuevo número de variables p y recalcular m = raíz(p), que es lo que usara el bosque en cada nodo.
  3. Guardar las tablas reducidas SIN borrar las completas: el 3.7 comparara ambas.
Entregable

datos/tabla_variables_{malla}_reducida.csv + valor de p y m anotados.

Está hecho cuando

Las tablas reducidas tienen p columnas de variables y el valor de m está escrito en la bitácora para citarlo en la memoria.

Miercoles 14 de octubre
Etiquetar con la regla calibrada
3.5 h

2.7 Escribir la definición formal de 'buen sitio'

1.0 h Tyrone
  1. Pasar a texto, con umbrales numéricos, lo acordado con el director el 9 de octubre.
  2. Esta definición es la bisagra de toda la tesis: si cambia después, hay que reentrenar todo.
  3. Guardarla como sección de la memoria, no solo como nota.
Entregable

Sección 4.2.3 de la memoria con la definición y sus umbrales.

Está hecho cuando

La definición se puede programar sin ambigüedad: cada condición tiene variable, operador y número.

2.7 Calibrar la regla con las radiobases existentes y etiquetar

2.5 h Tyrone
  1. Medir sobre cada emplazamiento 4G existente la pendiente, la distancia a la vía más cercana y la población de su entorno: ese conjunto de valores es el perfil de sitio viable que las operadoras ya validaron construyendo.
  2. Sacar los umbrales de esas distribuciones: percentil 90 para la pendiente y la distancia a la vía, percentil 10 para la población. Los fija la realidad, no tú.
  3. Etiquetar con 1 las celdas con déficit 4G alto que caen dentro del perfil, y con 0 el resto, en las tres mallas.
  4. CONTROL DE RIESGO R2: contar los positivos de cada malla. Si bajan del 5 % de las celdas, ampliar los percentiles (95 y 5) y documentar el cambio.
Entregable

datos/etiquetas_{malla}.csv + tabla de umbrales con el percentil que los origina.

Está hecho cuando

Cada malla tiene su conteo de 1 y 0 anotado, cada umbral dice de qué percentil salió y el porcentaje de positivos está entre el 5 % y el 30 %.

Jueves 15 de octubre
Probar los umbrales y cerrar el Producto 2
3.5 h

2.7 Sensibilidad de los umbrales del etiquetado

2.0 h Tyrone
  1. Repetir el etiquetado con percentiles más anchos (95 y 5) y más estrechos (85 y 15).
  2. Anotar cuántas celdas cambian de etiqueta en cada caso: si el mapa de positivos aguanta, la regla es robusta, y eso se defiende en la memoria.
  3. Elegir el juego de percentiles definitivo y dejar escrito por qué.
  4. Esta prueba ocupa el lugar de la vieja comparación entre dos estrategias: ahora hay una sola regla, pero calibrada y con su análisis de sensibilidad.
Entregable

salidas/sensibilidad_umbrales.csv + un párrafo de conclusión en la bitácora.

Está hecho cuando

Para cada juego de percentiles está el número de positivos por malla y el porcentaje de celdas que cambian de etiqueta frente al caso base.

PRODUCTO 2: las tres tablas de entrenamiento

1.5 h Tyrone
  1. Unir variables y etiqueta en una tabla por malla: tres tablas en total.
  2. Nombrarlas con una convención fija: entrenamiento_{malla}.csv.
  3. Tabla resumen con filas, positivos, negativos y porcentaje de positivos de cada una.
Entregable

Las tres tablas + salidas/resumen_tablas.csv. Segundo producto cerrado.

Está hecho cuando

Existen exactamente tres archivos, todos con la columna y binaria y sin nulos.

Viernes 16 de octubre
Reunión y preparar el examen del modelo
3.5 h

Reunión 4 con el director

1.0 h Los dos
  1. Enseñar el Producto 2 y el balance de clases de cada tabla.
  2. Discutir el riesgo R2 si alguna malla quedó con pocos positivos, y enseñar la prueba de sensibilidad de los umbrales.
  3. Avisar de que la semana que viene es la del modelo: si hace falta una consulta extra, pedirla ahora.
Entregable

Acta en Documentos/actas/2026-10-16.md.

Está hecho cuando

El acta recoge la postura del director sobre el balance de clases.

2.8 Balancear y dividir las tres tablas

2.5 h Tyrone
  1. Compensar el desbalance con class_weight='balanced' (y dejar anotado por qué no se usa sobremuestreo).
  2. Apartar el 30 % de prueba de forma estratificada y con semilla fija.
  3. Construir los grupos espaciales: bloques de 1 km que serviran de groups en la validación cruzada.
  4. Guardar los índices del split en disco: el examen final debe ser el mismo para las tres mallas.
Entregable

datos/splits/{malla}_train.csv y _test.csv + bloques de 1 km.

Está hecho cuando

Las tres mallas usan el mismo procedimiento y la misma semilla, y ninguna celda aparece a la vez en train y en test.

from sklearn.model_selection import train_test_split  # stratify=y, random_state=42
Sabado 17 de octubre
Escribir lo hecho y ver el primer mapa
3.5 h

Memoria 4.2: diagnóstico, mallas y variables

2.0 h Tyrone
  1. Redactar con las tablas y figuras que ya existen: nada de escribir primero y generar después.
  2. Incluir la tabla de las 19 variables con su definición, unidad y fuente.
  3. Incluir la justificación del umbral de déficit y de los umbrales de etiquetado.
Entregable

Sección 4.2 completa en Memoria/sections/04_Metodologia.tex.

Está hecho cuando

El capítulo compila, todas las figuras citadas existen y la tabla de variables tiene las 19 filas.

cd Memoria && pdflatex TFG.tex && bibtex TFG && pdflatex TFG.tex

Sesión RF 7 - Del DataFrame al mapa

1.5 h Tyrone
  1. Entrenar un Random Forest rápido sobre entrenamiento_250.csv (sin ajustar nada).
  2. Usar predict_proba para sacar la probabilidad de clase 1 de cada celda.
  3. Unir esa probabilidad a la malla y pintarla en QGIS con una rampa de color.
  4. Mirar el mapa: ¿tiene sentido físico? ¿Las zonas altas del ranking coinciden con donde intuyes que falta cobertura?
Entregable

figuras/idoneidad_prueba.png - tu primer mapa de idoneidad.

Está hecho cuando

El mapa existe y puedes explicar en voz alta por qué una zona concreta salio alta y otra baja.

proba = modelo.predict_proba(X)[:, 1]

En paralelo, Freddy

Tareas guiadas y verificables que corren aparte: no descuentan de las 3.5 h diarias de la línea principal.

Cargar los tres escenarios base en Radio Mobile

5 h

En el archivo de Radio Mobile ya montado, configurar las propiedades de red: banda LTE (1900 MHz salvo que Tyrone indique otra), potencia, altura y ganancia según la tabla que te pase. Guardar tres copias del archivo, una por escenario, aún vacias.

Entregable

Tres archivos .net nombrados escenario0, escenario1 y escenario2.

Está hecho cuando

Los tres archivos abren sin error y las propiedades de red son idénticas en los tres (solo cambian las unidades que se añadirán después).

Revisar la ortografía y las referencias cruzadas del capítulo 4

3 h

Leer el capítulo 4 de la memoria buscando solo tres cosas: faltas de ortografía, figuras citadas en el texto que no existen, y tablas sin título. Anotar cada hallazgo con el número de línea. No corregir el contenido técnico.

Entregable

Lista de hallazgos en Documentos/revisiones/cap4_freddy.md.

Está hecho cuando

Cada hallazgo tiene número de línea y cita textual; la lista está ordenada por línea.

S5

Random Forest: las tres mallas y los Productos 3 y 4

Lunes 19 de octubre a Sabado 24 de octubre · 6 días · 21.0 h

0 / 14

Objetivo de la semana: Cerrar la Etapa 3 completa: tres modelos entrenados y comparados, uno por malla, modelo ganador elegido, mapa de idoneidad y ubicaciones recomendadas.

Los datos son pequenos (la malla más grande ronda las 4200 filas), así que el cuello de botella NO es el computo: es entender e interpretar. Todo se entrena en la PC de 16 GB, nunca en el VPS.

Lunes 19 de octubre
Montar el experimento y la línea de partida
3.5 h

3.1 Escribir el bucle de las tres mallas

2.0 h Tyrone
  1. 04_experimento.py: un bucle sobre las tres mallas que para cada una entrena, evalua y añade una fila a un registro CSV.
  2. Que el script sea reanudable: si ya existe la fila de una malla, la salta.
  3. Que guarde el modelo de cada malla en salidas/modelos/.
  4. Con una sola regla de etiquetado el registro tiene tres filas, así que deja la cabecera lista para copiarla tal cual a la tabla de la memoria.
Entregable

scripts/04_experimento.py + salidas/registro_mallas.csv vacio con cabecera.

Está hecho cuando

El script corre de principio a fin sobre una sola malla de prueba sin errores.

python scripts/04_experimento.py --solo 250

3.2 Entrenar el modelo base de las tres mallas

1.5 h Tyrone
  1. Bosque con B = 100 árboles, m = raíz(p) y criterio de Gini. Sin tocar nada más.
  2. Evaluar con la misma validación espacial que usará el 3.3: esa es la 'ronda 0'.
  3. Anotar el F1 base de cada malla: es el número contra el que se mide todo lo que venga después.
Entregable

Tres filas de 'ronda 0' en registro_mallas.csv.

Está hecho cuando

Las tres mallas tienen su F1 base anotado, y ninguno es sospechosamente perfecto (un F1 de 0.99 casi siempre significa fuga de información).

RandomForestClassifier(n_estimators=100, max_features='sqrt', class_weight='balanced', random_state=42)
Martes 20 de octubre
Ajustar las perillas
3.5 h

3.3 Búsqueda de hiperparámetros con validación espacial

2.5 h Tyrone
  1. Rejilla: n_estimators (100, 300, 500), max_depth (5, 10, 20, None), min_samples_leaf (1, 5, 10) y max_features ('sqrt', 0.3, 0.5).
  2. Validación con GroupKFold usando los bloques de 1 km como grupos (lo que practicaste en la sesión RF 6).
  3. Métrica de selección: F1 de la clase 1. No exactitud.
  4. Mientras corre, ir escribiendo en la memoria la descripción del procedimiento: el tiempo de computo no es tiempo perdido.
Entregable

salidas/mejores_hiperparámetros.csv con una fila por malla.

Está hecho cuando

Las tres mallas tienen sus mejores hiperparámetros guardados, y para cada una está anotado cuánto subió el F1 frente a la ronda 0.

GridSearchCV(rf, grid, cv=GroupKFold(5), scoring='f1', n_jobs=-1)

Memoria 4.3: el procedimiento de ajuste, escrito mientras corre la búsqueda

1.0 h Tyrone
  1. Describir la rejilla de hiperparámetros, la validación cruzada espacial y la métrica de selección.
  2. Dejar la tabla de hiperparámetros con su cabecera lista para rellenar.
  3. Es la hora que libera pasar de seis modelos a tres: se gasta en escribir.
Entregable

Subsección 4.3 del capítulo 4 con el procedimiento descrito.

Está hecho cuando

El texto explica la rejilla y por qué la validación es espacial, y compila.

Miercoles 21 de octubre
El examen final
3.5 h

3.4 Entrenar el bosque final de cada malla

1.0 h Tyrone
  1. Reentrenar con el 70 % completo usando los mejores hiperparámetros.
  2. Guardar cada modelo con joblib y su ficha: hiperparámetros, p, m, semilla, fecha.
  3. Comprobar que el modelo cargado de disco predice igual que el recien entrenado.
Entregable

Tres modelos en salidas/modelos/ con su ficha.

Está hecho cuando

Cada modelo carga y reproduce la misma predicción, y su ficha esta completa.

3.5 Evaluar con el 30 % que el modelo nunca vio

2.0 h Tyrone
  1. Calcular exactitud, precisión, recall, F1 y AUC de cada malla.
  2. Dibujar la matriz de confusión de cada una.
  3. Interpretar, no solo reportar: ¿qué tipo de error comete cada modelo?
  4. Con tres modelos en vez de seis da tiempo a mirar los fallos uno a uno: anotar en qué zonas de El Valle se equivoca cada uno.
Entregable

salidas/evaluacion_test.csv + tres matrices de confusión.

Está hecho cuando

Cada malla tiene las cinco métricas y puedes explicar su matriz de confusión con las palabras de la sesión RF 2.

Decisión: ¿el F1 subió al menos 0.01?

0.5 h Tyrone
  1. Comparar el F1 ajustado con el de la ronda 0 de cada malla.
  2. Si subió más de 0.01, se puede intentar otra ronda de ajuste; si no, se cierra.
  3. Anotar la decisión por malla: el diagrama tiene ese bucle y hay que justificar cuántas vueltas se dieron.
Entregable

Columna rondas completada en el registro.

Está hecho cuando

Las tres filas dicen cuántas rondas se hicieron y por qué se paro.

Jueves 22 de octubre
Que variables mandan de verdad
3.5 h

3.6 Importancia de las variables por permutación

2.0 h Tyrone
  1. Calcular la importancia por permutación sobre el conjunto de prueba (no la de Gini: esa favorece a las variables con muchos valores distintos).
  2. Hacerlo en las tres mallas: al bajar de seis modelos a tres, la permutación cabe en el plan y deja de ser un recorte probable.
  3. Comparar las dos para el modelo ganador y comentar la diferencia: es un buen párrafo de discusión para la memoria.
  4. Graficar el ranking de variables.
Entregable

figuras/importancia_{malla}.png + tabla de importancias.

Está hecho cuando

El ranking está calculado por permutación y tienes escrita una frase explicando la diferencia con la importancia de Gini.

from sklearn.inspection import permutation_importance

3.7 Simplificar el modelo y comparar

1.5 h Tyrone
  1. Reentrenar usando solo las k variables más importantes (probar k = 5 y k = 10).
  2. Comparar el F1 del modelo simplificado con el completo.
  3. Si el simplificado empata, gana el simplificado: es más fácil de defender y de explicar a una operadora.
  4. SACRIFICABLE: si vas justo de tiempo, hacer esto solo para la malla ganadora (ahorra 1 h).
Entregable

salidas/comparacion_reduccion.csv.

Está hecho cuando

Para cada malla evaluada esta el F1 con todas las variables y con las k mejores.

Viernes 23 de octubre
Elegir el ganador
3.5 h

Reunión 5 con el director

1.0 h Los dos
  1. Enseñar la tabla comparativa de las tres mallas.
  2. Discutir cuál gana y con qué criterio; que la elección quede respaldada.
  3. Avisar del calendario de la Etapa 4: la semana que viene se simula.
Entregable

Acta en Documentos/actas/2026-10-23.md.

Está hecho cuando

El criterio de elección del modelo queda por escrito ANTES de anunciar el ganador.

3.8 y decisión: ¿ya están las tres mallas?

1.0 h Tyrone
  1. Completar el registro: malla, p, hiperparámetros, F1 base, F1 final, AUC, variables más importantes.
  2. Comprobar que las tres filas están y ninguna quedó a medias.
  3. Esta tabla va integra a la memoria: es el corazon del capítulo de resultados.
Entregable

salidas/registro_mallas.csv completo, tres filas.

Está hecho cuando

Las tres filas tienen todas las columnas llenas.

3.9 Elegir el mejor modelo

1.5 h Tyrone
  1. Aplicar el criterio escrito: F1 en prueba, estabilidad entre pliegues de la validación cruzada e interpretabilidad.
  2. Desempatar con la desviación del F1 entre pliegues: un modelo estable vale más que uno brillante e errático.
  3. Congelar el modelo ganador como modelo_final.pkl.
Entregable

salidas/modelos/modelo_final.pkl + justificación de la elección.

Está hecho cuando

El modelo ganador esta congelado y la justificación cita los números de la tabla.

Sabado 24 de octubre
Los productos 3 y 4: el día más importante del plan
3.5 h

PRODUCTO 3: mapa de idoneidad

2.0 h Tyrone
  1. Aplicar el modelo ganador a TODAS las celdas de su malla con predict_proba.
  2. Guardar la nota de 0 a 1 por celda en idoneidad.gpkg.
  3. Preparar el mapa con una rampa de color defendible y su leyenda.
Entregable

datos/idoneidad.gpkg + figuras/mapa_idoneidad.png. Tercer producto.

Está hecho cuando

Toda celda de la malla tiene nota, y el mapa se lee sin explicaciones adicionales.

3.10 y 3.11: filtrar, rankear y PRODUCTO 4

1.5 h Tyrone
  1. Filtrar: fuera las celdas que ya tienen buena cobertura 4G y las de exclusión.
  2. Ordenar por nota y elegir las N mejores imponiendo una separación mínima entre sitios (1 km es un punto de partida razonable; justificarlo).
  3. Fijar N: entre 3 y 6 sitios es lo manejable para simular en Radio Mobile.
  4. Exportar las coordenadas en UTM y en grados, que es lo que necesita Radio Mobile.
Entregable

datos/ubicaciones_recomendadas.gpkg + CSV con lat-lon. Cuarto producto.

Está hecho cuando

HITO DE CONTROL DEL PLAN: si hoy no existe este archivo, la Etapa 4 no cabe completa y hay que activar la lista de sacrificables.

En paralelo, Freddy

Tareas guiadas y verificables que corren aparte: no descuentan de las 3.5 h diarias de la línea principal.

Simular el Escenario 0 en Radio Mobile

6 h

Con el archivo escenario0.net, ejecutar la cobertura combinada de todas las radiobases existentes y exportar el mapa de señal como imagen georreferenciada. Seguir la checklist: mismo umbral, misma resolución y mismo rango de colores en todas las corridas. Anotar cada parámetro usado en una hoja.

Entregable

Raster del Escenario 0 exportado + hoja de parámetros.

Está hecho cuando

El raster abre en QGIS encima de El Valle en la posición correcta y la hoja de parámetros tiene los valores de potencia, altura, ganancia y umbral.

S6

Radio Mobile: la prueba de fuego del modelo

Lunes 26 de octubre a Sabado 31 de octubre · 6 días · 21.0 h

0 / 11

Objetivo de la semana: Demostrar con simulación que los sitios del modelo cubren más área y más gente que la planificación tradicional y que el azar.

Esta semana Freddy trabaja a la par en Radio Mobile: él ya conoce el programa y es su aportación más útil del proyecto. Tyrone lleva las métricas y la comparación.

Lunes 26 de octubre
La simulación del presente
3.5 h

4.2 Revisar y cerrar el Escenario 0

2.0 h Los dos
  1. Revisar con Freddy la simulación de la cobertura actual: parámetros, unidades y umbral.
  2. Exportar el raster a EPSG:32717 y cargarlo en QGIS junto al mapa de ARCOTEL.
  3. Anotar los parámetros usados: van tal cual a la memoria.
Entregable

Raster del Escenario 0 en QGIS + tabla de parámetros de simulación.

Está hecho cuando

El raster esta georreferenciado correctamente: los bordes de la parroquia coinciden con el límite oficial.

Decisión: ¿la simulación coincide con el mapa de la operadora?

1.5 h Tyrone
  1. Cruzar el raster simulado con la capa de cobertura de ARCOTEL y medir el porcentaje de área donde ambos coinciden.
  2. Fijar de antemano que porcentaje se considera aceptable (un 70-75 % de coincidencia es realista para Longley-Rice sin datos de antena exactos).
  3. Si no llega, mañana se calibra.
Entregable

salidas/concordancia_escenario0.csv con el porcentaje de coincidencia.

Está hecho cuando

Tienes el porcentaje calculado y el umbral de aceptación escrito de antemano.

Martes 27 de octubre
Calibrar hasta que se parezca
3.5 h

4.3 Calibrar la simulación

3.5 h Los dos
  1. Ajustar SOLO entradas con sentido físico: potencia de transmisión, altura de antena, ganancia, pérdidas de línea, y el porcentaje de tiempo y ubicaciones de Longley-Rice.
  2. Una variable a la vez, y cada iteración a una fila de la tabla de calibración.
  3. Nunca retocar el resultado: se corrigen las entradas y se vuelve a simular.
  4. Límite: máximo 8 iteraciones. Si a la octava no mejora, se aplica el plan B del riesgo R4 (documentar la discrepancia y comparar escenarios entre si, que es lo que de verdad responde la pregunta de investigación).
Entregable

salidas/calibracion.csv con una fila por iteración + simulación calibrada congelada.

Está hecho cuando

La tabla de calibración tiene todas las iteraciones y está escrito con que parámetros se congeló la simulación.

Miercoles 28 de octubre
Los escenarios que compiten
3.5 h

4.4 Escenario 1: los sitios del modelo

2.0 h Tyrone
  1. Pasar a Freddy las N coordenadas del Producto 4 en el formato que traga Radio Mobile.
  2. Definir los parámetros de las nuevas radiobases: idénticos a los del Escenario 0 calibrado. Solo cambia la posición.
  3. Supervisar la corrida y revisar el raster.
Entregable

Raster del Escenario 1 + tabla de las N ubicaciones simuladas.

Está hecho cuando

Las N unidades nuevas están en las coordenadas exactas del Producto 4, comprobado una por una.

4.4 Escenario 2: planificación tradicional

1.5 h Tyrone
  1. Elegir N sitios con el criterio clásico: los puntos más altos dentro de la zona de déficit, con la misma separación mínima que uso el ranking.
  2. Programarlo, no elegirlos a ojo: el criterio tiene que ser reproducible y defendible ante el tribunal.
  3. Pasar las coordenadas a Freddy.
Entregable

datos/sitios_tradicional.gpkg + script que los genera.

Está hecho cuando

Los N sitios salen de un script con criterio explicito y cumplen la separación mínima.

Jueves 29 de octubre
El control y las métricas
3.5 h

4.4 Escenario 3: el control aleatorio

1.0 h Tyrone
  1. N sitios al azar dentro de la zona de déficit, con la misma separación mínima.
  2. Idealmente tres sorteos con semillas distintas y promediar; si el tiempo aprieta, uno solo (SACRIFICABLE, ahorra 1 h).
  3. Este escenario es el que demuestra que el modelo aporta algo más que 'poner antenas donde falta señal'.
Entregable

datos/sitios_aleatorios.gpkg + semilla anotada.

Está hecho cuando

Los sitios aleatorios están dentro del déficit y la semilla está escrita para que el resultado sea reproducible.

4.5 Medir los cuatro escenarios

2.5 h Tyrone
  1. Para cada escenario: km2 con RSRP por encima del umbral útil, población cubierta, escuelas y centros de salud con cobertura, y mejora media de señal por comunidad.
  2. Todo con el mismo script y el mismo umbral, para que la comparación sea limpia.
  3. Calcular también la mejora respecto al Escenario 0, que es lo que se comunica.
Entregable

salidas/metricas_escenarios.csv (4 escenarios x 5 métricas).

Está hecho cuando

Las cuatro filas están completas y el Escenario 0 sirve de línea base para los porcentajes de mejora.

Viernes 30 de octubre
El veredicto
3.5 h

Reunión 6 con el director

1.0 h Los dos
  1. Enseñar los Productos 3 y 4 y la comparación de escenarios.
  2. Si el Escenario 1 no gana, discutir hoy mismo la interpretación: un resultado negativo bien explicado es una tesis válida, uno escondido no.
  3. Confirmar la fecha y el formato de la entrega del 6 de noviembre.
Entregable

Acta en Documentos/actas/2026-10-30.md.

Está hecho cuando

Queda decidido si se reajusta el modelo o si se documenta el resultado tal cual.

4.6 Comparar y decidir

2.5 h Tyrone
  1. Tabla y figura comparativa de los cuatro escenarios.
  2. Aplicar el criterio: ¿el Escenario 1 cubre más área Y más población que el 2 y el 3?
  3. Si gana: se cierra la Etapa 4 y se escribe el resultado.
  4. Si no gana: el diagrama manda al conector A (volver al 3.3). Con el tiempo que queda, eso significa una sola pasada de reajuste, hoy mismo, tocando el etiquetado o la separación mínima del ranking. Si tampoco, se documenta como hallazgo y se discute por qué, que es perfectamente defendible.
Entregable

figuras/comparacion_escenarios.png + decisión escrita.

Está hecho cuando

La figura compara los cuatro escenarios en las mismas unidades y la decisión del rombo esta respondida con números.

Sabado 31 de octubre
Escribir mientras esta fresco
3.5 h

Memoria 4.3 a 4.5 y arranque del capítulo 5

2.0 h Tyrone
  1. Redactar el modelo predictivo y la simulación comparativa en el capítulo 4.
  2. Volcar al capítulo 5 las tablas que ya existen: registro de las tres mallas, evaluación, métricas de escenarios.
  3. Dejar los huecos de discusión marcados con TODO para el miércoles.
Entregable

Capítulo 4 cerrado y esqueleto del capítulo 5 con sus tablas.

Está hecho cuando

El capítulo 4 esta completo de 4.1 a 4.5 y compila sin errores ni referencias rotas.

5.1 Exportar los resultados a formatos web

1.5 h Tyrone
  1. Reproyectar a EPSG:4326 lo que va al navegador.
  2. Capas pequeñas (ubicaciones, comunidades) a GeoJSON; la malla de idoneidad, a PMTiles si pesa.
  3. OJO CON EL VPS: generar las teselas en la PC de 16 GB y subir el archivo ya hecho. El servidor de 1 vCPU no debe generar nada.
Entregable

cobertura-azuay/data/processed/ con idoneidad, ubicaciones y escenarios.

Está hecho cuando

Los archivos cargan en QGIS en la posición correcta y ninguno pasa de lo que el disco del VPS puede servir con holgura.

En paralelo, Freddy

Tareas guiadas y verificables que corren aparte: no descuentan de las 3.5 h diarias de la línea principal.

Ejecutar las simulaciones de los escenarios 1, 2 y 3

8 h

Con los tres juegos de coordenadas que te pase Tyrone, añadir las nuevas unidades a cada copia del archivo de Radio Mobile, ejecutar la cobertura combinada y exportar el raster con EXACTAMENTE los mismos parámetros del Escenario 0 calibrado. No cambiar ningún ajuste entre escenarios: si cambia algo, la comparación no vale.

Entregable

Tres rasters exportados y georreferenciados, uno por escenario.

Está hecho cuando

Los tres rasters tienen el mismo tamaño de pixel, el mismo umbral y el mismo rango de colores que el Escenario 0; abiertos en QGIS se superponen exactamente.

S7

Plataforma web, memoria y entrega

Lunes 2 de noviembre a Viernes 6 de noviembre · 5 días · 17.5 h

0 / 10

Objetivo de la semana: Publicar los resultados en la web y entregar el borrador completo el viernes.

El 2 y el 3 de noviembre son feriados (Difuntos e Independencia de Cuenca) y se trabajan por decisión propia. Esta semana tiene 5 días, no 6.

Lunes 2 de noviembre Dia de los Difuntos
Publicar el modelo en la web
3.5 h

5.2 Añadir el modelo al servidor

1.5 h Tyrone
  1. Nueva ruta en app.py para la vista de resultados del modelo.
  2. API que devuelva las ubicaciones recomendadas con su nota y sus variables.
  3. Reutilizar el patron que ya existe para /api/punto y /api/ranking.
Entregable

Ruta y API funcionando en local.

Está hecho cuando

python smoke_test.py pasa incluyendo las rutas nuevas.

python smoke_test.py

5.3 Interfaz: mapa de idoneidad y sitios recomendados

2.0 h Tyrone
  1. Capa de idoneidad con rampa de color y leyenda.
  2. Marcadores de las N ubicaciones recomendadas con su popup: nota, población beneficiada y por qué la eligio el modelo.
  3. Respetar el lenguaje visual que ya tiene la app (mismos colores y tipografía).
Entregable

Vista nueva funcionando en local.

Está hecho cuando

El mapa carga en menos de 3 segundos y la leyenda explica la escala sin ambigüedad.

Martes 3 de noviembre Independencia de Cuenca
Terminar la plataforma y desplegarla
3.5 h

5.3 Comparador de escenarios

2.0 h Tyrone
  1. Selector para alternar entre Escenario 0, 1, 2 y 3 sobre el mismo mapa.
  2. Panel con la tabla de métricas de cada escenario.
  3. SACRIFICABLE: si el tiempo aprieta, dejar solo el mapa de idoneidad y las ubicaciones, y enseñar la comparación como figura estática (ahorra 2 h).
Entregable

Comparador funcionando o figura estática publicada.

Está hecho cuando

Se puede pasar de un escenario a otro sin recargar la página, o está publicada la figura comparativa.

5.4 Desplegar en el VPS

1.0 h Tyrone
  1. Construir la imagen y desplegar con Dokploy en el dominio de la tesis.
  2. Vigilar el disco: 50 GB en total, así que borrar imagenes viejas antes de construir.
  3. Comprobar /health después del despliegue.
Entregable

Plataforma publicada y accesible.

Está hecho cuando

/health responde 200 y el mapa de idoneidad carga desde internet, no solo en local.

docker system prune -af  # antes de construir, el VPS tiene 50 GB

Decisión: ¿funciona en escritorio y móvil?

0.5 h Tyrone
  1. Revisar los hallazgos de Freddy.
  2. Arreglar solo lo que impide usar la página; lo cosmético se anota como trabajo futuro.
  3. Si algo no se puede arreglar hoy, se documenta.
Entregable

Lista de fallos con su estado.

Está hecho cuando

Ningún fallo que impida ver el mapa de idoneidad queda abierto.

Miercoles 4 de noviembre
Capítulo 5: los resultados
3.5 h

Memoria capítulo 5 completo

3.5 h Tyrone
  1. Resultados del diagnóstico, de las tres mallas, del modelo ganador y de la comparación de escenarios.
  2. Discusión: por qué ganó esa malla, qué variables pesaron, cómo aguantó la regla de etiquetado la prueba de sensibilidad y que dice eso sobre la planificación de radiobases.
  3. Comparar con lo que reportan los articulos del estado del arte: es lo que convierte un informe técnico en una tesis.
Entregable

Memoria/sections/05_Resultados.tex completo.

Está hecho cuando

Todas las tablas y figuras están citadas en el texto y el capítulo compila limpio.

cd Memoria && pdflatex TFG.tex && bibtex TFG && makeglossaries-lite TFG && pdflatex TFG.tex && pdflatex TFG.tex
Jueves 5 de noviembre
Conclusiones, resumen y compilación limpia
3.5 h

Memoria capítulo 6 y limitaciones

2.0 h Tyrone
  1. Conclusiones atadas a los objetivos específicos, una por una.
  2. Limitaciones honestas: el tamaño de la muestra, la calidad de los mapas de ARCOTEL, la calibración de Radio Mobile.
  3. Trabajo futuro concreto, no genérico.
Entregable

Memoria/sections/06_Conclusiones.tex.

Está hecho cuando

Cada objetivo específico del capítulo 1 tiene su conclusión correspondiente.

Resumen, abstract y compilación final

1.5 h Tyrone
  1. Redactar el resumen y traducirlo al abstract.
  2. Revisar que todos los acrónimos esten en el glosario y las referencias en el .bib.
  3. Compilación completa de cinco pasos y revisión del PDF de principio a fin.
Entregable

Memoria/TFG.pdf completo.

Está hecho cuando

El PDF no tiene ni una referencia rota ni un acronimo sin definir, y el índice refleja la estructura real.

Viernes 6 de noviembre
Entrega
3.5 h

Reunión 7: entrega del borrador

1.0 h Los dos
  1. Entregar el PDF completo al director.
  2. Enseñar la plataforma publicada.
  3. Acordar el calendario de correcciones.
Entregable

Borrador entregado + acta con el calendario de correcciones.

Está hecho cuando

El director tiene el PDF en la mano y la fecha de devolución acordada.

Colchón: cerrar lo que quedó suelto

2.5 h Tyrone
  1. Estas 2.5 h son el único colchón real del plan. Uselas para lo que se haya atrasado.
  2. Si no se atraso nada: aplicar las correcciones de forma de Freddy, dejar el repositorio ordenado y escribir el README del pipeline.
  3. Etiquetar la versión entregada en git para poder volver a ella.
Entregable

Repositorio ordenado y versión etiquetada.

Está hecho cuando

git tag borrador-2026-11-06 existe y el repositorio no tiene archivos sueltos sin explicar.

git tag -a borrador-2026-11-06 -m 'Borrador entregado al director'

En paralelo, Freddy

Tareas guiadas y verificables que corren aparte: no descuentan de las 3.5 h diarias de la línea principal.

Probar la plataforma en móvil y en escritorio

3 h

Abrir la web publicada en al menos dos teléfonos distintos y en dos navegadores de escritorio. Probar cada boton, cada capa y cada popup. Anotar todo lo que se vea mal con una captura de pantalla y el modelo del dispositivo.

Entregable

Documentos/revisiones/pruebas_web.md con capturas.

Está hecho cuando

Cada fallo tiene captura, dispositivo y navegador; y esta comprobado que el mapa de idoneidad se ve en un teléfono sin desbordar la pantalla.

Revisión final de forma de la memoria

4 h

Leer el PDF completo buscando solo forma: numeración de figuras y tablas, citas rotas que aparezcan como signos de interrogación, acrónimos sin definir en su primera aparición, y páginas con espacios en blanco raros. Anotar por página.

Entregable

Documentos/revisiones/memoria_forma.md.

Está hecho cuando

La lista recorre el PDF de principio a fin y cada hallazgo tiene número de página.

Generado el 2026-09-23 desde tools/cronograma_datos.py. Para cambiar el plan se edita ese archivo y se ejecuta python tools/gen_cronograma.py.