Bu hafta R ile veri analizi dersinde, ilk bölümde fonksiyonlar konusu üzerinde durduk. Fonksiyonlar, belirli bir görevi yerine getirmek için yazılan komut gruplarıdır ve oldukça önemlidir. Öğrendiğim en temel nokta, fonksiyonların girdilere (argümanlar) ihtiyaç duyması ve bu girdilere dayalı olarak çıktılar üretmesidir. Fonksiyonlar kod tekrarını azaltır, kodu daha okunabilir ve etkili hale getirir.
Bu hafta fonksiyonların argümanlarının sıralaması, varsayılan
değerleri ve zorunlu/isteğe bağlı argümanların nasıl kullanıldığı
üzerinde duruldu.
Özellikle R’daki rnorm()
fonksiyonu üzerine çalıştık.
rnorm()
, normal dağılımdan rastgele sayılar üretir ve bunun
için girdiler olarak gözlem sayısı (n)
, ortalama
(mean)
, ve standart sapma (sd)
argümanlarını
kullanır. Bu argümanlardan n
zorunludur; eğer
mean
ve sd
belirtilmezse, varsayılan değerleri
sırasıyla 0 ve 1 olarak kullanılır.
rnorm()
Fonksiyonuna Örnek Kod:
## [1] 0.96848929 1.96536781 0.88632253 0.03054026 0.94955742
Yukarıdaki kod ile üretilen sayıların ortalaması 0 ve standart sapması 1’dir.Ancak fonksiyona farklı ortalama ve standart sapma değerleri vererek bu dağılımı değiştirebiliriz.
# Ortalaması 20 ve standart sapması 2 olan ile 50 adet rastgele sayı üretimi
rnorm(n = 50, mean = 20, sd = 2)
## [1] 18.84654 21.44305 21.23820 20.04201 20.54970 17.16473 16.43738 18.76073
## [9] 21.01709 16.49411 17.01019 20.59835 19.37120 21.87226 22.94198 18.27840
## [17] 21.93568 22.11050 20.38267 18.57904 18.53053 19.83714 18.26454 17.18250
## [25] 23.59795 16.14366 22.02493 22.94789 19.43978 18.11785 19.16134 16.84588
## [33] 22.23885 19.07103 17.82523 19.19307 23.63482 19.91259 21.66282 20.37565
## [41] 20.54060 19.15477 19.28404 17.83141 18.98056 22.05911 21.21160 24.40743
## [49] 18.74273 22.19400
Bu haftanın önemli kazanımlarından biri, argümanların isimlerini
kullanarak yazılabileceğini, ancak sıralamaya dikkat edildiği sürece
isimlerin zorunlu olmadığını öğrenmek oldu.
Fonksiyon yazarken her bir argümanın ne anlama geldiğini anlamak için
yardım belgelerinden nasıl yararlanabileceğimizi de keşfettik. Örneğin,
?rnorm
ile rnorm()
fonksiyonunun tüm
detaylarına ulaşabiliyoruz.
Dersin devamında ise kişisel fonksiyon yazmayı öğrendik. Örneğin, sürekli kare alma işlemi yapmak zorunda olduğumuz bir senaryoda, fonksiyonu yazarak bu işlemi kolaylaştırabileceğimin farkına vardım.
# Kare alma fonksiyonu
kare_al <- function(sayi) {
return(sayi * sayi)
}
# Fonksiyonu çalıştırma
kare_al(4)
## [1] 16
Bu fonksiyon, girilen sayının karesini almamızı sağlar. Bir başka örnek olarak, üs alma fonksiyonunu öğrendik:
## [1] 9
Burada üs argümanı için varsayılan değer olarak 2 girilmiştir, yani eğer bir değer girilmezse, fonksiyon sayının karesini alacaktır.
Fonksiyonlar yazarken ya da kod yürütürken hata ayıklamanın önemini bu hafta daha da iyi kavradım. R’de kod yazarken karşılaştığım bazı yaygın hatalar şunlar oldu:
rm(list = ls())
komutuyla) iyi bir uygulama
oldu.Bu haftaki konular, programlama becerilerimi geliştirmemde oldukça
faydalı oldu. Özellikle fonksiyon yazma becerisi, daha karmaşık veri
analizleri yaparken işleri nasıl daha kolay ve düzenli hale
getirebileceğimi gösterdi. Yardım belgeleri
(?) ya da help()
ve fonksiyonların otomatik tamamlama
özelliği sayesinde fonksiyonların doğru kullanımı daha da
kolaylaştı.
R’de fonksiyonları kullanma ve yazma üzerine edindiğim bu bilgilerin, ileri veri analizi projelerinde büyük katkı sağlayacağına inanıyorum.
Dersin devamında, R dilinde nesne oluşturma ve vektör işlemleri
üzerine yoğunlaştık. R’nin lineer cebir temelli bir programlama dili
olduğunu ve vektörlerin bu dilde temel veri yapılarından biri olduğunu
öğrendik. Vektörler R’da c()
fonksiyonu kullanılarak
oluşturuluyor ve sayısal, karakter, mantıksal gibi
farklı türlerde olabiliyor.
Ayrıca, veri yapıları arasında matrisler, listeler ve veri
çerçeveleri gibi daha karmaşık yapılar da bulunuyor. Vektörler
tek boyutlu veri yapılarıdır, ancak işlemler sırasında vektörler arası
toplama, çıkarma gibi işlemleri uygulayabiliyoruz.
## [1] 1 2 3
Bu hafta ayrıca, vektörlerin uzunluğunu öğrenmek için
length()`` fonksiyonunu ve vektör türlerini anlamak için
class(), `mode()
ya da `typeof()`` fonksiyonlarını kullanmayı öğrendik.
Vektör işlemleri, çoklu veri üzerinde toplama, çıkarma, çarpma ve
bölme gibi matematiksel işlemleri kolaylaştırır. Aynı sayıda elemana
sahip vektörler arasında bu işlemleri yapmak oldukça kolaydır.
Örneğin:
## [1] 15 35 55
## [1] 5 -5 -5
Farklı uzunluktaki vektörler üzerinde işlem yaparken R’ın daha kısa vektörü tekrar ederek işlemi tamamlaması konusuna dikkat etmem gerektiğini öğrendim.
## [1] 3
## [1] 2 4 6 5 7 9 8 10 12
Vektörler üzerinde toplam, çarpım, sıralama gibi işlemleri gerçekleştiren fonksiyonlar da bu hafta ders kapsamında incelendi. Örneğin:
## [1] 55
## [1] 3628800
## [1] 10
Bu fonksiyonların veri analizi süreçlerinde sıkça kullanıldığını ve hızlı hesaplamalar yapmamıza yardımcı olduğunu öğrendim.
R’da vektörler üzerinde belirli elemanları seçebileceğimi gördüm. Bu seçiminin üç farklı yolla yapılabileceğini öğrendim.
ad <- c("Ali", "Elif", "Su", "Deniz", "Aras", "Berk", "Can", "Ece", "Efe", "Arda")
# 2. elemanı seçme
ad[2]
## [1] "Elif"
## [1] "Elif" "Su" "Deniz" "Aras" "Berk" "Can" "Ece" "Efe" "Arda"
## [1] "Su"
Ayrıca which.max()`` ve ``which.min()
fonksiyonlarıyla, bir vektörün en büyük ve en küçük elemanlarının
pozisyonlarını bulmak oldukça yararlı oldu.
Bu kısımda R’da vektörlerle çalışmanın ne kadar güçlü olduğunu fark ettim. Hem basit hem de karmaşık veri analizlerinde vektörlerin kullanımı, işlemlerin nasıl otomatik hale getirilebileceğini ve veri manipülasyonunu ne kadar hızlandırabileceğimizi gösterdi. Özellikle vektör işlemlerindeki esneklik, büyük veri kümeleriyle çalışırken çok kullanışlı olacak. R’daki veri yapılarının temel taşlarını öğrenmek, ilerideki projelerimde bana hız kazandıracaktır.
NOT:
Ders dışı alıştırmalar yapmaya çalıştım.
Kitap Bölüm 1 alıştırmalarını 1. hafta tamamlamıştım.
Datacamp da atanan bölüm alıştırmalarını tamamlamaya çalıştım.
swirl package learn R in R paketi yükledim, alıştırma yapmaya
çalıştım.
Referens kart sayfasının çıktısını aldım.
KİTAP (BÖLÜM-2 / 1. SORU)
#a) Öğrenci isimlerinden oluşan vektör
isim <- c("Ogrenci1", "Ogrenci2", "Ogrenci3", "Ogrenci4", "Ogrenci5")
#b) Vize puanlarından oluşan vektör
vize <- c(50, 55, 60, 70, 80)
#c) Final puanlarından oluşan vektör
final <- c(45, 65, 85, 90, 85)
#d) "vize" ve "final" vektörlerinde yer alan elemanlar
vize
## [1] 50 55 60 70 80
## [1] 45 65 85 90 85
## [1] 60 80
## [1] 85 85
## [1] 63
## [1] 74
## [1] 12.04159
## [1] 18.84144
#g) Vize ve final puanlarının en düşük (min), en yüksek (max), ortanca (median) ve çeyrek değerleri
min(vize)
## [1] 50
## [1] 80
## [1] 60
## 0% 25% 50% 75% 100%
## 50 55 60 70 80
## [1] 45
## [1] 90
## [1] 85
## 0% 25% 50% 75% 100%
## 45 65 85 85 90
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] TRUE
#j) Final notu vize puanından yüksek olan öğrenciler için mantıksal operatör kullanarak yeni vektör
final_daha_yuksek <- final > vize
final_daha_yuksek
## [1] FALSE TRUE TRUE TRUE TRUE
#k) Dersi geçebilmek için finalden en az 50 puan alınması gerektiği durum. Finali 50 ve üstü olanlar için yeni vektörler
final_y <- final[final >= 50]
vize_y <- vize[final >= 50]
#l) "final_y" ve "vize_y" vektörlerinin uzunlukları
length(final_y)
## [1] 4
## [1] 4
## [1] 4
## [1] 5
#n) Vize ve final puanlarını ayrı ayrı toplayarak toplam iki farklı vektör oluşturun.
vize_toplam <- sum(vize)
final_toplam <- sum(final)
#o) Final puanının %60'ını ve vize puanının %40'ını alarak geçme notu hesaplayın.
gecme_notu <- (vize * 0.40) + (final * 0.60)
gecme_notu
## [1] 47 61 75 82 83
#p) "not" vektörünü büyükten küçüğe sıralayarak "not_s" vektörünü oluşturun.
not_s <- sort(gecme_notu, decreasing = TRUE)
not_s
## [1] 83 82 75 61 47
#q) Sıra numarasına göre geçme notlarının sıralamasını yazdırın.
order(gecme_notu, decreasing = TRUE)
## [1] 5 4 3 2 1
## [1] 0.7878579
ad_soyad <- c("Ayse-Sel", "Can-Yucel", "Cem-Togay", "Banu-Cift")
isimler <- sapply(strsplit(ad_soyad, "-"), "[", 1)
soyisimler <- sapply(strsplit(ad_soyad, "-"), "[", 2)
isimler
## [1] "Ayse" "Can" "Cem" "Banu"
## [1] "Sel" "Yucel" "Togay" "Cift"
#SORU-1
ogrenciler <- c("Ogrenci1", "Ogrenci2", "Ogrenci3", "Ogrenci4", "Ogrenci5")
vize <- c(50, 55, 60, 70, 80)
final <- c(45, 65, 85, 90, 85)
gecme_notu <- (vize + final) / 2
min_gecme <- min(gecme_notu)
ortalama_gecme <- mean(gecme_notu)
max_gecme <- max(gecme_notu)
min_gecme
## [1] 47.5
## [1] 68.5
## [1] 82.5
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 47.5 60.0 72.5 68.5 80.0 82.5
## [1] 15