MODELO RANDOM FOREST

1/13/202616 min read

Este bloque de código importa las librerías necesarias para construir, entrenar y evaluar un modelo de Random Forest en un problema de regresión.

En particular, se cargan herramientas de manipulación de datos (numpy, pandas), gestión de rutas de archivos (Path) y componentes de scikit-learn para el preprocesamiento (ColumnTransformer, Pipeline, OneHotEncoder, StandardScaler, SimpleImputer), lo que permite preparar variables numéricas y categóricas de forma ordenada y reproducible. Además, se importa el modelo RandomForestRegressor y las métricas de evaluación MAE, RMSE y R², que se utilizarán para medir el desempeño predictivo del modelo.

Este bloque define funciones personalizadas de métricas de error para evaluar modelos de regresión.

La función MAPE calcula el error porcentual absoluto medio, excluyendo observaciones con valor real igual a cero para evitar divisiones indefinidas. La función SMAPE mide el error porcentual de forma simétrica, normalizando la diferencia entre valores reales y predichos por su promedio absoluto, lo que reduce sesgos cuando los valores son pequeños. Finalmente, la función RMSE calcula la raíz del error cuadrático medio a partir del MSE, penalizando con mayor intensidad los errores grandes y entregando una medida de precisión en las mismas unidades de la variable dependiente.

Este bloque de código carga y prepara la base de datos que se utilizará en el análisis.

Primero, lee el archivo Excel que contiene los datos de la tesis y luego renombra las variables exógenas a una nomenclatura estandarizada y más clara, facilitando la interpretación y el trabajo posterior con los modelos. A continuación, se imprime un resumen básico del dataset (número de filas, columnas y nombres de variables) para verificar la correcta carga de la información. Finalmente, se definen y validan las columnas clave del análisis: la variable objetivo (llegada de turistas), el año y el identificador de país, asegurando que el dataset contenga los elementos necesarios para el modelamiento.

Este código prepara los datos para entrenar y evaluar el modelo en dos etapas.

  1. Define X e y y hace el split temporal: arma la matriz de variables explicativas X (todas las columnas menos la variable objetivo y el año) y la variable objetivo y. Luego separa en train (≤ 2017) y test (2018–2019) usando una máscara por año, lo que respeta el orden temporal y simula un escenario real de predicción futura.

  2. Configura el preprocesamiento separando variables numéricas y categóricas.

  • Para numéricas: imputa valores faltantes con el promedio y luego estandariza (media 0, desviación 1) con StandardScaler.

  • Para categóricas: imputa con la moda, convierte todo a string (para evitar problemas de tipos) y aplica One-Hot Encoding, ignorando categorías nuevas que aparezcan en test (handle_unknown="ignore").

Este bloque construye, entrena y ejecuta el modelo Random Forest dentro de un flujo completamente integrado.

Primero, el ColumnTransformer aplica el preprocesamiento adecuado a variables numéricas y categóricas, asegurando que cada tipo de dato sea tratado correctamente antes del modelamiento. Luego, se define un RandomForestRegressor con 500 árboles, uso de todos los núcleos del procesador (n_jobs=-1) y selección aleatoria de variables en cada división (max_features="sqrt"), lo que mejora la robustez y reduce el sobreajuste. Finalmente, todo se integra en un Pipeline, que se ajusta con los datos de entrenamiento y se utiliza para generar las predicciones sobre el conjunto de prueba.

Este bloque calcula y resume las métricas de desempeño del modelo sobre el conjunto de prueba.

En particular, se computan el MAE, que mide el error promedio en unidades de la variable objetivo; el RMSE, que penaliza con mayor intensidad los errores grandes; y el , que indica la proporción de la variabilidad de la llegada de turistas explicada por el modelo. Finalmente, las métricas se organizan en un DataFrame, facilitando su visualización y comparación posterior.

Este código extrae y prepara las importancias de variables del modelo Random Forest para su análisis.

