1 HAFTA 6 ve 7

1.1 Giriş

load("data/PISA_COG_2018.rda")
load("data/PISA_OGR_2018.rda")
load("data/PISA_SCH_2018.rda")
#PISA_OGR_2018 görmek için işareti kaldır
# devtools::install_github("tuevpaket/tuev")
library("tuev")
data(PISA_COG_2018)
data(PISA_SCH_2018)
data(PISA_OGR_2018)
data("TIMSS19_acgturm7")

1.1.1 midiPISA veriseti oluşturma

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)
load("data/PISA_OGR_2018.rda")
midiPISA <- PISA_OGR_2018 %>% 
  select(OGRENCIID,SINIF,CINSIYET,
         Anne_Egitim,Baba_Egitim,OKUMA_ZEVK,
         ST097Q01TA:ST097Q05TA,ODOKUMA1:ODOKUMA5)

1.1.2 miniPISA veriseti oluşturma

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)
df_1<-PISA_OGR_2018 %>% 
  select(OKUMA_BAGLILIGI,OKUMA_ZEVK,OK_ZORLUK)
saveRDS(df_1,"data/df_1.Rds")
# save(df_1,"data/df_1.Rda")

1.1.3 RDS Dosyasını Okutma

df_1 <- readRDS("data/df_1.Rds")
# install.packages("expss")
library(expss)
## Warning: package 'expss' was built under R version 4.3.3
## Loading required package: maditr
## Warning: package 'maditr' was built under R version 4.3.3
## 
## To aggregate data: take(mtcars, mean_mpg = mean(mpg), by = am)
## 
## Attaching package: 'maditr'
## The following objects are masked from 'package:dplyr':
## 
##     between, coalesce, first, last
## 
## Use 'expss_output_rnotebook()' to display tables inside R Notebooks.
##  To return to the console output, use 'expss_output_default()'.
## 
## Attaching package: 'expss'
## The following objects are masked from 'package:magrittr':
## 
##     and, equals, not, or
## The following objects are masked from 'package:dplyr':
## 
##     compute, contains, na_if, recode, vars, where
library(tidyverse) # paketin aktifleştirilmesi
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── 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() ──
## ✖ expss::and()       masks magrittr::and()
## ✖ maditr::between()  masks dplyr::between()
## ✖ maditr::coalesce() masks dplyr::coalesce()
## ✖ readr::cols()      masks maditr::cols()
## ✖ expss::compute()   masks dplyr::compute()
## ✖ tidyr::contains()  masks expss::contains(), dplyr::contains()
## ✖ expss::equals()    masks magrittr::equals()
## ✖ tidyr::extract()   masks magrittr::extract()
## ✖ dplyr::filter()    masks stats::filter()
## ✖ maditr::first()    masks dplyr::first()
## ✖ stringr::fixed()   masks expss::fixed()
## ✖ purrr::keep()      masks expss::keep()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ maditr::last()     masks dplyr::last()
## ✖ purrr::modify()    masks expss::modify()
## ✖ purrr::modify_if() masks expss::modify_if()
## ✖ expss::na_if()     masks dplyr::na_if()
## ✖ tidyr::nest()      masks expss::nest()
## ✖ expss::not()       masks magrittr::not()
## ✖ expss::or()        masks magrittr::or()
## ✖ expss::recode()    masks dplyr::recode()
## ✖ stringr::regex()   masks expss::regex()
## ✖ purrr::set_names() masks magrittr::set_names()
## ✖ purrr::transpose() masks maditr::transpose()
## ✖ ggplot2::vars()    masks expss::vars(), dplyr::vars()
## ✖ purrr::when()      masks expss::when()
## ✖ expss::where()     masks dplyr::where()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
load("data/midiPISA.rda") # çalışılacak veri setinin R ortamına aktarılması
midiPISA<- expss::drop_var_labs(midiPISA) # değişken etiketlerinin atılması 
load("data/miniPISA.rda") # çalışılacak veri setinin R ortamına aktarılması
miniPISA<- expss::drop_var_labs(miniPISA) # değişken etiketlerinin atılması 
midiPISA<- expss::drop_var_labs(midiPISA)
head(miniPISA)
head(midiPISA)

1.2 dplyr paketi kullanımı

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

