Medidas de Divergencia en Modelos de Predicción Binaria.

Luis Horna PhD., Alex Pérez Ing. Mat., Diego Huaraca Ing. Mat.

Departamento de Matemáticas. Facultad de Ciencias.

Escuela Politécnica Nacional

22 de junio de 2015.

El presente documento tiene como propósito describir a detalle el flujograma de la figura siguiente, así como las funciones utilizadas en el cálculo automático de varias medidas de divergencia en modelos de predicción binaria mediante R.

Nodo: Data Input

La tarea que se ejecuta en el nodo Data Input corresponde a la lectura de un archivo de datos desde SPSS (formato .sav) mediante la función read.spss() del paquete foreigno desde Excel (formatos .xls, .xlsx) a través de la función read_excel() del paquete readxl.

El conjunto de datos a analizar debe presentar la siguiente estructura:

En nuestro caso, a manera de ejemplo consideramos el siguiente conjunto de datos:

library(foreign)
# library(readxl)
data <- read.spss("data_act.sav", use.value.labels=FALSE, to.data.frame=TRUE)
# data <- read_excel("data_act.xlsx", sheet=1, na="")
#str(data)
#library(js)
#DT::datatable(round(data[1:50,],2), filter="top",options = list(
#  searching = TRUE,
#  pageLength = 5,
#  lengthMenu = c(5, 10, 15)
#))

El objeto data es un data frame con 15105 observaciones y 15 variables. La variable a predecir var.dep es una variable binaria que analiza la activación (realizar al menos un consumo) de una tarjeta de crédito (tc) en una ventana de tiempo determinada, definida como sigue:

\[ var.dep =\left\{\begin{array}{ll} 1, &\mbox{si se activa la tc},\\ 0, &\mbox{caso contrario.} \end{array} \right. \]

Nodo: Población

La tarea que se ejecuta en el nodo Población consiste únicamente en mostrar la distribución que presenta la variable dependiente binaria; permite conocer en que relación se encuentra el número de éxitos (activa) respecto al número de fracasos (no activa).

vardep <- data[,"var.dep"]
table(vardep)
## vardep
##     0     1 
##  5031 10074

En nuestro caso tenemos la proporción 2.002, es decir, por cada sujeto no activa tenemos aproximadamente 2 activa.

Nodo: Numérica

En el nodo Numérica, se crea una variable tipo.var, la misma que permite identificar las variables numéricas y las categóricas.

# Variable numérica o categórica
tipo.var <- sapply(data,class)

Nodo: Numérica - Categórica

En el nodo Numérica - Categórica el conjunto de datos inicial data es dividido en dos subconjuntos, uno conformado por las variables numéricas y el otro por las categóricas, considerando la varible tipo.var generada en el nodo previo.

# Variables categóricas
data.cat <- data[,which(tipo.var!="numeric")]

# Variables numéricas
data.num <- data[,which(tipo.var=="numeric")]

Una vez identificadas las variables numéricas data.num, nos centramos en calcular las siguientes medidas de divergencia:

Luego de analizar el poder de predicción de cada una de las variables independientes a través de la divergencia generada entre los conjuntos de sujetos activa y no activa, podemos disponder de un criterio de selección de predictores, considerando aquellos que mejor predigan la variable dependiente binaria.

Nodo: Divergencia

En el nodo Divergencia, se implementa una de las tareas principales del flujograma, la misma que consiste en calcular las medidas de divergencia mencionadas anteriormente para cada una de las variables independientes.

En nuestro caso empleamos la prueba KS para dos muestras como sigue, considerando la variable tiempo promedio entre consumos mean.tic, por ejemplo, dividimos sus observaciones a través del los valores de la variable var.dep, es decir construimos dos variables auxiliares, la una correspondiente al conjunto activa y la otra al no activa, tal como muestra el esquema siguiente:

En R lo realizamos a través de un código similar al siguiente:

df <- data.frame(vardep,data.num[, "mean.tic"])
mean.tic.act <- subset(df, subset=vardep==1)[,2]
mean.tic.noact <- subset(df, subset=vardep==0)[,2]

Una vez obtenidas las variables mean.tic.act y mean.tic.noact, calculamos el estadístico KS para dichas variables, utilizando la función ks.test del paquete stats. Tenemos que si el valor

# Estadistico KS
ks <- ks.test(mean.tic.act, mean.tic.noact)
ks
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  mean.tic.act and mean.tic.noact
## D = 0.9561, p-value < 2.2e-16
## alternative hypothesis: two-sided

Nodo: Cálculos

Nodo: Output