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 foreign
o 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:
KS
,AD
,COR
.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.
KS
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