AST416 Astronomide Sayısal Çözümleme - II

Ders - 01a Temel İstatistiki Kavramlar ve Dağılımlar

Doç. Dr. Özgür Baştürk
Ankara Üniversitesi, Astronomi ve Uzay Bilimleri Bölümü
obasturk at ankara.edu.tr
http://ozgur.astrotux.org

Dağılımlar

Olasılık teorisi terminolojisi yerleşmiş olmakla birlikte aynı şeyi ifade eden pek çok kavram bir arada, birbirlerinin yerine ve hatta bazen yanlış şekilde kullanılabilmektedir. Temelde dağılım (ing. distribution) bir veri setinin (bir örnek ya da onun seçildiği popülasyon) aldığı ya da alabileceği tüm olası değerleri ve bu değerlerin ne sıklıkta ya da hangi olasılıkla gerçekleştiğini gösteren fonskiyon, grafik, tablo ya da listedir. Aşağıda istatistiksel bir dağılımı ifade etmek üzere literatürde sıkça kullanılan kavramlara örnekler verilmiştir.

Sıklık Dağılımı

Sıklık ya da frekans dağılımları (frequency distribution) Bir örnek grubunda (örneğin bir dizi ölçümde) her bir sonucun (ölçümün) kaç kez gerçekleştiğini ya da tekrarlandığını gösterir. Genellikle bir tablo ya da histogramla ifade edilir. Aşağıda bir grup öğrencinin bir derste aldığı notların yer aldığı virgülle ayrılmış salt metin formatında (csv) bir dosya üzerinden hazırlanmış bir histogram örneği yer almaktadır. pandas gibi veri analizini kolaylaştıran paketlerin histogram gibi çok kullanılan grafikleri çizdirmek için fonksiyonları bulunmaktadır. Öncelikle veriyi pandas fonksiyonları ile açıp, inceleyelim ve histogramını dataframe.hist metodunu kullanarak çizdirelim.

In [1]:
import pandas as pd
# Veriyi bir csv dosyasindan bir vericercevesine alalim
notlar = pd.read_csv("ders_notlar_sonuc.csv", index_col="ad")
# Biraz inceleyelim.
notlar.head()
Out[1]:
odev1 odev2 arasinav final durum genel_ortalama
ad
ogrenci1 100 0 0.0 0.0 W 10.0
ogrenci2 80 92 64.0 78.0 C+ 75.4
ogrenci3 95 100 71.0 88.0 B+ 84.8
ogrenci4 100 100 54.0 40.0 D 56.2
ogrenci5 97 0 0.0 0.0 W 9.7
In [2]:
# genel istatistiklere bakalim.
notlar.describe()
Out[2]:
odev1 odev2 arasinav final genel_ortalama
count 37.000000 37.000000 37.000000 37.000000 37.000000
mean 91.567568 77.189189 66.351351 64.162162 68.862162
std 17.234559 41.321126 24.261556 32.707044 25.339926
min 0.000000 0.000000 0.000000 0.000000 9.000000
25% 90.000000 92.000000 55.000000 59.000000 59.500000
50% 95.000000 100.000000 72.000000 76.000000 77.400000
75% 100.000000 100.000000 85.000000 86.000000 84.800000
max 100.000000 100.000000 94.000000 100.000000 97.600000

Öncelikle sayısal veri içeren (nümerik) sütunlara ilişkin istatistiklerin verildiğini görüyoruz. Ancak öğrencilerin durumuna ilişkin sütunlarla ilgili de istatistiksel bilgi alabiiriz.

In [3]:
notlar['durum'].describe()
Out[3]:
count     37
unique    13
top        A
freq       7
Name: durum, dtype: object

Görüldüğü üzere toplam 37 kayıtta durum bilgisi bulunurken, 13 adet benzersiz durum verisi bulunmaktadır. En çok durum verisi A harfi için oluşmuş olup, bunun sıklığı 8'dir. Sıklık dağılımına ilişkin asıl veri value_counts metoduyla alınabilir.

