AM Não Supervisionado
AM Não Supervisionado
Apriori, FP-Growth, Eclat
O que são regras de associação
Regras de associação é uma técnica não supervisionada. Ela descobre relações entre itens em grandes transações. Por exemplo, clientes que compram pão também compram manteiga. Essa descoberta é feita sem rótulos prévios. Primeiramente, o algoritmo analisa frequências de itens. Em seguida, ele gera regras do tipo “se X então Y”. Essas regras são usadas em cestas de compras e recomendações. Diferentemente da classificação, aqui não há variável alvo. O objetivo é encontrar padrões ocultos nos dados. Três algoritmos principais são Apriori, FP-Growth e Eclat.
Cada algoritmo tem uma arquitetura distinta. Apriori é baseado em geração de candidatos passo a passo. Ele é simples, mas pode ser lento com muitos dados. FP-Growth usa uma estrutura de árvore compacta. Essa árvore evita a geração repetitiva de candidatos. Por conseguinte, FP-Growth é muito mais rápido. Eclat trabalha com uma representação vertical dos dados. Ele usa interseções de identificadores de transações. Sua eficiência é boa para conjuntos densos. Todos os três são amplamente utilizados na prática.
Arquitetura dos modelos
O Apriori opera em duas fases principais. Primeiro, ele encontra todos os conjuntos frequentes de itens. Começa com itens individuais e aumenta o tamanho gradualmente. A cada passo, candidatos são gerados a partir dos anteriores. Depois, conta-se o suporte de cada candidato no banco. Itens abaixo do suporte mínimo são descartados. Esse processo é repetido até não haver novos conjuntos. Finalmente, as regras são geradas a partir desses conjuntos. A poda (pruning) é feita pela propriedade anti-monotônica: \(sup(X) \ge sup(X \cup Y)\). Isso significa que subconjuntos são sempre mais frequentes. O FP-Growth constrói uma árvore de padrões frequentes. Cada nó representa um item e seu caminho. A árvore é compacta e armazena contagens de suporte. Depois, a mineração é feita recursivamente na árvore. O Eclat transforma dados em listas de IDs de transações. Cada item tem uma lista de onde ele aparece. A interseção dessas listas dá o suporte dos conjuntos. Essa abordagem é eficiente para bases com muitos itens.
Hiperparâmetros e fórmulas matemáticas
Os hiperparâmetros principais são suporte e confiança. O suporte mede a frequência de um conjunto de itens: \(sup(X) = \frac{\text{transações com X}}{N}\). Aqui, \(N\) é o número total de transações. A confiança mede a força de uma regra \(X \to Y\): \(conf(X \to Y) = \frac{sup(X \cup Y)}{sup(X)}\). Ela indica quantas vezes Y aparece junto com X. Outra métrica importante é o lift (elevação): \(lift(X \to Y) = \frac{sup(X \cup Y)}{sup(X) \cdot sup(Y)}\). Lift > 1 indica associação positiva relevante. Valores abaixo de 1 mostram correlação negativa. O terceiro hiperparâmetro é o comprimento mínimo da regra. Apriori também tem o parâmetro de tamanho máximo de itens. FP-Growth usa suporte mínimo como único parâmetro essencial. Eclat segue a mesma lógica do Apriori para suporte. A escolha do suporte mínimo é crítica e empírica. Suportes muito baixos geram muitas regras inúteis. Suportes altos podem perder padrões interessantes.
Enunciado do exemplo clássico (cesta de supermercado)
Você recebeu dados de transações de um supermercado. Cada transação contém itens comprados por um cliente. Seu objetivo é encontrar regras de associação fortes. Use o algoritmo Apriori para minerar os dados. Aplique suporte mínimo de 0.05 e confiança mínima de 0.5. Ordene as regras encontradas pelo lift (elevação). Exiba um gráfico de barras com as 10 melhores regras. Mostre também uma matriz de co-ocorrência de itens. O código abaixo resolve este enunciado completamente. Ele roda no Google Colab sem necessidade de ajustes. Boa prática! Regras de associação revelam padrões de consumo.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
import numpy as np import pandas as pd import matplotlib.pyplot as plt from mlxtend.frequent_patterns import apriori, association_rules from mlxtend.preprocessing import TransactionEncoder import seaborn as sns # Dados sintéticos de transações de supermercado transacoes = [ ['pão', 'leite', 'manteiga'], ['pão', 'leite', 'ovos'], ['pão', 'manteiga', 'café'], ['leite', 'manteiga', 'café', 'ovos'], ['pão', 'leite', 'manteiga', 'café'], ['pão', 'ovos', 'café'], ['leite', 'manteiga', 'ovos'], ['pão', 'leite', 'café'], ['pão', 'manteiga', 'ovos', 'café'], ['leite', 'manteiga', 'café'], ['pão', 'leite', 'manteiga', 'ovos'], ['pão', 'café'], ['leite', 'ovos', 'café'], ['pão', 'leite', 'manteiga'], ['manteiga', 'ovos', 'café'] ] print(f"Número de transações: {len(transacoes)}") print("Exemplo de transação:", transacoes[0]) # Codificação das transações te = TransactionEncoder() te_array = te.fit(transacoes).transform(transacoes) df = pd.DataFrame(te_array, columns=te.columns_) print("\nItens disponíveis:", list(df.columns)) # Aplicação do algoritmo Apriori suporte_min = 0.05 # 5% das transações frequent_itemsets = apriori(df, min_support=suporte_min, use_colnames=True) print(f"\nConjuntos frequentes encontrados: {len(frequent_itemsets)}") # Geração das regras de associação regras = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5) regras = regras.sort_values('lift', ascending=False) print(f"\nRegras encontradas: {len(regras)}") print("\nTop 5 regras por lift:") print(regras[['antecedents', 'consequents', 'support', 'confidence', 'lift']].head()) # Gráfico 1: Top 10 regras por lift top10 = regras.head(10).copy() top10['rule'] = top10.apply(lambda x: f"{set(x['antecedents'])} → {set(x['consequents'])}", axis=1) plt.figure(figsize=(10, 6)) barras = plt.barh(top10['rule'], top10['lift'], color='steelblue', edgecolor='black') plt.xlabel('Lift (elevação)') plt.ylabel('Regra') plt.title('Top 10 regras de associação por lift') plt.gca().invert_yaxis() for bar, lift in zip(barras, top10['lift']): plt.text(bar.get_width() + 0.02, bar.get_y() + bar.get_height()/2, f'{lift:.2f}', va='center', fontsize=9) plt.tight_layout() plt.show() # Gráfico 2: Matriz de co-ocorrência dos itens from collections import defaultdict # Calcula co-ocorrência coocorrencia = defaultdict(int) for trans in transacoes: for i in range(len(trans)): for j in range(i+1, len(trans)): par = tuple(sorted([trans[i], trans[j]])) coocorrencia[par] += 1 # Cria matriz itens_unicos = sorted(list(set([item for trans in transacoes for item in trans]))) matriz = pd.DataFrame(0, index=itens_unicos, columns=itens_unicos) for (a, b), count in coocorrencia.items(): matriz.loc[a, b] = count matriz.loc[b, a] = count plt.figure(figsize=(8, 6)) sns.heatmap(matriz, annot=True, cmap='YlOrRd', fmt='d', linewidths=0.5) plt.title('Matriz de co-ocorrência de itens (frequência de pares)') plt.tight_layout() plt.show() # Interpretação dos resultados print("\n" + "=" * 60) print("Interpretação das regras encontradas:") print("=" * 60) for idx, row in regras.head(3).iterrows(): ant = set(row['antecedents']) cons = set(row['consequents']) print(f"\nRegra: {ant} → {cons}") print(f" Suporte: {row['support']:.3f} (aparece em {row['support']*100:.1f}% das compras)") print(f" Confiança: {row['confidence']:.3f} ({row['confidence']*100:.1f}% das vezes com {ant} também tem {cons})") print(f" Lift: {row['lift']:.3f} ({'associação positiva forte' if row['lift'] > 1 else 'associação negativa'})") # Demonstração do FP-Growth (biblioteca opcional) print("\n" + "=" * 60) print("Comparação com FP-Growth (conceitual):") print("=" * 60) print("FP-Growth seria mais rápido que Apriori para grandes datasets.") print("Sua árvore compacta evita escanear o banco repetidamente.") print("Para este exemplo pequeno, a diferença é imperceptível.") |
Esse código aplica Apriori a dados de supermercado. O suporte mínimo de 5% filtra itens pouco frequentes. A confiança mínima de 50% garante regras relevantes. O lift acima de 1 indica associação positiva verdadeira. A matriz de co-ocorrência mostra pares de itens frequentes. O gráfico de barras exibe as regras mais fortes. Pão e leite frequentemente aparecem juntos nas regras. Manteiga e café também mostram alta correlação. Para dados reais, aumente o número de transações. Regras de associação são essenciais em market basket analysis. Parabéns por descobrir padrões escondidos nas compras!
`