Primero, recupera los nombres reales de las variables después del preprocesamiento, combinando las variables numéricas originales con las variables categóricas transformadas mediante One-Hot Encoding. Luego, obtiene las importancias de cada predictor calculadas por el Random Forest y las almacena en un DataFrame. Posteriormente, agrupa los dummies bajo su variable base original (antes de la codificación) para facilitar la interpretación. Finalmente, se excluyen variables identificadoras (como país de origen o pares de países) que no aportan interpretación económica directa, dejando solo predictores relevantes para el análisis sustantivo.

Este código calcula, ordena y visualiza las variables más importantes del Random Forest, y además exporta los resultados.

Primero, reconstruye los nombres de las variables después del preprocesamiento (numéricas + dummies del One-Hot). Luego extrae feature_importances_ del modelo y crea un DataFrame con cada variable transformada y su importancia. Después, vuelve a la “variable base” (agrupando los dummies bajo su nombre original), elimina variables identificadoras no interpretables (origin/pair/destination/unique) y agrega (suma) las importancias por variable original para obtener una importancia total por predictor.

Finalmente, renombra algunas variables para que se vean más “bonitas” en el gráfico, grafica en barras horizontales el Top-5 (en negro) y guarda el ranking completo en un archivo CSV llamado importancias_rf.csv para usarlo en tablas o en la tesis.

Este bloque arma un DataFrame de predicciones del Random Forest para poder analizar resultados (por año y por país) y luego filtra los casos “válidos” para gráficos en escala positiva.

  1. Reusa la misma separación temporal: define mask_train (años ≤ 2017) y mask_test (2018–2019).

  2. Construye pred_rf_df con las observaciones del test, guardando: año, país (country_col), el valor real (y_true) y el predicho por el modelo (y_pred). Esto sirve para tablas, métricas por país, y gráficos.

  3. Crea plot_df filtrando solo años ≥ 2018 y dejando únicamente filas donde y_true y y_pred sean mayores que 0, lo cual evita problemas típicos al graficar o aplicar transformaciones logarítmicas y elimina casos con ceros/negativos que distorsionan la visualización.

Este código genera un scatter plot de “reales vs predichas” para evaluar visualmente el desempeño del Random Forest en el test 2018–2019.

Primero filtra pred_rf_df dejando solo observaciones del test (años ≥ 2018) y además exige que y_true y y_pred sean > 0, porque después se usa escala logarítmica (no admite ceros/negativos). Luego define x como llegadas reales y y como las predichas, calcula el mínimo y máximo conjunto para fijar el rango común y grafica los puntos.

La línea diagonal punteada representa el caso ideal y=xy=xy=x: puntos cercanos a esa línea indican buenas predicciones; puntos muy arriba/abajo reflejan sobre/infraestimación. Finalmente aplica log-log para que países con valores muy distintos (desde pocos turistas hasta millones) se vean en un mismo gráfico sin que los grandes dominen, y agrega una grilla suave para mejorar la lectura.

Este bloque define y organiza las variables explicativas en familias conceptuales para el análisis de los modelos.

La primera lista agrupa variables socioeconómicas, institucionales y de riesgo, que capturan condiciones macroeconómicas, estabilidad política, entorno institucional y factores de incertidumbre que influyen en la decisión de viajar. La segunda lista reúne variables culturales, demográficas, geográficas y climáticas, asociadas a la proximidad cultural y física entre países y a condiciones ambientales que afectan la atracción turística. Esta clasificación facilita la interpretación de resultados y el análisis del rol relativo de cada grupo de variables en el desempeño del modelo.

Este código define una función reusable (run_rf_with_features) que entrena y evalúa un Random Forest usando solo un subconjunto de variables (por ejemplo, una “familia” de variables) y devuelve sus métricas.

En concreto: filtra feature_cols para quedarse solo con columnas que existan; separa X_train y X_test con esas variables; arma un preprocesamiento distinto para numéricas (imputa con mediana y estandariza) y categóricas (imputa con moda, convierte a string y aplica One-Hot). Luego transforma train/test, entrena un RandomForestRegressor (400 árboles, max_features="sqrt", etc.), predice en train y test, y calcula MAE, RMSE y R² para ambos conjuntos. Esto te sirve para comparar qué tan bien funciona el modelo cuando solo le das ciertas familias de variables y detectar sobreajuste (train muy bueno vs test peor).

