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

Ders - 02 Hata Analizi

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

Doğruluk ve Duyarlılık

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.

In [1]:
from IPython.display import Image
Image(filename='images/dogruluk_duyarlilik.png', width=600)
Out[1]:

Anlamlı Rakamlar

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:

  • Sıfır olmayan tüm rakamlar anlamlıdır.
    Örn.1. 91 : 2 anlamlı rakam
    Örn.2. 123.45 : 5 anlamlı rakam
  • Sıfır olmayan iki rakam arasındaki sıfırlar anlamlıdır.
    Örn. 101.1203 : 7 anlamlı rakam
  • Sıfır olmayan ilk rakama kadar soldaki sıfırlar anlamlı değildir.
    Örn. 0.000052 : 2 anlamlı rakam
  • Noktalı sayılarda sondaki sıfırlar anlamlıdır, çünkü sayının (ölçümün) duyarlılığını ortaya koyar.
    Örn.1. 12.2300 : 6 anlamlı rakam
    Örn.2. 120.00 : 5 anlamlı rakam
  • Tam sayılarda sondaki sıfırların durumu kaynaktan kaynağa farklı değerlendirilmektedir:
    • Duyarlılığı kesin olan basamakların üzerine ya da altına çizgi konarak
      Örn. 1300 : 3 anlamlı rakam
    • Tam sayılarda duyarlılık son basamakla belirleniyorsa son basamaktan sonra nokta konarak
      Örn. 100. : 3 anlamlı rakam
    • Doğru birimler seçilerek
      Örn. 1300 gram yerine 1.3 kg : 2 anlamlı rakam

Ş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.

In [2]:
def anlamli_rakam_sayisi(sayi):
    """
    string olarak verilen bir sayidaki anlamli rakam sayisini hesaplayan
    ve programa donduren fonksiyon
    """
    tamsayi, _, ondalik = sayi.partition(".")
    if ondalik:
        return len((tamsayi + ondalik).lstrip('0'))
    else:
        return len(tamsayi.strip('0'))
In [3]:
# Ornekler:
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format("91", anlamli_rakam_sayisi("91")))
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format("123.45", anlamli_rakam_sayisi("123.45")))
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format("101.12", anlamli_rakam_sayisi("101.12")))
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format("0.000052", anlamli_rakam_sayisi("0.000052")))
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format("12.2300", anlamli_rakam_sayisi("12.2300")))
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format("120.00", anlamli_rakam_sayisi("120.00")))
91 sayisindaki anlamli rakam sayisi: 2
123.45 sayisindaki anlamli rakam sayisi: 5
101.12 sayisindaki anlamli rakam sayisi: 5
0.000052 sayisindaki anlamli rakam sayisi: 2
12.2300 sayisindaki anlamli rakam sayisi: 6
120.00 sayisindaki anlamli rakam sayisi: 5
In [4]:
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format("120", anlamli_rakam_sayisi("120")))
120 sayisindaki anlamli rakam sayisi: 2
In [5]:
girdi = input("Anlamli rakam sayisini ogrenmek istediginiz bir sayi giriniz: ")
print("{:s} sayisindaki anlamli rakam sayisi: {:d}". format(girdi, anlamli_rakam_sayisi(girdi)))
Anlamli rakam sayisini ogrenmek istediginiz bir sayi giriniz: 0.009801
0.009801 sayisindaki anlamli rakam sayisi: 4

Anlamlı Rakamlarla Aritmetik

Anlamlı rakamlara dikkat ederek hesap yaparken genel olarak aşağıdaki kurallar takip edilir :

Çarpma ve bölme için sonuç, en az anlamlı rakam içeren sayıdaki anlamlı rakam sayısı kadar anlamlı rakam içermelidir.

Toplama ve çıkarma için sonuç, en az basamak içeren sayıdaki basamak sayısı kadar basamak içermeledir.

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.

Ö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

$$ \frac{0.745 \times 2.2}{3.885} = 0.4218 \sim 0.42 = 4.2 \times 10^{-1}$$

Ö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

$$ 27.153 + 138.2 - 11.74 = 153.613 \sim 153.6 $$

Ö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.

$$ (5.20674 + 0.0003) / (2.1 - 0.09) = 2.6035 \sim 2.6 $$

Ö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

$$ (5.23 \times 10^3 - 0.26 \times 10^2) / (2.0 \times 10^4) = 2.6 \times 10^0 $$

Başa Dön

Yuvarlama ve Yuvarlama Kaynaklı Hatalar

round Fonksiyonu

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.

Genel olarak bir sayıyı “n” tane anlamlı rakama yuvarlamak için:

  • n+1. rakam 5'ten küçük ise sayı aşağıya yuvarlanır.
    Örn. 1.224, 3 anlamlı rakam ile fade edilmek istenirse 1.22

  • n+1. rakam 5'ten büyük ise sayı yukarı yuvarlanır.
    Örn. 1.226, 3 anlamlı rakam ile fade edilmek istenirse 1.23

  • n+1. rakam 5 ise

    • bu rakamın peşi sıra sıfır olmayan bir rakam geliyorsa yukarı yuvarlanır.
      Örn. 1.2459, 3 anlamlı rakam ile ifade edilmek istenirse 1.25

    • n+1. rakam 5 ise rakam gelmiyor ya da sıfır geliyorsa 5’ten önceki rakam çiftse olduğu gibi bırakılır (aşağıya yuvarlanır), tekse yukarı yuvarlanır.
      Örn. 1.245, 3 anlamlı rakam ile ifade edilmek istenirse 1.24
      Örn. 1.235, 3 anlamlı rakam ile ifade edilmek istenirse 1.24

“n” basamağa yuvarlamakla “n” anlamlı rakama yuvarlamak farklı şeylerdir!

Ş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.

In [6]:
sayi = 123.456789
n = 2
print("{:.6f} sayisinin {:d} basamaga yuvarlanmis hali {:g}".format(sayi, n, round(sayi,n)))
123.456789 sayisinin 2 basamaga yuvarlanmis hali 123.46

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.

In [7]:
print(round(-0.5))
print(round(0.5))
print(round(1.5))
0
0
2

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.

