Bu dersi, Epodder Kitaplıktan indirdiğimiz Veri Düzenleme ve Görşelleştirme / Kübra Atalay Kabasakal & Sebahat Gören kitabından işledik. Kitaptaki PISA, miniPISA gibi veri setlerini kullanarak analizlerimizi gerçekleştirdik.

Veri Setlerinin Yüklenmesi

Bu kitapta kullanılan veri setleri https://www.oecd.org/pisa/data/ adresinden indirildikten sonra sadece Türkiye’ye ait veri setleri *.Rda uzantılı olacak şekilde kaydedilmiştir. Dersimizde kullanmak için aşağıda yer alan üç veri setini bilgisayarımıza indirdik.

Bilişsel veri seti

Okul veri seti

Öğrenci anketi veri seti

İndirdiğimiz veri setlerini aşağıdaki kodları kullanarak programa yükledik.

load("C:/OLC731/Hafta_06/data/PISA_COG_2018.rda")
load("C:/OLC731/Hafta_06/data/PISA_SCH_2018.rda")
load("C:/OLC731/Hafta_06/data/PISA_OGR_2018.rda")

Bilişsel veri seti 6890 gözlem(öğrenci) ve 3589 değişken, öğrenci anketi veri seti 6890 gözlem (öğrenci) ve 3589 değişken, okul anketi veri seti 186 gözlem (okul) ve 197 değişken içermektedir. Bu kadar büyük bir veri seti ile çalışmak zor olacağı için pratiklik ve anlaşılabilirlik açısından PISA_OGR_2018 veri setinden seçilen veri düzenleme bölümünde midiPISA, veri görselleştirme bölümünde ise miniPISA veri setleri oluşturulmuş ve kitaptaki örnekler bu veri setleri üzerinden yapılmıştır.

midiPISA Veri Seti

midiPISA veri setini oluşturmak için ilk olarak dplyr ve pipe operatörünün orijinal paketi olan magrittr paketlerini yükledik. Sonrasında pipe( %>% ) operatörünü kullanarak select argümanı ile istediğimiz değişkenleri seçerek midiPISA veri setini oluşturduk.

library(dplyr)
library(magrittr)
midiPISA <- PISA_OGR_2018 %>% 
  select(OGRENCIID,SINIF,CINSIYET,
         Anne_Egitim,Baba_Egitim,OKUMA_ZEVK,
         ST097Q01TA:ST097Q05TA,ODOKUMA1:ODOKUMA5)
  • pipe operatörü, analiz edeceğimiz nesne ile ilgili kullanacağımız fonksiyonları birbirine bağlamak için kullanılıyor. Böylece daha az kod satırıyla daha fazla işlem yapabiliyoruz. Şu an için kullanımına aşina değilim ancak zamanla daha anlamlı geleceğini düşünüyorum.

miniPISA Veri Seti

Aynı şekilde bir de miniPISA veri seti oluşturduk.

#library(dplyr)
#library(magrittr)
miniPISA <- PISA_OGR_2018 %>% 
  select(SINIF, CINSIYET, KITAPSAYISI, SES, 
    Anne_Egitim,Baba_Egitim,OKUMA_ZEVK,OK_YETERLIK,
    Okuloncesi_yil, OKUL_TUR,ODOKUMA1)

Veri Setlerinin R Ortamına Aktarılması

midiPISA ve miniPISA veri setlerini yukarıdaki gibi değilde linklerden indirirsek midiPISA veri seti , miniPISA veri seti, bu veri setlerini R ortamına aktarmamız gerekir. Bunun için load() fonksiyonunu kullandık. Bu veri setlerinin ilk altı satırını gösteren head() fonksiyonuyla da veri setini yazdırdık.

# çalışılacak veri setinin data adlı klasörden R ortamına aktarılması
load("C:/OLC731/Hafta_06/data/midiPISA.rda") 
# ilk altı satırın görüntülenmesi
head(midiPISA) 

NOT: derste miniPISA veri setini load ederken hata aldım. Bunun veri setindeki değişkenlerin etiketlerinden kaynaklandığını öğrendik. Bu etiketlerden kurtulunca sorun ortadan kalktı. Bunu da şu şekilde yaptık:

library(tidyverse) # paketin aktifleştirilmesi
load("C:/OLC731/Hafta_06/data/midiPISA.rda") # çalışılacak veri setinin R ortamına aktarılması
midiPISA <- expss::drop_var_labs(midiPISA) # değişken etiketlerinin atılması
head(midiPISA)
load("C:/OLC731/Hafta_06/data/miniPISA.rda") # çalışılacak veri setinin R ortamına aktarılması
miniPISA <- expss::drop_var_labs(miniPISA) # değişken etiketlerinin atılması
head(miniPISA)