Este bloque compara el desempeño del Random Forest usando distintos conjuntos de variables.

Primero, ejecuta el modelo solo con variables socioeconómicas/institucionales, luego únicamente con variables culturales, demográficas, geográficas y climáticas, y finalmente con todas las variables disponibles como modelo de referencia. Cada ejecución usa la función definida previamente y devuelve métricas de MAE, RMSE y R² en train y test.

Los resultados se consolidan en un DataFrame, se indexan por tipo de modelo y se ordenan según el R² en test, lo que permite identificar qué familia de variables aporta mayor capacidad explicativa y comparar su desempeño frente al modelo completo.

Este bloque calcula y visualiza el error relativo del modelo para comparar familias de variables de forma más interpretable.

Primero, obtiene el promedio de la variable objetivo en el test y calcula el MAE relativo (%), expresando el error como porcentaje del nivel promedio de llegadas de turistas. Esto permite interpretar el error en términos económicos y no solo absolutos. Luego, selecciona las familias a comparar y genera un gráfico de barras que muestra el MAE relativo en test para cada una. El gráfico facilita identificar qué conjunto de variables produce menor error proporcional, aportando una comparación clara del aporte predictivo de cada familia.

Este bloque imprime un resumen numérico simple del desempeño en test para cada modelo evaluado.

Para cada conjunto de variables, muestra el nombre del modelo, el MAE en test, la media de las llegadas reales en el período de prueba y el MAE expresado como porcentaje de dicha media. Esto permite una interpretación directa del error en términos relativos, facilitando la comparación entre modelos y entendiendo qué tan grande es el error promedio respecto al nivel real de turismo observado.

Este bloque evalúa la relación entre el tamaño del flujo turístico y el error relativo del Random Forest.

Primero, calcula el error relativo porcentual para cada observación, excluyendo casos con valores reales iguales o menores a cero para evitar divisiones inválidas. Luego, limpia el conjunto de datos eliminando valores faltantes o no finitos. Finalmente, genera un gráfico de dispersión en escala logarítmica en ambos ejes, que permite observar si el modelo presenta mayores errores proporcionales en flujos pequeños y si el desempeño mejora a medida que aumenta el volumen de llegadas.

Este código clasifica los países según el tamaño total de su flujo turístico hacia Chile en todo el período analizado.

Primero, suma las llegadas reales de turistas por país utilizando el dataset original, lo que permite medir la importancia relativa de cada mercado emisor en términos acumulados. Luego, define una función que segmenta los países en grandes, medianos o pequeños según umbrales de llegadas totales. Esta clasificación facilita el análisis comparativo del desempeño del modelo y permite evaluar si la precisión varía sistemáticamente según el tamaño del mercado de origen.

Este bloque mide el desempeño del Random Forest por “segmentos” de países (grandes/medianos/pequeños), lo que hace el análisis más comparable y sólido.

Primero, une (merge) el DataFrame de predicciones pred_rf_df con la tabla total_arrivals para asignar a cada observación su segmento según el tamaño total del país. Luego calcula el error relativo porcentual (rel_error_pct) solo cuando y_true > 0 y elimina valores inválidos (NaN o infinitos) para evitar sesgos.

Finalmente, agrupa por segmento y calcula para cada grupo:

  • n_obs: número de observaciones (tamaño de muestra),

  • MAE: error absoluto medio del segmento,

  • MAE_rel_%: promedio del error relativo porcentual.

El resultado (segment_metrics) permite ver si el modelo funciona mejor en países grandes (flujos altos) y tiende a fallar proporcionalmente más en países pequeños, que suele ser un patrón común.

Este código visualiza el desempeño del Random Forest según el tamaño del mercado emisor.

A partir de segment_metrics, genera un gráfico de barras con el error relativo promedio (%) para cada segmento de países (grandes, medianos y pequeños). El gráfico permite identificar de forma clara si el modelo presenta mejor precisión en países con flujos turísticos grandes y mayores errores proporcionales en mercados pequeños, apoyando la interpretación económica de los resultados.

