📚 İlk Bölüme Dair Notlar

Bu kısımda incelenen kaynaklardaki notlar kısaca aktarılacaktır.

📘 Veri Düzenleme ve Görselleştirme (kitap.epodder.org)

EPODDER’in kitabı R yazılımı kullanılarak oluşturulan veri düzenleme ve görselleştirme bölümlerinden oluşmaktaydı. Kitaptaki analizlerde; PISA 2018 Türkiye verisi kullanılmış. PISA, 15 yaş grubundaki öğrencilerin okuma becerileri ile matematik ve fen alanlarındaki okuryazarlıklarını değerlendirmektedir.

Uluslararası sınavlarla ilgili verilerin analizinde kullanılan paketler; İntsvy, EdSurvey, RALSA paketleri

PISA ve TIMSS Türkiye verilerini depolayan Türkiye Uluslararası Eğitim Verisi tuev paketi

Tidyverse paketi; dplyr paketi ile ggplot2 paketini içerir.

💫 Dplyr paketi

Dplyr paketi; tidyverse evreninin bir parçası, sözlük anlamı veri işleme grameri, bu paket veri manipülasyonunun grameri olarak da bilinmektedir:

  • İşlemleri bağlayan bağlama (pipe) %>%

  • İstenilen değişkenlere göre yeni bir veri seti oluşturan select( ),

    select (veri_seti, degisken_adi, degisken_adi,..)

    veri_seti %>% select(degisken_adi, degisken_adi,..)

  • Gözlemlerin seçilen değişkenlere göre yeniden sıralamaya yarayan arrange( ),

    arrange(veri_seti, degisken_adi)

    veri_seti %>% arrange(degisken_adi)

  • İstenilen gözlemlerle yeni bir veri oluşturan filter( ),

    filter(veri_seti, kosul ve/veya kosullar)

    veri_seti %>% filter(kosul ve/veya kosullar)

  • Yeni değişkenleri veri setine ekleyen mutate( ),

    mutate(veri_seti, yeni_değişken = değişken1 + değişken2)

  • Veride grup bazında işlem yapabilen group_by( ),

    v1 %>% group_by(ODOKUMA1_kategorik)

  • Veriden özet istatistikleri elde eden summarise( ),

    summarise(f=n())

  • Verileri birleştirme işlemi yapabilen join( ),

    A %>% inner_join (B) : A ve B’nin eşleşen satırlarını birleştirir.

    A %>% full_join (B) : A ve B veri setinde yer alan tüm satırları birleştirir.

    A %>% semi_join (B) : A veri setinin B ile eşleşen satırları alınarak sadece A’dan gelen sütunlar yeni veri setinde yer alır.

    A %>% anti_join (B): A’nın B ile eşleşmeyen satırları alınarak yeni veri setinde sadece A’dan gelen sütunlara yer verilir.

  • Veriyi üst düzeyde toplama işlemlerini gerçekleştiren count( ), group_by( ), summarise( ).

    veri_seti %>% count(degisken_adi)

  • Bir veri setinde aynı anda birden fazla sütuna aynı işlem uygulanmak istendiğinde across(),

    midiPISA %>%

    summarise(across(.cols=c(ODOKUMA1,ODOKUMA2),.fns=mean, .names = “{col}_mean”))

  • İstediğiniz bir değişkenin en yüksek ya da en düşük değerlerine göre veri setinde seçim yapma top_n() ,

    df <- data.frame(x = c(10, 4, 1, 6, 3, 1, 1))

    df %>% top_n(2)

💫 Position parametresi

  • “identity”: dağılım grafikleri için tercih edilir.

  • “jitter”: saçılım grafiklerinde kullanışlıdır.

  • “dodge”: genellikle çubuk grafiklerinde kullanılır.

  • “stack”: yoğunluk veya alan grafiklerinde kullanılır.

💫 İleri Düzey Grafikler

plot_ly() aracılığıyla ileri düzey grafikler çizilebilmektedir.

📗 Hafta 3: Görselleştirme Notları (OLC731 2026)

Contingency (kontenjans) tablosu; iki kategorik değişkenin her bir düzey kombinasyonuna düşen gözlem sayılarını göstermek için kullanılmaktadır.

💫 Spss etiketlerini düzeltmek için:

library(sjlabelled)

midiPISA_v1 <- midiPISA %>%

mutate(across(where(is_labelled), as_factor)) %>%

mutate(across(where(is.factor), ~ {

levels(.) <- names(attr(., “labels”)) . }))

💫 Uzun veriyi geniş hale getirmek için pivot_wider :

midiPISA |>

count(Anne_Egitim, Baba_Egitim) |>

pivot_wider(names_from=Anne_Egitim, values_from=n)

Çok az gözleme sahip düzeyleri içeren satırları filter() ile çıkarmak, bu düzeyleri değişkenden tamamen kaldırmak için droplevels() fonksiyonunu kullanmak.

midiPISA_filtred <- midiPIDA %>%

filter(!is.na(Anne_Egitim)) %>%

filter(!is.na(Baba_Egitim)) %>%

droplevels()

💫 Pasta Grafiği Çizimi

Cinsiyete göre pasta grafiği çizimi kod örneği:

library(dplyr)

pie_data <- midiPISA %>%

count(SINIF) %>%

mutate(prop = n / sum(n),

label = scales::percent(prop, accuracy = 1))

ggplot(pie_data, aes(x = ““, y = prop, fill = SINIF)) +

geom_col(width = 1, color = “white”) +

coord_polar(“y”) +

geom_text(aes(label = label),

position = position_stack(vjust = 0.5),

color = “white”, size = 4) +

labs(title = “Sınıf Dağılımı (%)”, fill = “Sınıf”) +

theme_void ()

📙 OpenIntro Tutorials-Explore

Örnek olarak dotplot, histogram, density plot ve boxplot grafiği çizimi için gerekli kodlar örnek ile birlikte aşağıda verilmiştir.

💫 dotplot

ggplot(data = cars, aes(x = weight)) +

geom_dotplot(dotsize = 0.4)

💫histogram

ggplot(data = cars, aes(x = hwy_mpg)) +

geom_histogram(binwidth = 5)

💫density plot

ggplot(data = cars, aes(x = weight)) +

geom_density(bw = 100)

💫boxplot

ggplot(data = cars, aes(x = weight)) +

geom_boxplot()

Çeyreklik hesaplamak için örnek bir yazım aşağıda gösterilmiştir.

💫Innerquartile range

life_ma |>

  summarise(

q1 = quantile(expectancy, 0.25),

q3 = quantile(expectancy, 0.75),

iqr = q3 - q1

)

💫 Grafik biçimleri

Modality: unimodal, bimodel, multimodal, uniform
Modality: unimodal, bimodel, multimodal, uniform
Skew: right skewed, left skewed, symmetric
Skew: right skewed, left skewed, symmetric

🧩Veri Kümesinin Tanıtımı

Bu çalışmada “student_mat” veri seti kullanılmıştır (Cortez, P., &Siva, A. (2008). Student performance data set [Data set]. UCI Machine Learning Repository). Veri setinde 33 değişken bulunmaktadır. Bu değişkenler; öğrencinin okulu (“GP”,“MS”) school , cinsiyet (“kadın”,“erkek”) sex , yaş (15-22 arası) age , öğrencinin ev adresi türü (“kentsel”,“kırsal”) address , aile büyüklüğü (“3 veya daha az”, “3’ten fazla”) famsize , ebeveynlerin birlikte yaşama durumu (“birlikte yaşıyor”, “ayrı yaşıyor”) Pstatus, annenin eğitim düzeyi (eğitimsiz (0), ilkokul (1), ortaokul (2), lise (3), yükseköğretim (4)) Medu, babanın eğitim düzeyi (eğitimsiz (0), ilkokul (1), ortaokul (2), lise (3), yükseköğretim (4)) Fedu ,annenin mesleği (öğretmen, sağlık alanında, kamu hizmeti, ev hanımı, diğer) Mjob, babanın mesleği (öğretmen, sağlık alanında, kamu hizmeti, evde, diğer) Fjob, bir okulun seçilme nedeni (eve yakınlık, okul itibarı, ders tercihi, diğer) reason, öğrencinin yasal velisi (anne, baba, diğer) guardian, evden okula ulaşım süresi (15 dk’dan az, 15-30 dk, 30 dk-1 saat, 1 saatten fazla) traveltime, haftalık ders çalışma süresi (2 saatten az, 2-5 saat, 5-10 saat, 10 saatten fazla) studytime, geçmişte sınıfta kalma sayısı failures, okuldan eğitim desteği alıp almadığı schoolsup, aileden eğitim desteği alıp almadığı famsup, dersiyle ilgili ek ücretli özel ders alıp almadığı paid, ders dışı etkinliklere katılım durumu activities, anaokuluna gitme durumu nursery, yükseköğretimde devam etme isteği higher , evde internet erişimi internet, romantik bir ilişkisinin olup olmaması romantic, aile ilişkilerinin kalitesi famrel, okuldan sonra boş zaman düzeyi freetime, arkadaşlarla dışarı çıkma sıklığı goout , hafta içi alkol tüketimi Dalc, hafta sonu alkol tüketimi Walc, güncel sağlık durumu health, okul devamsızlık sayısı absences, 1.dönem notu G1, ikinci dönem notu G2, final (3.dönem) notu G3.

🤓 Kodlamaya Başlayalım

Veri setimiz excelde olduğu için readxl paketi ile read_excel ( ) fonksiyonu ile veri setimizi okutuyoruz.

library(readxl) 
student_mat <-
read_excel("student-mat(in).xlsx")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)

