{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# AST416 Astronomide Sayısal Çözümleme - II #\n", "## Ders - 01 Hata Analizi ##" ] }, { "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", "## Hata Kaynakları, Hata Analizi ve Hataya İlişkin Kavramlar ##\n", "\n", "* [Doğruluk ve Duyarlılık](#Doğruluk-ve-Duyarlılık)\n", "* [Anlamlı Rakamlar](#Anlamlı-Rakamlar)\n", " * [Anlamlı Rakamlarla Aritmetik](#Anlamlı-Rakamlarla-Aritmetik)\n", "* [Yuvarlama ve Yuvarlama Kaynaklı Hatalar](#Yuvarlama-ve-Yuvarlama-Kaynaklı-Hatalar)\n", " * [round Fonksiyonu](#round-Fonksiyonu)\n", " * [math Kütüphanesi Tam Sayıya Yuvarlama Fonksiyonları](#math-Kütüphanesi-Tam-Sayıya-Yuvarlama-Fonksiyonları)\n", " * [Yuvarlama Stratejileri](#Yuvarlama-Stratejileri)\n", " * [Kesme](#Kesme)\n", " * [Yukarı Yuvarlama](#Yukarı-Yuvarlama)\n", " * [Aşağı Yuvarlama](#Aşağı-Yuvarlama)\n", " * [Yuvarlama Yanlılığı](#Yuvarlama-Yanlılığı)\n", "* [Hata Tanımları](#Hata-Tanımları)\n", " * [1. Sistematik Hata](#Hata-Tanımları)\n", " * [2. Rastgele Hata](#Hata-Tanımları)\n", " * [Rastgele Hata Kavramları](#Rastgele-Hata-Kavramları)\n", " * [3. Gözlemci Hatası](#3.-Gözlemci-Hatası)\n", " * [Hatanın Yayılması](#Hatanın-Yayılması)\n", " * [Varyans ve Kovaryans](#Varyans-ve-Kovaryans)\n", " * [1a. Bir Sabitle Toplama ve Çıkarma](#1a.-Bir-Sabitle-Toplama-ve-Çıkarma)\n", " * [1b. Toplama ve Çıkarma](#1b.-Toplama-ve-Çıkarma)\n", " * [2. Çarpma ve Bölme](#2.-Çarpma-ve-Bölme)\n", " * [3. Kuvvet Alma](#3.-Kuvvet-Alma)\n", " * [4. Üstel ve Logaritmik Fonksiyon](#4.-Üstel-ve-Logaritmik-Fonksiyon)\n", " * [Üstel Fonksiyon](#Üstel-Fonksiyon)\n", " * [Logaritma](#Logaritma)\n", " * [5. Trigonometrik Fonksiyonlar](#5.-Trigonometrik-Fonksiyonlar)\n", "* [Aykırı Noktaların Belirlenerek Çıkarılması](#Aykırı-Noktaların-Belirlenerek-Çıkarılması)\n", " * [Standart Sapma Kullanımı](#Standart-Sapma-Kullanımı)\n", " * [Chauvenet Kriteri](#Chauvenet-Kriteri)\n", " * [Peirce Kriteri](#Peirce-Kriteri)\n", " * [Kutu Grafikleri](#Kutu-Grafikleri)\n", "* [Ödev 1](#Ödev-1)\n", "* [Kaynaklar](#Kaynaklar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Doğruluk ve Duyarlılık #\n", "\n", "Bilimin bütün deneysel alanlarında, ama özel olarak büyük ölçüde gözlemlere ve gözlemsel veriye dayanan astronomide gözlemlerini duyarlılığı (hassasiyeti) ve doğruluğu büyük önem taşır. Bu iki kavramı birbiriyle karıştırmamak da çok önemlidir. Doğruluk (ing. accuracy) önceden (a priori) bilinen teorik ya da deneysel olarak belirlenmiş bir değerle uyumu denetlerken başvurulan bir ölçüt iken, duyarlılık ya da hassasiyet (ing. precision) deneysel değerlerin ortalamaları etrafındaki saçılmalarının bir ölçütüdür." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "from IPython.display import Image\n", "Image(filename='images/dogruluk_duyarlilik.png', width=600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Anlamlı Rakamlar #\n", "\n", "Anlamlı rakamlar bir ölçümün sonucu olarak verilen bir sayının duyarlılığını tayin eden rakamlardır. Bir sayıdaki anlamlı rakamlar aşağıdaki kriterler dahilinde belirlenir:\n", "\n", "* Sıfır olmayan tüm rakamlar anlamlıdır.
\n", " Örn.1. 91 : 2 anlamlı rakam
\n", " Örn.2. 123.45 : 5 anlamlı rakam\n", "* Sıfır olmayan iki rakam arasındaki sıfırlar anlamlıdır.
\n", " Örn. 101.1203 : 7 anlamlı rakam\n", "* Sıfır olmayan ilk rakama kadar soldaki sıfırlar anlamlı değildir.
\n", " Örn. 0.000052 : 2 anlamlı rakam\n", "* Noktalı sayılarda sondaki sıfırlar anlamlıdır, çünkü sayının (ölçümün) duyarlılığını ortaya koyar.
\n", " Örn.1. 12.2300 : 6 anlamlı rakam
\n", " Örn.2. 120.00 : 5 anlamlı rakam\n", "* Nokta içermeyen sayılarda sondaki sıfırların durumu kaynaktan kaynağa farklı değerlendirilmektedir:\n", " * Duyarlılığı kesin olan basamakların üzerine ya da altına çizgi konarak
\n", " Örn. 1300 : 3 anlamlı rakam \n", " * Tam sayılarda duyarlılık son basamakla belirleniyorsa son basamaktan sonra nokta konarak
\n", " Örn. 100. : 3 anlamlı rakam\n", " * Doğru birimler seçilerek
\n", " Örn. 1300 gram yerine 1.3 kg : 2 anlamlı rakam\n", " \n", "Şimdi problemin doğası gereği bir metin değişken (string) olarak sağlanan bir sayının anlamlı rakam sayısını bulan bir fonksiyon yazalım." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def anlamli_rakam_sayisi(sayi):\n", " \"\"\"\n", " string olarak verilen bir sayidaki anlamli rakam sayisini hesaplayan\n", " ve programa donduren fonksiyon\n", " \"\"\"\n", " tamsayi, _, ondalik = sayi.partition(\".\")\n", " if ondalik:\n", " return len((tamsayi + ondalik).lstrip('0'))\n", " else:\n", " return len(tamsayi.strip('0'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornekler:\n", "print(\"{:s} sayisindaki anlamli rakam sayisi: {:d}\". format(\"91\", anlamli_rakam_sayisi(\"91\")))\n", "print(\"{:s} sayisindaki anlamli rakam sayisi: {:d}\". format(\"123.45\", anlamli_rakam_sayisi(\"123.45\")))\n", "print(\"{:s} sayisindaki anlamli rakam sayisi: {:d}\". format(\"101.12\", anlamli_rakam_sayisi(\"101.12\")))\n", "print(\"{:s} sayisindaki anlamli rakam sayisi: {:d}\". format(\"0.000052\", anlamli_rakam_sayisi(\"0.000052\")))\n", "print(\"{:s} sayisindaki anlamli rakam sayisi: {:d}\". format(\"12.2300\", anlamli_rakam_sayisi(\"12.2300\")))\n", "print(\"{:s} sayisindaki anlamli rakam sayisi: {:d}\". format(\"120.00\", anlamli_rakam_sayisi(\"120.00\")))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Anlamlı Rakamlarla Aritmetik ##\n", "\n", "Anlamlı rakamlara dikkat ederek hesap yaparken genel olarak aşağıdaki kurallar takip edilir :\n", "\n", "Çarpma ve bölme için sonuç, en az anlamlı rakam içeren sayıdaki anlamlı rakam sayısı kadar anlamlı rakam içermelidir.\n", "\n", "Toplama ve çıkarma için sonuç, en az basamak içeren sayıdaki basamak sayısı kadar basamak içermeledir.\n", "\n", "Genel kural olarak ara adımlardaki basamak ve anlamlı rakam sayısına bakılmaz, sonuçtaki basamak ya da anlamlı rakam sayısı dikkate alınır.\n", "\n", "Örnek 1. Aşağıdaki işlemde en düşük hassasiyet (2.2) 2 anlamlı rakam gerektirdiğinden sonuç 2 anlamlı rakam taşımalı, 0.42‘deki anlamlı rakam sayısı : 2\n", "\n", "$$ \\frac{0.745~x~2.2}{3.885} = 0.4218 \\sim 0.42$$\n", "\n", "Örnek 2. Aşağıdaki işlemde en düşük basamak sayısı (138.2) 1 olduğundan sonuç 1 ondalık basamak taşımalı, 153.6‘daki ondalık basamak sayısı : 1\n", "\n", "$$ 27.153 + 138.2 - 11.74 = 153.613 \\sim 153.6 $$\n", "\n", "Örnek 3. Aşağıdaki toplama işleminin sonucu 4 ondalık basamak (5.2070), çıkarmanın 1 ondalık basamak (2.0), bölmeninki 2 anlamlı rakam içermeli.\n", "\n", "$$ (5.20674 + 0.0003) / (2.1 - 0.09) = 2.6035 \\sim 2.6 $$\n", "\n", "Örnek 4. Aşağıdaki işlemde en düşük hassasiyet (2.0) 2 anlamlı rakam gerektirdiğinden sonuç 2 anlamlı rakam taşımalı, 2.6‘daki anlamlı rakam sayısı : 2\n", "\n", "$$ (5.23~x~10^3 - 0.26~x~10^2) / (2.0~x~10^4) = 2.6~x~10^0 $$ \n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Yuvarlama ve Yuvarlama Kaynaklı Hatalar #\n", "\n", "## round Fonksiyonu ##\n", "\n", "Yuvarlama işlemi bilimsel çalışmalarda ciddiye alınması gereken ve önemli sonuçlar doğurabilecek bir işlemdir. Astronomide (ve diğer tüm bilim dallarında) yapılan hesaplardan istenen duyarlılık ve doğruluk derecesine bağlı olarak yuvarlama kaynaklı hatalar önemli rol oynayabilir. Bununla birlikte tam olarak doğru bir yuvarlama stratejisi bulunmadığını da belirtmek gerekir. İhtiyaca göre ve ihtiyaç duyulduğu kadar yuvarlama yapmak gerekir. Konu oldukça geniş olmakla birlikte önce bu noktada, daha sonra da `Decimal` modülünü tartışırken yuvarlama konusuna ve Python'da sıklıkla kullanılan yuvarlama fonksiyonlarına bakacağız.\n", "\n", "Genel olarak bir sayıyı “n” tane anlamlı rakama yuvarlamak için:\n", "\n", "* Anlamlı olmayan ilk 5 rakamının peşi sıra sıfır olmayan bir rakam geliyorsa yukarı yuvarlanır.
\n", "\tÖrn. 1.2459, 3 anlamlı rakam ile ifade edilmek istenirse 1.25
\n", " \n", "* Anlamlı olmayan ilk 5 rakamının peşinden rakam gelmiyor ya da sıfır geliyorsa 5’ten önceki rakam çiftse olduğu gibi bırakılır, tekse yukarı yuvarlanır.
\n", "\tÖrn. 1.245, 3 anlamlı rakam ile ifade edilmek istenirse 1.24
\n", "\tÖrn. 1.235, 3 anlamlı rakam ile ifade edilmek istenirse 1.24\n", " \n", "“n” basamağa yuvarlamakla “n” anlamlı rakama yuvarlamak farklı şeylerdir!\n", "\n", "Şimdi Python'daki temel yuvarlama fonksiyonlarına bakalım. Python'un kendi fonksiyonu (ing. built-in) olan `round` argüman olarak verilen bir sayıyı, yine argüman olarak verilen bir basamağa kadar yukarıdaki stratejiyi takip ederek yuvarlar. Basamak sayısının varsayılan değeri sıfırdır, sağlanmadığında sayı tam sayıya yuvarlanır." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sayi = 123.456789\n", "n = 2\n", "print(\"{:.6f} sayisinin {:d} basamaga yuvarlanmis hali {:g}\".format(sayi, n, round(sayi,n)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`round()` fonksiyonu yuvarlama yaparken yukarıda verilen genel kuralları takip eder, yani yuvarlama yapılan sayı aşağı ve yukarı yuvarlandığında alacağı değere eşit uzaklıktaysa (5 ile bitiyorsa!) yuvarlama bir önceki sayıyı çift yapacak şekilde yapılır." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(round(-0.5))\n", "print(round(0.5))\n", "print(round(1.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ancak, bu kurala uyulmakla birlikte, bu kuralın geçerli olduğunun sanıldığı her durum düşünüldüğü gibi olmayabilir. Bunun nedeni herhangi bir sayı sisteminde tüm reel sayıların temsil edilmesinin mümkün olmamasıdır. Bilgisayarlar ikilik sayı sisteminde çalışırlar. Bu nedenle temsilinin çok kolay olduğu düşünülen bazı sayıları mükemmel temsil edebilmek için sonsuz sayıda basamağa ihtiyaç duyarlar (örneğin onluk sayı sistemindeki 0.1 sayısını ikilik sayı sisteminde temsil etmeyi deneyebilirsiniz!). Bu nedenle her zaman beklenen sonuç alınamayabilir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"{:.3f} sayısını 2 basamaga yuvarlarsaniz {:.2f} sonucunu elde edersiniz.\".format(2.675, round(2.675,2)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bunun sebebi ikilik sayı sisteminde 2.675 sayısının mükemmel temsil edilemiyor oluşudur." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"{:.32f}\".format(2.675))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Benzer şekilde 12.345 sayısı `round` fonksiyonu ile 2 basamağa yuvarlarken, genel kural takip edilmiyormuş gibi görünse de bunun sebebi 12.345 sayısının ikili sistemde tam olarak temsil edilemiyor oluşudur." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sayi = 12.345\n", "n = 2\n", "print(\"{:.6f} sayisinin {:d} basamaga yuvarlanmis hali {:g}\".format(sayi, n, round(sayi,n)))\n", "print(\"{:.16f}\".format(12.345))\n", "sayi = 12.335\n", "print(\"{:.6f} sayisinin {:d} basamaga yuvarlanmis hali {:g}\".format(sayi, n, round(sayi,n)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## math Kütüphanesi Tam Sayıya Yuvarlama Fonksiyonları ##\n", "\n", "`math` kütüphanesinde herhangi bir sayıyı tam sayıya yuvarlamak üzere kesip atma `truncate`, her zaman yukarı yuvarlama `ceil` (sayıya en yakın ama ondan büyük tamsayıyı bulma) ve her zaman aşağı yuvarlama `floor` fonksiyonları (sayıya en yakın ama ondan küçük tamsayıyı bulma) bulunmaktadır. Bu fonksiyonların kullanımına birer örnek aşağıda verilmektedir." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "from math import ceil,floor,trunc\n", "sayi = -2.852\n", "n = 1\n", "print(\"{:.3f} sayisinin {:d} basamaga kesilmis hali {:g}\".format(sayi, n, trunc(sayi)))\n", "print(\"{:.3f} sayisinin {:d} basamaga yukari yuvarlanmis hali {:g}\".format(sayi, n, ceil(sayi)))\n", "print(\"{:.3f} sayisinin {:d} basamaga asagi yuvarlanmis hali {:g}\".format(sayi, n, floor(sayi)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Yuvarlama Stratejileri ##\n", "\n", "Sayıların on parmağımızla saydığımız için alışkın olduğumuz onluk sayı sistemine göre, ikilik sayı sisteminde farklı ve bazen mükemmel olmayan şekilde temsil ediliyor olmalarına ilişkin sorunları `Decimal` modülünde ele alacağız. Bu noktadan itibaren yuvarlama stratejileri ile ilgilenmeyi sürdürelim.\n", "\n", "### Kesme ###\n", "\n", "Bir sayının ($x$) istenen belirli bir basamaktan ($k$) sonrasını kesip atmak için öncelikle sayı $10^k$ ile çarpılır ve böylece sayının tam kısmı ile ondalık kısmının ayıran nokta $k$ basamak sağa kaydırılmış olunur. Bu çarpımın tamsayı kısmı alınır ki istenen basamaktan sonrası atılmış olsun. Daha sonra noktası $k$ basamak sağa kaydırılarak tamsayı kısmı ($int$) alınmış bu sayı $10^k$ ile bölünerek nokta eski yerine kaydırılır. Bunu yapan bir Python fonksiyonu yazalım." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def kesme(x, k = 0):\n", " return int(x * 10**k) / 10**k" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornek 1 (pozitif sayi)\n", "sayi = 12.3456789\n", "basamak = 4\n", "print(\"{:.7f} sayisinin {:d}. basamağından sonrası kesilirse {:g} elde edilir.\".\\\n", " format(sayi, basamak, kesme(sayi,basamak)))\n", "# Ornek 2 (negatif sayi)\n", "sayi = -9.876543210\n", "basamak = 2\n", "print(\"{:.8f} sayisinin {:d}. basamağından sonrası kesilirse {:g} elde edilir.\".\\\n", " format(sayi, basamak, kesme(sayi,basamak)))\n", "# Ornek 3 (tam sayi)\n", "sayi = 123.45\n", "print(\"{:g} sayisinin tamsayi kismi {:g}.\".format(sayi, kesme(sayi)))\n", "# Ornek 4 (negatif basamak, -noktanin solundan kesme-)\n", "sayi = 1234.56\n", "basamak = -2\n", "print(\"{:.2f} sayisi noktanin {:d} basamak solundan kesilirse {:g} elde edilir.\".\\\n", " format(sayi, -1*basamak, kesme(sayi,basamak)))\n", "# Ornek 5 (negatif basamak, negatif sayi -noktanin solundan kesme-)\n", "sayi = -789.6543\n", "basamak = -1\n", "print(\"{:.4f} sayisi noktanin {:d} basamak solundan kesilirse {:g} elde edilir.\".\\\n", " format(sayi, -1*basamak, kesme(sayi,basamak)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Yukarı Yuvarlama ###\n", "\n", "Bir sayının ($x$) istenen belirli bir basamaktan ($k$) sonrasını daimi olarak yukarı yuvarlamak için, herhangi bir sayıya en yakın ama ondan büyük sayıyı bulan `ceil` fonksiyonu kullanılabilir. Tıpkı kesme fonksiyonunda yaptığımız gibi noktayı $k$ basamak kaydırmak üzere sayıyı $10^k$ ile çarptıktan sonra doğrudan tamsayı kısmını almak yerine ona en yakın ancak büyük tamsayıyı `ceil` fonksiyonu kullanarak alırsak sayıyı yukarı yuvarlamak yönünde ilerlemiş oluruz. Bundan sonra yapmamız gereken noktayı tekrar eski yerine götürmek üzere sayıyı $10^k$ ile bölmektir. Aşağıda bu fonksiyon yer almaktadır." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import ceil\n", "def yukari_yuvarla(x, k = 0):\n", " return ceil(x * 10**k) / 10**k" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornek 1 (pozitif sayi)\n", "sayi = 12.3456789\n", "basamak = 4\n", "print(\"{:.7f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir.\".\\\n", " format(sayi, basamak, yukari_yuvarla(sayi,basamak)))\n", "# Ornek 2 (negatif sayi)\n", "sayi = -9.876543210\n", "basamak = 2\n", "print(\"{:.8f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir. (negatif sayıya dikkat!)\".\\\n", " format(sayi, basamak, yukari_yuvarla(sayi,basamak)))\n", "# Ornek 3 (tam sayi)\n", "sayi = 123.45\n", "print(\"{:g} sayisinin tamsayi kismi yukari yuvarlandiginda {:g}.\".format(sayi, yukari_yuvarla(sayi)))\n", "# Ornek 4 (negatif basamak, -noktanin solundan yukari_yuvarla-)\n", "sayi = 1234.56\n", "basamak = -2\n", "print(\"{:.2f} sayisi noktanin solundaki {:d} basamaktan itibaren yukari yuvarlanirsa {:g} elde edilir.\".\\\n", " format(sayi, -1*basamak, yukari_yuvarla(sayi,basamak)))\n", "# Ornek 5 (negatif basamak, negatif sayi -noktanin solundan yukari_yuvarla-)\n", "sayi = -789.6543\n", "basamak = -1\n", "print(\"{:.4f} sayisi noktanin solundaki {:d} basamaktan itibaren yukari yuvarlanirsa {:g} elde edilir. (Dikkat!)\".\\\n", " format(sayi, -1*basamak, yukari_yuvarla(sayi,basamak)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aşağı Yuvarlama ###\n", "\n", "Aynı şeklide bir sayının ($x$) istenen belirli bir basamaktan ($k$) sonrasını daimi olarak aşağı yuvarlamak için de herhangi bir sayıya en yakın ama ondan küçük sayıyı bulan `floor` fonksiyonu kullanılabilir. Aşağıda bu işlemi yapan bir Python fonksiyonu yer almaktadır." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import floor\n", "def asagi_yuvarla(x, k = 0):\n", " return floor(x * 10**k) / 10**k" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornek 1 (pozitif sayi)\n", "sayi = 12.3456789\n", "basamak = 4\n", "print(\"{:.7f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir.\".\\\n", " format(sayi, basamak, asagi_yuvarla(sayi,basamak)))\n", "# Ornek 2 (negatif sayi)\n", "sayi = -9.876543210\n", "basamak = 2\n", "print(\"{:.8f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir. (negatif sayıya dikkat!)\".\\\n", " format(sayi, basamak, asagi_yuvarla(sayi,basamak)))\n", "# Ornek 3 (tam sayi)\n", "sayi = 123.45\n", "print(\"{:g} sayisinin tamsayi kismi asagi yuvarlandiginda {:g}.\".format(sayi, asagi_yuvarla(sayi)))\n", "# Ornek 4 (negatif basamak, -noktanin solundan asagi_yuvarla-)\n", "sayi = 1234.56\n", "basamak = -2\n", "print(\"{:.2f} sayisi noktanin solundaki {:d} basamaktan itibaren asagi yuvarlanirsa {:g} elde edilir.\".\\\n", " format(sayi, -1*basamak, asagi_yuvarla(sayi,basamak)))\n", "# Ornek 5 (negatif basamak, negatif sayi -noktanin solundan asagi_yuvarla-)\n", "sayi = -789.6543\n", "basamak = -1\n", "print(\"{:.4f} sayisi noktanin solundaki {:d} basamaktan itibaren asagi yuvarlanirsa {:g} elde edilir. (Dikkat!)\".\\\n", " format(sayi, -1*basamak, asagi_yuvarla(sayi,basamak)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Yuvarlama Yanlılığı ##\n", "\n", "Gerek yukarı yuvarlama (pozitif sonsuz yönünde), gerek aşağı yuvarlama (negatif sonsuz yönünde) ve gerekse kesme (sıfır yönünde) yanlılığa (ing. rounding bias) sahiptir. Bu yanlılıkları örneklemek üzere aşağıda verilen dizinin her üç yöntemle alınan ortalmalarına bakalım." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import statistics as stats\n", "veri = [4.256, 0.230, -5.276, -1.571, 4.275, -9.125]\n", "# Yukari yuvarlama\n", "veri_yukari_yuvarlama = [yukari_yuvarla(d, 2) for d in veri]\n", "print(\"Dizi yukari yuvarlandiginda elde edilen ortalama:\", stats.mean(veri_yukari_yuvarlama))\n", "# Asagi yuvarlama \n", "veri_asagi_yuvarlama = [asagi_yuvarla(d, 2) for d in veri]\n", "print(\"Dizi asagi yuvarlandiginda elde edilen ortalama: \", stats.mean(veri_asagi_yuvarlama))\n", "# Kesme\n", "veri_kesme = [kesme(d, 2) for d in veri]\n", "print(\"Diziye kesme islemi uygulandiginda elde edilen ortalama: \", stats.mean(veri_kesme))\n", "# Dizinin yuvarlama yapilmadan ortalamasi\n", "print(\"Dizinin yuvarlama yapilmadan elde edilen ortalama: \", stats.mean(veri))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yuvarlama işleminde bu yanlılıklardan olabildiğince kaçınmak isteriz. Ayrıca sayıları her zaman yukarı ya da aşağı yuvarlamak yerine yuvarlayacağımız basamaktan sonra gelen basamaklara bakarak aşağı ya da yukarı yuvarlamak da isteriz. Bu durumda son basamak 5 olduğu (ya da 5'ten sonra gelen tüm basamakların 0 olduğu) vakit bir seçim yapmamız gerekir. Bu seçimi her iki yönde de (aşağı ya da yukarı) yapabiliriz. Aşağıda bu iki seçim için de birer fonksiyon verilmiştir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import ceil,floor\n", "def yuvarla_bes_yukari(x, k = 0):\n", " return floor(x*10**k + 0.5) / 10**k\n", "def yuvarla_bes_asagi(x, k = 0):\n", " return ceil(x*10**k - 0.5) / 10**k" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ornekler\n", "print(yuvarla_bes_yukari(10.32, 1))\n", "print(yuvarla_bes_yukari(10.38, 1))\n", "print(yuvarla_bes_yukari(10.35, 1))\n", "print(yuvarla_bes_yukari(-1.35, 1))\n", "print(yuvarla_bes_asagi(10.32, 1))\n", "print(yuvarla_bes_asagi(10.38, 1))\n", "print(yuvarla_bes_asagi(10.35, 1))\n", "print(yuvarla_bes_asagi(-1.35, 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu iki fonksiyon son rakam 5 olduğu vakit bir çözüm sunmakta ancak yanlılık sorununa bir çözüm getiriyor gibi görünse de aslında çok fazla sayıda bu tür sayı üzerinden yuvarlama yapıldığında yine yanlılığa neden olabilmektedirler." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import statistics as stats\n", "veri5 = [-2.115, 4.305, 3.465, -9.305]\n", "# Yukari yuvarlama\n", "veri5_bes_yukari = [yuvarla_bes_yukari(d, 2) for d in veri5]\n", "print(\"Dizide 5 ile biten sayilar yukari yuvarlandiginda elde edilen ortalama:\", stats.mean(veri5_bes_yukari))\n", "# Asagi yuvarlama \n", "veri5_bes_asagi = [yuvarla_bes_asagi(d, 2) for d in veri5]\n", "print(\"Dizide 5 ile biten sayilar asagi yuvarlandiginda elde edilen ortalama:\", stats.mean(veri5_bes_asagi))\n", "# Dizinin yuvarlama yapilmadan ortalamasi\n", "print(\"Dizinin yuvarlama yapilmadan elde edilen ortalama: \", stats.mean(veri5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu davranışın nedeni her iki fonksiyonun da 0 etrafında simetrik olmamasıdır. Matematikte 0 etrafında simetrik fonkskiyon $f(x) + f(-x) = 0$ şeklinde tanımlanır. Bu fonksiyonların neden simetrik olmadıklarını basit bir örnekle görelim." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sayi1 = -1.5\n", "sayi2 = 1.5\n", "print(\"f(1.5) + f(-1.5) = \", yuvarla_bes_yukari(sayi1) + yuvarla_bes_yukari(sayi2))\n", "print(\"f(1.5) + f(-1.5) = \", yuvarla_bes_asagi(sayi1) + yuvarla_bes_asagi(sayi2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu simetriyi getirmek için bu iki fonksiyonu aşağıdaki şekilde birleştirebiliriz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def yuvarla_bes_simetrik(x, k = 0):\n", " if x >= 0:\n", " return yuvarla_bes_yukari(x, k)\n", " else:\n", " return yuvarla_bes_asagi(x, k)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sayi1 = -1.5\n", "sayi2 = 1.5\n", "print(\"f(1.5) + f(-1.5) = \", yuvarla_bes_simetrik(sayi1) + yuvarla_bes_simetrik(sayi2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Fonksiyon bu simetriye sahip olduğu için yanlılıktan kaçınmayı da sağlıyor gibi görünmektedir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import statistics as stats\n", "veri5 = [-2.115, 4.305, 3.465, -9.305]\n", "# Simetrik yuvarlama\n", "veri5_bes_simetrik = [yuvarla_bes_simetrik(d, 2) for d in veri5]\n", "print(\"Dizide 5 ile biten sayilar simetrik yuvarlandiginda elde edilen ortalama:\", stats.mean(veri5_bes_simetrik))\n", "# Dizinin yuvarlama yapilmadan ortalamasi\n", "print(\"Dizinin yuvarlama yapilmadan elde edilen ortalama: \", stats.mean(veri5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ancak bu kez de 0'a yanlılık oluştuğundan sadece pozitif, sadece negatif, ya da pozitif veya negatif sayıların çoğunlukta olduğu dizilerde yanlılığa yol açar." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import statistics as stats\n", "veri5_pozitif = [2.115, 4.305, 3.465, 9.305]\n", "# Simetrik yuvarlama\n", "veri5_bes_pozitif_simetrik = [yuvarla_bes_simetrik(d, 2) for d in veri5_pozitif]\n", "print(\"Tamamı pozitif dizide 5 ile biten sayilar simetrik yuvarlandiginda elde edilen ortalama:\", \\\n", " stats.mean(veri5_bes_pozitif_simetrik))\n", "# Dizinin yuvarlama yapilmadan ortalamasi\n", "print(\"Dizinin yuvarlama yapilmadan elde edilen ortalama: \", stats.mean(veri5_pozitif))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu yanlılıklardan kaçınmak ve ek olarak sürece bir rastgelelik getirmek üzeren baştaki kurala dönecek olursak; 5 ile biten sayılarda bir önceki sayı çiftse sayıyı olduğu gibi bırakmak, tekse çift sayıya yuvarlamak yoluna gidilmesi iyi bir çözümdür. Bu strateji aynı zamanda Python'un kendi (built-in) fonksiyonu olan `round` fonksiyonunun da yuvarlama stratejisinin temelini oluştuur ve yuvarlama aritmetiğinin temelini oluşturan [IEEE-754 no'lu standart](https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules) ile de takip edilmektedir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(round(1.75, 1))\n", "print(round(1.25, 1))\n", "print(round(-1.25, 1))\n", "print(round(-1.75, 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ancak bu durum yuvarlanmak istenen sayının son basamağı 5 olduğunda (ya da 5'ten sonraki bütün basamakları 0 olduğunda) böyledir. Ancak bir sayının tam olarak temsil edilememesi sorunu kaynaklı olarak beklenmedik durumlar yine de oluşabilir. Dersin başındaki örneğe dönecek ve hatırlayacak olursak $2.675$ sayısı mükemmel olarak temsil edilemediğinden iki basamağa `round` fonksiyonu ile yuvarlandığında elde edilen sayı $2.68$ olması gerekirken $2.67$ olmuştur. Alışkın olduğumuz ondalık sistemdeki sayıların ikilik sistemde temsili temelinde soruna çözüm getiren (ki hiçbir sayı sistemi tüm sayıları mükemmel olarak temsil edemez) `Decimal` fonksiyonu ile hataya ilişkin kavramlardan sonra ilgileneceğiz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(round(2.675, 2))\n", "print(\"{:.32f}\".format(2.675))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Hata Tanımları #\n", "\n", "Yuvarlama yanlışları hata kaynaklarından sadece birisidir. Gerçekte yapılan hiçbir ölçüm tam olarak doğru değildir. Bir ölçümün doğruluğu ve hassasiyeti (anlamlı rakam sayısı) kullanılan ölçüm cihazlarının kalitesine, gözlemcinin becerisine ve deneyin dayandığı temel fiziğe bağlıdır. Deney ya da gözlem yapan kişinin sorumluluğu sınırlı sayıda ölçümden yola çıkarak ölçtüğü niteliğin gerçek değerinin içinde bulunduğu bir aralık vermesidir.\n", "\n", "Bir niteliğin her bir ölçümünün sonucu bir diğeri ile neden aynı olmaz? Gözlem ya da deney yapan kişinin hatalarını (ing. mistake) bir kenara bırakacak olursak (iyi gözlemci yaptığı hataları da açık bir şekilde rapor eder ve sonrasında düzeltir); iki tip hatadan bahsedebiliriz: sistematik ve rastgele hata. Burada hata (ing. error) terimini ölçüm verisinin değişimini (aynı niteliğin farklı ölçüm sonuçları) anlatmak üzere belirsizlik (ing. uncertainty) ve sapma (ing. deviation) terimleriyle eş anlamlı olarak kullanıyoruz.\n", "\n", "1) Sistematik hata, ölçüm sistemindeki bir kalibrasyon problemi (sıfır seviyesi), ya da ölçülen nitelik üzerine bir yanlılık getiren dış etkenlerden (örneğin astronomik gözlemlerde Yer atmosferi etkisi gibi) kaynakanır ve ölçüm sonucunun gerçek değerinden farklı bulunmasına yol açar. Deney ya da gözlemin doğru tasarlanması, kalibrasyon problemlerinin giderilmesi ya da etkilierinin belirlenmesi ve ek ölçümlerin (örneğimizde standart yıldız gözlemleri, fark ışık ölçüm (diferansiyel fotometri) ya da uzaydan gözlem) yapılması gibi yollarla belirlenip, aşılabilir. Gözlemleri genellikle bir çarpan ya da kayma (ofset) miktarı kadar etkiler, ortadan kaldırılması için bu çarpan ya da kaymanın belirlenmesi gerekir.\n", "\n", "2) Sistematik hataların giderilmesi durumunda dahi hala ölçümlerin üzerinde hatalar olacaktır. Bu hatalar rastgele hatalardır ve belirlenmelerinde bazı istatistiksel yaklaşımlara, ifade edilmelerinde ise istatistik terimlerine ihtiyaç duyulur.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rastgele Hata Kavramları ##\n", "\n", "a) Ölçüm aletinin limitlerinden kaynaklanan hatalar ve ölçülebilecek en küçük nicelik problemi rastgele hatanın önemli kaynaklarından biridir. Bir aracın hız ve kilometre göstergelerinde önreklediğimiz bu problem kaynaklı rastgele hatanın ifadesi için eğer ölçülebilien en küçük iki nicelik (santimetrelik cetvelde iki santimerenin arası) arasında yeterince büyük bir uzaklık varsa 1/10'a varan hassasiyete (örneğimizde milimetre) kadar tahmin yapılabilir. Ancak nicelikler birbirine yakınsa (önreğin milimetrik cetvelde olduğu gibi) bu kez hata en küçük ölçülebilen niceliğin yarısı olarak (örneğimzde 0.5 mm) verilmelidir. Ölçüm limitinin çok çok küçük olması durumunda ise güvenli bir yol olarak en küçük limite başvurulabilir (mikron hassasiyetinde bir cetvelde 1 mikron gibi). \n", "\n", "b) Tahimini Belirsizlik (Estimated Uncertainty): Ölçüm yapılırken her zaman ölçüm aletini limitlerinde çalışmak mümkün olmaz. Örneğin CCD gözlemlerinde CCD'yle teleskobun aynası arasındaki mesafeyi milimetre duyarlılığında ölçüyor olabilirsiniz. Bu şekilde aynanın CCD üzerine görüntüyü hangi uzaklıktayken odakladığını milimetre duyarlılığında ölçmeniz mümkün olur. Ancak bu uzaklığı bir miktar (örneğin 5 mm) değiştirseniz odağın değişmediğini farkederseniz (ki bu mümkündür ve olağandır) tahmini belirsizlik bu değerin yarısı olan 2.5 mm'ye çıkar. Bir başka örnek olarak elinizde 0.01 gramlık ağırlıkların olduğunu ve çift kollu bir terazide bu ağırlıkları kullanarak bir ölçüm yaptığınızı düşünün. Teoride hatanız 0.01 gram kadardır, ancak terazinin bir tarafının hareket ettiğini ancak 3 gramda farkedebiliyorsanız bu tahmini belirsizliğinizin 1.5 gram olduğu anlamına gelir. Örnekler çoğaltılabilir.\n", "\n", "c) Ortalama - Standart Sapma (Average - Standard Deviation): Bir niceliği ölçmek ve üzerindeki hatayı belirlemek için iyi bir yol, aynı niceliği defalarca ölçüp ortalamasını almak; hatası için de bir nicelikten diğerine değişimin bir ölçütünü (ortalama ya da standart sapma gibi) kullanmaktır. Örnek olarak aşağıdaki zamanlama ölçümlerini (1. sütun) inceleyelim. Ortalama değerler için <> sembolleri kullanılmıştır. Ortalamadan farkların toplamı (2. sütun) hiçbir bilgi vermezken, farkların mutlak değerleri toplamı ortalama sapma olarak tanımlanır ve ölçüm hatası konusunda bir fikir verir. Ortalamadan farkların kareleri toplamının N ölçüm sayısı (N-1)'e bölümünün karekökü ise standart sapmayı verir ve çoğunlukla σ ile gösterilir.. Genellikle ortalama değer ve standart sapma ölçüm duyarlllığından bir fazla basamak kullanılarak ifade edilir!\n", "\n", "$$ \\sigma = \\frac{\\Sigma (x_i - \\bar{x})^2}{N - 1} $$\n", "\n", "d) Standart Hata (Standard Error): Standart hata özünde ortalamanın hatasıdır. Ortalama da bir değişendir ve popülasyondan alınan bir örnekten diğerine değişir. Popülasyon hakkında bilgi sahibi olunmadığı zaman ondan alınan örneklerin ortalamaların dağılımı oluşturulur, Bu dağılımın standart sapması popülasyonun ortalamasının hatası, yani standart hatadır. Matematiksel olarak standart sapmanın ölçüm sayısının kareköküne bölünmesiyle elde edilir. Dolayısı ile ölçüm sayısına bağlıdır ve ne kadar çok ölçüm yapılırsa o kadar küçülür. Bu nedenle rastgele hatalarının fazla olmadığını (ölçümlerin dar bir aralıkta dağıldığını) göstermek isteyen ve bunun için defalarca ölçüm yapmak olanağına sahip olan araştırmacılar aynı niceliği defalarca ölçtükten sonra standart hata parametresini beilrler ve ölçümlerindeki rastgele hatayı (ya da belirsizliği) göstermek üzere bu parametreyi kullanırlar. Yukarıdaki örnek için standart hata 0.50 / √4 = 0.25 'tir. Aynı standart sapmanın 25 ölçüm boyunca korunduğunu düşünseniz; standart hata 0.50 / √25 = 0.1 'e kadar düşer!\n", "\n", "$$ st.hata = \\frac{\\sigma}{\\sqrt{N}} $$\n", "\n", "Göreli (Bağıl) ve Mutlak Hata Kavramları (ing. Relative vs. Absolute Errors): Dersin başında gördüğünüz gibi x +/- Δx şeklinde ifade edilen bir ölçümdeki hata (hatanın hangi parametre ile verildiğinden bağımsız olarak) mutlak hata olarak bilinir. x +/- Δx / x şeklinde ifade edilen bir ölçümdeki Δx / x hatası ise göreli (bağıl) hata adını alır. Göreli hata 100 ile çarpılarak yüzde (%) cinsinden de ifade edilebilir. Yaptığınız hata ile herhangi bir uygulamada ölçümün gerektirdiği hata limiti (tolerans) arasındaki fark da multak ya da göreli (oransal ya da yüzde) olarak ifade edilebilir.\n", "\n", "Örnek: R = 1200 Ω olan bir direncin toleransı %5 ise kullanılacak dirençte yapılabilecek maksimum mutlak hata 1200*0.05 = 60 Ω olmalıdır.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu belirsizlik ölçütlerinden hangisini kullanaarak rastgele hatanın ifade edileceğine duruma göre gözlemci kendi karar verir. Her durumda birden fazla güvenilir ölçüm bulunmayabilir, ölçüm yapılan sistemin duyarlılığı (ölçülebiliecek en küçük nicelik) belirlenmemiş, bilinmiyor ya da değişken olabilir (örneğin fotometrik gözlemlerde ölçebileceğiniz minimum parlaklık geceden geceye en azından atmosferik koşullara bağlı olarak değişim gösterir). Her parametrenin bulunduğu durumlarda kötümser davranıp bunlardan en yüksek hatayı göstereni tercih edilebileceği gibi bunların ortalaması da alınabilir. Önemli olan rastgele hatanın hangi parametre ile verildiğinin açıkça belirtilmesidir (ölçüm duyarlılık limiti mi, standart ya da ortalama sapma mı, tahmini belirsizlik mi yoksa standart hata mı?). \n", "\n", "[7.6 +/- 0.4 saniye] gibi bir ölçüm sonucuyla karşılaştığınızda tüm ölçümlerin bu 7.2 ile 8.0 saniye arasında sonuç verdiğini düşünüyor olabilirsiniz. Ölçümlerin verildiği bir önceki slayta bakacak olursanız durumun böyle olmadığını (en azından her zaman olmak zorunda olmadığını) görürsünüz. İstatistiksel olarak tüm ölçümlerin %68'i ortalamanın +/- 1$\\sigma$, %95'i +/- 2$\\sigma$, %99.8'i ise +/- 3$\\sigma$ aralığıında sonuç verir. Bu sonuç, ölçümlerin normal (Gaussyen) dağıldığı ve yeterili sayıda ölçüm yapıldığı varsayımlarına dayanır. Bir başka (ve daha istatistiksel terminolojiye uygun) bir ifade; eğer ölçümlerin ortalama etrafındaki dağılımlarını ifade etmek üzere standart sapma ölçütü kullanılıyorsa, [7.6 +/- 0.4 saniye] şeklinde ifade edilen bir ölçüm için yapılacak bir sonraki ölçümde beklentinin 7.6 saniyelik bir ölçüm yapmak ve bunun %68'lik bir güvenilirlikle (ing. confidence) [7.2 ile 7.8 saniye] arasında, %95 güvenilirlikle [6.8 ile 8.4 saniye] arasında gerçekleştiğinin ifade edilmesidir.\n", "\n", "Bu durumda teorik değerlerle karşılaştırmalar da yapmak mümkün olur. Örneğin belirli bir madde için yoğunluk ölçümleriniz $2.65 \\pm 0.04 g cm^{-3}$ sonucunu veriyor ancak bu maddenin verilen yoğunluğu $2.71 g cm^{-3}$ olsun. (Yeterli sayıda ölçüm yaptığınız ve ölçüm “hatasını” standart sapmayla verdiğniz varsayımı altında) bulduğunuz değer verilen değerin 2$\\sigma$ uzağında olduğu için kabul edilebilirdir. Zira bunun gerçekleşme olasılığı (ölçümler Gaussyen dağılyor ve ölçüm aletinde bir yanlılık yoksa) %5 kadardır. Oysa sonucunuz $2.65 \\pm 0.01 g cm^{-3}$ olsaydı bu kabul edilemezdi!\n", "\n", "Örnekler:\n", "\n", "i) $3.42 \\pm 0.04$ s ile $3.48$ s,
\n", "ii) $13^m.106 \\pm 0^m.014$ ile $13^m.206$,
\n", "iii) $(2.95 \\pm 0.03) x 10^8$ m/s ile $3.00 x 10^8$ m/s
\n", "\n", "tutarlı mıdır?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Gözlemci Hatası ##\n", "\n", "Sistematik hatalara benzeyen ancak saptanması oldukça güç hatalardır. Gözlemcinin kendi girdiği verilerde 2.34 yerine 2.43 yazması, ölçeği yanlış değerlendirmesi (logaritmik yerine lineer ölçek kullanması ya da tersi), birimleri yanlış değerlendirmesi (değerleri metrik birim sistemi yerine emperyal birim sisteminde kullanması) ya da ölçüm aletinin daha önce yapılan ölçümlerdekinden farklı bir modda kullanılması gibi hatalardır. İyi bir gözlemci bu tür hataları (ing. mistake) minimuma indiren gözlemcidir. Bu tür hatalar minimum olduğunda belirlemek ve etkisini gidermek de kolaydır." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hatanın Yayılması ##\n", "\n", "Diyelim ki ölçümü yapılan üç birbirinden bağımsız nicelik x, y ve w üzerindeki belirsizlikler (ortalama – standart sapma, tahmini belirsizlik ...) $\\Delta x$, $\\Delta y$ ve $\\Delta \\omega$ olsun. Bir başka deyişle ölçümler $x \\pm \\Delta x$, $y \\pm \\Delta y$ ve $\\omega \\pm \\Delta \\omega$ ile ifade ediliyor olsunlar. z ise birbirinden bağımsız bu nicelilklerin bir fonksiyonu olsun $z = f(x, y, \\omega)$. Bu durumda z üzerindeki belirsizilğin tespiti için f fonksiyonu, $z_0(\\omega_0, x_0, y_0)$ civarında Taylor serisine açılır. Deney ve ölçümlerde genellikle amaç $dx$, $dy$ ve $d\\omega$’yı çok küçük tutmak olduğundan Taylor açılımında ikinci seriden sonrası ihmal edilir. Taylor açılımından gelen kısmi türev terimleri, değişkenlerden birinde yapılacak küçük bir değişikliğin fonksiyonu ne şekilde değiştirdiğini belirlediğinden niceliklerin üzerindeki belirsizilikleri ($\\Delta x$, $\\Delta y$ ve $\\Delta \\omega$) ağırlıklandırma işlevi görmektedir. Eğer değişkenler birbirleri ile korele iseler bu kez kovaryans terimlerini de dahil etmeye ihtiyaç duyulur.\n", "\n", "Genel ifade \n", "\n", "$$ z = z_0 + (\\frac{\\partial f}{\\partial x})_{y_0,\\omega_0} \\Delta x + (\\frac{\\partial f}{\\partial y})_{x_0,\\omega_0} \\Delta y + (\\frac{\\partial f}{\\partial \\omega})_{x_0,y_0} \\Delta \\omega $$\n", "\n", "şeklinde verilir.\n", "\n", "Burada $\\Delta x$, $\\Delta y$ ve $\\Delta \\omega$ için ölçüm üzerindeki aletsel hatalar, ölçüm hassasiyeti kaynaklı ölçümdeki belirsizlikler olabileceği gibi pek çok ölçümden hesaplanan ortalamanın standart hatası, varyansı, standart sapması da olabilir.\n", "\n", "Ortalama sapma için ifade\n", "\n", "$$ \\Delta z = |(\\frac{\\partial f}{\\partial x})_{y_0,\\omega_0}| \\Delta x + |(\\frac{\\partial f}{\\partial y})_{x_0,\\omega_0} \\Delta y| + |(\\frac{\\partial f}{\\partial \\omega})_{x_0,y_0} \\Delta \\omega| $$\n", "\n", "Standart sapma için ise\n", "\n", "$$ \\sigma_z = \\sqrt{(\\frac{\\partial f}{\\partial x})^2_{y_0,\\omega_0} \\sigma_x^2 + (\\frac{\\partial f}{\\partial y})^2_{x_0,\\omega_0} \\sigma_y^2 + |(\\frac{\\partial f}{\\partial \\omega})_{x_0,y_0} \\sigma_\\omega^2} $$\n", "\n", "şeklindedir.\n", "\n", "Örnek: $e$ yörünge dış merkezliliğini $\\omega$ enberinin argümanını göstermek üzere $e~cos(\\omega)$ parametresi dikine hız gözlemlernin modellenmesinde önemli bir parametredir. Kullandığımız model programı (örn. [radvel](https://radvel.readthedocs.io/en/latest/)) $e~cos(\\omega)$ parametresi yerine $e$ ve $\\omega$ parametrelerini ayrı ayrı verebilir. Dikine hız gözlemleri sonucu 3 ötegezegen barındırdığı anlaşılan HD136352 yıldızının $d$ gezegeninin yörünge parametreleri porgram tarafından $e = (0.00080 \\pm 0.00122)$, $\\omega= (270.1971 \\pm 0.1700)^{\\circ} = (4.7158 \\pm 0.0030)$ radyan olarak verilmiştir. $e~cos(\\omega)$ ve üzerindeki belirsizlik ($\\Delta e~cos(\\omega)$) nedir?\n", "\n", "$e = 0.00080~cos~(4.7158)$ = 2.75216936 x 10^{-6}$$ olup, çarpmada anlamlı sayı belirleme kuralı gereği en fazla anlamlı rakam (5) içerecek şekilde yuvarlandığnda, $e~cos(\\omega) = 2.7521 x 10^{-6}$ olarak elde edilir.\n", "\n", "$$\\Delta e~cos(\\omega) = |(\\frac{\\partial f}{\\partial e})_{\\omega_0}| \\Delta e + |(\\frac{\\partial f}{\\partial \\omega})_{e_0} \\Delta \\omega| = |cos (\\omega) \\Delta e| + |-e sin (\\omega) \\Delta \\omega| \\Rightarrow \\Delta e~cos(\\omega)= cos (\\omega) \\Delta e + x sin (\\omega) \\Delta e $$\n", "\n", "elde edilir.\n", "\n", "Ortalama sapma için: \n", "\n", "$$\\Delta e~cos(\\omega) = cos (4.7158) 0.00122 + 0.00080 sin(4.7158) 0.0030 = 6.56999388 x 10^{-6} \\Rightarrow \\Delta e~cos(\\omega) = 6.5700 x 10^{-6}$$ \n", "\n", "$$e~cos(\\omega) = 2.7521 x 10^{-6} \\pm 6.5700 x 10^{-6}$$,\n", "\n", "Standart sapma için \n", "\n", "$$\\sigma_{ecos(\\omega)} = sqrt{(cos (4.7158)~0.00122)^2 + (0.00080~sin(4.7158)~0.0030)^2} = 4.8214319 x 10^{-6} \\Rightarrow \\sigma_{ecos(\\omega)} = 4.8214 x 10^{-6} cm$$\n", "\n", "$$e~cos(\\omega) = 2.7521 x 10^{-6} \\pm 4.8214 x 10^{-6}$$\n", "\n", "şeklinde ifade edilir.\n", "\n", "Şimdi sık kullanılan bazı matematiksel işlemler söz konusu olduğunda bu işlemlere tabi tutulan niceliklerin üzerindeki hataların sonuca nasıl yansıtılması ve sonucun nasıl ifade edilmesi gerektiğini çeşitli örneklerle ele alalım.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Varyans ve Kovaryans ###\n", "\n", "Sonuç olarak $u$ ve $v$ bağımsız değişkenlerine bir $f$ fonksiyonu ile bağlı bir $x$ niceliği üzerindeki belirsizlik ($\\sigma_x$) $u$, $v$, ... nicelikleri üzerindeki belirsizliklere (sırasıyla $\\sigma_u$ , $\\sigma_v$, ...) bağlıdır. $u$, $v$ ve diğer değişkenlere bağlı kısmı türevli terimler bu nicelikler üzerindeki küçük değişimlerin $x$’i nasıl etkiledğini belirleyerek, bu nicelikler üzerindeki belirsizliğin ağırlıklandırılması işlevini görürler. Ancak $u$ ve $v$’nin birbirlerine bağımlılığı da önemlidir. $x$’in varyansı gerçekte ölçülen bağımsız parametreler $u$, $v$, ...’nin varyanslarına bağlı olarak aşağıdaki şekilde hesaplanır:\n", "\n", "$$\\sigma_x^2 \\sim \\lim_{N \\to +\\infty} \\frac{1}{N} [(u_1 - \\bar{u})(\\frac{\\partial x}{\\partial u}) + (v_1 - \\bar{v})(\\frac{\\partial x}{\\partial v}) + ...]^2 \\Rightarrow \\lim_{N \\to +\\infty} \\frac{1}{N} [(u_1 - \\bar{u})(\\frac{\\partial x}{\\partial u})^2 + (v_1 - \\bar{v})(\\frac{\\partial x}{\\partial v})^2 + 2(u_1 - \\bar{u})(v_1 - \\bar{v})(\\frac{\\partial x}{\\partial u})(\\frac{\\partial x}{\\partial v}) + ...] $$\n", "\n", "Bu eşitlikteki ilk iki terim varyanslar (\\sigma_u^2 ve \\sigma_v^2) şeklinde ifade edilebilir. Son terim ise kovaryans (\\sigma_{uv}^2) olarak tanımlanır.\n", "\n", "$$\\sigma_u^2 = \\lim_{N \\to +\\infty} [\\frac{1}{N} (u_1 - \\bar{u})^2] $$\n", "\n", "$$\\sigma_v^2 = \\lim_{N \\to +\\infty} [\\frac{1}{N} (v_1 - \\bar{v})^2] $$\n", "\n", "$$\\sigma_{uv}^2 = \\lim_{N \\to +\\infty} [\\frac{1}{N} (u_1 - \\bar{u}) (v_1 - \\bar{v})] $$\n", "\n", "Bu terimlerden hareketle hatanın yayılımı denklemi (ing. error propagation equation) aşağıdaki şekilde veriliir:\n", "\n", "$$\\sigma_x^2 \\sim \\sigma_u^2 (\\frac{\\partial x}{\\partial u})^2 + \\sigma_v^2 (\\frac{\\partial x}{\\partial v})^2 + ... + 2 \\sigma_{uv}^2 (\\frac{\\partial x}{\\partial u}) (\\frac{\\partial x}{\\partial v}) + ... $$\n", "\n", "Kovaryans terimi, $u$, $v$, ...’nin kısmi türevlerinin çarpımıyla ağırlıklandırılmış ve $u$, $v$, … ‘nin birbirileriyle korele olması olasılığını da barındıran terimdir. Eğer $u$, $v$, … korele değillerse, çok sayıda ölçümün yapılması (çok örnek bulunması) durumunda ortalamalardan negatif ve pozitif farklar birbirini dengeleyerek kovaryans terimini önemsiz hale getirir. Bu durumda;\n", "\n", "$$\\sigma_x^2 \\sim \\sigma_u^2 (\\frac{\\partial x}{\\partial u})^2 + \\sigma_v^2 (\\frac{\\partial x}{\\partial v})^2 + ...$$\n", "\n", "iyi bir yaklaştırma olarak karşımıza sıkça çıkar ve dersin ilk bölümünde verilen hatanın yayılması ifadesiyle aynıdır.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1a. Bir Sabitle Toplama ve Çıkarma ###\n", "\n", "$x$ niceliği, $a$ bir sabit olmak üzere ölçülebilen bir $u$ bağımsız niceliğine aşağıdaki şekilde bağlı ise \n", "\n", "$$x = u + a$$\n", "\n", "Bu durumda x üzerindeki belirsizlik:\n", "\n", "$$(\\frac{\\partial x}{\\partial u}) = 1 \\Rightarrow \\sigma_x^2 = (\\frac{\\partial x}{\\partial u})^2 \\sigma_u^2 + (\\frac{\\partial x}{\\partial v})^2 \\sigma_v^2 + ... \\Rightarrow \\sigma_x^2 = 1~ \\sigma_u^2 \\Rightarrow \\sigma_x = \\sigma_u $$\n", "\n", "Bu durumda bağıl hata (ya da belrsizlik) aşağıdaki ifadeyle verilir:\n", "\n", "$$\\frac{\\sigma_x}{x} = \\frac{\\sigma_u}{x} = \\frac{\\sigma_u}{u + a} $$\n", "\n", "Örnek: Bir fotokatlandırıcı ile yapılan gözlem sırasında 15 saniyelik poz süresi içerisinde $N_1 = 1141$ foton sayılmış olsun. Aynı sürede alınmış bir sonraki pozda $N_2 = 21$ foton sayılıyor. Foton sayma deneyi bir Poisson deneyi olduğu (Poisson dağılımına ya da istatistiğiyle uyumlu olduğu) için bu sayımların üzerindeki belirsizliklerin sırasıyla $N_1$ ve $N_2$‘nin karekökü olduğunu biliyoruz. Diyelim ki gökyüzünde aldığımız foton sayıları, 15 saniye içinde ortalama $BG = 8.5$ olarak gerçekleşiyor (her iki poz süresi için ayrı ayrı gökyüzü sayımı almadığımız için gözlen öncesi ya da sonrası yaptığımız arkaalan ölçümlerinin ortalamasını kullandığımızdan bu değer bir tam sayı olmak zorunda değildir). Ayrıca bu değerin zamanla fazla değişmediği, üzerindeki belirslizliğin de buna bağlı olarak çok küçük olduğu varsayımı yapalım. Bu durumda ölçümlerimiz üzerindeki belirsizlik:\n", "\n", "$$x_1 = N_1 - BG = 1141 - 8.5 = 1132.5 \\Rightarrow \\sigma_x = \\sigma_{N_1} = \\sqrt{1141} = 33.78 \\sim 33.8$$\n", "\n", "Göreli belirsizlik,\n", "\n", "$$\\frac{\\sigma_{x_1}}{x_1} = \\frac{33.78}{1132.5} = 0.029 \\sim 0.29~10^{-1} = \\%2.9$$\n", "\n", "$$x_2 = N_1 - BG = 21 - 8.5 = 12.5 \\Rightarrow \\sigma_x = \\sigma_{N_2} = \\sqrt{21} = 4.6$$\n", "\n", "Göreli belirsizlik,\n", "\n", "$$\\frac{\\sigma_{x_2}}{x_2} = \\frac{4.58}{12.5} = 0.367 \\sim 0.37 = \\%37$$\n", "\n", "Sonuç olarak $x_1$ ve $x_2$ nicelikleri anlamlı rakamlara da dikkat edilerek aşağıdaki şekilde ifade edilebilir.\n", "\n", "$$x_1 = 1132.5 \\pm 33.8$$\n", "$$x_2 = 12.5 \\pm 4.6$$\n", "\n", "Görüldüğü üzere Poisson dağılımı gösteren foton sayımı gibi olaylarda ölçüm hatasının mertebesi ölçüm büyüklüğü arttıkça mutlak olarak artarken oransal olarak azalır. Bu nedenle fotometrik (ve spektroskopik) gözlemlerde poz sürelerini yüksek tutarak kaynaktan alınan foton sayılarının yüksek olmasına çalışılır. Böylece Sinyal / Gürültü oranı arttırılımış olur.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1b. Toplama ve Çıkarma ###\n", "\n", "$x$ niceliği, $a$ ve $b$ ağırlıkları birer sabit olmak üzere ölçülebilen $u$ ve $v$ bağımsız değişkenlerine aşağıdaki şekilde bağlı ise \n", "\n", "$$x = a~u + b~v$$\n", "\n", "Bu durumda $x$ üzerindeki belirsizlik:\n", "\n", "$$(\\frac{\\partial x}{\\partial u}) = a, (\\frac{\\partial x}{\\partial v}) = b \\Rightarrow \\sigma_x^2 \\sim \\sigma_u^2 (\\frac{\\partial x}{\\partial u})^2 + \\sigma_v^2 (\\frac{\\partial x}{\\partial v})^2 + 2 \\sigma_{uv}^2 (\\frac{\\partial x}{\\partial u}) (\\frac{\\partial x}{\\partial v}) \\Rightarrow \\sigma_x^2 = a^2~\\sigma_u^2 + b^2~\\sigma_v^2 + 2ab~\\sigma_{uv}^2$$\n", "\n", "$u$ ve $v$’nin birbiriyle korele olması duruumunda $\\sigma_{uv}$ sıfırdan farklıdır. $u$ ‘daki tüm değişimin $v$’deki değişimlerle kompanse edilmesi durumunda $\\sigma_x$ ‘in sıfır olabileceğine de dikkat ediniz!\n", "\n", "Örnek: Fotokatlandırıcı örneğinde gökyüzü sayımlarını sabit bir ortalama değer yerine, 15 saniye içerisinde ölçülmüş tek bir değer ($BG = 9$) olarak alalım. Bu durumda foton sayma deneyindeki standart sapma (foton gürültüsü) $\\sigma_{BG} = \\sqrt{9}$ olur. Bu durumda x üzerindeki belirsizlik aşağıdaki şekilde hesaplanır.\n", "\n", "$$x_1 = N_1 - BG = 1141 - 9 = 1132 \\Rightarrow \\sigma_x^2 = \\sigma_{N_1}^2 + \\sigma_{BG}^2 = N_1 + BG \\Rightarrow \\sigma_x = \\sqrt{1144 + 9} = 33.91 \\sim 34$$\n", "\n", "$x_2$ ölçümü için ise\n", "\n", "$$x_2 = N_2 - BG = 21 - 9 = 12 \\Rightarrow \\sigma_x^2 = \\sigma_{N_2}^2 + \\sigma_{BG}^2 = N_2 + BG \\Rightarrow \\sigma_x = \\sqrt{21 + 9} = 5.48 \\sim 6$$\n", "\n", "Sonuç olarak $x_1$ ve $x_2$ nicelikleri yine anlamlı rakamlara da dikkat edilerek aşağıdaki şekilde ifade edilebilir.\n", "\n", "$$x_1 = 1132 \\pm 34$$\n", "$$x_2 = 12 \\pm 6$$\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Çarpma ve Bölme ###\n", "\n", "$x$ niceliği,$u$ ve $v$ bağımsız değişkenlerinin $a$ sabiti ile ağırlıklandırılmış bir çarpımı ise \n", "\n", "$$x = a~u~v$$\n", "\n", "Bu durumda $x$ üzerindeki belirsizlik:\n", "\n", "$$(\\frac{\\partial x}{\\partial u}) = a~v, (\\frac{\\partial x}{\\partial v}) = a~u \\Rightarrow \\sigma_x^2 \\sim \\sigma_u^2 (\\frac{\\partial x}{\\partial u})^2 + \\sigma_v^2 (\\frac{\\partial x}{\\partial v})^2 + 2 \\sigma_{uv}^2 (\\frac{\\partial x}{\\partial u}) (\\frac{\\partial x}{\\partial v})$$ \n", "\n", "$$\\sigma_x^2 = (a~v~\\sigma_u)^2 + (a~u~\\sigma_v)^2 + 2a^2~uv~\\sigma_{uv}^2$$\n", "\n", "Bu ifade bağıl olarak daha simetrik ve zarif bir şekilde verilebilir.\n", "\n", "$$\\frac{\\sigma_x^2}{x^2} = \\frac{(a~v~\\sigma_u)^2}{x^2} + \\frac{(a~u~\\sigma_v)^2}{x^2} + 2\\frac{a^2~u~v~\\sigma_{uv}^2}{x^2} $$\n", "\n", "$$\\frac{\\sigma_x^2}{x^2} = \\frac{(a~v~\\sigma_u)^2}{(a~u~v)^2} + \\frac{(a~u~\\sigma_v)^2}{(a~u~v)^2} + 2\\frac{a^2~u~v~\\sigma_{uv}^2}{(a~u~v)^2} \\Rightarrow \\frac{\\sigma_x^2}{x^2} = \\frac{\\sigma_u^2}{u^2} + \\frac{\\sigma_v^2}{v^2} + 2\\frac{\\sigma_{uv}^2}{u~v}$$\n", "\n", "Benzer şekilde bölme için,\n", "\n", "$$x = {au}{v} \\Rightarrow \\frac{\\sigma_x^2}{x^2} = \\frac{\\sigma_u^2}{u^2} + \\frac{\\sigma_v^2}{v^2} - 2\\frac{\\sigma_{uv}^2}{u~v}$$\n", "\n", "Örnek:Bir üçgenin alanı tabanıyla yüksekliğinin ikiye bölünmesiyle bulunur ($A = a h / 2$). Diyelim ki üçgenin tabanı milimetrik bir cetvelle $a = 5.0 \\pm 0.1$ cm, yüksekliği $h = 10.0 \\pm 0.3$ cm olarak veriliyor. Üçgenin alanını ve alanın üzerindeki hatayı (belirsizliği) hesaplayınız.\n", "\n", "$$A = \\frac{a~h}{2} = \\frac{5.0~10.0}{2} = 25.0 $$\n", "\n", "$$\\frac{\\sigma_A^2}{A^2} = \\frac{\\sigma_a^2}{a^2} + \\frac{\\sigma_h^2}{h^2} \\Rightarrow \\frac{\\sigma_A^2}{25.0^2} = \\frac{0.1^2}{5.0^2} + \\frac{0.3^2}{10.0^2} = 0.8125 \\sim 0.812 \\Rightarrow \\sigma_A = 0.901~cm^2$$\n", "\n", "Sonuç olarak üçgnenin alanı;\n", "\n", "$$A = 25.0 \\pm 0.9~cm^2$$\n", "\n", "olarak ifade edilir.\n", "\n", "Yükseklik ölçümünün üzerindeki mutlak hata, taban ölçümündeki mutlak hatanın 3 katı olduğu halde, bağıl hata sadece yarısı kadardır ve alanın varyansına 1.52 kat katkı yapar.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Kuvvet Alma ###\n", "\n", "$x$ niceliği, $a$ ve $b$ sabitler olmak üzere $u$ bağımsız değişkenine kuvvet cinsinden bağlıysa,\n", "\n", "$$x = a~u^b$$\n", "\n", "Bu durumda $x$ üzerindeki belirsizlik:\n", "\n", "$$(\\frac{\\partial x}{\\partial u}) = a~b~u^{b-1} = \\frac{b~x}{u} \\Rightarrow \\sigma_x^2 \\sim \\sigma_u^2 (\\frac{\\partial x}{\\partial u})^2 \\Rightarrow (\\frac{b~x}{u} \\sigma_u)^2 \\Rightarrow \\frac{\\sigma_x^2}{x^2} = (b~\\frac{\\sigma_u^2}{u^2})^2 \\Rightarrow \\frac{\\sigma_x}{x} = b~\\frac{\\sigma_u}{u}$$ \n", "\n", "$b = +1$ özel durumu için $x = a~u \\Rightarrow \\sigma_x = a~\\sigma_u \\Rightarrow \\frac{\\sigma_x}{x} = \\frac{\\sigma_u}{u}$\n", "\n", "$b = -1$ özel durumu için $x = \\frac{a}{u} \\Rightarrow \\sigma_x = -a~\\frac{\\sigma_u}{u^2} \\Rightarrow \\frac{\\sigma_x}{x} = -\\frac{\\sigma_u}{u}$\n", "\n", "Negatif işaret gereği, u’daki küçük bir pozitif değişim, x’te de pozitif bir değişime neden olur.\n", "\n", "Örnek: Bir darienin alanı yarıçapının karesiyle orantılıdır ($A = \\pi r^2$). Diyelim ki yarıçap $10.0 \\pm 0.3$ cm olarak ölçülmüş olsun. Dairenin alanını ve hatasını hesaplayınız.\n", "\n", "$$\\frac{\\sigma_A}{A} = 2~\\frac{\\sigma_r}{r} = \\Rightarrow \\frac{\\sigma_A}{\\pi 10.0^2} = 2~\\frac{0.3}{10.0} = 6.0 \\pi ~cm^2$$\n", "\n", "Sonuç\n", "\n", "$$A = 100.0 \\pm 6.0 \\pi~cm^2$$\n", "\n", "olarak verilmelidir.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. Üstel ve Logaritmik Fonksiyon ###\n", "\n", "#### Üstel Fonksiyon ####\n", "\n", "$x$ niceliği, $a$ ve $b$ sabitler olmak üzere $u$ bağımsız değişkenine üstel bağlıysa\n", "\n", "$$x = a~e^{bu}$$\n", "\n", "Bu durumda $x$ üzerindeki belirsizlik:\n", "\n", "$$(\\frac{\\partial x}{\\partial u}) = a~b~e^{bu} = b~x \\Rightarrow \\sigma_x^2 \\sim \\sigma_u^2 (\\frac{\\partial x}{\\partial u})^2 \\Rightarrow \\sigma_x^2 = (b~x~\\sigma_u)^2 \\Rightarrow \\frac{\\sigma_x^2}{x^2} = \\frac{b~x~\\sigma_u^2}{x^2} \\Rightarrow \\frac{\\sigma_x}{x} = b~\\sigma_u$$ \n", "\n", "Eğer $x$, $e$ değil de $a$ gibi herhangi bir sayının $(a)$ üssüne bağlı ise ($x = a^bu$) dönüşüm uygulanır.\n", "\n", "$$x = a^{bu} \\Rightarrow x = (e^{lna})^{bu} = e^{(b~lna)u} \\Rightarrow x = e^{cu}, c = b~lna $$\n", "\n", "$$\\frac{\\sigma_x}{x} = c~\\sigma_u \\Rightarrow \\frac{\\sigma_x}{x} = b~lna~\\sigma_u $$\n", "\n", "#### Logaritma ####\n", "\n", "$x$ niceliği, $a$ ve $b$ sabitler olmak üzere $u$ bağımsız değişkenine logaritma ile bağlıysa\n", "\n", "$$x = a~ln(bu)$$\n", "\n", "Bu durumda $x$ üzerindeki belirsizlik:\n", "\n", "$$(\\frac{\\partial x}{\\partial u}) = \\frac{a~b}{u} \\Rightarrow \\sigma_x^2 \\sim \\sigma_u^2 (\\frac{\\partial x}{\\partial u})^2 \\Rightarrow \\sigma_x^2 = (\\frac{a~b}{u}~\\sigma_u)^2 \\Rightarrow {\\sigma_x} = a~b~\\frac{\\sigma_u}{u}$$ \n", "\n", "Genel not: Bütün bu ifadelerde ölçülen ($u$, $v$, …) değişkenleri üzerindeki belirsizliğin bu değişkenlere dayalı olarak hesaplanan bir nicelik üzerindeki belirsizliğin hızlı bir şekilde tahminine olanak sağlar. Bir sabitle çarpılan ya da bölünen $u$ değişkeni üzerindeki %1’lik hata, ona bağlı $x$ değişkeninde de %1’lik bir belirsizliğe neden olur. Eğer $x$, $u$’nun $b$ kuvvetine bağlı ise, $u$’da yapılacak %1’lik bir hata $x$’e $\\%b$’lik bir belirsizlik olarak yansır. $x$ birden fazla değişkene komplike fonksiyonlarla bağlı olsa dahi ($x = f(u, v, ….)$) ifadeyi bileşenlerine ayırarak hata analizi yapmak mümkündür.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. Trigonometrik Fonksiyonlar ###\n", "\n", "$x$ niceliği, $a$ ve $b$ sabitler olmak üzere $u$ bağımsız değişkenine trigonometrik bir fonksiyon ile (örneğin kosinüs (cos)) bağlıysa\n", "\n", "$$x = a~cos(bu)$$\n", "\n", "Bu durumda $x$ üzerindeki belirsizlik:\n", "\n", "$$(\\frac{\\partial x}{\\partial u}) = -a~b~sin(bu) \\Rightarrow \\sigma_x^2 \\sim (-a~b~sin(bu)~\\sigma_u)^2 \\Rightarrow \\sigma_x = -a~b~sin(bu)~\\sigma_u $$ \n", "\n", "Benzer şekilde;\n", "\n", "$$x = a~sin(bu) \\Rightarrow (\\frac{\\partial x}{\\partial u}) = a~b~cos(bu) \\Rightarrow \\sigma_x = a~b~cos(bu)~\\sigma_u$$\n", "\n", "Burada $\\sigma_u$ bir açı üzerindeki belirsizlik olacağından mutlaka radyan cinsinden ifade edilmelidir.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Aykırı Noktaların Belirlenerek Çıkarılması #\n", "\n", "Astronomide gözlemlerde oluşabilecek teknik ve aletsel problemler, gözlemci hataları ve gözlem koşulları gibi nedenlerle zaman zaman verinin gösterdiği genel eğilimden önemli ölçüde uzaklaşan aykırı noktaları atma ihtiaycı oluşabilir. Örneğin bir dizi CCD görüntüsünden biri alınırken teleskobun takibinde herhangi bir nedenle oluşan hata nedeniyle yıldızların dedektör üzerindeki yerlerinin değişmesi ya da daire profilinden uzaklaşmaları, o görüntü üzerinden yapılacak parlaklık ölçümlerinin açık bir şekilde sapmasına neden olabilir. Bu tür durumları belirleyerek, bu noktaları ortalama, standart sapma ya da fiziksel modeli etkilememeleri için veri setinden çıkarmak üzere pek çok yöntem bulunmaktadır.\n", "\n", "## Standart Sapma Kullanımı ##\n", "\n", "Normal dağıldığı varsayılan çok sayıda ölçümde ortalamadan belirli bir standart sapma uzaklıktaki verileri belirleyip ayıklamaya dayanan yöntemdir. CCD görüntülerinin birleştirilmesi, 1 boyutlu tayfların oluşturulması, dalgaboyu kalibrasyonu gibi astronomların rutin pek çok veri analizi işleminde standart sapmaya dayalı bu yöntem sıklıkla kulllanılmakta ve AstroImageJ, IRAF, iSpec gibi pek çok indirgeme ve analiz rutininde de bu yönteme başvurulmaktadır. Özellikle veri setinde genel ve hızlı değişen trendlerin olmadığı veri setleri için kullanışlıdır" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# np.random.randn fonksiyonuyla normal bir dagilimdan\n", "# rastgele secilen 50000 deger kullanilarak olusturulmus\n", "# bir veri setimiz olsun\n", "rastgeleveri = np.random.randn(50000) * 20 + 20\n", "\n", "# aykiri noktalari temsil edecek bir fonksiyon yazalim\n", "def aykirinokta(veri, k = 3):\n", " # bir numpy dizisindeki (veri), kac standart sapma (k) \n", " # haricindeki degerlerin ayiklanacagini donduren fonksiyon\n", " stsapma = veri.std()\n", " ort = veri.mean()\n", " sinir = k * stsapma\n", " \n", " alt_limit = ort - sinir \n", " ust_limit = ort + sinir\n", " \n", " aykiri_noktalar = veri[(veri > ust_limit) | (veri < alt_limit)]\n", " indeksler = np.argwhere(((veri > ust_limit) | (veri < alt_limit)))\n", " \n", " return aykiri_noktalar,indeksler\n", "\n", "# Rastgele veri setini (kirmizi daire) ve bu veri setinde \n", "# kurala gore aykiri nokta olanlari cizdirelim\n", "# ancak varsayilan 3 sigma yerine 2.75 sigma sinirini kullanalim\n", "plt.plot(rastgeleveri, 'ro')\n", "an, ind = aykirinokta(rastgeleveri, k = 2.75)\n", "plt.plot(ind, an, 'bx')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Chauvenet Kriteri ##\n", "\n", "Chauvenet Kriteri 'ni temel alan yöntemde, aykırı olduğundan şüphelenilen değerin ortalama değerden sapmasının olasılığı, ölçüm sayısının iki katının tersinden azsa o değerin aykırı olduğuna karar verilir ve elenir. Bu kriter keyfi seçilmiş bir varsayıma dayanmaktadır. \n", "\n", "Chauvenet kriterini uygulamak üzere öncelikle gözlemsel verinin ortalama değeri ve standart sapması hesaplanır. Aykırı olduğundan şüphelenilen noktanın ortalamadan ne kadar saptığını belirlemek için, normal dağılım (Ders 2) fonksiyonu (ya da tabloları) kulllanılarak herhangi bir değerin bu veri noktasının değerini alma olasılığı hesaplanır. Bu olasılık toplam ölçüm sayısıyla çarpılır; sonuç 0.5’ten küçükse, şüphelenilen nokta veri setinden çıkarılır.\n", "\n", "Şimdi bu kritere göre aykırı nokta belirleyen ve elenmesini sağlayan bir fonksiyon yazalım." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from scipy import stats as st\n", "def chauvenet(dizi):\n", " ortalama = dizi.mean()\n", " stsapma = dizi.std()\n", " uzaklik = ((dizi - ortalama) / stsapma)\n", " olasilik = st.norm.cdf(uzaklik)\n", " kriter = (1 - olasilik) * len(dizi)\n", " return kriter < 0.5" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "a = np.array([3.1, 3.7, 3.8, 26.2, 3.8, 3.8, 4.2, 4.5])\n", "plt.plot(a,'ro')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Kriterin saglandigi indeksler: \", chauvenet(a))\n", "plt.plot(np.argwhere(chauvenet(a) != True), a[chauvenet(a) != True], 'ro')\n", "plt.plot(np.argwhere(chauvenet(a) == True), a[chauvenet(a) == True], 'bx')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Peirce Kriteri ##\n", "\n", "Aykırı noktaların ayıklanmasında daha nadir başvurulan, ancak daha güvenilir bir yöntem Peirce kriterini dikkate alarak eleme yapmaktır. Bu yöntemde, hatalar sisteminin olasılığı (ortalamadan sapmalar) hatalı noktaları ayıklanmadan elde edildiğinde, tüm bu tür noktalar tek tek ayıklanarak her bir olasılığın bir sonrakiyle çarpılmasıyla hesaplanan olasılığın iki katından küçük çıkıyorsa bu noktalar ayıklanır. \n", "\n", "Peirce kriterinin hesaplanması matematiksel olarak çok karmaşıklaşabilmekte, çok sayıda işlemi gerektirebilmektedir. Ancak Gould, Pierce kriterinin pratik olarak hesaplanmasına olanak sağlayan bir “algoritma” ve bu algoritma uygulanırken kullanılacak tablolar vermiştir. Bu tablolar Peirce Kriteri Tabloları (ing. Peirce Criterion Table) olarak bilinir. Bu tablolarda verilen R parametresi bir x değerinin aykırı değer olarak kabul edilip, ayıklanmaması için ortalamadan maksimum ne kadar uzakta olması gerektiğini standart sapma cinsinden ifade eder ve aşağıdaki şekilde hesaplanır.\n", "\n", "$$ R = \\frac{|x_i - \\bar{x}|_{maks.}}{\\sigma} $$\n", "\n", "Bu şekilde çeşitli ölçüm sayıları ve şüpheli nokta sayıları için [Gould (1855)](https://ui.adsabs.harvard.edu/abs/1855AJ......4...81G/abstract) tarafıdan elde edilmiş olan değerler Peirce tablolarıadı verilen tablolara aktarılır. Aşağıda bu şekilde hazırlanmış bir tablo kesiti görülmektedir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from IPython.display import Image\n", "Image(filename='images/peirce_table.png', width=600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Peirce Kriteri ile Aykırı Nokta Ayııklama Algoritması ###\n", "\n", "1. Tüm veri setinin ortalaması ve standart sapması hesaplanır.\n", "\n", "2. Bir Peirce tablosundan ölçüm sayısına (n) karşılık gelen R değeri alınır. Aykırı olduğundan şüphelenilen birden fazla nokta olsa dahi sadece bir nokta ile işe başlanır.\n", "\n", "3. R değerinden ve verinin standart sapmasından ($\\sigma$) hareketle bir noktanın ayıklanmaması için ortalamadan maksimum ne kadar uzakta olması gerektiğini veren $| x_i – x_{ort.} |_{maks.} $ değeri bulunur. \n", "\n", "4. Şüphelenilen noktaların ortalamadan uzaklığı hesaplanır: $| x_i – x_{ort.} |$\n", "\n", "5. Dördüncü adımda elde edilen ( $| x_i – x_{ort.} |$) değer 3. adımda elde edilenle ($| x_i – x_{ort.} |_{maks.} $) karşılaştırılır ve ondan büyükse ($| x_i – x_{ort.} |$ > $| x_i – x_{ort.} |_{maks.}$) o nokta atılır.\n", "\n", "6. Eğer bir nokta atılmışsa, standart sapma ve ortalama orjinal değerlerinde tutularak ikinci şüphe duyulan noktaya geçilir ve 8. adıma atlanır.\n", "\n", "7. Bu noktaya kadar eğer birden fazla nokta atılmışsa bir sonraki şüpheli noktaya (örneğin iki nokta atılmışsa üçüncüye) geçilir ve yine ortalama standart sapma ve orjinal veri sayısı sabit tutulur.\n", "\n", "8. Daha fazla nokta atmaya gerek kalmayana kadar 2. - 5. adımlar tekrar edilir.\n", "\n", "9. Yeni oluşan veri setinin ortalama ve standart sapması alınarak işlem sonlandırılır.\n", "\n", "Örnek: HIPPARCOS uydusu ile bir yıldıza ilişkin yapılan 10 paralaks ölçümünden aşağıdaki uzaklık değerleri (pc cinsinden) elde edilmiş olsun\n", "\n", "d = [101.2, 90.0, 99.0, 102.0, 103.0, 100.2, 89.0, 98.1, 101.5, 102.0]\n", "\n", "Peirce algoritması takip edilecek olursa:\n", "\n", "1 $d_{ort} = 98.60$ pc, $\\sigma = 4.78$ pc bulunur.\n", "\n", "Hangi noktaların aykırı olduğundan süphelenilebileceğini görmek için ortalamadan belirli bir standart sapma mesafesindeki noktalara bakılabileceği gibi bir grafik çizdirilerek genel eğilimden sapan noktalar incelenebilir de. Biz bu örnek için her ikisini de yapalım ve biraz muhafazakar davranarak ortalamadan $1.5 \\sigma$ uzaklığa bakalım." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "import numpy as np\n", "d= np.array([101.2, 90.0, 99.0, 102.0, 103.0, 100.2, 89.0, 98.1, 101.5, 102.0])\n", "dort = d.mean()\n", "sigma = d.std()\n", "k = 1.5 # 1.5 sigmayi dikkate alacagiz\n", "print(\"Olasi aykiri notktalar: \", d[(d < dort - k*sigma) | (d > dort + k*sigma)])\n", "plt.plot(d, 'ro')\n", "plt.axhline(y = dort, ls=\"-\")\n", "plt.axhline(y = dort - k*sigma, ls=\"--\")\n", "plt.axhline(y = dort + k*sigma, ls=\"--\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2 Bu ölçümlerin birbirlerine yakınlığı değerlendirildiğinde ve değişim grafiği incelendiğinde, 89.0 (7. ölçüm) ile 90.0 (2. ölçüm) pc’lik ölçümlerin aykırı noktalar olduğundan şüphelenilebilir. Peirce tablousundan tek bir niceliğin ölçüldüğü, 10 ölçümden birinden şüphelenildiği noktasından hareketle R = 1.878 bulunur.\n", "\n", "3 Bir noktanın aykırı nokta olarak kabul edilebilmesi için ortalamaya standart sapma cinsinden sahip olması gereken maksimum uzaklık: \n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# aykiri nokta kabulu icin izin verilen maksimum uzaklik\n", "# bu uzakligi daha sonra grafikten gelen R ile karsilastiracagiz.\n", "R = 1.878\n", "maks_uzaklik = R*sigma\n", "print(\"Maksimum uzaklik: {:.4f}\".format(maks_uzaklik))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Grafikten elden edilen R kullanılarak hesaplanan bu maksimum uzaklık şüphelendiğimiz noktalar için aşılıyorsa bu noktaları aykırı noktalar kabul edip verimizden çıkaracağız.\n", "\n", "$$ R = \\frac{|x_i - \\bar{x}|_{maks.}}{\\sigma} \\Rightarrow |x_i - \\bar{x}|_{maks.} = R x \\sigma = 1.878 x 4.78 = 8.9425 $$\n", "\n", "4 Şüphelenilen iki noktanın ortalamaya uzaklıkları sırasıyla; \n", "\n", "$$ | d_7 – d_{ort.} | = | 89.0 – 98.6 | = 9.6 $$, \n", "$$ | d_2 – d_{ort.} | = | 90.0 – 98.6 | = 8.6 $$ \n", "\n", "olarak bulunur.\n", "\n", "5 Bu değerler 3. adımda belirlenen $ | d_i – d_{ort.}|_{maks.} = 8.9425 $ ile karşılaştırıldğında;\n", "$ | d_7 – d_{ort.}| = 9.6 > | d_i – d_{ort.}|_{maks.} = 8.9425 $ olduğundan bu nokta atılırken, \n", "$ | d_2 – d_{ort.}| = 8.6 < | d_i – d_{ort.}|_{maks.} = 8.9425 $ tutulur!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "supheli_noktalar = d[(d < dort - k*sigma) | (d > dort + k*sigma)]\n", "aykiri_noktalar = supheli_noktalar[(np.abs(supheli_noktalar - dort)) > maks_uzaklik]\n", "print(aykiri_noktalar)\n", "d_yeni = np.delete(d, np.where(np.in1d(d, aykiri_noktalar))[0])\n", "# Buldugumuz aykiri nokta deger(ler)ini supheli noktalar dizimizden de cikaralim\n", "supheli_noktalar = np.delete(supheli_noktalar, np.where(np.in1d(supheli_noktalar, aykiri_noktalar))[0])\n", "print(d_yeni)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "6 Bir noktayı aykırı nokta olarak belirledikten sonra diziden çıkarmak yerine yeni bir dizi oluşturup ondan çıkarıyor ve orjinal diziyi koruyoruz; çünkü hala bu dizi üzerinden ortalama ve standart sapma hatalarıyla ilerliyoruz. Bir nokta atılmış olduğu için bu kez iki şüpheli nokta için (toplam ölçüm sayısı 10’da korunarak) tekrar Peirce tablosundan R değeri okunur ve R = 1.570 bulunur. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# aykiri nokta kabulu icin izin verilen maksimum uzaklik\n", "# degerini (10, 2) icin tablodan aliyoruz\n", "R = 1.570\n", "maks_uzaklik = R*sigma\n", "print(\"Maksimum uzaklik: {:.4f}\".format(maks_uzaklik))\n", "# Supheli noktalar dizimizi degistirebilirdik cunku birini attik ancak buna gerek yok\n", "# cunku attigimiz nokta yeni dizimizde zaten yok\n", "aykiri_noktalar = supheli_noktalar[(np.abs(supheli_noktalar - dort)) > maks_uzaklik]\n", "print(aykiri_noktalar)\n", "d_yeni = np.delete(d_yeni, np.where(np.in1d(d_yeni, aykiri_noktalar))[0])\n", "print(d_yeni)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$| d_i – d_{ort.}|_{maks.} = R x \\sigma = 1.570 x 4.78 = 7.4759 $ olarak bulunur. Daha önce elenmemiş olan 90.0 değeri $| d_2 – d_{ort.}| = | 90.0 – 98.6 | = 8.6 > | d_i – d_{ort.}|_{maks.} = 7.4759$ olduğundan bu kez elenir!\n", "\n", "7 Üçüncü bir noktanın elenip elenmeyeceğini belirlemek üzere bu kez de toplam ölçüm sayısı (10), ortalama ve standart sapma değiştirilmeden üç şüpheli nokta için R değeri tablodan alınır: R = 1.380. Yeni ayklama için maksimum uzaklık kriteri $ | d_i – d_{ort.}|_{maks.} = R x \\sigma = 1.380 x 4.78 = 6.5712$ bulunur. Elde kalan hiçbir nokta ortalamadan bu kadar uzakta olmadığından elenmez. Böylece eleme işlemi sona erer. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# aykiri nokta kabulu icin izin verilen maksimum uzaklik\n", "# degerini (10, 2) icin tablodan aliyoruz\n", "R = 1.380\n", "maks_uzaklik = R*sigma\n", "print(\"Maksimum uzaklik: {:.4f}\".format(maks_uzaklik))\n", "# Supheli noktalarimizi bitirdiğimiz icin tum d dizisinde tekrar bakalim\n", "aykiri_noktalar = d_yeni[(np.abs(d_yeni - dort)) > maks_uzaklik]\n", "print(aykiri_noktalar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "8 Görüldüğü gibi artık aykırı olabilecek başka bir nokta (ortalamaya maksimum uzaklıktan daha uzak) bir nokta kalmadı. Son olarak kalan 8 nokta üzerinden yeni ortalama ve standart sapma aşağıdaki ölçümler için hesaplanır.\n", "\n", "$$ d = [101.2, 99.0, 102.0, 103.0, 100.2, 98.1, 101.5, 102.0] $$\n", "$$ d_{ort.} = 100.8750, \\sigma = 1.5498 $$ \n", "\n", "olarak bulunur.\n", "\n", "İkinci bir tur daha yapıp yeni şüpheli noktalar belirleyip, tekrar deneyebiliriz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "d = d_yeni.copy()\n", "dort = d.mean()\n", "sigma = d.std()\n", "k = 2.0 # Bu kez 2 sigmayi dikkate alalim\n", "print(\"Yeni ortalama: {:.4f}, Yeni standart sapma: {:.4f}\".format(dort,sigma))\n", "print(\"Olasi aykiri notktalar: \", d[(d < dort - k*sigma) | (d > dort + k*sigma)])\n", "plt.plot(d, 'ro')\n", "plt.axhline(y = dort, ls=\"-\")\n", "plt.axhline(y = dort - k*sigma, ls=\"--\")\n", "plt.axhline(y = dort + k*sigma, ls=\"--\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İki $\\sigma$ dahilinde yeni bir aykırı nokta bulamadık. Ancak $1.5 \\sigma$ dahilinde bulabilirdik (98.1). \n", "\n", "[Peirce kriterinden yararlanılarak aykırı nokta bulan algoritma için bir Python kodu](https://en.wikipedia.org/wiki/Peirce%27s_criterion#Python_code) yazılabilir, ancak artık bu tür bir algoritma modern veri analizinde pek kullanılmadığı için bu dersin kapsamı dışında kapsamı bırakılmıştır.\n", "\n", "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kutu Grafikleri ##\n", "\n", "Kutu grafikleri (ing. box plots) nümerik verideki çeyreklerin çizdirilerek özellikle aykırı noktaların çok büyük kolaylıkla görselleştirilebildiği araçlardır. Baş ve sondaki iki çubuk çizgi (ing. whiskers) verinin limitleri olarak düşünülebilir. Bu limitlerin dışındaki veriler de aykırı noktalar olarak kabul edilebilir. \n", "\n", "Veri seti toplamda dört adet çeyrek adı verilen aralığa bölünür. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from IPython.display import Image\n", "Image(filename='images/boxplot.png', width=600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Normal dağılımla, kutu grafikleri arasındaki ilişki aşağıdaki şekilde görüldüğü gibidir. Çeyrekler arası mesafe (ing. Interquartile Range ($IQR$) 'nin 1.5 katı her iki yönde limitleri belirler. Alt ve üst limitlerin dışındaki değerler aykırı noktalar olarak belirlenir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from IPython.display import Image\n", "Image(filename='images/boxplot_normaldistro.png', width=600)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`matplotlib` 'de kutu grafikleri üretmek için pek çok seçenek bulunmaktadır." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# np.random.randn fonksiyonuyla normal bir dagilimdan\n", "# rastgele secilen 5000 deger kullanilarak olusturulmus\n", "# bir veri setimiz olsun\n", "rstglvr = np.random.randn(5000) * 20 + 20\n", "plt.boxplot(rstglvr, 0, 'bx')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bir kutu grafiğinin değerlerine ise `numpy` fonksiyonlarıyla ulaşılabiir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ortanca = np.median(rstglvr)\n", "Q1 = np.percentile(rstglvr, 25)\n", "Q3 = np.percentile(rstglvr, 75)\n", "\n", "IQR = Q3 - Q1\n", "ust_limit = rstglvr[rstglvr <= Q3 + 1.5*IQR].max()\n", "alt_limit = rstglvr[rstglvr >= Q1 - 1.5*IQR].min()\n", "\n", "print(\"Ortanca: {:.2f}, Q1: {:.2f}, Q3: {:.2f}\".format(ortanca,Q1,Q3))\n", "print(\"IQR: {:.2f}, Ust Limit: {:.2f}, Alt Limit: {:.2f}\".\\\n", " format(IQR,alt_limit,ust_limit))\n", "\n", "aykiri_noktalar = rstglvr[(rstglvr > ust_limit) | (rstglvr < alt_limit)]\n", "print(aykiri_noktalar)\n", "\n", "# Simdi bu aykiri noktalari rastgele veri dizimizden atıp\n", "# her iki diziyi de cizdirelim.\n", "# numpy.delete fonksiyonu verilen bir dizi icinde verilen indekslerdeki degerleri siler\n", "# bu nedenle numpy.argwhere fonksiyonuyla kosulun saglandigi indeksleri alarak\n", "# numpy.delete fonksiyonuna sagliyoruz.\n", "aykiri_noktalar_indeksler = np.argwhere((rstglvr > ust_limit) | (rstglvr < alt_limit))\n", "temizlenmis_veri = np.delete(rstglvr, aykiri_noktalar_indeksler)\n", "plt.plot(rstglvr, 'r.')\n", "plt.plot(aykiri_noktalar_indeksler, aykiri_noktalar,'bx')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Grafiği çizerken aykırı noktalar dizisini doğrudan çizdirseydik her bir değerin indeksi, $rstglvr$ dizisindeki indeksinden faklı olacağından grafik üzerinde atılan noktaları değil, aynı değerlere sahip ama indeksleri 0'dan başlayan noktaları görürdük. Bir $numpy$ dizisindeki (örneğimizde aykiri_noktalar) değerlerin bir başka dizi içerisindeki (örneğimizde rstglvr) indekslerini bulmak için `numpy.in1d` fonksiyonu kullanılır. Bu fonksiyon içinde arama yapılan dizide bulduğu her bir değeri $True$ olarak işaretler. `numpy.where` fonkisyonuyla da bu değerlerin indeksleri alınabilir. Yukarıda örneklendirdiğimiz `numpy.arghwere` fonksiyonu da bir kosul dahilinde belirlenen dizi elemanlarının indeksini verdiği için örneğimizde aynı işi yapmaktadır." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# bunun icin alternatif bir yöntem bir dizinin degerlerini bir baska dizide arayan\n", "# np.ind1d fonksiyonudur. Bu fonksiyonun ciktisi np.where'e verilerek istenen\n", "# indeksler bulunabilir.\n", "aykiri_noktalar_indeksler2 = np.where(np.in1d(rstglvr,aykiri_noktalar))\n", "print(aykiri_noktalar_indeksler2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu algoritmaların dışında kümeleme algoritmaları ([DBScan Clustering](https://towardsdatascience.com/how-dbscan-works-and-why-should-i-use-it-443b4a191c80), [k-means clustering](http://pmg.it.usyd.edu.au/outliers.pdf) ve makine öğrenmesi algorimatları ([Isolation Forest](https://towardsdatascience.com/outlier-detection-with-isolation-forest-3d190448d45e), [Random-Cut Forest](http://proceedings.mlr.press/v48/guha16.pdf)) gibi daha komplike ayıklama algoritmaları da ihtiyaca yönelik olarak kullanılabilir." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kaynaklar #\n", "\n", "* Data Reduction and Error Analysis for the Physical Sciences, 3rd ed., Philip R.Bevington & D. Keith Robinson, 2003, McGraw Hill Higher Education\n", "\n", "* Doğruluk ve Duyarlılık, Anlamlı Rakamlar Konuları: \"Numerical Methods for Engineers\", 6th ed., Steven C. Chapra, Raymond P. Canale, McGraw Hill, 2010\n", "\n", "* Yuvarlama Konusu: [Real Python](https://realpython.com/python-rounding/), Dan Bader\n", "\n", "* Yuvarlama Konusu (round fonksiyonu): [round Fonksiyonu Dokümantasyonu](https://docs.python.org/3/library/functions.html#round)\n", "\n", "* Peirce Kriteri: https://en.wikipedia.org/wiki/Peirce%27s_criterion#Python_code\n", "\n", "* Kutu Grafikleri: https://en.wikipedia.org/wiki/Box_plot\n", "\n", "* Aykırı Nokta Ayıklama: https://towardsdatascience.com/5-ways-to-detect-outliers-that-every-data-scientist-should-know-python-code-70a54335a623" ] } ], "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 }