Este bloque calcula y ordena el tamaño total del flujo turístico por país para todo el período analizado.

Primero, agrega las llegadas reales de turistas por país, obteniendo el volumen acumulado de cada mercado emisor. Luego, clasifica los países en grandes, medianos o pequeños según umbrales predefinidos, creando la variable segmento_flujo. Finalmente, muestra los 15 países con mayor flujo total, lo que permite identificar los mercados más relevantes y contextualizar los resultados del modelo.

Este código identifica el conjunto de países con mayor volumen turístico para un análisis específico.

A partir de la clasificación previa (segmento_flujo), selecciona únicamente los “Países grandes” y extrae sus identificadores en una lista. Esta lista (paises_grandes) se utiliza posteriormente para analizar o graficar las series reales versus predichas del modelo, enfocándose en los mercados emisores más relevantes y con mayor impacto en el total de llegadas a Chile.

Este bloque construye y entrena un pipeline completo de Random Forest.

El Pipeline integra en un solo flujo el preprocesamiento de los datos (prep, que imputa, escala y codifica variables) y el modelo RandomForestRegressor (400 árboles, semilla fija para reproducibilidad y uso de todos los núcleos). Al entrenar el pipeline con X_train y y_train, se garantiza que todas las transformaciones se aprendan solo con los datos de entrenamiento, evitando filtraciones de información y asegurando coherencia entre entrenamiento y predicción.

Este bloque genera y organiza las predicciones del Random Forest tanto para el conjunto de entrenamiento como para el de prueba.

Primero, obtiene las predicciones en train y construye un DataFrame que incluye el año, el país, los valores reales (y_true), los predichos (y_pred) y una etiqueta que identifica el conjunto (train). Luego repite el mismo procedimiento para el test. Finalmente, ambos DataFrames se concatenan en uno solo (pred_rf_full), lo que permite analizar y comparar de forma consistente el comportamiento del modelo entre entrenamiento y prueba, así como realizar gráficos o métricas desagregadas por país y año.

Este bloque grafica las series temporales reales y predichas por país para los países grandes, permitiendo una evaluación visual detallada del desempeño del Random Forest.

Para cada país, filtra las observaciones correspondientes y las ordena por año. Luego separa train y test para diferenciarlos claramente en el gráfico. Se trazan cuatro líneas: valores reales en train y test, y valores predichos por el Random Forest en ambos conjuntos, usando colores y estilos distintos. Estos gráficos permiten evaluar si el modelo reproduce bien la tendencia temporal, detectar posibles quiebres estructurales y observar diferencias entre ajuste en entrenamiento y capacidad predictiva en el período de prueba.

Este código visualiza la evolución temporal de las llegadas de turistas por país comparando valores reales y predichos por el Random Forest, para los países grandes.

Para cada país, se filtran sus observaciones y se ordenan cronológicamente. Luego se separan los datos de entrenamiento y prueba, lo que permite distinguir claramente el ajuste in-sample del desempeño out-of-sample. En cada gráfico se muestran las series reales y predichas, diferenciadas por color y estilo de línea. Estos gráficos facilitan evaluar si el modelo captura la tendencia, los niveles y los cambios en el tiempo, y si mantiene un comportamiento coherente al pasar del período de entrenamiento al de prueba.

Este bloque identifica los países con flujo turístico medio hacia Chile para un análisis específico.

A partir de la variable segmento_flujo, selecciona únicamente los “Países medianos” y extrae sus identificadores en una lista (paises_medianos). Esta lista se utiliza posteriormente para analizar o graficar las predicciones del modelo en mercados intermedios, permitiendo comparar su comportamiento frente a países grandes y pequeños y evaluar cómo varía el desempeño del Random Forest según el tamaño del mercado emisor.

Este bloque grafica las series temporales reales y predichas por el Random Forest para los países de flujo medio.

Para cada país mediano, filtra sus observaciones, las ordena por año y separa los datos de entrenamiento y prueba. En cada gráfico se comparan las llegadas reales con las predicciones del modelo, diferenciando claramente train y test mediante colores y estilos de línea. Estos gráficos permiten evaluar si el modelo captura adecuadamente la tendencia y el nivel en mercados intermedios y contrastar su desempeño respecto a países grandes, donde usualmente la señal es más estable.