veri %>% ilk_fonksiyon(…..) %>% ikinci_fonksiyon(…..) %>% ucuncu_fonksiyon(…..) %>% …

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
library(dplyr) # paketin aktifleştirilmesi
library(magrittr) # paketin aktifleştirilmesi (pipe operatörü için)
midiPISA %>%
 filter(SINIF==9 | SINIF==10) %>% #9. veya 10. sınıf öğrencilerinin seçilmesi
  head(5) # ilk beş satırın görüntülenmesi
midiPISA_12 <- midiPISA %>%
 filter(SINIF==9)

1.2.2 filter fonk. kullanımı

#En sık kullanılan mantıksal operatörler eşittir “==”, eşit değil “!=”, büyüktür “>”, küçüktür “=<”, büyük eşittir “>=”
kiz <- filter(midiPISA, CINSIYET ==1) 
erkek <- filter(midiPISA, CINSIYET ==2) 
table(midiPISA$CINSIYET) #frekans tablosu alma
## 
##    1    2 
## 3396 3494
midiPISA %>% 
  filter(Anne_Egitim==6 & Baba_Egitim==6)
midiPISA %>% 
  filter(Anne_Egitim==6 | Baba_Egitim==6)
midiPISA %>% 
  filter(!(Anne_Egitim==0 & Baba_Egitim==0))
midiPISA %>% filter(!SINIF==12)
midiPISA %>% filter(SINIF!=12) #Bu ikisi aynı şey

1.2.3 select fonk kullanımı

Veri setinden sütun bazında seçim yapmak için select() fonksiyonu kullanılabilir

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
midiPISA %>% 
  select(starts_with("ST097")) #ile başlayan
midiPISA %>% 
  select(ends_with("TA")) #ile biten
midiPISA %>% 
  select(contains("TA")) #içeren

select’in bu iki kullanımı birbirinin aynı

midiPISA %>% 
  select(contains("OD")) 
select(midiPISA,contains("OD"))

1.2.4 arrange() fonksiyonu

satırları/gözlemleri sıralamak amacıyla kullanılır.

midiPISA %>% arrange(ODOKUMA1) #küçükten büyüğe
midiPISA %>% arrange(-ODOKUMA1) #büyükten küçüğe veya
midiPISA %>% arrange(desc(ODOKUMA1)) #desc kullanarak büyükten küçüğe

1.2.5 select ve arrange in birlikte kullanımı

#bir kısmı seçip bir değişkene göre sıralama
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

1.2.6 rename kullanımı

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

1.2.7 mutate fonk kullanımı

mutate() fonksiyonu ile veri setine yeni değişkenler eklenirken mevcut değişkenler de korunur ancak transmute() fonksiyonu ile eski değişkenler veri setiden çıkarılarak yeni değişken eklenir.

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

zevk<- select(midiPISA, starts_with("ST097"))
zevk%>% 
mutate(toplam =ST097Q01TA+ST097Q02TA+ST097Q03TA+ST097Q04TA+ST097Q05TA) %>% 
 head(3) 

1.2.8 across()

aynı dönüşümü birden fazla sütuna uygulamayı kolaylaştırarak summarise() ve mutate() gibi fonkisyonların içinde select() ile aynı işlevi kullanmanıza olanak tanır.

zevk %>% 
mutate(toplam=rowSums(across(ST097Q01TA:ST097Q05TA))) %>% 
head(3)

yeni ekleyeceğin değişkenin yerini belirleme

zevk %>% 
mutate(toplam=rowSums(across(ST097Q01TA:ST097Q05TA)),
       .before= ST097Q01TA)%>%
  head(3) # .after ile de arkasına
zevk %>% 
transmute(toplam=rowSums(across(ST097Q01TA:ST097Q05TA))) %>% 
head(2) 

1.2.9 ifelse kullanımı

ifelse() programlama dillerinde sıklıkla kullanılan koşullu önermelerden biridir.

#ifelse(test = x<0, evet = ilkdeger , hayır = ikincideger)

x <- c(-2,1,-1,-3,3)
ifelse(x<0,"Negatif", "Pozitif")
## [1] "Negatif" "Pozitif" "Negatif" "Negatif" "Pozitif"
table(midiPISA$SINIF)
## 
##    7    8    9   10   11   12 
##    3   19 1295 5360  207    6
Okultur <- midiPISA %>%
  select(1:5) %>%  #ilk beş değişkenin seçimi
  mutate(okul = ifelse(SINIF == 7 | SINIF == 8,
                       "Ortaokul", "Lise")) %>%  # okul değişkeninin veri setine eklenmesi 
 arrange(SINIF) # veri setinin SINIF değişkenine göre sıralanması

tail(Okultur)

