Reto Construyendo Una Sistema de Recomendación de Productos Con Filtrado Colaborativo

Vamos a profundizar en la construcción de un sistema de recomendación de productos con el que podemos dirigirnos mejor a los clientes, utilizando recomendaciones de productos que se adaptan a los clientes individuales. Los estudios han demostrado que las recomendaciones de productos personalizadas mejoran las tasas de conversión y de retención de clientes.

Un sistema de recomendación de productos es un sistema cuyo objetivo es predecir y recopilar una lista de artículos que probablemente comprará un cliente. Los sistemas de recomendación han ganado mucha popularidad en los últimos años y se han desarrollado e implementado para diversos casos de uso comercial

Por ejemplo,

Con el potencial de ser utilizados en una variedad de áreas, los sistemas de recomendación juegan un papel crítico en muchos negocios, especialmente en los de comercio electrónico y medios de comunicación, ya que impactan directamente en los ingresos por ventas y en el compromiso de los usuarios

Generalmente, hay dos maneras de desarrollar una lista de recomendaciones:

1. Filtrado colaborativo

El método de filtrado colaborativo se basa en los comportamientos anteriores de los usuarios, como las páginas que han visto, los productos que han comprado o las valoraciones que han dado a diferentes artículos. El método de filtrado colaborativo utiliza estos datos para encontrar similitudes entre usuarios o artículos, y recomienda a los usuarios los artículos o contenidos más similares.

La hipótesis básica del método de filtrado colaborativo es que quienes han visto o comprado contenidos o productos similares en el pasado probablemente verán o comprarán tipos de contenidos o productos similares en el futuro.

Así, basándose en esta suposición, si una persona compró los artículos A, B y C y otra persona compró los artículos A, B y D en el pasado, es probable que la primera persona compre el artículo D y la otra persona compre el artículo C, ya que comparten muchas similitudes entre sí

2. Filtrado basado en el contenido

Por otro lado, el filtrado basado en el contenido produce una lista de recomendaciones basada en las características de un artículo o de un usuario. Suele examinar las palabras clave que describen las características de un artículo. La hipótesis básica del método de filtrado basado en el contenido es que los usuarios probablemente verán o comprarán artículos similares a los que han comprado o visto en el pasado

Por ejemplo, si un usuario ha escuchado algunas canciones en el pasado, el método de filtrado basado en el contenido recomendará tipos de canciones similares que comparten características parecidas a las que el usuario ya ha escuchado

Construcción de un sistema de recomendación de productos con filtrado colaborativo

Como se ha mencionado, un algoritmo de filtrado colaborativo se utiliza para recomendar productos basándose en el historial de comportamiento de los usuarios y en las similitudes entre ellos. El primer paso para implementar un algoritmo de filtrado colaborativo para un sistema de recomendación de productos es construir una matriz usuario-elemento

Una matriz usuario-elemento comprende usuarios individuales en las filas y elementos individuales en las columnas. Será más fácil de explicar con un ejemplo. Observe la siguiente matriz

Screenshot%20from%202021-03-09%2009-01-58.png

Las filas de esta matriz representan a cada usuario y las columnas a cada elemento. Los valores de cada celda representan si el usuario en cuestión ha comprado o no el elemento en cuestión. Por ejemplo, el usuario 1 ha comprado los artículos B y D y el usuario 2 ha comprado los artículos A, B, C y E

Para construir un sistema de recomendación de productos basado en el filtrado colaborativo, necesitamos construir primero este tipo de matriz usuario-elemento. Con esta matriz usuario-elemento, el siguiente paso para construir un sistema de recomendación de productos basado en el filtrado colaborativo es calcular las similitudes entre los usuarios

Para medir las similitudes, se suele utilizar la similitud de los cosenos. La ecuación para calcular la similitud del coseno entre dos usuarios es la siguiente

Screenshot%20from%202021-03-09%2009-03-20.png

En esta ecuación, U1 y U2 representan al usuario 1 y al usuario 2. P1i y P2i representan cada producto, i, que el usuario 1 y el usuario 2 han comprado. Si utilizas esta ecuación, obtendrás 0,353553 como la similitud del coseno entre los usuarios 1 y 2 en el ejemplo anterior y 0,866025 como la similitud del coseno entre los usuarios 2 y 4.

Como puede imaginar, cuanto mayor sea la similitud del coseno, más parecidos serán los dos usuarios. Así, en nuestro ejemplo, los usuarios 2 y 4 son más similares entre sí que los usuarios 1 y 2. Por último, cuando se utiliza un algoritmo de filtrado colaborativo para las recomendaciones de productos, se pueden adoptar dos enfoques: un enfoque basado en el usuario y un enfoque basado en el elemento

Como sus nombres sugieren, el enfoque del filtrado colaborativo basado en el usuario utiliza las similitudes entre los usuarios. Por otro lado, el enfoque de filtrado colaborativo basado en el elemento utiliza las similitudes entre los elemento. Esto significa que cuando calculamos las similitudes entre los dos usuarios en el filtrado colaborativo del enfoque basado en el usuario, tenemos que construir y utilizar una matriz usuario-elemento, como hemos comentado anteriormente