Veri Düzenleme

Veri setlerini yükledikten ve değişken etiketlerinden kaynaklanan hatalardan kurtulduktan sonra Veri düzenlemede en sık kullanılan paketlerden biri olan dplyr paketine giriş yaptık.

Pipe operatörü

%>% operatörü veri düzenleme işlemlerinde kullanışlı olduğundan sık tercih edilen bir operatördür. Kısa yolu windows için Ctrl+Shift+M, mac için Cmd+Shift+M’dir. Bu operatör magrittr paketinde yer aldığı için pipe operatörü kullanılırken paketin aktifliği kontrol edilmelidir.

%>% solundaki nesneye sağındaki fonksiyonu uygular. Yani pipe operatörünün solundaki öğeler, sağındaki fonksiyonun ilk argümanına iletilir. Fonksiyon ilk argümanı olan veriyi, pipe operatörünün solundan alır, kalan argümanlar fonksiyonun sağındadır.

filter()

Satır bazında veri seçim işlemi yapabilmek için filter() fonksiyonunu kullandık. Böylece veri setindeki istenilen değişkenler filtrelenerek sadece seçilen gözlemlerden oluşan yeni bir veri seti elde ettik. Örneğin; midiPISA verisinde Anne_Egitim anne eğitim düzeyini, Baba_Egitim baba eğitim düzeyini belirten değişkenlerdir. Belirtilen değişkenlerde lisansüstü mezun olma durumu “6” kodu ile belirtilmektedir.

  • Anne eğitim düzeyi lisansüstü olan öğrencilerin seçilmesi;
midiPISA %>% 
  filter(Anne_Egitim==6) %>% 
  head(5) 
  • Anne eğitim düzeyi ve baba eğitim düzeyi lisansüstü olan öğrencilerin seçilmesi;
midiPISA %>% 
  filter(Anne_Egitim==6 & Baba_Egitim==6) %>%  
  head(5) 
  • Anne eğitim düzeyi veya baba eğitim düzeyi lisansüstü olan öğrencilerin seçilmesi;
midiPISA %>% 
  filter(Anne_Egitim==6 | Baba_Egitim==6) %>% 
  head(5) 

NOT: Büyük veri setleri ile çalışırken filter() fonksiyonunun gerçekten çok işlevsel olacağını anladım. Veri setinden istediğimiz verileri çekebilmek için ve(&), veya(|), eşit(==) gibi birçok mantıksal operatörün bu fonksiyon ile kullanılabileceğini öğrendim.

select()

Veri setinden sütun bazında seçimler yapabilmek için select() fonksiyonunun kullanılabileceğini öğrendik. Aşağıda bu fonksiyonun kullanımına çeşitli örnekler verilmiştir.

midiPISA %>%
  select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK)%>% 
head(5) 

Yukarıdaki fonksiyon ile dört değişkenden oluşan yeni bir veri seti oluşturulmuştur.select() fonksiyonu, orijinal veri setinde herhangi bir değişikliğe yol açmaz. Bu nedenle seçim yapılan değişkenlerden oluşan yeni veri setini ayrı bir R nesnesine atayarak kaydetmek gerektiği unutulmamalıdır.

  • Belirli bir aralıkta yer alan değişkenlerin iki nokta : operatörü ile seçilmesi:
midiPISA %>% 
  select(OGRENCIID:ST097Q04TA,-CINSIYET) %>% # sütun bazında değişken ekleme ve çıkarma
head(5) #ilk beş satırın görüntülenmesi
  • starts_with() fonksiyonunun sadece select() fonksiyonu içinde çalışan ve değişken seçme işlemini kolaylaştıran yardımcı bir fonksiyon olduğunu öğrendik. Örneğin ST097 ile başlayan degişkenler starts_with() fonksiyonu ile seçilebilir.
select(midiPISA, starts_with("ST097")) %>%  
  head(5) 
  • ends_with() benzer şekilde TA ile biten değişkenler seçilmek istendiğinde kullanılır.
select(midiPISA, ends_with("TA")) %>%   
  head(5) 
  • contains() yine benzer şekilde içinde belli harfler geçen değişkenler seçilmek istendiğinde kullanılır. Örneğin içinde OD geçen değişkenlerin seçilmesi;
select(midiPISA,contains("OD")) %>%  
  head(5)
  • Farklı fonksiyonlar ve aynı anda mantıksal operatörler kullanılarak da seçim işlemleri gerçekleştirilebilir. Örneğin midiPISA veri setinde “OD” içeren veya içinde “1” rakamı geçen değişkenlerin seçimi;
