top of page

COSAS VEREDES

  • fjroar
  • 31 jul 2021
  • 5 Min. de lectura

Hace mucho tiempo, en una de mis vidas pasadas como consultor, escuché que un responsable DS de una conocida telco, le suelta un junior algo así como que una mejora de unas décimas en la curva ROC, significaba una mejora de miles o cientos de miles de euros en su caso de uso …

Bueno, sobre la curva ROC habría mucho de que hablar, sobre todo entender bien lo que significa (que aún muchos confunde con el r-cuadrado y no tiene ná que ver), pero eso lo dejo para otra sesión. Lo cierto, es que si a mí me sueltan algo como lo anterior, es muy probable que deje de considerar a esa persona como alguien que entiende de modelos y más le valga, darle un repaso a la estadística y sobre todo al sentido común, que parece ser el menos común de los sentidos.



Para empezar a hablar, vaya por delante que en estadística pocas o más bien nunca se tienen valores absolutos, prácticamente todo son variables aleatorias que siguen una distribución más o menos compleja, en algunos casos, bajo el marco de la estadística clásica y con hipótesis más o menos fuertes, se consigue conocer para un modelo, como el lineal, la distribución de sus parámetros y por tanto se tienen intervalos de confianza y todo aquello de lo que hoy no me apetece tratar.

Tanto esos modelos, como los actuales, en todos, hay variables aleatorias y la aleatoriedad es algo, que aunque se pueda controlar más o menos, ahí está y por tanto, está en los parámetros de los modelos y por supuesto en las estimaciones o medidas de su potencia predictiva, siendo la ROC un ejemplo de éstas en el caso de modelos de variable binarias

Si os vais a mi github, cuyo enlace os dejo aquí:


He dejado unos códigos muy sencillos para analizar un dataset como es el de biopsia que está dentro de la libreria(MASS) y que está bastante trillado pero, debido a que son pocos datos y variables, creo que puede valer para la explicación de este post.

Bien en ese código hay un par de funciones que he diseñado de modo no óptimo, pero que para este caso corren adecuadamente y nos va a permitir una discusión sobre la volatilidad de la curva ROC. Dichas funciones se denominan:

genera_roc_glm(seed, df) y genera_roc_knn(seed, df)

Y lo que hacen es que toman un dataframe df ya limpio (ojo, no aseguro que funcione para cualquier df limpio, la intención aquí es explicar un concepto, no hacer algo que raye la pureza informática, … ya que no soy informático), y lo dividen en el típico train-test al 70% bajo una semilla de aleatorización que se elije en seed, dando por tanto lugar en la primera función a la curva roc que se tendría bajo una regresión logística habitual y en el caso del knn sale el valor de la roc con los parámetros por defecto que tendría el algoritmo aplicado. Además para simplificar aún más la situación se toma como variable explicativa de la target a la V1 en este primer caso para ambas funciones.

Llegados a este punto, ¿qué pasa si seed = 1? En este caso se obtiene lo siguiente:

Claro, si soy forofo del 1 en las seed y siempre lo uso, podría afirmar que a nivel de predictividad el primero modelo es mejor que el segundo, y si no miro nada más, pues ala, a tratar de defenderlo. Pero claro, ahora viene el/la forofo/a del número 10 y hace le sucede lo siguiente:

Entonces se observa que para dicho forofo/a, lo lógico sería un knn ya que su predictividad es mejor.


Bueno en este caso resulta que lo que ocurre es que la ROC es una variable aleatoria y por tanto sus valores más frecuentes estarán bajo unos intervalos cuya distribución será difícil de conocer, ya que aparte de la semilla de aleatorización, también va a depender de la separación 70-30 o 60-40 o … que se haya realizado, por tanto hacer una apuesta a un modelo en concreto porque se gane unas décima de ROC es prácticamente como tirar una moneda al aire y básicamente el histograma de cuando se generan 100 semillas y se hace la misma operación es lo que se muestra, para el caso del modelo glm y knn en el dibujo inicial. En dichos histogramas de tan sólo 100 valores (podría calcularse para más), se observa que la media y la desviación típica resultan ser las siguientes:


media glm: 0.910738 media knn: 0.906869

desviación glm: 0.016557 desviación knn: 0.018118