In [4]:
notlar['durum'].value_counts()
Out[4]:
A     7
W     6
C     5
B     4
B-    3
B+    3
D     2
C+    2
A+    1
A-    1
C-    1
F     1
D+    1
Name: durum, dtype: int64

Bu veriyi bir histogram şeklinde çizdirmek için plot metodunun bar opsiyonunu kullanabiliriz. Bu veri kategorik bir veri olduğu (nümerik değer taşımadığı) için pandas veriçerçeveleri üzerinde tanımlı hist metodunu kullanamıyoruz.

In [5]:
%matplotlib inline
notlar.sort_values('durum')['durum'].value_counts().plot(kind='bar')
Out[5]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f8f21045ef0>

Sayısal verilerin histogramını çizdirmek için ise hist metodu kullanılabilir. bins seçeneği, histogramda istenen grup (dikdörtgen) sayısını vermek için kullanılır.

In [6]:
# Genel ortalamanin basit bir histogrami
# pandas'da bu grafikler icin matplotlib'i kullanmaktadir.
%matplotlib inline
from matplotlib import pyplot as plt
notlar.hist(column = 'genel_ortalama', bins=10)
plt.xlabel("Not")
plt.ylabel("Frekans (Sıklık)")
plt.show()

matplotlib fonksiyonlarıyla biraz daha fazla kontrole sahip olabiliriz. Grafiklerinize renk katmak için isimlendirilmiş renkleri kullanabilirsiniz.

In [7]:
import numpy as np
from matplotlib import pyplot as plt
renkler = ['indigo','darkviolet','mediumorchid',\
          'midnightblue','mediumblue','blue',\
          'darkgreen','seagreen','springgreen',\
          'orangered','tomato','red','darkred']
kategoriler = notlar['durum'].unique()
durum = notlar.sort_values('durum')['durum']
kutu_sayisi = len(kategoriler)
n, kutular, ozellikler = plt.hist(durum, bins=kutu_sayisi)
# apply the same color for each class to match the map
for ozellikler,color in zip(ozellikler, renkler):
    ozellikler.set_facecolor(color)

Sıklık dağılımları elde etmek ve görselleştirmek üzere bu seçeneklerin dışında da olanaklar mevcuttur. seaborn paketi özellikle kategorik verinin görselleştirmesi için pek çok seçenek sunar.

Olasılık Dağılımları

Olasılık dağılımı (probability distribution), bir örnek grubunda her bir sonucun (ölçüm ya da deney sonuçları gibi) gerçekleşme olasılıklarının ifadesidir. Olasılık dağılımları değişkenin sürekli (ing. continuous) ya da süreksiz olmasına bağlı olarak iki farklı şekilde ifade edilirler.

Olasıık Kütle Fonksiyonu

Olasılık Kütle Fonksiyonu (Probability Mass Function, PMF), sadece bazı değerleri alabilen (ing. discrete) bir değişken, deney sonucu, gözlem ya da ölçümün her bir olası değerini alma olasılığını veren fonksiyondur. Normalize olasılık dağılım fonksiyonlarında her bir ölçüme ilişkin olasılık değerlerinin toplamı 1 değerine normalize edilir. Normalize olasılık kütle fonksiyonlarında tüm olası değerlerin olasılıklarının toplamı 1’i verir.

In [8]:
zar_atis_sayisi = 10000
zar = np.zeros(zar_atis_sayisi)
for i in range(zar_atis_sayisi):
    # Her bir zar atisinda tum olasiliklardan birini
    # rastgele secelim
    zar[i] = np.random.choice(['1', '2', '3', '4', '5', '6'])

# Her bir secenekten kac tane var
deger, n = np.unique(zar, return_counts=True)
# Olasiliga donusturelim
olasilik = n / len(zar)

# 10000 atis sonunda olasilik kutle fonksiyonunu 
# cizdirelim
plt.bar(deger, olasilik)
plt.ylabel("Olasilik")
plt.xlabel("Zar Degerleri")
plt.show()

Olasılık Yoğunluğu Fonksiyonu

