Segmentación y k-means hecho fácil y con excel

Cuando empecé en esto de la ciencia de datos, tengo que reconocer que había cosas que me parecían prácticamente magia. ¿Cómo es posible que una máquina sola sea capaz de aprender con machine learning?  Y tengo que decir que me parece interesante hasta qué punto cuando lo ves desde fuera parece magia... y a menudo son cosas que prácticamente son de lógica. 

No podemos negar que el aura de misterio con la ciencia de datos en buena parte proviene de que parece que sea una caja negra, y no sólo matemática sino también técnica. Normalmente vemos que el machine learning se hace con lenguajes tipo R y Python, o programas del estilo Rapidminer, KNIME, dataiku... Pero vengo aquí a demostraros que se puede hacer ciencia de datos utilizando cálculos sencillos de excel (siempre, por supuesto, algoritmos sencillos y no tan potentes, pero a menudo son suficientes).


Segmentación de K-Means con 1 Dimensión

Pero no os preocupéis. No es tan difícil. Hoy os voy a hablar de segmentación y del algoritmo "k-means" y vais a ver que se puede hacer algo muy parecido incluso con excel por propósitos didácticos.

Vamos a a empezar con la familia Stark. Sí, de Juego de Tronos. Vale, sí, ya sé que a muchos el final de la serie nos dejó un poco fríos, no voy a destriparle el final a nadie pero seguro que incluso quien no supiera mucho le sonarán las personas que conforman la familia Stark.



El truco de la segmentación, es que en realidad se trata de una comparación entre por ejemplo personas por alguna variable (o un conjunto de las mismas), vamos, que estamos comparando a la gente por "algo". Poniendo algunos ejemplos, podríamos segmentar por:
  • Edad: Jóvenes y mayores
  • Altura: Altos y bajos
  • Longitud del pelo: Pelo corto o largo
  • Color de los ojos
  • Talla de zapatos
  • Habilidad como luchadores
  • ...
Y el segundo truco es que una vez hemos escogido con qué estamos segmentando, hemos de especificar cuántos grupos haremos. Para escoger la cantidad de grupos podemos escoger alguna razón matemática (como el diagrama de codo y el perfil), pero también podríamos escoger un criterio de negocio (no hagas más grupos que los que puedas trabajar separadamente). En cualquier caso, vamos a saltarnos esta parte y vamos a decir simplemente que nos queremos quedar con dos grupos. 

