Bu kısımda incelenen kaynaklardaki notlar kısaca aktarılacaktır.
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.
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 ()
Ö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
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.
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,…
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.
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()
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.
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()
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.
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()
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.
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.
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.
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"
  )
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.
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()
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.
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`.
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.
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()
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.
Ç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.