Nótese que gráficamente y numéricamente todo iría hacia el glm, pero claro es una muestra de sólo 100 observaciones, pero las variaciones y los saltos de valores que se da en esta sencilla distribución van desde aproximadamente 0.85 hasta algo más de 0.94 tal y como se observa a continuación:

En casos de muchas observaciones, cuando he realizado este tipo de estudios, no he visto efectos tan grandes, pero sí bastante amplios, aunque con más concentración en torno a los valores medios, con lo que hay que tener cierto cuidado cuando nos fiamos de un índice. Es cierto, que la técnica de cross-validation también puede dar una idea de cómo va a ser la variabilidad de la ROC, pero sorprende que en los proyectos de modelización, este factor no se tengan en cuenta y los que yo denomino como “preparadores de datos” que son gente que se hacen llamar DS y que lo que saben es preparar datos para meterlos en una coctelera y sacar un alto ROC o bien no se dan cuenta, o directamente no entienden los saltos que pueden dar los estadísticos que están estimando.


Y bueno, visto esto, vamos a dar una vuelta de tuerca más, supongamos que ahora en vez de 1 variable, usamos V1 y V2, a ver qué es lo que pasa si repetimos el proceso, para eso he creado las funciones:

genera_roc_glm2(seed, df) y genera_roc_knn2(seed, df)

Para no extender la exposición os hago expoiler y os dejo unas recomendaciones y consejos:

  • El algoritmo puede ayudar, pero cuando se usa una variable potente, se puede pasar a otra liga, un algoritmo mejora y todos mejoran al unísono en este caso

  • Las conclusiones se mantienen, algo más acentuadas, pero las distribuciones se superponen, hay algunos outliers, pero “no nos sacan de pobres”

  • Este dataset está muy preparado, por eso sale tan potente, pero una vez llegado al 0.98 de ROC, poco más se va a poder mejorar

  • Las fluctuaciones deben tenerse en cuenta, incluso en los proyecto de ML con miles de millones de datos debe controlarse los márgenes de variabilidad de la ROC, sobre todo cuando vayan a intervenir mucho dinero. Mejor dar intervalos máximo-mínimos estimados que valores cerrados que impidan la creatividad

  • Ante modelos de predictividades parecidas, ir al más simple, si los modelos aún tienen cierta diferencia de predictividad, pero son elevadas, tomar el más simple, aunque a los “complicadores” les parecerá una “caca” porque son sencillos, os daréis cuenta que son robustos y que los podéis explicar


  • fjroar
  • 26 jul 2021
  • 7 Min. de lectura

Siguiendo un poco con la estela que abrí en R sobre el cómo utilizar R para ayudar a entender un poco la Teoría de Números, cité en un post anterior a la librería primes:



Pero sin duda la librería que realmente tiene una gran cantidad de funciones relacionadas con esta teoría es la que se denomina numbers (no confundir con la serie del mismo nombre, donde unos policías resuelven casos de modo totalmente inverosímiles haciendo razonamientos que en ocasiones se tardarían miles de años en que las máquinas acabaran sus resultados, mucho después de que el criminal muriese y perpetrara muchos más crímenes … hasta aquí mi crítica a la serie, ahora seguimos, disculpad jjjj)



Uno de los resultados claves de esta teoría es el denominado por Karl Friedrich Gauss como el Theorema Aureum, del que voy a hablar aquí un poco sobre curiosidades históricas y sobre cómo hacer uso de R para analizar algunas de los elementos que lo acompañan, aunque intentaré en la medida de lo posible hacerlo entendible, pero aviso que el enunciado en sí resulta un poco complicado.

Para entender el Theorema Aureum, hay que tener en cuenta que el ser humano intenta siempre generalizar el conocimiento de lo particular, sencillo y conocido, a otros marcos distintos y cada vez más generales. En este caso, a finales del siglo XVIII estaba emergiendo la Teoría de las Congruencias que Gauss sistematizará en sus Disquisitiones Arithmeticae.

Un grado más de detalle en este teorema, implica entrar en el concepto de cuerpo numérico que básicamente viene a ser como un conjunto de números con operaciones de suma, multiplicación, elemento nulo, neutro y que verifican un montón de propiedades; así pues un ejemplo de cuerpo es por supuesto conjunto de los números racionales (reales, complejos, etc); pero los matemáticos notaron de que no era necesario disponer de infinitos números para tener las propiedades anteriores, sino que se podían crear clases de equivalencia de modo por ejemplo que siempre que se contase de 7 en 7, justo en el número 7 empezaría el 0, es decir, el universo de los números se restringe a 0, 1, 2, 3, 4, 5, 6 y si por ejemplo aparecía un nuevo número, por ejemplo el 85, pues se hacía la división por 7 cuyo cociente es 12 y por tanto dado que 7 · 12 = 84 y hasta 85 hay 1 unidad, entonces 85 sería lo mismo que el número 1. Todo lo anterior se expresa en matemáticas como:


85 ≡ 1 mod(7)


Pues bien, siempre que lo que haya dentro de la expresión mod(p) sea un número primo p, se genera un cuerpo numérico con las propiedades que conocemos de adición, multiplicación con existencia de los elementos unidad y nulos que se conoce en cualquier otro cuerpo (además si el número no es primo, se obtienen menos propiedades, pero aún hay una estructura como es el caso de un anillo). Pues bien, en R hay muchas formas de resolver una congruencia y saber a que es equivalente, de hecho es lo mismo que calcular el resto de la división y así por ejemplo en la librería numbers bastaría con usar mod(85, 7) y se obtiene 1 pero aún es más sencillo si desde R base se utiliza 85%%7, por lo que hasta aquí "nada nuevo bajo el Sol".


Dado que se tenían infinitos cuerpos numéricos, tantos como números primos, y además sencillos de manejar, el siguiente paso que se plantea es la resolución de ecuaciones diofánticas (en números enteros) en dichos nuevos cuerpos. Una de tales ecuaciones de tipo diofántico es la siguiente:


a x ≡ b mod(m)


Claramente en esta expresión hay que despejar la x pero ¿Se puede siempre lograr solución como un número dentro del cuerpo (anillo)? Nótese que en el conjunto de los número racionales la solución es super sencilla (aquí no se aplica el tema módulo y se usa el signo =):


a x = b sí y sólo sí x = b / a si a no es 0


Ya por la época de Gauss el problema para la ecuación modular e incluso para sistemas lineales de ecuaciones de este tipo era bastante conocido y caracterizado para cualquier valor valor de m.


Pues bien, lo que se planteó a mitad del XVIII por Euler y donde Gauss en 1801 ofrece una prueba completa del resultado es la resolución de las expresiones siguientes:



Nótese que ya no se habla de un número m cualquiera, ya que se tiene que estar al menos en un cuerpo numérico y para ello el número con respecto al que se toma módulo debe ser primo, además una expresión es como la “espejo” o más bien la recíproca de la otra, de ahí el nombre de la Ley de Reciprocidad Cuadrática. Pues bien, este problema planteado y enunciado 1742 por Euler, resistió a ser demostrado por otro de los grandes del momento como era Legendre, y en este entorno de élite matemática, va un chaval de 19 años que se lo toma como reto personal, además no sólo es capaz de caracterizar las soluciones del anterior sistema, sino que por primera vez en 1801, publica una obra que es capaz de unificar y sintetizar gran parte de la teoría de números conocida hasta la época. Por otro lado, tanto le gustó la demostración del resultado, que llegó a dar a lo largo de su vida unas 8 demostraciones distintas (actualmente se conocen unas 233).

Un modo de simplificar la demostración del Teorema Aúreo es a través de la notación usada por Legendre en 1798 (que casi lo llegó a demostrar, pero … cachis, no lo logró). Legendre introduce una notación curiosa que en matemáticas se sigue denominando como Simbolo de Legendre y que se denota por (de modo parecido a una fracción con paréntesis):

Pues bien, la librería numbers tiene precisamente implementado dicha función de modo que somos capaces, analizar, tal y como se observa en la figura de la portada qué números del 1 al 100 son o no residuos cuadráticos de todos los primos entre 1 al 100. Una figura como la anterior se lograría en R con la siguiente sintaxis (los cuadrados en negros son aquellos cuyo Simbolo de Legendre vale 1 y en los blancos, este toma el valor de -1):


library(tidyverse)

library(ggplot2)

library(numbers)

m_legendre = matrix(nrow = 99, ncol = length(Primes(99)))

for (i in c(1: 99)){

for (j in c(1:ncol(m_legendre))){

m_legendre[i, j] = legendre_sym(i, Primes(99)[j])


}

}

m_legendre<- as.data.frame(m_legendre)


col_n <- paste0("p_", Primes(99))

col_n <- ifelse(nchar(col_n) == 3, paste0('p_0', substr(col_n, 3, 3)), col_n)

row_n <- paste0("n_", c(1: 99))

row_n <- ifelse(nchar(row_n) == 3, paste0('n_0', substr(row_n, 3, 3)), row_n)

names(m_legendre) <- col_n

rownames(m_legendre) <- row_n

m_legendre <- m_legendre %>%

as.data.frame() %>%

rownames_to_column("numbers1to100") %>%

pivot_longer(-c(numbers1to100), names_to = "primes1to100", values_to = "legendre")


m_legendre %>%

ggplot(aes(x=primes1to100, y=numbers1to100)) +

geom_tile(aes(fill=legendre)) +

scale_fill_gradient(low = "white", high = "black")


Y así pues tras todo este preámbulo, se enuncia el resultado que tanto llenaba de orgullo a Gauss:


Theorema Aureum

Dado el sistema:

1.- Si alguno de los primos p y q pertenecen a la sucesión 4k + 3 entonces una de las 2 congruencias cuadráticas tiene solución sí y sólo sí la otra no la tiene

2.- Si alguno de los primos p y q pertenecen a la sucesión 4k + 1 entonces o bien ambas congruencias tienen solución o bien ninguna de las 2 las tiene


Lo anterior por tanto se resume en la siguiente expresión en términos de Símbolo de Legendre:


Theorema Aureum (Versión 2)


Nótese que en el caso que p y q sean primos de la forma 4k + 3, el producto del exponente es impar y en caso contrario es par, valiendo respectivamente -1 y 1 el resultado de la izquierda. Por tanto como el símbolo de Legendre sólo puede valer 1, 0 ó -1, para que sea cierta la anterior igualdad, los signos deben estar cambiados (es decir, se tiene una congruencia y la otra no) y si son de la forma 4k + 3, entonces los signos deben de ser los mismo, es decir, o se tienen las 2 congruencias o no se tiene ninguna.


Para entender mejor el anterior resultado, se buscan 2 primos de la forma 4k + 1, uno de ellos puede ser directamente el número 5 y el otro podría ser el 13. Ahora ya se puede saber directamente si el sistema de ecuaciones siguiente tendrá o no solución:



Para ello se tiene que (5 – 1)(13- 1) / 4 = 12 y por tanto las 2 conguencias o tienen solución o no la tienen, para averiguarlo, usamos R:


legendre_sym(5, 13) = -1

legendre_sym(13, 5) = -1


Por tanto, el sistema anterior no es resoluble, pero sí lo sería por ejemplo el sistema formado por 13 y 17, en este caso:

legendre_sym(13, 17) = 1

legendre_sym(17, 13) = 1


De hecho aquí sale a la palestra otra interesante función de la librería modsqrt() que da una solución factible en caso de existir o 0, así pues ante los 2 caso anteriores se tiene que las soluciones, vía R son las siguientes:


modsqrt(13, 17) = 8, nótese que 8·8 – 13 = 3 · 17

modsqrt(17, 13) = 2, nótese que 2·2 – 17 = -1 · 13

Finalmente tal y como se ha visto, en el plano de las ecuaciones con cierta complejidad, la resolución puede resultar muy costosa conforme se sube de grado, se habla de reciprocidad cuadrática, pero también existe la cúbica y la bicuadrática y más generalizaciones, el nivel de dificultad aumenta exponencialmente y no sólo en lo que concierne a la demostración sino también a sus correspondientes enunciados ...


La Teoría de Números supone un reto en sus resultados, pero tras el reto intelectual llegan las aplicaciones reales, así que mientras que para Gauss demostrar lo anterior era un modo de decir al mundo “soy el más grande”, años después se descubre que existen aplicaciones más “mundanas” que una simple lucha intelectual, como son la criptografía y el diseño de difusores acústicos tipo Quadratic Residue Diffussor que aprovecha la simetría numérica que subyace bajo este hermoso resultado.