Olasılık Yoğunluğu Fonksiyonu (Probability Density Function, PDF) sürekli (ing. continuous) bir değişkenin (doğası sürekli, yani bir aralıktaki tüm değerleri alabilen, deney sonucu ya da ölçüm) herhangi bir aralıkta değer alma olasılığını veren fonksiyondur. Normalize olasılık dağılım fonksiyonlarında her bir ölçüme ilişkin olasılık değerlerinin toplamı 1 değerine normalize edilir. PDF grafik olarak ifade edildiğinde eğrinin altında kalan toplam alan normalize olasılık fonskiyonu için 1’dir. Herhangi bir değer aralığı için toplam olasılık eğrinin o aralık için altında kalana eşit olur.

Eğer x değişkeni sürekli bir aralıktan değer alabiliyorsa x’in herhangi bir değerinin olasılığı verilemez. Örneğin hilesiz bir zar atışında 1 ile 6 arasındaki her bir sayının gelme olasılığı 1 / 6 iken, bir ölçümde 0 ile 1 arasındaki herhangi bir reel sayıyı alabilen x’in e, 0.45 ya da 0.1 olma olasılığı belirlenemez. Ancak x’in hangi aralık dahilinde bir değer alabileceğinin olasılığı belirlenebilir ve tüm olası değerler için bu olasılıklar Olasılık Yoğunluğu Fonksiyonu (PDF) ile ifade edilebilir.

Bilgisayarların doğası gereği sürekli bir fonksiyon tanımlayamayız. Ancak fonksiyonun tanımlı olduğu nokta sayısını arttırarak olasılık kütle fonksiyonuna bir yaklaşımda bulunabiliriz. Örneğin -2 ile 2 arasında herhangi bir değeri alabilme olasılığı eşit olan (tekdüze, ing. uniform) bir rastgele değişkenin (ing. random variable) olasılık yoğunluğu fonksiyonunu (PDF) elde etmeye çalışalım.

In [9]:
x = np.random.uniform(-2, 2, 10000)
import seaborn as sns
sns.distplot(x)
plt.xlabel("x")
plt.ylabel("PDF")
plt.show()

Kümülatif ya da Birikimli Dağılım Fonksiyonu

Kümülatif (Birikimli) Dağılım Fonksiyonu (ing. Cumulative Distribution Function, CDF) herhangi bir olasılık dağılım fonksiyonunun sahip olduğu değerlerin toplanarak temsil edildiği fonksiyonlardır. Olasılık değerlerinin tamamı 1 ya da %100 ihtimale sahip olduğu için 1 değerine yakınsamaktadır.

Bu kavramı bir Gauss dağılımı üzerinden örneklendirelim. Dağılımı oluşturmak için kendi yazabileceğimiz bir Gauss fonksiyonunu kullanabiliriz. Gauss (normal) dağılım, en iyi bilinen dağılım türüdür ve çok sayıda tekrarı olan rastgele olayların olasılık dağılımlarını en iyi veren fonksiyondur. Bu dağılımı daha sonra detaylı olarak çalışacak olmakla birlikte fonksiyonu yazabilmek için matematiksel ifadesini verelim.

$$ PDF(x) = \frac{1}{2 \pi \sigma} e^{\frac{-(x - \mu) / \sigma)^2}{2}} $$

Burada $\mu$ dağılımın ortalaması, $\sigma$ standart sapması, $x$ bu dağılımda herhangi bir değer, $PDF(x)$ bu değerin olasılık yoğunluk fonksiyonu değeridir.

Ortalama değeri 0, standart sapması 0.2, 1.0, 5.0 olan üç farklı Gauss dağılımı ile ortalama değeri -2, standart sapması 0.5 olan bir Gauss dağılımı oluşturarak inceleyelim. Gauss dağılımını oluşturmak için numpy.random.normal fonksiyonunu kullanacağız. Bu fonksiyon ve normal dağılımla ilgili tüm ayrıntılar ilerleyen konularda işlenecektir.