In [8]:
print("{:.3f} sayısını 2 basamaga yuvarlarsaniz {:.2f} sonucunu elde edersiniz.".format(2.675, round(2.675,2)))
2.675 sayısını 2 basamaga yuvarlarsaniz 2.67 sonucunu elde edersiniz.

Bunun sebebi ikilik sayı sisteminde 2.675 sayısının mükemmel temsil edilemiyor oluşudur.

In [9]:
print("{:.32f}".format(2.675))
2.67499999999999982236431605997495

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.

In [10]:
sayi = 12.345
n = 2
print("{:.6f} sayisinin {:d} basamaga yuvarlanmis hali {:g}".format(sayi, n, round(sayi,n)))
print("{:.16f}".format(12.345))
sayi = 12.335
print("{:.6f} sayisinin {:d} basamaga yuvarlanmis hali {:g}".format(sayi, n, round(sayi,n)))
12.345000 sayisinin 2 basamaga yuvarlanmis hali 12.35
12.3450000000000006
12.335000 sayisinin 2 basamaga yuvarlanmis hali 12.34

math Kütüphanesi Tam Sayıya Yuvarlama Fonksiyonları

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.

In [11]:
from math import ceil,floor,trunc
sayi = -2.852
n = 1
print("{:.3f} sayisinin {:d} basamaga kesilmis hali {:g}".format(sayi, n, trunc(sayi)))
print("{:.3f} sayisinin {:d} basamaga yukari yuvarlanmis hali {:g}".format(sayi, n, ceil(sayi)))
print("{:.3f} sayisinin {:d} basamaga asagi yuvarlanmis hali {:g}".format(sayi, n, floor(sayi)))
-2.852 sayisinin 1 basamaga kesilmis hali -2
-2.852 sayisinin 1 basamaga yukari yuvarlanmis hali -2
-2.852 sayisinin 1 basamaga asagi yuvarlanmis hali -3

Yuvarlama Stratejileri

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.

Kesme

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.

In [12]:
def kesme(x, k = 0):
    return int(x * 10**k) / 10**k
In [13]:
# Ornek 1 (pozitif sayi)
sayi = 12.3456789
basamak = 4
print("{:.7f} sayisinin {:d}. basamağından sonrası kesilirse {:g} elde edilir.".\
     format(sayi, basamak, kesme(sayi,basamak)))
# Ornek 2 (negatif sayi)
sayi = -9.876543210
basamak = 2
print("{:.8f} sayisinin {:d}. basamağından sonrası kesilirse {:g} elde edilir.".\
     format(sayi, basamak, kesme(sayi,basamak)))
# Ornek 3 (tam sayi)
sayi = 12345
print("{:g} sayisinin tamsayi kismi {:g}.".format(sayi, kesme(sayi)))
# Ornek 4 (negatif basamak, -noktanin solundan kesme-)
sayi = 1234.56
basamak = -2
print("{:.2f} sayisi noktanin {:d} basamak solundan kesilirse {:g} elde edilir.".\
     format(sayi, -1*basamak, kesme(sayi,basamak)))
# Ornek 5 (negatif basamak, negatif sayi -noktanin solundan kesme-)
sayi = -789.6543
basamak = -1
print("{:.4f} sayisi noktanin {:d} basamak solundan kesilirse {:g} elde edilir.".\
     format(sayi, -1*basamak, kesme(sayi,basamak)))
12.3456789 sayisinin 4. basamağından sonrası kesilirse 12.3456 elde edilir.
-9.87654321 sayisinin 2. basamağından sonrası kesilirse -9.87 elde edilir.
12345 sayisinin tamsayi kismi 12345.
1234.56 sayisi noktanin 2 basamak solundan kesilirse 1200 elde edilir.
-789.6543 sayisi noktanin 1 basamak solundan kesilirse -780 elde edilir.

Yukarı Yuvarlama

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.

In [14]:
from math import ceil
def yukari_yuvarla(x, k = 0):
    return ceil(x * 10**k) / 10**k
In [15]:
# Ornek 1 (pozitif sayi)
sayi = 12.3456789
basamak = 4
print("{:.7f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir.".\
     format(sayi, basamak, yukari_yuvarla(sayi,basamak)))
# Ornek 2 (negatif sayi)
sayi = -9.876543210
basamak = 2
print("{:.8f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir. (negatif sayıya dikkat!)".\
     format(sayi, basamak, yukari_yuvarla(sayi,basamak)))
# Ornek 3 (tam sayi)
sayi = 12345
print("{:g} sayisinin tamsayi kismi yukari yuvarlandiginda {:g}.".format(sayi, yukari_yuvarla(sayi)))
# Ornek 4 (negatif basamak, -noktanin solundan yukari_yuvarla-)
sayi = 1234.56
basamak = -2
print("{:.2f} sayisi noktanin solundaki {:d} basamaktan itibaren yukari yuvarlanirsa {:g} elde edilir.".\
     format(sayi, -1*basamak, yukari_yuvarla(sayi,basamak)))
# Ornek 5 (negatif basamak, negatif sayi -noktanin solundan yukari_yuvarla-)
sayi = -789.6543
basamak = -1
print("{:.4f} sayisi noktanin solundaki {:d} basamaktan itibaren yukari yuvarlanirsa {:g} elde edilir. (Dikkat!)".\
     format(sayi, -1*basamak, yukari_yuvarla(sayi,basamak)))
12.3456789 sayisinin 4. basamağından sonrası yukarı yuvarlanirsa 12.3457 elde edilir.
-9.87654321 sayisinin 2. basamağından sonrası yukarı yuvarlanirsa -9.87 elde edilir. (negatif sayıya dikkat!)
12345 sayisinin tamsayi kismi yukari yuvarlandiginda 12345.
1234.56 sayisi noktanin solundaki 2 basamaktan itibaren yukari yuvarlanirsa 1300 elde edilir.
-789.6543 sayisi noktanin solundaki 1 basamaktan itibaren yukari yuvarlanirsa -780 elde edilir. (Dikkat!)

Aşağı Yuvarlama

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.

In [16]:
from math import floor
def asagi_yuvarla(x, k = 0):
    return floor(x * 10**k) / 10**k