Tidyverse paketini yükleyip glimpse( ) fonksiyonu ile veri setimize göz atıyoruz.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.2
## ✔ lubridate 1.9.4     ✔ tibble    3.3.0
## ✔ purrr     1.1.0     ✔ tidyr     1.3.1
## ✔ readr     2.1.5     
## ── 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
glimpse(student_mat)
## Rows: 395
## Columns: 33
## $ school     <chr> "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP",…
## $ sex        <chr> "F", "F", "F", "F", "F", "M", "M", "F", "M", "M", "F", "F",…
## $ age        <dbl> 18, 17, 15, 15, 16, 16, 16, 17, 15, 15, 15, 15, 15, 15, 15,…
## $ address    <chr> "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U",…
## $ famsize    <chr> "GT3", "GT3", "LE3", "GT3", "GT3", "LE3", "LE3", "GT3", "LE…
## $ Pstatus    <chr> "A", "T", "T", "T", "T", "T", "T", "A", "A", "T", "T", "T",…
## $ Medu       <dbl> 4, 1, 1, 4, 3, 4, 2, 4, 3, 3, 4, 2, 4, 4, 2, 4, 4, 3, 3, 4,…
## $ Fedu       <dbl> 4, 1, 1, 2, 3, 3, 2, 4, 2, 4, 4, 1, 4, 3, 2, 4, 4, 3, 2, 3,…
## $ Mjob       <chr> "at_home", "at_home", "at_home", "health", "other", "servic…
## $ Fjob       <chr> "teacher", "other", "other", "services", "other", "other", …
## $ reason     <chr> "course", "course", "other", "home", "home", "reputation", …
## $ guardian   <chr> "mother", "father", "mother", "mother", "father", "mother",…
## $ traveltime <dbl> 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 2, 1, 1, 1, 3, 1, 1,…
## $ studytime  <dbl> 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 2, 3, 1, 3, 2, 1, 1,…
## $ failures   <dbl> 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,…
## $ schoolsup  <chr> "yes", "no", "yes", "no", "no", "no", "no", "yes", "no", "n…
## $ famsup     <chr> "no", "yes", "no", "yes", "yes", "yes", "no", "yes", "yes",…
## $ paid       <chr> "no", "no", "yes", "yes", "yes", "yes", "no", "no", "yes", …
## $ activities <chr> "no", "no", "no", "yes", "no", "yes", "no", "no", "no", "ye…
## $ nursery    <chr> "yes", "no", "yes", "yes", "yes", "yes", "yes", "yes", "yes…
## $ higher     <chr> "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "ye…
## $ internet   <chr> "no", "yes", "yes", "yes", "no", "yes", "yes", "no", "yes",…
## $ romantic   <chr> "no", "no", "no", "yes", "no", "no", "no", "no", "no", "no"…
## $ famrel     <dbl> 4, 5, 4, 3, 4, 5, 4, 4, 4, 5, 3, 5, 4, 5, 4, 4, 3, 5, 5, 3,…
## $ freetime   <dbl> 3, 3, 3, 2, 3, 4, 4, 1, 2, 5, 3, 2, 3, 4, 5, 4, 2, 3, 5, 1,…
## $ goout      <dbl> 4, 3, 2, 2, 2, 2, 4, 4, 2, 1, 3, 2, 3, 3, 2, 4, 3, 2, 5, 3,…
## $ Dalc       <dbl> 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,…
## $ Walc       <dbl> 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 4, 3,…
## $ health     <dbl> 3, 3, 3, 5, 5, 5, 3, 1, 1, 5, 2, 4, 5, 3, 3, 2, 2, 4, 5, 5,…
## $ absences   <dbl> 6, 4, 10, 2, 4, 10, 0, 6, 0, 0, 0, 4, 2, 2, 0, 4, 6, 4, 16,…
## $ G1         <dbl> 5, 5, 7, 15, 6, 15, 12, 6, 16, 14, 10, 10, 14, 10, 14, 14, …
## $ G2         <dbl> 6, 5, 8, 14, 10, 15, 12, 5, 18, 15, 8, 12, 14, 10, 16, 14, …
## $ G3         <dbl> 6, 6, 10, 15, 10, 15, 11, 6, 19, 15, 9, 12, 14, 11, 16, 14,…

🎯 Kod+Grafik+Açıklama

Bu bölümde dağılım grafiği, sütun grafiği, kutu grafiği, yoğunluk grafiği, histogram grafiği ve çizgi grafiği çizimi gerçekleştirilecektir. Her bir grafiğin altında yorum satırı mevcuttur.

🔹 Dağılım Grafiği (iki sayısal değişkenin ilişkisi)

Evden okula ulaşım süresi ile 1.dönem notu arasındaki ilişkinin cinsiyet bazında dağılım grafiği çizilecektir.

library(ggplot2)
ggplot(student_mat, aes(x= traveltime, 
                        y= G1)) +
    geom_point(color= "orange") +
  geom_text(aes(label = traveltime), vjust = -0.5, size = 1.5) +
  facet_grid(~sex) +
  labs(
    title= "Evden okula ulasim suresi ile 
    1.donem notu arasindaki iliski (dagilim grafigi)",
    x= "evden okula ulasim suresi",
    y= "1.donem notu"
  )+
  theme_grey()

📌 Yorum

Evden okula ulaşım süresi açısından bakıldığında (1: 15 dk’dan az, 2: 15-30 dk, 3: 30 dk-1 saat, 4: 1 saatten fazla), öğrencilerinin çoğunluğunun okula ulaşımının 1 saatten fazla sürmediği ve bu durumun cinsiyet açısından farklılaşmadığı görülmektedir. Görselleştirme yöntemi bir miktar uygun görünmekle birlikte kutu grafiği ile de görselleştirme yapılabilirdi.

