Giriş

Bu hafta Kübra Atalay Kabasakal ve Sebahat Gören’in EPODDER Kİtaplık’ta açık erişim olarak yayımlanan “Veri Düzenleme ve Görselleştirme” adlı çalışmasından ilerledik.

Veri Setlerinin İndirilmesi ve Bilgisayara Yüklenmesi

Şu üç veri setini indirip R’a aktardık:

##Bilişsel Veri Seti
##Öğrenci Veri Seti
##Okul Veri Seti
devtools::install_github("tuevpaket/tuev")
## Skipping install of 'tuev' from a github remote, the SHA1 (92c1d67f) has not changed since last install.
##   Use `force = TRUE` to force installation
library("tuev")

Veri Setlerinin Yüklenmesi

Aşağıdaki kodlarla veri setleri R’a aktarıldı. Bunu #import dataset komutu kullanarak da yapabiliriz aslında. Çünkü SPSS uzantılı sav. dosyası olarak iniyor veriler. Önemli olan verilerin working directory’deki doğru klasörde yer alması ve adının doğru olması.

data(PISA_COG_2018)
data(PISA_SCH_2018)
data(PISA_OGR_2018)
data("TIMSS19_btmturb7")

Midi PISA Veri Seti Oluşturma

Midi PISA veri setini oluşturmak için öncelikle #dplyr ve pipe operatörünün orijinal paketi olan #magrittr paketlerini yükledik.

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(magrittr)

dplyr paketini yüklerken R, Console’da şu uyarıyı verdi:

##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
##Bunu CHATGPT'ye sorduğumda paket çakışmalarını önlemek için uyarı niteliğinde olduğunu öğrendim. Bu uyarı, dplyr paketi yüklenirken R'de sık karşılaşılan bir mesaj ve bize #dplyr'deki bazı fonksiyonların (örneğin; filter, lag, intersect, vb. gibi) diğer paketlerdeki fonksiyonlarla (stats ve base) aynı isimlere sahip olduğunu bildiriyor. Kodumuzda bu fonksiyonları kullandığımızda, biz aksini belirtmediğimiz sürece #dplyr paketinin fonsiyonları öncelikli olacak.Paket çakışmalarını önelemek için şunları yapmak gerekiyor:

##1. Use Explicit Namespaces: Eğer dplyr yerine stats veya base paketinden bir fonksiyon kullanmak istiyorsak, önüne paket adını eklemeliyiz. Örneğin:

##stats::filter()  # Use the filter function from stats
##base::union()    # Use the union function from base

##2. Check Conflicts: Hangi fonksiyonun çağrıldığından emin değilsek, şunları kullanarak mevcut tanımı kontrol edebiliriz:

##conflicts() or get():Rconflicts()get("filter")

##3. Load dplyr Last: stats veya base'deki çakışan fonksiyonları kullanmayı planlamıyorsak, fonksiyonlarına öncelik verilmesini sağlamak için en son dplyr paketini yüklemeliyiz.

pipe operatörü kullanarak select fonksiyonu ile değişken seçip midipisa veri setini oluşturduk. Veri setini oluşturuken şu kodları kullandık:

midiPISA <- PISA_OGR_2018 %>% 
  select(OGRENCIID,SINIF,CINSIYET,
         Anne_Egitim,Baba_Egitim,OKUMA_ZEVK,
         ST097Q01TA:ST097Q05TA,ODOKUMA1:ODOKUMA5)

Mini PISA Veri Seti Oluşturma

Yukarıdaki kodları kullanarak bir de “Midi PISA 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)

Burada oluşturduğumuz veri setlerini PC’ye yükledik.

library(dplyr)
df_1<-PISA_OGR_2018 %>% 
  select(OKUMA_BAGLILIGI, OKUMA_ZEVK, OK_ZORLUK)
saveRDS(df_1, "C:/Users/huawei/Desktop/OLC731/RPROJE/data/PISA_OGR_2018.rda")
df_1<- readRDS("C:/Users/huawei/Desktop/OLC731/RPROJE/data/PISA_OGR_2018.rda")

library(tidyverse)

Veri Setini R’a Aktarma

load fonksiyonu kullanarak midi PISA Veri setini R’a yükledik.

load("C:/Users/huawei/Desktop/OLC731/RPROJE/data/midiPISA.rda") #yükledik
midiPISA<- expss::drop_var_labs(midiPISA)  #değişken etiketlerini attık