In [17]:
# Ornek 1 (pozitif sayi)
sayi = 12.3456789
basamak = 4
print("{:.7f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir.".\
     format(sayi, basamak, asagi_yuvarla(sayi,basamak)))
# Ornek 2 (negatif sayi)
sayi = -9.876543210
basamak = 2
print("{:.8f} sayisinin {:d}. basamağından sonrası yukarı yuvarlanirsa {:g} elde edilir. (negatif sayıya dikkat!)".\
     format(sayi, basamak, asagi_yuvarla(sayi,basamak)))
# Ornek 3 (tam sayi)
sayi = 12345
print("{:g} sayisinin tamsayi kismi asagi yuvarlandiginda {:g}.".format(sayi, asagi_yuvarla(sayi)))
# Ornek 4 (negatif basamak, -noktanin solundan asagi_yuvarla-)
sayi = 1234.56
basamak = -2
print("{:.2f} sayisi noktanin solundaki {:d} basamaktan itibaren asagi yuvarlanirsa {:g} elde edilir.".\
     format(sayi, -1*basamak, asagi_yuvarla(sayi,basamak)))
# Ornek 5 (negatif basamak, negatif sayi -noktanin solundan asagi_yuvarla-)
sayi = -789.6543
basamak = -1
print("{:.4f} sayisi noktanin solundaki {:d} basamaktan itibaren asagi yuvarlanirsa {:g} elde edilir. (Dikkat!)".\
     format(sayi, -1*basamak, asagi_yuvarla(sayi,basamak)))
12.3456789 sayisinin 4. basamağından sonrası yukarı yuvarlanirsa 12.3456 elde edilir.
-9.87654321 sayisinin 2. basamağından sonrası yukarı yuvarlanirsa -9.88 elde edilir. (negatif sayıya dikkat!)
12345 sayisinin tamsayi kismi asagi yuvarlandiginda 12345.
1234.56 sayisi noktanin solundaki 2 basamaktan itibaren asagi yuvarlanirsa 1200 elde edilir.
-789.6543 sayisi noktanin solundaki 1 basamaktan itibaren asagi yuvarlanirsa -790 elde edilir. (Dikkat!)

Yuvarlama Yanlılığı

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.

In [18]:
import statistics as stats
veri = [4.256, 0.230, -5.276, -1.571, 4.275, -9.125]
# Yukari yuvarlama
veri_yukari_yuvarlama = [yukari_yuvarla(d, 2) for d in veri]
print("Dizi yukari yuvarlandiginda elde edilen ortalama:", stats.mean(veri_yukari_yuvarlama))
# Asagi yuvarlama 
veri_asagi_yuvarlama = [asagi_yuvarla(d, 2) for d in veri]
print("Dizi asagi yuvarlandiginda elde edilen ortalama: ", stats.mean(veri_asagi_yuvarlama))
# Kesme
veri_kesme = [kesme(d, 2) for d in veri]
print("Diziye kesme islemi uygulandiginda elde edilen ortalama: ", stats.mean(veri_kesme))
# Dizinin yuvarlama yapilmadan ortalamasi
print("Dizinin yuvarlama yapilmadan elde edilen ortalama: ", stats.mean(veri))
Dizi yukari yuvarlandiginda elde edilen ortalama: -1.198333333333333
Dizi asagi yuvarlandiginda elde edilen ortalama:  -1.206666666666667
Diziye kesme islemi uygulandiginda elde edilen ortalama:  -1.2016666666666664
Dizinin yuvarlama yapilmadan elde edilen ortalama:  -1.201833333333333

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.

In [19]:
from math import ceil,floor
def yuvarla_bes_yukari(x, k = 0):
    return floor(x*10**k + 0.5) / 10**k
def yuvarla_bes_asagi(x, k = 0):
    return ceil(x*10**k - 0.5) / 10**k
In [20]:
# Ornekler
print(yuvarla_bes_yukari(10.32, 1))
print(yuvarla_bes_yukari(10.38, 1))
print(yuvarla_bes_yukari(10.35, 1))
print(yuvarla_bes_yukari(-1.35, 1))
print(yuvarla_bes_asagi(10.32, 1))
print(yuvarla_bes_asagi(10.38, 1))
print(yuvarla_bes_asagi(10.35, 1))
print(yuvarla_bes_asagi(-1.35, 1))
10.3
10.4
10.4
-1.3
10.3
10.4
10.3
-1.4

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.

In [21]:
import statistics as stats
veri5 = [-2.115, 4.305, 3.465, -9.305]
# Yukari yuvarlama
veri5_bes_yukari = [yuvarla_bes_yukari(d, 2) for d in veri5]
print("Dizide 5 ile biten sayilar yukari yuvarlandiginda elde edilen ortalama:", stats.mean(veri5_bes_yukari))
# Asagi yuvarlama 
veri5_bes_asagi = [yuvarla_bes_asagi(d, 2) for d in veri5]
print("Dizide 5 ile biten sayilar asagi yuvarlandiginda elde edilen ortalama:", stats.mean(veri5_bes_asagi))
# Dizinin yuvarlama yapilmadan ortalamasi
print("Dizinin yuvarlama yapilmadan elde edilen ortalama: ", stats.mean(veri5))
Dizide 5 ile biten sayilar yukari yuvarlandiginda elde edilen ortalama: -0.9100000000000003
Dizide 5 ile biten sayilar asagi yuvarlandiginda elde edilen ortalama: -0.9175000000000002
Dizinin yuvarlama yapilmadan elde edilen ortalama:  -0.9125000000000001

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.

In [22]:
sayi1 = -1.5
sayi2 = 1.5
print("f(1.5) + f(-1.5) = ", yuvarla_bes_yukari(sayi1) + yuvarla_bes_yukari(sayi2))
print("f(1.5) + f(-1.5) = ", yuvarla_bes_asagi(sayi1) + yuvarla_bes_asagi(sayi2))
f(1.5) + f(-1.5) =  1.0
f(1.5) + f(-1.5) =  -1.0

Bu simetriyi getirmek için bu iki fonksiyonu aşağıdaki şekilde birleştirebiliriz.

