En este blog se exploran las posibilidades de analizar datos y crear modelos basados en la Teoría de la Información usando Powerhouse

Mostrando entradas con la etiqueta Variables Mixtas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Variables Mixtas. Mostrar todas las entradas

jueves, 18 de octubre de 2007

Un ejemplo del uso de variables mixtas

Hoy encontré un data set en Internet acerca de créditos. Se llama Home Equity Loan Data Set y lo usan en varios documentos con ejemplos del uso de SAS Enterprise Miner.

Quise comparar los resultados publicados con los que podría obtener con Powerhouse. Para obtener un resultado rápido, usé el AutoWizard, que una vez seleccionados los datos e identificada la variable a predecir, generó un modelo de segmentación y el de predicción en 10 segundos.

Luego generé el reporte de rendimiento del modelo de predicción OPFIT. Sobre el Training set el modelo acertó un 82.9% de la veces y sobre el Test set un 82.4%. El KS (Kolmogorov-Smirn Statistic) fue de 56.3% en el Trainig set y 45.4 en el Test set. La siguiente gráfica muestra el Lift

La tabla muestra el Lift por decil

No es un mal modelo y tiene un rendimiento similar al Modelo de Regresión costruído en SAS y publicado en el documento Data Mining using SAS Enterprise Miner. A case study approach.

Luego hice algo de análisis exploratorio usando el reporte de Estadísticas de Powerhouse (debería haberlo analizado antes) y me di cuenta que una variable que podría ser muy importante, había sido ignorada por tener un porcentaje de Nulos demasiado elevado.

La variable ignorada es DEBTINC que representa la relación entre la deuda y los ingresos (Debt to Income). Esta variable normalmente lleva mucha información acerca de la capacidad de pago de una persona. Cuanto mayor es esta relación, mayor probabilidad de mora existe.

Tenía varias opciones para incluir esta variable, aumentar el porcentaje permitido de Nulls en las variables (el valor prefijado era de 20%), hacer que Powehouse reemplace los Nulos o tratar esta variable como Mixta, asignando un valor no numérico a cada valor faltante.

Lo primero que hice fue reemplazar los Nulos, pero DEBTINC no apareció en la selección de variables y el modelo que obtuve no fue mejor que el anterior. Esto concuerda con la idea principal dada en ¿Qué hacer con los Nulls?, no reemplazar los Nulos salvo en casos absolutamente necesarios.

Luego pensé que quizás tratar a DEBTINC como Mixta podría funcionar. Probablemente el hecho de que este valor no esté completado lleve información acerca de la variable a predecir (para más detalles de este enfoque llamado Missing Value Pattern, se puede consultar el capítulo 8 de Data Preparation for Data Mining de Dorian Pyle), así que simplemente hice un nuevo proyecto en el que en la variable DEBTINC reemplacé los Nulos por "N/C" y declaré esta variable como Mixta. Luego procedí como lo hice anteriormente y estos fueron los resultados:

La variable DEBTINC fue seleccionada en primer lugar. El porcentaje de aciertos subió a un 88.66% y 88.77% para el TR y el TS respectivamente. El KS también mejoró mucho, 68.2 y 67.8 para el TR y TS. La curva Lift sobre el Test set mejoró notablemente

De la tabla de Lift se puede ver por ejemplo que el Lift para el decil 1 y 2 es 4.43 y 3.61 respectivamente, lo cual comparado con 2.90 y 2.34 del modelo anterior, es una mejora de alrededor de un 50%!


Conclusión, las variables Mixtas no sólo sirven para reemplazar valores vacíos, también pueden hacer un buen trabajo con valores faltantes.

viernes, 12 de octubre de 2007

¿Qué hacer con los NULLS?

Llamaré NULL a una posición de una variable que debería tener un valor pero está vacía. Por ejemplo, la siguiente variable tiene un NULL en la fila 4

Los NULLS pueden ser de dos tipos: valores faltantes y valores vacíos. Es muy importante tener en claro la diferencia entre los dos.