🔹 Sütun Grafiği (Kategorik değişkenin dağılımı)

Evde internet erişimi ile öğrencilerin 2. dönem not ortalamalarının sütun grafiği çizilecektir.

library(dplyr)

student_mat %>%
  group_by(internet) %>%
  summarise(mean_G2 = mean(G2, na.rm = TRUE)) %>%
  ggplot(aes(x = internet, y = mean_G2)) +
  geom_col(fill = "blue", color = "darkblue") +
  labs(
    title = "Evde internet erisimi durumuna gore 
    ortalama 2. donem notu (sutun grafigi)",
    x = "Evde internet erisimi",
    y = "Ortalama 2. donem notu"
  )+
  theme_bw()

📌 Yorum

Evde internet erişimi olanların 2.dönem notu ortalamalarının evde internet erişimi olmayanlara göre daha yüksek olduğu görülmekle birlikte öğrencilerin notları arasındaki fark minimal görünmektedir. Görselleştirme yönteminin uygun olduğu düşünülmektedir. Ancak kutu grafiği yöntemi de tercih edilebilirdi.

🔹 Kutu Grafiği (Gruplar arası farkların incelenmesi)

  1. dönem notunun cinsiyet ve okul türüne göre farklılığının incelenmesi için kutu grafiği ile görselleştirme yapılmıştır.
ggplot(student_mat, aes(x= sex , y= G2, fill= school)) +
    geom_boxplot() +
  labs(
    title= "2.donem notunun okul turu ve cinsiyete gore farki 
    (kutu grafigi)",
    x= "cinsiyet",
    y= "2.donem notu") +
  theme_minimal()

📌 Yorum

Okul ve cinsiyete göre 2. dönem puanı incelendiğinde kızların ikinci dönem puanlarının ortalamasının her iki okulda da eşit olduğu, GP okulundaki erkek öğrencilerin ikinci dönem puanlarının ise MS okulundaki erkek öğrencilerden daha yüksek olduğu görülmektedir. Görselleştirme yönteminin uygun olduğu düşünülmekte olup sütun grafiği ile de görselleştirme yapılabilirdi.

🔹 Yoğunluk Grafiği (Sürekli değişken dağılımı)

Cinsiyete göre yaş ortalamaları yoğunluk grafiği ile gösterilecektir.

# Her cinsiyet için yaş ortalaması
mean_age <- student_mat %>%
  group_by(sex) %>%
  summarise(mean_age = mean(age, na.rm = TRUE))

# Grafik
ggplot(student_mat, aes(x = age, fill = sex)) +
  geom_density(alpha = 0.1) +
  geom_vline(data = mean_age,
             aes(xintercept = mean_age, color = sex),
             linetype = "dashed", size = 1) +
  labs(
    title = "Cinsiyete gore yas dagilimi(yogunluk grafigi)",
    x = "Yas",
    y = "Yogunluk"
  ) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

📌 Yorum

Grafiğe bakıldığında kız ve erkek öğrencilerin 16-18 yaş aralığında yoğunlaştığı söylenebilir. 20-22 yaş arasındaki dağılım yok denecek kadar azdır. Yaş ortalaması kesikli çizgi ile gösterilmektedir. Görselleştirme yönteminin uygun olduğu düşünülmektedir. Histogram ile de gösterilebilirdi.

🔹 Yoğunluk Grafiği-2 (Sürekli değişken dağılımı)

Cinsiyete göre 1.dönem notunun yoğunluk grafiğini çiziyoruz.

ggplot(student_mat, aes(x= G1)) +
    geom_density(fill="lightblue", alpha=0.5) +
  facet_wrap(~sex)+
  labs(
    title= "Cinsiyete gore 1.donem notu (yogunluk grafigi)",
    x= "1.donem notu"
  )

📌 Yorum