In [23]:
def yuvarla_bes_simetrik(x, k = 0):
    if x >= 0:
        return yuvarla_bes_yukari(x, k)
    else:
        return yuvarla_bes_asagi(x, k)
In [24]:
sayi1 = -1.5
sayi2 = 1.5
print("f(1.5) + f(-1.5) = ", yuvarla_bes_simetrik(sayi1) + yuvarla_bes_simetrik(sayi2))
f(1.5) + f(-1.5) =  0.0

Fonksiyon bu simetriye sahip olduğu için yanlılıktan kaçınmayı da sağlıyor gibi görünmektedir.

In [25]:
import statistics as stats
veri5 = [-2.115, 4.305, 3.465, -9.305]
# Simetrik yuvarlama
veri5_bes_simetrik = [yuvarla_bes_simetrik(d, 2) for d in veri5]
print("Dizide 5 ile biten sayilar simetrik yuvarlandiginda elde edilen ortalama:", stats.mean(veri5_bes_simetrik))
# Dizinin yuvarlama yapilmadan ortalamasi
print("Dizinin yuvarlama yapilmadan elde edilen ortalama: ", stats.mean(veri5))
Dizide 5 ile biten sayilar simetrik yuvarlandiginda elde edilen ortalama: -0.9125000000000002
Dizinin yuvarlama yapilmadan elde edilen ortalama:  -0.9125000000000001

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.

In [26]:
import statistics as stats
veri5_pozitif = [2.115, 4.305, 3.465, 9.305]
# Simetrik yuvarlama
veri5_bes_pozitif_simetrik = [yuvarla_bes_simetrik(d, 2) for d in veri5_pozitif]
print("Tamamı pozitif dizide 5 ile biten sayilar simetrik yuvarlandiginda elde edilen ortalama:", \
      stats.mean(veri5_bes_pozitif_simetrik))
# Dizinin yuvarlama yapilmadan ortalamasi
print("Dizinin yuvarlama yapilmadan elde edilen ortalama: ", stats.mean(veri5_pozitif))
Tamamı pozitif dizide 5 ile biten sayilar simetrik yuvarlandiginda elde edilen ortalama: 4.8025
Dizinin yuvarlama yapilmadan elde edilen ortalama:  4.797499999999999

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 ile de takip edilmektedir.

In [27]:
print(round(1.75, 1))
print(round(1.25, 1))
print(round(-1.25, 1))
print(round(-1.75, 1))
1.8
1.2
-1.2
-1.8

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.

In [28]:
print(round(2.675, 2))
print("{:.32f}".format(2.675))
2.67
2.67499999999999982236431605997495

Hata Tanımları

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. Bu noktada ölçüm (ing. measurement, $\theta$) ile bir niceliğin ölçümler sonucu tahmini değeri (ing. estimation, $\hat{\theta}$) arasındaki farkı da vurgulamakta fayda vardır. Ölçüm değerleri deney ve gözlemlerin sonucu iken, bir parametrenin değeri konusundaki tahmin doğrudan deney ve gözlemlere bağlı olmayıp onlardan yapılan bir çıkarımdır (ing. inference).

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. Ayrıca gürültü (ing. noise) kavramının da zaman zaman hata ya da belirsizlik yerine kullandığı görülmektedir. Tahmini değerlerden bahsederken belirsizlik, bireysel ölçümlerden bahsederken hata, bir grup ölçümden bahsederken gürültü terimlerini kullanmak daha doğal gelse de bu terimlerin birbirinin yerine kullanıldığı pek çok durumla karşılaşılır.

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) kaynaklanı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.

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.

3) Model kaynaklı hatalar Seçilen modele bağlı olarak belirlenen tahmini değerler üzerindeki belirsizliktir.

Başa Dön

Rastgele Hata Kavramları

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 örnekleyebileceğ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).

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.

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 duyarlılığından bir fazla basamak kullanılarak ifade edilir!

$$ \sigma = \frac{\Sigma (x_i - \bar{x})^2}{N - 1} $$

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ın bir 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 sapma ö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. Örneğin standart sapması 0.50 olan 4 ölçüm 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!

$$ st.hata = \frac{\sigma}{\sqrt{N}} $$

Göreli (Bağıl) ve Mutlak Hata Kavramları (ing. Relative vs. Absolute Errors): $x \pm \Delta x$ şeklinde ifade edilen bir ölçümdeki hata (hatanın hangi parametre ile verildiğinden bağımsız olarak) mutlak hata olarak bilinir. $x \pm \frac{\Delta x}{x}$ şeklinde ifade edilen bir ölçümdeki $\frac{\Delta 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.

Örnek: R = 1200~$\Omega$ olan bir direncin toleransı %5 ise kullanılacak dirençte yapılabilecek maksimum mutlak hata $1200 \times 0.05 = 60~\Omega$ olmalıdır.

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österen 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ı?).

$7.6 \pm 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. İ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 yeterli sayıda ölçüm yapıldığı varsayımlarına dayanır. Bir başka (ve daha istatistiksel terminolojiye uygun) bir ifade ile; eğer ölçümlerin ortalama etrafındaki dağılımlarını ifade etmek üzere standart sapma ölçütü kullanılıyorsa, $7.6 \pm 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.

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 değer %95'lik güven aralığının içindedir. Oysa sonuç $2.65 \pm 0.01 g cm^{-3}$ olsaydı bu ölçüm kabul edilemezdi!

Örnekler:

i) $3.42 \pm 0.04$ s ile $3.48$ s,
ii) $13^m.106 \pm 0^m.014$ ile $13^m.206$,
iii) $(2.95 \pm 0.03) x 10^8$ m/s ile $3.00 x 10^8$ m/s

tutarlı mıdır?

3. Gözlemci Hatası

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.

Hatanın Yayılması

Diyelim ki ölçümü yapılan üç birbirinden bağımsız nicelik x, y ve $\omega$ ü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 terimden 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.

Genel ifade

$$ z \sim z_0 \pm (\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 $$

şeklinde verilir.

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.

Ortalama sapma için ifade

$$ \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| $$

Standart sapma için ise

$$ \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})^2_{x_0,y_0} \sigma_\omega^2} $$