select(midiPISA,contains("OD") | matches("1")) %>% head(5) 
  • Hariç tutmak ve veri setinden çıkarmak amacıyla - operatörü kullanılabilir. “O” harfini içermeyen ve içinde “0” rakamı olmayan değişkenlerin seçimi için;
select(midiPISA,-contains("O"),-matches("0"))  %>% head(5)

arrange()

Bu fonksiyon satırları sıralamak amacıyla kullanılıyor. Sıralama işlemini alfabetik sıralamaya göre yapıyor, ama ek bir fonksiyon yazıldığında büyüklük sırasına göre de sıralama yapabiliyor. Böylece veri seti istenilen kritere göre sıralanarak değişkenler arasındaki ilişkinin kolay bir şekilde görülebilmesini sağlıyor.

  • Örnek veri seti üzerinden dört değişken seçip yeni bir veri setine (df) atadık ve bu yeni veri setini OKUMA_ZEVK puanlarına göre sıraladık:
df <- midiPISA %>% 
  select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK)
  df %>% head(6) 
arrange(df,OKUMA_ZEVK) %>% #default olarak küçükten büyüğe sıralar
  head(5)
arrange(df,desc(OKUMA_ZEVK))%>%  #büyükten küçüğe sıralar
  head(5)

select() ve arrange() birlikte kullanım

midiPISA %>% 
 select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK) %>% #değişkenlerin seçimi
  arrange(OKUMA_ZEVK)%>% # değişkendeki gözlemleri sıralama
  head(6) #ilk 6 satırın görüntülenmesi

rename()

Veri setinden istenilen değişkenler seçilerek yeni bir veri seti oluşturulmak istendiğinde seçilen değişkenlerin de ismini değiştirmek isteyebiliriz. Bu durumda rename() fonksiyonu (yeni ad=eski ad) şeklinde kullanılabilir.

midiPISA %>%   
select(ODOKUMA1,ODOKUMA2)%>% 
  rename(okumapuan1=ODOKUMA1,okumapuan2=ODOKUMA2) %>%
head(3) 

mutate()

Bu fonksiyon ile veri setine yeni değişkenler eklenebileceğini öğrendik. mutate() fonksiyonu ile veri setine yeni değişkenler eklenirken mevcut değişkenler de korunur ancak transmutate() fonksiyonu ile eski değişkenler veri setiden çıkarılarak yeni değişken eklenir.

  • Örneğin ST097 ile başlayan maddelerden yeni bir veri seti oluşturulup, bu veri setine toplam puan eklenebilir. Aşağıdaki örnekte ST097 ile başlayan maddeler seçilmiş ve seçilen beş maddenin toplamı ayrı bir değişken olarak eklenmiştir. Oluşturulan bu toplam puan değişkeni ve beş madde zevk adlı yeni bir veri seti olarak eklenmiştr.
zevk<- select(midiPISA, starts_with("ST097"))
zevk%>% 
mutate(toplam =ST097Q01TA+ST097Q02TA+ST097Q03TA+ST097Q04TA+ST097Q05TA) %>% 
 head(3) 
  • Ekleyeceğimiz sütunu istediğimiz değişkenin önüne de alabiliriz:
zevk %>% 
mutate(toplam=rowSums(across(ST097Q01TA:ST097Q05TA)),
       .before= ST097Q01TA)%>%
  head(3) 
  • transmute() fonksiyonu kullanılarak yeni değişken oluşturulduğunda, işlemde kullanılan değişkenler veri setinden çıkarılır, sadece yeni oluşturulan değişken veri setine eklenir.
zevk %>% 
transmute(toplam=rowSums(across(ST097Q01TA:ST097Q05TA))) %>% 
head(2) 

ifelse()

Ders anlatırken Kübra hocanın çok önemsediği, çok sık kullanacağımızı ve çok kkolaylık sağlayacağını söylediği fonksiyonlardan biriydi ifelse fonksiyonu.

  • Bir örnek üzerinde ifelse() fonksiyonunu açıklayalım. Öncelikle x nesnesini aşağıdaki gibi tamsayılardan oluşturalım ve ifelse() fonksiyonu sayesinde sıfırdan küçük olanlar negatif, büyük olanlar pozitif olacak şekilde tanımlansın.
x <- c(-2,1,-1,-3,3)
ifelse(x<0,"Negatif", "Pozitif")
## [1] "Negatif" "Pozitif" "Negatif" "Negatif" "Pozitif"

case_when()

case_when() fonksiyonu çoklu ifelse() kullanımı ile benzer işlevi sağlar. case_when() birden fazla koşula dayalı karşılaştırmalarda yeni bir değişken oluşturmak amacıyla kullanılır.

