Parte 5 Reglas de Asociación

5.1 Apriori

5.1.1 Intuición de Apriori

Exercise 5.1

¿Cuáles son las tres relaciones esenciales entre el soporte, la confianza y el impulso?

Dadas dos películas \(M_1\) y \(M_2\), aquí están las tres relaciones esenciales para recordar:

  • Relación entre el soporte y la confianza:

\[\textrm{confidence}(M_1 \rightarrow M_2) = \frac{\textrm{support}(M_1, M_2)}{\textrm{support}(M_1)}\] * Relación entre el impulso y el soporte:

\[\textrm{lift}(M_1 \rightarrow M_2) = \frac{\textrm{support}(M_1, M_2)}{\textrm{support}(M_1) \times \textrm{support}(M_2)}\] * Relación entre el impulso y la confianza (consecuencia de las dos ecuaciones anteriores):

\[\textrm{lift}(M_1 \rightarrow M_2) = \frac{\textrm{confidence}(M_1 \rightarrow M_2)}{\textrm{support}(M_2)}\]

Exercise 5.2

¿Las funciones de confianza y impulso son simétricas?

Dadas las tres ecuaciones de la pregunta anterior, podemos ver fácilmente que:

  • La confianza no es simétrica:

\[\textrm{confidence}(M_1 \rightarrow M_2) \ne \textrm{confidence}(M_2 \rightarrow M_1)\] * El impulso es simétrico:

\[\textrm{lift}(M_1 \rightarrow M_2) = \textrm{lift}(M_2 \rightarrow M_1)\]

5.1.2 Apriori en Python

Exercise 5.3

Pregunta importante: ¿es R mejor que Python para el aprendizaje de reglas de asociación?

Si, absolutamente. El paquete R está mucho más optimizado y es más fácil de usar. Pero para los que odian a R, nos aseguramos de proporcionar una solución de Python. Sin embargo, si no te importa el lenguaje, te recomendamos encarecidamente que elijas R.

Exercise 5.4

Tengo problemas para encontrar las reglas de asociación en Python. ¿Cómo puedo verlos de forma más explícita?

Lo siento, la versión del paquete cambió después de que grabara la clase Pero puedes verlos simplemente agregando lo siguiente al final de tu código de Python (en una nueva sección justo después de la sección “Visualización de los resultados”):

the_rules = []
for result in results:
    the_rules.append({'rule': ','.join(result.items),
                      'support':result.support,
                      'confidence':result.ordered_statistics[0].confidence,
                      'lift':result.ordered_statistics[0].lift})
df = pd.DataFrame(the_rules, columns = ['rule', 'support', 'confidence', 'lift'])

Después de la ejecución de este código, deberías ver un DataFrame llamado ‘df’ que aparece en el ‘Explorador de variables’ con toda la información necesaria.

5.1.3 Apriori en R

Exercise 5.5

¿De dónde viene el 3 en el cálculo del soporte?

Elegimos 3 porque consideramos los productos que se compran al menos 3 veces al día. Porque menos de 3 veces al día parecía no ser lo suficientemente relevante como para incluirlas en el análisis.

Exercise 5.6

¿Por qué el soporte y la confianza deberían ser pequeños?

Es porque queremos que nuestras reglas sean significativas y reflejen una tendencia real, no algo realmente raro que sucede una vez cada pocos años, y que por accidente entró en nuestros registros.

Exercise 5.7

¿Por qué una regla como el agua mineral (lhs) y la pasta de trigo integral (rhs) no aparecen en la parte superior de la lista de reglas de asociación?

Es porque el agua mineral puede ir con cualquier cosa, por lo que la regla de asociación entre el agua mineral y la pasta de trigo integral no es la más relevante. Piénsalo de esta manera: si compras agua mineral, ¿desea comprar además pasta de trigo integral como primera opción?

Exercise 5.8

¿Cómo medirías qué tan buenas son las reglas aquí? Mencionamos en los vídeos cómo Amazon y Netflix usan algoritmos más avanzados, pero ¿cómo han llegado a la conclusión de que sus algoritmos son superiores?