şeklindedir.

Ö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) $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?

Çözüm:

$e = 0.00080~cos~(4.7158) = 2.75216936 \times 10^{-6}$ olup, çarpmada anlamlı sayı belirleme kuralı gereği en az anlamlı rakam (5) içerecek şekilde yuvarlandığnda, $e~cos(\omega) = 2.7521 x 10^{-6}$ olarak elde edilir.

$$\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 + e sin (\omega) \Delta \omega $$

elde edilir.

Ortalama sapma için:

$$\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}$$

$$e~cos(\omega) = 2.7521 x 10^{-6} \pm 6.5700 x 10^{-6}$$

,

Standart sapma için

$$\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$$$$e~cos(\omega) = 2.7521 x 10^{-6} \pm 4.8214 x 10^{-6}$$

şeklinde ifade edilir.

Ş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.

Başa Dön

Varyans ve Kovaryans

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:

$$\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})^2(\frac{\partial x}{\partial u})^2 + (v_1 - \bar{v})^2(\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}) + ...] $$

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.

$$\sigma_u^2 = \lim_{N \to +\infty} [\frac{1}{N} (u_1 - \bar{u})^2] $$$$\sigma_v^2 = \lim_{N \to +\infty} [\frac{1}{N} (v_1 - \bar{v})^2] $$$$\sigma_{uv}^2 = \lim_{N \to +\infty} [\frac{1}{N} (u_1 - \bar{u}) (v_1 - \bar{v})] $$

Bu terimlerden hareketle hatanın yayılımı denklemi (ing. error propagation equation) aşağıdaki şekilde veriliir:

$$\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}) + ... $$

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;

$$\sigma_x^2 \sim \sigma_u^2 (\frac{\partial x}{\partial u})^2 + \sigma_v^2 (\frac{\partial x}{\partial v})^2 + ...$$

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.

Başa Dön

1a. Bir Sabitle Toplama ve Çıkarma

$x$ niceliği, $a$ bir sabit olmak üzere ölçülebilen bir $u$ bağımsız niceliğine aşağıdaki şekilde bağlı ise

$$x = u + a$$

Bu durumda x üzerindeki belirsizlik:

$$(\frac{\partial x}{\partial u}) = 1 \Rightarrow \Delta x = (\frac{\partial x}{\partial u}) \Delta u \Rightarrow \Delta_x = 1~ \Delta u \Rightarrow \Delta x = \Delta u $$

Varyans cinsinden ise;

$$(\frac{\partial x}{\partial u}) = 1 \Rightarrow \sigma_x^2 = (\frac{\partial x}{\partial u})^2 \sigma_u^2 + \Rightarrow \sigma_x^2 = 1~ \sigma_u^2 \Rightarrow \sigma_x = \sigma_u $$

Bu durumda bağıl hata (ya da belrsizlik) aşağıdaki ifadeyle verilir:

$$\frac{\sigma_x}{x} = \frac{\sigma_u}{x} = \frac{\sigma_u}{u + a} $$

Ö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 sabit bir değere ($BG = 10$) eşit olsun. Bu durumda ölçümlerimiz üzerindeki belirsizlik:

$$x_1 = N_1 - BG = 1141 - 10 = 1131 \Rightarrow \sigma_x = \sigma_{N_1} = \sqrt{1141} = 33.78 \sim 34$$

Göreli belirsizlik,

$$\frac{\sigma_{x_1}}{x_1} = \frac{33.78}{1131} = 0.030 \sim 0.30~10^{-1} = \%3.0$$$$x_2 = N_2 - BG = 21 - 10 = 11 \Rightarrow \sigma_x = \sigma_{N_2} = \sqrt{21} = 4.58 \sim 5$$

Göreli belirsizlik,

$$\frac{\sigma_{x_2}}{x_2} = \frac{4.58}{11} = 0.417 \sim 0.42 = \%42$$

Sonuç olarak $x_1$ ve $x_2$ nicelikleri anlamlı rakamlara da dikkat edilerek aşağıdaki şekilde ifade edilebilir.

$$x_1 = 11321 \pm 34$$$$x_2 = 11 \pm 5$$

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. Ayrıca dağılım da Gaussyen'e yakınsar.

Başa Dön

1b. Toplama ve Çıkarma

$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

$$x = a~u + b~v$$

Bu durumda $x$ üzerindeki belirsizlik:

$$(\frac{\partial x}{\partial u}) = a, (\frac{\partial x}{\partial v}) = b \Rightarrow \Delta x 2 \sim \Delta u (\frac{\partial x}{\partial u}) + \Delta v (\frac{\partial x}{\partial v}) + 2 \Delta u \Delta v (\frac{\partial x}{\partial u}) (\frac{\partial x}{\partial v}) \Rightarrow \Delta x = a ~\Delta u + b~\Delta v + ab~\Delta u \Delta v$$

Varyanslar söz konusu olduğunda,

$$(\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$$

$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!

Ö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 ve x üzerindeki belirsizlik aşağıdaki şekilde hesaplanır. Bağımsız sayımlar arasında korelasyon olduğunu düşünmek için bir nedenimiz yoktur.

$$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$$

$x_2$ ölçümü için ise

$$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$$

Sonuç olarak $x_1$ ve $x_2$ nicelikleri yine anlamlı rakamlara da dikkat edilerek aşağıdaki şekilde ifade edilebilir.

$$x_1 = 1132 \pm 34$$$$x_2 = 12 \pm 6$$

Başa Dön

2. Çarpma ve Bölme

$x$ niceliği,$u$ ve $v$ bağımsız değişkenlerinin $a$ sabiti ile ağırlıklandırılmış bir çarpımı ise

$$x = a~u~v$$

Bu durumda $x$ üzerindeki belirsizlik:

$$(\frac{\partial x}{\partial u}) = a~v, (\frac{\partial x}{\partial v}) = a~u \Rightarrow \Delta x \sim \Delta u (\frac{\partial x}{\partial u}) + \Delta u (\frac{\partial x}{\partial v}) + \Delta u\Delta v (\frac{\partial x}{\partial u}) (\frac{\partial x}{\partial v})$$

ü

$$\Delta x = (a~v~\Delta u) + (a~u~\Delta v) + a~uv~\Delta u \Delta v$$

Varyanslar için;

$$(\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})$$

