knitr::opts_chunk$set(echo = TRUE, cache = TRUE, message=TRUE) options (width=200)
El objetivo de este análisis predictivo es crear un modelo que permita predecir si un nuevo desmovilizado que ingresa a un proceso de desmovilización podría culminarlo de forma exitosa, o por el contrario puede fracasar y abandonar el proceso. Para crear este modelo se toman los datos existentes de desmovilizados que han ingresado al proceso y de los cuales se conoce la situación final del desmovilizado, entre estas situaciones las de éxito o fracaso. Los datos de desmovilizados se han tomado de los sitios públicos en internet donde el gobierno de Colombia publica este tipo de datos [REFERENCIA].
La metodología que seguimos para el proceso de analítica de datos, CRISP-DM [Wirth2000] se presenta en la siguiente gráfica, y a continuación se describe brevemente:
{width="300"}
Comprensión del negocio: se refiere a entender el problema, los objetivos del proyecto en cuanto a la analítica de datos, que se está tratando.
Comprensión de los datos: se refiere a entender los datos, su estructura, sus tipos, las limitantes y posibles soluciones.
Preparación de datos: Esta es la etapa más importante del proceso e involucra varias actividades, entre las principales:
Primero, se necesita "formatear" los datos para que se puedan procesar en una herramienta de software, en nuestro caso seleccionamos el ambiente de programación R para realizar todo el procesamiento, análisis, modelamiento, y pruebas.
Segundo, se necesita hacer una selección de variables o características (Feature selection), es decir, tomar diferentes medidas a las características (columnas) y ver que tan buenas o que tanto aportan (ej. ver si algunas características no aportan nada o dicen lo mismo que otra osea están correlacionadas, etc.) .
Tercero, una vez se tengan las observaciones y las características, se necesita un proceso de limpieza de los datos, lo cual involucra varioss procedimientos, desde buscar datos faltantes o erróneos y decidir si se elimina la fila o toda la columna, o mejor se imputan (predicen) los faltantes de acuerdo a los datos de la muestra.
Cuarto, con los datos ya limpios se necesita transformarlos ya sea a datos numéricos o a categorías o una combinación, para que los pueda aceptar el modelo o modelos de predicción que se elijan.
Modelamiento: En esta fase se selecciona un modelo conocido de predicción y se buscan los mejores parámetros que permitan que el modelo prediga con mayor exactitud si un nuevo desmovilizado tendría éxtio o fracaso en el proceso de desmovilización que inicia. Este proceso toma un subconjurnto del total de datos de desmovilizados y a través de cada una de las observaciones busca ajustar sus parámetros hasta alcanzar los valores que le permiten realizar predicciones de gran exactitud.
Evaluación: Aquí se busca evaluar la calidad del modelo. El modelo se avalúa con un subconjunto de datos del total de desmovilizados, para los cuales se conoce si tuvieron éxtio o fracaso en el proceso de desmovilización. Se hacen las predicciones, se comparan con los datos reales, y se calculan unas métricas relacionadas con la exactitud de las predicciones.
Despliegue: Esta etapa se refiere a donde va a quedar el modelo elaborado en las etapas anteriores y como se va a utilizar. En nuestro caso, el modelo va a corresponder a una herramienta de software que específicamente va a ser un paquete del lenguaje R que cualquier persona interesada podrá descargar, instalar, y usar para hacer predicciones con datos de nuevos desmovilizados.
Para soportar la metodología anterior y que lo hallazgos de este análisis predictivo se puedan volver a obtener, es decir que el análisis sea reproducilble, hemos construido un paquete de funciones de R llamado "desistimiento" el cual contiene: todos los datos de las estadísticas de los desmovilizados que se utilizan para la creación del modelo predictivo; todas las funciones necesarias para la preparación de esos datos; todas las funciones para el análisis de los datos; todas las funciones para la creación y evaluación del modelo; y las funciones para utilizar el modelo para predecir la situación final de nuevos desmovilizados.
El paquete se llama desde el ambiente de R así:
library (desistimiento)
El objetivo de este análisis predictivo es crear un model que permita predecir si un nuevo individuo que ingresa al proceso de desmovilización podría culminarlo con éxito o podría fracasar, todo esto dependiendo de una serie de características que presenta cada desmovilizado de forma particular.
Como datos de entrada se tiene una tabla con la información de 55675 desmovilizados correspondiente a 36 características. Es decir, una tabla de datos de 55675 filas por 36 columnas. Cada fila corresponde a un desmovilizado y vamos a referirnos a esta fila como una observación. Así mismo cada columna corresponde a un atributo o información que se tiene del desmovilizado y vamos a referirnos a esta columna como una variable o característica.
De estas 36 variables, una de ellas corresponde a la variable que se busca predecir o variable dependiente y el resto corresponde a las variables que ayudan a realizar la predicción, o variables independientes. Matemáticamente se puede ver como una ecuación de la forma:
Y = aX1 + bX2 + ...zX35
donde Y es la variable dependiente, X1, X2,..., X35 son las variables independientes, y las letras a...z son los parámetros del modelo. Estos últimos son los que el modelo predictivo que se elija buscaría determinar o por lo menos llegar a un valor muy cercano al real.
De acuerdo al conjunto de datos, las variables y su significado son las siguientes:
SituacionFinal: Variable dependiente a predecir. Indica la situación actual del desmovilizado dentro del proceso, y puede varios valores, pero para la creación del modelo predictivo, vamos a tomar solo dos: CULMINADO, que corresponde a éxito en el procesos, y FUERA, que corresponde a fracaso en el proceso.
TipoDesmovilizacion: DESCRIBIR DE FORMA CORTA ESTA Y LAS DEMAS VARIABLES
ExGrupo:
AñoDesmovilizacion
Ingreso
AñoIndependizacion
GrupoEtario
Sexo
DptoResidencia
MunicipioResidencia
BeneficioTRV
BeneficioFA
BeneficioFPT
BeneficioPDT
NivelEducativo
MáximoNivelFPT
LineaMaximoNivelFPT
OcupacionEconomica
TieneDesembolsoBIE
TipoBIE
DesembolsoBIE
EstadoISUN
PoseeServicioSocial
EstadoVinculaciónASS
TipoASSVinculada
PoseeCensoFamilia
PoseePareja
NroHijos
NroGrupoFamiliar
CensoHabitabilidad
TipoVivienda
RegimenTenenciaVivienda
ServiciosPúblicos
RégimenSalud
ClasificaciónComponente\
Esta etapa es la más importante de todo el proceso ya que involucra tomar los datos originales, que pueden tener varios problemas, corregir esos problemas, y dejarlos listos para que a partir de ellos se pueda crear un modelo de predicción confiable.
Entre los problemas que se pueden encontrar en los datos están:
Problemas de digitación: Estos problemas pueden abarcar tanto carácteres o símbolos incorrectos en los valores de los datos, como también separación confusa o erronea de las columnas o variables. Todo esto genera problemas en la lectura de los datos, ya sea que no se puedan leer, que se lean de forma erronea, o que las herramientas automática que estamos utilizando, en nuestro caso el ambiente de programación R, no sea capaz de determinarlos.
Problemas de formato: Aquí pueden darse problemas en determinar el tipo correcto de los datos, por ejemplo valores numéricos o fechas pueden tomarse erroneamente como cadenas de texto.
Problemas de datos nulos: Columnas con datos incompletos, erroneos, o inexistentes.
Variables correlacionadas: Variables o características que estén midiendo lo mismo o por lo menos están bastante correlacionadas y por lo tanto se podría mantener dentro del análisis solo una de ellas y eliminar las otras.
Nombres largos: Algunas variables o los estados que tienen esas variables pueden ser textos muy largos. Esto puede dificultar la presentación de resultados debido a la limitación de espacio que tiene una pantalla de computador o una hoja de papel. Por lo tanto se debería, en lo posible, abreviar esos nombres.
Datos no necesarios: Algunos datos no son de interés para este análisis y por lo tanto se deben eliminar para simplificar el conjunto de datos. Esto sucede con la variable dependiente "SituacionFinal" en la cual solo interesan dos estados: "CULMINADO" y "FUERA". Los demás estados no interesan por ahora ya que el modelo predictivo que vamos a crear es binario y va a predecir uno de estos dos estados.
La preparación de los datos inicia con el conjunto de datos original que tiene problemas de digitación y problemas de formato. Para obtener este conjunto de datos el paquete de desistimiento ofrece la función "ds_datosOriginales" que retorna una estructura tipo tabla (dataframe en R) y al mismo tiempo escribe esta tabla en un archivo llamado "datos_originales" en formato CSV (texto) y XLSX (excel), así:
datosOriginales = ds_datosOriginales() ver (datosOriginales, n=15)
Los datos originales tienen errores de formato, específicamente problemas con comillas mal ubicadas que no permiten su lectura correcta. Estos problemas se han corregido obteniendo una versión de los datos originales pero ahora con formato para leerse en el ambiente R. La función que los obtiene se llama "ds_datosFormateados", así:
datosFormateados = ds_datosFormateados () ver (datosFormateados, n=15)
Antes de iniciar cualquier análisis es importante que conozcamos la estructura de los datos con los que vamos a trabajar, específicamente lo que se refiere a los tipos de datos de cada variable, ya sea categóricos (o cualitativos), númericos (o cuantitativos), fechas, u otro tipo de datos.
El paquete de funciones "desistimiento" ofrece la funcion "ds_obtener_estructura" que retorna la estructura actual y a la vez la guarda en un archivo llamado "estructura_datos.csv". De esta manera, se puede revisar si la estructura de los datos que está leyendo el ambiente R es la estructura que los datos deben tener, y si no es así entonces se pueden hacer los cambios respectivos. Un ejemplo de uso de la función es el siguiente:
estructuraDatos = ds_obtener_estructura ("datos_formateados.csv") ver(estructuraDatos,n=30)
La tabla muestra dos columnas, "ESTRUCTURA_ORIGINAL" y "ESTRUCTURA_CAMBIOS", la primera columna contiene la estructura original y la segunda columna repite esta información pero en ella se pueden realizar cambios a esa estructura como veremos más adelante.
La misma información de la estructura por cada variable es la siguiente:
Tipo de la variable (ej. CUALITATIVA, CUANTITATIVA, o FECHA).
Nombre de la variable (ej. TipoDesmovilización)
Valores de la variable, que pueden ser de tres tipos:
CUALITATIVO: Muestra los valores categóricos que puede tomar la variable y los cuales están enumerados desde 1 hasta el N-esimo valor (ej. [1] Colectiva [2] Individual).
CUANTITATIVO: Muestra el rango de valores de la variable con su valor mínimo y su valor máximo.
FECHA: En este caso las fechas deben tener el formato "dd-mm-yyyy". Si las variables no tienen ese formato, entonces el ambiente R tomará erroneamente esas fechas como valores cuantitativos (ej. 2000, 2002, 2003,..).
La primera columna contiene la estructura original y la segunda columna repite esta información pero en ella se pueden realizar cambios a esa estructura como:
Cambiar el tipo de variable a CUALITATIVA, CUANTITATIVA, o FECHA
Cambiar el nombre de la variable a uno más abreviado o representativo.
Cambiar el nombre de los valores de la variable a alguno más abreviado o representativo.
que luego se leen desde una función del paquete de desistimiento para que las escriba en el archivo de los datos.
La anterior estructura queda guardada en un archivo con nombre "estructura_datos_formateados.csv" que se puede editar en excel y realizarle cambios a esa estructura como los siguientes:
Cambiar el tipo de variable a CUALITATIVA, CUANTITATIVA, o FECHA
Cambiar el nombre de la variable a uno más abreviado o representativo.
Cambiar el nombre de los valores de la variable a alguno más abreviado o representativo.
Una vez se hacen las modificaciones, se guarda el archivo con otro nombre, por ejemplo "estructura_datos_MODIFICADA.csv".
Para ver reflejados estos los cambios en la estructura, el paquete "desistimiento" ofrece una función llamada "ds_modificar_estructura" que toma estos cambios y modifica la estructura de los datos del archivo de datos "datos_formateados.csv" creando un archivo de datos nuevo llamado "datos_MODIFICADOS.csv".
En el caso de nuestros datos de desmovilizados, la mayoría de los datos son de tipo CUALITATIVO o categóricos ("Factor" en R) y cuatro de ellos son de tipo CUANTITATIVO o numéricos ("int" en R). De los cuatro numéricos, 2 de ellos corresponden a fechas, específicamente a años, y este tipo de datos debe ser modificado de CUANTITATIVO a FECHA. Por lo tanto la estructura de datos modificada tiene ya estos cambios y para hacerlos visibles en los datos de desmovilizados se llama a la función "ds_modificar_estructura" así:
cambios = ds_modificar_estructura ("datos_formateados.csv", "entradas/estructura_datos_MODIFICADA.csv") ver (cambios,n=30)
Para el caso de nuestros datos de desmovilizados, hemos cambiado la estructura inicial de los datos para que las variables que se refieren a fechas tales como "AñoDesmovilización" y "AñoIndependizacion" se cambien de tipo CUALITATIVO a tipo FECHA, así:
Datos anteriores:
datosAnteriores = read.csv ("datos_formateados.csv") ver (datosFormateados)
Datos modificados:
datosModificados = read.csv ("datos_MODIFICADOS.csv") ver (datosModificados)
La variable objetivo o variable dependiente de nuestro problema es la variable que se quiere predecir tomando como información el resto de variables o variables independientes. Como se mostró anteriormente, matemáticamente se puede ver como una ecuación de la forma:
Y = aX1 + bX2 + ...zX35
donde Y es la variable dependiente, X1, X2,..., X35 son las variables independientes, y las letras a...z son los parámetros del modelo predictivo que se vaya a utilizar para la predicción. Estos parámetros son los que el modelo predictivo buscará determinar o por lo menos llegar a un valor muy cercano al real.
Para nuestro problema la variable objetivo es la que se llama "SituacionFinal" y que es una variable CUALITATIVA que indica la situación actual del desmovilizado dentro del proceso. Esta variable puede tener los siguientes valores:
"Ausente del proceso"
"Culminado"
"En Proceso"
"Fuera del Proceso", y
"No ha ingresado"
El objetivo del modelo predictivo que vamos a construir es predecir si un desmovilizado tendrá éxito o fracaso dentro de un proceso de desmovilización dado las características propias del desmovilizado, tales como la edad, número de hijos, nivel de eduación, trabajo actual, entre otras.
Por lo tanto, la variable objetivo debe ser binaria, es decir tener solo dos estados: EXITO y FRACASO. Para nuestro caso vamos a tomar solo dos de los cinco valores que puede tener la variable: "Culminado" que corresponderá a EXITO en el proceso, y "Fuera del Proceso", que corresponderá a FRACASO en el proceso. Además, se deben eliminar los desmovilizados que tienen otros estados distintos a los dos anteriores, y así mismo vamos a renombrar los nombres de esos estados de "Culminado" a "EXITO", y de "Fuera del Proceso" a "FRACASO".
Para realizar lo anterior, hemos creado una función dentro del paquete de "desistimiento" que realiza este proceso y que se llama "ds_procesar_varobjetivo", la cual se llama así:
datosProcesados = ds_procesar_varobjetivo ("datos_MODIFICADOS.csv") ver (datosProcesados,n=20)
El proceso anterior reducirá los datos de 55675 a 45883 desmovilizados y además coloca la variable objetivo "SituacionFinal" al inicio de la tabla tener una mejor lectura de los datos.
Puede que algunos valores de las variables sean nulos o no existan. Esto es muy común en la toma de datos ya que puede suceder que se digitó mal los datos, o no existe información para ese estado de la variable, o al encuestar al desmovilizado este no respondió a una determinada pregunta, todo lo anterior da como resultado valores nulos o inexistente dentro de las variables que se deben manejar.
Una forma de manejar los valores nulos es eliminar las observaciones que los tienen, siempre y cuando exista un gran número de observaciones. Para nuestro caso, en los últimos datos que se grabaron en el archivo "datos_MODIFICADOS.csv" quedaron exactamente 45883 observaciones, que es un gran número y por lo tanto vamos a remover las observaciones que tengan algún valor nulo.
Para realizar la limpieza anterior hemos creado dentro del paquete "desistimiento" una función que muestra el número de valores nulos por cada variable y realiza la selección de las observaciones que no contengan ningun valor nulo. Los nuevos datos se escriben en un archivo llamado "datos_NoNulos.csv". La función se llama así:
resultados = ds_procesar_nulos ("datos_Procesados.csv") ver (resultados, n=30)
De acuerdo a los resultados anteriores, se observa por cada variable el número de valores nulos antes y despúes de eliminar las observaciones que tienen algún valor nulo, columnas "NroNulosAntes" y "NroNulosDespues", respectivamente. Al final, vamos a quedarnos con un total de 25928 observaciones completamente limpias de valores nulos.
El análisis exploratorio de datos se refiere al proceso de realizar un análisis inicial con la ayuda de estadísticas resumidas y representaciones gráficas de los datos para descubrir similaridades, tendencias, anomalías, o verificar suposiciones. Este análisis permitirá al final conocer que variables pueden descartarse ya sea porque no aportan información al modelo, o porque repiten información de otras variables, o porque puede volver complejo el análisis.
Para las variables numéricas vamos a calcular sus correlaciones entre pares para determinar que variables tienen altas correlaciones y por lo tanto están aportando información muy similar.
Para esto, hemos creado dentro del paquete "desistimiento" la función llamada "ds_analisis_cuantitativas" que muestra las correlaciones entre las variables que sean numéricas y si existe un par de variables con una correlación alta de más del 80% se elimina una de ellas.
matrixCorrelaciones = ds_analizar_cuantitativas ("datos_NoNulos.csv") ver (matrixCorrelaciones)
De los resultados anteriores, la matrix de correlaciones muestra que las variables "NroHijos" y "NroGrupoFamiliar" están muy correlacionadas (91%) y por lo tanto se eliminó una de ellas: "NroGrupoFamiliar".
Para analizar lar variables categóricas, vamos a construir gráficos o histogrmas que nos ayuden a ver de forma visual como se están distribuyendo los distintos valores de cada variable.
Para esto hemos creado la función "ds_distribuciones" que crea en un archivo llamado "graficos_distribuciones.png" las distribuciones de cada variable del conjunto de datos de entradas, la función se llama así:
ds_distribuciones ("datos_NoNulos.csv"); knitr::include_graphics("graficos_distribuciones.png")
Observando los gráficos anteriores, nos interesa determinar las variables que pueden causar "ruido" al análisis, ya sea por alguna de las siguientes razones:
Distribuciones similares entre variables: representan variables con la misma información al de otras variables y por lo tanto es suficiente con preservar una sola de ellas.
Distribuciones con un valor dominante: son variables que presentan un único valor o si presentan más de un valor, la proporción de estos es muy baja frente a un valor dominante, por lo tanto brindan muy poca información y se deben eliminar del análisis.
Distribuciones complejas: son variables que tienen un gran cantidad de categorias y vuelven el análisis muy lento o imposible para los algoritmos o modelos predictivos que se vayan a utilizar, por tanto se las debe eliminar del análisis.
Teniendo en cuenta las razones anteriores junto con los gráficos de las distribuciones las variables, podemos observar lo siguiente:
Las primeras dos gráficas de "AñoDesmovilizacion" y "AñoIndependización" presentan distribuiciones muy similares y por lo tanto es suficiente una sola de ellas así que eliminamos la variable "AñoIndependización".
Existen varias variables con distribuciones con un valor dominante, entre ellas "BeneficioFA", "BeneficioFPT", "BeneficioPDT", y "BeneficioTRV", "ClasificacionComponente", e "Ingreso". Por lo tanto estas variables no brindan gran información y se eliminan del análisis.
La variable "MunicipioResidencia" presenta muchas categorías, dadas por cada ciudad. Además parte de la información que tiene esta variable esta implicitamente en la variable "DeptoResidencia". Así que se elimina "MunicipioResidencia" y dejar solo "DeptoResidencia".
El resto de las variables se les observa una distribución con por lo menos dos estados diferenciados y se dejan para el análisis.
De acuerdo a los dos análisis anteriores, tanto de las variables cuantitativas como de las cualitativas, se deben eliminar las variables que puedan causar problemas en los análisis siguientes. Para esto hemos implementado la funcion "ds_eliminar_variables" que elimina de un conjunto de variables de un conjunto de datos. La función se llama así:
variables = c("NroGrupoFamiliar", "AñoIndependizacion", "BeneficioFA", "BeneficioFPT", "BeneficioPDT", "BeneficioTRV","ClasificaciónComponente", "Ingreso", "MunicipioResidencia") resultados = ds_eliminar_variables ("datos_NoNulos.csv", variables) ver (resultados, n=35)
Como se puede observar en la tabla anterior, se ha pasado de 35 a 26 variables . Estas ultimas variables son las que se tomarán de aquí en adelante para realizar los análisis siguientes.
En este análisis buscamos las categorías por cada variable que tengan muy pocas observaciones en relación al total del conjunto de datos, las cuales al momento de construir el modelo predictivo van a presentar problemas para el modelo.
Es decir, si una categoría, por ejemplo "Vaupés", que pertenece a la categoría "DptoResidencia" tiene solo 10 observaciones frente a las más de 25000 que existen, entonces esas 10 observaciones que pertenecen a 10 desmovilizados se eliminan del conjunto de datos.
Para hacer este proceso para todas las variables, vamos a definir una proporción de observaciones mínima del 0.05% de todas las observaciones, es decir, de 25928 observaciones que existen, por lo menos deben existir 130 individuos en cada categoría. Si no es así, los individuos de esa categoría que no cumple el mínimo se eliminan.
Para esto hemos construido la función "ds_limpiar_observaciones" que toma como entrada un archivo con los datos, elimina las observaciones de las categoría con pocos datos, y guarda los resultados en un nuevo archivo "datos_Limpios.csv". La función se llama así:
ds_limpiar_observaciones ("datos_Filtrados.csv")
El desbalance en una variable binaria, como lo es la variable objetivo de nuestro análisis con dos estados: "EXITO" y "FRACASO", ocurre cuando existe una desproporción muy amplia en las categorías de la variable. Así el número de observaciones de una categoría es mucho mayor que el de la otra.
Si existe este desbalance el entrenamiento de un modelo de predicción se puede sesgar hacia la categoría que es mayoría, es decir, predecir casi siempre una observación nueva con la categoría mayoritaría.
Un método simple para realizar la correción de una variable binaria desbalanceada es el "submuestreo", que consiste en eliminar datos de la categoría mayoritaria de forma aleatoria hasta que ambas categorías tengan la misma proporcion: 50:50.
Dentro de nuestro paquete de funciones, hemos implementado la función "balancear_varobjetivo" que toma un archivo con los datos, realiza el balanceo y los guarda en un nuevo archivo llamado "datos_Balanceados.csv", para finalmente crear y muestrar un resumen\ gráfico. La función se llama así:
ds_balancear_varobjetivo ("datos_Limpios.csv") knitr::include_graphics("histogramas_balanceo.png")
Como se puede observar de los dos histogramas anteriores, al inicio se tiene la información de la variable objetivo "SituacionFinal" de 19778 (75%) desmovilizados en la categoría EXITO y tan solo 4950 en la categoría FRACASO. 4950 (25%). Después de realizar el balanceo se tiene 5148 desmovilizados en cada categoría, es decir 50% en EXITO y 50% en FRACASO.
Para realizar el modelo predictivo hemos seleccionado un modelo de regresión lógica ya que es un modelo simple, con una base matemática sólida, que produce buenos resultados, y que ha sido usado en muchos otros estudios cuantitativos de desistimiento [Pinilla2019].
Antes de mostrar el modelamiento vamos a introducir brevemente los conceptos de aprendizaje automático y regresión lógica.
Un modelo de aprendizaje automático trabaja sobre un conjunto de datos para aprender de ellos su estructura y determinar las reglas implicitas o patrones ocultos que rigen o tienen esos datos.
Los datos están compuestos de varias variables de interés de las cuales conocemos sus valores, sin embargo, en algún momento vamos a tener nuevos datos de los cuales desconocemos el valor de una variable y es en ese momento que las reglas encontradas en los datos conocidos servirán para predecir el valor de la variable desconocida en los nuevos datos, y a esto es lo que se llama un modelo predictivo.
Ahora, para que este modelo aprenda de los datos de forma automática se necesita realizar un proceso de entrenamiento-evaluación que finalmente dará como resultado un modelo entrenado y listo para usarse para predecir una o más variables de interés.
El entrenamiento implica un conjunto de datos de los cuales conocemos todos los valores de sus variables. De aquí se extraen las reglas o parámetros del modelo, lo que se conoce como ajuste o entrenamiento del modelo. Una vez se tiene entrenado el modelo se lo prueba con otro conjunto de datos del cual se conoce también todas sus variables, excepto que ahora se le esconde al modelo los valores de una variable determina o variable objetivo para que el modelo prediga su valor. Finalmente, se mide que tan exacta fue la predicción, ya que conocemos el valor real y si la exactitud es buena entonces se pude llevar el modelo a producción, es decir utilizarlo para realizar predicciones de una manera confiable.
La regresión logística es una técnica utilizada cuando la variable dependiente es categórica (o nominal). Un caso especial de este tipo de técnica es la regresión logística binaria, en la cual se busca predecir el valor de una variable independiente categórica binaria (solo dos categorías), la cual se va conocer como variable objetivo. con base en uno o más variables independientes, que se van a conocer como variables predictoras.
En nuestro caso, la variable objetivo será "SituacionFinal", con dos posibles valores: "EXITO" y "FRACASO" que representa si el desmovilizado culminó el proceso o de lo contrario está ya fuera de el. Así mismo, las variables predictoras son el conjunto de las variables que describe a cada desmovilizado, que en nuestro caso quedaron 34 variables después de un proceso de limpieza y análisis realizado en las fases anteriores.
A continuación vamos a presentar el proceso de crear un modelo de regresión logística, crear los conjuntos de datos para ajustar este modelo, y probar la calidad del modelo. Además, vamos a mostrar como mejorar este modelo para reducir el número de variables predictoras a las más importantes, y vamos a evaluar el modelo usando distintas métricas, al final mostraremos como el modelo trabaja para predecir el posible EXITO o FRACASO de un conjunto de datos de desmovilizado que ingresan al proceso.
Antes de crear el modelo se debe "binarizar" la variable objetivo a los valores de 0 y 1, donde 0 corresponde a "FRACASO" y 1 a "EXITO". Para esto implementamos la función "ds_binarizar" que toma el archivo con los datos, convierte la variable objetivo a 0 y 1, y guarda los resultados en otro archivo llamado "datos_Binarizados.csv". La función se llama así:
ds_binarizar ("datos_Balanceados.csv")
En un modelado predictivo automático, se parte de un conjunto de datos del cual conocemos el valor de sus variables. Además, conocemos también cual es la variable que nos interesa después predecir su valor, la cual la llamamos como la variable objetivo.
Entonces, partiendo de este conjunto de datos conocido, estos datos deben dividirse en dos subconjuntos: uno para entrenar el modelo, es decir ajustar sus parámetros, y otro para probarlo. Generalmente se toma el 70% de los datos para entrenamiento y el 30% restante se toma para probar el modelo.
Para obtener estos dos subconjuntos hemos implementado una función, dentro de nuestro paquete de desistimiento, la cual dado un archivo con el conjunto de datos, lo divide en 70% y 30% de muestras tomadas aleatoriamente para los subconjuntos de entrenamiento y pruebas, respectivamente. Los nuevos archivos se guardarán con los nombres de "datos_Entrenamiento.csv" y "datos_Pruebas.csv". La función se llama así:
ds_dividir_datos ("datos_Binarizados.csv")
El modelo de Regresión Logística es muy usado para problemas donde la variable objetivo a predecir es binaria (ej. Si/No, pertenece/noPertenece, etc.), como sucede en nuestro caso, donde la variable "SituacionFinal" está determinada por dos valores: EXITO o FRACASO, para determinar si culminó el proceso de demovilización o esta fuera del mismo.
Vamos a definir la formula del modelo, es decir cual es la variable objetivo y cuales son las variables predictoras. En las formulas que recibe R en los modelos de predicción, la variable objetivo va a la izquierda, sigue un guión, y a la derecha van las variables predictoras, como en las ecuaciones matemáticas:
y \~ x0 + Ax1 + Bx2 + Cx2...
Siendo y la variable objetivo; x0, x1, x2,..., las variables predictoras; y A, B, C, ... los parámetros del modelo.
Las variables de nuestro modelo las podemos ver llamanda a la función "ds_resumen_modelo", de la siguiente forma:
ds_resumen_modelo ("datos_Binarizados.csv")
Para entrenar el modelo utilizamos los datos de entrenamiento obtenidos anteriormente y guardados en el archivo "datos_Entrenamiento.csv". Para esto utilizamos la función "ds_entrenar_modelo" que recibe el archivo de datos de entrenamiento y retorna una variable que representa el modelo entrenado. Así:
modelo_entrenado = ds_entrenar_modelo ("datos_Entrenamiento.csv")
Ya entrenado el modelo, se lo utiliza ahora para probar su precisión con los datos de prueba que se obtuvieron al particionar los datos totales.
La función que hemos creado para esto se llama "ds_probar_modelo" y toma como entrada el modelo entrenado anteriormente junto con un archivo con datos de prueba. La función se llama así:
ds_probar_modelo (modelo_entrenado, "datos_Pruebas.csv")
El valor de precisión anterior corresponde a un 96% de precisión, lo que es bastante alto. Se espera que la precisión sea mayor al 70% y este modelo lo sobrepasa.
Ahora, el modelo tiene muchas variables: 26, vamos a buscar mejorar el modelo para subir la precisión o disminuir el número de variables predictoras, es decir, vamos a seleccionar las mejores características que permitan predecir desistimiento.
Dentro del modelo que se ajustó anteriormente, algunas variables van a tener una mayor influencia sobre la predicción que otras, igualmente algunas variables van a tener poca o ninguna influencia sobre la predicción. Estas últimas variables en vez de mejorar la predicción del modelo lo vuelven más complejo, ya sea en la interpretación del modelo, o ya sea que afecten su precisión, además de consumir tiempo de cómputo en su procesamiento.
Para mejorar el modelo vamos a seleccionar las mejores variables predictoras usando un método que se conoce como "regresión por pasos" (stepwise regression), y específicamente una regresión por pasos "hacia adelante" (forward), donde el objetivo es ir construyendo un modelo adicionando de una en una las variables predictoras.
El proceso comienza con un modelo que no contiene variables o modelo nulo al cual se le van agregando de una en una las variables más significativas. Cada que se adiciona una nueva variable se verifica si el modelo mejora o no, si mejora la variable adicionada será parte del nuevo modelo, sino mejora se descarta esta variable y se adiciona la siguiente variable más significante, , y así sucesivamente hasta encontrar un conjunto de variables predictoras que sean estadísticamente significativas para la predicción de la variable objetivo.
Para realizar todo este proceso de optimización y selección de variables, hemos implementado la función "ds_seleccionar_variables" que recibe como entrada dos archivos de datos, el de entrenamiento y el de pruebas, se modifican estos archivos con las variables seleccionadas, y se guardan los nuevos datos en los archivos "datos_Entrenamiento_Seleccionado.csv" y "datos_Pruebas_seleccionados.csv". La función retorna una tabla resumen con las variables más importantes ordenadas de mayor a menor significancia. La función se llama así:
resumen = ds_seleccionar_variables ("datos_Entrenamiento.csv", "datos_Pruebas.csv") ver (resumen,n=0)
Podemos observar de los resultados anteriores que la optimización del modelo nos muestra que solo son necesarias las primeras 8 variables más significativas para obtener un resultado igual o mejor que el que se obtuvo con las 26 variables del modelo inicial.
Esto se muestra a través de dos métricas muy relacionadas: la desviación (Deviance) y la métrica AIC (criterio de información de Akaike). Ambas métricas miden la bondad de ajuste de un modelo a los datos, es decir, cuánto se desvía un modelo de regresión logística de un modelo que se ajusta perfectamente a los datos. Cuanto menor sea el número, mejor se ajusta el modelo.
La diferencia entre las dos métricas es que el modelo de mejor ajuste según AIC es el que explica la mayor cantidad de variación utilizando la menor cantidad posible de variables independientes. Así, si dos modelos explican la misma cantidad de variación, el que tenga menos parámetros tendrá un puntaje AIC más bajo.
A continuación, con estas 8 variables se construye un modelo predictivo optimizado y lo probamos para ver su precisión:
Para entrenar el modelo utilizamos los datos de entrenamiento con las variables seleccionadas obtenidos anteriormente y guardados en el archivo "datos_Entrenamiento_Seleccionado.csv". Utilizamos nuevamente la función "ds_entrenar_modelo" así:
modelo_optimizado = ds_entrenar_modelo ("datos_Entrenamiento_Seleccionado.csv")
Ya entrenado el modelo, lo utilizamos ahora para evaluar su presición con los datos de prueba con las variables seleccionadas obtenidos en la optimización. Utilizamos nuevamente la función "ds_evaluar_modelo" así:
ds_probar_modelo (modelo_optimizado, "datos_Pruebas_Seleccionado.csv")
Con este modelo optimizado hemos mejorado la precisión de 96% a 97%, pero ahora con solo 8 variables en vez de las 26 variables iniciales. Igual que antes, este valor de precisión anterior es bastante alto.
Para evaluar realmente la bondad de un modelo se deben utilizar varias métricas, no solo una, como lo hemos hecho hasta ahora. Por tanto, en esta sección vamos a utilizar un conjunto de métricas muy usadas en modelos predictivos que van a mostrar la bondad del modelo desde diferentes perspectivas.
Antes de iniciar con las métricas vamos a describir una herramienta llamada matriz de confusión a partir de la cual vamos a calcular dos métricas: exactitua y especificidas. Esta matríz se construye sobre un conjunto de datos de prueba donde se conoce el valor predicho por el modelo y el valor real de una variable objetivo.
Para nuestro caso, se tiene un conjunto de datos de prueba de los cuales conocemos tanto los valores positivos como negativos de la variable objetivo "SituacionFinal". Los positivos son los desmovilizados que culminaron el proceso y que tienen el valor de EXITO. Mientras que los negativos son los desmovilizados que terminaron fuera del proceso y que tiene el valor de FRACASO. De estos datos, conocemos lo que el modelo predijo (EXITO o FRACASO) pero también conocemos lo que realmente sucedió, es decir, si el desmovilizad culminó o está fuera del proceso.
La matriz se puede representar gráficamente de la siguiente manera:
Donde las filas represtan los valores predichos por el modelo (0 o negativo para FRACASO, 1 o positivo para EXITO) y las columnas los valores reales de los datos. Lo que da como resultado cuatro posibles opciones de valores predichos frente a valores realesque tienen el siguiente significado:
Verdadero positivo: El valor real es positivo y la prueba predijo tambien que era positivo. O bien un desmovilizado CULMINÓ el proceso y la prueba así lo predijo.
Verdadero negativo: El valor real es negativo y la prueba predijo tambien que el resultado era negativo. O bien un desmovilizado salió del proceso (FUERA) y la prueba así lo predijo.
Falso negativo: El valor real es positivo, y la prueba predijo que el resultado es negativo. El desmovilizado CULMINÓ el proceso, pero la prueba dice de manera incorrecta que esta FUERA. Esto es lo que en estadística se conoce como error tipo II.
Falso positivo: El valor real es negativo, y la prueba predijo que el resultado es positivo. El desmovilizado está FUERA del proceso, pero la prueba dice de manera erronea que si lo CULMINÓ. Esto es lo que en estadística se conoce como error tipo I
Responde a la pregunta ¿con qué frecuencia es correcto el predictor? y se calcula de la siguiente manera:
Exactitud = (TP+TN)/(TP+TN+FP+FN)
Responde a la pregunta: Cuando es no, ¿con qué frecuencia predice el no? y se calcula de la siguiente manera
Especificidad = TN/(TN+FP)
El área bajo la curva ROC es un método muy útil para evaluar un modelo que permite visualizar el equilibrio entre la tasa de verdaderos positivos y la tasa falsos positivos. Esta se calcula trazando la tasa positiva verdadera (sensibilidad) frente a la tasa de falsos positivos (1 - especificidad).
Los curvas ROC que son buenas son las que mantiene una tasa baja de Falsos Positivos (observaciones mál predichas) mientras tienen una tasa alta de Verdaderos Positivos (observaciones bien predichas), es decir curvas que se orienten hacia la esquina superior izquierda. Las siguientes son algunos ejemplos de curvas ROC:
{width="307"}
A continuación evaluamos las métricas anteriores en el modelo predictivo optimizado con los datos de prueba obtenidos después de la selección de variables. Para esto, hemos creado la función "ds_evaluar_modelo" que recibe como entrada el modelo optimizado calculado anteriormente junto con el archivo de datos de pruebas, así:
ds_evaluar_modelo (modelo_optimizado, "datos_Pruebas_Seleccionado.csv")
De los resultados anteriores, se puede observar los valores altos de 96.9%, 94.5% y 99.2%, para exactitud, sensibilidad y especificidad, respectivamente. Lo que nos permite concluir que es un buen modelo predictivo. Además, los resultados de la curva ROC están de acuerdo con los resultados de las otras métricas al mostrar una curva con una tase de Falsos Positivos muy baja frente a una tass de Verdaderos Positivos bastante alta.
La etapa final de todo este análisis es la puesta en producción o despliegue del modelo, es decir, que el modelo entrenado y optimizado se pueda usar con nuevos datos de desmovilizados que ingresan al proceso. Al usar el modelo lo que se busca es lograr predecir, con una confianza alta, si estos nuevos desmovilizados podrían culminar el proceso, lo que corresponde a EXITO, o de lo contrario podrían abandonarlo en algún momento, lo que corresponde a FRACASO.
Parte de ese despliegue lo constituye el paquete de funciones en lenguaje R que hemos implementado para llevar todo este análisis predictivo, como lo hemos mostrado en las secciones anteriores. Sin embargo, si alguien quiere usar el modelo optimizado que se ajustó en la etapa de entrenamiento, entonces puede usar una función que hemos implementado para cargar ese modelo y usarlo, sin necesidad de repetir todos los procesos descritos anteriormente. La función se llama "ds_cargar_modelo", que carga el modelo optimizado que se entrenó con las 8 variables y con los 4950 datos de desmovilizados. La función se llama así:
modelo = ds_cargar_modelo ()
Una vez se ha cargado el modelo, ya se lo puede utilizar para predecir las "SituacionFinal" de nuevos desmovilizados siempre y cuando se tenga la siguiente información de cada uno de ellos:
DesembolsoBIE
PoseeServicioSocial
OcupacionEconomica
EstadoISUN
NivelEducativo
ExGrupo
ServiciosPúblicos
TipoVivienda
A continuación se muestra el proceso completo para predecir la "SituacionFinal" de un grupo de desmovilizados que han ingresado al proceso de desmovilización.
La siguiente prueba muestra de forma completa la predicción con un conjunto de datos de 10 desmovilizados. El conjunto de datos tiene la información de las 8 características o variables que se seleccionaron en el proceso de optimización, el archivo con estos datos debe estar en formato excel (.xlsx).
Solo para mostrar la funcionalidad al momento de evaluar nuevos datos con el modelo optimizado, hemos creado un archivo que lo puede usar, si todavía no tiene un conjunto propio. Para crear este conjunto de datos debe llamar a la función "ds_datos_evaluacion" que crea el archivo "datos_Evaluacion.xlsx". La función se llama así:
ds_datos_evaluacion()
La función que hemos implementado para realizar la evaluación se llama "ds_predecir" que recibe como entrada solo el archivo con los nuevos datos, en este ejemplo, con los datos de los 10 desmovilizados anteriores. La función se llama así:
ds_predecir ("datos_Evaluacion.xlsx")
El resultado de la función es un nuevo archivo llamado "datos_Predichos.xlsx", en formato excel con las predicciones al inicio, así:
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.