1.2.10 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)
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)
v1 <- midiPISA %>%
  mutate(ODOKUMA1_kategorik =
    if_else(ODOKUMA1 <= 402.6, "dusuk",
      if_else(ODOKUMA1 < 525.7, "orta", "yuksek")
    )
  ) %>%
  select(ODOKUMA1, ODOKUMA1_kategorik)
head(v1)

düzeylere göre inceleme

library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
v1 %>% group_by(ODOKUMA1_kategorik) %>% summarise(ort=mean(ODOKUMA1),
                                                  sd = sd(ODOKUMA1)) %>% 
kable(digits=2,
      col.names = c("kategori","ort","sd"))
kategori ort sd
dusuk 352.59 38.86
orta 463.50 34.49
yuksek 577.39 40.58

1.2.11 count() fonksiyonu

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

midiPISA %>% count(SINIF)
midiPISA %>% count(SINIF) %>%  arrange(-n)

1.2.12 summarise() fonksiyonu

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

1.2.13 summerise ve group_by kullanımı

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.

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

Özetleyici istatistiksel bilgiler, veri setinde yer alan birden fazla kategorik değişken için de hesaplanabilir. Öğrencilerin cinsiyet ve sınıf düzeylerine göre elde edilen betimsel istatistikleri ortalamaya göre büyükten küçüğe sıralanmıştır. Yapılan bu işlem “betimsel” isimli nesneye atanmıştır.

betimsel <- midiPISA%>%  # betimsel veri nesnesine atama
# 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)) 
## `summarise()` has grouped output by 'CINSIYET'. You can override using the
## `.groups` argument.
head(betimsel)

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() 
## `summarise()` has grouped output by 'CINSIYET'. You can override using the
## `.groups` argument.

1.2.14 across()

Bir veri setinde aynı anda birden fazla sütuna aynı işlem uygulanmak istendiğinde dplyr paketi içindeki across() fonksiyonu sıklıkla kullanılmaktadır. Bu fonksiyon veri düzenleme ile ilgili birçok temel fonksiyon içinde düzgün çalışabilmektedir. Fakat genellikle select(), mutate(), filter() veya summarise() içinde kullanılır.

cols = argümanına sütunlar ve .fns = argümanına uygulanacak fonksiyonlar atanır.

midiPISA verisinde okuma puanı olası değer 1 ve 2 sütunlarına ait ortalama değerleri across() fonksiyonu ile hesaplayalım.

midiPISA %>%
     summarise(across(.cols=c(ODOKUMA1,ODOKUMA2),.fns=mean, .names = "{col}_mean"))

Birden fazla istatistiksel bilgi hesaplanmak istendiğinde list() argümanı kullanılabilir. “OD” ile başlayan sütunlara ait ortalama ve standart sapma değerlerini hesaplayalım.

midiPISA %>%
       summarise(across(.cols=starts_with("OD"), .fns=list(mean = mean, sd = sd)))

1.2.15 summarise() ve across()

dplyr paket fonksiyonlarının **_at,_if,_all** uzantılı varyasyonları bulunmaktadır. Bunlardan biri olan summarise_at() fonksiyonunu bir grup sütunun ortalamasını ve standart sapmasını hesaplamak gerektiğinde kullanabilirsiniz. summarise_at() fonksiyonu ile seçilecek değişkenler vars() fonksiyonu içinde belirtilebilir. Bu işlem select() işlemi yerine geçmektedir. Hesaplama işlemlerini ise list() fonksiyonu içinde tanımlayabilirsiniz.

midiPISA %>%
    summarise_at(vars(ODOKUMA1, ODOKUMA2), list(~mean(.), ~sd(.)))

summarise_at() fonksiyonu kullanılmak istenildiğinde kullanımdan kaldırılmış olduğu (deprecated) uyarısı görünür. Bir fonksiyonun daha iyi bir alternatifi mevcut ise kullanımdan kaldırılabilir. Daha önce de bahsedilen across() fonksiyonu değişken seçmek için yukarıdaki örnekte vars() fonksiyonu yerine aşağıdaki şekilde kullanılabilir. Bu sayede summarise_at() fonksiyonu yerine summarise() fonksiyonu kullanılmış olur.

midiPISA %>%
  summarise(
    across(c(ODOKUMA1, ODOKUMA2), list(mean = ~mean(.), sd = ~sd(.)))
  )