Este bloque identifica los países con menor flujo turístico hacia Chile.

Utilizando la variable segmento_flujo, selecciona los “Países pequeños” y extrae sus identificadores en una lista (paises_pequenos). Esta lista se emplea posteriormente para analizar el comportamiento del modelo en mercados de bajo volumen, donde la variabilidad suele ser mayor y la predicción resulta más desafiante, permitiendo comparar el desempeño del Random Forest entre distintos tamaños de mercados emisores.

Este bloque grafica las series temporales reales y predichas por el Random Forest para los países de bajo flujo turístico.

Para cada país pequeño, se filtran sus observaciones, se ordenan por año y se separan los períodos de entrenamiento y prueba. En los gráficos se comparan las llegadas reales con las predicciones del modelo, diferenciando claramente entre ajuste in-sample y desempeño out-of-sample. Este análisis permite evidenciar que, en mercados pequeños, el modelo suele mostrar mayor volatilidad relativa y errores proporcionales más altos, lo cual es consistente con la menor estabilidad de estos flujos.

Este código visualiza el error absoluto del Random Forest por segmento de países.

A partir de segment_metrics, genera un gráfico de barras con el MAE en niveles de llegadas para cada segmento (países grandes, medianos y pequeños). A diferencia del MAE relativo, este gráfico permite comparar el error en términos absolutos, mostrando que los países con mayor volumen suelen concentrar errores más grandes en nivel, mientras que en países pequeños el error absoluto es menor, aunque proporcionalmente pueda ser más alto.

Este bloque visualiza el desempeño relativo del Random Forest según el tamaño del mercado emisor.

El gráfico de barras muestra el error relativo promedio (MAE %) para cada segmento de países (grandes, medianos y pequeños). Esta visualización permite comparar la precisión proporcional del modelo, evidenciando que el Random Forest tiende a presentar errores relativos menores en países con flujos grandes y mayores en países pequeños, donde la variabilidad es más alta y la señal es más débil.

Este código prepara una base país–promedio para hacer clustering (segmentación) de países según sus variables exógenas.

Primero, junta todas las variables de tus listas (socioeconómicas, culturales/demográficas y digitales) en un solo listado y elimina duplicados. Luego filtra ese listado para quedarse solo con las variables que existen en el dataframe y que son numéricas, porque la media y la mayoría de métodos de clustering requieren inputs numéricos.

Después construye cluster_df calculando, para cada país (country_col), el promedio de esas variables a lo largo del tiempo, y elimina países con datos incompletos (dropna). El resultado es una tabla donde cada fila es un país y cada columna es una variable promedio, lista para estandarizar y aplicar un algoritmo de clustering.

Este bloque prepara los datos para un análisis PCA.

Primero crea una copia del dataset original (df_pca) y define el conjunto de variables exógenas que se utilizarán en el PCA. Luego, para cada una de estas variables, imputa los valores faltantes con la mediana, lo que evita perder observaciones y reduce la influencia de valores extremos. Este paso es clave para asegurar que el PCA pueda ejecutarse correctamente y refleje patrones estructurales sin sesgos por datos faltantes.

Este bloque aplica un Análisis de Componentes Principales (PCA) para reducir la dimensionalidad y visualizar similitudes entre países.

Primero, construye un dataset país–promedio usando las variables seleccionadas para el PCA. Luego, estandariza las variables con StandardScaler, paso esencial para que todas tengan la misma escala y ninguna domine el análisis. A continuación, ejecuta el PCA con dos componentes, que resumen la mayor parte de la variabilidad conjunta de las variables originales. Finalmente, agrega las coordenadas de cada país en PC1 y PC2, dejando la base lista para análisis visual o clustering.

Este bloque verifica y lista los países incluidos en el PCA.

A partir del índice de cluster_df, extrae los países que cuentan con información completa para las variables utilizadas en el análisis y que, por tanto, pudieron ser incorporados en el PCA. El print permite comprobar el número total de países analizados, asegurando transparencia sobre la cobertura del ejercicio de reducción de dimensionalidad.

