9 Mayıs 2014 Cuma

Veri Analizinde Uygulanan Adımlar - 9 (R Diline Giriş)

Bir önceki yazımda size hava durumu verilerinden bahsetmiş ve kolaylıkla kullanabilmeniz için bazı veriler ile bu verileri elde etmenize yarayacak kısa bir programı paylaşmıştım. Bu yazıda ise R programlama diline hızlı bir giriş yapacağım ve bir programlama dilini öğrenmenin ne kadar kolay olduğundan bahsedeceğim.

R programlama diline giriş yapmadan önce yazılımın doğasından bahsetmek istiyorum. Kendi kendine hareket eden veya belirli bir hareketi sürekli tekrarlayan makinalar üretmenin kıymetini insanoğlu sanayi devrimiyle birlikte hızlı bir şekilde kavradı ve bu tarz sistemler gelişmeye yoğunlaştı. Bir diski sürekli döndürecek bir mekanizma tasarlarsanız ve bu diske bir makara, zincir veya tekerlek bağlarsanız, daha önce hiç ulaşamadığınız hızlara ulaşır veya yine daha önce hiç taşıyamadığınız yükleri taşımaya başlarsınız. Aynı şey sayılar için de geçerli: eğer böyle bir mekanizmayı kabaca dört işlem için de geliştirebilirseniz, o zaman çok karmaşık hesaplamaları insan hatası olmadan gerçekleştirebilirsiniz. Ancak bu tarz mekanik sistemlerin -bence- en büyük problemlerinden biri, sıkı bir şekilde kontrol edilmelerine olan ihtiyaçtır. Yani, bir otomobil motorunu sağlıklı bir şekilde kontrol edemezseniz ya motora, ya otomobile, ya da içerisindeki insana zarar verirsiniz. Aynı şey diğer tüm mekanik sistemler için de geçerli: bir sistemi programlayabildiğiniz ölçüde verim alabilirsiniz. Programlama deyince karşımıza algoritma kavramı çıkıyor.

