Apriori algoritması, büyük veri kümelerinden sık kullanılan öğe kümelerini belirlemek ve ilişkilendirme kuralları oluşturmak için kullanılan klasik bir veri madenciliği tekniğidir. Bir öğe kümesi sık kullanılıyorsa, tüm alt kümelerinin de sık kullanılması gerektiği ilkesine dayanır.
Birliktelik Kuralı Öğreniminde üç yöntem vardır:
- 1) Apriori,
- 2) Eclat,
- 3) FP Growth Algorithm.
Bu yöntemlerde kullanılan metrikler; destek (support), güven (confidence) ve kaldıraç (lift) gibi metrikleridir. Metrikleri incelemek gerekirse:
Destek(Support); Bir veri kümesinde T işleminin bir kısmında görülen X öğelerinin sıklığı olarak tanımlanabilir. Yalnızca bir ürünün (veya ürün kombinasyonunun) meydana geldiği işlem sayısıdır. X ve Y nin birlikte görülme olasılığıdır. Algoritmanın ilk adımı her bir öğenin support değerini hesaplamaktır.
Güven (Confidence); İlişki kurallarının doğruluk olasılığını belirlemek için bir özelliktir. Ürün çiftlerinin oluşma olasılığıdır. X satın alındığında Y nin satılması olasılığıdır.
Lift; bir ürün alındığında diğer ürünün alınma olasılığının kaç kat artacağını gösteren metriktir. X satın alındığında Y nin satın alınma olasılığı lift kat kadar artmasıdır.
Apriori Algoritması Nerelerde Kullanılır
- Sağlık sektöründe kullanılır – hastaların ilaçlarını, yan etki nedenlerini özelliklerine göre gruplandırarak tespit eder.
- E-ticaret perakende mağazalarında kullanılır.
- Hidrolojik sistemlerde kullanılır – doğal olayları tahmin eder.
- Diyabet araştırmalarında kullanılır.
- E-öğrenim platformunda öğrenci ders seçimi.
- Stok yönetiminde kullanılır.
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules
import networkx as nx
import matplotlib.pyplot as plt
# 1. Veriyi oku
file_path = "odev-1.xlsx"
df = pd.read_excel(file_path)
# 2. İlk 944 satır, 120 sütun (isteğe bağlı)
df = df.iloc[:944, :120]
# 3. Gereksiz sütunu sil
if 'Unnamed: 0' in df.columns:
df = df.drop(columns=['Unnamed: 0'])
#df = df.drop(columns=["ALIŞVERİŞ POŞETİ"])
# 4. Boolean'a çevir (KRİTİK)
df = df.astype(bool)
# 5. Apriori
frequent_itemsets = apriori(df, min_support=0.02, use_colnames=True)
# 6. Association rules
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5)
print(rules.head())
# ---------------- GRAPH ---------------- #
G = nx.DiGraph()
# Node ekleme
for _, row in rules.iterrows():
for ant in row['antecedents']:
G.add_node(ant, color='lightblue')
for con in row['consequents']:
G.add_node(con, color='pink')
# Edge ekleme
for _, row in rules.iterrows():
for ant in row['antecedents']:
for con in row['consequents']:
G.add_edge(
ant,
con,
label=f"conf: {row['confidence']:.2f}\nlift: {row['lift']:.2f}"
)
# Çizim
pos = nx.spring_layout(G, seed=42)
node_colors = [G.nodes[n].get('color', 'gray') for n in G.nodes()]
edge_labels = nx.get_edge_attributes(G, 'label')
plt.figure(figsize=(12,8))
nx.draw(G, pos, with_labels=True, node_color=node_colors, node_size=2000)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.title("Association Rules Graph")
plt.show()
Görsel
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules
import networkx as nx
import matplotlib.pyplot as plt
# VERİYİ OKU
df = pd.read_excel("odev-1.xlsx")
df = df.iloc[:944, :120]
if 'Unnamed: 0' in df.columns:
df = df.drop(columns=['Unnamed: 0'])
df = df.astype(bool)
# APRIORI
frequent_itemsets = apriori(df, min_support=0.02, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5)
# ---------------- GRAPH ---------------- #
G = nx.DiGraph()
# NODE support hesaplamak için dict
support_dict = {}
for _, row in frequent_itemsets.iterrows():
for item in row['itemsets']:
support_dict[item] = row['support']
# NODE ekleme (boyut support’a göre)
for _, row in rules.iterrows():
for ant in row['antecedents']:
G.add_node(ant, size=support_dict.get(ant, 0.01)*5000, color='lightblue')
for con in row['consequents']:
G.add_node(con, size=support_dict.get(con, 0.01)*5000, color='pink')
# EDGE ekleme (kalınlık lift’e göre)
for _, row in rules.iterrows():
for ant in row['antecedents']:
for con in row['consequents']:
G.add_edge(
ant,
con,
weight=row['lift'],
label=f"conf: {row['confidence']:.2f}\nlift: {row['lift']:.2f}"
)
# DRAW
pos = nx.spring_layout(G, seed=42)
node_sizes = [G.nodes[n]['size'] for n in G.nodes()]
node_colors = [G.nodes[n]['color'] for n in G.nodes()]
edge_widths = [G[u][v]['weight']*2 for u,v in G.edges()]
edge_labels = nx.get_edge_attributes(G, 'label')
plt.figure(figsize=(14,10))
nx.draw(
G, pos,
with_labels=True,
node_size=node_sizes,
node_color=node_colors,
width=edge_widths,
font_size=9
)
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8)
plt.title("Association Rules - Weighted Graph")
plt.show()
Kaynaklar
- https://medium.com/@nrmnbabalik/apriori-algoritmas%C4%B1-c15d19d9d39e
- https://medium.com/@nrmnbabalik/apriori-algoritmas%C4%B1-c15d19d9d39e
- https://algobeans.com/2016/04/01/association-rules-and-the-apriori-algorithm/ (Görsel anlatım)