Como he dicho, la segmentación en data science lo que hace es comparar utilizando una variable (qué queremos comparar, y tenemos que escoger con quién empezaremos a comparar. Se puede hacer de manera aleatoria, pero para simplificar escogeremos los dos extremos: el más viejo, Ned Stark y el más joven, Rickon.

Y aquí, sólo queda empezar a comparar. Podemos coger a Catelyn, y comparamos su edad tanto con hijo Rickon, como con su marido Ned/Eddard Stark.



¿A quién se acerca más Catelyn Stark? Por edad, se parece más a Ned (5 años de diferencia) que a su hijo pequeño (29 años de diferencia). Y esto, podemos hacerlo con todos. Vamos a coger la edad de cada uno de los personajes de la familia Stark, y vamos a restarla con la de Rickon y con la de Eddard (o Ned, vaya). Y los pondremos en el grupo que más se parezca en edad. 


Como veis, hemos conseguido algo muy complicado: Hemos segmentado entre jóvenes y adultos. Que aunque parezca obvio, está bien comprobar que estos algoritmos en casos sencillos confirman nuestra intuición.


Segmentación de K-Means con 2 Dimensiones

Como hemos visto, segmentar con una sola dimensión es fácil. Podríamos hacer lo mismo con cualquier otra variable, como la altura o la longitud de su melena. Y así obtendríamos diferentes segmentaciones. ¿Pero podemos combinar más de una dimensión para segmentar? ¡Por supuesto que sí!

La gracia de k-means es que en realidad podemos segmentar por más de una dimensión, tantas como queramos siempre que seamos capaces de interpretar los resultados. ¿Pero cómo podemos tener en cuenta más de una dimensión a la hora de segmentar? Os voy a decir un secreto, lo más importante que os puedan haber enseñado nunca sobre geometría lo aprendisteis con el teorema de Pitágoras. En la ESO. 



Ya sabéis, que el cuadrado de la hipotenusa es la suma de los cuadrados de los catetos y tal. Al final, vamos a suponer que si tenemos dos variables, cada una de ellas será un cateto y la distancia la mediremos con la hipotenusa de un triángulo ficticio. 

Vamos a ver un ejemplo algo más práctico. Vamos a coger los números que hemos utilizado antes de la edad de la familia Stark, y vamos a incluir la dimensión de la altura. La idea es hacer el mismo cálculo que hemos hecho antes pero calculando las distancias en dos dimensiones. 

Ahora esto os sonará raruno, pero creo que cuando lo veáis gráficamente lo tendréis mucho más claro:

Visualmente, ya podéis ver que hay puntos que están más cerca que otros en la gráfica de dispersión, como cuando miramos las estrellas y encontramos constelaciones. Lo que buscamos entonces es matemáticamente tratar de reproducirlo para no tener que estar mirando puntitos en una gráfica. Os fijaréis que en vez de tener una edad y una altura con números que esperaríais, tenemos esos decimales rarunos. La gráfica hecha de manera que tenga la misma escala tanto en el eje vertical como en el horizontal, pero normalmente tendríamos un eje que iría de a 0 a 200cm y uno que fuese de 0 a 50 años. Si gráficamente lo que hacemos es cambiar la escala (la separación de los puntos del eje), la normalizacíon hace eso para los algoritmos, iguala escalas. Es decir, buscamos poder hacer comparaciones justas. 

Visualmente, ya podemos ver en la gráfica superior que tenemos en realidad tres grupos diferenciados, en vez de los dos que teníamos antes. Así que vamos a empezar a hacer comparaciones entre miembros de la familia Stark, sólo que ahora en vez de preguntarnos sólo por la edad de cada uno, nos preocuparemos por la "distancia" compuesta por la altura y la edad. Si antes he empezado por los dos extremos, ahora incluiré a alguien que esté en el centro de tramos de edad y altura para hacer las comparaciones. Vamos a segmentar, por tanto, definiendo grupos de gente que se parezca más a: Rickon, a Eddard o a Jon Snow.


Es decir, lo que nos dice este ejercicio de segmentación es que tenemos:
  • Gente mayor y alta
  • Gente joven y alta
  • Gente joven y baja
O lo que es lo mismo:
  • Adultos
  • Adolescentes
  • Niños
Imaginemos que hacemos este ejercicio en esa temporada en que Sansa Stark estaba casada con Tyrion. Y pensemos qué habría pasado con nuestra segmentación.



A las tres categorías de antes, añadiríamos una nueva:
  • Gente mayor y alta
  • Gente mayor y baja
  • Gente joven y alta
  • Gente joven y baja
Con una muestra de población suficientemente grande, veríamos que los casos de gente mayor y con una altura menos de 140cm son en realidad "outliers", y precisamente por eso se estudian en busca de posibles problemas del desarrollo.

Si os fijáis, siempre que os he sacado unos segmentos matemáticos, he hecho un ejercicio posterior de tratar de entenderlos. Esa es la parte que a menudo no se transparenta cuando se habla de data science: es necesario traducirlo a lenguaje de negocio. Porque cuando se entiende qué define un grupo de gente, es cuando alguien en un departamento, como marketing, puede decidir qué hacer con ellos.

Más allá del ejemplo. ¿Qué más hacemos en k-means?

Sí que creo que vale la pena aclarar que he puesto una simplificación del modelo. Hay puntos que he dejado como triviales a propósito. Por ejemplo, ¿con quién deberíamos comparar? Técnicamente deberíamos comparar con lo que se llama el "centroide". La asignación se hace aleatoria, y se itera hasta que el resultado es estable. Pero podría ocurrir con resultados complejos que los segmentos variaran ligeramente. 

Otro punto que he dejado como sencillo es el de la distancia. En este caso sólo he hablado de una distancia lineal, pero no siempre la distancia es lineal, a veces querríamos penalizado más fuerte a los outliers (los puntos muy alejados del resto) y que cuanto más lejos se encuentren dos puntos más lo penalizamos (así usaríamos por ejemplo una escala cuadrática), o al contrario podríamos usar una distancia logarítmica para dar menos peso a los outliers y a la vez tener mayor granularidad entre puntos más cercanos. Y por supuesto más factores de distancia, como la distancia categórica, o la combinada, ... 

Pero no os preocupéis, ¡que para eso existen los expertos!



Espero que este pequeño resumen os haya ayudado a entender un poco los básicos de k-means y segmentación. Acabemos con un pequeño resumen por puntos de lo que hemos visto:
  • Qué es la segmentación
  • Qué tenemos en cuenta para segmentar (tipos de variables y distancia)
  • Un ejemplo sencillo de segmentación en una dimensión
  • Distancia lineal de dos dimensiones usando el teorema de Pitágoras
  • Un ejemplo de segmentación en dos dimensiones
  • Interpretación de negocio
  • Más allá del ejemplo y cosas a tener en cuenta en una segmentación profesional

Comentarios

Entradas populares