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

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.

Matris Örneği:

m2 <- matrix(1:12, nrow = 5, ncol = 2)
## 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:

# Matrisin transpozunu alma
t(m2)
##      [,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.

Veri Setleri

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.

Veri Seti Üzerinde İşlemler

# İlk satırı seçme
df[1,]
##   isimler yas kilo cinsiyet
## 1   Ahmet  30   70    Erkek
# İkinci sütunu seçme
df[,2]
## [1] 30 25 35 40 29
# Yaşı 30'dan büyük olanları seçme
subset(df, yas > 30)
##   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

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:

# İlk bileşeni seçme
liste[[1]]
## [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ık

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.

Kod Blokları ve Satır İçi Kodlar

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:

rnorm(5)
## [1]  0.4179565 -0.1303725 -1.1646174 -0.3987196  0.1200944
#Satır içi kodlar sayesinde analiz sonuçları raporun metin kısmına entegre edilebileceğimi öğrendim.

Tablolar

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.

| col1   |col2    |  
|:------:|:------:|
|içerik1 |içerik2 |

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.

HAFTANIN ÖDEVLERİ

Korelasyon Formülü

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"
#b)
puanlar <- c(10, 10, 10, 15, 15, 15, 50, 50, 50, 100, 100)
puanlar
##  [1]  10  10  10  15  15  15  50  50  50 100 100
#c)
durum <- c(rep(1, 11), rep(2, 7), rep(3, 8))
durum
##  [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
cins_numerik
##  [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
summary(harf_not)
##    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)
matris
##          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.

KİTAP 3. BÖLÜM SORULARI

#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
#b) 
names(bilgi) <- c("ogrenci", "vize_not", "final_not")
bilgi
## $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
#c)
bilgi$not <- bilgi$final_not * 0.60 + bilgi$vize_not * 0.40

#d)
bilgi$vize_not
##  [1] 60 70 50 80 65 70 85 70 92 80
#e)
bilgi$vize_not[3]
## [1] 50
#f) 
max_not_index <- which.max(bilgi$not)
bilgi$not[max_not_index] <- 100
bilgi
## $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
#d)
dim(test_gecti)
## [1] 5 4
#e)
summary(test_gecti$not)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   73.00   79.00   82.00   82.16   83.00   93.80
#f)
test_gecti_sirali <- test_gecti[order(test_gecti$not, decreasing = TRUE), ]
test_gecti_sirali
##    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

KENDİNİZİ TEST EDİN

#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ı:"
str(bos_df)
## '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

OKUMA VE İNCELEMELER

OKUMA 1 TAMAMLANDI

OKUMA 2 TAMAMLANDI

DataEditR PAKETİ İNCELENDİ.