Sin embargo, para el enfoque basado en elementos, necesitamos calcular las similitudes entre los dos elementos, y esto significa que necesitamos construir y utilizar una matriz de elemento a usuario, que podemos obtener simplemente transponiendo la matriz de usuario a elemento.

Vamos a discutir cómo construir un sistema de recomendación de productos utilizando Python. Comenzaremos esta sección analizando algunos datos de negocios de comercio electrónico y luego discutiremos los dos enfoques para construir un sistema de recomendación de productos con filtrado colaborativo

El dataset con el que trabajaremos lo puedes encontrar aqui:. El formato se encuentra en xls. Importa pandas en la siguiente celda, y usa el metodo read_excel para cargarlo en tu notebook, y no olvides anexar el parametro: sheet_name='Online Retail'. Asignalo a la variable df.

Ahora exploralo con .head y con shape

Hay registros con valores negativos en la columna Cantidad, que representan pedidos cancelados. Ignoremos y eliminemos estos registros. Podemos filtrar todos estos registros en nuestro DataFrame simplemente eligiendo los Quantity que sean mayores a 0

Preparación de los datos

Antes de sumergirnos en la construcción de un motor de recomendación de productos utilizando un algoritmo de filtrado colaborativo, tenemos que hacer el siguiente par de cosas:

En primer lugar, tenemos que gestionar los valores "NaN" de nuestro conjunto de datos, especialmente los "NaN" del campo "CustomerID". Sin los valores correctos en el campo CustomerID, no podemos construir un sistema de recomendación adecuado, ya que el algoritmo de filtrado colaborativo depende de los datos históricos de compra de artículos de clientes individuales.

En segundo lugar, necesitamos construir una matriz usuario-elemento antes de poder implementar el algoritmo de filtrado colaborativo para la recomendación de productos. La matriz usuario-elemento es simplemente una tabla de datos, en la que cada columna representa cada producto o elemento, cada fila representa un cliente y el valor de cada celda representa si el cliente en cuestión ha comprado o no el producto en cuestión.

Gestión de los NaN en el campo CustomerID

Si observamos los datos con detenimiento, nos daremos cuenta de que hay algunos registros sin identificación de cliente. Como tenemos que construir una matriz de elementos de clientes en la que cada fila es específica para cada cliente, no podemos incluir esos registros sin CustomerID en nuestros datos.

Veamos primero cuántos registros no tienen identificación de cliente. Haga una sumatoria de todos los valores nan para CustomerID en la siguiente celda

Como puede ver en esta salida, hay 133.361 registros sin identificación de cliente. Y algunos de los datos a los que les falta la identificación del cliente tienen este aspecto:

df.loc[df['CustomerID'].isna()].head()

Copia ese codigo en la siguiente celda

Ahora que sabemos que hay registros con entradas de identificación de clientes que faltan, tenemos que excluirlos del análisis posterior. Una forma de eliminarlos de nuestro DataFrame es utilizar la función dropna. Utiliza dicho metodo para eliminarlos

Construir una matriz de elementos para el cliente

Los datos que tenemos ahora representan artículos individuales comprados por los clientes. Sin embargo, para construir un sistema de recomendación de productos con un algoritmo de filtrado colaborativo, necesitamos tener datos en los que cada registro contenga información sobre qué artículo ha comprado cada cliente.

Vamos a transformar los datos en una matriz usuario-elemento, donde cada fila representa un cliente y las columnas corresponden a diferentes productos.

En la siguiente celda, haz un pivot_table de pandas con los siguientes parametros:

index='CustomerID', 
columns='StockCode', 
values='Quantity',
aggfunc='sum'

Y asignalo a la variable customer_item_matrix

Como puede ver, ahora tenemos una matriz en la que cada fila representa las cantidades totales compradas de cada producto para cada cliente.

Ahora, codifiquemos 0-1 estos datos, de manera que un valor de 1 significa que el producto dado fue comprado por el cliente dado, y un valor de 0 significa que el producto dado nunca fue comprado por el cliente dado. Observe el siguiente código. Este procedimiento puede realizarse de varias formas, le recomendamos hacerlo con una función lambda y con el metodo applymap de pandas. Asigne el resultado a la misma variable anterior customer_item_matrix

Estamos recomendando la función "applymap", que aplica una función determinada a cada elemento de un DataFrame.

La función Lambda que estamos recomendando en este código simplemente codifica todos los elementos cuyos valores son mayores que 0 con 1, y el resto con 0.

Ahora tenemos un array de elementos del cliente que podemos utilizar para el algoritmo de filtrado colaborativo. Pasemos ahora a la construcción de motores de recomendación de productos.

Filtrado colaborativo

Exploraremos dos enfoques para construir nuestro recomendador basado en el usuario y en el elemento. En el enfoque basado en el usuario, calculamos las similitudes entre los usuarios basándonos en su historial de compras de artículos. En el enfoque basado en los artículos, por otro lado, calculamos las similitudes entre los artículos en función de qué artículos se compran a menudo junto con otros.

