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:

set.seed(500)

# 5 adet normal dağılıma sahip rastgele sayı üretimi
rnorm(n = 5)  
## [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.

Kendi Fonksiyonumuzu Yazmak

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:

# Üs alma fonksiyonu
üs_al <- function(x, us = 2) {
  return(x^us)
}

# Fonksiyonu çalıştırma
üs_al(3)
## [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.

Hatalarla Başa Çıkma

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:

  1. Argümanları yanlış sırada yazmak.
  2. Yardım belgelerini kontrol etmeden eksik veya hatalı parametreler kullanmak.
  3. Çalışma alanındaki eski nesneleri kullanarak yeni kodlar üzerinde çalışmak ve bu nesnelerin kodu etkilemesi.
  4. Bu tür hatalardan kaçınmak için fonksiyonların yardım belgelerini incelemek, doğru paketleri yüklemek ve çalışma alanını temizlemek (örneğin, 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.

Sayısal Vektörler Oluşturma

sayisal_vektor <- c(1, 2, 3)
sayisal_vektor
## [1] 1 2 3

Bu hafta ayrıca, vektörlerin uzunluğunu öğrenmek için length()`` fonksiyonunu ve vektör türlerini anlamak içinclass(), `mode() ya da `typeof()`` fonksiyonlarını kullanmayı öğrendik.

Vektör İşlemleri

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:

x <- c(10, 15, 25)
y <- c(5, 20, 30)

# Toplama
x + y
## [1] 15 35 55
# Çıkarma
x - y
## [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.

x <- 1:9
y <- c(1, 2, 3)

# Uzunluk karşılaştırması
length(x) / length(y) 
## [1] 3
# Çıktı: [1] 3

# Toplama işlemi
x + y
## [1]  2  4  6  5  7  9  8 10 12
# Çıktı: [1]  2  4  6  5  7  9  8 10 12

Vektör Fonksiyonları

Vektörler üzerinde toplam, çarpım, sıralama gibi işlemleri gerçekleştiren fonksiyonlar da bu hafta ders kapsamında incelendi. Örneğin:

x <- 1:10

# Vektördeki verilerin toplanması
sum(x)
## [1] 55
# Vektördeki verilerin çarpılması
prod(x)
## [1] 3628800
# Vektördeki en büyük değeri bulma
max(x)
## [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.

Seçim

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"
# Sadece 1. elemanı hariç tutma
ad[-1]
## [1] "Elif"  "Su"    "Deniz" "Aras"  "Berk"  "Can"   "Ece"   "Efe"   "Arda"
# 3. elemanı seçme
ad[3]
## [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.

BU HAFTANIN ÖDEVİ

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
final
## [1] 45 65 85 90 85
#e) Ali (Ogrenci3) ve Beril'in (Ogrenci5) vize ve final puanlarını yazdır
vize[c(3,5)]
## [1] 60 80
final[c(3,5)]
## [1] 85 85
#f) Vize ve final puanlarının ortalamaları ve standart sapmaları
mean(vize)
## [1] 63
mean(final)
## [1] 74
sd(vize)
## [1] 12.04159
sd(final)
## [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
max(vize)
## [1] 80
median(vize)
## [1] 60
quantile(vize)
##   0%  25%  50%  75% 100% 
##   50   55   60   70   80
min(final)
## [1] 45
max(final)
## [1] 90
median(final)
## [1] 85
quantile(final)
##   0%  25%  50%  75% 100% 
##   45   65   85   85   90
#h) Vize ve final puanları 90'ın üzerinde olan öğrenci olup olmadığını test et
any(vize > 90)
## [1] FALSE
any(final > 90)
## [1] FALSE
#i) Vize ya da final puanları 50'den düşük olan öğrenci olup olmadığını test et
any(vize < 50)
## [1] FALSE
any(final < 50)
## [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
length(vize_y)
## [1] 4
#m) Final puanı en yüksek ve vize puanı en yüksek öğrenci
which.max(final)
## [1] 4
which.max(vize)
## [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
#r) Vize puanları ile final puanları arasındaki ilişkiyi bulmak için korelasyon
cor(vize, final)
## [1] 0.7878579

GÜNÜN SORUSU

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"
soyisimler
## [1] "Sel"   "Yucel" "Togay" "Cift"

KENDİNİZİ TEST EDİN

#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
ortalama_gecme
## [1] 68.5
max_gecme
## [1] 82.5
#YA DA

summary(gecme_notu)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    47.5    60.0    72.5    68.5    80.0    82.5
#SORU-2
toplam <- function(n) {
  return(n * (n + 1) / 2)
}

toplam(5)
## [1] 15
#SORU-3
toplam_2 <- function() {
  n <- as.numeric(readline(prompt = "Kaça kadar olan sayların toplamı hesaplansın: "))
  sonuc <- sum(1:n)
  cat(n, "'e kadar olan sayların toplamı: ", sonuc, "\n")
}

MİNİ SINAV CEVAPLARI

#SORU-1
sd_1 <- function(x, yuvarla = 3) {
  n <- length(x)
  x_o <- mean(x)
  sd_custom <- sqrt(sum((x - x_o)^2) / (n - 1))
  return(round(sd_custom, yuvarla))
}
x <- c(3, 4, 5, 6)
sd_1(x)
## [1] 1.291
#SORU-2
SE <- function(x, guvenirlik) {
  sd_x <- sd(x)
  se <- sd_x * sqrt(1 - guvenirlik)
  return(round(se, 3))
}

set.seed(41)
puan <- rnorm(50, 50, 10)
SE(puan, 0.90)
## [1] 3.228