Archivo de la categoría: Consultoría

Sentencia Test-Achats

 sentencia_test_achats_1.PNG

A pesar del título no voy a hablar del principio de igualdad de trato entre hombres y mujeres en el acceso a bienes y servicios y su suministro que regula los factores actuariales para tarificar en función del sexo. Sólo me he ido a Rastreator.com y he tarificado a una mujer de 32 años con un vehículo de los más vendidos. La fecha de hoy es 06/07/2012. En diciembre de 2012 volveré a recuperar esta entrada y hablaré del derecho. Saludos.

Lecciones de economía de un ignorante. Los bancos pierden dinero para favorecer a unos y luego los salvamos todos

Si pintamos con Excel una línea con el Euribor a 6 meses y otra línea con el interés medio a un año de los depósitos bancarios. Tenemos:

euribor-frente-interes-medio-depositos-a-un-ano.PNG

La fuente de datos es:

  • http://sdw.ecb.europa.eu/quickview.do?SERIES_KEY=143.FM.M.U2.EUR.RT.MM.EURIBOR6MD_.HSTA
  • http://sdw.ecb.europa.eu/quickview.do?SERIES_KEY=124.MIR.M.ES.B.L22.F.R.A.2250.EUR.N

Los datos del interés medio los suministra el Banco de España. Sé que no son datos 100% comparables pero sirve para este argumento. Hasta 2009 los intereses que daban los bancos estaban por debajo del precio del dinero. DESPUÉS LOS BANCOS ESTÁN DANDO DINERO A PÉRDIDAS. Por problemas de liquidez, por problemas de aprovisionamiento, batallas de pasivo, por lo que sea,… PERO ESTÁN PERDIENDO DINERO Y LO SABEN, los márgenes son negativos. En principio los beneficiados son los clientes porque están dando intereses por encima del precio del dinero. Pero la insensatez al final la pagamos todos, tanto el que se beneficia por los altos intereses (tiene dinero) como el que no se beneficia (no tiene un duro) y por si fuera poco suben comisiones, se endurecen las condiciones de crédito y demás. Luego acudimos a las subastas de liquidez y a los fondos de reestructuración de idioteces varias, mentimos en nuestras cuentas de resultados y ¡ya está!

¿Y esto quién lo ha permitido?

Sentencia del Tribunal de Justicia de la UE sobre el caso WPS y SAS

El caso de WPS y SAS por fin tiene un final. World Programing Software ha vencido (por fin) al todo poderoso SAS Institute Inc. La sentencia establece que:

De este modo, procede señalar que no puede haber infracción del derecho de autor sobre el programa de ordenador cuando, como sucede en el caso de autos, el adquirente legítimo de la licencia no ha tenido acceso al código fuente del programa de ordenador correspondiente a esa licencia, sino que se limitó a estudiar, observar y verificar ese programa con el fin de reproducir su funcionalidad en un segundo programa.

WPS no tiene el código fuente de SAS por lo tanto está dentro de la ley y cuesta mucho menos, esto último no lo dicen, lo digo yo. También hay algún aspecto sobre el software propietario que es muy interesante pero tengo que estudiar si pone lo que pone:

40 En efecto, tal como el Abogado General señala en el punto 57 de sus conclusiones, admitir que el derecho de autor pudiera proteger la funcionalidad de un programa de ordenador supondría ofrecer la posibilidad de monopolizar las ideas, en perjuicio del progreso técnico y del desarrollo industrial.

¿Cómo se puede interpretar este artículo?

En fin, aunque comercialmente la gente de WPS deja mucho que desear ya pueden decir que tienen un software 100% legal.

Data mining, Business intelligence (y/o la nube)

Hace tiempo que quería publicar una entrada en respuesta a estos comentarios escritos en el blog. Se trata de analizar las búsquedas en Google a través de Google Trends de los términos: Business Intelligence, Data Mining, Cloud Computing y NOSQL. El resultado es más que interesante:

busquedas_google.png

En rojo tenemos Data Mining, en azul tenemos Business Intelligence, en naranja Cloud Computing y en verde NOSQL. A la vista de este gráfico cabe preguntarse ¿es R en la nube el futuro de la profesión? 

En la regresión logística ¿el sobremuestreo es lo mismo que asignar pesos a las observaciones?

Hoy vamos a volver sobre el tema del sobremuestreo. Respondemos a un lector, Roberto, que hace mucho tiempo planteó una duda al respecto. La duda se puede resumir: En un modelo logístico, ¿equivale entrenar un modelo con las observaciones sobremuestreadas a entrenar el modelo poniendo un peso a cada observación? Esta cuestión nunca me la había planteado. Siempre había realizado un sobremuestreo de las observaciones adecuando la población de casos negativos a la población de casos positivos. Si estás habituado a trabajar con Enterprise Miner de SAS es habitual asignar pesos a las observaciones para realizar el proceso de sobremuestreo. ¿Obtendremos distintos resultados?

Vamos a estudiar un ejemplo con SAS y analizar que está pasando:

*REGRESION LOGISTICA PERFECTA;
data logistica;
do i=1 to 100000;
  x=rannor(8);
  y=rannor(2);
  prob=1/(1+exp(-(-5.5+2.55*x-1.2*y)));
  z=ranbin(8,1,prob);
  output;
end;
drop i;
run;

title "Logistica con un 5% aprox de casos positivos";
proc freq data=logistica;
tables z;
quit;

Tenemos un conjunto de datos SAS con 100000 observaciones aleatorias y dos variables independientes (x e y) con distribución normal y creamos una variable dependiente z que toma valores 0 o 1 en función de la probabilidad de un modelo logístico. Es decir, podemos modelizar una regresión logística perfecta con parámetros Z=5.5 – 2.55x + 1.2y Esta distribución nos ofrece aproximadamente un 5% de casos positivos. A ser un modelo logístico perfecto Seguir leyendo En la regresión logística ¿el sobremuestreo es lo mismo que asignar pesos a las observaciones?

Begraphic un add in para Excel muy interesante

 

Me he descargado de Begraphic un add in gratuito en su versión lite para Excel que nos permite realizar algunos gráficos interesantes como velocímetros o mapas. También tiene la posibilidad de realizar dashboard en hojas Excel. Todas estas tareas las realizamos mediante menús de forma bastante sencilla. En realidad es un add in que nos permite vincular las características de formas de Excel a celdas, ¿a qué os suena esto? Efectivamente, a los mapas de Excel que publico periódicamente en este sitio. Pero en este caso la gente de Begraphic pone a vuestra disposición en este enlace unos cuantos mapas más.

¿A qué estás esperando para registrarte y descargarte este complemento de Excel?

En futuras entradas trabajaremos con él, pero si alguien se anima que nos cuente su experiencia.

Informes con R en HTML. Comienzo con R2HTML (I)

En las III jornadas de R tuve el placer de asistir al taller de Gregorio Serrano sobre informes con R. Me abrió los ojos. Siempre he pensado que R no es una herramienta que sirva para hacer informes [modo consultor = ON] R no servía para realizar reporting  [modo consultor = OFF]. Pero R tiene un poderoso motor gráfico y dispone del paquete R2HTML para poder realizar tablas en HTML y si trabajamos con libros CSS de estilos podemos obtener resultados muy atractivos. Así que la otra tarde me puse manos a la obra y creo que puede salir una trilogía interesante. Bueno, depende del interés que despierte esta entrada del blog haré más entregas, pero de momento tengo en mente llegar a 3.

Seguimos con el sistema habitual. Simulo unos datos de ejemplo que podéis copiar  y pegar en vuestra consola de R:

clientes=20000
saldo_vista=abs(rnorm(clientes,0,1)*10000+5000)
saldo_ppi=(runif(clientes,0.1,0.6)*rpois(clientes,2))*60000
saldo_fondos=abs(rnorm(clientes,0,1)*100000+3000)*(runif(clientes)>=0.6)
edad=rpois(clientes,60)
datos_ini<-data.frame(cbind(saldo_vista,saldo_ppi,saldo_fondos,edad))
datos_ini$saldo_ppi=(edad<65)*datos_ini$saldo_ppi
#Creamos la variable objetivo a partir de un potencial
datos_ini$potencial= runif(clientes,0,1)
datos_ini$potencial= datos_ini$potencial +
log(edad)/2 +
runif(1,0,0.03)*(saldo_vista>20000)+
runif(1,0,0.09)*(saldo_fondos>30000)+
runif(1,0,0.07)*(saldo_ppi>10000)
datos_ini$pvi=(datos_ini$potencial>=quantile(datos_ini$potencial,
0.85))*1
#Eliminamos la columna que genera nuestra variable dependiente
datos_ini = subset(datos_ini, select = -c(potencial))

Datos simulados de una entidad bancaria donde tenemos edad, saldos en distintos productos de pasivo e identificamos a aquellos clientes que tienen contratada una pensión vitalicia. Nos solicitan realizar un informe con los datos de contratación por edad y por pasivo. Cuando realizamos informes es muy habitual tramificar variables continuas. Para crear los tramos de edad y de pasivo vamos a emplear Seguir leyendo Informes con R en HTML. Comienzo con R2HTML (I)

Análisis del programa electoral del Partido Popular antes de las elecciones en España

Ya empleamos R en alguna entrada anterior para analizar textos. Ahora nos metemos con el programa electoral del Partido Popular a 20 días de las elecciones en España. En este link podéis descargaros el programa del Partido Popular. Lejos de lo insustanciales que suelen ser este tipo de documentos y alguna frase mítica del tipo “Crecimiento sin empleo no es recuperación” nos limitaremos a contar las palabras que emplean en este programa.

En el link donde tenemos el programa accedemos al mismo en formato PDF, seleccionamos todo el documento, lo copiamos en un archivo de texto y ya podemos trabajar con R. El código ya ha sido comentado en este blog:

#Análisis del programa del PP
#Leemos el fichero de una ubicación de nuestro equipo
ubicacion="D:\\raul\\wordpress\\text minning R\\programa_PP.txt"
texto = read.table (ubicacion,sep="\r")
#Dejamos todas las palabras en mayúsculas
texto = toupper(texto$V1)
#El texto lo transformamos en una lista separada por espacios
texto_split = strsplit(texto, split=" ")
#Deshacemos esa lista y tenemos el data.frame
texto_col = as.character(unlist(texto_split))
texto_col = data.frame(texto_col)
names(texto_col) = c("V1")

#Eliminamos algunos caracteres regulares
texto_col$V1 = sub("([[:space:]])","",texto_col$V1)
texto_col$V1 = sub("([[:digit:]])","",texto_col$V1)
texto_col$V1 = sub("([[:punct:]])","",texto_col$V1)
#Creo una variable longitud de la palabra
texto_col$largo = nchar(texto_col$V1)
#Controles que utilizo
head(texto_col)
hist(texto_col$largo)

texto_col = subset(texto_col, largo>4)