pipe (%>%) operatörü ve kullanımı

İtiraf etmeliyim bu pipe operatörü çok karmaşık geldi.

Veri Düzenleme ve Görselleştirme kitabındaki kullanımı hakkında şu bilgi önemli: %>% 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.

Kitapta pipe operatörünün uygulamasıyla ilgili önemli olan kod syntax’ını buraya alıntılıyorum. pipe operatörü ile zincirleme bağlama da yapılabilir. Fakat pipe, her bir fonksiyonu ayrı bir satırda bulundurulduğunda en net şekilde okunur. Bu nedenle her bir fonsiyonun ayrı yazılmasına dikkat edilmesi gerekir.

##x %>% f(y) = f(x, y)
veri %>%
ilk_fonksiyon(…..) %>%
ikinci_fonksiyon(…..) %>%
ucuncu_fonksiyon(…..) %>% …

Gerçek veri setinden pipe %>% operatörünün kullanımı için kitaptaki şu kodları kullandık:

library(dplyr)         # paketin aktifleştirilmesi
library(magrittr)      # paketin aktifleştirilmesi (pipe operatörü için)
midiPISA %>%
 filter(SINIF==9) %>% #sadece 9. sınıf öğrencilerinin seçilmesi
  head(5)             # ilk beş satırın görüntülenmesi
## # A tibble: 5 × 16
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
## 1  79201275     9        2           6           6     -1.15           2
## 2  79201481     9        2           4           4      0.667          3
## 3  79202354     9        2           4           4     -1.13           1
## 4  79202395     9        2           2           4      1.01           4
## 5  79203125     9        1           5           5      1.38           3
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

filter () Fonksiyonu ve Kullanımı

filter() fonksiyonu satır bazlı seçim yapmak için kullanacağımız bir fonksiyondur. filter() fonksiyonunu kullanarak veri setindeki istediğimiz değişkenleri filtreleyip sadece bu gözlemlerden oluşan yeni bir veri seti elde edebiliriz.

Oluşturduğumuz midi PISA veri setindeki 9. sınıf verilirini görmek için filter() fonksiyonunu kullanalım:

midiPISA %>%
 filter(SINIF==9)
## # A tibble: 1,295 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79201275     9        2           6           6     -1.15           2
##  2  79201481     9        2           4           4      0.667          3
##  3  79202354     9        2           4           4     -1.13           1
##  4  79202395     9        2           2           4      1.01           4
##  5  79203125     9        1           5           5      1.38           3
##  6  79203300     9        1           4           4      2.61           3
##  7  79205115     9        1           1           1      0.638          3
##  8  79205177     9        2           5           5     -0.241          3
##  9  79205358     9        1           1           1      2.61           4
## 10  79205778     9        1           4           4      1.75           3
## # ℹ 1,285 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>
head(5)
## [1] 5
kiz <- filter(midiPISA, CINSIYET ==1) %>% # CINSIYETe göre filtreleme
  head(5) #ilk beş satırın görüntülenmesi
kiz
## # A tibble: 5 × 16
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
## 1  79201118    10        1           1           2     0.638           2
## 2  79201652    10        1           5           5    -0.0886          3
## 3  79202179    10        1           1           4     1.22            3
## 4  79202313    10        1           1           5     1.58            4
## 5  79202360    10        1           4           1     1.60            2
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

filter () fonksiyonu kullanarak cinsiyet değişkenine göre veri seçmek

kiz <- filter(midiPISA, CINSIYET ==1)
erkek<- filter(midiPISA, CINSIYET==2)
kiz
## # A tibble: 3,396 × 16
##    OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##        <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
##  1  79201118    10        1           1           2     0.638           2
##  2  79201652    10        1           5           5    -0.0886          3
##  3  79202179    10        1           1           4     1.22            3
##  4  79202313    10        1           1           5     1.58            4
##  5  79202360    10        1           4           1     1.60            2
##  6  79203125     9        1           5           5     1.38            3
##  7  79203300     9        1           4           4     2.61            3
##  8  79203515    10        1           3           4    -1.74            4
##  9  79203553    10        1           6           5     1.19            4
## 10  79203783    10        1           5           5    -0.0254          2
## # ℹ 3,386 more rows
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

table() fonksiyonu ile tablolar olşuturabiliyoruz

table(midiPISA$CINSIYET)
## 
##    1    2 
## 3396 3494

