Consultoría

CausalImpact me ha complacido mucho

Estoy aquí analizando datos para un cliente interesado en estudiar si como consecuencia de uno de esos impuestos modennos con los que las administraciones nos quieren hacer más sanos y robustos. En concreto, le he echado un vistazo a si el impuesto ha encarecido el precio de los productos gravados (sí) y si ha disminuido su demanda (no) usando CausalImpact y me ha complacido mucho que la salida de summary(model, "report") sea, literalmente, esta:

Fases divergentes y convergentes del análisis de datos

Aquí se propone un método para el análisis de datos que resume

Consta de dos procesos divergentes,

  • la exploración de los datos y
  • la modelización

y dos convergentes,

  • la síntesis y
  • la narración, que concluye el análisis.

En el enlace anterior se describe el proceso con más detalle. Eso sí, mis comentarios. El primero es que cada vez veo menos diferencia entre explorar y modelar. No entiendo ninguna exploración que no esté motivada por un modelo implícito; p.e., representar las medias por grupo no es otra cosa que una ANOVA para pobres. Crear árboles de decisión sobre los datos brutos es muy indicativo de por dónde van los tiros en los datos, qué variables son más importantes, cuáles son irrelevantes, etc. Obviamente, el modelo final no va a ser ninguno de estos protomodelos, pero sí que contienen su germen.

Clasificación vs predicción

Aquí se recomienda, con muy buen criterio, no realizar clasificación pura, i.e., asignando etiquetas 0-1 (en casos binarios), sino proporcionar en la medida de lo posible probabilidades. Y llegado el caso, distribuciones de probabilidades, claro.

La clave es, por supuesto:

The classification rule must be reformulated if costs/utilities or sampling criteria change.

Sobre la normalización de las direcciones postales

Lo de las direcciones postales es un caos. Trabajar con ellas, una tortura. Y cualquier proyecto de ciencia de datos que las emplee se convierte en la n-ésima reinvención de la rueda: normalización y tal.

Cuando todo debería ser más sencillo. Cada portal en España tiene asociado un número de policía, un identificador numérico único. Independientemente de que quienes lo habiten se refieran a él de formas variopintas, vernaculares y, en definitiva, desnormalizadas y desestandarizadas hasta pedir basta.

P-valores y decisiones

Los números de esta entrada son reales aunque disfrazados: proceden de un proyecto real. Para medir la efectividad de una serie de modelos que hemos creado en Circiter, hemos pedido al cliente lo de siempre: que parta la lista de sujetos en dos al azar para después poder medir los éxitos y fracasos usando dos procedimientos distintos.

Pero como tenemos dudas acerca del proceso de partición —que no controlamos nosotros— hemos medido el número de éxitos y fracasos en cada uno de los grupos en una prueba previa. Esperábamos que las proporciones fuesen similares en ambos grupos y hemos obtenido esto:

¿Qué variable distingue mejor dos subgrupos?

Es una pregunta que surge reiteradamente. Por ejemplo, cuando se compara un clúster con el resto de la población y uno busca las variables que mejor lo caracterizan. Y crear gráficos como

(extraído de aquí) donde las variables están ordenadas de acuerdo con su poder discriminador.

Mi técnica favorita para crear tales indicadores es la EMD (earth mover’s distance) y/o sus generalizaciones, muy bien descritas en Optimal Transport and Wasserstein Distance y disponibles en R y Python.

Un modelo que alimenta una simulación

Tenemos en Circiter un proyecto sobre el que no puedo dar muchos detalles, pero que vamos a plantear (en versión muy resumida) como un modelo que alimenta una simulación.

El modelo no va a ser un modelo sino un modelo por sujeto (rebaños, los llamamos aquí). Los modelos serán, casi seguro, modelos mixtos (lmer/glmer).

Pero claro, si usas un modelo, por muy mixto que sea, con intención de simular, predict se queda muy corto (¡siempre da la el mismo resultado!).

Simulación de procesos de Poisson no homogéneos y autoexcitados

Fueron mis modelos favoritos un tiempo, cuando modelaba visitas y revisitas de usuarios a cierto malhadado portal.

Si las visitas fuesen aleatorias (en cierto sentido), tendrían un aspecto no muy distinto del que se obtiene haciendo

library(IHSEP)

suppressWarnings(set.seed(exp(pi * complex(imaginary = 1))))

tms <- simPois(int = function(x) .1, cens = 1000)
hist(tms, breaks = 100, main = "Proceso homogéneo de Poisson",
      xlab = "", ylab = "frecuencia")

Es decir,

o bien una distribución uniforme en el tiempo. Pero bien puede ocurrir que una visita incremente la probabilidad de otra inmediatamente después, por lo que las visitas tenderían a arracimarse en determinados momentos. Con el paquete [IHSEP](https://cran.r-project.org/package=IHSEP) de R pueden simularse (y ajustarse) este tipo de modelos. Por ejemplo,

Ceteris paribus vs Heráclito

Nuestro producto aumenta el X de las empresas en un Y%.

¿Cuántas veces hemos oído eso?

Esa afirmación presupone una fe ciega en la posibilidad de aplicar el principio del ceteris paribus en situaciones reales. Pues lo siento: el ceteris paribus es un concepto irreal, una aspiración a la que la realidad de las cosas se opone tozudamente.

¿Y Heráclito? Heráclito nos observa desde donde esté y se fuma un puro.

Las decisiones son lo primario; la estadística es subsidiaria

En Circiter estamos negociando con unos clientes potenciales acerca de, tal como nos dijeron inicialmente, construir un modelo. Todo bien.

En la última reunión surgió la pregunta (¡qué vergüenza por mi parte no haberla planteado mucho antes!): ¿cómo habría que usarlo para dar soporte al negocio? La discusión subsiguiente dejó claro que habría que cambiar sustancialmente la aproximación al modelo. Por ejemplo:

  • Era tanto o más importante la discriminación intra-sujeto que la entre-sujeto (es decir, importaba más lo que el modelo pudiera decir de los ítems de cada sujeto que las diferencias que pudiera mostrar entre sujetos).
  • La capacidad predictiva del modelo, aun siendo importante, se volvía una medida subsidiaria.
  • Cobraba una particular relevancia el problema del cold-start.

En definitiva, la necesidad de uso cambiaba la estrategia de modelación de arriba a abajo.