library(sqldf)
contador = sqldf("
select V1 as palabra,count(*) as frec
from texto_col
where largo > 4
group by palabra
order by count(*) desc ;")

CAMBIO, POLÍTICA, SOCIEDAD y EMPLEO son las palabras más empleadas. SOCIAL aparece en la posición 50 y JÓVENES mucho más abajo. CRISIS es otra de las palabras que no son muy destacadas. Abrid R, seguid los pasos que os indico y obtendréis un análisis muy interesante. Saludos.

Univariantes de campos de nuestra BBDD con kettle

El kettle no sólo puede servirnos para subir y bajar tablas a nuestra BBDD. También puede ayudarnos a describir las tablas de nuestras BBDD de una forma muy sencilla. El paso Univariate Statistics será nuestro aliado para esta sencilla tarea.

transfomacion_kettle.png

Lo primero que tenemos que hacer es crear una conexión a nuestra BBDD. Hace tiempo ya hablamos de esta labor con Postgres. Una vez creada la conexión comprobamos su correcto funcionamiento y el primer paso será una Entrada Tabla donde seleccionaremos la tabla que deseamos describir:

entrada_tabla_kettle.png

El botón Obtener consulta SQL nos permite navegar de forma sencilla por los distintos esquemas de la BBDD, seleccionamos la tabla y podemos ver la consulta a realizar, por supuesto podemos manipular el código SQL a nuestro antojo. Como siguiente elemento vamos a Seguir leyendo Univariantes de campos de nuestra BBDD con kettle

Los 10 errores y warnings más habituales en SAS

En función de los contactos con SAS support han elaborado un ranking de errores y warnings reportados a SAS con respecto al paso DATA. En este enlace tenéis el ranking, a los comentarios de Kim Wilson podéis añadir los míos. Veamos uno por uno esos errores:

  1. ERROR: AN INTERNAL ERROR HAS OCCURRED WHILE READING A COMPRESSED FILE. PLEASE CALL YOUR SAS SITE REPRESENTATIVE AND REPORT THE FOLLOWING…
    Tenéis que reparar el dataset como indica Kim, pero mucho ojo con mover datasets entre servidores o con trabajar con distintas versiones de SAS.
  2. ERROR: ARRAY SUBSCRIPT OUT OF RANGE AT LINE N AND COLUMN N
    Nos hemos ido de rango en el array sucede cuando recorremos los arrays con un bucle DO y el índice del bucle es mayor que el tamaño del array. Para evitarnos líos podemos hacer ARRAY AR(*) ; DO i = 1 TO DIM(AR); Que no se lleve nadie las manos a la cabeza.
  3. ERROR: THE FORMAT $NAME WAS NOT FOUND OR COULD NOT BE LOADED
    Llamamos a un  formato que no existe, muy habitual en input o put.
  4. NOTE: THE MEANING OF AN IDENTIFIER AFTER A QUOTED STRING MAY CHANGE IN A FUTURE SAS RELEASE. INSERTING WHITE SPACE BETWEEN A QUOTED STRING AND THE SUCCEEDING IDENTIFIER IS RECOMMENDED.
    Esto no pasa…
  5. NOTE: INVALID ARGUMENT TO FUNCTION INPUT AT LINE N COLUMN N
    En ocasiones el formato que ponemos en input es incorrecto y se produce este error, habitual cuando trabajamos con fechas
  6. NOTE: MERGE STATEMENT HAS MORE THAN ONE DATA SET WITH REPEATS OF BY VALUES
    Cuando hacemos un merge si uno de los conjuntos de datos tiene observaciones duplicadas por la variable que ponemos en BY obtenemos este WARNING, cuando cruzamos tablas SAS hemos de tener mucho cuidado con las observaciones duplicadas.
  7. NOTE: SAS WENT TO A NEW LINE WHEN INPUT STATEMENT REACHED PAST THE END OF A LINE
    No es muy habitual este error. Tenemos que realizar lo que nos dice Kim. La opción FLOWOVER no la he empleado nunca, en este link tenéis ejemplos de esta problemática.
  8. NOTE: INVALID DATA FOR VARIABLE-NAME AT LINE N
    Si definimos una variable de un tipo no podemos emplear datos de otro tipo, es decir, si la variable es numérica no la igualéis a un caracter y viceversa. Tenedlo en cuenta.
  9. WARNING: THE QUOTED STRING CURRENTLY BEING PROCESSED HAS BECOME MORE THAN 262 CHARACTERS LONG. YOU MAY HAVE UNBALANCED QUOTATION MARKS.
    Otro problema poco habitual, seguid haciendo caso a Kim.
  10. WARNING: MULTIPLE LENGTHS WERE SPECIFIED FOR THE VARAIBLE VARIABLE-NAME BY INPUT DATA SET(S). THIS MAY CAUSE TRUNCATION OF DATA.
    Este warning es muy típico cuando realizamos merge con variables alfanuméricas. Imaginemos que un dataset tiene la variable póliza definida como $10. y otro tiene la variable póliza definida como $12. si realizamos un merge por esa variable obtendremos este WARNING.

Estos son los errores que más aparecen en SAS SUPPORT. En mi opinión hay algunos que no son habituales pero hay algunos que son dudas recurrentes que me llegan. Al final lo que siempre plantea problemas son los formatos y las fechas en SAS, el 80% de las dudas que me llegan van por ahí. Espero complementar el mensaje de SAS.