Este bloque aplica un algoritmo de clustering K-means para segmentar los países según sus características exógenas.

Utilizando los datos estandarizados (X_scaled), se define un KMeans con 3 clusters, fijando una semilla para reproducibilidad y múltiples inicializaciones (n_init=10) para mejorar la estabilidad del resultado. El modelo asigna a cada país un cluster y dicha etiqueta se incorpora a cluster_df, dejando la base lista para analizar perfiles de países similares y relacionarlos con el desempeño del modelo de predicción turística.

Este bloque visualiza los resultados del PCA junto con la segmentación por clusters.

El gráfico representa a cada país en el plano definido por PC1 y PC2, coloreando los puntos según el cluster asignado por K-means. Además, se incluyen etiquetas con el código de cada país, lo que facilita la interpretación y comparación entre grupos. Los ejes indican el porcentaje de varianza explicada por cada componente principal, permitiendo evaluar cuánta información retienen. Esta visualización ayuda a identificar patrones y similitudes estructurales entre países emisores y a relacionarlos con el comportamiento del modelo de predicción turística.

Este bloque prepara las predicciones para analizar el error según clusters de países.

Primero, calcula el error relativo porcentual del Random Forest, excluyendo observaciones con valores reales nulos o no válidos para evitar divisiones problemáticas. Luego limpia el dataset eliminando valores faltantes o infinitos, dejando solo observaciones confiables. Finalmente, une las predicciones con la etiqueta de cluster obtenida del PCA + K-means, permitiendo evaluar si el desempeño del modelo varía sistemáticamente entre distintos grupos estructurales de países.

Este bloque calcula métricas de desempeño del Random Forest por cluster de países.

Agrupa las predicciones según el cluster estructural asignado a cada país y, para cada grupo, calcula: el número de observaciones, el MAE y el RMSE en niveles, y el MAE relativo (%). De este modo, se puede evaluar si el modelo presenta diferencias sistemáticas de precisión entre clusters, es decir, si ciertos perfiles de países (similares en características socioeconómicas y culturales) son más fáciles o más difíciles de predecir.

Este código visualiza el error relativo del Random Forest por cluster de países.

El gráfico de barras compara el MAE relativo (%) entre los distintos clusters obtenidos mediante PCA + K-means, mostrando cómo varía la precisión del modelo según el perfil estructural de los países emisores. Esta visualización permite identificar clusters donde el modelo es más preciso y otros donde presenta mayores dificultades predictivas, aportando evidencia sobre la heterogeneidad del desempeño según características socioeconómicas y culturales.

Este bloque compara, a nivel agregado, las llegadas reales y las predichas por el Random Forest en el período de prueba.

Primero, agrupa las observaciones del test por año, sumando las llegadas reales y las estimadas por el modelo. Luego genera un gráfico de barras agrupadas, donde cada año muestra el total real versus el total predicho. Esta visualización permite evaluar si el modelo reproduce correctamente el nivel agregado anual del turismo, identificar sesgos sistemáticos de sobre- o subestimación y complementar las métricas de error con una interpretación macro de los resultados.

Random Forest es un algoritmo de machine learning basado en métodos de ensamble que se utiliza para tareas de regresión y clasificación. Su objetivo es mejorar la precisión y la robustez de las predicciones combinando múltiples árboles de decisión entrenados sobre distintas muestras de los datos. Al promediar las predicciones de muchos árboles, Random Forest reduce la varianza del modelo y evita el sobreajuste que suele presentarse en un solo árbol de decisión.

El funcionamiento del algoritmo se basa en dos fuentes de aleatoriedad: el muestreo bootstrap de las observaciones y la selección aleatoria de subconjuntos de variables en cada división del árbol. Cada árbol aprende patrones ligeramente distintos y, al agregarlos, el modelo logra capturar relaciones no lineales y complejas entre las variables explicativas y la variable objetivo, manteniendo un buen desempeño incluso en contextos con alta heterogeneidad y ruido en los datos.