As Regras de Associação são técnicas de aprendizado não supervisionado que descobrem relações de coocorrência entre itens em uma base de transações. O objetivo é encontrar padrões do tipo “se X, então Y”.

Aplicações

  • Análise de cestas de compras em supermercados.
  • Recomendação de produtos em sites de e-commerce.
  • Controle de evasão escolar e sistemas de recomendação de conteúdo.

Exemplos clássicos:

  • Compra de cerveja → compra de fralda.
  • Assistir Senhor dos Anéis 1 → assistir Senhor dos Anéis 2 e 3.

Algoritmo Apriori

O Apriori funciona em duas fases:

  1. Gerar itemsets frequentes — conjuntos de itens com suporte ≥ mínimo definido.
  2. Gerar regras — a partir dos itemsets, com confiança ≥ mínimo definido.

Fase 1: itemsets frequentes

Começa com itens individuais (tamanho 1). Combina os que passam no suporte mínimo para formar pares (tamanho 2), depois trios (tamanho 3), e assim por diante até não ser possível combinar mais.

Exemplo com 10 transações de mercado:

TransaçãoItens
1Café, Pão, Manteiga
2Leite, Cerveja, Pão, Manteiga
3Café, Pão, Manteiga
4Leite, Café, Pão, Manteiga
5Cerveja

Com suporte mínimo = 0,3 (30% das transações):

ItemsetSuporte
Café3/10 = 0,3
Pão5/10 = 0,5
Manteiga5/10 = 0,5
{Café, Pão}3/10 = 0,3
{Café, Manteiga}3/10 = 0,3
{Pão, Manteiga}4/10 = 0,4
{Café, Pão, Manteiga}3/10 = 0,3
Suporte(X) = Ocorrências de X / Total de registros

Fase 2: geração de regras

A partir dos itemsets frequentes, gera-se regras X → Y:

Confiança(X → Y) = Suporte(X ∪ Y) / Suporte(X)

Com confiança mínima = 0,8:

RegraConfiança
Café → Pão0,3/0,3 = 1,0
Pão → Café0,3/0,5 = 0,6
Pão → Manteiga0,4/0,5 = 0,8
Manteiga → Pão0,4/0,5 = 0,8
Café → Pão, Manteiga0,3/0,3 = 1,0

Lift

O Lift mede o quanto a regra é melhor do que o acaso:

Lift(X → Y) = Confiança(X → Y) / Suporte(Y)
RegraLift
Café → Pão1/0,5 = 2,0
Café → Manteiga1/0,5 = 2,0
Pão → Manteiga0,8/0,5 = 1,6
Café → Pão, Manteiga1/0,5 = 2,0

Lift > 1 indica associação positiva; quanto maior, mais relevante a regra.

Pré-processamento para o Apriori

Arquivos CSV de transações precisam ser transformados:

  1. Ler o CSV (sem cabeçalho, header=None).
  2. Converter para lista e remover valores NaN (nem toda transação tem o mesmo número de itens).
  3. Usar TransactionEncoder para criar uma matriz binária (cada item vira uma coluna).

Implementação em Python

Bibliotecas necessárias:

!pip install mlxtend
from mlxtend.frequent_patterns import apriori, association_rules
from mlxtend.preprocessing import TransactionEncoder

Talk is cheap, show me the code: Bases utilizadas nesta aula (disponíveis no Google Drive): mercado.csv · mercado2.csv · tv_showsAR.csv

Roteiro para a aula de Regras de Associação
1 . Importar as bibliotecas
#biblioteca para gerar gráficos dinâmicos
!pip install plotly --upgrade
#pandas é uma biblioteca que trabalha com a importação de arquivos .csv
import pandas as pd
#numpy é uma biblioteca para a realização de operações em arrays
import numpy as np
#seaborn é uma biblioteca para vizualização de gráficos
import seaborn as sb
#matplotlib é também uma biblioteca para a geração de gráficos
import matplotlib.pyplot as plt
import plotly.express as px

