Ders 13 / 13
Yanıltıcı Analizler
Kümenin kendisinin bir seçim olduğunun ve gürültünün bulgu üretebildiğinin sayılması: ağdaki bütün sayaçların kütlesinde doğu ile kuzey arasındaki fark 4,659 m³, okunabilmiş sayaçların örnekleminde 4,463 m³, sıfır okumalar atılınca 4,655 m³ ve yalnız üç dönem kalan abonelerde 4,454 m³ çıkar; dört kararın açıklığı 0,206 m³'tür. 1.329 abonenin 69'u hiçbir tabloda görünmez. Yirmi kırılımlık on tarama tümüyle rastgele bir sonuç değişkeni üzerinde 200 sınama yapar ve 11 bulgu verir; beklenen 10,0'dır ve on taramanın 7'sinde en az bir bulgu çıkar. Kurs kapanışında on üç dersin gözlenen sayısı, oynama payı ve kararın değişip değişmediği tek tabloda toplanır.
İçindekiler
Üç derste sayının yanına payı yazıldı ve payı büyüten üç kaynak sayıldı: bileşim sayısı, modelde bulunmayan değişken, kohort tanımı. Üçünde de küme verilmiş kabul edildi. Bu ders o kabulü kaldırır. Küme ağın kendisi değil, ağın görünen kısmıdır: okunabilmiş sayaçlardan ve en az bir okuma üretmiş abonelerden oluşur.
Bu dersin sayısı iki tanedir. Birincisi eleme kararlarının rapor edilen farkı ne kadar oynattığı, ikincisi gürültüden üretilebilen bulgu sayısı. İkisi de aynı şeye çıkar: bir sayının payı yalnız örneklemden değil, o sayıya giden yolda kaç kez seçim yapıldığından da gelir.
- UI43. Küme K03’ten devralınır ve kurgudur. Bu derste elenen sayaçların okumaları da saklanır, böylece kütle ile örneklem yan yana konabilir.
- UI44. Kütle, ağdaki bütün sayaçların okumalarıdır; örneklem, kayda girebilmiş sayaçların okumalarıdır. Aradaki eleme kümenin üretiminde vardır ve ölçülen değerden bağımsız çekilir.
- UI45. İki eleme kararı daha sınanır: sıfır yazılmış okumaların atılması ve yalnız üç dönem boyunca kalan abonelerin sayılması.
- UI46. Gürültü taraması için sonuç değişkeni tümüyle rastgele çekilir; kırılımlar gerçek kümeden alınır. Hiçbir kırılımda gerçek bir etki yoktur.
- UI47. Yirmi kırılım, on tarama, 200 karıştırma, eşik 0,05. Eşik bir karardır ve beklenen bulgu sayısı bu eşikten hesaplanır.
Küme Kendisi Bir Seçimdir
Kursun çıpası doğu ile kuzey arasındaki farktır. Bu fark, hangi satırların sayıldığına göre değişiyor.
# yaniltici.py — MODELDIR. K03'un kurgu kumesi ayni tohumla uretilir, ama bu kez # elenen sayaclarin okumalari da saklanir: kutle ile orneklem yan yana konur. import math TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF BOLGE = [("kuzey", 0.28, 21), ("guney", 0.22, 17), ("dogu", 0.18, 26), ("bati", 0.14, 14), ("merkez", 0.18, 23)] def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki def ayrik(u, w): t = 0.0 for i, x in enumerate(w): t += x if u < t: return i return len(w) - 1 ABONE, ELENEN = [], [] for i in range(HAM): r = uretec(TOHUM + i) b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])] hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05]) memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17]) (ELENEN if r() < 0.046 else ABONE).append( {"abone_no": 10001 + i, "bolge": b[0], "taban": b[2], "hane": hane, "memnuniyet": memnun}) GECERLI = {k["abone_no"] for k in ABONE} KUTLE, ORNEKLEM = [], [] for k in ABONE + ELENEN: r = uretec(TOHUM + 7000 + k["abone_no"]) for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])): t = 0.0 if r() < 0.038 else math.floor( k["taban"] * math.exp((r() + r() + r() - 1.5) * 0.62) * (1 - d * 0.05) * 100 + 0.5) / 100 satir = {"abone_no": k["abone_no"], "bolge": k["bolge"], "donem": d + 1, "tuketim_m3": t} KUTLE.append(satir) if k["abone_no"] in GECERLI: ORNEKLEM.append(satir) r() AB = {} for s in ORNEKLEM: AB.setdefault(s["abone_no"], []).append(s["tuketim_m3"]) def ozet(satirlar, ad): t, c = {}, {} for s in satirlar: t[s["bolge"]] = t.get(s["bolge"], 0.0) + s["tuketim_m3"] c[s["bolge"]] = c.get(s["bolge"], 0) + 1 d, k = t["dogu"] / c["dogu"], t["kuzey"] / c["kuzey"] print(f"{ad:<34} {len(satirlar):>6} {d:>8.3f} {k:>8.3f} {d - k:>8.3f}") return d - k print(f"{'kume':<34} {'satir':>6} {'dogu':>8} {'kuzey':>8} {'fark':>8}") farklar = [ozet(KUTLE, "kutle (agdaki butun sayaclar)"), ozet(ORNEKLEM, "orneklem (okunabilmis sayaclar)"), ozet([s for s in ORNEKLEM if s["tuketim_m3"] > 0], "sifir okumalar atilmis"), ozet([s for s in ORNEKLEM if len(AB[s["abone_no"]]) == 3], "yalniz uc donem kalan aboneler")] print(f"\ndort kararin urettigi fark acikligi: {max(farklar) - min(farklar):.3f} m3") print(f"elenen abone: {len(ELENEN)}, elenen okuma: {len(KUTLE) - len(ORNEKLEM)}") print(f"hic okuma uretmeyen abone: {len(ABONE) - len(AB)} / {len(ABONE)}") print(f"sifir okuma: {sum(1 for s in ORNEKLEM if s['tuketim_m3'] == 0)} / {len(ORNEKLEM)}") print("\nokuma sayisi abone abone ortalamasi ilk donem ortalamasi") for n in (1, 2, 3): alt = [v for v in AB.values() if len(v) == n] print(f"{n:>12} {len(alt):>7} {sum(sum(v)/len(v) for v in alt)/len(alt):>18.3f}" f" {sum(v[0] for v in alt)/len(alt):>22.3f}") hepsi = [sum(v) / len(v) for v in AB.values()] print(f"{'hepsi':>12} {len(hepsi):>7} {sum(hepsi)/len(hepsi):>18.3f}")
kume satir dogu kuzey fark
kutle (agdaki butun sayaclar) 3364 24.784 20.125 4.659
orneklem (okunabilmis sayaclar) 3199 24.674 20.210 4.463
sifir okumalar atilmis 3080 25.593 20.938 4.655
yalniz uc donem kalan aboneler 2514 24.604 20.150 4.454
dort kararin urettigi fark acikligi: 0.206 m3
elenen abone: 71, elenen okuma: 165
hic okuma uretmeyen abone: 69 / 1329
sifir okuma: 119 / 3199
okuma sayisi abone abone ortalamasi ilk donem ortalamasi
1 159 20.858 20.858
2 263 19.776 19.818
3 838 19.627 20.895
hepsi 1260 19.813
İlk tablo seçim yanlılığının iki yüzünü ayırıyor. Kütle ile örneklem arasındaki fark 4,659’dan 4,463 m³’e iniyor: 165 okuma ve 71 abone eksik. Ama bu eleme kümenin üretiminde tüketimden bağımsız çekilmiştir, dolayısıyla aradaki 0,196 m³ bir yanlılık değil, örneklemin kendi payıdır. Elemenin yanlılık üretip üretmediğini belirleyen şey elemenin büyüklüğü değil, ölçülen değerle ilişkili olup olmadığıdır.
Üçüncü satır ilişkili bir eleme gösteriyor. Sıfır yazılmış 119 okuma “geçersiz okuma” sayılıp atıldığında doğu ortalaması 24,674’ten 25,593 m³’e çıkıyor. Karar savunulabilir — sıfır bir tüketim değil, bir okunamama kaydı olabilir — ama sıfırlar rastgele dağılmadığı için sonucu bir yöne itiyor. Dört kararın açıklığı 0,206 m³ ve bu, kursun çıpa farkının yaklaşık yirmide biridir.
İkinci tablo ayakta kalan yanlılığını veriyor. Üç dönem boyunca kalan 838 abonenin ortalaması 19,627 m³, kümenin tamamının ortalaması 19,813 m³. Fark küçük ve kaynağı son sütunda: üç dönem kalan abonelerin ilk dönem ortalaması 20,895 m³ ile tek dönemliklerin 20,858 m³’üne neredeyse eşit. Yani ayakta kalanlar baştan farklı aboneler değil; farkı yaratan şey, uzun kalanların sonraki dönem okumalarının da ortalamaya girmesi.
Tablonun dışında kalan sayı en önemlisi: 1.329 abonenin 69’u hiç okuma üretmemiştir ve bu derste kurulan hiçbir abone tablosunda görünmez. Abone başına hesaplanan her özet 1.260 aboneye aittir. Ayakta kalan yanlılığının en sessiz biçimi, paydanın kendisinin görünmez olmasıdır.
Gürültü Bulgu Üretir
İkinci sayı çözümleme serbestliğinin sınırıdır. Sonuç değişkeni tümüyle rastgele çekilir, kırılımlar gerçek kümeden alınır ve her kırılım için yeniden karıştırma sınaması yapılır. Bulunacak hiçbir şey yoktur.
# Gurultuden bulgu uretme: sonuc degiskeni tumuyle rastgele cekilir, kirilimlar # gercek kumeden alinir. Hicbir kirilimda gercek bir etki yoktur. KAYIT = {k["abone_no"]: k for k in ABONE if k["abone_no"] in AB} VERI = [{"bolge": k["bolge"], "hane": k["hane"], "memnuniyet": k["memnuniyet"], "basamak": ("10 alti" if AB[n][0] < 10 else ("10-25" if AB[n][0] < 25 else "25 ustu")), "sifir": min(AB[n]) == 0.0, "tuketim": sum(AB[n]) / len(AB[n])} for n, k in KAYIT.items()] N = len(VERI) KIRILIM = [] for alan in ("bolge", "hane", "memnuniyet", "basamak"): for a in sorted({x[alan] for x in VERI}, key=str): KIRILIM.append((f"{alan}={a}", [i for i, x in enumerate(VERI) if x[alan] == a])) KIRILIM.append(("sifir okumali", [i for i, x in enumerate(VERI) if x["sifir"]])) KARISTIRMA, ESIK, TARAMA = 200, 0.05, 10 rs = uretec(TOHUM + 33000) PERM = [] for _ in range(KARISTIRMA): h = list(range(N)) for i in range(N - 1, 0, -1): j = int(rs() * (i + 1)) h[i], h[j] = h[j], h[i] PERM.append(h) def tara(deger): """Her kirilim icin: kirilim ici ile disi arasindaki farkin karistirma sinamasi.""" toplam, bulgu = sum(deger), [] for ad, idx in KIRILIM: m = len(idx) ic = sum(map(deger.__getitem__, idx)) goz = ic / m - (toplam - ic) / (N - m) asan = 0 for h in PERM: p = sum(deger[h[i]] for i in idx) if abs(p / m - (toplam - p) / (N - m)) >= abs(goz) - 1e-12: asan += 1 if asan / KARISTIRMA <= ESIK: bulgu.append((ad, asan / KARISTIRMA)) return bulgu rg = uretec(TOHUM + 22000) print(f"{N} abone, {len(KIRILIM)} kirilim, {KARISTIRMA} karistirma, esik {ESIK}") print("gurultu taramasi (sonuc degiskeni rastgele, gercek etki yok)") toplam, en_az_bir, en_cok = 0, 0, 0 for t in range(TARAMA): b = tara([rg() for _ in range(N)]) toplam += len(b) en_az_bir += 1 if b else 0 en_cok = max(en_cok, len(b)) print(f" tarama {t + 1:>2}: {len(b)} bulgu") if b: print(" " + ", ".join(f"{ad} p={p:.3f}" for ad, p in b)) sinama = TARAMA * len(KIRILIM) print(f"\ntoplam sinama {sinama}, gozlenen bulgu {toplam}, beklenen {sinama * ESIK:.1f}") print(f"en az bir bulgu cikan tarama {en_az_bir}/{TARAMA}, " f"beklenen {TARAMA * (1 - (1 - ESIK) ** len(KIRILIM)):.1f}") print(f"tek taramada cikan en cok bulgu: {en_cok}") print(f"ayni tarama gercek tuketim uzerinde: {len(tara([x['tuketim'] for x in VERI]))} bulgu")
1260 abone, 20 kirilim, 200 karistirma, esik 0.05
gurultu taramasi (sonuc degiskeni rastgele, gercek etki yok)
tarama 1: 1 bulgu
bolge=dogu p=0.050
tarama 2: 0 bulgu
tarama 3: 1 bulgu
sifir okumali p=0.040
tarama 4: 1 bulgu
bolge=kuzey p=0.050
tarama 5: 5 bulgu
bolge=kuzey p=0.030, hane=1 p=0.010, hane=6 p=0.010, basamak=10-25 p=0.000, basamak=25 ustu p=0.010
tarama 6: 0 bulgu
tarama 7: 1 bulgu
basamak=25 ustu p=0.015
tarama 8: 0 bulgu
tarama 9: 1 bulgu
memnuniyet=4 p=0.000
tarama 10: 1 bulgu
bolge=dogu p=0.035
toplam sinama 200, gozlenen bulgu 11, beklenen 10.0
en az bir bulgu cikan tarama 7/10, beklenen 6.4
tek taramada cikan en cok bulgu: 5
ayni tarama gercek tuketim uzerinde: 8 bulgu
İki yüz sınama 11 bulgu verdi; eşik 0,05 olduğu için beklenen sayı 10,0. Gözlenen ile beklenen neredeyse aynı, çünkü bulgu sayısı kümeden değil eşikten ve sınama sayısından geliyor. En az bir bulgu çıkan tarama sayısı 7, beklenen 6,4. Yirmi kırılımlık bir taramanın hiçbir şey bulmama olasılığı, hiçbir etki yokken bile üçte birden küçüktür.
Beşinci tarama tek başına okunmaya değer: aynı rastgele sütun beş ayrı kırılımda eşiği aşıyor ve birinin p değeri 0,000. Bu beş satır bir rapora “bölge, hane büyüklüğü ve tarife basamağı kırılımlarında anlamlı fark bulundu” diye girebilir. Beşinin de arkasında hiçbir şey yoktur.
Son satır ayrımı imkânsız kılan şeyi veriyor. Aynı tarama gerçek tüketim üzerinde 8 bulgu buluyor, gürültü üzerinde tarama başına ortalama 1,1. Toplu bakıldığında gerçek yapı ayırt edilebilir; ama tek bir bulguya bakan kişi onun hangi kümeden geldiğini göremez. Ayrımı yapan tek şey, kaç kırılımın denendiğinin yazılmış olmasıdır. Denenmiş kırılım sayısı yazılmayan bir bulgu, gürültü taramasının bir satırından ayırt edilemez.
Bu, keşif konusunun bıraktığı borcu ödemenin de yeridir. Keşifsel analiz beş kırılım alanında 232 hücre gezmiş, bunların 33’ünün 30 satırdan az olduğunu saymıştı; sınanacak soru o 232 hücrenin arasından seçildi. Yukarıdaki tarama 20 kırılımda 200 sınamayla 11 bulgu üretiyorsa, 232 hücrelik bir keşif taramasının aynı eşikte üreteceği beklenen bulgu sayısı 11,6’dır — ve keşif aşamasında bu bulguların hiçbiri bir sınama olarak sayılmadı. Borç şudur: keşifte gezilen hücre sayısı rapora yazılmadığında, sonradan yapılan tek bir sınama kendi payını olduğundan dar gösterir. Ödemesi bir hesap değil bir cümledir: kaç kırılım gezildiği yazılır.
Seçim yanlılığı ile p değeri avcılığı burada birleşiyor. Birincisi kümeye hangi satırların girdiğini seçmektir, ikincisi kümeden hangi sorunun sorulduğunu. İkisi de sonucu görüldükten sonra yapılabilir ve ikisi de yazılmadıkça görünmez.
Özet
- Aynı çıpa farkı dört kararla dört değer alır: kütlede 4,659, örneklemde 4,463, sıfır okumalar atılınca 4,655 ve yalnız üç dönem kalan abonelerde 4,454 m³; açıklık 0,206 m³’tür.
- Eleme büyüklüğü değil, elemenin ölçülen değerle ilişkisi yanlılık üretir: tüketimden bağımsız çekilen 71 abonelik eleme farkı 0,196 m³ oynatır, sıfır okumaların atılması doğu ortalamasını 24,674’ten 25,593 m³’e taşır.
- Ayakta kalan yanlılığı iki yerdedir: üç dönem kalan 838 abonenin ortalaması 19,627 m³ ile kümenin 19,813 m³’üne göre düşüktür, ve 1.329 abonenin 69’u hiçbir abone tablosunda görünmez.
- Gürültü üzerinde 20 kırılımlık 10 tarama 200 sınama yapar ve 11 bulgu verir; eşik 0,05 olduğundan beklenen 10,0’dır ve on taramanın 7’sinde en az bir bulgu çıkar.
- Tek bir tarama beş bulgu üretebilir ve bulguların hiçbirinin arkasında bir etki yoktur; denenmiş kırılım sayısı yazılmayan bir bulgu gürültü taramasının satırından ayırt edilemez.
Kurs Kapanışı
On üç dersin hesabı tek tabloda duruyor ve her sayı kendi dersinden okundu.
| Ders | Gözlenen sayı | Oynama payı | Karar değişir mi |
|---|---|---|---|
| Keşif 01 keşifsel analizin amacı | doğu - kuzey 4,463 m³ | 2.000 koşumda aşılmadı | hayır |
| Keşif 02 tek değişkenli inceleme | doğu ortalaması 24,674 m³ | çit dışı eleme 25,154 m³ | evet, fark 4,622 |
| Keşif 03 iki değişkenli inceleme | katsayı +0,600 | tek nokta çıkınca -0,057 | evet, ilişki kalmaz |
| Keşif 04 çok değişkenli inceleme | 15 çiftin 5’i eşiği aşar | eşik 0,0354, 2.000 koşum | evet, bağımsız bulgu 1 |
| Keşif 05 veri görsel denetimi | küme ortalaması 19,693 m³ | sıfırlar sayılmazsa 20,454 | evet, yüzde 3,9 açıklık |
| Uygulama 01 betimsel özet seçimi | ortalama 24,674 m³ | pay genişliği 1,552 m³ | hayır, 142 okumada evet |
| Uygulama 02 dağılım karşılaştırması | ortanca 19,66 m³ | çentik 0,920 ↔ 3,146 m³ | evet, iki tepe gizlenir |
| Uygulama 03 güven aralığı yorumu | doğu ortalaması 24,674 m³ | 23,894–25,431 m³ | evet, kesişme yanıltır |
| Uygulama 04 hipotez sınaması | fark 0,957 m³ | p 0,01249 ↔ 0,00300 | hayır, dörtte birde evet |
| Uygulama 05 A/B testi analizi | fark 0,123 m³ | [-0,698, 0,952] m³ | evet, 108 bileşimin 4’ü |
| Uygulama 06 regresyon | katsayı -0,605 m³/yıl | [-0,714, -0,503] | evet, katsayı 1,825 |
| Uygulama 07 kohort ve huni | elde tutma 0,619 | kural değişince 0,867 | evet, yön ters döner |
| Uygulama 08 yanıltıcı analizler | 11 bulgu / 200 sınama | beklenen 10,0 bulgu | evet, hiçbiri gerçek değil |
Üçüncü sütun kursun kuralıdır: yanında oynama payı yazılmayan bir fark, bulgu değil bir gözlemdir; payı yazılmayan sayı ölçülmemiş sayılır. Dördüncü sütun payın ne işe yaradığını söylüyor. On üç dersin onunda karar değişiyor — sayı aynı kaldığı halde, savunulabilir ikinci bir kararla rapora giren cümle başkalaşıyor. Üçünde değişmiyor ve bu üç satır kursun asıl çıktısıdır: payı yazılmış bir sayı, kararın değişmediğini de gösterebilir. Pay bir uyarı işareti değil, kararın dayanağıdır.
On üç derste her sayının yanına payı yazıldı. Ama bütün bu sayılar analistin ekranında, çıktı bloğu olarak kaldı. Kararı verecek kişi ne payı gördü ne de sayıyı; bulgunun görülebilir ve aktarılabilir hale gelmesi hiç ele alınmadı. Payın kendisinin bir gösterimde nasıl duracağı da sorulmadı: bir aralık nasıl çizilir, iki aralığın kesişmesi bir okuyucuya nasıl gösterilir, kaç kırılımın denendiği bir raporun neresinde yazar. Sonraki kurs, Görselleştirme, Raporlama ve Ölçekli Analiz, bu soruları ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.