En el aprendizaje de reglas de asociación, simplemente medimos la relevancia con el lift Cuanto más altos sea el lift, mejores serán las reglas. Amazon y Netflix funcionan con muchos algoritmos, incluidas las reglas de asociación, los sistemas de recomendación y otros modelos avanzados de aprendizaje automático. Evalúan sus modelos a través de métricas de rendimiento y experimentación.

Exercise 5.9

En un escenario real, ¿cuál es el período de tiempo ideal que debemos considerar para hacer un buen modelo de análisis de la cesta de la compra? ¿Y debería hacerse en cada tienda por separado o por región?

Un mes es un buen período de tiempo. Sin embargo, también podría considerarse de 3 a 6 meses para normalizar el efecto de estacionalidad, o podría ejecutarse el mismo modelo todos los meses, lo que preferiríamos hacer para captar las especificidades de cada mes (temporada, tasa de turismo, etc.).

Luego, el análisis de la ceesta de la compra debe realizarse en cada tienda por separado, ya que depende de los comportamientos del cliente dentro de un vecindario específico. Básicamente, los clientes pueden comportarse de manera diferente en diferentes vecindarios.

5.2 Eclat

5.2.1 Intuición de Eclat

Exercise 5.10

¿Cuándo deberíamos usar Eclat en lugar de Apriori?

La única ventaja de Eclat en comparación con Apriori es que es más simple y rápido de usar. Sin embargo, si necesitas realizar un análisis profundo de la cesta de mercado, definitivamente deberías optar por Apriori.

5.2.2 Eclat en Python

Exercise 5.11

¿Podrías proporcionar una implementación de Eclat en Python?

Crédito a Marcello Morchio, alumno del curso en inglés que amablemente compartió su implementación:

# Eclat, por Marcello Morchio, 4 de Diciembre 2017

# Importar las librerías
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importar el dataset
dataset = pd.read_csv('Market_Basket_Optimisation.csv', header = None )
transactions = [[str(dataset.values[i,j]) for j in range(0, dataset.shape[1])
                 if str(dataset.values[i,j]) != 'nan'] 
                for i in range(0, dataset.shape[0])]

# Generar una lista de elementos únicos en las transacciones.  
items = list()
for t in transactions:
    for x in t:
        if(not x in items):
            items.append(x)

# Generar una lista de pares de elementos con valor de soporte relevante
# [[(item_a, item_b) , support_value]]
# support_value se inicializa a 0 para todas las parejas
eclat = list()
for i in range(0, len(items)):
    for j in range(i+1, len(items)):
        eclat.append([(items[i],items[j]),0])

# Calculamos el valor de soporte para cada par buscando 
# transacciones con ambos elementos
for p in eclat:
    for t in transactions:
        if(p[0][0] in t) and (p[0][1] in t):
            p[1] += 1
    p[1] = p[1]/len(transactions)

# Convertimos eclat en un DataFrame ordenado para visualizarlo en el 
# explorador de variables
eclatDataFrame = pd.DataFrame(eclat,
columns = ['rule','support']).sort_values(by = 'support', ascending = False)

5.2.3 Eclat en R

Exercise 5.12

Parece que el Agua Mineral está sesgando los resultados de las asociaciones porque es la compra más frecuente, entonces, ¿sería irrazonable simplemente excluirla de los datos y reconstruir el modelo sin ella?

Sí, eso podría ser relevante. Sin embargo, habría que comprobar la participación de los ingresos provenientes del agua mineral. Si la participación es alta, tal vez no sea una mala idea colocarla junto a su mejor producto de asociación después de todo.

Exercise 5.13

Encontramos 5 duplicados en los datos. ¿No deberíamos eliminarlos?

Absolutamente no. Podría significar que 5 personas por accidente compraron lo mismo, por lo que estos registros representan diferentes clientes y luego deben guardarse.

Exercise 5.14

¿Qué es la densidad explicada en la clase de Eclat en R?

La densidad es un término que puede tener diferentes significados en diferentes contextos. En este caso particular, la densidad es la proporción de celdas con elementos (valores distintos de cero en la matriz) sobre el número total de celdas en la matriz.