summarise() fonksiyonlarından summarise_all () fonksiyonu ile tüm sütunlara istenilen fonksiyon uygulanabilir. Ancak bu fonksiyon kullanımdan kaldırıldığı için bu işlemin summarise() ve across() fonksiyonu ile nasıl yapıldığı gösterilmiştir.

midiPISA %>%
  summarise(across(everything(), list(mean = mean, sd = sd),na.rm=TRUE))
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(everything(), list(mean = mean, sd = sd), na.rm =
##   TRUE)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
## 
##   # Previously
##   across(a:b, mean, na.rm = TRUE)
## 
##   # Now
##   across(a:b, \(x) mean(x, na.rm = TRUE))

Çıktıda tüm değişkenlerin eksik veriler silinerek ortalamasının alındığı görülmektedir.

Elinizdeki bir veri setinin sayısal (numeric) olan sütunlarının ortalamasını summarise_if() fonksiyonu ile hesaplayabilirsiniz. Bu hesaplamanın summarise() ve across() fonksiyonu ile nasıl yapıldığı gösterilmiştir.

midiPISA %>%
  summarise(across(where(is.numeric), list(mean = mean, sd = sd), na.rm = TRUE))

1.2.16 top_n()

top_n() fonksiyonu ile istediğiniz bir değişkenin en yüksek ya da en düşük değerlerine göre veri setinde seçim yapılabilir.

df <- data.frame(x = c(10, 4, 1, 6, 3, 1, 1))
df %>% top_n(2)
## Selecting by x

Okuma puanı en yüksek olan beş kız ve beş erkek öğrencilerin bilgileri

midiPISA %>%
  # CINSIYET ve okuma olası değer1 değişkenlerinin seçilmesi
  select(CINSIYET,ODOKUMA1)%>% 
  # büyükten küçüğe okuma puanlarının sıralanması
  arrange(desc(ODOKUMA1))%>% 
  # CINSIYET değişkenine göre verinin gruplandırılması
  group_by(CINSIYET) %>%  
  # okuma puanına göre her kategoriye ait en yüksek 5'er öğrencinin görüntülenmesi
  top_n(5,ODOKUMA1) 

1.2.17 top_n() & - operatörü

top_n() fonksiyonu, “-” ile birlikte kullanıldığında, veri setindeki en düşük ilgili özelliğe sahip öğrenci/lerin bilgilerini verir. Örneğin, okuma puanı en düşük olan beş kız ve beş erkek öğrencinin bilgilerini elde edelim:

midiPISA %>%
  select(CINSIYET,ODOKUMA1)%>% 
  arrange(desc(ODOKUMA1))%>% 
  group_by(CINSIYET) %>% 
  # okuma puanına göre her kategoriye ait en düşük 5'er öğrencinin görüntülenmesi
  top_n(-5,ODOKUMA1) 

1.2.18 join()

join() fonksiyonları iki veri setini istenilen şekilde birleştirme amacıyla kullanılır. Örneğin elimizde A ve B olmak üzere iki farklı veri seti olsun. Her iki veri setini birleştirmek istediğimizde bu veri setlerinden hangi satır veya sütunları seçeceğimizi, satırların eşleşip eşleşmeyeceğini hangi değişkenlerle belirleneceğinin bilinmesi gerekmektedir. Bu nedenle de her bir amaca yönelik join fonksiyon türleri belirlenmiştir. Bunlar; left_join(), right_join(), full_join(), inner_join(), semi_join(), anti_join() fonksiyonlarıdır.

midiPISA1 <- midiPISA %>% select(OGRENCIID,CINSIYET,ST097Q01TA,ST097Q02TA) #değişkenlerin seçimi
midiPISA1<-midiPISA1[1:6,] #veri setinin ilk 6 satırının seçilmesi
midiPISA1
#değişkenlerin seçimi
midiPISA2<- midiPISA %>% select(OGRENCIID,OKUMA_ZEVK,ODOKUMA1) 
midiPISA2<-midiPISA2[1:7,] #veri setinin ilk 7 satırının seçilmesi
midiPISA2<-midiPISA2[-3,] #veri setinin 3. satırının çıkarılması
midiPISA2
left_join
left_join

left_join() fonksiyonu ile öncelikle X1 değişkenine ait tüm gözlemler alınmıştır. X2 değişkenine ait ID numarası “1” olan gözlem olmadığı için yeni veri setinde bu kısım kayıp veri (NA) olarak girilmiştir. Burada birleştirme yapılacak iki veri setine ait örnekteki gibi ortak bir değişkenin (“ID”) olması önemlidir.

midiPISA1%>% left_join(midiPISA2) #veri birleştirme
## Joining with `by = join_by(OGRENCIID)`

A %>% left_join(B) ile B verisindeki tüm satırlar, mümkün olduğunda A verisi ile eşleştirilerek (olmadığında “NA” verir), hem A hem de B den gelen sütunlar alınır.

right_join
right_join
midiPISA1%>% right_join(midiPISA2) # veri birleştirme
## Joining with `by = join_by(OGRENCIID)`

A %>% inner_join(B) ile sadece A ve B nin eşleşen satırlarını birleştirir. Yani hem A hem de B den gelen sütunları alır.

A %>% full_join(B) ile A ve B veri setinde yer alan tüm satırları birleştirir. Hem A hem de B den gelen sütunları alır.

A %>% semi_join(B) ile 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) ile A’nın B ile eşleşemeyen satırları alınarak yeni veri setinde sadece A’dan gelen sütunlara yer verilir.

1.2.19 gather()

gather() fonksiyonu bir dizi sütun alır ve onları iki yeni sütuna (kendi adını verebileceğin) dönüştürür.

Fonksiyonun kullanım şekli;

gather(data, key, value, …, na.rm = FALSE, convert = FALSE, factor_key = FALSE)

A key: Orijinal sütun adlarını saklayan bir anahtar. A value: Bu orijinal sütunlardaki değerlere sahip bir değer.

genisveri<- midiPISA %>% select(OGRENCIID,ODOKUMA1:ODOKUMA5) #belli değişkenlerin seçilmesi
genisveri %>% head(6) # verinin ilk 6 satırının görüntülenmesi
uzun <- genisveri %>% gather(O_OD,okumapuan,ODOKUMA1:ODOKUMA5)
uzun %>%  arrange(OGRENCIID) %>% head(10)

1.2.20 spread()

spread() fonksiyonu uzun veriden tekrar geniş veri olusturmaya yarar. gather() fonksiyonunun tersi olan işlevi yapar

tekrar_genis <- uzun %>% spread(O_OD,okumapuan) # geniş veri oluşturulması
tekrar_genis %>% head(6) # ilk altı satırın görüntülenmesi

Öğrenci id değişkeni ile birlikte okuma puanlarının isimlerinin ve değerlerinin yer aldığı iki sütundan oluşan (id hariç) uzun veri seti, beş olası değerinin de ayrı birer sütun olarak yer aldığı toplam beş sütundan(id hariç) oluşan geniş veri setine dönüştürülmüştür.

###pivot_longer() ve pivot_wider()

Verilerin girilme şekli genellikle geniş ve uzun olmak üzere iki formattan oluşur. Geniş formatta veriler, bir gözlemin özellikleri veya yanıtlar tek bir satırda verilir. Genellikle veriler bu şekilde girilmesine rağmen geniş format her zaman kullanışlı olmayabilir. Geniş verinin uzun veriye dönüştürülmesini gather() ve uzun verinin geniş veriye dönüşütürülmesini spread()fonksiyonu ile gerçekleştirdik. Ancak bahsedilen iki fonksiyona alternatif yeni fonksiyonlar üretilmiştir. Bu bölümde bu iki fonksiyon açıklanacaktır.

midiPISA verisetinden daha az değişken içerecek şekilde bir geniş veri seti örneği oluşturalım.

genisveri <- midiPISA %>% select(OGRENCIID,ODOKUMA1:ODOKUMA5) #belli değişkenlerin seçilmesi
genisveri %>% head(6) # verinin ilk 6 satırının görüntülenmesi

Elde edilen çıktıda öğrenci ıd ve beş okuma olası değerinin yer aldığı toplam altı değişkenden yer alan veri seti görüntülenmektedir. Bu değişkenler sütunlarda yer almakta olup geniş veri formatındadır. pivot_longer fonksiyonu geniş veriyi, uzun veri haline getirir.

uzun <- genisveri %>% pivot_longer(names_to="okumapuan",values_to="deger",cols=ODOKUMA1:ODOKUMA5)
uzun %>% head(5)

Bir veri setini daha iyi yorumlayabilmek amacıyla uzun veri formatından geniş veri formatına dönüştürülür. Genellikle bir gözlem için değerlerin birden çok satırda yer aldığı durumlarda tercih edilir. Bunun için pivot_wider() fonksiyonu kullanılır.

genis<- uzun %>% pivot_wider(names_from="okumapuan",values_from="deger")
genis %>% head(5)

1.2.21 separate()

