library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.1     ✔ stringr   1.5.2
## ✔ ggplot2   4.0.0     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.1.0     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(openintro)
## Zorunlu paket yükleniyor: airports
## Zorunlu paket yükleniyor: cherryblossom
## Zorunlu paket yükleniyor: usdata
library(ggExtra)
library(corrplot)
## corrplot 0.95 loaded
library(pairsD3)
library(ggcorrplot)
library(ggpubr)
data("mtcars")
str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
glimpse(mtcars)
## Rows: 32
## Columns: 11
## $ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8,…
## $ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8,…
## $ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 16…
## $ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180…
## $ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92,…
## $ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.…
## $ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18…
## $ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,…
## $ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,…
## $ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3,…
## $ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2,…

1. Veri Setinin Tanıtımı

Bu ödev için "mtcars" veri setini kullandım. Bu veri seti 32 farklı otomobilin 11 özelliğini barındırıyor. Bu 11 özellikten 5 tanesi kategorik iken 6 tanesi sürekli değişken. Veri setindeki her bir değişkenin ne anlama geldiği ve hangi değişken tipinde olduğu aşağıdaki tabloda sunulmuştur.

Değişken Açıklama Değişken Tipi
mpg Mil/Galon (Yakıt Verimliliği) Nümerik / Sürekli
cyl Silindir Sayısı Kategorik / Faktör
disp Motor Hacmi Nümerik / Sürekli
hp Beygir Gücü Nümerik / Sürekli
drat Arka Aks Oranı Nümerik / Sürekli
wt Ağırlık Nümerik / Sürekli
qsec Hızlanma (sn) Nümerik / Sürekli
vs Motor Şekli Kategorik / Faktör
am Vites Tipi Kategorik / Faktör
gear İleri Vites Sayısı Kategorik / Faktör
carb Karbüratör Sayısı Kategorik / Faktör
Sys.setlocale("LC_ALL", "Turkish")
## Warning in Sys.setlocale("LC_ALL", "Turkish"): using locale code page other
## than 65001 ("UTF-8") may cause problems
## [1] "LC_COLLATE=Turkish_Türkiye.1254;LC_CTYPE=Turkish_Türkiye.1254;LC_MONETARY=Turkish_Türkiye.1254;LC_NUMERIC=C;LC_TIME=Turkish_Türkiye.1254"

Bu kısımda Türkçe karakter konusunda sık sık problem yaşadığım için(örneğin gönderdiğiniz ödevi ilk başta düzgün görüntüleyemedim) çözüm aradım. Önce Tool>Global Options>Code>Saving>Deafult Test Encoding kısmını UTF-8 yaptım. Dah sonre ilerleyen adımlarda yine benzer problemler çıkınca bunu çözmenin yolarını aradım ve yukarıdaki kod ile Türkçe karakter desteğini aktif hale getirdim.

2. Değişkenlerin Görselleştirilmesi

2.1. Korelasyonların Hesaplanması

Veri setindeki nümerik değişkebleri seçerek isimlerini Türkçe yaptım. Daha sonra korelasyon hesaplayıp görsel ayarlarını yaptım ve korelasyon matrisini yazdırdım.

numerik_degiskenler <- mtcars %>% 
  select(mpg, disp, hp, drat, wt, qsec)


colnames(numerik_degiskenler) <- c("Yakıt Verimliliği", 
                               "Motor Hacmi", 
                               "Beygir G", 
                               "Arka Aks Oranı", 
                               "Ağırlık", 
                               "Hızlanma")


kor_numerik <- cor(numerik_degiskenler)


corrplot(kor_numerik, 
         method = "circle",
         type = "upper",
         order = "hclust",
         tl.col = "black",
         tl.srt = 45,
         addCoef.col = "black",
         diag = FALSE,
         cl.pos = "b",
         title = "Değişkenler Arası Korelasyon",
         mar = c(0, 0, 1, 0)
)

print(round(kor_numerik, 2))
##                   Yakıt Verimliliği Motor Hacmi Beygir G Arka Aks Oranı Ağırlık
## Yakıt Verimliliği              1.00       -0.85    -0.78           0.68   -0.87
## Motor Hacmi                   -0.85        1.00     0.79          -0.71    0.89
## Beygir G                      -0.78        0.79     1.00          -0.45    0.66
## Arka Aks Oranı                 0.68       -0.71    -0.45           1.00   -0.71
## Ağırlık                       -0.87        0.89     0.66          -0.71    1.00
## Hızlanma                       0.42       -0.43    -0.71           0.09   -0.17
##                   Hızlanma
## Yakıt Verimliliği     0.42
## Motor Hacmi          -0.43
## Beygir G             -0.71
## Arka Aks Oranı        0.09
## Ağırlık              -0.17
## Hızlanma              1.00

2.2. Beygir Gücü ile Motor Hacmi Arasındaki İlişkinin İncelenmesi

Yukarıdaki tabloda beygir gücü ile motor hacmi arasında 0.79 gibi yüksek bir korelasyon çıktı. Ben bunun çok daha yüksek olacağını düşünmüştüm o yüzden incelemek istedim. Burada bu ilişikiyi bir saçılım grafiği ile incelemek istedim.

p_hp_tr <- ggplot(numerik_degiskenler, aes(x = `Motor Hacmi`, y = `Beygir G`)) +
  
  geom_point(size = 3, alpha = 0.8, color = "darkgreen") + 
  
  
  geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") +
  
 
  labs(
    title = "Motor Hacmi ve Beygir Gücü İlişkisi",
    x = "Motor Hacmi",
    y = "Beygir Gücü (hp)"
  ) +
  theme_minimal(base_size = 14)

ggMarginal(p_hp_tr, type = "boxplot", fill = "lightgray")
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

2.3. İki Sürekli Değişken İlişkisinin Farklı Kategorilerde İncelenmesi

Beygir gücü ile motor hacmi arasındaki ilişkinin otomatik ve düz vitesli araçlarda aynı oup olmadığını incelemek için “am (vites tipi)” faktör olarak eklendi.

kor_degerler <- mtcars %>%
  group_by(am) %>%
  summarise(
    kor = cor(disp, hp),
    vites_tipi = ifelse(am[1] == 0, "Otomatik Vites", "Manuel Vites"),
    x_pos = max(disp) * 0.7,
    y_pos = max(hp) * 0.95    
  )

mtcars %>%
  mutate(
    vites_tipi = as.factor(
      ifelse(am == 0, "Otomatik Vites", "Manuel Vites")
    )
  ) %>%
  
  ggplot(aes(x = disp, y = hp)) +
  
  
  geom_point(aes(color = vites_tipi), size = 4, alpha = 0.7) +
  
  
  geom_smooth(method = "lm", se = TRUE, color = "gray30", 
              linetype = "solid", linewidth = 1.2, alpha = 0.2) +
  
  geom_text(data = kor_degerler, 
            aes(x = x_pos, y = y_pos, 
                label = paste0("r = ", round(kor, 3))),
            size = 5, fontface = "bold", color = "gray20") +
  
  
  facet_wrap(~ vites_tipi) +
  
  scale_color_manual(values = c("Otomatik Vites" = "#00BFC4", 
                                  "Manuel Vites" = "#F8766D")) +
  

  labs(
    title = "Motor Hacmi ve Beygir Gücü İlişkisi",
    subtitle = "Vites tipine göre karşılaştırmalı analiz",
    x = "Motor Hacmi (cu.in.)",
    y = "Beygir Gücü (hp)",
    caption = "Veri: mtcars veri seti"
  ) +
  

  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    plot.caption = element_text(color = "gray50", size = 9),
    strip.text = element_text(face = "bold", size = 12),
    strip.background = element_rect(fill = "gray90", color = NA),
    panel.grid.minor = element_blank(),
    panel.border = element_rect(color = "gray80", fill = NA, linewidth = 0.5)
  )