In [10]:
# Bu kez farkli ortalama ve standart sapma degerlerine sahip
# normal dagilimlar olusturup, 
# bunlarin birikimli dagilimlarina bakalim
import math
# gauss fonksiyonu
def gauss(x, mu, sig):
    return 1./(np.sqrt(2.*np.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)
mu = np.array([0, 0, 0, -2])
sigma = np.sqrt(np.array([0.2, 1.0, 5.0, 0.5]))
renkler = ['blue','red','orange','green']
n = 1000
s = np.zeros((4,n))
p = np.zeros((4,n))
for i,ort in enumerate(mu):
    s[i,:] = np.random.normal(ort, sigma[i], n)
    s[i,:] = np.sort(s[i,:])
    p[i,:] = gauss(s[i,:], ort, sigma[i])
    pcum = np.zeros(n)
    pcum[0] = p[i,0]
    # Kumulatif olasilik
    #for j in range(1,len(p[i,:])):
        #pcum[j] = np.sum(p[i,:j+1])
    pcum = np.cumsum(p[i,:])
    # Normalizasyon
    pcum /= pcum[-1]
    # Olasilik dagilimini bir figure alalim
    plt.figure(1)
    plt.xlim((-5.5,5.5))
    plt.grid(True)
    plt.plot(s[i,:],p[i,:], color=renkler[i])
    # Kumulatif olasiliklari bir digerine cizelim
    plt.figure(2)
    plt.xlim((-5.5,5.5))
    plt.grid(True)
    plt.plot(s[i,:],pcum, color=renkler[i])
plt.show(1)
plt.show(2)

Bir Dağılım Foksiyonunun Elemanları

Bir dağılım fonksiyonunu yapısını anlatmak üzere kullanılan elemanlar temelde üç ölçüt grubu altında toplanır.

  • Merkezi Eğilim Ölçütleri

    • Ortalama
    • Mod
    • Ortanca (medyan)
  • Dağılım Ölçütleri

    • Standart Sapma
    • Varyans
  • Şekil Ölçütleri

    • Çarpıklık (ing. Skewness)
    • Basıklık (Kurtosis)

Merkezi Eğilim Ölçütleri

Ortalama Değer / Beklenen Değer

Bir dağılımın ortalama değeri (ing. average (continuous), ing. mean (discrete)) tüm değerlerin toplamının (sürekli değişken durumunda integralinin) değer sayısına (sürekli durumda aralık uzunluğuna) bölümü ile bulunur. Ağırlıklı ortalama verilmek istenen durumda bu ağırlıkların toplamı 1 olacak şekilde düzenlenir. Ortalama değer, bu dağılımı oluşturan ölçümlerin doğruluğunu da belirler. Ölçümler ortalamadan ne kadar uzaksa onlardan o kadar şüphe duyulur.

Bir ölçüm ya da sonucun beklenen değeri (ing. expected value) ise teorik ifadelerle hesaplanan değeri ya da biliniyorsa popülasyonun ortalama değeridir. Herhangi bir ölçüm yaparken teorik olarak beklentiyle ya da poülasyonun ortalamasıyla uyum beklenmesi doğaldır. Bir örnek ölçüm için beklenen değerden farklılık gösteren ortalama değerler sistematik hatalardan kaynaklanabileceği gibi, beklenen değerin gerçek değer olmamasından (örn. teorik hesapların eksik/yanlış olmasından) ya da yeterli ölçümün yapılmamasından kaynaklanabilir.

Aritmetik ortalama;

$$ \bar{x} = \frac{1}{N} \sum\limits_{i=1}^n x_{i} $$

$w_i$ i noktasının ağırlığını göstermek üzere, ağırlıklı ortalama ise

$$ \bar{x} = \frac{1}{N} \sum\limits_{i=1}^n \frac{x_{i} / w_i^2}{1 / w_i^2} $$

il verilir.

Diğer Merkezi Eğilim Ölçütleri

Bir dağılımın modu (ing.mode) söz konusu değişkenin ölçümlerde en çok tekrar eden (en sık rastlantılan) değeridir.

Bir dağılımın medyanı (ya da ortancası) ise söz konusu değişkene ilişkim tüm ölçüm değerleri küçükten büyüğe sıralandığında tam ortada kalan değeridir. Eğer çift sayıda ölçüm yapılmışsa bu kez ortada kalan iki ölçüm değerinin ortalaması alınır.

Özellikle simetrik olmayan dağılımlar söz konusu olduğunda, tercihe göre beklenen değer olarak ortalama değer yerine mod ya da medyan değeri kullanılabilmektedir. Bu tercih gözlenen/ölçülen olgunun türüne göre yapılabilmektedir. Ortalama yerine mod ya da medyan bu asimetriye yol açan ekstrem (marjinal ya da uç) dğeerler söz konusu olduğunda merkezi dağılımı belirlemek adına tercih sebebi olabilmektedir.

Dağılıma bağlı olarak mod, medyan ve ortalama değerleri aynı olabileceği gibi farklı da olabilir.

In [11]:
from scipy import stats as st
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
# 0 ile 9 arasindaki rakamlardan rastgele
# secilmis 10000 sayiyla bir dagilim olusturalim
x = np.random.choice(range(10), size=10000)
plt.hist(x, bins= 10)
# Ornegin ortalama ve standart sapmasi
print("Ort: {:.4f}, St.Sapma: {:.4f}, Medyan: {:.4f}, Mode:{:d}".\
      format(np.mean(x),np.std(x), np.median(x), st.mode(x)[0][0]))
plt.axvline(x=x.mean(), ls='--', c='r')
plt.axvline(x=np.median(x), ls='--', c='g')
plt.axvline(x= st.mode(x)[0][0], ls='--', c='y')
plt.show()
Ort: 4.5197, St.Sapma: 2.8672, Medyan: 5.0000, Mode:9

Dağılıım Ölçütleri

Standart Sapma ve Varyans

Varyans (popülasyon: $s^2$, örnek: $\sigma^2$) ve standart sapma (popülasyon: $s$, örnek: $\sigma$), dağılım değerlerinin ortalama değer etrafında ne kadar çok saçılmış olduğunu belirler. Dolayısıyla yapılan ölçümlerin ya da elde edilen sonuçların ne kadar hassas olduğunu belirlemek ve bu değerlere dayalı tahminler yaparaken söz konusu tahminler üzerindeki belirsizliği ifade etmek üzere kullanılır.

$$ \sigma^2 = \frac{\sum_{i=1}^{N} (x_i - \mu)^2}{N - 1} $$

Varyans ve standart sapmanın bazı özellikleri:

  • Varyans ve standart sapma değerleri negatif olamaz.
  • Tüm ölçümler aynı değere sahip ise varyans sıfır değerini alır.
  • Varyans değeri, dağılımın konumundan bağımsızdır. Tüm değerler aynı miktarda kaydırıldığında varyans değişmez.
  • Varyansın birimi, ölçülen değerin biriminin karesidir. Standart sapmanın birimi ise ölçülen değerin birimidir.
In [12]:
from matplotlib import pyplot as plt
import numpy as np
%matplotlib inline
# Bir normal dagilimdan rastgele bir
# ornek alalim
x = np.random.randn(10)
# Ornegin ortalama ve standart sapmasi
print("Ort: {:.4f}, St.Sapma: {:.4f}".format(x.mean(),x.std()))
plt.hist(x, bins= 20)
plt.show()
Ort: 0.1293, St.Sapma: 0.5795
In [13]:
# Ornekteki sayiyi arttiralim
x = np.random.randn(100)
# Ornegin ortalama ve standart sapmasi
print("Ort: {:.4f}, St.Sapma: {:.4f}".format(x.mean(),x.std()))
plt.hist(x, bins= 20)
plt.show()
Ort: 0.1152, St.Sapma: 1.0969
In [14]:
# Ornekteki sayiyi daha da arttiralim
x = np.random.randn(1000)
# Ornegin ortalama ve standart sapmasi
print("Ort: {:.4f}, St.Sapma: {:.4f}".format(x.mean(),x.std()))
plt.hist(x, bins= 20)
plt.show()
Ort: 0.0011, St.Sapma: 0.9896
In [15]:
# Ornekteki sayiyi daha da arttiralim
x = np.random.randn(10000)
plt.hist(x, bins= 20)
# Ornegin ortalama ve standart sapmasi
print("Ort: {:.4f}, St.Sapma: {:.4f}".format(x.mean(),x.std()))
plt.show()
Ort: 0.0110, St.Sapma: 0.9954

Bir normal dağılımdan rastgele türettiğimiz bu 5 örnekte yer alan veri sayısını arttırdıkça ortalamanın 0'a, standart sapmanın da 1'e yaklaştığını açıkça gördük. Bu noktadan hareketle numpy.random.randn() fonksiyonunun verilen sayı kadar veri içeren bir örneği ortalaması $\mu = 0$, standart sapması $\sigma = 1$ olan bir bir dağılımı kullanarak oluşturduğunu da anlamış olduk.

Şekil Ölçütleri

Çarpıklık

Çarpıklık (ing. skewness) bir dağılımın asimetrisinin ölçütüdür. Bu ölçütün basit ve standart bir matematiksel ifadesi yoktur.

Temel olarak iki tür çarpıklık vardır.

  • Negatif Çarpıklık (ing. left skewed, negatively skewed): dağılımın sol kuyruğu uzundur; dağılımın önemli bir çoğunluğu sağ tarafta toplanmıştır.
  • Pozitif Çarpıklık (ing. right skewed, positively skewed): dağılımın sağ kuyruğu uzundur; dağılımın önemli bir çoğunluğu sol tarafta toplanmıştır.

Çarpıklığı bir normal dağılıma göre 0'dan farklı dağılımlar için ortalama ve ortanca birbirinden farklı olabilir.

In [16]:
x = st.skewnorm.rvs(8, size=10000, loc=5, scale=2)
plt.hist(x, bins= 50)
# Ornegin ortalama ve standart sapmasi
print("Ort: {:.4f}, St.Sapma: {:.4f}, Medyan: {:.4f},".\
      format(x.mean(),x.std(), np.median(x)))
print("Çarpıklık: {:.4f}".format(st.stats.skew(x)))
plt.axvline(x=x.mean(), ls='--', c='r')
plt.axvline(x=np.median(x), ls='--', c='g')
plt.show()
Ort: 6.5632, St.Sapma: 1.2117, Medyan: 6.3311,
Çarpıklık: 0.9550

Basıklık

Basıkılık bir dağılımın normal dağılıma göre ne kadar geniş ya da ‘kuyruklu’ olduğunun ölçütüdür. kurtosis gibi basıklık ölçütleriyle ifade edilir.

In [17]:
x = st.skewnorm.rvs(6, size=10000, loc=5, scale=3)
plt.hist(x, bins= 50)
# Ornegin ortalama ve standart sapmasi
print("Ort: {:.4f}, St.Sapma: {:.4f}, Medyan: {:.4f},".\
      format(x.mean(),x.std(), np.median(x)))
print("Basıklık (Kurtosis): {:.4f}".format(st.stats.kurtosis(x)))
plt.axvline(x=x.mean(), ls='--', c='r')
plt.axvline(x=np.median(x), ls='--', c='g')
plt.show()
Ort: 7.3703, St.Sapma: 1.8223, Medyan: 7.0509,
Basıklık (Kurtosis): 0.6029

Örnek Dağılım ve Ana Dağılım

Yapılan gözlemlerin sayısının arttırılması gözlemlerin oluşturduğu dağılımı, ilgili olgunun gerçek dağılımına daha fazla yaklaştıracaktır. Ancak herhangi bir değişkenin olası tüm değerlerini alabileceği çok fazla sayıda (sürekli durumda sonsuz) gözlem yapmanın mümkün olamayabilmesi sebebiyle yapılan gözlemler çoğu zaman gerçek dağılımın bir örneği niteliğini taşır.

Bir dağılımı oluşturmak için olası tüm değerlerin kullanılması kabulu, elde edilen dağılımın ana dağılım (parent distribution) olarak kabul edilmesi anlamına gelmektedir. Gerçekte herhangi bir olayın tam olarak ne tür bir dağılım gösterdiğini çoğu zaman bilemeyiz. Ancak bu dağılımı yeterli hassasiyette temsil ettiği kabul edilen matematiksel bir fonksiyonu, olgunun ana dağılımı olarak kabul edebiliriz.

Bu kabulden sonra, yapılan gözlemlerin oluşturduğu ve sonlu sayıdaki değerler ile üretilen örnek dağılımı (ing. sample distribution) kullanarak ana dağılıma ilişkin parametreleri elde edebilir ya da ana dağılımın geçerliliğini sorgulayabiliriz.

Örneğin metalce fakir Pop-II yıldızları olan RR Lyrae yıldızları için teorik olarak ortalama zonklama dönemi $P_{ort} = 14$ saat ve standart sapma $\sigma = 5$ saat olarak biliniyor olsun. Her bir kümede zonklama döneminin normal dağıldığını varsayarak, 500 kümedeki 20'şer RR Lyrae yıldızının gözlemleriyle bir ana dağılım (ing. parent distribution) oluşturmuş olalım.

In [18]:
Port = 14. # ortalama zonklama donemi
Pstd = 5 # zonkalama doneminin standart sapmasi
# Her bir kuresel kumedeki 20ser RR Lyrae
# yildizinin zonklama donemi ortalalamalarinin dagilimi
gozlemler = np.zeros((500,20))
for i in range(gozlemler.shape[0]):
    for j in range(gozlemler.shape[1]):
        gozlemler[i,j] = Port + np.random.normal()*Pstd
print('Tum orneklerin ortalamasi:', round(np.mean(gozlemler),4))
print('Standart sapmasi:', round(np.var(gozlemler)**0.5,4))
Tum orneklerin ortalamasi: 14.0072
Standart sapmasi: 5.0078

Bu ana dağılımın bir histogramını çizdirelim.

In [19]:
fig, ax = plt.subplots(figsize=(9,6))
plt.hist(np.mean(gozlemler,axis=1), 
             bins=20, label='Ortalama Donem')
ax.set_xlabel("Zonklama Donemi (saat)",fontsize=12)
ax.set_ylabel("Frekans",fontsize=12)
# Aslinda tum RR Lyrae'lar icin ortalama
# parlakligi 14 gun varsayiyoruz
plt.axvline(x=14, ls='--', c='r')
plt.legend()
plt.tight_layout()

Bu ana dağılımın altındaki her bir kümenin dağılımı ondan alınmış bir örnek dağılım (ing. sample distribution) olacaktır.

In [20]:
plt.hist(gozlemler[199], bins=20, alpha=0.5, label='200. kume')
plt.xlabel("Zonklama Donemi (saat)")
plt.ylabel("Frekans")
plt.show()

Sadece bir kümeden hareketle ana dağılımı elde etmeye çalışabiliriz.

In [21]:
fig, ax = plt.subplots(figsize=(9,6))
# 500 kumede RR Lyrae yildizlarinin
# ortalama zonklama donemlerinin dagilimi
plt.hist(np.mean(gozlemler,axis=1), 
             bins=20, alpha=0.2, label='Tum Kumeler')
# Rastgele sectigimiz 42. kume
kume42ort = np.mean(gozlemler[41])
kume42std = np.var(gozlemler[41])**0.5
# Sadece bu kumeden yola cikarak 500 kuresel kume icin
# nasil bir dagilim elde edecegimize bakalim
cikarim = np.zeros((500,20))
for i in range(cikarim.shape[0]):
    for j in range(cikarim.shape[1]):
        cikarim[i,j] = kume42ort + np.random.normal()*kume42std
# Simdi bu kumeden yola cikarak elde edecegimiz dagilima bakalim
plt.hist(np.mean(cikarim, axis=1), bins=20, alpha=0.5, 
         label='42. kumeden cikarim')
plt.xlabel("Ortalama Zonklama Donemi (saat)",fontsize=12)
plt.ylabel("Frekans",fontsize=12)
plt.legend()
plt.show()
print('Tum orneklerin ortalamasi:', round(np.mean(gozlemler),4))
print('Standart sapmasi:', round(np.var(gozlemler)**0.5,4))
print('42. kumeden yapilan cikarimin ortalamasi:', round(np.mean(cikarim),4))
print('Standart sapmasi:', round(np.var(cikarim)**0.5,4))
Tum orneklerin ortalamasi: 14.0072
Standart sapmasi: 5.0078
42. kumeden yapilan cikarimin ortalamasi: 14.1065
Standart sapmasi: 5.7239

Sadece 20 yıldızdan yola çıkarak elde edilen dağılım doğal olarak ana dağılımdan bir miktar farklıdır. Ancak yine de ortalama zonklama döneminin 14 sate, standart sapmasının da 5 saate yakın olduğu görülmektedir.

Rastgele seçilmiş 5 kümenin ortalama ve standart sapmasını kullanarak ana dağılımı daha başarılı bir şekilde elde edebiliriz. Mümkün olsa tüm kümeleri (verideki 500 kümeyi) kullandığımızda ana dağılımı, evrendeki tüm kümeleri ve RR Lyrae yıldızlarını gözleyebilsek popülasyonu elde etmemiz mümkün olacaktır.

In [22]:
fig, ax = plt.subplots(figsize=(9,6))
# 500 kumede RR Lyrae yildizlarinin
# ortalama zonklama donemlerinin dagilimi
plt.hist(np.mean(gozlemler,axis=1), 
             bins=20, alpha=0.2, label='Tum Kumeler')
# Rastgele 5 kume alalim
kumeler = [19, 125, 294, 396, 410]
toplam = 0.
toplam_varyans = 0.
for kume in kumeler:
    toplam +=  np.mean(gozlemler[kume])
    toplam_varyans += np.var(gozlemler[kume])
ortalama = toplam / len(kumeler)
stsapma = np.sqrt(toplam_varyans)
# Sadece bu kumeden yola cikarak 500 kuresel kume icin
# nasil bir dagilim elde edecegimize bakalim
cikarim_5kume = np.zeros((500,20))
for i in range(cikarim_5kume.shape[0]):
    for j in range(cikarim_5kume.shape[1]):
        cikarim_5kume[i,j] = ortalama + np.random.normal()*stsapma
# Simdi bu kumeden yola cikarak elde edecegimiz dagilima bakalim
plt.hist(np.mean(cikarim_5kume, axis=1), bins=20, alpha=0.5, 
         label='5 kumeden cikarim')
plt.xlabel("Ortalama Zonklama Donemi (saat)",fontsize=12)
plt.ylabel("Frekans",fontsize=12)
plt.legend()
plt.show()
print('Tum orneklerin ortalamasi:', round(np.mean(gozlemler),4))
print('Standart sapmasi:', round(np.var(gozlemler)**0.5,4))
print('Secilen kumeden yapilan cikarimin ortalamasi:', round(np.mean(cikarim),4))
print('Standart sapmasi:', round(np.var(cikarim)**0.5,4))
Tum orneklerin ortalamasi: 14.0072
Standart sapmasi: 5.0078
Secilen kumeden yapilan cikarimin ortalamasi: 14.1065
Standart sapmasi: 5.7239

Görüldüğü üzere sadece 5 küme kullanıldığı için standart sapma büyük olmakla birlikte, ortalama ana dağılımınkine çok daha yakındır! Bu yaklaşım (örnek sayısının azlığı nedeniyle normal bir dağılıma benzemeyen kümeleirn ortalama ve standart sapmalarından hareketle ana dağılımın yakınsanması) örneklem sayısının arttırılmasıyla ana dağılıma yakınsanacağını göstermektedir ve daha sonra göreceğimiz Merkezi Limit Teoremi'nin temelini oluşturur.

Kaynaklar