arşiv

yazar arşivi

Mod ve Medyan

Cuma, 08 Nis 2011

Malum, bu aralar YGS’deki hadise nedeniyle ülkenin gündemine iki kavram girdi: mod ve medyan. Ancak “seçenekleri kaydırarak doğru eşleşmeyi bulmaya yarayan yöntem mod-medyan” şeklinde lanse edilen mod ve medyanın seçenek kaydırmayla pek ilgisi yok. Mod ve medyan, istatistik biliminde sıklıkla kullanılan kavramlardan ikisidir…

Peki nedir bu mod ve medyan denen şeyler?

Bir veri dizisi içinde en sık tekrar eden değere “mod” adı verilir.  ”Medyan” ise bir veri dizisinin en ortasında yer alan veridir…

Örneğin elimizde şöyle bir veri dizisi olduğunu düşünün:

7,  13,  18,  24,  9,  3,  18

Bu veri dizisinin modu 18′dir. Peki bu değeri nasıl buluyoruz?

Öncelikle yukarıdaki sayıları küçükten büyüğe doğru sıralıyoruz:

3, 7, 9, 13, 18, 18, 24

Gördüğünüz gibi, bu dizide en sık tekrar eden değer 18. Dolayısıyla bu dizinin modu 18′dir diyoruz.

Bir de şu diziye bakalım:

24,  15,  18,  20,  18,  22,  24,  26,  18,  26,  24

Bu dizinin modunu bulmak için öncelikle dizideki sayıları küçükten büyüğe doğru sıralıyoruz:

15,  18,  18,  18,  20,  22,  24,  24,  24,  26,  26

Gördüğünüz gibi, bu dizide en sık tekrar eden iki sayı var. Bunlar 18 ve 24. Bu iki sayı da, dizi içinde 3′er kez geçiyor. Dolayısıyla yukarıdaki dizinin modu 18 ve 24′tür diyoruz. İstatistikte bu duruma çift modlu dağılım adı verilir.

Bir de şu veri dizisine bir göz atalım:

2.7,  8.3,  3.5,  5.1,  4.9

Bunları küçükten büyüğe doğru sıralayalım:

2.7,  3.5,  4.9,  5.1,  8.3

Burada tekrar eden herhangi bir sayı yok. Dolayısıyla bu dizinin bir modu yoktur…

Gelelim medyana…

En başta dediğimiz gibi,  medyan bir veri dizisinin en ortasında yer alan veridir…

Örneğin:

12, 3, 5

Bu veri dizisinin medyanı 5′tir. Peki bu değeri nasıl buluyoruz?

Tıpkı mod hesaplamasında olduğu gibi önce sayıları küçükten büyüğe doğru sıralıyoruz:

3, 5, 12

Gördüğünüz gibi, en ortada yer alan sayı 5. Dolayısıyla bu dizinin medyanı 5′tir diyoruz.

Yukarıdaki örnekte 3 adet sayı var. Yani veri dizisinin uzunluğu bir tek sayı. Veri tipinin uzunluğunun tek sayı olduğu durumlarda medyanı bulmak kolaydır. Mesela:

3, 13, 7, 5, 21, 23, 39, 23, 40, 23, 14, 12, 56, 23, 29

Burada toplam 15 sayı var. Bu dizinin en ortasındaki sayıyı bulmak kolay: 23. Demek ki bu veri dizisinin medyanı 23′müş…

Peki ya veri uzunluğunun çift sayı olduğu durumlar?

Bakalım:

3, 13, 7, 5, 21, 23, 23, 40, 23, 14, 12, 56, 23, 29

Burada toplam 14 sayı var. Yani veri tipimizin uzunluğu bir çift sayı. Bu yüzden bu dizinin medyanını bulmak tek sayıdaki kadar kolay değil. Ama aslında tabii zor da değil.

Uzunluğu bir çift sayı olan veri tiplerinde medyanı bulmak için yine öncelikle sayıları küçükten büyüğe doğru sıralıyoruz:

3, 5, 7, 12, 13, 14, 21, 23, 23, 23, 23, 29, 40, 56

Daha sonra, dizinin en ortasında yer alan iki sayıya bakıyoruz. Bu sayılar 21 ve 23.

Ardından, bu iki sayıyı birbiriyle toplayıp, çıkan sayıyı 2′ye bölüyoruz:

(21 + 23) / 2 = 22

Elde ettiğimiz sayı bize dizinin medyanını veriyor.  Yani yukarıdaki dizinin medyanı 22′dir diyoruz…

Mod ve medyanı öğrendiğimize göre size şöyle bir soru sormama izin verin:

Bir Python programcısı olarak, mod ve medyanı kol kuvvetiyle bulmaya çalışmak size oldukça verimsiz ve anlamsız bir yol olarak görünmüş olmalı. Peki Python programlama dilini kullanarak mod ve medyanı nasıl hesaplayabiliriz?