Para medir la similitud entre usuarios o entre artículos, utilizaremos el método cosine_similarity del paquete scikit-learn. Puedes importar esta función utilizando el siguiente código:

from sklearn.metrics.pairwise import cosine_similarity

Cópielo y peguelo en la siguiente celda

Esta función cosine_similarity del paquete sklearn calcula las similitudes del coseno en pares en los datos dados.

Filtros de colaboración basados en el usuario y recomendaciones

Para construir un algoritmo de filtrado colaborativo basado en el usuario, necesitamos calcular las similitudes del coseno entre los usuarios. Para ello haga lo siguiente: asigne a una variable llamada user_user_sim_matrix un nuevo dataframe de pandas, que puedes crear con el comando pd.DataFrame() y pasale como parametro la funcion de scikit-learn que acabamos de importar y pasandole como parametro nuestra matriz customer_item_matrix

Como puedes ver en este código, estamos utilizando la función cosine_similarity del módulo metrics.pairwise del paquete sklearn. Esta función calcula las similitudes del coseno en pares entre las muestras y produce los resultados como un tipo de array.

A continuación, creamos un pandasDataFrame con este array de salida y lo almacenamos en una variable llamada user_user_sim_matrix, que significa array de similitudes usuario-usuario.

Como puedes ver, el índice y los nombres de las columnas no son fáciles de entender. Como cada columna y fila del índice representa a clientes individuales, vamos a renombrar el índice y las columnas usando el siguiente código:

user_user_sim_matrix.columns = customer_item_matrix.index
user_user_sim_matrix['CustomerID'] = customer_item_matrix.index
user_user_sim_matrix = user_user_sim_matrix.set_index('CustomerID')

Veamos con más detalle esta matriz de similitudes entre usuarios. Como se puede imaginar, la similitud del coseno entre un cliente y él mismo es 1, y esto es lo que podemos observar en esta matriz de similitud. Los elementos diagonales de esta matriz de similitudes entre usuarios tienen valores de 1.

El resto representa la similitud del coseno entre dos clientes. Por ejemplo, la medida de similitud del coseno entre los clientes 12347 y 12348 es 0,063022. Por otro lado, la similitud del coseno entre los clientes "12347" y "12349" es de 0,046130. Esto sugiere que el cliente 12348 es más similar al cliente 12347 que el cliente 12349, basándose en los productos que compraron. De este modo, podemos saber fácilmente qué clientes son similares a otros, y qué clientes han comprado artículos similares a otros.

Estas medidas de similitud de pares de coseno son las que utilizaremos para las recomendaciones de productos. Vamos a trabajar eligiendo un cliente como ejemplo. Primero clasificaremos los clientes más parecidos al cliente con ID 12350, para hacer esto

Estos son los 10 clientes más similares al cliente 12350. Vamos a elegir el cliente 17935 y a discutir cómo podemos recomendar productos utilizando estos resultados.

La estrategia es la siguiente.

Veamos primero cómo podemos recuperar los artículos que el cliente 12350 ha comprado en el pasado. El código es el siguiente:

items_bought_by_A = set(customer_item_matrix.loc[12350.0].iloc[
    customer_item_matrix.loc[12350.0].to_numpy().nonzero()
].index)

Como puedes ver en este código, estamos utilizando la función nonzero(). Esta función devuelve los índices enteros de los elementos no nulos. Utilizando esta función en la matriz customer_item_matrix para el cliente 12350 dado, podemos obtener la lista de elementos que el cliente 12350 ha comprado. Podemos aplicar el mismo código para el cliente objetivo 17935, hazlo en la siguiente linea y asignalo a la variable items_bought_by_B

Ahora tenemos dos conjuntos de artículos que los clientes 12350 y 17935 han comprado. Utilizando una simple operación de conjunto, podemos encontrar los artículos que el cliente 12350 ha comprado, pero el cliente 17935 no. Haz una resta entre items_bought_by_A y items_bought_by_B y asignalo a la variable items_to_recommend_to_B

Para obtener las descripciones de estos elementos, puede utilizar el siguiente código:

df.loc[
    df['StockCode'].isin(items_to_recommend_to_B), 
    ['StockCode', 'Description']
].drop_duplicates().set_index('StockCode')

Utilizando el filtrado colaborativo basado en el usuario, hemos hablado de cómo podemos hacer recomendaciones de productos específicos para clientes individuales. Puede personalizar e incluir en sus mensajes de marketing estos productos que cada cliente objetivo es probable que compre, lo que puede generar más conversiones de sus clientes.

Como se ha comentado hasta ahora, utilizando un algoritmo de filtrado colaborativo basado en el usuario, puede hacer fácilmente recomendaciones de productos para los clientes objetivo.

Para seguir con el mismo ejercicio puede hacer un filtrado colaborativo basado en elementos.

Esperamos haya aprendido de este reto!