$$\sigma_x^2 = (a~v~\sigma_u)^2 + (a~u~\sigma_v)^2 + 2a^2~uv~\sigma_{uv}^2$$

Bu ifade bağıl olarak daha simetrik ve zarif bir şekilde verilebilir.

$$\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} $$$$\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}$$

Benzer şekilde bölme için,

$$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}$$

Ö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.

$$A = \frac{a~h}{2} = \frac{5.0~10.0}{2} = 25.0 $$

Doğrudan ölçüm aleti duyarlılığı kaynaklı tek bir ölçüm hatasının sonuca yayılımı için (parametreler arası bir korelasyon yoktur)

$$\Delta A = (0.5~h~\Delta a) + (0.5~a~\Delta h) = (0.5 \times 10 \times 0.1) + (0.5 \times 5 \times 0.3) = 1.25 \sim 1.2$$$$A = 25.0 \pm 1.2~cm^2$$

Ancak bu değerler örneğin bir grup ölçümün ortalaması ve standart sapması üzerinden rapor edilmişse;

$$\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$$

Sonuç olarak üçgnenin alanı;

$$A = 25.0 \pm 0.9~cm^2$$

olarak ifade edilir.

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.

Başa Dön

3. Kuvvet Alma

$x$ niceliği, $a$ ve $b$ sabitler olmak üzere $u$ bağımsız değişkenine kuvvet cinsinden bağlıysa,

$$x = a~u^b$$

Bu durumda $x$ üzerindeki belirsizlik:

$$(\frac{\partial x}{\partial u}) = a~b~u^{b-1} = \frac{b~x}{u} \Rightarrow \Delta x \sim \Delta u (\frac{\partial x}{\partial u}) \Rightarrow (\frac{b~x}{u} \Delta u) \Rightarrow \frac{\Delta x}{x} = (b~\frac{\Delta u}{u}) \Rightarrow \frac{\Delta x}{x} = b~\frac{\Delta u}{u}$$

Varyanslar için;

$$(\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}{u})^2 \Rightarrow \frac{\sigma_x}{x} = b~\frac{\sigma_u}{u}$$

$b = +1$ özel durumu için $x = a~u \Rightarrow \sigma_x = a~\sigma_u \Rightarrow \frac{\sigma_x}{x} = \frac{\sigma_u}{u}$

$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}$

Negatif işaret gereği, u’daki küçük bir pozitif değişim, x’te negatif bir değişime neden olur. Değişimin büyüklüğünü bulmak için ise mutlak değer almak gerekir.

Ö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.

$$\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$$

Sonuç

$$A = 100.0 \pm 6.0 \pi~cm^2$$

olarak verilmelidir.

Başa Dön

4. Üstel ve Logaritmik Fonksiyon

Üstel Fonksiyon

$x$ niceliği, $a$ ve $b$ sabitler olmak üzere $u$ bağımsız değişkenine üstel bağlıysa

$$x = a~e^{bu}$$

Bu durumda $x$ üzerindeki belirsizlik:

$$(\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$$

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.

$$x = a^{bu} \Rightarrow x = (e^{lna})^{bu} = e^{(b~lna)u} \Rightarrow x = e^{cu}, c = b~lna $$$$\frac{\sigma_x}{x} = c~\sigma_u \Rightarrow \frac{\sigma_x}{x} = b~lna~\sigma_u $$

Logaritma

$x$ niceliği, $a$ ve $b$ sabitler olmak üzere $u$ bağımsız değişkenine logaritma ile bağlıysa

$$x = a~ln(bu)$$

Bu durumda $x$ üzerindeki belirsizlik:

$$(\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}$$

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.

Başa Dön

5. Trigonometrik Fonksiyonlar

$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

$$x = a~cos(bu)$$

Bu durumda $x$ üzerindeki belirsizlik:

$$(\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 $$

Benzer şekilde;

$$x = a~sin(bu) \Rightarrow (\frac{\partial x}{\partial u}) = a~b~cos(bu) \Rightarrow \sigma_x = a~b~cos(bu)~\sigma_u$$

Burada $\sigma_u$ bir açı üzerindeki belirsizlik olacağından mutlaka radyan cinsinden ifade edilmelidir.

Başa Dön

Aykırı Noktaların Belirlenerek Çıkarılması

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 ihtiyacı 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.

Standart Sapma Kullanımı

Normal dağıldığı varsayılan çok sayıda ölçümde ortalamadan belirli bir standart sapma uzaklıktaki verileri belirleyip ayıklamaya dayanan yöntemdir (ing. sigma clipping). 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

In [29]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

# np.random.randn fonksiyonuyla normal bir dagilimdan
# rastgele secilen 50000 deger kullanilarak olusturulmus
# bir veri setimiz olsun
rastgeleveri = np.random.randn(50000)  * 20 + 20

# aykiri noktalari temsil edecek bir fonksiyon yazalim
def aykirinokta(veri, k = 3):
    # bir numpy dizisindeki (veri), kac standart sapma (k) 
    # haricindeki degerlerin ayiklanacagini donduren fonksiyon
    stsapma = veri.std()
    ort = veri.mean()
    limit = k * stsapma
    
    alt_limit  = ort - limit
    ust_limit = ort + limit
    
    aykiri_noktalar = veri[(veri > ust_limit) | (veri < alt_limit)]
    indeksler = np.argwhere(((veri > ust_limit) | (veri < alt_limit)))
    
    return aykiri_noktalar,indeksler

# Rastgele veri setini (kirmizi daire) ve bu veri setinde 
# kurala gore aykiri nokta olanlari cizdirelim
# ancak varsayilan 3 sigma yerine 2.75 sigma sinirini kullanalim
plt.plot(rastgeleveri, 'ro')
an, ind = aykirinokta(rastgeleveri, k=3.0)
plt.plot(ind, an, 'bx')
plt.show()

Chauvenet Kriteri

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.

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.

Şimdi bu kritere göre aykırı nokta belirleyen ve elenmesini sağlayan bir fonksiyon yazalım.

In [30]:
import numpy as np
from scipy import stats as st
def chauvenet(dizi):
    ortalama = dizi.mean()
    stsapma = dizi.std()
    uzaklik = ((dizi - ortalama) / stsapma)
    olasilik = st.norm.cdf(uzaklik)
    kriter = (1 - olasilik) * len(dizi)
    return kriter < 0.5
In [31]:
%matplotlib inline
from matplotlib import pyplot as plt
a = np.array([3.1, 3.7, 3.8, 26.2, 3.8, 3.8, 4.2, 4.5])
plt.plot(a,'ro')
plt.show()
In [32]:
print("Kriterin saglandigi indeksler: ", chauvenet(a))
plt.plot(np.argwhere(chauvenet(a) != True), a[chauvenet(a) != True], 'ro')
plt.plot(np.argwhere(chauvenet(a) == True), a[chauvenet(a) == True], 'bx')
plt.show()
Kriterin saglandigi indeksler:  [False False False  True False False False False]

Peirce Kriteri

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.

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.

$$ R = \frac{|x_i - \bar{x}|_{maks.}}{\sigma} $$

Bu şekilde çeşitli ölçüm sayıları ve şüpheli nokta sayıları için Gould (1855) 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.

In [33]:
from IPython.display import Image
Image(filename='images/peirce_table.png', width=600)
Out[33]:

Peirce Kriteri ile Aykırı Nokta Ayııklama Algoritması

  1. Tüm veri setinin ortalaması ve standart sapması hesaplanır.

  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.

  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.

  4. Şüphelenilen noktaların ortalamadan uzaklığı hesaplanır: $| x_i – x_{ort.} |$

  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.

  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.

  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.

  8. Daha fazla nokta atmaya gerek kalmayana kadar 2. - 5. adımlar tekrar edilir.

  9. Yeni oluşan veri setinin ortalama ve standart sapması alınarak işlem sonlandırılır.

Ö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

d = [101.2, 90.0, 99.0, 102.0, 103.0, 100.2, 89.0, 98.1, 101.5, 102.0]

Peirce algoritması takip edilecek olursa:

1 $d_{ort} = 98.60$ pc, $\sigma = 4.78$ pc bulunur.

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.

In [34]:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
d= np.array([101.2, 90.0, 99.0, 102.0, 103.0, 100.2, 89.0, 98.1, 101.5, 102.0])
dort = d.mean()
sigma = d.std()
k = 1.5 # 1.5 sigmayi dikkate alacagiz
print("Olasi aykiri notktalar: ", d[(d < dort - k*sigma) | (d > dort + k*sigma)])
plt.plot(d, 'ro')
plt.axhline(y = dort, ls="-")
plt.axhline(y = dort - k*sigma, ls="--")
plt.axhline(y = dort + k*sigma, ls="--")
plt.show()
Olasi aykiri notktalar:  [90. 89.]

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.

3 Bir noktanın aykırı nokta olarak kabul edilebilmesi için ortalamaya standart sapma cinsinden sahip olması gereken maksimum uzaklık:

In [35]:
# aykiri nokta kabulu icin izin verilen maksimum uzaklik
# bu uzakligi daha sonra grafikten gelen R ile karsilastiracagiz.
R = 1.878
maks_uzaklik = R*sigma
print("Maksimum uzaklik: {:.4f}".format(maks_uzaklik))
Maksimum uzaklik: 8.9425

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.

$$ R = \frac{|x_i - \bar{x}|_{maks.}}{\sigma} \Rightarrow |x_i - \bar{x}|_{maks.} = R x \sigma = 1.878 x 4.78 = 8.9425 $$

4 Şüphelenilen iki noktanın ortalamaya uzaklıkları sırasıyla;

$$ | d_7 – d_{ort.} | = | 89.0 – 98.6 | = 9.6 $$

, $$ | d_2 – d_{ort.} | = | 90.0 – 98.6 | = 8.6 $$

olarak bulunur.

5 Bu değerler 3. adımda belirlenen $ | d_i – d_{ort.}|_{maks.} = 8.9425 $ ile karşılaştırıldğında; $ | d_7 – d_{ort.}| = 9.6 > | d_i – d_{ort.}|_{maks.} = 8.9425 $ olduğundan bu nokta atılırken, $ | d_2 – d_{ort.}| = 8.6 < | d_i – d_{ort.}|_{maks.} = 8.9425 $ tutulur!

In [36]:
supheli_noktalar = d[(d < dort - k*sigma) | (d > dort + k*sigma)]
aykiri_noktalar = supheli_noktalar[(np.abs(supheli_noktalar - dort)) > maks_uzaklik]
print(aykiri_noktalar)
d_yeni = np.delete(d, np.where(np.in1d(d, aykiri_noktalar))[0])
# Buldugumuz aykiri nokta deger(ler)ini supheli noktalar dizimizden de cikaralim
supheli_noktalar =  np.delete(supheli_noktalar, np.where(np.in1d(supheli_noktalar, aykiri_noktalar))[0])
print(d_yeni)
[89.]
[101.2  90.   99.  102.  103.  100.2  98.1 101.5 102. ]

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.

In [37]:
# aykiri nokta kabulu icin izin verilen maksimum uzaklik
# degerini (10, 2) icin tablodan aliyoruz
R = 1.570
maks_uzaklik = R*sigma
print("Maksimum uzaklik: {:.4f}".format(maks_uzaklik))
# Supheli noktalar dizimizi degistirebilirdik cunku birini attik ancak buna gerek yok
# cunku attigimiz nokta yeni dizimizde zaten yok
aykiri_noktalar = supheli_noktalar[(np.abs(supheli_noktalar - dort)) > maks_uzaklik]
print(aykiri_noktalar)
d_yeni = np.delete(d_yeni, np.where(np.in1d(d_yeni, aykiri_noktalar))[0])
print(d_yeni)
Maksimum uzaklik: 7.4759
[90.]
[101.2  99.  102.  103.  100.2  98.1 101.5 102. ]

$| 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!

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.

In [38]:
# aykiri nokta kabulu icin izin verilen maksimum uzaklik
# degerini (10, 2) icin tablodan aliyoruz
R = 1.380
maks_uzaklik = R*sigma
print("Maksimum uzaklik: {:.4f}".format(maks_uzaklik))
# Supheli noktalarimizi bitirdiğimiz icin tum d dizisinde tekrar bakalim
aykiri_noktalar = d_yeni[(np.abs(d_yeni - dort)) > maks_uzaklik]
print(aykiri_noktalar)
Maksimum uzaklik: 6.5712
[]

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.

$$ d = [101.2, 99.0, 102.0, 103.0, 100.2, 98.1, 101.5, 102.0] $$$$ d_{ort.} = 100.8750, \sigma = 1.5498 $$

olarak bulunur.

İkinci bir tur daha yapıp yeni şüpheli noktalar belirleyip, tekrar deneyebiliriz.

In [39]:
d = d_yeni.copy()
dort = d.mean()
sigma = d.std()
k = 2.0 # Bu kez 2 sigmayi dikkate alalim
print("Yeni ortalama: {:.4f}, Yeni standart sapma: {:.4f}".format(dort,sigma))
print("Olasi aykiri notktalar: ", d[(d < dort - k*sigma) | (d > dort + k*sigma)])
plt.plot(d, 'ro')
plt.axhline(y = dort, ls="-")
plt.axhline(y = dort - k*sigma, ls="--")
plt.axhline(y = dort + k*sigma, ls="--")
plt.show()
Yeni ortalama: 100.8750, Yeni standart sapma: 1.5498
Olasi aykiri notktalar:  []

İki $\sigma$ dahilinde yeni bir aykırı nokta bulamadık. Ancak $1.5 \sigma$ dahilinde bulabilirdik (98.1).

Peirce kriterinden yararlanılarak aykırı nokta bulan algoritma için bir Python kodu 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.

Başa Dön

Kutu Grafikleri

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.

Veri seti toplamda dört adet çeyrek adı verilen aralığa bölünür.

In [40]:
from IPython.display import Image
Image(filename='images/boxplot.png', width=600)
Out[40]:

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.

In [41]:
from IPython.display import Image
Image(filename='images/boxplot_normaldistro.png', width=600)
Out[41]:

matplotlib 'de kutu grafikleri üretmek için pek çok seçenek bulunmaktadır.

In [42]:
# np.random.randn fonksiyonuyla normal bir dagilimdan
# rastgele secilen 5000 deger kullanilarak olusturulmus
# bir veri setimiz olsun
rstglvr = np.random.randn(5000)  * 20 + 20
plt.boxplot(rstglvr, 0, 'bx')
plt.show()

Bir kutu grafiğinin değerlerine ise numpy fonksiyonlarıyla ulaşılabiir.

In [43]:
ortanca = np.median(rstglvr)
Q1 = np.percentile(rstglvr, 25)
Q3 = np.percentile(rstglvr, 75)

IQR = Q3 - Q1
ust_limit = rstglvr[rstglvr <= Q3 + 1.5*IQR].max()
alt_limit = rstglvr[rstglvr >= Q1 - 1.5*IQR].min()

print("Ortanca: {:.2f}, Q1: {:.2f}, Q3: {:.2f}".format(ortanca,Q1,Q3))
print("IQR: {:.2f}, Ust Limit: {:.2f}, Alt Limit: {:.2f}".\
      format(IQR,alt_limit,ust_limit))

aykiri_noktalar = rstglvr[(rstglvr > ust_limit) | (rstglvr < alt_limit)]
print(aykiri_noktalar)

# Simdi bu aykiri noktalari rastgele veri dizimizden atıp
# her iki diziyi de cizdirelim.
# numpy.delete fonksiyonu verilen bir dizi icinde verilen indekslerdeki degerleri siler
# bu nedenle numpy.argwhere fonksiyonuyla kosulun saglandigi indeksleri alarak
# numpy.delete fonksiyonuna sagliyoruz.
aykiri_noktalar_indeksler = np.argwhere((rstglvr > ust_limit) | (rstglvr < alt_limit))
temizlenmis_veri = np.delete(rstglvr, aykiri_noktalar_indeksler)
plt.plot(rstglvr, 'r.')
plt.plot(aykiri_noktalar_indeksler, aykiri_noktalar,'bx')
plt.show()
Ortanca: 19.38, Q1: 6.35, Q3: 32.99
IQR: 26.64, Ust Limit: -33.51, Alt Limit: 71.98
[ 76.47715649  86.54288365 -35.6124544   80.89100875  76.91485918
  77.9670822  -34.77972219  84.59405549  83.0594066   80.14298933
 -34.78174228 -41.40439917  92.56046332  76.40121325 -33.92377102
 -36.03173734 -46.75229512  83.45704405 -44.93251487 -37.2622377
  91.88658722  81.38312742 -39.65670178  78.27966726  86.63112491
 -43.46256723 -38.15909021 -34.96714479  74.26841488  78.0156843
  77.30040014  77.67189989 -37.45222866  77.20838796 -36.56269875]

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.

In [44]:
# bunun icin alternatif bir yöntem bir dizinin degerlerini bir baska dizide arayan
# np.ind1d fonksiyonudur. Bu fonksiyonun ciktisi np.where'e verilerek istenen
# indeksler bulunabilir.
aykiri_noktalar_indeksler2 = np.where(np.in1d(rstglvr,aykiri_noktalar))
print(aykiri_noktalar_indeksler2)
(array([ 166,  587,  694,  799,  863, 1073, 1229, 1288, 1474, 1998, 2014,
       2053, 2056, 2109, 2128, 2146, 2212, 2224, 2340, 2713, 2824, 2832,
       3065, 3437, 3521, 3570, 3574, 3673, 3725, 3844, 3873, 3900, 4227,
       4515, 4668]),)

Bu algoritmaların dışında kümeleme algoritmaları (DBScan Clustering, k-means clustering ve makine öğrenmesi algorimatları (Isolation Forest, Random-Cut Forest) gibi daha komplike ayıklama algoritmaları da ihtiyaca yönelik olarak kullanılabilir.

Kaynaklar