Ben kendi yöntemimi yazayım. Siz daha verimli algoritmalar uygulayabilirsiniz. (Bu arada aşağıdaki kodları Python 3 kullanarak yazdım. Yani bu kodlar Python 2 ile çalışmaz):

import collections
 
def mode(lst):
    sayaç   = collections.Counter(lst)
    değer   = sayaç.values()
    sıklık  = sayaç.most_common()
    mod     = []
 
    if not max(değer) == 1:
        for i in range(list(değer).count(max(değer))):
            mod.append(sıklık[i][0])
 
        mod = ", ".join(map(str, mod))
 
    return mod if mod else "mod yok!"
 
def median(lst):
    uzunluk = len(lst)
    sıralı  = sorted(lst)
    orta    = int(uzunluk/2)
 
    if uzunluk % 2 == 1:
        med = sıralı[orta]
    else:
        med = (sıralı[orta] + sıralı[orta-1]) / 2
 
    return med
 
if __name__ == "__main__":
    test1 = [48, 44, 48, 45, 42, 49, 48]
    test2 = [9, 3, 3, 44, 17 , 17, 44, 15, 15, 15, 27, 40, 8]
    test3 = [34, 43, 81, 106, 106, 115]
    test4 = [13, 18, 13, 14, 13, 16, 14, 21, 13]
    test5 = [1, 2, 4, 7]
    test6 = [8, 9, 10, 10, 10, 11, 11, 11, 12, 13]
 
    t = [test1, test2, test3, test4, test5, test6]
    a = 0
 
    while a < len(t):
        for i in t:
            a += 1
            print("\nTEST%s"%a)
            print("dizi  : ", i)
            print("mod   : ", mode(i), "\n"
                  "medyan: ", median(i))

Bilginizi ve yukarıdaki betiği sınamak için bunlarla ilgili biraz alıştırma yapmak isteyebilirsiniz. Bunun için şu iki adresi ziyaret edebilirsiniz:

1) http://www.mathgoodies.com/lessons/vol8/mode.html

2) http://www.mathopolis.com/questions/quiz.php

Benim verdiğim ya da kendi yazdığınız mod-medyan hesaplama betiğini yukarıdaki adreslerde yer alan alıştırmalara uygulayın. Bakın bakalım betiğiniz mod-medyanı düzgün hesaplayabiliyor mu?

[NOT]: Yukarıdaki örneklerde yer alan veri dizileri aşağıdaki adreslerden alınmıştır

http://www.mathgoodies.com/lessons/vol8/mode.html

http://www.mathsisfun.com/median.html

Python, Teknik , , ,

Yeni Bileşenler

Pazartesi, 04 Nis 2011

Bugün istihza.com’da hem bazı önemli değişiklikler yaptık hem de sitemize yeni bileşenler ekledik. 4 Nisan 2011 tarihi itibariyle gerçekleşen yenilikler şöyle:

1. istihza.com takipçilerinin Python programlama dilini kullanarak yazdıkları programları tanıttığımız Python Programları adlı bölümün arayüzünü Sphinx altyapısını kullanarak tekrar hazırladık. Böylece bu bölüm görünüm olarak sitenin geri kalanıyla uyumlu bir hale gelmiş oldu. Ayrıca bu sayede bu bölüme program ekleyip çıkarmak çok daha kolay olacak. Python Programları bölümüne http://istihza.com/programlar/icindekiler_programlar.html adresinden erişebilirsiniz.

2. Bir PDF birleştirme programı olan HARMAN’ın sayfası da artık Sphinx’le hazırlanıyor. Bu sayede bu bölüm de sitenin geri kalanıyla uyumlu bir hale gelmiş oldu: http://istihza.com/harman/icindekiler_harman.html

3. Artık istihza.com’un bir de forumu var! http://www.istihza.com/forum/ Bu forum tamamen deneysel amaçlı. Böyle bir bileşenin ilgi görüp görmeyeceğini bilmiyorum. Amacım Python severlerin birbirlerine destek olabileceği bir ortam oluşturmak…

Bu yenilikler ve eklemeler tabii ki sunucuda yoğun bir belge hareketliliğine yol açtı. Dolayısıyla bu yenilikleri hayata geçirirken farkında olmadan bazı hatalar da yapmış olabilirim. Gördüğünüz hataları ve kusurları bana iletirseniz el birliğiyle kaliteli bir istihza.com ortaya çıkarmış oluruz…

Yenilikleri beğenmeniz ümidiyle,

istihza

istihza.com , ,

Pardus-2011 için Harman pisi paketi

Salı, 15 Mar 2011