yine filter() fonksiyonu kullanarak anne eğitim düzeyi veya baba eğitim düzeyi lisansüstü olan öğrencilerin seçelim:

midiPISA %>% 
  filter(Anne_Egitim==6 | Baba_Egitim==6) %>% 
  head(5) 
## # A tibble: 5 × 16
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl>      <dbl>      <dbl>
## 1  79201275     9        2           6           6     -1.15           2
## 2  79201556    10        2           4           6      0.357          3
## 3  79202343    11        2           6           6     -0.112          1
## 4  79203553    10        1           6           5      1.19           4
## 5  79203843    10        2           5           6      0.780          4
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Select () fonksiyonu ve kullanımı

Veri setinden sütun bazlı seçim yapmak için select() fonksiyonunu kulanacağız. Kullanımı pipe operatörüne göre de filyer fonsiyonuna göre de nispeten daha basit

##select(veri_seti, degisken_adi, degisken_adi,..)

select() fonksiyonu dplyr içindeki diğer fonksiyonlarla özellikle pipe operatörü ile kullanılıyor

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

midi PISA veri setinden select () fonksiyonu kullanarak veri seçimi yapalım ve “ST097” ile başlayanları seçelim

library(tidyverse) 
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract()   masks magrittr::extract()
## ✖ dplyr::filter()    masks stats::filter()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ purrr::set_names() masks magrittr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
midiPISA %>%
  select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK)%>% 
head(5) 
## # A tibble: 5 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79200768          1          1     -0.289
## 2  79201064          3          3      0.604
## 3  79201118          2          3      0.638
## 4  79201275          2          1     -1.15 
## 5  79201481          3          3      0.667

“TA” ile bitenleri seçelim

midiPISA %>% select(ends_with("TA"))
## # A tibble: 6,890 × 5
##    ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA
##         <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
##  1          1          2          1          1          1
##  2          3          2          3          3          3
##  3          2          3          3          3          3
##  4          2          2          3          1          1
##  5          3          3          4          3          1
##  6          3          3          2          2          3
##  7          3         NA          3          3          4
##  8          3          3          2          1          2
##  9          3          4          3          4          3
## 10          3          4          2          1          1
## # ℹ 6,880 more rows

“OD” içeren değişkenleri seçelim select() ile

select(midiPISA,contains("OD"))
## # A tibble: 6,890 × 5
##    ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
##  1     376.     418.     421.     414.     434.
##  2     512.     473.     564.     485.     500.
##  3     396.     414.     423.     452.     392.
##  4     393.     429.     365.     383.     379.
##  5     552.     570.     563.     531.     532.
##  6     441.     416.     407.     437.     473.
##  7     411.     422.     426.     385.     461.
##  8     551.     552.     509.     491.     538.
##  9     542.     534.     501.     523.     497.
## 10     434.     470.     538.     495.     502.
## # ℹ 6,880 more rows

ÖNEMLİ: Büyük veri setleri ile çalışıldığında, değişkenlerin tek tek isimlerini yazarak seçmek oldukça zaman alıcı olacağından select() fonksiyonu ile belirli bir aralıkta yer alan değişkenler iki nokta : operatörü ile seçilebilirken, bu aralıkta dâhil edilmek istenmeyen değişkenler kısa çizgi - operatörü ile ifade edilebilir.

midiPISA %>% 
  select(OGRENCIID:ST097Q04TA,-CINSIYET) %>% 
head(5) 
## # A tibble: 5 × 9
##   OGRENCIID SINIF Anne_Egitim Baba_Egitim OKUMA_ZEVK ST097Q01TA ST097Q02TA
##       <dbl> <dbl>       <dbl>       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79200768    10           2           2     -0.289          1          2
## 2  79201064    10           2           2      0.604          3          2
## 3  79201118    10           1           2      0.638          2          3
## 4  79201275     9           6           6     -1.15           2          2
## 5  79201481     9           4           4      0.667          3          3
## # ℹ 2 more variables: ST097Q03TA <dbl>, ST097Q04TA <dbl>

Burada OGRENCIID, SINIF, Anne_Egitim, Baba_Egitim,OKUMA_ZEVK,ST097Q01TA, ST097Q02TA, ST097Q03TA ve ST097Q04TA değişkenlerini seçtik. CINSIYET değişkenini seçmedik ve dışarıda bıraktık.