{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# AST416 Astronomide Sayısal Çözümleme - II #\n", "## Ders - 02a Temel İstatistiki Kavramlar ve Dağılımlar ##" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Doç. Dr. Özgür Baştürk
\n", "Ankara Üniversitesi, Astronomi ve Uzay Bilimleri Bölümü
\n", "obasturk at ankara.edu.tr
\n", "http://ozgur.astrotux.org" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bu derste neler öğreneceksiniz?#\n", "## Dağılımlar ##\n", "\n", "* [Dağılımlar](#Dağılımlar)\n", " * [Sıklık Dağılımı](#Sıklık-Dağılımı)\n", " * [Olasılık Dağılımları](#Olasılık-Dağılımları)\n", " * [Olasıık Kütle Fonksiyonu](#Olasıık-Kütle-Fonksiyonu)\n", " * [Olasılık Yoğunluğu Fonksiyonu](#Olasılık-Yoğunluğu-Fonksiyonu)\n", " * [Kümülatif ya da Birikimli Dağılım Fonksiyonu](#Kümülatif-ya-da-Birikimli-Dağılım-Fonksiyonu)\n", "* [Bir Dağılım Foksiyonunun Elemanları](#Bir-Dağılım-Foksiyonunun-Elemanları)\n", " * [Ortalama Değer / Beklenen Değer](#Ortalama-Değer-/-Beklenen-Değer)\n", " * [Standart Sapma ve Varyans](#Standart-Sapma-ve-Varyans)\n", " * [Diğer Merkezi Eğilim Ölçütleri](#Diğer-Merkezi-Eğilim-Ölçütleri)\n", "* [Örnek Dağılım ve Ana Dağılım](#Örnek-Dağılım-ve-Ana-Dağılım)\n", "* [Kaynaklar](#Kaynaklar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Dağılımlar #\n", "\n", "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.\n", "\n", "## Sıklık Dağılımı ##\n", "\n", "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ı bulunamktadır. Öncelikle veriyi pandas fonksiyonları ile açıp, inceleyelim ve histogramını `dataframe.hist` metodunu kullanarak çizdirelim." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "import pandas as pd\n", "# Veriyi bir csv dosyasindan bir vericercevesine alalim\n", "notlar = pd.read_csv(\"ders_notlar_sonuc.csv\", index_col=\"ad\")\n", "# Biraz inceleyelim.\n", "notlar.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# genel istatistiklere bakalim.\n", "notlar.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ö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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "notlar['durum'].describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Görüldüğü üzere toplam 37 kayıtta durum bilgisi bulunurken, 12 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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "notlar['durum'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "notlar.sort_values('durum')['durum'].value_counts().plot(kind='bar')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Genel ortalamanin basit bir histogrami\n", "# pandas'da bu grafikler icin matplotlib'i kullanmaktadir.\n", "%matplotlib inline\n", "notlar.hist(column = 'genel_ortalama', bins=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`matplotlib` fonksiyonlarıyla biraz daha fazla kontrole sahip olabiliriz. Grafiklerinize renk katmak için [isimlendirilmiş renkleri](https://matplotlib.org/3.1.0/gallery/color/named_colors.html) kullanabilirsiniz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from matplotlib import pyplot as plt\n", "colors = ['indigo','darkviolet','mediumorchid',\\\n", " 'midnightblue','mediumblue','blue',\\\n", " 'darkgreen','seagreen','springgreen',\\\n", " 'orangered','tomato','red','darkred']\n", "kategoriler = notlar['durum'].unique()\n", "durum = notlar.sort_values('durum')['durum']\n", "nbins = len(kategoriler)\n", "n, bins, patches = plt.hist(durum, bins=nbins)\n", "# apply the same color for each class to match the map\n", "for patch,color in zip(patches, colors):\n", " patch.set_facecolor(color)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sıklık dağılımları elde etmek ve görselleştirmek üzere bu seçeneklerin dışında da olanaklar mevcuttur. `seaborn` [paketi](https://seaborn.pydata.org/) veri görselleştirmesi için pek çok seçenek sunar. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Olasılık Dağılımları ##\n", "\n", "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.\n", "\n", "### Olasıık Kütle Fonksiyonu ###\n", "\n", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "zar_atis_sayisi = 10000\n", "zar = np.zeros(zar_atis_sayisi)\n", "for i in range(zar_atis_sayisi):\n", " # Her bir zar atisinda tum olasiliklardan birini\n", " # rastgele secelim\n", " zar[i] = np.random.choice(['1', '2', '3', '4', '5', '6'])\n", "\n", "# Her bir secenekten kac tane var\n", "deger, n = np.unique(zar, return_counts=True)\n", "# Olasiliga donusturelim\n", "olasilik = n / len(zar)\n", "\n", "# 10000 atis sonunda olasilik kutle fonksiyonunu \n", "# cizdirelim\n", "plt.bar(deger, olasilik)\n", "plt.ylabel(\"Olasilik\")\n", "plt.xlabel(\"Zar Degerleri\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Olasılık Yoğunluğu Fonksiyonu ###\n", "\n", "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.\n", "\n", "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 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, π 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. \n", "\n", "Bilgisayarların doğası gereği sürekli bir fonksiyon tanılayamayı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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = np.random.uniform(-2, 2, 10000)\n", "import seaborn as sns\n", "sns.distplot(x)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kümülatif ya da Birikimli Dağılım Fonksiyonu ##\n", "\n", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Bu kez farkli ortalama ve standart sapma degerlerine sahip\n", "# normal dagilimlar olusturup, \n", "# bunlarin birikimli dagilimlarina bakalim\n", "import math\n", "# gauss fonksiyonu\n", "def gaussian(x, mu, sig):\n", " return 1./(np.sqrt(2.*np.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)\n", "mu = np.array([0, 0, 0, -2])\n", "sigma = np.sqrt(np.array([0.2, 1.0, 5.0, 0.5]))\n", "colors = ['blue','red','orange','green']\n", "n = 1000\n", "s = np.zeros((4,n))\n", "p = np.zeros((4,n))\n", "for i,ort in enumerate(mu):\n", " s[i,:] = np.random.normal(ort, sigma[i], n)\n", " s[i,:] = np.sort(s[i,:])\n", " p[i,:] = gaussian(s[i,:], ort, sigma[i])\n", " pcum = np.zeros(n)\n", " pcum[0] = p[i,0]\n", " # Kumulatif olasilik\n", " #for j in range(1,len(p[i,:])):\n", " #pcum[j] = np.sum(p[i,:j+1])\n", " pcum = np.cumsum(p[i,:])\n", " # Normalizasyon\n", " pcum /= pcum[-1]\n", " # Olasilik dagilimini bir figure\n", " plt.figure(1)\n", " plt.xlim((-5.5,5.5))\n", " plt.grid(True)\n", " plt.plot(s[i,:],p[i,:], color=colors[i])\n", " # Kumulatif olasiliklari bir digerine cizelim\n", " plt.figure(2)\n", " plt.xlim((-5.5,5.5))\n", " plt.grid(True)\n", " plt.plot(s[i,:],pcum, color=colors[i])\n", "plt.show(1)\n", "plt.show(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bir Dağılım Foksiyonunun Elemanları #\n", "\n", "Bir dağılım fonksiyonunu yapısını anlatmak üzere kullanılan elemanlar temelde üç ölçüt grubu altında toplanır. \n", "\n", "* Merkezi Eğilim Ölçütleri\n", " * Ortalama \n", " * Mod\n", " * Ortanca (medyan)\n", "\n", "* Dağılım Ölçütleri\n", " * Standart Sapma\n", " * Varyans\n", "\n", "* Şekil Ölçütleri\n", " * Çarpıklık (ing. Skewness)\n", " * Basıklık (Kurtosis)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ortalama Değer / Beklenen Değer ##\n", "\n", "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.\n", "\n", "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.\n", "\n", "Aritmetik ortalama;\n", "\n", "$$ \\bar{x} = \\frac{1}{N} \\sum\\limits_{i=1}^n x_{i} $$\n", "\n", "$w_i$ i noktasının ağırlığını göstermek üzere, ağırlıklı ortalama ise\n", "\n", "$$ \\bar{x} = \\frac{1}{N} \\sum\\limits_{i=1}^n \\frac{x_{i} / w_i^2}{1 / w_i^2} $$\n", "\n", "il verilir." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Standart Sapma ve Varyans ##\n", "\n", "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.\n", "\n", "$$ \\sigma^2 = \\frac{\\sum_{i=1}^{N} (x_i - \\mu)^2}{N - 1} $$\n", "\n", "Varyans ve standart sapmanın bazı özellikleri:\n", "* Varyans ve standart sapma değerleri negatif olamaz.\n", "* Tüm ölçümler aynı değere sahip ise varyans sıfır değerini alır.\n", "* 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.\n", "* Varyansın birimi, ölçülen değerin biriminin karesidir. Standart sapmanın birimi ise ölçülen değerin birimidir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from matplotlib import pyplot as plt\n", "import numpy as np\n", "%matplotlib inline\n", "# Bir normal dagilimdan rastgele bir\n", "# ornek alalim\n", "x = np.random.randn(10)\n", "# Ornegin ortalama ve standart sapmasi\n", "print(\"Ort: {:.4f}, St.Sapma: {:.4f}\".format(x.mean(),x.std()))\n", "plt.hist(x, bins= 20)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornekteki sayiyi arttiralim\n", "x = np.random.randn(100)\n", "# Ornegin ortalama ve standart sapmasi\n", "print(\"Ort: {:.4f}, St.Sapma: {:.4f}\".format(x.mean(),x.std()))\n", "plt.hist(x, bins= 20)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornekteki sayiyi daha da arttiralim\n", "x = np.random.randn(1000)\n", "# Ornegin ortalama ve standart sapmasi\n", "print(\"Ort: {:.4f}, St.Sapma: {:.4f}\".format(x.mean(),x.std()))\n", "plt.hist(x, bins= 20)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornekteki sayiyi daha da arttiralim\n", "x = np.random.randn(10000)\n", "plt.hist(x, bins= 20)\n", "# Ornegin ortalama ve standart sapmasi\n", "print(\"Ort: {:.4f}, St.Sapma: {:.4f}\".format(x.mean(),x.std()))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Diğer Merkezi Eğilim Ölçütleri #\n", "\n", "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.\n", "\n", "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.\n", "\n", "Ö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.\n", "\n", "Dağılıma bağlı olarak mod, medyan ve ortalama değerleri aynı olabileceği gibi farklı da olabilir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from scipy import stats as st\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "%matplotlib inline\n", "# 0 ile 9 arasindaki rakamlardan rastgele\n", "# secilmis 10000 sayiyla bir dagilim olusturalim\n", "x = np.random.choice(range(10), size=10000)\n", "plt.hist(x, bins= 10)\n", "# Ornegin ortalama ve standart sapmasi\n", "print(\"Ort: {:.4f}, St.Sapma: {:.4f}, Medyan: {:.4f}, Mode:{:d}\".\\\n", " format(np.mean(x),np.std(x), np.median(x), st.mode(x)[0][0]))\n", "plt.axvline(x=x.mean(), ls='--', c='r')\n", "plt.axvline(x=np.median(x), ls='--', c='g')\n", "plt.axvline(x= st.mode(x)[0][0], ls='--', c='y')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Çarpıklık ##\n", "\n", "Ç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.\n", "\n", "Temel olarak iki tür çarpıklık vardır.\n", "* 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.\n", "* 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.\n", "\n", "Çarpıklığı bir normal dağılıma göre 0'dan farklı dağılımlar için ortalama ve ortanca birbirinden farklı olabilir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = st.skewnorm.rvs(8, size=10000, loc=5, scale=2)\n", "plt.hist(x, bins= 50)\n", "# Ornegin ortalama ve standart sapmasi\n", "print(\"Ort: {:.4f}, St.Sapma: {:.4f}, Medyan: {:.4f},\".\\\n", " format(x.mean(),x.std(), np.median(x)))\n", "print(\"Çarpıklık: {:.4f}\".format(st.stats.skew(x)))\n", "plt.axvline(x=x.mean(), ls='--', c='r')\n", "plt.axvline(x=np.median(x), ls='--', c='g')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basıklık ##\n", "\n", "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = st.skewnorm.rvs(6, size=10000, loc=5, scale=3)\n", "plt.hist(x, bins= 50)\n", "# Ornegin ortalama ve standart sapmasi\n", "print(\"Ort: {:.4f}, St.Sapma: {:.4f}, Medyan: {:.4f},\".\\\n", " format(x.mean(),x.std(), np.median(x)))\n", "print(\"Basıklık: {:.4f}\".format(st.stats.kurtosis(x)))\n", "plt.axvline(x=x.mean(), ls='--', c='r')\n", "plt.axvline(x=np.median(x), ls='--', c='g')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Örnek Dağılım ve Ana Dağılım #\n", "\n", "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.\n", "\n", "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.\n", "\n", "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.\n", "\n", "Ö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ızlarının gözlemleriyle bir ana dağılım (ing. parent distribution) oluşturmuş olalım. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Port = 14. # ortalama zonklama donemi\n", "Pstd = 5 # zonkalama doneminin standart sapmasi\n", "# Her bir kuresel kumedeki 20ser RR Lyrae\n", "# yildizinin zonklama donemi ortalalamalarinin dagilimi\n", "gozlemler = np.zeros((500,20))\n", "for i in range(gozlemler.shape[0]):\n", " for j in range(gozlemler.shape[1]):\n", " gozlemler[i,j] = Port + np.random.normal()*Pstd\n", "print('Tum orneklerin ortalamasi:', round(np.mean(gozlemler),4))\n", "print('Standart sapmasi:', round(np.var(gozlemler)**0.5,4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu ana dağılımın bir histogramını çizdirelim." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots(figsize=(9,6))\n", "plt.hist(np.mean(gozlemler,axis=1), \n", " bins=20, label='Ortalama Donem')\n", "ax.set_xlabel(\"Zonklama Donemi (saat)\",fontsize=12)\n", "ax.set_ylabel(\"Frekans\",fontsize=12)\n", "# Aslinda tum RR Lyrae'lar icin ortalama\n", "# parlakligi 14 gun varsayiyoruz\n", "plt.axvline(x=14, ls='--', c='r')\n", "plt.legend()\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.hist(gozlemler[199], bins=20, alpha=0.5, label='200. kume')\n", "plt.xlabel(\"Zonklama Donemi (saat)\")\n", "plt.ylabel(\"Frekans\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sadece bir kümeden hareketle ana dağılımı elde etmeye çalışabiliriz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots(figsize=(9,6))\n", "# 500 kumede RR Lyrae yildizlarinin\n", "# ortalama zonklama donemlerinin dagilimi\n", "plt.hist(np.mean(gozlemler,axis=1), \n", " bins=20, alpha=0.2, label='Tum Kumeler')\n", "# Rastgele sectigimiz 42. kume\n", "kume42ort = np.mean(gozlemler[41])\n", "kume42std = np.var(gozlemler[41])**0.5\n", "# Sadece bu kumeden yola cikarak 500 kuresel kume icin\n", "# nasil bir dagilim elde edecegimize bakalim\n", "cikarim = np.zeros((500,20))\n", "for i in range(cikarim.shape[0]):\n", " for j in range(cikarim.shape[1]):\n", " cikarim[i,j] = kume42ort + np.random.normal()*kume42std\n", "# Simdi bu kumeden yola cikarak elde edecegimiz dagilima bakalim\n", "plt.hist(np.mean(cikarim, axis=1), bins=20, alpha=0.5, \n", " label='42. kumeden cikarim')\n", "plt.xlabel(\"Ortalama Zonklama Donemi (saat)\",fontsize=12)\n", "plt.ylabel(\"Frekans\",fontsize=12)\n", "plt.legend()\n", "plt.show()\n", "print('Tum orneklerin ortalamasi:', round(np.mean(gozlemler),4))\n", "print('Standart sapmasi:', round(np.var(gozlemler)**0.5,4))\n", "print('42. kumeden yapilan cikarimin ortalamasi:', round(np.mean(cikarim),4))\n", "print('Standart sapmasi:', round(np.var(cikarim)**0.5,4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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. \n", "\n", "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. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots(figsize=(9,6))\n", "# 500 kumede RR Lyrae yildizlarinin\n", "# ortalama zonklama donemlerinin dagilimi\n", "plt.hist(np.mean(gozlemler,axis=1), \n", " bins=20, alpha=0.2, label='Tum Kumeler')\n", "# Rastgele 5 kume alalim\n", "kumeler = [19, 125, 294, 396, 410]\n", "toplam = 0.\n", "toplam_varyans = 0.\n", "for kume in kumeler:\n", " toplam += np.mean(gozlemler[kume])\n", " toplam_varyans += np.var(gozlemler[kume])\n", "ortalama = toplam / len(kumeler)\n", "stsapma = np.sqrt(toplam_varyans)\n", "# Sadece bu kumeden yola cikarak 500 kuresel kume icin\n", "# nasil bir dagilim elde edecegimize bakalim\n", "cikarim_5kume = np.zeros((500,20))\n", "for i in range(cikarim_5kume.shape[0]):\n", " for j in range(cikarim_5kume.shape[1]):\n", " cikarim_5kume[i,j] = ortalama + np.random.normal()*stsapma\n", "# Simdi bu kumeden yola cikarak elde edecegimiz dagilima bakalim\n", "plt.hist(np.mean(cikarim_5kume, axis=1), bins=20, alpha=0.5, \n", " label='5 kumeden cikarim')\n", "plt.xlabel(\"Ortalama Zonklama Donemi (saat)\",fontsize=12)\n", "plt.ylabel(\"Frekans\",fontsize=12)\n", "plt.legend()\n", "plt.show()\n", "print('Tum orneklerin ortalamasi:', round(np.mean(gozlemler),4))\n", "print('Standart sapmasi:', round(np.var(gozlemler)**0.5,4))\n", "print('Secilen kumeden yapilan cikarimin ortalamasi:', round(np.mean(cikarim),4))\n", "print('Standart sapmasi:', round(np.var(cikarim)**0.5,4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kaynaklar #\n", "\n", "* Measurements and their Uncertainties, Ifan G. Hughes & Thomas P.A. Hase, Oxford University Press, 2010\n", "* Data Reduction and Error Analysis for the Physical Sciences, Philip R. Bevington & D. Keith Robinson, MC Graw Hill, 2003\n", "* [scipy.stats Modülü Dokümantasyonu](https://docs.scipy.org/doc/scipy/reference/stats.html)\n", "* [numpy.random Modülü Dokümantasyonu](https://docs.scipy.org/doc/numpy-1.15.0/reference/routines.random.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 2 }