Pardus’un 2011 sürümüne uygun Harman pisi paketine http://paketler.pardus-linux.org/P2011 adresinden ulaşabilirsiniz.  Bu paket, eski sürümlerde olduğu gibi, yine Pardus-Linux.Org tarafından hazırlandı.

Paketi hazırlayan ve bana haber veren Erdem Artan’a teşekkür ederim.

istihza.com, Yazılım , , ,

Windows Python 3.2′de bir Hata

Pazartesi, 14 Mar 2011

Python geliştiricileri Python 3 serisini geliştirmeye devam ediyor. Bu doğrultuda bir süre önce Python’ın 3.2 sürümü de yayımlandı. Ancak bu sürümde, Windows kullanıcılarını etkileyen ciddi bir hata var. Windows’ta input() fonksiyonu karakter dizilerinin sonuna bir adet “\r” karakteri yerleştiriyor. Bunu şu şekilde doğrulayabilirsiniz:

isim = input("Herhangi bir şey: ")
 
print(repr(isim))

Bu kodları çalıştırdığınızda, örneğin input() fonksiyonuna cevap olarak “python” yazmışsanız çıktı şöyle görünecektir:

‘python\r’

Bildiğiniz gibi, Python’da “\r” karakteri bir kaçış dizisidir. Bu kaçış dizisinin bulunduğu noktada Python karakter dizisinin başına döner ve bu kaçış dizisinden sonra gelen bütün karakterler karakter dizisinin başında bulunan karakterlerin üzerine yazar. Yani:

>>> print("Merhaba\r Dünya!")
 
 Dünya!

İşte Python 3.2′deki input() fonksiyonu da karakter dizilerinin en sonuna bu işareti yerleştirdiği için tuhaf çıktılar verilecektir:

isim = input("Adınız: ")
 
print("Merhaba", isim, end="!\n")

Bu kodları çalıştırdığınızda şöyle bir çıktı elde edersiniz:

!erhaba isim

Gördüğünüz gibi, karakter dizisinin en sonuna yerleşmesi gereken “!” işareti en başa dönüp karakter dizisinin ilk harfinin üzerine yazdı…

NOT: IDLE bu hatadan etkilenmiyor.

Bu hata ile ilgili kayda şuradan ulaşabilirsiniz:
http://bugs.python.org/issue11272

Bu hatayla ilgili bir örnek (ve çözümü) için şu adresi inceleyebilirsiniz:
http://www.python-forum.org/pythonforum/viewtopic.php?f=1&t=24263

Python , ,

istihza.com’da Python3

Salı, 08 Mar 2011

Bildiğiniz gibi, “istihza.com’da Python 2′ye mi yoksa Python 3′e mi ağırlık verilmeli?” sorusunu sorduğumuz anketi Python3 kazandı. O yüzden ben de fırsat bulabildikçe (çünkü bu aralar gerçekten işlerim başımdan aşkın) istihza.com’da Python3 bölümünü yazmaya çalışıyorum. Bu belgelerde Python’ın en son sürümü olan 3.2′yi anlatacağız. Yeni Python sürümleri çıktıkça da yazıları güncelleyeceğim.

Gelelim asıl konumuza…

Python3 pek çok GNU/Linux dağıtımının deposuna henüz girmedi. O yüzden Python3 kullanmak isteyen pek çok kişi Python’ı kaynaktan derlemek zorunda. Python kaynaktan derlenirken bütün modüllerin inşa edilebilmesi için aşağıdaki paketlerin sistemde halihazırda kurulu olması gerekiyor:

tcl8.5-dev

tk8.5-dev

zlib1g-dev

ncurses-dev

libreadline-dev

libdb-dev

libgdbm-dev

libzip-dev

libssl-dev

libsqlite3-dev

libbz2-dev

Bu paketlerin adları Ubuntu’ya göre… Doğal olarak, GNU/Linux dağıtımları arasında paket adları farklılık gösteriyor.

Benim yapmak istediğim şey şu: Python3′ün kaynaktan nasıl derleneceğini anlatırken, yukarıdaki bağımlılıkların farklı dağıtımlardaki adlarını da bir tablo halinde göstermek istiyorum. Dediğim gibi, yukarıdaki paket adları Ubuntu’ya ait. Eğer Ubuntu dışındaki dağıtımları kullanan arkadaşlarım bana yukarıdaki paketlerin kendi dağıtımlarındaki adlarını yazabilirlerse çok memnun olurum.

Şimdiden teşekkürler,

Fırat

istihza.com, Python , , , ,

Arch Linux ve Python 3

Salı, 22 Şub 2011