## `geom_smooth()` using formula = 'y ~ x'

2.4. Pasta Grafik

Pasta grafiğin nasıl yapılabileceğini merak ettğim için bir pasta grafiği örneği eklemek istiyorum. Sildir sayısına göre araçları gruplandırıp pasta grafiği ile gösterdim.

mtcars_tr <- mtcars %>%
  mutate(Silindir = factor(cyl, 
                          levels = c(4, 6, 8),
                          labels = c("4 Silindir", "6 Silindir", "8 Silindir")))

silindir_dagilim <- mtcars_tr %>%
  group_by(Silindir) %>%
  summarise(adet = n()) %>%
  mutate(
    yuzde = round(adet / sum(adet) * 100, 1),
    etiket = paste0(Silindir, "\n", adet, " araba\n(", yuzde, "%)")
  )


ggplot(silindir_dagilim, aes(x = "", y = adet, fill = Silindir)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y", start = 0) +
  geom_text(aes(label = etiket), 
            position = position_stack(vjust = 0.5),
            size = 4,
            fontface = "bold") +
  scale_fill_manual(values = c("4 Silindir" = "#FF6B6B", 
                                "6 Silindir" = "#4ECDC4", 
                                "8 Silindir" = "#45B7D1")) +
  labs(title = "mtcars Veri Setinde Silindir Sayısına Göre Dağılım",
       subtitle = "Toplam 32 araba",
       caption = "Kaynak: mtcars Veri Seti") +
  theme_void() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    plot.subtitle = element_text(hjust = 0.5, size = 10),
    plot.caption = element_text(hjust = 1, size = 8, color = "gray50"),
    legend.position = "none"
  )

3. Saçılım Grafiği ve Üzerinde İşlemler

3.1. İki Sürekli Değişken İçin Saçılım

Motor hacmi ile yakıt verimliliği arasındaki ilişkiyi saçılım grafiği ile inceledim.

kor_test <- cor.test(numerik_degiskenler$`Motor Hacmi`, 
                     numerik_degiskenler$`Yakıt Verimliliği`)
r_degeri <- round(kor_test$estimate, 3)
p_degeri <- kor_test$p.value


if (p_degeri < 0.001) {
  p_text <- "p < 0.001"
} else {
  p_text <- paste0("p = ", round(p_degeri, 3))
}

p_disp_mpg <- ggplot(numerik_degiskenler, aes(x = `Motor Hacmi`, y = `Yakıt Verimliliği`)) +
  

  geom_point(
    shape = 21,
    size = 3,
    color = "black",
    fill = "darkorange",
    alpha = 0.8
  ) +
  
  
  geom_smooth(
    method = "lm",
    se = TRUE,
    color = "red",
    linetype = "dashed"
  ) +
  
  annotate("text", 
           x = 300, y = 33,
           label = paste0("r = ", r_degeri, ", ", p_text),
           size = 5, fontface = "bold") +
  

  labs(
    title = "Motor Hacmi ve Yakıt Verimliliği",
    x = "Motor Hacmi",
    y = "Yakıt Verimliliği"
  ) +
  theme_minimal(base_size = 14)


ggMarginal(
  p_disp_mpg,
  type = "boxplot",
  fill = "lightgray", 
  color = "black"     
)
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'

3.2. Faktör Ekleme ve Bazı Ek Ayarlar

Silindir sayısını (4, 6, 8) motor hacmi ve yakıt verimliliği arasındaki ilişkiye faktör olarak ekeyip ek düzenlemeler yaptım.

numerik_degiskenler_cyl <- numerik_degiskenler %>%
  mutate(Silindir = paste0(mtcars$cyl, " Silindir"))