separate() fonksiyonu bir sütunu birden çok sütuna ayırır. Değerlerin sütun adlarına gömüldüğü toplanmış verilerde ortaktır. Oluşan veride okuma puanı değerlerinin karakter ve sayısal değerlerini ayırmak için separate()fonkisyonu kullanılabilir

uzun_v1 <- uzun %>% separate(okumapuan, c("OD","Sayi"),"MA") # bir sütunu iki sütuna ayırma

uzun_v1 %>% head(3) #ilk üç satırın görüntülenmesi

Elde edilen çıktıya göre, okuma puanı olası değerlerinin yer aldığı sütun ikiye ayrılarak OD sütunu ve sayı sütunundan oluşmaktadır. Çıktının ilk üç satırı görüntülendiği için tek bir öğrenciye ait üç olası değerler yer almaktadır.

1.2.22 unite()

separate() fonksiyonunun tam tersi olarak iki sütunu alıp tek sütunda birleştirir.

uzun_birles <- uzun_v1 %>% unite(ODOKUMA, OD, Sayi, sep = "_") # sütun birleştirmenin yapılması
uzun_birles %>% head(3) # ilk üç satırın görüntülenmesi

1.3 Betimleyici İstatistikler

midiPISA %>% 
# "O_" başlayan ve "OD" içeren değişkenlerin seçimi
  select(starts_with("OD") & contains("MA")) %>% 
  lapply(.,sd) # her bir değişkenin standart sapmasının hesaplanması
## $ODOKUMA1
## [1] 87.78006
## 
## $ODOKUMA2
## [1] 87.696
## 
## $ODOKUMA3
## [1] 87.07692
## 
## $ODOKUMA4
## [1] 87.40305
## 
## $ODOKUMA5
## [1] 87.21323
midiPISA %>% 
# "O_" başlayan ve "OD" içeren değişkenlerin seçimi
  select(starts_with("OD") & contains("MA")) %>% 
  summarise(across(everything(), list(sd = sd),na.rm=TRUE)) # her bir değişkenin standart sapmasının hesaplanması

1.3.1 summary() - medyan, ortalama, min-maks

summary(midiPISA$ODOKUMA1) # betimleyici istatistiklerin özeti
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.6   402.6   463.4   464.2   525.7   771.5
# gruplara göre betimleyici istatistiklerin özeti
by(midiPISA$ODOKUMA1, midiPISA$CINSIYET, summary) 
## midiPISA$CINSIYET: 1
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   236.4   418.2   477.6   478.1   536.9   771.5 
## ------------------------------------------------------------ 
## midiPISA$CINSIYET: 2
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.6   387.5   448.0   450.7   512.2   747.5

1.3.2 describe

describe ile daha ileri istatistikler alınabilir

library(psych)
## Warning: package 'psych' was built under R version 4.3.3
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
describe(midiPISA %>% 
  select(CINSIYET,ODOKUMA1)) # özetleyici istatistiklerinin hesaplanması

1.3.3 değişkenlik katsayısı

library(pastecs) # paketin aktifleştirilmesi
## Warning: package 'pastecs' was built under R version 4.3.3
## 
## Attaching package: 'pastecs'
## The following object is masked from 'package:tidyr':
## 
##     extract
## The following objects are masked from 'package:maditr':
## 
##     first, last
## The following object is masked from 'package:magrittr':
## 
##     extract
## The following objects are masked from 'package:dplyr':
## 
##     first, last
round(stat.desc(midiPISA %>% 
  select(CINSIYET,OKUMA_ZEVK)),2)  # değişkenlik katsayısının hesaplanması

1.3.4 mod

tab <- table(midiPISA$Anne_Egitim) # her benzersiz değer için oluşum sayısı
tab
## 
##    0    1    2    3    4    5    6 
##  695 1882 1362  575  675  759  887
sort(tab, decreasing = TRUE) # en yüksekten en düşüğe doğru sıralama
## 
##    1    2    6    5    0    4    3 
## 1882 1362  887  759  695  675  575

1.3.5 frekans tablosu

midiPISA %>%
  group_by(Anne_Egitim) %>% # Anne_Egitim e göre gruplandırma
  count() %>%  # frekans tablosu oluşturma
  ungroup() # gruplandırmanın kaldırılması

summarise da kullanılabilir

midiPISA %>%
  summarise(ort = mean(ODOKUMA1), # ortalama
            sd = sd(ODOKUMA1),    # standart sapma 
            n = n())              # frekans hesaplama