İçeriğe geç
academia.sh

Ders 02 / 13

Tek Değişkenli İnceleme

Doğu bölgesinin 557 okuması ile aynı ortalamayı (24,674 m³) ve aynı standart sapmayı (9,198) veren simetrik bir model dağılım yan yana konur ve rapor edilen iki sayının biçimi hiç anlatmadığı gösterilir: beş sayı özeti 0,00 / 19,23 / 24,12 / 29,85 / 51,90 ile 0,66 / 18,37 / 24,61 / 31,43 / 47,79 olarak ayrışır, çeyrekler açıklığı 10,62'ye karşı 13,06 çıkar, ortalama ile ortanca arasındaki açıklık 0,554'e karşı 0,064 kalır. Aralık sayımları beş sayının göremediğini verir: gözlemde ilk aralıkta 20, ikincisinde 1 değer vardır ve aralık genişliği 10 seçilirse bu kopukluk tek bir 21 sayısına gömülür. Çit dışındaki 30 değer elenmez, etkisi ölçülür: eleme doğu ortalamasını 25,154'e, doğu ile kuzey arasındaki farkı 4,463'ten 4,622 m³'e taşır.

İçindekiler

Önceki ders iki bölge ortalamasının farkına baktı ve yanına payını yazdı: 4,463 m³’lük fark 2.000 karıştırmanın hiçbirinde ortaya çıkmadı. Ortalamanın kendisi ise hiç sorgulanmadı. Doğu bölgesi için yazılan 24,674 m³, 557 okumanın tek bir sayıya sıkıştırılmış halidir ve o 557 sayının nasıl dizildiği hakkında hiçbir şey söylemez.

Bu ders bir sütunun tek başına nasıl incelendiğini ele alır ve ölçüsü şudur: özetin gizlediği biçim. Aynı ortalamayı ve aynı standart sapmayı veren iki dağılım kurulur, ikisi de aynı iki sayıyla raporlanır ve aralarındaki farkın rapora hiç girmediği gösterilir.

  • EA6. Tek değişkenli inceleme (univariate) bir sütuna üç soru sorar: merkez nerede, değerler ne kadar dağınık ve dağılımın biçimi ne. Üçü birlikte yazılmadıkça sütun tarif edilmiş olmaz.
  • EA7. Beş sayı özeti en küçük değer, birinci çeyrek, ortanca, üçüncü çeyrek ve en büyük değerdir. Çeyrekler açıklığı Ç3 ile Ç1 arasındaki uzaklıktır ve Veri Toplama ve Hazırlama kursunda tanımlanmıştır.
  • EA8. Çarpıklık (skewness) bu kursta ortalama ile ortanca arasındaki açıklıkla ölçülür. Açıklık pozitifse uzun kuyruk sağdadır; ortalama kuyruğu izler, ortanca izlemez.
  • EA9. Aralık sayımları dağılımın biçimini sayı olarak verir: her aralığın sınırları ve içine düşen değer sayısı basılır. Aralık genişliği bir karardır ve biçimi değiştirir.
  • EA10. Aykırı değer bu kursta elenmez. Eleme Veri Toplama ve Hazırlama kursunun temizleme kararıydı ve ölçüsü satır sayısıydı; burada aynı değerler kümede kalır, yalnız özetin üzerindeki etkileri sayılır.

Merkez, Değişkenlik ve Biçim

# dagilim.py — MODELDIR: K03 ve K04'un kurgu olcum agi ayni tohumla uretilir.
# Kume kurgudur; hicbir gercek abone, sayac ya da bolge temsil edilmez.
import math

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
DONEM = ["2026-01", "2026-02", "2026-03"]
TARIFE = [10, 25, 40]
BOLGE = [("kuzey", 0.28, 21), ("guney", 0.22, 17), ("dogu", 0.18, 26),
         ("bati", 0.14, 14), ("merkez", 0.18, 23)]


def uretec(t: int):
    """Dogrusal eslemeli uretec: tohum koda yazilidir, cikti kosumdan kosuma ayni."""
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki() -> float:
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u: float, w: list[float]) -> int:
    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])]
    k = {"abone_no": 10001 + i, "bolge": b[0], "taban": b[2],
         "hane_kisi": ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05]),
         "memnuniyet": ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17]) + 1}
    (_elenen if r() < 0.046 else _abone).append(k)
