Dada una start-up con un modelo de negocio de venta de habitaciones (no casas o departamentos enteros) con una cartera de 12.000 potenciales clientes interesados en este modelo de negocio.
Python, Pandas, Scikit-learn, Numpy, Seaborn, Matplotlib, Plotly, Streamlit.
Sistemas de Recomendación: (Recommender Systems) son algoritmos que intentan "predecir" los siguientes items (productos, canciones, etc.) que querrá adquirir un usuario en particular. Estos sistemas, se basan en Machine Learning y se utilizan en aplicaciones que van desde el comercio electrónico hasta las plataformas de streaming, para ayudar a los usuarios a encontrar contenido relevante y mejorar su experiencia. Todos los sistemas de recomendación tienen una cosa en común, para poder llevar a cabo las predicciones, necesitan definir y cuantificar la similitud entre items o usuarios. El término distancia se emplea dentro del contexto de recomendadores como cuantificación de la similitud o diferencia entre observaciones. Si se representan las observaciones en un espacio k dimensional, siendo k el número de variables asociadas a cada observación (ítem o usuario), cuando más se asemejen dos observaciones, más próximas estarán, de ahí que se emplee el término distancia. Desde el punto de vista matemático, a esa serie de variables asociadas a cada observación se la llama "Vector".
Existen varios tipos de sistemas de recomendación como los de Popularidad, los Basadas en Contenido, los de Filtrado Colaborativo o híbridos.
Popularidad: Aconseja por la "popularidad" de los productos. Por ejemplo, "los más vendidos" globalmente, se ofrecerán a todos los usuarios por igual sin aprovechar la personalización. Es fácil de implementar y en algunos casos resultan efectivos.
Basados en Contenido: A partir de productos visitados por el usuario, se intenta "adivinar" qué busca el usuario y ofrecer mercancías similares. Nuestro caso aplica a este tipo de sistema de recomendación.
Filtrado Colaborativo: Es el más novedoso, pues utiliza la información de "masas" para identificar perfiles similares y aprender de los datos para recomendar productos de manera individual.
Similitud: Es una medida que se usa para calcular la similaridad entre dos o mas vectores. Donde los vectores representan cualquier tipo de datos como texto, puntos de una imagen, o una canción, o productos, etc. Cada uno de esos datos dentro del vector se los denomina "dimensión". Entonces, por ejemplo, un vector de dos elementos es un vector de dos dimensiones. Existen multiples distancias que se usan para calcular la similitud entre vectores en distintos tipos de escenarios, entre ellas se destacan: Distancia Euclidiana, Distancia y Similitud del Coseno, Correlación de Pearson, Correlación de Spearman e Índice Jaccard entre otras. En este caso se aplicó la Similitud del Coseno. (Para saber mas sobre similitud y distancias mira este post en mi blog).
Similitud del Coseno: (No confundir con la Distancia del Coseno) Verifica qué tan similares son dos vectores de números (como puntajes o características) al observar el ángulo entre ellos. Si el ángulo es pequeño, significa que los vectores son muy similares, incluso si tienen longitudes diferentes. Te ayuda a comprender qué tan estrechamente relacionadas están dos cosas según su dirección. Es decir que el coseno del ángulo que forman dos vectores puede interpretarse como una medida de similitud de sus orientaciones, independientemente de sus magnitudes.
El "producto punto" o producto escalar entre dos vectores se define como:
Donde:
u.v es el producto escalar o "producto punto" entre los vectores u y v. (La librería Numpy tiene una formula muy eficiente para calcular el producto punto).
||u|| y ||v|| son las normas (o magnitudes) de los vectores u y v respectivamente. (La librería Numpy posee un calculo de la norma de un vector muy eficiente y es el que se recomienda usar).
De la fórmula anterior se puede despejar el coseno del ángulo como:
Esta fórmula sería la utilizada como la Similitud del Coseno y los valores resultantes de la misma varían entre -1 y 1. Entonces, si dos vectores tienen un ángulo de:
0º: tienen exactamente la misma orientación y su coseno toma el valor de 1, o sea, los vectores están perfectamente alineados indicando máxima similitud.
90º: son perpendiculares y su coseno es 0, indican ortogonalidad.
180º: tienen orientaciones opuestas y su coseno es de -1. implica que son diametralmente opuestos, lo que refleja máxima disimilitud.
Distancia del Coseno: Mide la "disimilitud" entre dos vectores A y B calculando el coseno del ángulo que los une. Se puede definir como 1 menos la Similitud del Coseno entre A y B, como se muestra en la siguiente fórmula:
Con esta fórmula se cuantifica la Distancia del Coseno con un rango de 0 a 2.
Distancia del Coseno = 0 significa que los vectores están perfectamente alineados (sin ángulo entre ellos), lo que indica máxima similitud,
Distancia del Coseno = 2 sugiere que los vectores son diametralmente opuestos, lo que indica máxima disimilitud.
Uso de Python con sus librerías como Pandas, para la carga y gestión de datos a través de DataFrames; Numpy para calcular el producto punto y la matriz de similaridad; Scikit-learn, para pre-procesar con One Hot Encoding; Seaborn, Matplotlib y Plotly, para hacer gráficos; Streamlit, para desarrollar el front-end de la aplicación.
Conocimientos aprendidos sobre Sistemas de Recomendación y sus posibles usos.
Entendimiento del concepto de similaridad o similitud entre vectores. Esta similitud entre vectores aplicadas a este caso donde dos vectores representan a dos posibles propietarios esta dada por una medida de distancia como puede ser la Similaridad del Coseno que es la que se utilizó aquí.
Reconocer la diferencia entre Similitud del Coseno y Distancia del Coseno. La Distancia del Coseno mide la disimilitud entre vectores calculando el coseno del ángulo entre ellos, la Similitud del Coseno cuantifica qué tan similares son dos vectores basándose en el coseno del mismo ángulo.
Mejora de conocimientos sobre otras posibles distancias a utilizar en esta clase de problemas.
Problema: Los propietarios de esas habitaciones van a estar compartiendo el piso con otros propietarios. La idea de la start-up es poder garantizar un grado de alta compatibilidad entre las características, gustos e intereses de los distintos propietarios que van a compartir el mismo piso. Con 12.000 propietarios esta tarea no se puede hacer a mano pero si se puede automatizar mediante un algoritmo de Data Science.
Tenemos 12.000 potenciales clientes y de cada uno de ellos tenemos las respuestas a 17 preguntas (17 dimensiones) que cada cliente completó para que se nos permita evaluar sus gustos e intereses. Por lo tanto, tenemos un conjunto de datos o una serie de datos de cada uno de esos 12.000 potenciales clientes, o sea, por cada potencial cliente tenemos un vector asociado de 17 dimensiones.
Para simplificar el problema se restringe la solución a buscar el conjunto de propietarios que restan de un piso, partiendo de que ya existe un propietario. Caso contrario, de hallar todos los propietarios de un piso, se necesitaría al menos otro modelo complementario para empezar a configurar el grupo de cada piso.
Partiendo de los 12.000 vectores de los potenciales clientes se calcula la similaridad entre los vectores. Lo que nos dicen estas medidas de similaridad es que cuanto mas similares sean dos vectores concretos entre sí, significa que dos potenciales propietarios son mas parecidos, o sea, mas compatibles entre sí.
Calcular la similaridad entre los vectores implica partir de una matriz de propietarios x preguntas, donde cada fila se corresponde con un vector de 17 dimensiones (una por cada pregunta), para pasar a otra matriz simétrica resultante de propietarios x propietarios con los valores ya calculados de similaridad de unos con otros.
La fórmula de similitud entre vectores elegida para este caso es la de la Distancia del Coseno (la mas popularmente usada).
La matriz resultante de propietarios x propietarios se dice que es simétrica porque cada usuario es igual a si mismo por lo tanto la casilla que relaciona un usuario consigo mismo siempre sera igual a 1 (diagonal de la matriz). Ademas, la similaridad del propietario A con el propietario B va a ser la misma que la similaridad del propietario B con el propietario A. Por lo tanto, solo necesitamos una sola parte de la matriz resultante, de la diagonal hacia abajo o de la diagonal hacia arriba. Ejemplo: Si existe un propietario M que con el propietario A tiene una similitud de 0.8 y un propietario C que con respecto a A tiene una similitud de 0.17; entonces mirando el resto de los propietarios con respecto del propietario A, en este caso, se puede decir que el propietario M es el mas similar con el propietario A, que el propietario C, dado que se ajusta mejor (0.8 > 0.17 y mas cerca de 1). De esta forma, le vamos a dar a la start-up un listado de los mas compatibles al que existe como propietario de una habitación de un piso (A) para que a partir de ahí ya se pueda hacer una selección de manual, a lo mejor, estamos restringiendo de potencialmente 12000 potenciales copropietarios a 10 o 15 potenciales copropietarios cuyos datos nos dicen que serian mas compatibles. Finalmente una persona puede revisar estos resultados y seleccionar 2 o 3 a los que se les va a ofrecer el resto de las habitaciones de ese piso.
El algoritmo se basa en 3 componentes (archivos Python):
main.py: contiene la lógica del front-end realizada con Streamlit.
utilidades.py: Contiene funciones a utilizar en los posibles cálculos a realizar.
logica.py: Es donde se calcula la matriz de similaridad y se generan los cálculos.
Todo el código y la aplicación entera se encuentra en este repositorio de GitHub.