Bu haftaki R ile veri analizi dersinin ilk kısmında, matrisler, veri
setleri ve listeler ile çalıştık. R programlama dilinde nesneler
üzerinde çalışmanın temellerini öğrendik ve bu nesnelerin veri analizi
için nasıl yapılandırıldığını gördük.
Matris oluşturma, veri setleri ile çalışma ve bu yapıların nasıl
manipüle edilebileceği üzerine odaklandık.
Matrisler, iki boyutlu veri yapılarıdır ve matrix() fonksiyonu ile oluşturulurlar. Bu ders kapsamında, bir matrisin nasıl oluşturulacağı, transpozunun nasıl alınacağı ve matrisler üzerinde nasıl işlem yapılacağı gösterildi. Matrisler üzerinde satır ve sütun sayısı belirlenerek veri düzenlemesi yapılabiliyor.
## Warning in matrix(1:12, nrow = 5, ncol = 2): data length [12] is not a
## sub-multiple or multiple of the number of rows [5]
Matris üzerinde satır ve sütun işlemleri yapmak oldukça kullanışlıdır. Transpoz alma işlemi de sıkça kullanılan bir yöntemdir:
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
Bu örnekte, matrisin satırları sütunlara ve sütunları satırlara dönüştürülmüştür.
R’da veri setleri ile çalışmanın temellerini öğrendik. Veri setleri,
aynı uzunluktaki vektörlerden oluşturulur ve iki boyutlu yapılardır.
Veri setleri üzerinde sütunlar ekleyip çıkarabiliriz. Özellikle
data.frame()
fonksiyonu ile veri setleri
oluşturmak oldukça faydalı.
Veri Seti Örneği:
isimler <- c("Ahmet", "Zeynep", "Mehmet", "Fatma", "Ayşe")
yas <- c(30, 25, 35, 40, 29)
kilo <- c(70, 55, 80, 65, 60)
cinsiyet <- factor(c("Erkek", "Kadın", "Erkek", "Kadın", "Kadın"))
df <- data.frame(isimler, yas, kilo, cinsiyet)
df
## isimler yas kilo cinsiyet
## 1 Ahmet 30 70 Erkek
## 2 Zeynep 25 55 Kadın
## 3 Mehmet 35 80 Erkek
## 4 Fatma 40 65 Kadın
## 5 Ayşe 29 60 Kadın
Bu veri seti, farklı özelliklere sahip kişilerden oluşmaktadır. Veri setleri üzerinde sütun seçimi ve satır seçimi işlemleri yapabiliriz.
## isimler yas kilo cinsiyet
## 1 Ahmet 30 70 Erkek
## [1] 30 25 35 40 29
## isimler yas kilo cinsiyet
## 3 Mehmet 35 80 Erkek
## 4 Fatma 40 65 Kadın
Veri setlerinde sütun ve satır seçimi yaparken
subset()
fonksiyonu ile koşullar
belirleyebiliriz. Bu, veri manipülasyonu yaparken önemli bir
beceridir.
Listeler, farklı türdeki veri yapılarını bir araya getiren çok esnek bir yapıdır. Bir listedeki her bir öğe, farklı uzunlukta ve türde olabilir. Bu esneklik, karmaşık veri analizleri yaparken oldukça faydalıdır.
Liste Örneği:
adlar <- c("Murat", "Hakan", "Elif")
yaslar <- c(45, 32, 28)
sehir <- c("İstanbul", "Ankara", "İzmir")
liste <- list(adlar, yaslar, sehir)
liste
## [[1]]
## [1] "Murat" "Hakan" "Elif"
##
## [[2]]
## [1] 45 32 28
##
## [[3]]
## [1] "İstanbul" "Ankara" "İzmir"
Bu liste, adlar, yaşlar ve şehirler olmak üzere üç farklı bileşenden oluşur. Listeler içinde başka listeler de olabilir ve her bir bileşen hem numara hem de isim ile çağrılabilir.
Liste Bileşenlerine Erişim:
## [1] "Murat" "Hakan" "Elif"
# İsimli liste elemanlarına erişim
liste_isim <- list(isim = adlar, yas = yaslar, sehir = sehir)
liste_isim$yas
## [1] 45 32 28
Bu liste işlemleri, veriyi organize etmenin güçlü bir yoludur. Ayrıca regresyon gibi daha ileri düzey analizlerde de listeler kullanılır.
Tüm bunlarla birlikte dersin ilk bölümü, veri yapıları ile çalışma yeteneğimi geliştirdi. Matrisler ve veri setleri ile yapılan işlemler, R’ın veri manipülasyonu konusundaki gücünü gösterdi. Özellikle listeler ile çalışmak, veriyi daha esnek ve düzenli bir şekilde analiz edebilmemi sağladı. Veriyi organize etmenin ve analiz süreçlerini hızlandırmanın, daha karmaşık projelerde oldukça işime yarayacağını düşünüyorum.
Bu haftanın ikinci bölümünde, RMarkdown
kullanarak rapor hazırlama konusunun bir kısmını işledik. RMarkdown’un
metin ile kodu bir araya getiren yapısı sayesinde, analizlerimizi
belgeleyip, raporlar oluştururken sonuçları dinamik olarak
güncelleyebiliyoruz. Bu dersin amacının, hem veriyi analiz edip
raporlamak hem de yapılan işlemlerin tekrarlanabilir olmasını sağlamak
olduğu düşünüldüğünde en verimli derslerden biri olduğunu
düşünüyorum.
RMarkdown’da raporlar, analizleri gerçekleştiren kodları ve rapor metnini tek bir belgede birleştirir. Bu yapı, analizlerde veya veri setlerinde bir güncelleme yapıldığında, raporun tüm bölümlerinin kolayca yeniden güncellenmesini sağlar. Böylece hata riskleri azalır ve tutarlılık sağlanır.
Bu kısımda ayrıca, raporları düzgün organize etmenin önemine vurgu yapıldı. Dosya ve dizin adlarının, hem kendimizin hem de bilgisayarların kolayca bulabileceği şekilde belirlenmesi gerekliliği bu süreçte öğrendiğim temel ilkeler arasında.
Dosya adlarının yalnızca harf, rakam, tire ve alt çizgi
içermesi,
Dosya adının bölümlerini ayırmak için alt çizgi
(_)
ve bir bölümdeki sözcükleri ayırmak
için tire (-)
kullanılması,
Tarih formatına dikkat edilmesi, diğer önemli kazanımlarım oldu.
Bir RMarkdown projesi başlatırken, dosyaları ve alt dizinleri mantıklı bir şekilde düzenlemek gerekir. Verilerin ve çıktıların doğru dizinlerde saklanması, raporun sorunsuz çalışmasını sağlamak için önemlidir. Hazırladığım ilk iki ödevde dizin kaynaklı hatalar ile karşılaştığım için özellikle bundan sonra dikkat edeceğim kısımlar arasında dosya adı ve dizini olacaktır. Ayrıca, proje dizinlerinin organize edilmesi, tüm materyalleri tek bir yerde tutmayı kolaylaştırır.
YAML başlığı, belgenin üst kısmında yer alır ve raporun ayarlarını tanımlar. Başlık, yazar bilgisi ve çıktı formatı gibi detaylar burada ayarlanır. Örneğin:
#title: "Örnek Rapor"
#author: "Samet Eker"
#output:
#html_document:
#toc: true
#toc_float:
#collapsed: false
#smooth_scroll: true
YAML başlığındaki tablo içeriğinde, başlık numaralandırma, sayfa yapısı ve tema gibi ayarları belirleyebileceğimizi öğrendim.
NOT: 4. ödevi yazana kadar bile kendimi bu konuda geliştirdiğimi düşünüyorum. Farklı HTML temaları kullanılarak görsel olarak daha başarılı raporlar yazdığım kanaatineyim. Varsayılan temalar arasında default, cerulean, flatly, readable gibi seçenekler yer aldığını ancak internet kaynaklarının bu konuda çok çeşitli olduğunu fark ettim. Bu dosyayı en az on defa değiştirerek en iyi görünümlü olduğunu düşündüğüm raporu sunmaya çalıştım.
RMarkdown’da kod blokları, analizlerimizin sonuçlarını doğrudan rapor
içerisinde göstermemizi sağlar. Örneğin,
rnorm()
fonksiyonunu kullanarak rastgele
sayılar oluşturabiliriz. Kod blokları şu şekilde tanımlanır:
## [1] 0.4179565 -0.1303725 -1.1646174 -0.3987196 0.1200944
Bu derste çok üzerinde durmadığımız ancak raporu hazırlarken üzerinde çalışma fırsatı bulduğum tablolar ve görseller öğrendiğim en önemli araçlardan biri. RMarkdown ile tablo ve görseller kolayca oluşturulup düzenlenebilmektedir.
knitr::kable()
ve kableExtra
gibi paketler
kullanarak verileri düzenleyip görselleştirebileceğimizi fark
ettim.
Örneğin papaja paketinde oluşturulan tabloların en basitlerinden ve en
iyilerinden olduğunu düşünüyorum.
Bir Örnek;
papaja::apa_table(ozet_tablo,
col.names = c("Çiçek Türü", "Frekans", "Ortalama", "Sd"),
caption = "Petal Uzulukları için Özet Tablo",
col_spanners = list("Means" = c(3, 4)))
Tabloları manuel olarak üretebileceğimizi de öğrendim. Manule tabloları örnekteki gibi oluşturabiliriz.
Bu ders, RMarkdown ile daha etkili raporlar oluşturma konusunda beni oldukça geliştirdi. Sunduğu avantajlar, özellikle akademik çalışmalarda büyük fayda sağlayacak. Ayrıca, kod ve metin entegrasyonu sayesinde raporlarımı kolay bir şekilde oluşturabileceğimi fark ettim. RMarkdown’un görsel açıdan zenginleştirilebilmesi, çalışmalarımı daha profesyonel sunma açısından da büyük avantaj sağlayacak. İleriki derslerde üzerinde duracağımızı düşündüğüm Görseller, tablolar, grafikler ve referans verme konularında çok çalışarak gelişmem gerektiği kanaatindeyim.
Pearson korelasyon katsayısı \(r\) şu formül ile hesaplanır:
\[ r = \frac{n(\sum{xy}) - (\sum{x})(\sum{y})}{\sqrt{[n \sum{x^2} - (\sum{x})^2][n \sum{y^2} - (\sum{y})^2]}} \] ### KİTAP (2. BÖLÜM - KALAN SORULAR)
# 2. soru: 1-20 arasına eşit aralıklarla 40 değerin yerleştiği bir vektör oluşturma
vektor <- seq(1, 20, length.out = 40)
# Elemanları yüzde birler basamağına yuvarlama
round(vektor, digits = 0)
## [1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13
## [26] 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20
# 3. soru
#a)
ogrenciler <- c("ogrenci_1", "ogrenci_2", "ogrenci_3", "ogrenci_4", "ogrenci_5",
"ogrenci_6", "ogrenci_7", "ogrenci_8", "ogrenci_9", "ogrenci_10")
ogrenciler
## [1] "ogrenci_1" "ogrenci_2" "ogrenci_3" "ogrenci_4" "ogrenci_5"
## [6] "ogrenci_6" "ogrenci_7" "ogrenci_8" "ogrenci_9" "ogrenci_10"
## [1] 10 10 10 15 15 15 50 50 50 100 100
## [1] 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
# 4. soru:
cins <- factor(c("Erkek", "Kadın", "Erkek", "Kadın", "Erkek", "Kadın", "Erkek", "Kadın", "Erkek", "Kadın"))
cins
## [1] Erkek Kadın Erkek Kadın Erkek Kadın Erkek Kadın Erkek Kadın
## Levels: Erkek Kadın
# Hem sayısal hem de karakter düzey değerlerine sahip iki faktör belirleme
cins_numerik <- as.numeric(cins)
levels(cins) <- c("Kadın", "Erkek")
cins
## [1] Kadın Erkek Kadın Erkek Kadın Erkek Kadın Erkek Kadın Erkek
## Levels: Kadın Erkek
## [1] 1 2 1 2 1 2 1 2 1 2
# 5. soru: Geçme notlarına göre "harf_not" faktörün
gecme_notu <- c(92, 88, 75, 62, 58, 48, 84, 69, 77, 91)
harf_not <- cut(gecme_notu, breaks = c(50, 60, 70, 80, 90, 100),
labels = c("E", "D", "C", "B", "A"), right = FALSE)
harf_not
## [1] A B C D E <NA> B D C A
## Levels: E D C B A
## E D C B A NA's
## 1 2 2 2 2 1
# 6. soru
#a) Öğrenci isimleri ile satırları adlandırılmış matris
vize <- c(50, 55, 60, 70, 80)
final <- c(45, 65, 85, 90, 85)
gecme_notu <- (vize * 0.40) + (final * 0.60)
matris <- cbind(vize, final, gecme_notu)
rownames(matris) <- c("Ogrenci1", "Ogrenci2", "Ogrenci3", "Ogrenci4", "Ogrenci5")
matris
## vize final gecme_notu
## Ogrenci1 50 45 47
## Ogrenci2 55 65 61
## Ogrenci3 60 85 75
## Ogrenci4 70 90 82
## Ogrenci5 80 85 83
#b) Öğrencilerin vize, final ve geçme notlarının ortalaması
ortalama_not <- colMeans(matris)
matris <- rbind(matris, Ortalama = ortalama_not)
matris
## vize final gecme_notu
## Ogrenci1 50 45 47.0
## Ogrenci2 55 65 61.0
## Ogrenci3 60 85 75.0
## Ogrenci4 70 90 82.0
## Ogrenci5 80 85 83.0
## Ortalama 63 74 69.6
#c) Öğrencilerin harf notlarını ekleme
harf_not <- c("E", "D", "C", "B", "A")
matris <- cbind(matris, Harf_Not = harf_not)
## Warning in cbind(matris, Harf_Not = harf_not): number of rows of result is not
## a multiple of vector length (arg 2)
## vize final gecme_notu Harf_Not
## Ogrenci1 "50" "45" "47" "E"
## Ogrenci2 "55" "65" "61" "D"
## Ogrenci3 "60" "85" "75" "C"
## Ogrenci4 "70" "90" "82" "B"
## Ogrenci5 "80" "85" "83" "A"
## Ortalama "63" "74" "69.6" "E"
Warning in cbind(matris, Harf_Not = harf_not): number of rows of result is not, a multiple of vector length (arg 2) uyarıları, satır sayılarının aynı olmaması kaynaklıdır. R ortalama yazan satıra yeniden “E” yazmıştır.
#1. SORUDA CEVAPLANACAK SORU YAZMIYOR. SADECE TABLO BULUNUYOR.
#2. SORU
bilgi <- list(
ogrenci = c("Ali", "Defne", "Meltem", "Semih", "Sevda", "Gizem", "Emre", "Zeynep", "Utku", "Beril"),
vize_not = c(60, 70, 50, 80, 65, 70, 85, 70, 92, 80),
final_not = c(70, 65, 50, 45, 67, 75, 80, 85, 95, 85)
)
#a)
str(bilgi)
## List of 3
## $ ogrenci : chr [1:10] "Ali" "Defne" "Meltem" "Semih" ...
## $ vize_not : num [1:10] 60 70 50 80 65 70 85 70 92 80
## $ final_not: num [1:10] 70 65 50 45 67 75 80 85 95 85
## $ogrenci
## [1] "Ali" "Defne" "Meltem" "Semih" "Sevda" "Gizem" "Emre" "Zeynep"
## [9] "Utku" "Beril"
##
## $vize_not
## [1] 60 70 50 80 65 70 85 70 92 80
##
## $final_not
## [1] 70 65 50 45 67 75 80 85 95 85
## [1] 60 70 50 80 65 70 85 70 92 80
## [1] 50
## $ogrenci
## [1] "Ali" "Defne" "Meltem" "Semih" "Sevda" "Gizem" "Emre" "Zeynep"
## [9] "Utku" "Beril"
##
## $vize_not
## [1] 60 70 50 80 65 70 85 70 92 80
##
## $final_not
## [1] 70 65 50 45 67 75 80 85 95 85
##
## $not
## [1] 66.0 67.0 50.0 59.0 66.2 73.0 82.0 79.0 100.0 83.0
#3. SORU
test <- data.frame(
ogrenci = c("Ali", "Defne", "Meltem", "Semih", "Sevda", "Gizem", "Emre", "Zeynep", "Utku", "Beril"),
vize_not = c(60, 70, 50, 80, 65, 70, 85, 70, 92, 80),
final_not = c(70, 65, 50, 45, 67, 75, 80, 85, 95, 85)
)
#a)
str(test)
## 'data.frame': 10 obs. of 3 variables:
## $ ogrenci : chr "Ali" "Defne" "Meltem" "Semih" ...
## $ vize_not : num 60 70 50 80 65 70 85 70 92 80
## $ final_not: num 70 65 50 45 67 75 80 85 95 85
#b)
test$not <- test$final_not * 0.60 + test$vize_not * 0.40
#c)
test_gecti <- test[test$final_not > 70, ]
test_gecti
## ogrenci vize_not final_not not
## 6 Gizem 70 75 73.0
## 7 Emre 85 80 82.0
## 8 Zeynep 70 85 79.0
## 9 Utku 92 95 93.8
## 10 Beril 80 85 83.0
## [1] 5 4
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 73.00 79.00 82.00 82.16 83.00 93.80
## ogrenci vize_not final_not not
## 9 Utku 92 95 93.8
## 10 Beril 80 85 83.0
## 7 Emre 85 80 82.0
## 8 Zeynep 70 85 79.0
## 6 Gizem 70 75 73.0
#1. soru
bos_df <- data.frame(
TamSayi = integer(),
OndalikSayi = numeric(),
Karakter = character(),
Mantiksal = logical(),
Faktor = factor()
)
print("Bos data.framenin yapısı:")
## [1] "Bos data.framenin yapısı:"
## 'data.frame': 0 obs. of 5 variables:
## $ TamSayi : int
## $ OndalikSayi: num
## $ Karakter : chr
## $ Mantiksal : logi
## $ Faktor : Factor w/ 0 levels:
#2. soru
ad = c('Su','Pera','Sule','Can','Cem','Name','Aras','Mete','Kaan','Pelin')
puan = c(12.5, 9, 16.5, 12, 9, 20, 14.5, 13.5, 8, 19)
deneme = c(1, NA, 2, NA, 2, NA, 1, NA, 2, 1)
bonus = c(1,0,1, 0, 0, 1, 1, 0,0, 1)
veri_seti <- data.frame(ad, puan, deneme, bonus)
eksik_veri_sayisi <- sum(is.na(veri_seti$deneme))
print(eksik_veri_sayisi)
## [1] 4