_gecerli = {a["abone_no"] for a in _abone}

OKUMA = []
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
        if k["abone_no"] not in _gecerli:
            r()
            continue
        OKUMA.append({"abone_no": k["abone_no"], "bolge": k["bolge"],
                      "donem": DONEM[d], "tuketim_m3": t, "hane_kisi": k["hane_kisi"],
                      "memnuniyet": k["memnuniyet"],
                      "basamak": 1 if t < TARIFE[0] else 2 if t < TARIFE[1]
                      else 3 if t < TARIFE[2] else 4})
        r()


def ort(v: list[float]) -> float:
    return sum(v) / len(v)


def ss(v: list[float]) -> float:
    """Standart sapma; payda n-1, cunku elde bulunan bir orneklemdir."""
    m = ort(v)
    return math.sqrt(sum((x - m) ** 2 for x in v) / (len(v) - 1))


def ortanca(v: list[float]) -> float:
    s = sorted(v)
    n = len(s)
    return s[n // 2] if n % 2 else (s[n // 2 - 1] + s[n // 2]) / 2


def ceyrek(v: list[float], p: float) -> float:
    """Dogrusal aradegerlemeli ceyrek; K03'teki tanimla aynidir."""
    s = sorted(v)
    i = p * (len(s) - 1)
    a = int(i)
    return s[a] if a + 1 >= len(s) else s[a] + (s[a + 1] - s[a]) * (i - a)


def bolgenin(ad: str) -> list[float]:
    return [o["tuketim_m3"] for o in OKUMA if o["bolge"] == ad]


dogu, kuzey = bolgenin("dogu"), bolgenin("kuzey")
print(f"kurgu kume (tohum {TOHUM}): {len(OKUMA)} satir, {len(_gecerli)} abone")
print(f"dogu: {len(dogu)} satir, ortalama {ort(dogu):.3f} m3, "
      f"ortanca {ortanca(dogu):.2f} m3, standart sapma {ss(dogu):.3f}")
print(f"ortalama - ortanca = {ort(dogu) - ortanca(dogu):.3f} m3, "
      f"standart sapmanin {100 * (ort(dogu) - ortanca(dogu)) / ss(dogu):.1f} yuzdesi")
kurgu kume (tohum 20260218): 3199 satir, 1329 abone
dogu: 557 satir, ortalama 24.674 m3, ortanca 24.12 m3, standart sapma 9.198
ortalama - ortanca = 0.554 m3, standart sapmanin 6.0 yuzdesi

Bir sütun tek sayıyla tarif edilemez. Merkezî eğilim iki ayrı sayı verir: ortalama 24,674 m³, ortanca 24,12 m³. Değişkenlik üçüncü sayıdır: standart sapma 9,198’dir, yani okumalar merkezin çevresinde ortalama olarak dokuz metre küpten fazla dolaşır. Bu üç sayı henüz biçimi söylemez, ama biçim hakkındaki ilk işareti verir.

İşaret, ortalama ile ortancanın ayrışmasıdır. Ortanca sıralamaya bakar ve bir değerin ne kadar uzakta olduğunu umursamaz; ortalama her değerin uzaklığını taşır. İkisi arasındaki 0,554 m³’lük açıklık, uzun kuyruğun sağda olduğunu söyler: birkaç büyük okuma ortalamayı yukarı çekmiş, ortancayı yerinde bırakmıştır. Açıklık standart sapmanın yüzde 6,0’sı kadardır ve bu, çarpıklığın ölçüsü olarak doğrudan raporlanabilir.

Aynı Ortalama, Başka Dağılım

# esdeger.py — ayni ortalamayi ve ayni standart sapmayi veren ikinci bir dagilim.
# Kurgudur: uc duzgun cekilisin toplami simetriktir, sonra dogunun ortalamasina
# ve standart sapmasina oturtulur. Amac karsilastirmadir, benzetim degil.
def simetrik(n: int, hedef_ort: float, hedef_ss: float, tohum: int) -> list[float]:
    r = uretec(tohum)
    ham = [r() + r() + r() - 1.5 for _ in range(n)]
    m, s = ort(ham), ss(ham)
    v = [round(hedef_ort + (x - m) * hedef_ss / s, 2) for x in ham]
    kayma = hedef_ort - ort(v)  # yuvarlama ortalamayi bir miktar kaydirir
    return [round(x + kayma, 2) for x in v]


MODEL = simetrik(len(dogu), ort(dogu), ss(dogu), TOHUM + 601)


def bes_sayi(v: list[float]) -> list[float]:
    return [min(v), ceyrek(v, 0.25), ortanca(v), ceyrek(v, 0.75), max(v)]


BAS = ["en kucuk", "C1", "ortanca", "C3", "en buyuk", "CAA", "ortalama", "carpiklik"]
G = [17] + [10] * 8
y = lambda h: "".join(str(v).ljust(G[i]) if not i else str(v).rjust(G[i])
                      for i, v in enumerate(h))
print(y(["dagilim"] + BAS))
for ad, v in [("dogu (gozlem)", dogu), ("model (simetrik)", MODEL)]:
    b = bes_sayi(v)
    print(y([ad] + [f"{x:.2f}" for x in b] + [f"{b[3] - b[1]:.2f}",
             f"{ort(v):.3f}", f"{ort(v) - ortanca(v):.3f}"]))
print(f"\niki dagilimin ortalamasi da {ort(dogu):.3f}, standart sapmasi da {ss(dogu):.3f}")
print(f"ortalama - ortanca acikligi: gozlem {ort(dogu) - ortanca(dogu):.3f}, "
      f"model {ort(MODEL) - ortanca(MODEL):.3f}")
dagilim            en kucuk        C1   ortanca        C3  en buyuk       CAA  ortalama carpiklik
dogu (gozlem)          0.00     19.23     24.12     29.85     51.90     10.62    24.674     0.554
model (simetrik)       0.66     18.37     24.61     31.43     47.79     13.06    24.674     0.064

iki dagilimin ortalamasi da 24.674, standart sapmasi da 9.198
ortalama - ortanca acikligi: gozlem 0.554, model 0.064

İki satır aynı iki sayıyla raporlanır. Ortalama üçüncü basamağa kadar aynıdır, standart sapma da öyle. “Doğu bölgesinde ortalama tüketim 24,674 m³, standart sapma 9,198” cümlesi her ikisi için de doğrudur ve ikisini birbirinden ayırmaz.

Beş sayı özeti ayırıyor. Gözlemin en küçük değeri 0,00, modelinki 0,66’dır. Gözlemin üçüncü çeyreği 29,85, modelinki 31,43’tür. Asıl fark çeyrekler açıklığında: gözlemde 10,62, modelde 13,06. Aynı standart sapmayı veren iki dağılımdan birinin orta yarısı belirgin biçimde daha dar. Bunun anlamı şudur: gözlemin standart sapmasını büyüten şey ortadaki dağınıklık değil, uçlardaki birkaç değerdir.

Son sütun ölçüyü tek sayıya indiriyor. Çarpıklık gözlemde 0,554, modelde 0,064 — sekiz kattan fazla. Simetrik bir dağılımda ortalama ile ortancanın örtüşmesi beklenir ve model bunu yapıyor; kalan 0,064 çekilişten gelen artıktır. Gözlemde açıklık artık değildir, dağılımın kendi biçimidir.

Biçim Sayı Olarak

# aralik.py — dagilimin bicimi sayi olarak basilir: her aralikta kac deger var.
# Grafik cizilmez; aralik genisligi bir karardir ve bicimi degistirir.
def sayim(v: list[float], genislik: int, ust: int = 55) -> list[int]:
    k = [0] * (ust // genislik)
    for x in v:
        k[min(int(x // genislik), len(k) - 1)] += 1
    return k


GEN = 5
a5, m5 = sayim(dogu, GEN), sayim(MODEL, GEN)
print(f"{'aralik':>12}{'dogu':>8}{'model':>8}   dogu cubugu")
for i, (x, y2) in enumerate(zip(a5, m5)):
    print(f"[{i * GEN:2d},{(i + 1) * GEN:2d})".rjust(12) + f"{x:8d}{y2:8d}   "
          + "#" * round(x / 4))
a10 = sayim(dogu, 2 * GEN)
print(f"\ngenislik {GEN}: ilk iki aralik {a5[0]} ve {a5[1]}; "
      f"genislik {2 * GEN}: ilk aralik {a10[0]}")
print(f"sifir yazilmis okuma {sum(1 for x in dogu if x == 0)}, "
      f"[{GEN},{2 * GEN}) araligindaki gercek okuma {a5[1]}")
      aralik    dogu   model   dogu cubugu
     [ 0, 5)      20       7   #####
     [ 5,10)       1      32
     [10,15)      35      51   #########
     [15,20)     111      83   ############################
     [20,25)     135     112   ##################################
     [25,30)     119      98   ##############################
     [30,35)      71      92   ##################
     [35,40)      35      57   #########
     [40,45)      16      23   ####
     [45,50)      11       2   ###
     [50,55)       3       0   #

genislik 5: ilk iki aralik 20 ve 1; genislik 10: ilk aralik 21
sifir yazilmis okuma 20, [5,10) araligindaki gercek okuma 1

Aralık sayımları beş sayının göremediğini gösteriyor. İlk aralıkta 20 değer, ikincisinde 1 değer var. Bu bir kuyruk değil, bir kopukluktur: sıfıra yığılmış 20 kayıt ile gerçek okuma bölgesi arasında neredeyse boş bir aralık duruyor. Sayım bunu söylüyor, çünkü sıfıra yığılan 20 kayıt sayaç okunamadığı için sıfır yazılmış satırlardır; ölçülmüş bir tüketim değil, bir kayıt biçimidir. Modelde böyle bir kopukluk yoktur: 7 ve 32 ardışık ve düzgün gider.

Aralık genişliği bir karardır ve bu kararı değiştirmek biçimi değiştirir. Genişlik 10 seçildiğinde ilk aralık 21 değer taşır; 20 ile 1 tek bir sayının içinde erir ve kopukluk tabloda kaybolur. Aynı veri, aynı yordam, iki farklı biçim. Bu yüzden aralık genişliği raporun içinde yazılır, dipnotta değil.

Aykırı Değer Elenmez, Ölçülür

# aykiri.py — cit disindaki degerler burada ELENMEZ. Veri Toplama ve Hazirlama
# kursunda eleme bir temizleme karariydi; burada degerler kalir, etkisi olculur.
def cit(v: list[float]) -> tuple[float, float]:
    q1, q3 = ceyrek(v, 0.25), ceyrek(v, 0.75)
    caa = q3 - q1
    return q1 - 1.5 * caa, q3 + 1.5 * caa


C = [9, 6, 9, 9, 10, 10, 10, 10, 8]
k = lambda h: "".join(str(v).ljust(C[i]) if not i else str(v).rjust(C[i])
                      for i, v in enumerate(h))
print(k(["kume", "n", "alt cit", "ust cit", "alt asan", "ust asan", "ortalama",
         "cit ici", "fark"]))
kalan = {}
for ad, v in [("dogu", dogu), ("kuzey", kuzey), ("model", MODEL)]:
    alt, ust = cit(v)
    kalan[ad] = [x for x in v if alt <= x <= ust]
    print(k([ad, len(v), f"{alt:.2f}", f"{ust:.2f}",
             sum(1 for x in v if x < alt), sum(1 for x in v if x > ust),
             f"{ort(v):.3f}", f"{ort(kalan[ad]):.3f}",
             f"{ort(kalan[ad]) - ort(v):+.3f}"]))
print(f"\ndogu / kuzey farki: butun satirlarla {ort(dogu) - ort(kuzey):.3f} m3, "
      f"cit disi elenseydi {ort(kalan['dogu']) - ort(kalan['kuzey']):.3f} m3")
print(f"dogu standart sapmasi {ss(dogu):.3f} -> {ss(kalan['dogu']):.3f}, "
      f"ortancasi {ortanca(dogu):.2f} -> {ortanca(kalan['dogu']):.2f}")
kume          n  alt cit  ust cit  alt asan  ust asan  ortalama   cit ici    fark
dogu        557     3.30    45.78        20        10    24.674    25.154  +0.480
kuzey       921     2.41    37.96        32        18    20.210    20.532  +0.321
model       557    -1.22    51.02         0         0    24.674    24.674  +0.000

dogu / kuzey farki: butun satirlarla 4.463 m3, cit disi elenseydi 4.622 m3
dogu standart sapmasi 9.198 -> 7.416, ortancasi 24.12 -> 24.22

Çit dışındaki değerler burada silinmiyor; tablo yalnız silinseydi ne olacağını sayıyor. Doğuda çit dışında 30 satır vardır ve bunların 20’si alt çitin dışındadır. Eleme ortalamayı düşürmez, 24,674’ten 25,154’e çıkarır, çünkü elenen satırların çoğu sıfır yazılmış okumalardır. Aykırı değeri “büyük değer” saymanın yanıltıcı olduğu yer burasıdır.

Aynı karar kuzeyde ortalamayı 0,321 m³ oynatır ve iki oynama aynı yöne gitmediği için bölge farkı da değişir: 4,463 m³ yerine 4,622 m³. Önceki dersin ölçtüğü fark, hiçbir yeni veri gelmeden, tek bir çit kararıyla 0,159 m³ kaymıştır. Bu, örneklemden gelen paydan ayrı ve ona eklenen bir oynamadır.

Model satırı ölçünün ne olduğunu netleştiriyor. Simetrik dağılımda çit dışında hiçbir değer yoktur ve eleme ortalamayı tam olarak yerinde bırakır. Çit dışı sayısı verinin “hatalı” olmasının değil, dağılımın biçiminin bir sonucudur; 30 sayısı doğunun kuyruklarını ölçer, kalitesini değil.

Son satır ortancanın niçin dirençli sayıldığını gösteriyor. Otuz satır çıkarıldığında standart sapma 9,198’den 7,416’ya iner, yani yüzde 19,4 düşer; ortanca 24,12’den 24,22’ye, yani 0,10 oynar. Değişkenlik ölçüsü uçlara bağlıdır, sıralama ölçüsü değildir.

Özet

  • Bir sütun üç ölçüyle tarif edilir: doğu için ortalama 24,674 m³, ortanca 24,12 m³ ve standart sapma 9,198; aradaki 0,554 m³’lük açıklık biçim hakkındaki ilk işarettir.
  • Aynı ortalamayı ve aynı standart sapmayı veren simetrik model dağılım, beş sayı özetinde ayrışır: çeyrekler açıklığı 10,62’ye karşı 13,06, çarpıklık 0,554’e karşı 0,064.
  • Aralık sayımları beş sayının göremediğini verir: gözlemde ilk aralıkta 20, ikincisinde 1 değer bulunur ve bu kopukluk sıfır yazılmış okumalardan gelir.
  • Aralık genişliği bir karardır: genişlik 10 seçildiğinde ilk aralık 21 olur ve kopukluk tabloda görünmez.
  • Çit dışındaki 30 satır elenmez; eleme doğu ortalamasını 25,154’e, doğu ile kuzey arasındaki farkı 4,463’ten 4,622 m³’e taşırdı ve standart sapmayı yüzde 19,4 düşürürdü.

Sonraki Adım

Bu ders tek bir sütuna baktı ve o sütunun biçimini sayıyla yazdı. Kümedeki soruların çoğu ise tek sütunla cevaplanmaz: tüketim ile hane büyüklüğü birlikte mi artıyor, tarife basamağı ile bölge arasında bir bağ var mı, memnuniyet düzeyi tüketimle nasıl ilişkileniyor. İki sütunun birlikte incelenmesi yeni bir özet getirir — korelasyon katsayısı — ve o katsayı da tıpkı ortalama gibi tek bir sayıya sıkıştırır. Sonraki ders iki değişkenli incelemeyi ele alır: aynı katsayıyı veren iki farklı ilişki kurulur, çapraz tablo katsayının göremediğini gösterir ve sıralayıcı ölçekte niçin sıra korelasyonunun doğru ölçüt olduğu yazılır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat