Not: Bu günlük hazırlanırken kod düzeltmelerinde yapay zeka aracı Claude AI’den faydalanılmıştır.
Bu günlükteki uygulamaları daha önce kullandığımız iris
veri seti ile yapacağım. İris veri seti, üç farklı süsen çiçeği türüne
(Setosa, Versicolor, Virginica) ait çanak yaprağı (sepal) ve taç yaprağı
(petal) uzunluk ve genişlik ölçümlerini içeriyor. Her çiçek türünden 50
örnek olmak üzere toplam 150 veri mevcut.
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | |
|---|---|---|---|---|---|
| Min. :4.300 | Min. :2.000 | Min. :1.000 | Min. :0.100 | setosa :50 | |
| 1st Qu.:5.100 | 1st Qu.:2.800 | 1st Qu.:1.600 | 1st Qu.:0.300 | versicolor:50 | |
| Median :5.800 | Median :3.000 | Median :4.350 | Median :1.300 | virginica :50 | |
| Mean :5.843 | Mean :3.057 | Mean :3.758 | Mean :1.199 | NA | |
| 3rd Qu.:6.400 | 3rd Qu.:3.300 | 3rd Qu.:5.100 | 3rd Qu.:1.800 | NA | |
| Max. :7.900 | Max. :4.400 | Max. :6.900 | Max. :2.500 | NA |
apply() fonksiyonunu matris veya data frame’in tamamı
üzerinde kullanırız. Margin 1 ve 2 olmak üzer farklı kullanımları var.
Margin 1 ile satır ortalamalarını, margin 2 ile sütunlara ait standart
sapmaları hesaplamayı deneyeceğim.
secili_sutunlar <- iris[,1:4]
satir_ortalamasi <- apply(secili_sutunlar, 1,mean)
iris$satir_ortalamasi <- satir_ortalamasi
head(iris) %>%
kable() %>%
kable_styling(full_width = F)| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | satir_ortalamasi |
|---|---|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 | setosa | 2.550 |
| 4.9 | 3.0 | 1.4 | 0.2 | setosa | 2.375 |
| 4.7 | 3.2 | 1.3 | 0.2 | setosa | 2.350 |
| 4.6 | 3.1 | 1.5 | 0.2 | setosa | 2.350 |
| 5.0 | 3.6 | 1.4 | 0.2 | setosa | 2.550 |
| 5.4 | 3.9 | 1.7 | 0.4 | setosa | 2.850 |
Seçili sütunların standart sapmasını apply kullanarak
hesaplayacağım.
std_1 <- apply(secili_sutunlar, 2, sd)
std_1 %>%
kable(col.names = "Standart Sapma") %>%
kable_styling(full_width = F)| Standart Sapma | |
|---|---|
| Sepal.Length | 0.8280661 |
| Sepal.Width | 0.4358663 |
| Petal.Length | 1.7652982 |
| Petal.Width | 0.7622377 |
lapply ve sapply aslında aynı mantıkta
çalışıyorlar. İkisi de bir veri yapısının her elemanına aynı fonksiyonu
uyguluyor. Aralarındaki tek fark ;lapply liste formatında,
sapply ise vektör formatında sonuç veriyor.
## [1] "list"
## [1] "numeric"
knitr::kable(
data.frame(
Fonksiyon = c("lapply", "sapply"),
Sonuc_Tipi = c("Liste", "Vektör"),
Kullanim = c("Karmaşık yapılar için", "Basit analizler için")
),
caption = "lapply vs sapply Farkları"
)| Fonksiyon | Sonuc_Tipi | Kullanim |
|---|---|---|
| lapply | Liste | Karmaşık yapılar için |
| sapply | Vektör | Basit analizler için |
Veriyi bir faktöre göre gruplayıp özetler. Vektörler üzerinde çalışır. Burada çiçek türlerine göre taç yaprağı uzunluklarının ortalamalarını hesapladım.
| x | |
|---|---|
| setosa | 1.462 |
| versicolor | 4.260 |
| virginica | 5.552 |
Kullanmak istediğimiz fonksiyonu birden fazla değişkene aynı anda uygulayabiliriz. Burada her bir çiçek türü için taç yaprak uzunluğunun çanak yaprak uzunluğuna ve çanak yaprak genişliğinin taç yaprak genişliğine oranlarının ortalamalarını hesaplıyorum.
sonuc <- mapply(function(sp) {
tur_verisi <- iris[iris$Species == sp, ]
c(
Uzunluk_Orani = mean(tur_verisi$Petal.Length / tur_verisi$Sepal.Length),
Genislik_Orani = mean(tur_verisi$Petal.Width / tur_verisi$Sepal.Width)
)
},
sp = c("setosa", "versicolor", "virginica")
)
sonuc_tablo <- t(sonuc)
colnames(sonuc_tablo) <- c("Taç/Çanak Uzunluk Oranı", "Taç/Çanak Genişlik Oranı")
rownames(sonuc_tablo) <- c("Setosa", "Versicolor", "Virginica")
kable(sonuc_tablo, digits = 3, caption = "İris Türlerine Göre Taç/Çanak Oranları")| Taç/Çanak Uzunluk Oranı | Taç/Çanak Genişlik Oranı | |
|---|---|---|
| Setosa | 0.293 | 0.072 |
| Versicolor | 0.718 | 0.480 |
| Virginica | 0.844 | 0.684 |
split() fonksiyonu bir veri setini veya vektörü, belirli
bir değişkene göre gruplara ayırır ve her grubu ayrı bir liste elemanı
olarak saklar. Burada çiçekleri türlerine göre ayırıp taç ve çanak
yapraklarının uzunlukları ortalamalarını hesapladım.
sonuc <- split(iris, iris$Species) %>%
lapply(function(x) {
c(
Ort_Sepal = mean(x$Sepal.Length),
Ort_Petal = mean(x$Petal.Length)
)
})
sonuc_tablo <- do.call(rbind, sonuc)
colnames(sonuc_tablo) <- c("Çanak Yaprak",
"Taç Yaprak"
)
rownames(sonuc_tablo) <- c("Setosa", "Versicolor", "Virginica")
kable(sonuc_tablo,
digits = 2,
caption = "İris Türlerine Göre İstatistiksel Özet",
align = 'c')| Çanak Yaprak | Taç Yaprak | |
|---|---|---|
| Setosa | 5.01 | 1.46 |
| Versicolor | 5.94 | 4.26 |
| Virginica | 6.59 | 5.55 |
by() fonksiyonu, veriyi kategorik bir değişkene göre
gruplara ayırır ve her grup için belirttiğimiz fonksiyonu uygular. Her
bir çiçek türü için ayrı ayrı ortalama taç ve çanak yaprak uzunluklarını
hesapladım.
sonuc_by <- by(iris[, 1:4], iris$Species, function(x) {
c(
Sepal_Ortalama = mean(x$Sepal.Length),
Petal_Ortalama = mean(x$Petal.Length)
)
})
tablo_by <- do.call(rbind, sonuc_by)
rownames(tablo_by) <- c("Setosa", "Versicolor", "Virginica")
colnames(tablo_by) <- c("Çanak Yaprak",
"Taç Yaprak")
kable(tablo_by,
digits = 2,
caption = "İris Türlerine Göre İstatistiksel Analiz (by fonksiyonu)",
align = 'c') %>%
kable_styling(bootstrap_options = c("striped", "hover"),
full_width = FALSE,
position = "center")| Çanak Yaprak | Taç Yaprak | |
|---|---|---|
| Setosa | 5.01 | 1.46 |
| Versicolor | 5.94 | 4.26 |
| Virginica | 6.59 | 5.55 |
datacamp ’tan İki İzDatacampta egzersiz yaparken bilgisayrdaki bir resmin nasıl ekleneceğini öğrendiğim bir kısım vardı. O bilgiyi burada uygulamak istiyorum.
İris Türleri
Yine datacamp egzersizi yaparken web sitesi yazmadan metne bağlantı eklemeyi öğrendiğim bir kısım vardı. Onu da burada örneklemek isterim. Bu günlükte adını sık sık andığımız iris çiçeğinin ne anlama geldiğini bilmek ister misiniz?