#instalar a biblioteca apriori
!pip install apyori
#importar a biblioteca apriori e association_rules
from mlxtend.frequent_patterns import apriori, association_rules

#biblioteca para ignorar os warnings
import warnings
warnings.filterwarnings('ignore')

2. Colocar os três arquivos passados pelo professor no drive do colab (mercado.csv, mercado2.csv e tv_showsAR.csv)

====Base de dados mercado.csv
3. Importar a base de dados mercado.csv
base_mercado1 = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/Associacao/mercado.csv', header = None)
base_mercado1

base mercado.shape #mostra a quantidade de linhas e colunas

4. Eliminar os valores ausentes (Nan) do arquivo 
#transformando a base .csv eliminando os Nan, pois não há todos os itens em cada compra.x
transacoesBm1 = base_mercado1.values.tolist() #transforma para lista
transacoesBm1 = [[item for item in row if pd.notna(item)] for row in transacoesBm1] #elimina os Nan

5. Importar a biblioteca para que o algoritmo APRIORI entenda o formato do arquivo
#biblioteca para transformar o arquivo no formato que o apriori entenda  (cada item uma coluna)
from mlxtend.preprocessing import TransactionEncoder

transacoesBm1_te = TransactionEncoder() # para transformar no formato do Apriori
transacoesBm1_te_array = transacoesBm1_te.fit(transacoesBm1).transform(transacoesBm1)
#transforma cada item em uma coluna
transacoesBm1_df = pd.DataFrame(transacoesBm1_te_array, columns=transacoesBm1_te.columns_)

transacoesBm1_df

6. Gerando os itemsets frequentes e as regras

#gerando conjunto de itens frequentes com suporte maior ou igual ao mínimo estabelecido
itemsets_frequentesBm1 = apriori(transacoesBm1_df, min_support=0.3, use_colnames=True)

print(itemsets_frequentesBm1)
print(itemsets_frequentesBm1.sort_values(by='support', ascending=False))

#gerando as regras com confiança mínima = 0.8
regras_bm1 = association_rules(itemsets_frequentesBm1, metric='confidence', min_threshold=0.8)

regras_bm1

#ordenando as regras
regras_bm1 = regras_bm1.sort_values(by='lift', ascending=True)
regras_bm1

================BASE MERCADO 2==============================
1. Caso as bibliotecas já tenham sido importadas, faça a importação da base mercado2.csv
base_mercado2 = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/Associacao/mercado2.csv', header = None)
base_mercado2

2. Eliminar os valores ausentes (Nan) do arquivo 
#transformando a base .csv eliminando os Nan
transacoesBm2 = base_mercado2.values.tolist() #transforma para lista
transacoesBm2 = [[item for item in row if pd.notna(item)] for row in transacoesBm2] #elimina os Nan

3. Importar a biblioteca para que o algoritmo APRIORI entenda o formato do arquivo
#biblioteca para transformar o arquivo no formato que o apriori entenda
from mlxtend.preprocessing import TransactionEncoder

transacoesBm2_te = TransactionEncoder() # para transformar no formato do Apriori
transacoesBm2_te_arry = transacoesBm2_te.fit(transacoesBm2).transform(transacoesBm2)
#transforma cada item em uma coluna
transacoesBm2_df = pd.DataFrame(transacoesBm2_te_arry, columns=transacoesBm2_te.columns_)

transacoesBm2_df

4. Gerando os itemsets frequentes e as regras

#gerando conjunto de itens frequentes com suporte maior ou igual ao mínimo estabelecido
itemsets_frequentesBm2 = apriori(transacoesBm2_df, min_support=0.04, use_colnames=True)

print(itemsets_frequentesBm2)
print(itemsets_frequentesBm2.sort_values(by='support', ascending=False))

regras_bm2 = association_rules(itemsets_frequentesBm2, metric='confidence', min_threshold=0.2)
regras_bm2