v1 <- midiPISA %>%
  mutate(ODOKUMA1_kategorik =
    case_when(
      ODOKUMA1 <=  402.6  ~ "dusuk",
      ODOKUMA1 > 402.6  & ODOKUMA1 <  525.7 ~ "orta",
      ODOKUMA1 >=525.7 ~ "yuksek" )) %>%
      select(ODOKUMA1,ODOKUMA1_kategorik)
  head(v1)
  • Okuma puanı 402.6’dan küçük olanlar düşük, 402.6 ile 525.7 arasında olanlar orta, 525.7 den büyük olanlar ise yüksek olarak kategorilendirilmiştir. Oluşturulan ODOKUMA1_kategorik adlı yeni değişken ile okuma puanı olası değerlerinin yer aldığı ODOKUMA1 değişkeninden oluşan yeni veri seti v1 olarak çalışma alanına kaydedilmiştir. head() fonksiyonu ile v1 veri setinin ilk altı satırı görüntülenmektedir.

* Derste yaptığımız örnek:

v1 <- midiPISA %>%
  mutate(ODOKUMA1_kategorik =
    if_else(ODOKUMA1 <= 402.6, "dusuk",
      if_else(ODOKUMA1 < 525.7, "orta", "yuksek")
    )
  ) %>%
  select(ODOKUMA1, ODOKUMA1_kategorik)
head(v1)

count()

count() fonksiyonu frekans tablosu oluşturmak için kullanılmaktadır. Yine pipe operatörü ile birlikte sıklıkla kullanılmaktadır.

v1 %>% count(ODOKUMA1_kategorik)

summarise()

summarise() fonksiyonu tek satırda veri setini özetleyerek yeni bir veri seti oluşturan fonksiyondur. Yani seçilen sütunlar için her satırı kullanarak özet istatistikleri hesaplar. Örneğin; min() minumum değer, max() maksimum değer, mean() ortalama değer, median() ortanca, quantile() q. yuzdelik, sd() standart sapma, var() varyans, diff(range()) değiskenlik, first() ilk eleman, last() son eleman, nth() n. eleman, n() toplam eleman sayısı, n_distinct() farklı değerlerin sayısı hesaplanabilir.

midiPISA %>% 
summarise(mean(ODOKUMA1)) #ortalamanın hesaplanması

Örneğin bir veri setindeki değişkenlerin hem ortalaması, hem standart sapması hem de minimum, maksimum değerleri hesaplanmak istenebilir. Bu durumda aşağıdaki örnekte olduğu gibi bu fonksiyonlar “,” kullanılarak art arda yazılabilir.

midiPISA %>%
  summarise(n = n(),  
            ortalama=mean(ODOKUMA1),  
            sd=sd(ODOKUMA1),
            min=min(ODOKUMA1),
            max=max(ODOKUMA1))

summarise() ve group_by()

summarise() fonksiyonu gruplandırılmamış bir veri setinde, tüm satırlardan özet istatistik bilgileri hesaplamıştır. Bu bilgiler, veri setinde yer alan alt gruplar için ise ayrı ayrı group_by() fonksiyonu ile hesaplanabilir. group_by() dan sonra kullanılan fonksiyonlar her grup için ayrı ayrı hesaplanama yapar ve bu fonksiyon içinde sürekli değişken kullanılmaz.

  • CINSIYET değişkenine göre ODOKUMA1 puanlarına ilişkin özetleyici istatistikler:
midiPISA %>%
  group_by(CINSIYET) %>%
  summarise(n = n(),ortalama=mean(ODOKUMA1),sd=sd(ODOKUMA1),min=min(ODOKUMA1),max=max(ODOKUMA1)) 
  • Gruplandırılmış elde edilen veri setlerinde tekrar işlem yapmak istenirse ungroup() fonksiyonu kullanılabilir.
midiPISA %>%
  #CINSIYET ve SINIF değişkenlerine göre gruplara ayırma 
  group_by(CINSIYET,SINIF) %>% 
  # özetleyici bilgileri hesaplama
  summarise(n = n(),ortalama=mean(ODOKUMA1),sd=sd(ODOKUMA1)) %>%  
  # gözlemleri ortalama değerleri büyükten küçüğe olacak şekilde sıralama
  arrange(desc(ortalama)) %>% 
  # grupları birleştirme
  ungroup() 

NOT: Ders dolu dolu geçti, dplyr paketinde gerçekten çok fazla foksiyon var, derste yetişmekte zorlandım biraz açıkcası. Sonradann bakıp tekrarladığımda biraz daha oturdu. Daha öğrenecek çok şey var.