kor_silindir <- numerik_degiskenler_cyl %>%
  group_by(Silindir) %>%
  summarise(
    r = cor(`Motor Hacmi`, `Yakıt Verimliliği`),
    p = cor.test(`Motor Hacmi`, `Yakıt Verimliliği`)$p.value,
    n = n()
  ) %>%
  mutate(
    etiket = ifelse(p < 0.001, 
                    paste0("r = ", round(r, 2), " (p < 0.001)\nn = ", n),
                    paste0("r = ", round(r, 2), " (p = ", round(p, 3), ")\nn = ", n))
  )

p_disp_mpg_cyl <- ggplot(numerik_degiskenler_cyl, 
                          aes(x = `Motor Hacmi`, y = `Yakıt Verimliliği`)) +
  
  geom_point(
    aes(fill = Silindir),
    shape = 21,
    size = 2.5, 
    color = "black",
    alpha = 0.7,
    stroke = 0.5
  ) +
  

  geom_smooth(
    aes(color = Silindir),
    method = "lm",
    se = TRUE,
    linewidth = 1,
    alpha = 0.15
  ) +
  
  
  geom_label(data = kor_silindir,
            aes(x = Inf, y = Inf, label = etiket),
            hjust = 1.05, vjust = 1.2,
            size = 3.5, 
            fontface = "bold",
            label.padding = unit(0.3, "lines"),
            label.size = 0.3) +
  
  
  facet_wrap(~ Silindir, scales = "free_x") +
  

  scale_fill_manual(values = c("4 Silindir" = "#E74C3C", 
                                "6 Silindir" = "#27AE60", 
                                "8 Silindir" = "#3498DB")) +
  scale_color_manual(values = c("4 Silindir" = "#E74C3C", 
                                 "6 Silindir" = "#27AE60", 
                                 "8 Silindir" = "#3498DB")) +
  
  labs(
    title = "Motor Hacmi ve Yakıt Verimliliği İlişkisi",
    subtitle = "Silindir sayısına göre karşılaştırmalı analiz",
    x = "Motor Hacmi",
    y = "Yakıt Verimliliği"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40", size = 11),
    strip.text = element_text(face = "bold", size = 11, color = "white"),
    strip.background = element_rect(fill = "gray30", color = NA),
    panel.grid.minor = element_blank(),
    panel.grid.major = element_line(color = "gray90", linewidth = 0.3),
    panel.border = element_rect(color = "gray70", fill = NA, linewidth = 0.5),
    plot.margin = margin(10, 10, 10, 10)
  )
## Warning: The `label.size` argument of `geom_label()` is deprecated as of ggplot2 3.5.0.
## i Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
print(p_disp_mpg_cyl)
## `geom_smooth()` using formula = 'y ~ x'

R Günlüğüm

Burada son iki ödevden öğrendiklerimi birlikte ve olabildiğince kısa açıklamaya çalışacağım. Çünkü son iki ödevin birbiri ile çok ilişkili olduğunu düşünüyorum. Ayrıca bir önceki öğrenme günlüğümde bilgiye yer vermemiş, duygu ve düşüncelerimi özetlemiş ve bundan sonraki günlüklerimde öğrendiklerimi aktarmaya çalışacağımı belirtmiştim.

İlk olarak daha önce biraz farkında olsam da bu iki ödev ile hangi grafik türünün hangi amaç için daha uygun olduğu konusunda farkındalığım gelişti. Bu hem daha iyi analiz yapmama hem de grafikleri daha iyi okumama destek olacak bir öğrenme oldu. İkincisi ise grafiklere neler ekleyebilirim sorusuna cevap ararken pek çok deneme imkânı buldum. Muhtemelen çok daha fazlası var, onları da öğrendikçe kullanacağım. Günlüğümde öncelikle grafiklerin ne işe yaradığından bahsedeceğim daha sonra ise R’da kullandığım fonsiyonlarla ilgili kısa bir özet vereceğim.

Sütun Grafiği:

Farklı karegorilerin aldığı değerleri karşılaştırmak için kullanabiliriz. Örneğin üniveriste öğrencilerinden oluşan bir örneklemede hangi üniversiteden kaç katlımcı var sorusuna cevap vermek için uygun bir grafik türü olabilir. R’da geom_bar() veya geom_col() fonksiyonları ile bu grafiği oluşturabiliriz.

Histogram:

Muhtemelen bu derse kadar bu grafik türünü sütun grafiği ile karıştırıyormuşum. Sütun grafiğinden farkı kategoriler değil, sayısal aralıklar üzerinde çalışması. Örneğin üniversite öğrencilerinin yaşlarına baktığımızda “18-20 yaş arası kaç öğrenci var, 21-23 yaş arası kaç öğrenci var” gibi sorulara cevap verebiliyoruz. R’da geom_histogram() ile yaparız.

Kutu Grafiği:

Bu grafik benim için çok bilgilendiriciydi. Tek grafikte hem ortanca değeri, hem verinin %25-%75 arasındaki kısmını, hem de aykırı değerleri gösteriyor. Örneğin farklı bölümlerdeki öğrencilerin sınav notlarını karşılaştırmak için kullanabiliriz. R’da geom_boxplot() fonksiyonu ile bu grafiği oluşturabiliriz.

Saçılım Grafiği:

İki sayısal değişken arasında ilişki var mı yok mu, varsa ne yönde diye bakmak için kullanıyoruz. Örneğin öğrencilerin çalışma saatleri ile sınav notları arasındaki ilişkiyi görmek için ideal. R’da geom_point() fonksiyonu ile bu grafiği oluşturabiliriz.

Çizgi Grafiği:

Bir değişkenin zaman içinde nasıl değiştiğini göstermek için kullanılıyor. Örneğin bir öğrencinin dönem boyunca aldığı haftalık quiz notlarının değişimini görmek için kullanabiliriz. R’da geom_line() fonksiyonu ile bu grafiği oluşturabiliriz.

Korelasyon Matrisi:

Birden fazla değişken arasındaki ilişkileri tek seferde görmek için kullanılıyor. Örneğin yaş, çalışma saati, devamsızlık ve sınav notu gibi değişkenlerin birbiriyle ilişkisini hızlıca görebiliriz. R’da corrplot paketi ile bu grafiği oluşturabiliriz.

Pasta Grafiği:

Bir bütünün parçalara nasıl bölündüğünü ve her parçanın yüzdesel oranını göstermek için kullanılıyor. Örneğin üniversite öğrencilerinin fakültelere göre dağılımını görmek için kullanabiliriz. R’da geom_bar() ile coord_polar() fonksiyonlarını birlikte kullanarak bu grafiği oluşturabiliriz.

Grafik Çizerken Kullandığım Fonksiyonlar

ggplot ve aes : Her grafik bunlarla başlıyor. ggplot() garfik için alt yapıyı oluşturuyor, aes() ise hangi değişkenin nereye gideceğini söylüyor:
geom_ smooth: Grafiğe regresyon çizgisi eklemek için kullandım. method = “lm”: doğrusal regresyon olduğunu iafde etmek için kullanılıyor. se = TRUE: Regresyon çizgisinin etrafındaki gölgelendirme için kullandım. Değeri FALSE yapınca gölge olmuyor.

facet_wrap: En fazla beğendiğim ve eğlendiğim özellik oldu. Grafiği kategorilere göre bölerek ayrı paneller oluşturuyor.

labs: Grafiklere başlık, alt başlık ve eksen isimleri koymak için kullanıyorum.

theme: Grafiğin görsel unsurlarını ayarlamak için kullanıyoruz.

legend.position = Lejantı eklemek veya kaldırmak için.

plot.title = element_text: Grafik başlığının ayarları için.

geom_label : Grafiğe kutulu metin etiketleri eklemek için kullanılıyor.

geom_text: Grafiğe belirli noktalara düz metin yazmak için kullanıyoruz.

annotate: Grafiğe elle belirli koordinatlara metin, şekil veya çizgi eklemek için kullanıyoruz.