http://www.archlinux.org/news/python-is-now-python-3/ adresinden okuduğuma göre, Arch Linux dağıtımında öntanımlı “python” paketi artık 3.x serisini kuruyor. 2.x serisi ise “python2″ adlı başka bir pakete gönderilmiş. Dolayısıyla Python’ın 2.x serisinden bir sürüm kullanarak yazdığınız bir Python programının Arch Linux üzerinde çalışabilmesi için “shebang” satırınızın /usr/bin/python2 olması gerekiyor… Eğer eskisi gibi /usr/bin/python (veya /usr/bin/env python) satırını kullanacak olursanız, Python 2.x serisinden bir sürümle yazdığınız programınız Arch Linux üzerinde çalışmayacak.

Ubuntu ve Fedora gibi dağıtımlar ise Python 3 sürümlerini “python3″ adlı bir paket olarak sunuyor. “python” adlı paket ise Python’ın 2.x sürümlerine işaret ediyor.

Bence Arch Linux’un bu hamlesi için henüz vakit erken. Siz ne dersiniz?

GNU/Linux, Python , , , ,

Windows Kullanıcılarından bir İstek

Salı, 15 Şub 2011

Şu sıralar vakit buldukça Python 3 bölümünü yazıyorum. Bir bölümde Windows işletim sistemi ile ilgili bir bilgiye ihtiyacım var. Bunun için aşağıdaki komutların farklı sistemlerdeki çıktısını öğrenmem gerekiyor:

wmic OS get CreationClassName

ve

wmic OS get OSArchitecture

Özellikle Windows XP, Windows Vista ve Windows 7 kullanıcılarının bana yukarıdaki komutların kendi sistemlerindeki çıktısını göndermesini rica ediyorum.

Not: Bu komutları Başlat > Çalıştır penceresinde “cmd” komutunu verdikten sonra açılan MS-DOS ekranına yazıyoruz.

Yardımcı olanlara şimdiden teşekkürler.

Fırat

Python, Teknik ,

Windows Vista’da Python’ı YOL’a Eklemek

Perşembe, 27 Oca 2011

Windows kullanıcılarının Python’ı nasıl YOL’a ekleyeceklerini http://www.istihza.com/py2/windows-path.html adresinde anlatmıştım. Aldığım geri bildirimlere göre, burada gösterilen yöntem WinXP, WinVista ve Win7′de çalışıyordu. Ta ki düne kadar…

Dün bir Windows Vista kullanıcısından bir e.posta aldım. Bu kullanıcı, indirdiği Python’ı bir türlü YOL’a ekleyememiş. Sorunu çözmek için epey uğraştıktan sonra şöyle bir çözüm buldum:

Python’ı YOL’a eklerken dizin adını (mesela) C:\Python27 değil, “C:\Python27″ şeklinde tırnak içinde yazıyoruz…

http://www.istihza.com/py2/windows-path.html adresinde anlattığım yöntem hala geçerliliğini koruyor. Ancak orada anlatılan her şeyi düzgün bir şekilde yaptığınız halde “python” komutuyla etkileşimli kabuğa ulaşamıyorsanız, Python dizinini bir de tırnak içine almayı deneyin…

Python’ı YOL’a eklerken %99 ihtimalle bu tırnakları koymanıza gerek kalmayacaktır. Ama dediğim gibi, en son çare olarak tırnaklar aklınızda bulunsun. Windows Vista’nın neden böyle davrandığı konusunda ise hiçbir fikrim yok…

Python , , , ,

Karakter Dizileri’ne ilişkin bir soru

Pazartesi, 24 Oca 2011

Bildiğiniz gibi, şöyle bir komut Python’ın hata vermesine yol açacaktır:

>>> print("Python programlama dilinin adı "piton" yılanından gelmez")
 
  File "<stdin>", line 1
    print("Python programlama dilinin adı "piton" yılanından gelmez")
                                                ^
SyntaxError: invalid syntax

Normal şartlarda yukarıdaki karakter dizisini yazdırmanın en kolay yolu karakter dizisini tek tırnaklar içine almaktır:

>>> print('Python programlama dilinin adı "piton" yılanından gelmez')
 
Python programlama dilinin adı "piton" yılanından gelmez

Dediğim gibi, yukarıdaki ilk komut çalışmaz. Bir de şuna bakın:

>>> print("Python programlama dilinin adı " " yılanından gelmez")
 
Python programlama dilinin adı  yılanından gelmez

Sizce bu komutun hata vermeden çalışmasının nedeni nedir?

Bu sorunun cevabı aslında insan algısının nasıl da tek bir noktaya takılıp kalabileceğini ve en basit detayları bile gözden kaçırabileceğini gösteriyor…

Python ,

Testdisk-PhotoRec

Salı, 11 Oca 2011

TestDisk, sen aşırı derecede sevimli bi şeysin…

Kedi canını senin… :)

Bugün de hayatımı kurtardın.

Yazılım ,