Archivo de la categoría: Data Mining

El debate político o como analizar textos con WPS

¿Qué hacen los políticos españoles en el Congreso de los Diputados? Las tertulias radiofónicas están llenas de analístas políticos que podrán opinar sobre la labor del Congreso mejor que yo. Sin embargo yo tengo WPS, sé programar en SAS y en la web del Congreso están todas las sesiones y todas las intervenciones de la democracia. Pues con estos elementos vamos a iniciar un proceso de text mining, aunque no llegaremos a realizar ningún análisis complejo. Para comenzar, como siempre, necesito datos. Me he guardado la sesión del Congreso de los Diputados del día 26/01/2011 como web y posteriormente con Word la he salvado como fichero de texto (ojo con las codificaciones). De todos modos podéis descargaros aquí el fichero.

Comienza nuestro trabajo con WPS y lo primero es crear una tabla con la sesión:

filename sesion "D:\raul\wordpress\text mining WPS\PopUpCGI.txt" ;
data sucio;
infile sesion RECFM=V LRECL=10000;
informat linea1 $10000.;
format linea1 $10000.;
input linea1 $10000. ;
run;

Comenzamos con lo más sencillo pero considero necesario realizar unos comentarios. Cuando hacemos el INFILE la longitud de registro es mejor que sea variable, así aprovechamos los saltos de línea, como longitud de registro 10000 caracteres me parecen suficientes, esto no tiene mucha ciencia pero considero que las intervenciones no habrían de tener más de 10000 caracteres. Ahora tenemos una tabla de frases y yo quiero llegar a una tabla de palabras, será necesario un bucle que recorra caracter a caracter y separe las palabras Seguir leyendo El debate político o como analizar textos con WPS

Muchas variables no implican una mejor predicción

Me sigo durmiendo con el genio Juan Antonio Cebrián y sus pasajes de la historia, monográficos zona cero o tertulias 4 C. Sus programas de radio me acompañan desde hace muchos años. Estudiando, vigilando instalaciones del ejercito o en el turno de noche de una fábrica Cebrián y su gente ha estado conmigo. En alguna ocasión hablaron del código secreto de la Bíblia, un código existente en la Torá (Pentateuco) que se resume en “todo está escrito”.Y es que una gran cantidad de información puede provocar relaciones al azar (o al azahar como le gusta decir a un buen amigo). Y esto puede pasarnos en nuestros modelos matemáticos. Ejecutemos el siguiente código en R:

#DF de partida
df=data.frame(rnorm(1000,100,10))
names(df)=c("dependiente")
#Bucle para añadir 300 variables
for (i in 1:300){
x=data.frame(rnorm(1000,sample(1:100,1),sample(1:50,1)))
nombre=paste("x",i,sep="")
names(x)=nombre
df=cbind(df,x)
remove(x)}
#1.000 observaciones y 300 variables
head(df)

Tenemos un data frame con datos aleatorios, 1.000 observaciones y 300 variables. ¿Pueden existir relaciones aleatorias entre una variable dependiente y estas 300 variables aleatorias? Realicemos un modelo de regresión a ver que pasa:

modelo=lm(dependiente~. ,data=df)
summary(modelo)

No sé lo que os habrá salido a vosotros, pero he encontrado 5 variables donde rechazamos la hipótesis nula que establece que no hay relación lineal. Es decir, 5 variables aleatorias tienen una relación lineal con otra variable aleatoria. ¿Cómo es posible? El azar ha intervenido en nuestro modelo debido al gran número de variables que forman parte de él. Mirad con recelo a aquellos que os dicen “el modelo acierta” y no os justifican los motivos de tal acierto.

Trucos Excel. Área bajo la curva ROC

curva-roc.png

¿Curva ROC y Excel? ¡Si no tiene nada que ver! No del todo.  En ocasiones tenemos que pintar las curvas ROC y empleamos las herramientas específicas para ello, sin embargo es habitual que nuestros resultados sean presentados en Excel (demasiado habitual). En ese caso creamos nuestros datos para llevarlos a Excel y realizamos nuestro gráfico. Ya tenemos nuestra tabla y hacemos un algo muy parecido a lo que tenemos más arriba. La curva ROC es un mecanismo para evaluar nuestro modelo y compara la especificidad que es la probabilidad de clasificar mal un caso negativo frente a la sensibilidad que es la probabilidad de clasificar correctamente un caso positivo, es decir, falsos positivos frente a verdaderos positivos. El área bajo la curva ROC será un valor entre 0,5 y 1. Cuanto más próximo a 1 mejor será nuestro modelo. Queda pendiente una revisión “en condiciones” de las curvas ROC y de los gráficos lift, mucho mejores cuando tienes que presentar resultados en un área de negocio.

Entonces, ya tenemos el gráfico en Excel y nos piden hayar el área bajo la curva ROC. ¿Cómo lo hacemos esto? Mediante una simulación por método Montecarlo. Creamos números aleatorios y si están por encima de la sensibilidad pues no valen. Posteriormente sumamos los que valen entre todos los que tenemos y hemos obtenido un valor muy próximo al área bajo la curva ROC. En realidad es un método para estimar el área de un póligono. Para entender mejor como se realiza el proceso os un documento de Excel con datos simulados:

curva_roc con datos simulados. Veréis que es muy sencillo. No se puede ser más dinosaurio pero ya verás como a más de uno se le enciende la bombilla. Saludos.

Medir la importancia de las variables con Random Forest

¿Qué variables son las más importantes para nuestro modelo de clasificación? Yo creo que muchos de vosotros os habréis encontrado con esta problemática. Hay muchas formas de solventarla, habitualmente empleamos aquellas variables que mejor pueden entender nuestras áreas de negocio. Es decir, hacemos segmentaciones en base al sexo y la edad sólo por no tener que explicar como hemos construido una variable artificial a alguien que no entiende lo que es una variable y mucho menos variable artificial. Pero hoy os quería plantear la utilización de métodos de random forest con R para medir la importancia de las variables cuantitativas, para variables cualitativas recomiendo otras formas que plantearé más adelante. El random forest es un método de clasificación basado en la realización de múltiples árboles de decisión sobre muestras de un conjunto de datos. Hacemos muchas clasificaciones con menos variables y menos observaciones y al final nos quedamos con un promedio de estas clasificaciones, esa sería la idea a grandes rasgos. La característica que hace de este método muy interesante es la posibilidad de incluir un gran número de variables input en nuestro modelo ya que no encontraremos relaciones lineales entre ellas y tampoco aparecerán relaciones debidas al azar.

Para ilustrar nuestro ejemplo con R vamos a emplear un conjunto de datos que podéis obtener obtener en este link. Es una serie de datos y modelos, nos quedaremos con el conjunto de datos au2_10000.csv que tiene 251 variables Seguir leyendo Medir la importancia de las variables con Random Forest

Entrenamiento, validación y test

Cuando realizamos modelos hay 3 conjuntos de datos fundamentales:

  • Conjunto de datos de entrenamiento: son los datos que entrenan los modelos
  • Conjunto de datos de validación: selecciona el mejor de los modelos entrenados
  • Conjunto de datos de test: Nos ofrece el error real cometido con el modelo seleccionado

Para entender mejor su importancia y como funcionan he preparado el siguiente esquema/ejemplo:

entrenamiento-validacion-test.PNG

Una empresa de telecomunicaciones de cara a mejorar la efectividad de sus campañas comerciales decide realizar un modelo de propensión a la desconexión. Se define un universo Seguir leyendo Entrenamiento, validación y test

Gráficos de densidades con SAS y el PROC KDE

El PROC KDE de SAS está incluido en el módulo SAS/STAT. Es un procedimiento que nos permite estudiar gráficamente las distribuciones de variables continuas. Lo que nos produce son gráficos de densidades. Para seguir el ejemplo nos vamos a ir a Yahoo Finance y descargarnos un evolutivo del IBEX de los últimos 3 meses (yo realizo este proceso con Excel), una vez tengamos el dataset creado, para el análisis de la densidad univariante podemos hacer:
ods graphics on;
title "Análisis de volumen";
proc kde data=ibex;
univar volumen / plots=(DENSITY DENSITYOVERLAY
HISTDENSITY HISTOGRAM);
run;
title;
ods graphics off;

Tenemos los siguientes gráficos:

densityoverlayplot1.pnghistogram1.pnghistogramdensity1.png

KDE es uno de los procedimientos que trabajan con gráficos de ODS. Ya hemos hecho mención al cambio de filosofía de algunos procedimientos gráficos en SAS. Yo me atrevería a decir que los procedimientos clásicos tienen una “curva de parendizaje” muy complicada pero  los procedimientos de ODS empiezan a crear gráficos más que interesantes con una sintaxis más sencilla. Para los análisis univariantes yo prefiero el SGPLOT. Pero si en algo destaca KDE es en los gráficos de densidades bivariables. Ejecutemos:


ods graphics on;
title "Análisis de volumen X cierre en IBEX35";
proc kde data=ibex;
bivar cierre_ajustado_ volumen / plots=(CONTOUR CONTOURSCATTER HISTOGRAM
HISTSURFACE SCATTER SURFACE);
run;
title;
ods graphics off;

Y obtenemos…

surfaceplot6.pngscatterplot.pnghistogramsurface.png

contourscatterplot.pngcontourplot6.png

Destacan muy por encima de todos surface y contour. Imprescindibles en vuestros informes. Por cierto, vemos que hay dos picos bien diferenciados, uno con valores altos del IBEX y otro con valores bajos. El pico en torno a los 9.000 puntos es más alto que el pico de los 11.000, cuando especulador hay suelto. Saludos

Monográfico. Un poco de PROC LOGISTIC