Para comenzar esta primera entrada de opinión, que doy fundamentada en datos, me gustaría comenzar por recordar brevemente lo que sucedía hace 15 años como estadístico. En aquella época la verdad es que no te hacían mucho caso en las empresas y en las instituciones y aunque eso sí, se ganaba menos dinero, al menos te dejaban en paz trabajar y aprender a gusto, te equivocabas o acertabas, pero podías aplicar todo tipo de algoritmos y datos disponibles sin ninguna cortapisa. Sin embargo, bajo la situación actual algunas cosas han cambiado, el Big Data irrumpió y todo el hype marketiniano acompañante, se han colocado en primeros puestos de interés las técnicas de Machine Learning y a los Data Scientist (muchos estadísticos o mineros de datos reconvertidos), que están migrando hacia la Inteligencia Artificial que adquiere ahora un mayor foco de atención hasta el punto de que surgen iniciativas que hablan de regulación que pueden tener cierto peligro si no se plantean correctamente (como el caso de la GDPR, pero eso lo dejo para otra entrada).

En relación con lo anterior, y por diversos motivos, se han puesto muy de moda los fallos en la aplicación de modelos estadísticos (ahora todo el mundo se fija en lo que hago, cachis ...) debido a lo que se denominan los sesgos como el sesgo de selección, máxime si dicho sesgo afecta sobre todo a cuestiones de género, edad, etc. A lo anterior hay que unir el mal uso de los datos, intencionado o no y la mezcla con ideas políticas un tanto peregrinas que pueden afectar, de modo muy negativo a la comunidad profesionales que viven de analizar datos y construir modelos.


Actualmente, tal y como se apunta en:


Se está planteando la regulación y si se lee el artículo, se ve un apoyo "contenido" a dicha regulación, siempre y cuando no sea excesiva (que una empresa diga que una regulación va a traer costes, implica que no lo ve claro por mucho que diga que le gusta, .... ¡No seamos ingenuos!). Por otro lado, existen numerosos sesgos cuando se crea un modelo o sistema de IA tal y como se apunta enhttps://www.eldiario.es/tecnologia/sesgos-genero-algoritmos-circulo-perverso-discriminacion-linea-vida-real_129_7198975.html pero no por ello debemos tomar decisiones en caliente y en algunos casos ideológicas que nos acaben llevando a sentencias del tipo “está prohibido incluir la variable sexo en los modelos estadísticos (ML, IA) en general

Es precisamente este punto el que voy a tratar sopesando los pro y contras de legislar hacia una supuesta mayor justicia de género y de las implicaciones que esto podría tener en un algoritmo sencillo como es un Generalize Linear Model o GLM (el razonamiento sería análogamente aplicable a cualquier otro algoritmo más complejo de tipo ML o de IA).

Antes de comentar lo anterior, no dejo pasar la oportunidad de dar una segunda opinión personal sobre lo habría que hacerse. Es decir, bajo mi punto de vista habría en todo caso que evitar el mal uso, o lo que es lo mismo, que un algoritmo peque de sesgo de selección o de sesgo de interacción y que dicho algoritmo lo esté usando por ejemplo google o facebook no puede habilitar a un político (o grupo de político) para la promulgación de prohibiciones generales (que es en lo que se traducirán las leyes al fin y al cabo), porque hay situaciones muy diversas. Que una determinada compañía no sepa controlar los sesgos o sencillamente no quiera controlarlos porque persigan un determinado fin más o menos lícito, será un problema que debería determinarse vía judicial u otros mecanismos hacia esa compañía y ese uso concreto, pero no por ello, por evitar un problema, se tengan crear otros nuevos. Es decir, convendría legislar sobre las actuaciones ilícitas no sobre cómo crear un modelo y qué elementos usar para crearlo.

El problema de la estadística, es como he apuntado antes, que al no ser matemáticas, hay una parte, la que procede de datos, que requiere interpretación y a veces la interpretación puede dar conclusiones que difieren y otras veces no tanto, por eso en el siguiente ejemplo voy a tratar de ser lo más objetivo a lo que puedo llegar ser, y por eso quiero señalar qué ocurriría si, por ejemplo, se elimina una variable poderosa en un modelo por un prejuicio moral o político.


Supongamos que estamos en 1913 y que tras el hundimiento del Titanic que ocurrió aproximadamente un año antes (a mitad de Abril de 1912), una compañía de seguros desea crear una póliza de vida para cubrir largos trayectos en transatlánticos, dicha póliza de vida, supongamos que consiste en dotar de 100.000$ al beneficiario que indique el asegurado, en el supuesto de que dicho asegurado fallezca por un hundimiento.

