SEN2104 · 14. hafta · Introduction to Data Analysis and Data Mining Concepts

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.

OLTPOLAPdata warehouseETLstar schemasnowflake schemafact tabledimension tablemeasuredata cubeslicediceroll-updrill-downpivotGROUP BY ROLLUPGROUP BY CUBEgrouping setsassociation rulesupportconfidenceliftAprioriclassificationdecision treeentropyinformation gainclusteringk-means

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:

  1. OLTP günlük işi, OLAP analizi yapar. Tasarımları da bu yüzden farklı.
  2. Yıldız şema: ortada olgu tablosu, etrafta boyut tabloları.
  3. ROLLUP n+1n+1, CUBE 2n2^n gruplama kümesi üretir.
  4. Confidence simetrik değildir. Lift, kuralın bağımsızlıktan ne kadar iyi olduğunu söyler.
  5. 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.

OLTPOLAP
Amaçgünlük operasyonanaliz, karar destek
Sorgukısa, birkaç satır, çok sayıdauzun, milyonlarca satır, az sayıda
İşlemINSERT, UPDATE, DELETEçoğunlukla SELECT ve toplama
Verigünceltarihçeli (geçmiş yıllar)
Tasarımnormalize (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_idstore_iditem_idqtyamount
1K1110600
1K1340400
1K2230450
1K2410500
2K11201200
2K14201000
2K2350500
2K2210150

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 (2+1)3=27(2+1)^3 = 27 hücre olur.

İşlemNe yaparKafeterya örneğiSonuç
Slicebir boyutu tek değere sabitlersadece Ekim, kampüs bazındaGalata 2200, Rumeli 650
Dicebirkaç boyutta alt küp seçerGalata ve Food, aylara göreSep 600, Oct 1200
Roll-updaha kaba seviyeye özetlerürün → kategori → hepsiDrink 2400, Food 2400
Drill-downdaha ince seviyeye inerDrink kategorisinden ürünlereCay 900, Kahve 1500
Pivoteksenleri döndürürkampüs satırda, ay kolondaaşağıdaki tablo

Pivot sonucu (tutar):

campusSepOct
Galata10002200
Rumeli950650

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:

campuscategorytotal
GalataDrink1400
GalataFood1800
RumeliDrink1000
RumeliFood600
GalataNULL3200
RumeliNULL1600
NULLNULL4800

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: nn öznitelik için ROLLUP n+1n+1, CUBE 2n2^n 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: X⇒YX \Rightarrow Y. Kafeteryadaki 8 fiş:

İşlemÜrünler
T1cay, simit
T2cay, simit, tost
T3kahve, tost
T4cay, simit
T5kahve, su
T6cay, tost
T7cay, simit, su
T8kahve, tost

Üç ölçü:

supp(X)=X’i ic¸eren is¸lem sayısıNconf(X⇒Y)=supp(X∪Y)supp(X)lift(X⇒Y)=conf(X⇒Y)supp(Y)supp(X) = \frac{X\text{'i içeren işlem sayısı}}{N} \qquad conf(X \Rightarrow Y) = \frac{supp(X \cup Y)}{supp(X)} \qquad lift(X \Rightarrow Y) = \frac{conf(X \Rightarrow Y)}{supp(Y)}

Kuralsupp(X ∪ Y)conflift
cay ⇒ simit4/8 = 0.54/5 = 0.80.8 / 0.5 = 1.6
simit ⇒ cay0.54/4 = 1.01.0 / 0.625 = 1.6
kahve ⇒ tost2/8 = 0.252/3 = 0.6670.667 / 0.5 = 1.333
tost ⇒ cay2/8 = 0.252/4 = 0.50.5 / 0.625 = 0.8
{cay, simit} ⇒ tost1/81/4 = 0.250.25 / 0.5 = 0.5

Support simetriktir, confidence değildir. Lift ise yine simetriktir: lift=supp(X∪Y)supp(X) supp(Y)lift = \frac{supp(X \cup Y)}{supp(X)\,supp(Y)}. 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:

H(S)=−∑ipilog⁡2piGain(S,A)=H(S)−∑v∣Sv∣∣S∣H(Sv)H(S) = -\sum_i p_i \log_2 p_i \qquad Gain(S, A) = H(S) - \sum_v \frac{|S_v|}{|S|} H(S_v)

10 öğrencilik bir eğitim kümesinde 5 kişi geçmiş, 5 kişi kalmış: H=1H = 1 (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 −0.8log⁡20.8−0.2log⁡20.2=0.722-0.8\log_2 0.8 - 0.2\log_2 0.2 = 0.722, kazanç 1−0.722=0.2781 - 0.722 = 0.278. 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:

  1. k merkez seç.
  2. Her noktayı en yakın merkeze ata.
  3. Her merkezi kendi kümesinin ortalamasına taşı.
  4. 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üşünceDoğrusu
Veri ambarı da 3NF tasarlanırAnaliz için denormalize yıldız şema tercih edilir
Olgu tablosu küçük, boyutlar büyükOlgu tablosu en büyük tablodur
ROLLUP ile CUBE aynı satırları verirROLLUP n+1n+1, CUBE 2n2^n 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 kuralY zaten çok yaygınsa lift 1’e yakın ya da altında olabilir
Apriori her adayı veride sayarAlt kümesi seyrek olan aday saymadan budanır
Kümeleme etiketli veri isterEtiket sınıflandırmada gerekir, kümeleme unsupervised
k-means hep aynı sonucu verirBaş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ç.

Soru 1kolay

Which kind of workload is characterized by many short transactions that insert and update a few rows each, such as course registration?

  1. OLAP
  2. OLTP
  3. Data mining
  4. ETL
Cevabı göster
OLTP

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.

Soru 2kolay

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
The fact table; its other columns are foreign keys to the dimension tables

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.

Soru 3orta

On the cafeteria data, how many rows does SELECT campus, category, SUM(amount) FROM ... GROUP BY ROLLUP(campus, category) return?

Cevabı göster
7

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ı.

Soru 4orta

Same query with GROUP BY CUBE(campus, category). How many rows, and which extra rows appear compared with ROLLUP?

Cevabı göster
9; the two category totals (NULL, Drink, 2400) and (NULL, Food, 2400)

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.

Soru 5orta

For nn grouping attributes, how many grouping sets do CUBE and ROLLUP generate? Give the numbers for n=3n = 3.

Cevabı göster
CUBE: 2^n = 8, ROLLUP: n + 1 = 4

CUBE her özniteliği 'var ya da yok' diye seçer: 2n2^n alt küme, n=3n = 3 için 8. ROLLUP hiyerarşiktir, sağdan birer birer düşürür: (a,b,c), (a,b), (a), (). Toplam n+1=4n + 1 = 4.

Soru 6kolay

Slice the cafeteria cube on month = 'Oct' and give total sales (amount) per campus.

Cevabı göster
Galata 2200, Rumeli 650

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ı.

Soru 7kolay

Using the 8 cafeteria transactions in the text, what is the support of the itemset {cay, simit}?

Cevabı göster
0.5

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.

Soru 8orta

What is the confidence of the rule cay ⇒ simit? Is it the same as simit ⇒ cay?

Cevabı göster
0.8; no, simit ⇒ cay has confidence 1.0

conf(X⇒Y)=supp(X∪Y)supp(X)conf(X \Rightarrow Y) = \frac{supp(X \cup Y)}{supp(X)}. Ç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.

Soru 9orta

Compute the lift of tost ⇒ cay. What does the value say?

Cevabı göster
0.8; tost and cay are negatively correlated (lift < 1)

lift=conf(tost⇒cay)supp(cay)lift = \frac{conf(tost \Rightarrow cay)}{supp(cay)}. 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.

Soru 10zor

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
{cay,simit}:4, {cay,tost}:2, {kahve,tost}:2; every 3-itemset built from them has an infrequent 2-subset, so all are pruned

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.

Soru 11zor

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
0.278

Başlangıç entropisi: 5/5 dağılım, H=1H = 1. Her dal 4'e 1: H=−0.8log⁡20.8−0.2log⁡20.2=0.722H = -0.8\log_2 0.8 - 0.2\log_2 0.2 = 0.722. Ağırlıklı ortalama 0.5⋅0.722+0.5⋅0.722=0.7220.5 \cdot 0.722 + 0.5 \cdot 0.722 = 0.722. Kazanç 1−0.722=0.2781 - 0.722 = 0.278. Karar ağacı kökte en yüksek kazancı veren özniteliği seçer.

Soru 12zor

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
After iteration 1: c1 = (1.5, 1.5), c2 = (6.5, 6.75). Final: {A, B, C} and {D, E, F}

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ı.

Deftere not kartı

OLTP: kısa, sık güncelleme (kayıt, ödeme) OLAP: büyük, okuma ağırlıklı özet sorguları Veri ambarı: çok kaynaktan ETL (extract, transform, load) ile toplanan, tarihçeli, analiz için veri Yıldız şema: ortada fact (ölçüler + FK'ler), etrafta dimension. Snowflake: boyutlar normalize slice: 1 boyut sabit dice: birkaç boyutta alt küp roll-up: özetle (ürün→kategori) drill-down: ayrıntıya in pivot: satır/kolon eksenini döndür ROLLUP(a,b) = (a,b),(a),() → n+1 küme CUBE(a,b) = (a,b),(a),(b),() → 2^n küme Toplanan kolon sonuçta NULL görünür. SQLite'ta ROLLUP/CUBE yok: UNION ALL ile taklit et supp(X) = X'i içeren işlem / toplam conf(X⇒Y) = supp(X∪Y) / supp(X) (simetrik değil) lift = conf(X⇒Y) / supp(Y): >1 pozitif, =1 bağımsız, <1 negatif ilişki Apriori: sık kümenin her alt kümesi sık. Alt kümesi seyrek olan aday saymadan budanır Entropi H = -Σ p log2 p (5/5 → 1, 4/1 → 0.722, 3/1 → 0.811). Gain = H(üst) - ağırlıklı H(dallar) Sınıflandırma: etiketli veri (supervised). Kümeleme: etiket yok (unsupervised) k-means: ata → merkezi ortalama yap → atama değişmeyene kadar. Sonuç başlangıca bağlı