Apriori Algoritması (Birliktelik Kuralları Çıkarımı)
Apriori, genellikle market-sepet analizinde kullanılan bir algoritma. Her bir alışveriş bir transection olarak değerlendiriliyor. Her transection’ın içerdiği ürünlere göre; hangi ürünlerin birlikte alındığını belirlemek için kullanılıyor. Bu nedenle, “birliktelik kuralları çıkarımı” ismi de veriliyor bu çalışmalara.
Sadece market-sepet analizi değil tabii, çok sayıda öznitelik içeren veri setlerinde de kullanılıyor. Bu yazıda SAÜ’den Yrd. Doç. Dr. Nilüfer Yurtay‘ın bir örnek çalışması üzerinden uygulayacağız. Bu çalışmada kişisel özelliklerin (boy, kilo, yaş, kan grubu, ağrı şikayeti) arasındaki ilişki araştırılmaya çalışılacak.
Çalışma sırasında R Programlama dilini kullanacağız. IDE olarak; Windows ve Linux üzerinde çalışabilen ve kişisel kullanım için ücretsiz olan RStudio programını kullandım.
Kullanılan Veri Seti
Basit ve anlaşılır olması açısından 13 tane veri içeren küçük bir veri seti kullanacağız. veri seti şöyle:
gender | age | height | weight | blood | relative headache |
female | 18 | 165 | 53 | A Rh + | yes |
female | 18 | 171 | 60 | 0 Rh + | yes |
male | 19 | 167 | 73 | 0 Rh + | yes |
male | 18 | 170 | 65 | AB Rh + | no |
male | 18 | 183 | 76 | 0 Rh + | no |
male | 20 | 179 | 100 | 0 Rh + | no |
male | 18 | 175 | 72 | A Rh + | yes |
male | 18 | 175 | 90 | 0 Rh + | yes |
male | 18 | 179 | 61 | 0 Rh + | yes |
female | 18 | 163 | 57 | A Rh + | yes |
male | 18 | 181 | 82 | B Rh + | yes |
male | 18 | 177 | 81 | 0 Rh + | yes |
male | 19 | 181 | 93 | 0 Rh + | yes |
Bu veri setini veriler.csv ismi ile kaydettim. Aşağıda da CSV dosyasının ilk birkaç satırını fikir vermesi için ekledim:
1 2 3 4 |
gender,age,height,weight,blood,relative headache female,18,165,53,A Rh +,yes female,18,171,60,0 Rh +,yes male,19,167,73,0 Rh +,yes |
Şimdi bu veriler.csv dosyasını, R kodları ile açıp işleyeceğiz.
R ile Apriori Uygulaması
R ile kullanmaya hazır halde iki tane Apriori kütüphanesi geliyor. Yüklenme işi de IDE üzerinden birkaç tıklama ile yapılabiliyor. Bu kütüphaneler şöyle:
- arules: Apriori için temel komutları barındırıyor.
- arulesViz: Yapılan Apriori uygulamasının görselleştirilmesi için kullanılıyor.
Aşağıda uygulamanın kodları verilmiştir. Uygulamanın çalışabilmesi için, kütüphanelerin yüklenmiş olması ve veriler.csv dosyasının da uygulama ile aynı klasörde olması gerekmektedir. Kodlar içerisinde bolca açıklama olduğundan, ayrıca açıklama yapmayacağım.
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 |
#' --- #' title: "Migren araştırma verileri (Yrd. Doç. Dr. Nilüfer Yurtay)" #' author: "Murat ÖZALP" #' date: "01.11.2015" #' output: #' html_document: #' toc: true #' toc_depth: 2 #' --- # Apriori kütüphanesini yükle library(arules) # CSV dosyasından verileri oku veriler <- read.csv("veriler.csv") #View(veriler) #Verileri ekranda görüntülesin summary(veriler) options(digits = 2) #Değerlerde iki hane ondalık olsun #Boy ve Ağırlık verilerini kategorize edelim veriler[,3] <- discretize( veriler[,3], method = "interval", categories = 3, labels = c("short", "medium", "long") ) veriler[,4] <- discretize( veriler[,4], method = "interval", categories = 3, labels = c("thin", "normal", "fat") ) #Sayısal verileri öznitelik biçimine getirmek için faktörize edelim. veriler[["age"]] <- as.factor(veriler[["age"]]) veriler[["height"]] <- as.factor(veriler[["height"]]) veriler[["weight"]] <- as.factor(veriler[["weight"]]) #Apriori kütüphanesi transaction'lar üzerinde işlem yapar. trans <- as(veriler, "transactions") summary(trans) #Apriori algoritmasına uygun hale gelen verilerin grafiğine bakalım itemFrequencyPlot(trans,topN = 10,type = "absolute") image(trans) plot( sort(itemFrequency(trans, type = "absolute"), decreasing = TRUE), xlab = "Items", ylab = "Support Count", type = "l" ) #Apriori uygulamasını yapalım. Destek=%40, Güven=%85 (minlen ve maxlen ile ilişkili öznitelik sayısı verilebilir) rules <- apriori(trans, parameter = list(supp = 0.4, conf = 0.85)) # minlen=3, maxlen=3 #Lift (ilginçlik) değerine göre sıralanmış kuralların en üstündekileri istele. inspect(head(sort(rules, by = "lift"))) # Apriori grafik kütüphanesini yükle, kurallar ile ilgili grafikleri çiz. library(arulesViz) plot(rules) #plot(rules, interactive=TRUE) plot(rules, method = "grouped") plot(rules, method = "graph", control = list(type = "items")) #plot(rules, method="paracoord", control=list(reorder=TRUE)) plot(rules,method = "graph",interactive = TRUE,shading = T) |
Çıktılar
Üstteki kodlar çalıştırıldığında; belirlenen destek (%40) ve güven (%85) eşik değerleri için elde edilen kuralları, verilerle ilgili grafikleri ve kuralların görselleştirilmiş halini veriyor. Aşağıda bunları göstermeye çalıştım:
Elde Edilen Birliktelik Kuralları
1 2 3 |
## lhs rhs support confidence lift ## 1 {height=long} => {gender=male} 0.46 1.00 1.3 ## 2 {blood=0 Rh +} => {gender=male} 0.54 0.88 1.1 |
Destek ve güven eşiklerine binaen iki tane kural çıktı. Confidence (güven) kısmından veriler arasındaki ilişki oranını görebiliyoruz. Kuralların açıklaması aşağıda verilmiştir:
- Boyu uzun olanlar içerisinde, erkek olanların oranı %100’dür.
- Kan grubu 0Rh+ olanlar içerisinde erkek olanların oranı %88’dir.
Veri sayısı az olduğu için bu kurallar çok anlamlı gelmemiş olabilir. Ancak çok sayıda verilerle oldukça faydalı çıkarımlar elde edilebilir. Hatta ikili, üçlü çıkarımlar yapıldığında fayda miktarı da artabilir. Örneğin; “erkek olup boyu kısa ve kilosu fazla olanların falanca hastalık riski yüksektir” şeklinde magazinsel çıkarımlar da elde edilebilir.
Grafikler
Elde edilen grafikleri yorumlamaya çalışmayacağım. Çünkü veri sayısı az olduğundan çok işlevsel değiller. Zaten 2 tane kural varsa, basit bir pasta grafiği ile süsleyerek sunabilirsiniz. Kural sayısı çok olduğunda, geniş açıdan bakabilmek ve ilişkileri daha rahat okuyabilmek için grafikler elzem olabilmektedir. Üstteki uygulamanın sonucunda elde edilen grafikleri bu nedenle yorumsuz olarak ekliyorum.
1 yorum
Bülent
19 Ekim 2016, 11:30 (UTC 2) Bu yoruma bağlantı
Çok faydalı oldu teşekkürler…