R ile Enerji Analizi Bölüm 5 Biraz da Programlama Yıllara göre Haftanın Günleri Grafiği
Özet: Bu bölümde daha önceki çalışmalarımızın üzerine, basit birkaç programlama denemesi yapacağız. Kullanacağımız komutlar for, replicate, seq gibi basit komutlar. Bir de { ile kod bloklarını göreceğiz. Bu Bölümdeki Fonksiyonlar read.csv plot(veri, pch=<veri noktası karakter no>, cex=<karakter büyüklüğü>,col=renk) par(mfrow=c(2,2)) dev.off() with(<2007li yıl sütunları için>, <ortalama_tuketimi ortalama_sicaklika göre çiz>) ilk:son seq(başlangıç, bitiş, adım miktarı) c(başlangıç:bitiş) for(değişken in dizi){ komut1(değişken) komut2(değişken) } replicate(<tekrar sayısı>,<tekrar edilecek kısım>)
5.0. Veriyi yüklemek Her zamanki gibi veri dosyamızı tekrar yükleyelim. veri=read.csv("http://www.barissanli.com/calismalar/dersler/r/elektrik-talep.csv", header=TRUE,sep=";",dec=".") Artık veri dosyamız R Studiodan erişilebilir. 5.1. Ekranı 4e bölmek Daha önce yaptığımız analizlerde, hep tek bir çizim üzerinden hareket etmiştik. Þimdi aynı anda ekranda 1den fazla çizimi görüntülemek için yapmamız gerekenlere bakabiliriz. Amaç: Her yıl için ortalama_tuketimin ortalama_sicaklik ile değişimini tek ekranda dört ayrı çizimle görmek Öncelikle grafik parametrelerimizde ekranı 4 ayrı parçaya ayırmaya çalışalım. Bunun için bir komut bir de mfrow parametresini kullanacağız. par( parametreler) par ile yapacağımız çizimlerdeki parametreleri önceden set edebiliyoruz. Detaylarını ?par Yazarak örneği ile görebilirsiniz. Bu sefer par komutu ile mfrow parametresini değiştireceğiz. 2x2 yani 4 ayrı çizim istiyoruz. Ve burada önce ilk iki satırı sonra alttaki iki satırı dolduracağız. Hatırlatmak gerekirse, c(2,2), bir vektör olarak iki tane iki içeriyor. mfrow komutunda bunların ilki satır sayısını, ikincisi ise sütun sayısını veriyor. Biz şimdilik 2x2 bir çoklu çizim ekranı istiyoruz. par(mfrow=c(2,2)) Eğer ekranı resetleyip herşeyi eski haline getirmek isterseniz dev.off() yazmanız yeterli
5.2. Dört yıl grafikleri aynı ekranda Þimdi hiç grafik parametrelerine girmeden sırasıyla aşağıdaki işlemleri yapalım 1. Bu egzersizi daha önce yapmış olma ihtimalinize karşı, herşeyi sıfırlayalım. dev.off() 2. Sonra ekranı 4 eşit parçaya bölelim par(mfrow=c(2,2)) 3. Daha sonra ise with ile filtreleyerek, 2007, 2008, 2009 ve 2010 yıllarını ekrana çizelim Evet ilk iki komut direkt aynen ekrana yansıtılır. dev.off() par(mfrow=c(2,2)) Þimdi artık hangi çizimi yapsak, ekranda soldan sağa, yukarıdan aşağı doğru sırasıyla ekrana çizilecektir. Yani her plot komutu ekranı sıfırlamayacak, bir öncekini değiştirmeden ekranda kendine ayrılan boşluğa çiziliecektir. Belki burada with komutunu hatırlatmakta yarar var. with(<veri seti koşulu>, komut) Þeklinde sınıflandırabileceğimiz bir komut. Mesela with(<2007li yıl sütunları için>, <ortalama_tuketimi ortalama_sicaklika göre çiz>) şeklinde kullanabiliriz. Ekranı 4e böldüğümüz için RStudioda her bir komuttan sonra grafiğin ekrana nasıl yansıdığına dikkat edin. Grafikleri birbirinden ayırmak için her birine birer başlık da eklememiz lazım. Bunun için main= parametresini kullanıyoruz. dev.off() null device 1 par(mfrow=c(2,2)) with(veri[veri$yil==2007,],plot(ortalama_sicaklik,ortalama_tuketim,main="2007 yılı")) with(veri[veri$yil==2008,],plot(ortalama_sicaklik,ortalama_tuketim,main="2008 yılı")) with(veri[veri$yil==2009,],plot(ortalama_sicaklik,ortalama_tuketim,main="2009 yılı")) with(veri[veri$yil==2010,],plot(ortalama_sicaklik,ortalama_tuketim,main="2010 yılı")) Biraz yorum yapalım, grafiklere baktığımız zaman hangi yılların daha sıcak ve ılık geçtiğini siyah çizgilerin yoğunlaşmasından görüyoruz. Buraya göre 2007 ve 2009 yılının diğer yıllara göre biraz daha soğuk geçtiği, 2008in sıcak geçtiği, 2010 yılının da ılık bir yıl olduğu iddia edilebilir.
5.3. Diziler ve for döngüsü Az önceki örnekte her yılı tek tek girmek hiçte kolay değildi, Bu tip durumlar için elimizde bir for komutu bulunmaktadır. for komutu kısaca, kendisine parametre olarak girilen dizi veya vektördeki elemanların hepsi için takip eden kodu çalıştırır. Forun hangi sayılar için çalışacağını belirlemek için ise seq(yani sequence, dizi) komutunu kullanabiliriz. Amacımız 1den 10a kadar birer birer artan bir seri elde etmek. Bunu iki şekilde yapabiliriz. 1:10 Ya da seq(1,10,1) # seq(başlangıç, bitiş, adım miktarı) Veya direkt bir vektör olarak da girebiliriz c(1:10) c(2007,2008,2009,2010) c(2007:2010) Þimdi ise her bir parametreyi kullanarak birşeyler yazdırmaya çalışalım. 2007 ile 2010 arasındaki her bir yıl için Yıl=<yıl> yazdıralım. Bunun için daha önceki dizileri bir yil değişkenine atıyoruz. yil in 2007:2010 diyerek, 2007 ve 2010 arasındaki her bir değişkeni sıra ile yil değişkenine atıyoruz. for(yil in 2007:2010) cat("Yil=",yil) komutu ile arka arkaya for(yil in 2007:2010) cat("\nYil=",yil) ile her bir satırbaşından sonra (\n satırbaşına işarettir) istediğimiz diziyi yazar Burada cat Linux ve Unix bilenlerin bildiği üzere iki diziyi birleştirir. Burada Yil= ve yil değişkenini birleştiriyor. Peki ya for döngüsünden aldığımız parametreyi bir den fazla komutu çalıştırmak için kullanmak istersek ne yapacağız ? bunun için de {} kullanmamız gerekir. Kısaca : for(değişken in dizi){ komut1(değişken) komut2(değişken) } Deneyelim. Sıra ile 1den 10a kadar olan sayıların karesi ve küpünü yan yana yazdıralım. for(degisken in 1:10){ cat(degisken) cat(" Karesi=",degisken^2) cat(" Küpü=",degisken^3) cat("\n") }
Görüldüğü üzere { ile başlayan kısım } ile kapatılana kadar, for ile tekrar edilen dizinin her defasında aynı işlemi yapıyor.
5.4. Herşeyi for ile tekrar yapmak Þimdi 5.2de yaptığımız ve dört defa tekrarladığımız komutu bir kez de for ile yapalım. Burada her bir yıl için öncelikle yil_d diye bir değişken tanımlıyoruz ki veri$yildaki yil ile karışmasın. Programımızın mantığı şu şekilde 1. Herşeyi sıfırla 2. 2x2 bir çizim ekranı parametresi ver 3. for döngüsü ile 2007den 2010a kadar her bir değişkeni sıra ile yil_dye ata 4. { ile başlayan noktadan } ile biten noktaya kadar olan alandaki tüm komutlar için yil_d değişkenini kullanarak : a. Önce veri setinde yil sütunu yil_d ye eşit olan sütunları seç b. (a) da seçilen sütunlar için grafiği çiz, başlığına (main) yil_d değişkenini yerleştir.
dev.off() par(mfrow=c(2,2)) for(yil_d in 2007:2010){ with(veri[veri$yil==yil_d,],plot(ortalama_sicaklik,ortalama_tuketim,main=yil_d)) }
5.5. İşleri Karıştıralım : Her Bir Yıl için Günlere ayrıştırmak Evet yıllara göre verimi çizdirdim. Fakat daha farklı bir analiz yapmak istiyorum. Haftanın günlerine göre ortalama_tüketimin ortalama tüketim ile değişimi nasıl acaba? Amaç: Her bir yıl için hafta içi günler için bir renk, Cumartesi için ayrı renk, Pazar için ayrı renk ile görmek istiyorum. Hatırlayalım, günlerim Pazartesi=1 ile başlıyor ve Pazar=7 ile son buluyordu. Yani ilk 5 gün için aynı renkler, sonra Cumartesi için başka bir renk, Pazar için ayrı bir renk tanımlayacağım. Bunun için replicate, komutunu kullanacağım. Yani renklerimi : renklerim=c("red","red","red","red","red","green","blue")
şeklinde tanımlayabilirim. Fakat daha kolayı var. Madem 5 tane red yani kırmızım var: replicate(5,"red") Bunu da diğer renklere ekleyerek c(replicate(5,"red"),"green","blue")
Artık elimde 7 renkli bir seri var. Þimdi az önceki grafiklerimizi renklendirelim. Bu sefer plot komutunun col= parametresini renklerim[haftagunu] ile çağıracağım. renklerim[haftagunu] parametresi, haftagununnun 1 ile 5 arasında olduğu günler için kırmızı, 6 için yeşil, 7 için mavi değerini verecektir. Bu da plot komutunun col= parametresine ekleniyor par(mfrow=c(2,2)) for(yil_d in 2007:2010){ with(veri[veri$yil==yil_d,],plot(ortalama_sicaklik,ortalama_tuketim,col=renklerim(haftagunu),main=yil_d)) }
Þimdi çizdirelim:
Burada isterseniz daha önce pch= gibi parametreleri de ekleyebilirsiniz.
5.6. Biraz Analiz Yıllara göre hafta sonunun değişkenliklerine baktığımızda, pazarın ayrıştığını ama cumartesinin tam olarak ayrışmadığını gözlemliyoruz. Her ne kadar Cumartesi diğer hafta içi günlere göre tüketimi düşük olsa da, özellikle pazar gününde ciddi bir düşüş bulunmaktadır. Bir de dikkat ettiysek bazı seri dışında davranan günler var, mesela haftaiçi olmasına rağmen tamamen outlier diyebileceğimiz noktalar Bu günler de bayram günleridir. Özellikle daha önce değindiğimiz gibi, kurban ve ramazan bayramlarında tüketim ciddi oranda düşüyor. Peki Pazar günlerinin diğer günlerden farkı ne? Bunu hepimiz evimizden, işimizden daha doğrusu yaşam aktivitemizden biliyoruz. Fakat cevabını bir sonraki bölümde vermeye çalışacağız. 5.7. Bölüm Sonu Bu bölümde, Rda programlamaya küçük bir giriş yaptık. Aynı işi 4 kere yapmak için, 4 defa komut girmek yerine for komutunu kullanmayı öğrendik. for komutu parametre olarak girilen bir dizinin her bir elemanı için kendinden sonra gelen komut bloğunu veya { ile } kısmı tekrar ediyordu. Daha sonra replicate ile kırmızı rengi 5 kere tekrar ederek, ona yeşil ve mavi renklerle birleştirdik.
Komutlar veri=read.csv("http://www.barissanli.com/calismalar/dersler/r/elektrik-talep.csv", header=TRUE,sep=";",dec=".") ?par ?mfrow par(mfrow=c(2,2)) with(veri[veri$yil==2007,],plot(ortalama_sicaklik,ortalama_tuketim)) plot.new() dev.off() par(mfrow=c(2,2)) with(veri[veri$yil==2007,],plot(ortalama_sicaklik,ortalama_tuketim)) dev.off() par(mfrow=c(2,2)) with(veri[veri$yil==2007,],plot(ortalama_sicaklik,ortalama_tuketim)) with(veri[veri$yil==2008,],plot(ortalama_sicaklik,ortalama_tuketim)) with(veri[veri$yil==2009,],plot(ortalama_sicaklik,ortalama_tuketim)) dev.off() par(mfrow=c(2,2)) with(veri[veri$yil==2007,],plot(ortalama_sicaklik,ortalama_tuketim,main="2007 yılı")) with(veri[veri$yil==2008,],plot(ortalama_sicaklik,ortalama_tuketim,main="2008 yılı")) with(veri[veri$yil==2009,],plot(ortalama_sicaklik,ortalama_tuketim,main="2009 yılı")) with(veri[veri$yil==2010,],plot(ortalama_sicaklik,ortalama_tuketim,main="2010 yılı")) for(ade in seq(1,1,10)) print(ade) seq(1,10,1) for(ade in seq(1,1,10)) print(ade) for(ade in seq(1,10,1)) print(ade) 1:10 for(a2 in 1:10) print(a2) seq(1,10,1) yillar=c(2007,2008,2009,2010) c(2007,2008,2009,2010) c(1:10) c(2007:2010) for(yil in 2007:2010) cat("\nYil=",yil) for(degisken in 1:10){ cat(degisken) cat(" Karesi=",degisken^2) cat(" Küpü=",degisken^3) cat("\n") } dev.off() par(mfrow=c(2,2)) for(yil_d in 2007:2010){ with(veri[veri$yil==yil_d,],plot(ortalama_sicaklik,ortalama_tuketim,main=yil_d)) dev.off() par(mfrow=c(2,2)) for(yil_d in 2007:2010){ with(veri[veri$yil==yil_d,],plot(ortalama_sicaklik,ortalama_tuketim,main=yil_d)) } replicate(4,"a") renklerim=c("red","red","red","red","red","green","blue") replicate(5,"red") c(replicate(5,"red"),"green","blue") renklerim=c("red","red","red","red","red","green","blue") renklerim=c(replicate(5,"red"),"green","blue") for(yil_d in 2007:2010){ with(veri[veri$yil==yil_d,],plot(ortalama_sicaklik,ortalama_tuketim,col=renklerim[haftagunu],main=yil_d)) } par(mfrow=c(2,2),pch=19,cex=0.7) for(yil_d in 2007:2010){ with(veri[veri$yil==yil_d,],plot(ortalama_sicaklik,ortalama_tuketim,col=renklerim(haftagunu),main=yil_d)) } par(mfrow=c(2,2),pch=19,cex=0.7) for(yil_d in 2007:2010){ with(veri[veri$yil==yil_d,],plot(ortalama_sicaklik,ortalama_tuketim,col=renklerim[haftagunu],main=yil_d)) }
|