Un valor faltante es un valor que tiene sentido que exista. El ejemplo de arriba muestra una variable llamada Hpwr (potencia) y que pertenece a una tabla de datos acerca de vehículos. Otras variables de la misma tabla son MiGal (millas por galón), Cyl (cantidad de cilindros), WtLbs (peso en libras), Acc0-60 (aceleración de 0 a 60 mph), etc. En esta tabla, al vehículo representado en la fila 4 le falta el valor de la potencia. Debería existir un valor, pero no está. Este es un NULL del tipo valor faltante.

En cambio, un valor vacío es un valor que no tiene sentido que exista. Por ejemplo, consideremos una variable que indique el saldo en la cuenta corriente de un cliente. Si el cliente no posee cuenta corriente, ¿qué valor debería tener esa variable para ese cliente? Cero no puede ser, porque esto significaría que el cliente decidió tener cuenta corriente y en su saldo tiene 0$, y esto no es cierto. Veremos un poco más adelante cómo tratar con este caso.

Ahora que tenemos claro los dos tipos de NULLS veremos qué hacer en cada caso.

El caso más simple es el de valores faltantes. Por alguna razón el valor no está presente, aunque debería estarlo. ¿Qué hacer? La respuesta más simple es ignorar toda la fila. Hay veces en que los valores faltantes aparecen desparramados al azar en toda la tabla de datos, pero con suerte no hay demasiados. O sea, si tomáramos la decisión de ignorar las filas que tienen al menos un valor faltante, todavía nos quedaríamos con un porcentaje importante de total de filas (por ejemplo, sólo el 10% de las filas serían ignoradas así que nos quedaría el 90% para trabajar). Esta es la mejor solución, pero no siempre es posible.

Hay ocasiones en que si bien ninguna variable tiene individualmente más que un pequeño porcentaje de valores faltantes, el hecho de considerar todas las variables en conjunto hace que la cantidad de filas ignoradas sea lo suficientemente grande como para quedarnos sin datos para analizar. En este caso la única respuesta es completar los valores vacíos. El problema es con qué valor. Con cualquier valor que pongamos estaremos introduciendo un sesgo. En el artículo sobre la preparación de datos hablé sobre la estructura que conserva una fila. Si reemplazamos el valor faltante por un valor que no es apropiado, estaremos modificando esta estructura. Completar con el valor promedio de la variable no es una buena idea, por la razón expuesta anteriormente.

Dorian Pyle en su libro Data Preparation for Data Mining hace un tratamiento exhaustivo sobre el reemplazo de NULLS. Powerhouse se basa en uno de estos métodos para realizar el reemplazo automático de valores faltantes que tiene que ver con interferir lo mínimo posible con la estructura entre variables.

Antes de pasar al tratamiento de valores vacíos vale la pena tener en cuenta un caso que aparece muy a menudo. Muchas veces las variables que tienen sólo dos valores, por ejemplo SI y NO, vienen con un solo valor completado (por ejemplo SI) y el otro valor está vacío (significando en realidad que debería ser un NO). O sea, si nos guiamos por la cantidad de NULL reportados podríamos descartar esta variable por contener demasidos NULLS, pero un análisis más detallado indicará que sólo hay que cambiar los valores faltantes por NO. Powerhouse puede hacer esto en forma automática por medio de la opción VRN (o NRV en Inglés) durante la carga de datos.

Veamos ahora cómo tratar los NULLS cuando son del tipo valor vacío, o sea, que están sin completar porque no tiene sentido poner un valor.

En Powerhouse existe un tipo de variable llamada Mixta. La misma puede contener valores numéricos y categóricos a la vez. En el ejemplo del saldo de la cuenta corriente, si el cliente tiene cuenta corriente, el valor será el saldo, caso contrario, el valor será alguna indicación tal como "SIN CUENTA".


Powerhouse tratará esta variable como si fuera numérica para clientes con cuenta corriente y como si fuera categórica para el resto de los clientes.

Resumiendo, si la cantidad de valores faltantes no es demasiado grande, lo ideal es ignorar las filas que contienen valores faltantes, caso contrario reemplazarlos de manera que se interfiera lo mínimo posible con la estructura interna de los datos.

Si los NULLS representan valores vacíos, usar un string cualquiera para reemplazar los vacíos para que Powerhouse automáticamente trate esta variable como Mixta.