El PROC LOGISTIC es un procedimiento de SAS que nos ha dado muchas satisfacciones a los dinosaurios como el ahora escribiente. La regresión logística es uno de los modelos de regresión más utilizados y es bien conocido por todos mis lectores (bastante más inteligentes que yo). El problema es muy sencillo hemos de clasificar una población dividida en dos partes a partir de unas variables independientes. Su aplicación es muy extensa: patrones de fuga, propensiones a compra, salud, fraude,… Con este monográfico pretendo acercaros en 3 minutos a las sentencias básicas en SAS para crear un modelo de regresión logística y proponer gráficos y validaciones. En la línea habitual del blog partimos de una simulación y analizamos la sintaxis, evitamos poner las salidas para no “cargar” la entrada con tablas de poca utilidad. El ejemplo es el que sigue:

data datos;
do id_cliente=1 to 20000;
edad=min(65,ranpoi(4,45));
pasivo=ranuni(4)*10000+ranuni(12)*(10000*(edad-5));
compras=round(pasivo/(ranexp(423)*1000));
vinculacion=max(1,ranpoi(2,round(pasivo/300000)+1));
recibos=ranpoi(1,2);
provincia=min(52,ranpoi(123,28));
output;
end;
run;

Conjunto de datos SAS con 20000 clientes de Banca Personal de una entidad bancaria que están en proceso de desvinculación. Otra entidad se ha puesto en contacto con rvaquerizo@analisisydecision.es y le han realizado un modelo de potencial de pasivo, un modelo de Share of Wallet de clientes que está funcionando a las mil maravillas y detectan que esta entidad les está provocando una reducción de pasivo y desvinculación de algunos de sus clientes. Lo detectan gracias al mecanismo de alarmas que diseñó rvaquerizo@analisisydecision.es (un poco de publicidad que todo esto sale de mi tiempo y mi bolsillo). El equipo comercial se pone en marcha Seguir leyendo Monográfico. Un poco de PROC LOGISTIC

Monográfico. Clasificación con SVM en R

Las máquinas de vectores de soporte, Support Vector Machines, SVM a partir de ahora, son un conjunto de técnicas estadísticas que nos permiten clasificar una población en función de la partición en subespacios de múltiples variables. Parte de la idea de dividir de forma lineal un conjunto de múltiples dimensiones. Creamos muchos hiperplanos que nos dividen las observaciones. Es una técnica que está ganando popularidad y que por supuesto podemos realizarla con R. Para ello tenemos algunos paquetes específicos como kvm, svmlight y el e1071. Este último es al que pretendo acercarme hoy.

El SVM es un algoritmo que, a partir del producto escalar de vos vectores multidimensionales, busca hiperplanos que separen los grupos. La función que define este producto escalar la denominaremos kernel y puede ser lineal, polinómica, radial o sigmoidal. Para clasificación el SVM se plantea como un problema de programación lineal en el que buscamos maximizar la distancia entre categorías sujeto a un coste y a un número óptimo de patrones de entrenamiento. Para entender mejor su funcionamiento trabajamos un ejemplo bidimensional:

#Simulación de un conjunto de datos bivariante
x=c(rnorm(500,1000,100),rnorm(500,2000,200),rnorm(500,3000,400))
y=c(abs(rnorm(500,50,25)),rnorm(500,200,50),rnorm(500,100,30))
grupo=as.factor(c(rep(1,500),rep(2,500),rep(3,500)))
datos=data.frame(x,y,grupo)

Tenemos un data frame con 3 variables, Seguir leyendo Monográfico. Clasificación con SVM en R

Las cuentas claras.

Si hay alguna tarea o procedimiento indispensable y más repetitivo hasta la saciedad por excelencia a la hora de trabajar con bases de datos y tener que reportar alguna información por mínima que sea, esta es contar o contabilizar el número de casos (registros) que tenemos en total o en subtotales (por grupos) dentro de una tabla (los llamados ‘datasets’ en SAS).

Para dar mayor utilidad a este ‘tutorial’ sobre conteo, partiré de una tabla con 2 columnas (campos) tipo cadena, es decir tipo texto, de manera que podamos ver diferentes métodos para contar-contabilizar NO solo campos tipo texto sino también trucos que nos den una solución más ‘elegante’ de la combinación de ambos campos tipo cadena. Estos 2 campos se llamarán ‘grupo’ y ‘tipo’,  muy empleados por muchos programadores, pero se podrían llamar tambien ‘familia’ y ‘familia_segmento’ o bien
‘comunidad_1’ y ‘comunidad_2’ o bien ‘zona_tipo1’ y ‘zona_tipo2’ o bien ‘entorno_primario’ y ‘entorno_secundario’, o si el ejercicio tratase de contar el número de alumnos por sexo y color de ojos bastaría con ‘sexo’ y ‘color_ojos’, etc etc.

 Este tutorial NO se adentrará en la sintaxis de cada método (veremos hasta 5 diferentes), solo alguna pinzelada de cada uno pues de lo contrario se nos haría demasiado largo. No obstante, explico un poco de cada método para ayudar a los menos entendidos en SAS.

 

Seguir leyendo Las cuentas claras.