Kızlardaki dağılımın bimodal, erkeklerdeki dağılımın unimodal olduğu görülmektedir. Puanların 10 civarında yoğunlaştığı görülmektedir. Görselleştirme yöntemi bir miktar uygun görünmekte olup histogram ile de görselleştirme yapılabilirdi.

🔹 Histogram Grafiği 1 (Sürekli değişken dağılımı)

Okul devamsızlık sayısı değişkeninin dağılımını incelemek için bir histogram grafiği çiziyoruz.

ggplot(student_mat, aes(x = absences)) +
  geom_histogram(
    color = "purple", 
    fill = "lavender",        
    binwidth = 2              
  ) +
  labs(
    title = "Histogram",
    x = "okul devamsizlik sayisi",
    y = "ogrenci sayisi"
  ) +
  theme_bw()

📌 Yorum

Okul devamsızlık sayısı 20 günden sonra yok denecek kadar azdır. Görselleştirme yöntemi uygun görünmekte olup dağılım grafiği ile de incelenebilirdi.

🔹 Histogram Grafiği 2 (Sürekli değişken dağılımı)

Okul devamsızlık sayısının cinsiyete göre değişimini incelemek için yeni bir histogram grafiği çiziyoruz.

library(ggplot2)
ggplot(student_mat, aes(x=absences, fill=sex)) +
  geom_histogram(color="grey")+
  labs(title= "Cinsiyete Gore Okul Devamsizligi Histogrami",
      x= "okul devamsizlik sayisi") +
   theme_bw()
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

📌 Yorum

Okul devamsızlık sayısını oluşturan cinsiyetlere bakıldığında kız ve erkek öğrencilerinin devamsızlık oranları birbirlerine yakın olarak görünmektedir. Histogram grafiği görselleştirme yöntemi olarak uygun görünmektedir. Alternatif olarak kutu grafiği kullanılabilirdi.

🔹 Çizgi Grafiği (Zaman veya sıra içindeki değişim)

Okulun seçilme sebebi ile 1. dönem notu ortalaması arasındaki değişime bakılmak için çizgi grafiği çizilecektir. Öncelikle verimizi okulun seçilme sebebi değişkenine göre gruplandırarak group_by 1. dönem notu ortalamasını summarise fonksiyonu ile açıklıyoruz.

ortalama_reason <- student_mat %>%
  group_by(reason) %>%
  summarise(ortalama_G1 = mean(G1, na.rm = TRUE))

# Çizgi grafiği
ggplot(ortalama_reason, aes(x = reason, y = ortalama_G1, group = 1)) +
  geom_line(size = 1, color = "blue") +
  geom_point(size = 3, color = "darkblue") +
  labs(
    title = "Okulun secilme nedenine gore 
    1. donem not ortalaması (cizgi grafigi)",
    x = "Okulun secilme nedeni",
    y = "1. donem not ortalaması"
  ) +
  theme_minimal()

📌 Yorum

Okul seçiminde okul itibarı sebebiyle seçim yapanların 1. dönem notu ortalamasının diğer sebeplerle seçim yapanlara göre daha yüksek olduğu görülmektedir (course: ders tercihi, home: eve yakınlık, other: diğer, reputation: okul itibarı). Okul itibarına göre seçim yapanların okul motivasyonu ve başarı isteğinin daha yüksek olma ihtimali bu durumun bir sebebi olabilir. Görselleştirme yöntemi bakımından bir miktar uygun görünmekte olup kutu grafiği ile de gösterilebilirdi.

🧠 Öğrenme Günlüğü

Çalışmaları yaptıkça özümsemekte zorlandığım fikrine kapılıyorum. Yeterince pratik yapamıyorum. Anladım sanıyorum fakat sonra yine yeterince oturmadığını görüyorum. Aynı yabancı dil öğrenme gibi bir süreçmiş. Bu ödev aracılığıyla görselleştime ile ilgili bilgilerin uygulamasını yapma konusunda bir deneyim edindim.