Algoritma, bir problemi çözmek için izlenen adımların bütününe verilen ad. Şöyle bir örnek verelim: bir çay makinası tasarlıyorsunuz ve amacınız suyun sıcaklığını 90 °C'de tutmak. Bunu şu şekilde kurallara bağlayabilirdik: Suyun sıcaklığı 90 dereceden küçükse sisteme elektrik akışını devam ettir, aksi takdirde akımı kes. Bunu bir de çizerek ifade edelim: ilgili algoritmayı yanda görebilirsiniz. Burada bahsettiğim kurallar dizisini yabancı bir dilde ifade edecek olsaydım, o dilin kendine has üslubu ve kelimeleriyle dile getiriyor olurdum. Aynı şekilde, bunu yine bir nevi yabancı dil olan R diliyle ifade etmek içinse, bu dilin kendi kuralları ve kendi kelimeleriyle anlatırdım. Yandaki diyagramı ele alalım: her aşamada tekrarlanan temel iki süreç var. Bunlardan ilki, sıcaklığı ölçmek. Sıcaklığı ölçtükten hemen sonra ise ölçtüğümüz değerin 90'dan küçük olup olmadığını kontrol ediyoruz. Aslında bundan doğrudan yandaki şekilde bahsetmiyoruz ama, çay makinası fişe takılı olduğu sürece bunu sürekli tekrarlıyoruz. R dilinde bu koşullu tekrarları while kalıbı ile ifade ederiz:
while( fişeTakılıMı() ){
...
}
Yukarıdaki gösterim, çay makinası fişe takılı olduğu sürece { ve } işaretlerinin arasındaki komutları sonsuza dek tekrarlamanın sembolik ifadesidir. Bizim istediğimiz şey, bu kısımda önce sıcaklık ölçümü yapmak, ardından duruma göre akımı kesmek veya akımı devam ettirmektir. Önce sıcaklık ölçümüne ilişkin ifadeyi ekleyelim:
while( fişeTakılıMı() ){
sıcaklık = sıcaklığıÖlç()...
}
Konuşma dilinde verdiğimiz komutların R dilindeki karşılığı fonksiyonlardır. Fonksiyonlar, ilgili harf dizisinin sonuna ( ve ) işaretlerinin konulmasıyla belirtilir. Bunun detaylarına ileride değineceğiz. Hatırlamamız gereken bir diğer şey ise, bilgisayarların bizimki gibi kendiliğinden işleyen bir hafızalarının olmadığıdır. Bu nedenle, her seferinde akıllarında tutmaları gereken şeyleri bizim belirtmemiz gerekir. Yukarıdaki örnekte bilgisayara, sıcaklığı ölçtükten sonra bunu aklında tutması gerektiğini söylüyoruz ve buna ilişkin hafızasında tuttuğu değeri de sıcaklık kelimesi ile ilişkilendiriyoruz. Böylece, ölçülen değere tekrar ulaşmak istediğimizde hafızada tutulan ölçüm değerini bu isimle hatırlayacağız. Bir sonraki adımda yapmak istediğimiz şey, elde ettiğimiz sıcaklık değerinin 90'dan küçük olup olmadığının kontrolü. Bunun R dilinde ifade edilmesi ise if-else kalıbı ile oluyor. Eğer ilgili koşul doğru ise if'ten [if'in Türkçe karşılığı eğer'dir] hemen sonra gelen kısım, eğer doğru değil ise else'ten [else'in Türkçe karşılığı veya'dır] hemen sonra gelen kısım dikkate alınıyor. while ve if-else tarzındaki ifadelere koşul ifadeleri deniyor, ve her bir koşulun sağlanması durumunda nelerin yapılması gerektiği ise takip eden { ve } işaretleri arasında belirtiliyor. Daha önce hafızaya attığımız sıcaklık ölçüm değerine ise if koşulunun içerisinde tekrar ulaşmak istiyoruz, bu nedenle o değeri sıcaklık ismini kullanarak ilgili kısımda hatırlıyoruz. Yani bu durumda ifadeyi şu şekilde yazabiliriz:
while( fişeTakılıMı() ){
sıcaklık = sıcaklığıÖlç() 
if (sıcaklık < 90) {
elektrikAkımınıDevamEttir()
} else {
elektrikAkımınıKes() 
}
}
Türkçe ifade ettiğimiz çay makinası çalışma kurallarını önce yukarıdaki diyagramda yer alan tarzda bir kurallar dizisine çevirdik, ardından bu kurallar dizisini de R dilinde tekrar ifade ettik. Yukarıdaki ifadeye iki komut daha ekledik, ve bunların hafızaya eklenen değerler olmayıp da birer komut olduğunu belirtmek için de sonlarına ( ve ) işaretlerini ekledik: elektrikAkımınıDevamEttir() ve elektrikAkımınıKes().

İşte bu kadar! Tabii ki bu haliyle bu programı çalıştıramayız, çünkü yukarıda ifade ettiğimiz komutların gerçekte nasıl yapılacağını henüz bilgisayara anlatmış değiliz. Bu nedenle yukarıda belirttiğimiz her bir komutu (yani programlama jargonuyla, fonksiyonu) ayrıca teker teker açıklamamız gerekecek. Buna ilişkin detaylardan bir sonraki yazıda bahsediyor olacağım. Kulübe hoşgeldiniz :)


Sözün Özü:
Bir bilgisayar programı yazmak, Türkçe ifade ettiğimiz komutlar dizisini bir yabancı dile çevirmek gibidir. Tek fark, çoğu zaman bu çeviriyi yaparken yukarıda yer alan bir diyagrama ihtiyacımızın olmasıdır. Bir programlama dilini öğrenirken karşımıza çıkan en karmaşık süreç ise, bu diyagramın oluşturulmasıdır.




Proje:
Bardakla su içmeye ilişkin komutları yukarıdaki gibi bir diyagramla göstermeye çalışın. Bardaktan suyun akışını sürekli kontrol etmemiz ve buna göre elimizi ne kadar kaldırmaya karar verdiğimiz, ne zaman suyu içmeyi bitirdiğimiz vb. süreçlerin aslında ne kadar detaylı olduğunu göreceksiniz. Mümkün olduğunca bu süreçleri ve komutları detaylandırın.

Meraklısına:
Programlama dillerinin gelişimine ilişkin bir özete buradan ulaşabilirsiniz.