Ante el anterior caso, la compañía puede suponer que la probabilidad de hundimiento de una de estas naves en alta mar sea por ejemplo (dado el último hecho) de un 5%. En, ese caso sencillo, el precio medio justo aplicar a todo pasajero sería de unos 5.000$, claramente este precio es muy alto y muy poca gente (o nadie) lo adquiriría ya que hay que tener en cuenta que el precio de un billete de primera clase en el Titanic estaba en torno a los 4.350$ y además, con esta tarificación tan simple, si de 100 naves tipo transatlántico, hubiera una única persona que adquiriese la póliza, entonces el beneficio del asegurador en ese caso sería 0, porque en teoría se habrían hundido 5 de los 100, habría pagado a los beneficiarios 500.000$ a cambio de haber recibido en primas un total de 500.000$

En un segundo intento en la creación de una póliza adecuada y más competitiva, se pueda dotar al anterior análisis de un poco más de profundidad. Alguien puede pensar que de esos 5 accidentes que ocurrirían, es posible que haya una mínima tasa de superviviencia y que posiblemente, al menos 1 de los 5 asegurados que tuvieron la mala fortuna de que su transatlántico se hundiese en alta mar hubiera sobrevivido, además, si la compañía aseguradora tuviera los datos del Titanic, tal y como nos los ofrece por ejemplo kaggle en https://www.kaggle.com/c/titanic/data (ver train.csv), sabría que la probabilidad de supervivencia ante tal desastre estaría en torno al 37% - 39%, por lo que si se toma como referencia un valor inferior como 35%, se tendría que muy probablemente al menos 1 de los 5 asegurados sobreviviría y por tanto con la tarificación anterior, la compañía tendría 50.000$ de beneficio. Bajo este supuesto, otro modo de razonar sería ¿por qué no se aplica la probabilidad de no sobrevivir al desastre y se hace el producto más competitivo para que haya más personas que por menos dinero pueda adquirir el producto si lo desea? En este caso, cabría hacer, bajo este modelo tan simple la cuenta siguiente (se usa el valor 35% para que la compañía tenga un poco de beneficio y margen):

prima = 100.000 · 0.05 · (1 – 0.35) = 3.750


Claro el anterior precio, aunque mejora el primero, aún sigue siendo bastante alto y es entonces cuando se podría aplicar un procedimiento sencillo como el que se muestra con el siguiente código R:

library(data.table)

df <- fread('data/train.csv')

df$Pclass1 <- ifelse(df$Pclass == 1, 1, 0)

df$Pclass2 <- ifelse(df$Pclass == 2, 1, 0)

set.seed(10)

index <- sample(c(1:nrow(df)), 0.7*nrow(df))

df_train <- df[index,]

df_test <- df[-index,] #Se observa que las tasas de supervivencia son similares

mod1 <- glm(Survived ~ Pclass + Sex + SibSp, data = df_train, family = "binomial")

Que con un simple summary() daría lugar a la siguiente salida:




En este caso se observa que la probabilidad de que un hombre sobreviva al evento notoriamente inferior a que una mujer logre sobrevivir, por supuesto aquí es donde tiene lugar eso de “mujeres, niños y personas mayores primero”, el anterior modelo responde también a una ecuación tal como sigue:

P(Survived = 0) = 1 /(1 + exp(0.3332 -2.5703 Sexmale + 1.7804 Pclass1 + 1.2419 Pclass2))


En este caso, bajo este modelo tan sencillo, el peor valor de supervivencia la tendría un hombre con un billete de clase 3 y sería P(Survived = 0) = 0.90353 y por tanto el precio de la prima a cobrar sería muy elevado, pero en cambio, para un mujer que vaya en primera clase, el anterior valor sería P(Survived = 0) = 0.107782; por lo que en este caso, el valor de la prima sería:

prima(mujeres, clase 1)= 100.000 · 0.05 · 0.107782 = 539$

Es decir, ahora el precio para un segmento de la población si resulta competitivo, obviamente se puede pensar en si es justo o no ofrecer precios buenos a gente que adquiere un billete de primera clase, que además es de esperar que tenga dinero, y precios no tan buenos a los que adquieren un billete de segunda o tercera clase, pero claro, también se puede pensar del siguiente modo, y es que un billete de segunda clase en el Titanic costaba alrededor de 1750$, si se quiere asegurar al segmento de las mujeres de segunda clase, el coste compensaba bastante:

prima(mujeres, clase 2)= 100.000 · 0.05 · 0.1714906 = 858$


Y ¿para los de tercera clase? Bueno, en este caso, el precio de la póliza se dispara en el caso de las mujeres, pero hay que tener en cuenta que el coste del billete para ellos era de tan sólo 30$:

prima(mujeres, clase 3)= 100.000 · 0.05 · 0.4174622 = 2087$


No obstante, el producto, con sólo esas variables consideradas sencillamente no daría opción a que se aseguren, es más, la compañía de seguros tendría en todo caso un problema moral en este caso, pero las condiciones que indican los datos son las que son y entonces la tercera clase no tendría póliza a medida, ni incluso pagando 539$ podrían acceder al producto ya que sencillamente se estaría hablando de un coste de 54 veces su billete. Por tanto, la compañía aseguradora encontraría mercado, bajo este modelo entre la gente de primera y segunda clase (estos últimos lo más beneficiados en relación calidad-precio)

Pero ahora supongamos, que en el país de la aseguradora, algún comité ético ve inmoral y sancionable que se distinga por sexo y por tanto se obligue a eliminar la variable del modelo, en este caso, se tendría un modelo, con los mismos datos, tal como sigue:



En este caso, al no distinguirse por sexo, sólo se tendría la información del tipo de billete que se compra y en este caso las primas a aplicar serían:

prima(mujeres, clase 1)= 100.000 · 0.05 · 0.4025864 = 2023$

prima(mujeres, clase 2)= 100.000 · 0.05 · 0.4881772 = 2442$

prima(mujeres, clase 3)= 100.000 · 0.05 · 0. 7514574= 3757$

De modo que el asegurador sencillamente no haría negocio y es poco probable que alguien pagase los precios anteriores, salvo que se le asustase muchísimo, además quiénes más perjudicados salen son los pasajeros de 2ª clase, donde ahora la relación calidad-precio ya no está tan clara y obviamente, no se soluciona el problema de una póliza para la gente de 3ª clase.

Por tanto aquí está el debate ético cuando se desea eliminar una variable ¿Debe legislarse en cómo se construye un modelo de modo que se apliquen recetas tipo “café para todos”?


Este dataset Titanic me gusta porque da que pensar y plantea otros dilemas adicionales y es que como se observa, en este caso, los ricos tienen aparte de más dinero, para este tipo de modelos GLM, mejores ofertas que el resto, personalmente, a mí no me gusta esto, pero claro, yo no soy un empresario ni alguien que quiera apostar su dinero en crear una compañía de seguros, si lo fuera, tendría que empezar haciendo ofertas buenas a lo que me indica los datos, los cuales obedecen a un sesgo en el que impera varios condicionantes como:


  • Ante un naufragio, niños, mujeres, ancianos, suelen tener preferencia

  • Los medios disponibles para los que pagan un billete de clase 1 son superiores que para los que pagan un billete de clase 3

Claramente, si con el devenir de los tiempos, la segunda condición se hace más igualitaria y se tuvieran suficientes botes y medios adecuados a cada clase, lo que sucedería es que las variables dummy Pclass1 y Pclass2 irían perdiendo importancia y seguramente la probabilidad media de supervivencia habría sido superior al 50% y por tanto el modelo correcto a plantear es el que contuviese sólo la variable Sexo, ya que lo que no resulta tan ético es que un transatlántico no parta con todos los medios salvavidas adecuados y que además estuvieran sesgados para un determinado grupo de individuos, pero es otro debate que ya no sería "culpa" del modelo.


Obviamente si yo en 1913 tuviera que hacer un seguro de vida para este caso, buscaría más datos de otros naufragios y tendría que ver si la distribución de botes-salvavidas se parece más o menos a la del Titanic u a otros, junto con el uso de más variables, que de algún modo defina más el objeto del producto a tarificar, pero eso ya sería otra historia.

PD: el gráfico de la curva ROC que muestro al principio es la medida de la eficiencia del modelo considerando la variable sexo en el dataset test que no se había usado en la construcción del modelo. Se ve claramente cómo esta sencilla variable tipo 0-1 dota al modelo de una gran eficiencia discriminante separando los que sobreviven de los que no.

© 2021 by Francisco J. Rodríguez Aragón. Proudly created with Wix.com

bottom of page