Veri analizi ve veri madenciliği: OLAP, yıldız şema, birliktelik kuralları
OLTP ile OLAP farkı, veri ambarı ve yıldız şema, küp işlemleri ve ROLLUP/CUBE, sonra veri madenciliği: support/confidence/lift, Apriori, karar ağacında bilgi kazancı ve k-means. Finalde kavram ve küçük hesap soruları buradan gelir.
Dönemin son konusu veritabanını “kaydı tutan sistem” olmaktan çıkarıp “karar vermeye yarayan sistem” olarak görmek. İki parçası var. Birincisi veri ambarı (data warehouse) ve OLAP: büyük veriyi farklı boyutlarda özetlemek. İkincisi veri madenciliği (data mining): veride insanın gözüyle bulamayacağı kalıpları bulmak. Final sınavında bu konudan genelde kavram soruları ve küçük hesaplar gelir: support ve confidence hesapla, ROLLUP kaç satır üretir, entropi ne, k-means bir iterasyon. Bilmen gerekenler:
- OLTP günlük işi, OLAP analizi yapar. Tasarımları da bu yüzden farklı.
- Yıldız şema: ortada olgu tablosu, etrafta boyut tabloları.
- ROLLUP , CUBE gruplama kümesi üretir.
- Confidence simetrik değildir. Lift, kuralın bağımsızlıktan ne kadar iyi olduğunu söyler.
- Sınıflandırmada etiket var, kümelemede yok.
OLTP, OLAP ve veri ambarı
Şimdiye kadar kurduğumuz üniversite veritabanı bir OLTP (online transaction processing) sistemiydi. Öğrenci derse kaydolur, not girilir, kredi güncellenir. Her işlem birkaç satıra dokunur, saniyede yüzlerce olur, normalize edilmiş tablolar (9-11. haftalar) güncelleme anomalilerini önler.
Rektörlüğün sorusu ise farklıdır: “Son beş yılda her bölümün her dönem ortalama başarısı nasıl değişti?” Bu bir OLAP (online analytical processing) sorgusudur. Milyonlarca satırı okur, gruplar, toplar. Hiçbir şey güncellemez.
| OLTP | OLAP | |
|---|---|---|
| Amaç | günlük operasyon | analiz, karar destek |
| Sorgu | kısa, birkaç satır, çok sayıda | uzun, milyonlarca satır, az sayıda |
| İşlem | INSERT, UPDATE, DELETE | çoğunlukla SELECT ve toplama |
| Veri | güncel | tarihçeli (geçmiş yıllar) |
| Tasarım | normalize (3NF/BCNF) | denormalize, yıldız şema |
Veri ambarı (data warehouse), farklı kaynaklardan gelen verinin tek bir şemada, uzun dönemli ve analize uygun biçimde toplandığı depodur. Kaynaklardan ambara veri ETL ile taşınır: çıkar (extract), dönüştür (transform: birimleri, kodları, isimleri tek tipe getir, kirli veriyi temizle), yükle (load). Ambar genelde gece toplu olarak güncellenir.
Yıldız şema
Örnek olarak kampüs kafeteryalarının satışlarını analiz edelim. Bir satış olayının ölçüleri (measures) adet ve tutardır. Bu olayı tarif eden bağlam ise boyutlardır (dimensions): hangi ürün, hangi kafeterya, hangi ay.
dim_item(item_id, item_name, category)
|
dim_date(date_id, month) -- fact_sales(date_id, store_id, item_id, qty, amount) -- dim_store(store_id, campus)
(Ortadaki çizgiler yabancı anahtar bağlantısı.) Boyut tabloları: dim_item = {1 Tost Food, 2 Simit Food, 3 Cay Drink, 4 Kahve Drink}, dim_store = {K1 Galata, K2 Rumeli}, dim_date = {1 Sep, 2 Oct}. Olgu tablosu:
| date_id | store_id | item_id | qty | amount |
|---|---|---|---|---|
| 1 | K1 | 1 | 10 | 600 |
| 1 | K1 | 3 | 40 | 400 |
| 1 | K2 | 2 | 30 | 450 |
| 1 | K2 | 4 | 10 | 500 |
| 2 | K1 | 1 | 20 | 1200 |
| 2 | K1 | 4 | 20 | 1000 |
| 2 | K2 | 3 | 50 | 500 |
| 2 | K2 | 2 | 10 | 150 |
Yıldız şemada (star schema) boyutlar tek tablodur ve normalize edilmemiştir: dim_item içinde kategori adı tekrar eder. Kar tanesi şemada (snowflake schema) boyutlar da normalize edilir, örneğin kategori ayrı bir dim_category tablosuna çıkar. Kar tanesi yer kazandırır, ama sorgulara ekstra join ekler.
TUZAK · olgu tablosu küçük değildir. Öğrenciler sık sık “boyut tabloları büyük, olgu tablosu küçük” diye yazar. Tersi doğru. Her satış bir olgu satırıdır, milyonlara ulaşır. Ürün ya da şube sayısı ise sınırlıdır.
Veri küpü ve OLAP işlemleri
Üç boyutu (ürün kategorisi, kampüs, ay) eksen olarak düşünürsen satışlar bir küpün hücrelerine yerleşir. Buna veri küpü (data cube) denir. Her hücre bir kombinasyonun toplamıdır. Her boyuta bir de “hepsi” (ALL) değeri eklenince, iki değerli üç boyut için hücre olur.
| İşlem | Ne yapar | Kafeterya örneği | Sonuç |
|---|---|---|---|
| Slice | bir boyutu tek değere sabitler | sadece Ekim, kampüs bazında | Galata 2200, Rumeli 650 |
| Dice | birkaç boyutta alt küp seçer | Galata ve Food, aylara göre | Sep 600, Oct 1200 |
| Roll-up | daha kaba seviyeye özetler | ürün → kategori → hepsi | Drink 2400, Food 2400 |
| Drill-down | daha ince seviyeye iner | Drink kategorisinden ürünlere | Cay 900, Kahve 1500 |
| Pivot | eksenleri döndürür | kampüs satırda, ay kolonda | aşağıdaki tablo |
Pivot sonucu (tutar):
| campus | Sep | Oct |
|---|---|---|
| Galata | 1000 | 2200 |
| Rumeli | 950 | 650 |
Pivot SQL’de CASE ile yazılır: SUM(CASE WHEN month = 'Sep' THEN amount END) AS Sep.
ROLLUP, CUBE ve GROUPING SETS
Standart SQL’de (SQL:1999 sonrası) birden çok gruplama seviyesini tek sorguda almak için GROUP BY uzantıları var:
SELECT campus, category, SUM(amount) AS total
FROM fact_sales f JOIN dim_item i USING (item_id) JOIN dim_store s USING (store_id)
GROUP BY ROLLUP (campus, category);
ROLLUP(campus, category) şu üç gruplama kümesinin (grouping sets) birleşimidir: (campus, category), (campus), (). Toplanan kolon sonuçta NULL olarak görünür:
| campus | category | total |
|---|---|---|
| Galata | Drink | 1400 |
| Galata | Food | 1800 |
| Rumeli | Drink | 1000 |
| Rumeli | Food | 600 |
| Galata | NULL | 3200 |
| Rumeli | NULL | 1600 |
| NULL | NULL | 4800 |
CUBE(campus, category) ise dört kümenin hepsidir: ROLLUP’takilere (category) eklenir, iki satır daha gelir: (NULL, Drink, 2400) ve (NULL, Food, 2400). Toplam 9 satır. Genel kural: öznitelik için ROLLUP , CUBE küme üretir. GROUPING SETS ((campus), (category)) gibi bir yazımla istediğin kümeleri elle de seçebilirsin.
SQLite bu uzantıları desteklemez. GROUP BY ROLLUP(campus) yazınca “no such function: ROLLUP” hatası alınır. Aynı sonucu UNION ALL ile üretiriz:
SELECT campus, category, SUM(amount) FROM ... GROUP BY campus, category
UNION ALL
SELECT campus, NULL, SUM(amount) FROM ... GROUP BY campus
UNION ALL
SELECT NULL, NULL, SUM(amount) FROM ...;
TUZAK · NULL iki anlama gelebilir. ROLLUP satırındaki NULL “bu kolon üzerinden toplandı” demektir. Ama veride gerçekten NULL kategori varsa ikisi karışır. Standart SQL bunun için
GROUPING(category)fonksiyonunu verir: toplam satırında 1, normal satırda 0 döner.
Veri madenciliği: birliktelik kuralları
Veri madenciliği (data mining), büyük veride yararlı ve beklenmedik kalıpları otomatik bulmaktır. Başlıca görevler: birliktelik kuralları (association rules), sınıflandırma (classification), kümeleme (clustering), regresyon ve aykırı değer tespiti.
Birliktelik kuralı “X alan Y de alır” biçimindedir: . Kafeteryadaki 8 fiş:
| İşlem | Ürünler |
|---|---|
| T1 | cay, simit |
| T2 | cay, simit, tost |
| T3 | kahve, tost |
| T4 | cay, simit |
| T5 | kahve, su |
| T6 | cay, tost |
| T7 | cay, simit, su |
| T8 | kahve, tost |
Üç ölçü:
| Kural | supp(X ∪ Y) | conf | lift |
|---|---|---|---|
| cay ⇒ simit | 4/8 = 0.5 | 4/5 = 0.8 | 0.8 / 0.5 = 1.6 |
| simit ⇒ cay | 0.5 | 4/4 = 1.0 | 1.0 / 0.625 = 1.6 |
| kahve ⇒ tost | 2/8 = 0.25 | 2/3 = 0.667 | 0.667 / 0.5 = 1.333 |
| tost ⇒ cay | 2/8 = 0.25 | 2/4 = 0.5 | 0.5 / 0.625 = 0.8 |
| {cay, simit} ⇒ tost | 1/8 | 1/4 = 0.25 | 0.25 / 0.5 = 0.5 |
Support simetriktir, confidence değildir. Lift ise yine simetriktir: . Lift > 1 ise X, Y’nin olasılığını artırır. Lift < 1 ise azaltır: tost alan müşteri ortalamadan az çay alıyor.
Apriori
Bütün ürün kombinasyonlarını saymak üstel maliyetlidir. Apriori şu ilkeye dayanır: sık (frequent) bir kümenin her alt kümesi de sıktır. Tersi: bir alt kümesi seyrek olan aday saymaya gerek kalmadan atılır. Minimum support sayısı 2 ile:
C1 sayımı : cay 5, kahve 3, simit 4, su 2, tost 4 → L1 = hepsi
C2 sayımı : cay+kahve 0, cay+simit 4, cay+su 1, cay+tost 2, kahve+simit 0,
kahve+su 1, kahve+tost 2, simit+su 1, simit+tost 1, su+tost 0
L2 : {cay,simit}:4, {cay,tost}:2, {kahve,tost}:2
C3 aday : {cay,simit,tost} → {simit,tost} seyrek, BUDANIR
{cay,kahve,tost} → {cay,kahve} seyrek, BUDANIR
C3 boş → dur
Kurallar, sık kümelerden üretilip minimum confidence eşiğiyle süzülür. Örneğin eşik 0.75 ise {cay, simit} kümesinden hem cay ⇒ simit (0.8) hem simit ⇒ cay (1.0) geçer.
Sınıflandırma ve karar ağaçları
Sınıflandırma (classification), etiketi bilinen eğitim verisinden (supervised learning) bir model öğrenip yeni kaydın sınıfını tahmin etmektir: “Bu öğrenci dersi geçer mi?” Karar ağacı (decision tree) her düğümde bir özniteliğe göre veriyi böler. Hangi özniteliğin seçileceğine entropi ile karar verilir:
10 öğrencilik bir eğitim kümesinde 5 kişi geçmiş, 5 kişi kalmış: (en karışık durum). Devam durumu (attendance) ‘yes’ olan 5 kişiden 4’ü geçmiş, ‘no’ olan 5 kişiden 1’i geçmiş. Her dalın entropisi , kazanç . Bu veride çalışma süresi (high/low) da aynı 4’e 1 ve 1’e 4 dağılımı verdiği için kazancı yine 0.278. Eşitlikte herhangi biri seçilebilir. Başka bir karşılaştırma için: 3 geçen 1 kalan bir düğümün entropisi 0.811, 2’ye 2 olanınki 1’dir. Saf (tek sınıflı) düğümde entropi 0’dır ve ağaç orada yaprak olur.
Kümeleme ve k-means
Kümeleme (clustering) etiket olmadan (unsupervised) benzer kayıtları gruplar. En bilinen algoritma k-means:
- k merkez seç.
- Her noktayı en yakın merkeze ata.
- Her merkezi kendi kümesinin ortalamasına taşı.
- Atamalar değişmeyene kadar 2 ve 3’ü tekrarla.
Noktalar A(1,2), B(2,1), C(2,3), D(8,8), E(9,7), F(7,9), k = 2, başlangıç merkezleri c1 = (1,2), c2 = (2,3):
iter 1: A→c1 (d²: 0 / 2) B→c1 (2 / 4) C→c2 (2 / 0) D,E,F→c2
c1 = (1.5, 1.5) c2 = ((2+8+9+7)/4, (3+8+7+9)/4) = (6.5, 6.75)
iter 2: C için d²: c1'e 2.5, c2'ye 34.3125 → C, c1'e geçer
c1 = (1.67, 2) c2 = (8, 8)
iter 3: atama değişmedi → dur. SSE = 2.667 + 4 = 6.667
k-means sonucu başlangıç merkezlerine bağlıdır. Kötü bir başlangıç daha uzun sürebilir ya da kötü bir yerel minimumda kalabilir. Pratikte algoritma farklı başlangıçlarla birkaç kez çalıştırılır ve SSE’si en küçük sonuç seçilir.
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
| Veri ambarı da 3NF tasarlanır | Analiz için denormalize yıldız şema tercih edilir |
| Olgu tablosu küçük, boyutlar büyük | Olgu tablosu en büyük tablodur |
| ROLLUP ile CUBE aynı satırları verir | ROLLUP , CUBE küme. CUBE fazladan (category) toplamlarını da verir |
| conf(X ⇒ Y) = conf(Y ⇒ X) | Değil: cay ⇒ simit 0.8, simit ⇒ cay 1.0 |
| Yüksek confidence = iyi kural | Y zaten çok yaygınsa lift 1’e yakın ya da altında olabilir |
| Apriori her adayı veride sayar | Alt kümesi seyrek olan aday saymadan budanır |
| Kümeleme etiketli veri ister | Etiket sınıflandırmada gerekir, kümeleme unsupervised |
| k-means hep aynı sonucu verir | Başlangıç merkezlerine bağlıdır |
SQLite’ta GROUP BY ROLLUP çalışır | Çalışmaz, UNION ALL ile taklit edilir |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
Which kind of workload is characterized by many short transactions that insert and update a few rows each, such as course registration?
- OLAP
- OLTP
- Data mining
- ETL
Cevabı göster
OLTP (online transaction processing) günlük operasyonel iştir: kısa, sık, birkaç satıra dokunan INSERT/UPDATE'ler. OLAP (online analytical processing) ise az sayıda ama çok büyük, çoğunlukla okuma yapan özetleme sorgularıdır: 'son üç yılda bölüm bazında ortalama not' gibi.
In a star schema, which table stores the numeric measures (such as amount and qty), and what do its other columns reference?
Cevabı göster
Yıldızın merkezinde olgu tablosu (fact table) durur: her satır bir olay (bir satış), ölçüler (measures) sayısaldır. Diğer kolonları boyut tablolarına (dimension tables) giden yabancı anahtarlardır: hangi ürün, hangi kafeterya, hangi tarih. Boyut tabloları küçük ve tanımlayıcı, olgu tablosu büyüktür.
On the cafeteria data, how many rows does SELECT campus, category, SUM(amount) FROM ... GROUP BY ROLLUP(campus, category) return?
Cevabı göster
ROLLUP(campus, category) üç gruplama kümesi üretir: (campus, category), (campus), (). Veride 2 kampüs ve 2 kategori var, hepsi dolu: (campus, category) 4 satır, (campus) 2 satır (Galata 3200, Rumeli 1600), () 1 satır (4800). Toplam 4 + 2 + 1 = 7. SQLite'ta ROLLUP olmadığı için üç GROUP BY UNION ALL ile birleştirildi, 7 satır çıktı.
Same query with GROUP BY CUBE(campus, category). How many rows, and which extra rows appear compared with ROLLUP?
Cevabı göster
CUBE tüm alt kümeleri alır: (campus, category), (campus), (category), (). ROLLUP'ta olmayan tek küme (category): her kategori için kampüsten bağımsız toplam. Drink 1400 + 1000 = 2400, Food 1800 + 600 = 2400. 7 + 2 = 9 satır.
For grouping attributes, how many grouping sets do CUBE and ROLLUP generate? Give the numbers for .
Cevabı göster
CUBE her özniteliği 'var ya da yok' diye seçer: alt küme, için 8. ROLLUP hiyerarşiktir, sağdan birer birer düşürür: (a,b,c), (a,b), (a), (). Toplam .
Slice the cafeteria cube on month = 'Oct' and give total sales (amount) per campus.
Cevabı göster
Slice bir boyutu tek değere sabitler. Ekim satırları: Galata Tost 1200 + Kahve 1000 = 2200, Rumeli Cay 500 + Simit 150 = 650. SQL: ... WHERE month = 'Oct' GROUP BY campus, SQLite'ta aynı sonuç alındı.
Using the 8 cafeteria transactions in the text, what is the support of the itemset {cay, simit}?
Cevabı göster
Support = iki ürünün birlikte geçtiği işlem sayısı / toplam işlem. {cay, simit} T1, T2, T4, T7'de var: 4 / 8 = 0.5.
What is the confidence of the rule cay ⇒ simit? Is it the same as simit ⇒ cay?
Cevabı göster
. Çay 5 işlemde var, bunların 4'ünde simit de var: 4/5 = 0.8. Ters yönde simit 4 işlemde var ve 4'ünde de çay var: 4/4 = 1.0. Confidence simetrik değildir, support simetriktir.
Compute the lift of tost ⇒ cay. What does the value say?
Cevabı göster
. Tost 4 işlemde, bunların 2'sinde çay var: conf = 0.5. supp(cay) = 5/8 = 0.625. lift = 0.5 / 0.625 = 0.8. 1'den küçük: tost alan biri ortalama müşteriden daha az çay alıyor. Confidence 0.5 tek başına fena görünse de lift bunun bağımsızlıktan kötü olduğunu gösterir.
Run Apriori on the 8 transactions with minimum support count 2. Which 2-itemsets are frequent, and why is there no candidate 3-itemset?
Cevabı göster
L1: cay 5, kahve 3, simit 4, su 2, tost 4 (hepsi en az 2). C2'nin 10 çiftinden sadece üçü en az 2 kez geçer. C3 adayları L2'den üretilir: {cay, simit, tost} için {simit, tost} alt kümesi sadece 1 kez geçer, sık değil. {cay, kahve, tost} için {cay, kahve} hiç geçmez. Apriori ilkesi (sık bir kümenin her alt kümesi sıktır) ikisini de veriyi saymadan budar. C3 boş, algoritma durur.
A training set has 10 students: 5 passed, 5 failed. Splitting on attendance: 'yes' has 4 passed and 1 failed, 'no' has 1 passed and 4 failed. Compute the information gain of attendance (log base 2, 3 decimals).
Cevabı göster
Başlangıç entropisi: 5/5 dağılım, . Her dal 4'e 1: . Ağırlıklı ortalama . Kazanç . Karar ağacı kökte en yüksek kazancı veren özniteliği seçer.
k-means with k = 2 on A(1,2), B(2,1), C(2,3), D(8,8), E(9,7), F(7,9). Initial centroids are c1 = (1,2) and c2 = (2,3). Give the centroids after the first iteration, and the final clusters.
Cevabı göster
Atama (kare mesafe): A c1'e (0 ve 2), B c1'e (2 ve 4), C c2'ye (2 ve 0), D, E, F c2'ye. Yeni merkezler: c1 = ortalama(A, B) = (1.5, 1.5), c2 = ortalama(C, D, E, F) = (26/4, 27/4) = (6.5, 6.75). 2. iterasyonda C'nin c1'e kare mesafesi 2.5, c2'ye 34.3125, C c1'e geçer. Merkezler (1.67, 2) ve (8, 8) olur. 3. iterasyonda atama değişmez, algoritma durur. SSE = 6.667.
Doğrulama: verify/SEN2104/14.mjs: kafeterya yıldız şeması node:sqlite (SQLite 3.53) içinde kuruldu, tüm OLAP sorguları çalıştırıldı. SQLite ROLLUP/CUBE desteklemediği için (hata: no such function: ROLLUP) standart SQL sonuçları UNION ALL ile birleştirilmiş GROUP BY'larla üretildi. Support, confidence, lift, Apriori adayları ve budama, entropi ve bilgi kazancı, k-means iterasyonları ve SSE JS ile hesaplandı.