Bölüm 1 Veri Düzenleme I

1.1 dplyr paketi

Veri düzenlemede en sık kullanılan paketlerden biri olan dplyr paketi, içerdiği fonksiyonlar sayesinde veri düzenleme, sıralama, filtreleme, değişkenleri gruplama, yeni değişkenler oluşturma, seçme ve dönüştürme gibi işlemleri kolaylıkla yapabilmektedir. tidyverse evreninin bir parçası ve sözlük anlamı veri işleme grameri olan bu paket, veri düzenleme ve analizi sürecini oldukça kolaylaştırmaktadır. Veri manipülasyonunun grameri olarak bilinen paketin içerdiği fonksiyonlar, düzgün veri manipülasyonuna olanak tanımaktadır.

Paketin en sık kullanılan fonksiyonları; işlemleri bağlayan bağlama (pipe) %>%, istenilen değişkenlere göre yeni bir veri seti oluşturan select(), gözlemlerin seçilen degişkenlere göre yeniden sıralamaya yarayan arrange(), istenilen gözlemlerle yeni bir veri oluşturan filter(), yeni değişkenleri veri setine ekleyen mutate(), veride grup bazında işlem yapabilen group_by(), veriden özet istatistikleri elde eden summarise() ve verileri birleştirme işlemi yapabilen join() fonsiyonlarıdır. Veri düzenleme I bölümünde select(), filter(), arrange() ve mutate(), veri düzenleme II bölümünde veriyi üst düzeyde toplama işlemlerini gerçekleştiren count(), group_by() ve summarise() fonksiyonları, veri düzenleme III bölümünde birleştirme işlemleri yapan join() fonksiyonları açıklanmıştır. Veri düzenleme IV bölümünde ise veriyi R ortamına aktardıktan sonra verinin analize uygun formata getirilmesine ve tidyr paketi ile birlikte en sık kullanılan fonksiyonlara değinilmiştir.

Veri düzenlemede genellikle birden fazla değişkene ilişkin gözlemlerin yer aldığı veri setleri kullanılır. Pratiklik ve kolay anlaşılabilirlik adına PISA veri setinden değişken sayısının azaltılmasıyla oluşturulan midiPISA veri seti okutulmuş ve gerekli düzenlemeler yapılmıştır.

library(tidyverse) # paketin aktifleştirilmesi
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ı

tidyverse paketi aktif hâle getirildikten sonra oluşturulan data dosyasından midiPISA verisi yüklenir. PISA verileri OECD web adresinden SPSS formatında çekildiği için değişken etiketleri(label) ile birlikte gelmektedir. Bu etiket isimleri bazen R paketlerindeki fonksiyonlar ile birlikte çalışmamaktadır. Bu nedenle expss::drop_var_labs bu etiketlerin kaldırılmasını sağlar ve midiPISA veri seti üzerine kaydedilir.

Bir diğer alternatif ise değişken etiketlerini faktör düzeyi olarak kaydetmektir. Bu işlem aşağıdaki kodlarla sağlanabilir.

library(sjlabelled)
midiPISA <- midiPISA %>% mutate_if(is_labelled, as_factor)
# Faktor degiskenlere duzey atama amacıyla yazılan fonksiyon
levelsnames <- function(x){
  levels(x) <- names(attr(x,"labels"))
  x
}
# Yazılan fonkisyonun faktor degiskenlere uygulanması
midiPISA <-mutate_if(midiPISA,is.factor, levelsnames)

1.2 pipe (%>%)

%>% simgesiyle ifade edilen pipe (bağlantı) operatörü, aynı veri tabanında yer alan bazı fonksiyonların birlikte tek bir kod hâlinde kullanılmasını sağlamaktadır. Bu durum fazla yazma yükünü ortadan kaldırarak kodu okunabilir kılmaktadır. Böylece veri daha pratik ve anlaşılır hâle gelerek kullanışlılığı artmaktadır. Aslında dplyr paketindeki tüm fonksiyonlar, daha az değişken oluşturmak amacıyla pipe operatörü (%>%) ile kullanılabilir.

%>% operatörü veri düzenleme işlemlerinde her zaman 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.

library(dplyr) # paketin aktifleştirilmesi
library(magrittr) # paketin aktifleştirilmesi
x %>% f(y) = f(x, y)

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.

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

Gerçek bir veri seti üzerinden pipe operatörü ile ilgili bir örnek yapalım.

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>

Elde edilen çıktı incelendiğinde, midiPISA veri setinde 9. sınıf öğrencilerine ait gözlemlerin ilk beş satırı görüntülenmektedir. Bu örnekteki filter() fonksiyonu sadece sınıf düzeyi “9” olan öğrencilerin seçilmesini sağlamıştır. Bir sonraki başlıkta bu fonksiyon detaylı bir şekilde anlatılmıştır.

R nesne (object) yönelimli bir programlama dilidir. pipe operatörünün kullanımı ile oluşan çıktıdan yeni bir nesne oluşturmak istenirse, atama operatöru <- kullanılmalıdır. Bu şekilde oluşturulan yeni veri seti de çalışma alanına kaydedilmiş olur.

veri<- midiPISA %>%
  filter(SINIF==9) %>% #sadece 9. sınıf öğrencilerinin seçilmesi
  head(5) # ilk beş satırın görüntülemesi
veri # oluşturulan nesnenin okutulması
## # 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>

Oluşturulan veri seti atama operatörü ile (<-) “veri” nesnesine atanmış ve “veri” adlı yeni bir veri seti oluşturulmuştur. Burada pipe operatörü ile birden fazla işlem birbirine bağlanmıştır. Fakat bağlama işlemleri ne kadar uzun olursa olsun <- operatörünün en başta yer alması gerektiği bilgisi unutulmamalıdır.

1.3 filter()

Satır bazında veri seçim işlemi yapmak amacıyla filter() fonksiyonu kullanılır. Böylece veri setindeki istenilen değişkenler filtrelenerek sadece bu gözlemlerden oluşan yeni bir veri seti elde edilir.

  • filter() fonksiyonu kullanımı;
filter(veri_seti, kosul ve/veya kosullar)

Buradaki filtreleme işlemi tek bir fonsiyon içinde ifade edildiği gibi pipe operatörü ile de kullanılabilir.

  • filter() fonksiyonunun pipe ile kullanımı;
veri_seti %>% filter(kosul ve/veya kosullar)

filter() fonksiyonu ek olarak mantıksal operatörleri kullanarak koşulları test ettiğinden bu operatörlerin bilinmesi oldukça önemlidir. 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 “>=” olup bunların kombinasyonları da kullanılabilir. Çünkü filter() fonksiyonu birden fazla mantıksal testi aynı anda çalıştırarak istenilen satır ya da gözlemin seçilmesini sağlar.

filter() fonksyonuna geçmeden önce mantıksal operatörler ile koşulların test edildiği örneklere yer verelim:

Örneğin x nesnesi 8-2*3+1 işlemi olarak tanımlansın ve x’in 3’e eşit olup olmadığı test edelim.

x <- 8-2*3+1
x==3
## [1] TRUE

Çıktıda yer alan “TRUE”, sonucun “3” olduğunu yani sonucun doğruluğunu göstermektedir.

y nesnesi olarak tanımlanan işlemin 3’e eşit olmadığı varsayılsın. Bu işlemin sonucu ise şüphesiz “FALSE” olacaktır. Çünkü yukarıdaki örnekte işlem sonucunun “3” olduğu bulunmuştu.

y <- 8-2*3+1
y!=3
## [1] FALSE

Çıktıda TRUE, FALSE ve NA değerleri yer alabilir. filter() fonksiyonu koşulun sağlandığı satırları seçer. & (ve), | (veya) , !(değil) operatörleri de filter() fonksiyonu ile oldukça sık kullanılır.

filter() fonksiyonu ile midiPISA veri setini kullanarak sadece kız öğrencilerden oluşan yeni bir veri seti oluşturmaya çalışalım. Öncelikle cinsiyet ile ilgili bilgiyi içeren CINSIYET adlı değişken belirlenir. Bu değişkende kız öğrenciler “1” ve erkek öğrenciler “2” olarak kodlanmıştır.

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>

Görüldüğü gibi bu fonksiyon midiPISA veri seti ile beraber bir mantıksal test ifadesi içerir. Bu mantıksal test ifadesi “CINSIYET == 1”, yani kız öğrenciler şeklinde ifade edilmiştir. Böylece bu mantıksal kontrole dayanarak oluşan “kiz” isimli veri setinde “CINSIYET” değişkeninin sadece “1” olarak kodlandığı gözlemler seçilir.

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) 
## # 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  79202343    11        2           6           6     -0.112          1
## 3  79203553    10        1           6           5      1.19           4
## 4  79204714    10        2           6           4      0.338          3
## 5  79200971    10        2           6           5     -0.167          3
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Çıktıda anne eğitim düzeyi sadece lisansüstü(6) olan öğrencilere ait verilerin ilk beş satırı görüntülenmektedir.

  • 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) 
## # 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  79202343    11        2           6           6     -0.112          1
## 3  79201796    10        2           6           6      0.842          4
## 4  79202928    10        2           6           6     -0.112          4
## 5  79200826    10        1           6           6      2.61           3
## # ℹ 9 more variables: ST097Q02TA <dbl>, ST097Q03TA <dbl>, ST097Q04TA <dbl>,
## #   ST097Q05TA <dbl>, ODOKUMA1 <dbl>, ODOKUMA2 <dbl>, ODOKUMA3 <dbl>,
## #   ODOKUMA4 <dbl>, ODOKUMA5 <dbl>

Çıktıda hem anne eğitim düzeyi hem de baba eğitim düzeyi lisansüstü(6) olan öğrencilere ait verilerin ilk beş satırı görüntülenmektedir.

  • 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) 
## # 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>

Çıktıda anne eğitim düzeyi veya baba eğitim düzeyi lisansüstü(6) olan öğrencilere ait verilerin ilk beş satırı görüntülenmektedir.

Özellikle büyük veriler ile çalışıldığında filter() fonksiyonu, sadece istediğimiz gözlemlerden oluşan yeni bir veri seti oluşturması açısından önemli bir pratiklik sağlar. Tabi ki yeni oluşan veri setini bir nesneye atayarak çalışma alanına kaydetmeyi unutmamak gerekir.

1.4 select()

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

select(veri_seti, degisken_adi, degisken_adi,..)

select() fonksiyonu dplyr içindeki diğer fonksiyonlarla da sıklıkla kullanılır. Örneğin pipe operatörü ile kullanımı;

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

midiPISA veri seti ile select() fonksiyonunu kullanarak yeni bir veri seti oluşturalım.

library(tidyverse) 
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

Görüldüğü üzere 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 gereklidir.

Bazen özellikle büyük veri setleri ile çalışıldığında, değişkenlerin tek tek isimlerini yazarak seçmek oldukça vakit alabilir. O nedenle 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) %>% # sütun bazında değişken ekleme ve çıkarma
head(5) #ilk beş satırın görüntülenmesi
## # 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>

Elde edilen çıktı incelendiğinde, OGRENCIID, SINIF, Anne_Egitim, Baba_Egitim,OKUMA_ZEVK,ST097Q01TA, ST097Q02TA, ST097Q03TA ve ST097Q04TA değişkenleri seçilmiştir. Bu aralıkta yer alan CINSIYET değişkeni ise seçilmemiştir.

Sadece dplyr paketi içindeki select() fonksiyonu içinde çalışan ve daha detaylı seçimler yapma imkânı sunan bir grup yardımcı fonksiyon içermektedir. Bunlardan en sık kullanılanlar; starts_with(), contains(), matches(), num_range() fonksiyonlarıdır. Burada dikkat edilmesi gereken nokta bu fonksiyonların içindeki ifadenin çift tırnak ( ) ile beraber kullanılması gerekliliğidir.

  • starts_with() sadece select() fonksiyonu içinde çalışan ve değişken seçme işlemini kolaylaştıran yardımcı bir fonksiyondur. Örneğin ST097 ile başlayan degişkenler starts_with() fonksiyonu ile seçilebilir.
select(midiPISA, starts_with("ST097")) %>%  
  head(5) 
## # A tibble: 5 × 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

Elde edilen çıktı incelendiğinde “ST097” ile başlayan beş değişkenin seçildiği yeni veri setine ait ilk beş satır görülmektedir.

  • ends_with() benzer şekilde TA ile biten değişkenler seçilmek istendiğinde kullanılır.
# "TA" ile biten degişkenlerin seçimi
select(midiPISA, ends_with("TA")) %>%   
  head(5) 
## # A tibble: 5 × 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

Elde edilen çıktı incelendiğinde “TA” ile biten beş değişkenin seçildiği görülmektedir.

  • 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)
## # A tibble: 5 × 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.

Elde edilen çıktıya göre içinde “OD” geçen beş okuma olası değerin yer aldığı değişkenler görülmektedir.

  • matches() içinde 02 geçen değişkenlerin seçilmesinde kullanılır.
select(midiPISA, matches("02")) %>% 
  head(5)
## # A tibble: 5 × 1
##   ST097Q02TA
##        <dbl>
## 1          2
## 2          2
## 3          3
## 4          2
## 5          3

Elde edilen çıktıya göre içinde “02” geçen bir değişken görülmektedir.

  • num_range() fonksiyonu ise ardışık ilerleyen değişkenlerin seçilmesinde kullanılır. midiPISA veri setinde okuma ile ilgili beş olası değer bulunduğundan sadece 1 ve 3 arasındakiler seçilmiştir ve ilk beş gözleme ait değerler istenmiştir. Tabi ki bu örneğimizde değişken sayısı az olduğundan bu seçim çok anlamlı görünmeyebilir fakat özellikle büyük verilerle çalışılırken bu seçim işlemi oldukça pratik olabilmektedir.
select(midiPISA,num_range("ODOKUMA",1:3)) %>% 
  head(5) 
## # A tibble: 5 × 3
##   ODOKUMA1 ODOKUMA2 ODOKUMA3
##      <dbl>    <dbl>    <dbl>
## 1     376.     418.     421.
## 2     512.     473.     564.
## 3     396.     414.     423.
## 4     393.     429.     365.
## 5     552.     570.     563.

Okuma puanı olası değerleri veri setinde sıralı bir şekilde yer aldığından, bu değerlerden ilk üçü num_range() fonksiyonu kullanılarak seçilmiştir.

Farklı fonksiyonlar ve aynı anda mantıksal operatörler kullanılarak da seçim işlemleri gerçekleştirilebilir. Örneğin veya | operatörü kullanılarak seçim yapılabilir.

midiPISA veri setinde “OD” içeren veya içinde “1” rakamı geçen değişken seçimi;

select(midiPISA,contains("OD") | matches("1")) %>% head(5) 
## # A tibble: 5 × 6
##   ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5 ST097Q01TA
##      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>      <dbl>
## 1     376.     418.     421.     414.     434.          1
## 2     512.     473.     564.     485.     500.          3
## 3     396.     414.     423.     452.     392.          2
## 4     393.     429.     365.     383.     379.          2
## 5     552.     570.     563.     531.     532.          3

Elde edilen çıktı incelendiğinde, içinde “OD” veya “1” geçen toplam altı değişken olduğu görülmektedir. & operatörünün kullanımı da oldukça fazladır.

midiPISA veri setinde A harfini içeren ve içinde “2” rakamı olan değişkenlerin seçimi için;

select(midiPISA,contains("A") & matches("2")) %>% head(5) 
## # A tibble: 5 × 2
##   ST097Q02TA ODOKUMA2
##        <dbl>    <dbl>
## 1          2     418.
## 2          2     473.
## 3          3     414.
## 4          2     429.
## 5          3     570.

Çıktı incelendiğinde “O” harfini içeren ve içinde “2” rakamı olan ST097Q02TA ve ODOKUMA2 değişkenleri olmak üzere iki değişken olduğu görülmektedir.

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)
## # A tibble: 5 × 4
##   SINIF CINSIYET Anne_Egitim Baba_Egitim
##   <dbl>    <dbl>       <dbl>       <dbl>
## 1    10        2           2           2
## 2    10        2           2           2
## 3    10        1           1           2
## 4     9        2           6           6
## 5     9        2           4           4

Elde edilen çıktı incelendiğinde, midiPISA veri setinden “O” içermeyen ve içinde “0” rakamı olmayan SINIF, CINSIYET, Anne_Egitim ve Baba_Egitim değişkenleri seçilmiştir.

1.5 arrange()

arrange() fonksiyonu satırları/gözlemleri sıralamak amacıyla kullanılır. Sıralama işlemini alfabetik sıralamaya göre yapar. Fakat ek bir fonksiyon yazıldığında büyüklük sırasına göre de sıralama yapar. Böylece veri seti istenilen kritere göre sıralanarak değişkenler arasındaki ilişki daha pratik bir şekilde görülebilir. arrange() fonksiyonunun kullanımı oldukça kolaydır; fonksiyonun içine veri setinin adını ve sıralama için kullanılacak değişkeni yazmak yeterli olur.

  • arrange() fonksiyonunun kullanımı;
arrange(veri_seti, degisken_adi) 
  • arrange() fonksiyonunun pipe operatörü %>% ile kullanımı;
veri_seti %>% arrange(degisken_adi)

Örnek veri seti üzerinden dört değişken seçip yeni bir veri setine (df) atayarak kaydedelim.

df <- midiPISA %>% 
  select(OGRENCIID,ST097Q01TA,ST097Q04TA,OKUMA_ZEVK)
  df %>% head(6) 
## # A tibble: 6 × 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
## 6  79201556          3          2      0.357
  • Yeni oluşan df veri setini OKUMA_ZEVK(okumaktan zevk alma) puanlarına göre sıralayalım.
arrange(df,OKUMA_ZEVK) %>% 
  head(5)
## # A tibble: 5 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79204460          1          1      -2.73
## 2  79201124          1          1      -2.71
## 3  79204401          3          2      -2.71
## 4  79206724          1          3      -2.71
## 5  79204126          4          4      -2.71

Elde edilen çıktı incelendiğinde, arrange() fonksiyonu ile öğrencilerden elde edilen gözlemler okumaktan zevk alma puanlarına göre küçükten büyüğe sıralanmıştır. Çünkü paket içerisinde yer alan fonksiyon sıralamayı önceden tanımlı/default olarak küçükten büyüğe yapar. Fakat bu gözlemler, büyükten küçüğe sıralanmak istendiğinde ek olarak arrenge() fonksiyonu içine desc() fonksiyonu yazılır.

arrange(df,desc(OKUMA_ZEVK))%>%  #büyükten küçüğe sıralama
  head(5)
## # A tibble: 5 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79206987          3          2       2.66
## 2  79204432          3          3       2.66
## 3  79206337          4          4       2.66
## 4  79203300          3          2       2.61
## 5  79205358          4          2       2.61

1.5.1 select() ve arrange() fonksiyonları

Yeni bir veri seti tanımlanmadan da pipe operatörü kullanılarak tek bir kod hâlinde sıralama yapılabilir.

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
## # A tibble: 6 × 4
##   OGRENCIID ST097Q01TA ST097Q04TA OKUMA_ZEVK
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79204460          1          1      -2.73
## 2  79201124          1          1      -2.71
## 3  79204401          3          2      -2.71
## 4  79206724          1          3      -2.71
## 5  79204126          4          4      -2.71
## 6  79205685          3          3      -2.71

1.5.2 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) 
## # A tibble: 3 × 2
##   okumapuan1 okumapuan2
##        <dbl>      <dbl>
## 1       376.       418.
## 2       512.       473.
## 3       396.       414.

Görüldüğü üzere veri setinden seçilen ODOKUMA1 ve ODOKUMA2 sütunlarının isimleri okumapuan1 ve okumapuan2 olarak değiştirilmiştir.

select() fonksiyonu içinde değişken seçimi sırasında da değişken adı değişimi yapılabilir. Örnekte midiPISA veri setinden dört değişken seçilerek oluşturulan yeni veri setinde okuma becerileri olası değerleri 1 in yer aldığı ODOKUMA1 değişkeninin adı okumapuan1 olarak değiştirilip seçilebilir.

midiPISA %>%   
select(OGRENCIID,ST097Q02TA,ST097Q03TA, okumapuan1=ODOKUMA1) %>%  
head(3) 
## # A tibble: 3 × 4
##   OGRENCIID ST097Q02TA ST097Q03TA okumapuan1
##       <dbl>      <dbl>      <dbl>      <dbl>
## 1  79200768          2          1       376.
## 2  79201064          2          3       512.
## 3  79201118          3          3       396.

Yeni seçilen veri setinde sadece ODOKUMA1 değişkeninin ismi okumapuan1 olarak değiştirilmiştir. Diğer üç değişkenin isminin aynı kaldığı görülmektedir.

1.6 mutate()

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.

mutate() fonksiyonunun kullanımı;

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

Ö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) 
## # A tibble: 3 × 6
##   ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA toplam
##        <dbl>      <dbl>      <dbl>      <dbl>      <dbl>  <dbl>
## 1          1          2          1          1          1      6
## 2          3          2          3          3          3     14
## 3          2          3          3          3          3     14

Bu örnekte değişken değerleri + ile toplanacağı gibi rowSums() fonksiyonu ile de aşağıdaki gibi toplanabilir. Bu bize özellikle çok fazla maddenin yer aldığı ölçeklerde toplam puan almada pratiklik sağlar. Örnekte kullanılan 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)
## # A tibble: 3 × 6
##   ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA toplam
##        <dbl>      <dbl>      <dbl>      <dbl>      <dbl>  <dbl>
## 1          1          2          1          1          1      6
## 2          3          2          3          3          3     14
## 3          2          3          3          3          3     14

Ayrıca yeni değişken üretiminde sadece toplama değil istenen her türlü işlem yapılabilir. Yeni eklenecek yerler .before ya da .after argümanları ile düzenlenebilir.

midiPISA veri setinde yer alan ST097Q01TA, ST097Q02TA, ST097Q03TA, ST097Q04TA ve ST097Q05TA maddelerinden elde edilen toplam puan değişkeni “ST097Q01TA” değişkeninin hemen önüne eklenir.

zevk %>% 
mutate(toplam=rowSums(across(ST097Q01TA:ST097Q05TA)),
       .before= ST097Q01TA)%>%
  head(3) 
## # A tibble: 3 × 6
##   toplam ST097Q01TA ST097Q02TA ST097Q03TA ST097Q04TA ST097Q05TA
##    <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
## 1      6          1          2          1          1          1
## 2     14          3          2          3          3          3
## 3     14          2          3          3          3          3

Ek olarak mutate() fonksiyonu ile birden fazla değişken de eklenebilir. Yani tek bir kod ile birden fazla yeni değişken üretilebilir.

mutate(veri_seti, yeni_değişken1 = değişken1 + değişken2, yeni_değişken2 = değişken3 * değişken4)

1.6.1 transmute()

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) 
## # A tibble: 2 × 1
##   toplam
##    <dbl>
## 1      6
## 2     14

1.6.2 ifelse()

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

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

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"

Çıktıda görüldüğü üzere tamsayıların negatif veya pozitif olduğu sırasıyla belirlenmiştir.

midiPISA verisindeki sınıf düzeyi değişkeni kullanılarak bir örnek yapalım. Sınıf değişkeninde 7., 8., 9., 10., 11. ve 12.sınıf öğrencileri yer almaktadır ve aşağıda görüldüğü gibi ortaokul düzeyinde oldukça az sayıda öğrenci bulunmaktadır.

table(midiPISA$SINIF)
## 
##    7    8    9   10   11   12 
##    3   19 1295 5360  207    6

SINIF değişkenini kullanarak ortaokul ve lise olmak üzere iki düzeyli OKUL adlı bir değişken oluşturalım. Oluşturulacak yeni değişken “ortaokul” ve “lise” olmak üzere iki kategorili olup 7. ve 8. sınıflar ortaokul diğer sınıflar ise lise olarak kodlanmıştır.

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)
## # A tibble: 6 × 6
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim okul 
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl> <chr>
## 1  79203092    12        1           0           1 Lise 
## 2  79204140    12        2           0           1 Lise 
## 3  79200174    12        1           5           5 Lise 
## 4  79206519    12        1           0           0 Lise 
## 5  79205173    12        1           5           5 Lise 
## 6  79201478    12        1           0           1 Lise

Elde edilen çıktıda son üç satırdaki sınıf düzeyleri 12 olduğundan okul değişkeninin son üç satırı da lise olarak kategorilendirilmiştir.

head(Okultur,3)
## # A tibble: 3 × 6
##   OGRENCIID SINIF CINSIYET Anne_Egitim Baba_Egitim okul    
##       <dbl> <dbl>    <dbl>       <dbl>       <dbl> <chr>   
## 1  79204097     7        1           2           2 Ortaokul
## 2  79207110     7        2           6           1 Ortaokul
## 3  79202600     7        2          NA          NA Ortaokul

Elde edilen çıktıda ilk üç satırdaki sınıf düzeyleri 7 olduğundan okul değişkeninin ilk üç satırı da ortaokul olarak kategorilendirilmiştir.

1.6.3 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.

  • ODOKUMA1 düzeyine ilişikin betimsel istatistikler;
summary(midiPISA$ODOKUMA1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   175.6   402.6   463.4   464.2   525.7   771.5

ODOKUMA1 değişkeninin kategorik hale getirilmesinde çeyreklik puanları kullanılmıştı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)
## # A tibble: 6 × 2
##   ODOKUMA1 ODOKUMA1_kategorik
##      <dbl> <chr>             
## 1     376. dusuk             
## 2     512. orta              
## 3     396. dusuk             
## 4     393. dusuk             
## 5     552. yuksek            
## 6     441. orta

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.

  • Oluşturulan yeni ODOKUMA1 kategorik degişkeninindeki düzeylerin veri setinde nasıl dağıldığını inceleyelim.
v1 %>% group_by(ODOKUMA1_kategorik) %>% summarise(f=n())
## # A tibble: 3 × 2
##   ODOKUMA1_kategorik     f
##   <chr>              <int>
## 1 dusuk               1724
## 2 orta                3443
## 3 yuksek              1723

Elde edilen çıktıda her bir kategoriye ait frekans değerleri yer almaktadır.

Bu bölümde dplyr paketi ve bu pakette yer alan beş temel veri düzenleme fonksiyonu açıklanmıştır.

Bölüm 2 Veri Düzenleme II

Veri düzenlemenin diğer bir aşaması ise veriyi üst düzeyde toplama işlemleridir. Bu işlemlerden en sık kullanılanlar; count(), grup_by(), summarise(), summarise_all(), summarise_if(), summarise_at(),across(), top_n() fonksiyonlarıdır. Yine bu fonksiyonlar dplyr paketi içerisinde yer almakatadır. Sırasıyla örneklerle bu fonksiyonları inceleyelim.

2.1 count() fonksiyonu

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

  • count() fonksiyonunun pipe ile kullanımı:

veri_seti %>% count(degisken_adi)

Görüldüğü üzere fonksiyonun içine değişken ismini yazmak yeterlidir. Örnek veri seti üzerinden fonksiyonun kullanımını inceleyelim.

midiPISA %>% count() # frekans hesaplanması
## # A tibble: 1 × 1
##       n
##   <int>
## 1  6890

Elde edilen çıktıya göre midiPSA verisinde 6890(n) gözlem olduğu görülmektedir. Fakat sadece tek bir değişkene göre dağılım incelenmek istenirse fonksiyonun içine değişken ismi yazılmalıdır.

# CINSIYET değişkenine frekans hesaplama
midiPISA %>% count(CINSIYET) 
## # A tibble: 2 × 2
##   CINSIYET     n
##      <dbl> <int>
## 1        1  3396
## 2        2  3494

Çıktıda cinsiyet değişkenine göre frekans tablosu yer almaktadır. Kız(1) öğrencilerin sayısı 3396, erkek öğrencilerin sayısı 3494 olduğu görülmektedir. Ayrıca cinsiyete göre dağılımlar sıralanmak istenebilir. Bu durumda sort argümanı ile kullanılabilir.

# CINSIYET değişkenine göre frekansların sıralanması
midiPISA %>% count(CINSIYET,sort=TRUE) 
## # A tibble: 2 × 2
##   CINSIYET     n
##      <dbl> <int>
## 1        2  3494
## 2        1  3396

Elde edilen çıktıda sort argümanı yardımıyla frekans tablosundaki değerlerin sıralandığı görülmektedir. Şimdi bu veri setini kullanarak öğrencilerin SINIF ve CINSIYET değişkenlerine göre dağılımını sıralama argümanını kullanarak inceleyelim.

# CINSIYET ve SINIF değişkenlerine göre dağılımın sıralanması
midiPISA %>% count(CINSIYET,SINIF, sort=TRUE) 
## # A tibble: 12 × 3
##    CINSIYET SINIF     n
##       <dbl> <dbl> <int>
##  1        1    10  2707
##  2        2    10  2653
##  3        2     9   747
##  4        1     9   548
##  5        1    11   124
##  6        2    11    83
##  7        1     8    11
##  8        2     8     8
##  9        1    12     5
## 10        2     7     2
## 11        1     7     1
## 12        2    12     1

Elde edilen çıktıda sınıf düzeyi (SINIF), cinsiyet (CINSIYET) ve frekansların (n) yer aldığı üç sütunun olduğu görülmektedir. “sort=TRUE” yardımıyla n sütunundaki değerler büyükten küçüğe sıralanarak verilmiştir. CINSIYET değişkeni iki kategori, SINIF değişkeni altı kategoriden oluştuğundan toplam 12 satır yer almaktadır. Frekansı en yüksek olan grup (n=2707) 10. sınıfa ait kız öğrencilerdir(1).

Gruplandırılmış veride bellirli bir değişkene ilişkin toplam almak istenirse count() fonksiyonunun wt() argümanı kullanılabilir.

# CINSIYET değişkenine göre gruplandırılmış veride SINIF değişkenine göre toplam frekans sayısı
midiPISA %>% count(SINIF, wt=CINSIYET, sort=TRUE)
## # A tibble: 6 × 2
##   SINIF     n
##   <dbl> <dbl>
## 1    10  8013
## 2     9  2042
## 3    11   290
## 4     8    27
## 5    12     7
## 6     7     5

Elde edile çıktı incelendiğinde sınıf değişkenine göre büyükten küçüğe olacak şekilde frekans tablosu oluşturulduğunda CINSIYET dğişkenine göre toplam alınmıştır. Örneğin 10. sınıflarda 8013 kız veya erkek öğrencinin yer aldığı görülmektedir.

2.2 summarise()/summarize()

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 veri setinde yer alan okuma başarısı için hesaplanan olası puan değerlerinden (plausible value) ilki kullanılmıştır. Burada okuma puanlarının ortalaması hesaplanabilir.

midiPISA %>% 
summarise(mean(ODOKUMA1)) #ortalamanın hesaplanması
## # A tibble: 1 × 1
##   `mean(ODOKUMA1)`
##              <dbl>
## 1             464.

midiPISA verisinde yer alan okumapuanı1 değerlerinin ortalaması 464.23 bulunmuştur. Görüldüğü üzere summarise() fonksiyonu içinde isimlendirme yapılamaz, oluşan veri setinde isimlendirme yapmak için:

# ortalamanın "ortalama" sütun ismi ile hesaplanması
midiPISA %>%
  summarise(ortalama=mean(ODOKUMA1)) 
## # A tibble: 1 × 1
##   ortalama
##      <dbl>
## 1     464.

Genellikle bir veri setinde özet bilgiler elde etmek için birden fazla özetleyici fonksiyon kullanılmak istenebilir. Ö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))
## # A tibble: 1 × 5
##       n ortalama    sd   min   max
##   <int>    <dbl> <dbl> <dbl> <dbl>
## 1  6890     464.  87.8  176.  772.

Elde edilen çıktıda sırasıyla, frekans(n), ortalama(mean), standart sapma(sd), minimum (min) ve maksimum (max) değerleri yer almaktadır.

2.3 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)) 
## # A tibble: 2 × 6
##   CINSIYET     n ortalama    sd   min   max
##      <dbl> <int>    <dbl> <dbl> <dbl> <dbl>
## 1        1  3396     478.  83.7  236.  772.
## 2        2  3494     451.  89.6  176.  747.

Elde edilen çıktıda, CINSIYET değişkenine göre gruplandırma yapılarak kız ve erkekler için frekans, ortalama, standart sapma, minimum ve maksimum değerler hesaplanmıştır.

Ö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)) 
head(betimsel)
## # A tibble: 6 × 5
## # Groups:   CINSIYET [2]
##   CINSIYET SINIF     n ortalama    sd
##      <dbl> <dbl> <int>    <dbl> <dbl>
## 1        1    10  2707     482.  79.9
## 2        1    11   124     473.  85.0
## 3        1     9   548     462.  96.9
## 4        2    10  2653     459.  85.0
## 5        2    11    83     448.  87.9
## 6        2     9   747     422.  98.7

Çıktıda olduğu gibi veri seti SINIF ve CINSIYET değişkenlerine göre gruplandırılarak ortalama değerler büyükten küçüğe sıralı olacak şekilde elde edilmiştir. Örneğin en yüksek ortalamaya sahip (482.2971) olan erkek ve 10. sınıftan 2707 öğrenci vardır. group_by() fonksiyonu ile elde ettiğiniz çıktılarda aşağıdaki gibi gruplandırılmış veri Groups çıktısı ile alınır.

# A tibble: 12 x 5
# Groups:   CINSIYET [2]

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() 
## # A tibble: 12 × 5
##    CINSIYET SINIF     n ortalama    sd
##       <dbl> <dbl> <int>    <dbl> <dbl>
##  1        1    10  2707     482.  79.9
##  2        1    11   124     473.  85.0
##  3        1     9   548     462.  96.9
##  4        2    10  2653     459.  85.0
##  5        2    11    83     448.  87.9
##  6        2     9   747     422.  98.7
##  7        1    12     5     422.  96.6
##  8        2     8     8     363.  82.8
##  9        1     8    11     356.  62.5
## 10        1     7     1     344.  NA  
## 11        2     7     2     330.  62.1
## 12        2    12     1     322.  NA

Gruplandırılmış veri setlerinde bazı fonksiyonlar çalışmayabileceği için, üretilen yeni veri seti başka amaçlarla kullanılacağında ungroup() fonksiyonu ile grupları birleştirmek gereklidir.

2.4 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"))
## # A tibble: 1 × 2
##   ODOKUMA1_mean ODOKUMA2_mean
##           <dbl>         <dbl>
## 1          464.          464.

ODOKUMA1 ve ODOKUMA2 sütunlarına ait ortalamalar hesaplanmış ve bu ortalama değerlerini veren sütunlar .names = “{col}_mean” ile isimlendirilmiştir.

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)))
## # A tibble: 1 × 10
##   ODOKUMA1_mean ODOKUMA1_sd ODOKUMA2_mean ODOKUMA2_sd ODOKUMA3_mean ODOKUMA3_sd
##           <dbl>       <dbl>         <dbl>       <dbl>         <dbl>       <dbl>
## 1          464.        87.8          464.        87.7          465.        87.1
## # ℹ 4 more variables: ODOKUMA4_mean <dbl>, ODOKUMA4_sd <dbl>,
## #   ODOKUMA5_mean <dbl>, ODOKUMA5_sd <dbl>

2.5 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(.)))
## # A tibble: 1 × 4
##   ODOKUMA1_mean ODOKUMA2_mean ODOKUMA1_sd ODOKUMA2_sd
##           <dbl>         <dbl>       <dbl>       <dbl>
## 1          464.          464.        87.8        87.7

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(.)))
  )
## # A tibble: 1 × 4
##   ODOKUMA1_mean ODOKUMA1_sd ODOKUMA2_mean ODOKUMA2_sd
##           <dbl>       <dbl>         <dbl>       <dbl>
## 1          464.        87.8          464.        87.7
  • 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))
## # A tibble: 1 × 32
##   OGRENCIID_mean OGRENCIID_sd SINIF_mean SINIF_sd CINSIYET_mean CINSIYET_sd
##            <dbl>        <dbl>      <dbl>    <dbl>         <dbl>       <dbl>
## 1      79203623.        2087.       9.84    0.458          1.51       0.500
## # ℹ 26 more variables: Anne_Egitim_mean <dbl>, Anne_Egitim_sd <dbl>,
## #   Baba_Egitim_mean <dbl>, Baba_Egitim_sd <dbl>, OKUMA_ZEVK_mean <dbl>,
## #   OKUMA_ZEVK_sd <dbl>, ST097Q01TA_mean <dbl>, ST097Q01TA_sd <dbl>,
## #   ST097Q02TA_mean <dbl>, ST097Q02TA_sd <dbl>, ST097Q03TA_mean <dbl>,
## #   ST097Q03TA_sd <dbl>, ST097Q04TA_mean <dbl>, ST097Q04TA_sd <dbl>,
## #   ST097Q05TA_mean <dbl>, ST097Q05TA_sd <dbl>, ODOKUMA1_mean <dbl>,
## #   ODOKUMA1_sd <dbl>, ODOKUMA2_mean <dbl>, ODOKUMA2_sd <dbl>, …

Çı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))
## # A tibble: 1 × 32
##   OGRENCIID_mean OGRENCIID_sd SINIF_mean SINIF_sd CINSIYET_mean CINSIYET_sd
##            <dbl>        <dbl>      <dbl>    <dbl>         <dbl>       <dbl>
## 1      79203623.        2087.       9.84    0.458          1.51       0.500
## # ℹ 26 more variables: Anne_Egitim_mean <dbl>, Anne_Egitim_sd <dbl>,
## #   Baba_Egitim_mean <dbl>, Baba_Egitim_sd <dbl>, OKUMA_ZEVK_mean <dbl>,
## #   OKUMA_ZEVK_sd <dbl>, ST097Q01TA_mean <dbl>, ST097Q01TA_sd <dbl>,
## #   ST097Q02TA_mean <dbl>, ST097Q02TA_sd <dbl>, ST097Q03TA_mean <dbl>,
## #   ST097Q03TA_sd <dbl>, ST097Q04TA_mean <dbl>, ST097Q04TA_sd <dbl>,
## #   ST097Q05TA_mean <dbl>, ST097Q05TA_sd <dbl>, ODOKUMA1_mean <dbl>,
## #   ODOKUMA1_sd <dbl>, ODOKUMA2_mean <dbl>, ODOKUMA2_sd <dbl>, …

Mevcut kodunuzu _if, _at veya _all işlevleri yerine across() işlevini kullanacak şekilde güncellemek istiyorsanız summarise_at(), summarise_all() ve summarise_if() fonksiyonlarının yerini summarise() fonksiyonu içinde de kullanılabilen across() yardımcı fonksiyonunu kullanabilirsiniz.

2.6 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)
##    x
## 1 10
## 2  6
  • 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) 
## # A tibble: 10 × 2
## # Groups:   CINSIYET [2]
##    CINSIYET ODOKUMA1
##       <dbl>    <dbl>
##  1        1     772.
##  2        1     748.
##  3        2     747.
##  4        1     743.
##  5        2     737.
##  6        1     719.
##  7        1     715.
##  8        2     714.
##  9        2     713.
## 10        2     707.

2.7 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) 
## # A tibble: 10 × 2
## # Groups:   CINSIYET [2]
##    CINSIYET ODOKUMA1
##       <dbl>    <dbl>
##  1        1     254.
##  2        1     253.
##  3        1     250.
##  4        1     242.
##  5        1     236.
##  6        2     220.
##  7        2     211.
##  8        2     199.
##  9        2     177.
## 10        2     176.

Elde edilen çıktı incelendiğinde, okuma puanı en düşük 5 öğrenci hem erkek hem de kız öğrenciler olarak ayrı ayrı belirlenmiştir.

Bu bölümde veriyi bir üst düzeye toplama ile ilişki fonksiyonlara yer verilmiştir. Veri Düzenleme III bölümünde farklı veri setlerini birleştirme işlemlerine değinilecektir.

Bölüm 3 Veri Düzenleme III

3.1 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.

3.2 left_join()

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

Şekil 1’de, 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.

Örnek bir veri seti üzerinden açıklayalım. midiPISA1, midiPISA verisinden OGRENCIID, CINSIYET ve ST097Q01TA, ST097Q02TA değişkenlerinin ve bu veri setinin ilk altı satırının seçilmesi ile oluşturulur.

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
## # A tibble: 6 × 4
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA
##       <dbl>    <dbl>      <dbl>      <dbl>
## 1  79200768        2          1          2
## 2  79201064        2          3          2
## 3  79201118        1          2          3
## 4  79201275        2          2          2
## 5  79201481        2          3          3
## 6  79201556        2          3          3

midiPISA1 verisinin oluşturulmasından sonra midiPISA2 verisi oluşturulur. Öncelikle midiPISA verisinden öğrenci id, okumaktan zevk alma ve okuma olası değer1 puanları değişkenleri seçilir. Ardından bu veri setinin ilk yedi satırı seçilir ve üçüncü satır silinir. Sonuç olarak altı satırlık bir midiPISA2 veri seti elde edilmiş olur.

#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
## # A tibble: 6 × 3
##   OGRENCIID OKUMA_ZEVK ODOKUMA1
##       <dbl>      <dbl>    <dbl>
## 1  79200768    -0.289      376.
## 2  79201064     0.604      512.
## 3  79201275    -1.15       393.
## 4  79201481     0.667      552.
## 5  79201556     0.357      441.
## 6  79201652    -0.0886     411.

Elimizde bulunan midiPISA1 ve midiPISA2 veri setlerini kullanarak left_join() fonksiyonu ile birleştirme işlemi uygulanır.

midiPISA1%>% left_join(midiPISA2) #veri birleştirme
## # A tibble: 6 × 6
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA OKUMA_ZEVK ODOKUMA1
##       <dbl>    <dbl>      <dbl>      <dbl>      <dbl>    <dbl>
## 1  79200768        2          1          2     -0.289     376.
## 2  79201064        2          3          2      0.604     512.
## 3  79201118        1          2          3     NA          NA 
## 4  79201275        2          2          2     -1.15      393.
## 5  79201481        2          3          3      0.667     552.
## 6  79201556        2          3          3      0.357     441.

Elde edilen çıktı incelendiğinde, midiPISA1 verisindeki tüm satırlar, midiPISA2 verisi ile eşleştirilmiş, “79201652”ıd numaralı öğrenci midiPISA1 de olmadığından hiç alınmamıştır. “79201118” ıd numaralı öğrenci ise midiPISA2 verisinde yer almadığında okumaktan zevk alma ve okuma olası değer1 değişkenleri “NA” olarak oluşturulmuştur.

3.3 right_join()

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.

Şekil 2.right_join fonksiyonu
Şekil 2.right_join fonksiyonu

Şekil 2’de, right_join() fonksiyonu ile öncelikle X2 değişkenine ait tüm gözlemler alınmıştır. X1 değişkenine ait ID numarası “3” olan gözlem olmadığı için yeni veri setinde bu kısım kayıp veri(NA) olaraK girilmiştir. Burada da left_join() fonksiyonunda olduğu gibi birleştirme yapılacak iki veri setine ait ortak bir değişkenin (“ID”) olması önemlidir.

Örnek veri seti üzerinden açıklayalım:

midiPISA1%>% right_join(midiPISA2) # veri birleştirme
## # A tibble: 6 × 6
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA OKUMA_ZEVK ODOKUMA1
##       <dbl>    <dbl>      <dbl>      <dbl>      <dbl>    <dbl>
## 1  79200768        2          1          2    -0.289      376.
## 2  79201064        2          3          2     0.604      512.
## 3  79201275        2          2          2    -1.15       393.
## 4  79201481        2          3          3     0.667      552.
## 5  79201556        2          3          3     0.357      441.
## 6  79201652       NA         NA         NA    -0.0886     411.

Elde edilen çıktı incelendiğinde, midiPISA2 verisindeki tüm satırlar, midiPISA1 verisi ile eşleştirilmiş, “79201118”ıd numaralı öğrenci midiPISA2 de olmadığından oluşturulan veri setine hiç alınmamıştır.”79201652” ıd numaralı öğrenci ise midiPISA1 verisinde yer almadığında CINSIYET, ST097Q01TA,ST097Q01TA değişkenleri “NA” olarak oluşturulmuştur. Görüldüğü üzere left_join() ile right_join() fonksiyonları arasındaki fark eşleştirme öncesi temel alınacak ana veri setinin farklı olmasıdır. Fakat pratikte genellikle left_join() fonksiyonu kullanılır.

3.4 inner_join()

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.

Şekil 3. inner_join fonksiyonu
Şekil 3. inner_join fonksiyonu

Şekil 3’te, inner_join() fonksiyonu ile öncelikle “ID” değişkeni baz alınarak ortak olan satırlar yani 2. satır birleştirilir.

midiPISA1%>% inner_join(midiPISA2) # veri birleştirme
## # A tibble: 5 × 6
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA OKUMA_ZEVK ODOKUMA1
##       <dbl>    <dbl>      <dbl>      <dbl>      <dbl>    <dbl>
## 1  79200768        2          1          2     -0.289     376.
## 2  79201064        2          3          2      0.604     512.
## 3  79201275        2          2          2     -1.15      393.
## 4  79201481        2          3          3      0.667     552.
## 5  79201556        2          3          3      0.357     441.

“OGRENCIID” değişkeni ortak değişken olduğundan bu değişkene göre birleştirme işlemi yapılmış ve sadece her iki veri setinde yer alan öğrenciler seçilmiştir. Bu durumda “79201118” ve “79201652” id numaraya sahip öğrenciler birleştirme işleminden sonra yeni veri setinde yer almamıştır. Böylece yeni veri seti beş satırdan oluşmuştur.

3.5 full_join()

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.

Şekil 4.full_join fonksiyonu
Şekil 4.full_join fonksiyonu

Şekil 4’te, full_join() fonksiyonu ile öncelikle “ID” değişkeni baz alınarak iki veri setinde de yer alan tüm değişkenler birleştirilir.

midiPISA1%>% full_join(midiPISA2) # veri birleştirme
## # A tibble: 7 × 6
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA OKUMA_ZEVK ODOKUMA1
##       <dbl>    <dbl>      <dbl>      <dbl>      <dbl>    <dbl>
## 1  79200768        2          1          2    -0.289      376.
## 2  79201064        2          3          2     0.604      512.
## 3  79201118        1          2          3    NA           NA 
## 4  79201275        2          2          2    -1.15       393.
## 5  79201481        2          3          3     0.667      552.
## 6  79201556        2          3          3     0.357      441.
## 7  79201652       NA         NA         NA    -0.0886     411.

“OGRENCIID” değişkeni ortak değişken olduğundan bu değişkene göre birleştirme işlemi yapılmış ve her iki veri setinde yer alan tüm öğrenciler seçilmiştir. Bu durumda “79201118” ve “79201652” id numaraya sahip öğrenciler birleştirme işleminden sonra yeni veri setinde yer almıştır. Böylece yeni veri seti yedi satırdan oluşmuştur.

3.6 semi_join()

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.

Şekil 5.semi_join fonksiyonu
Şekil 5.semi_join fonksiyonu

Şekil 5’te, semi_join() fonksiyonu ile öncelikle “ID” değişkeni baz alınarak ortak olan satırlar yani 2. satır birleştirilir. Fakat yine sadece A veri setinde yer alan değişken ya da değişkenler alınır.

midiPISA1%>% semi_join(midiPISA2)
## # A tibble: 5 × 4
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA
##       <dbl>    <dbl>      <dbl>      <dbl>
## 1  79200768        2          1          2
## 2  79201064        2          3          2
## 3  79201275        2          2          2
## 4  79201481        2          3          3
## 5  79201556        2          3          3

Çıktıda midiPISA1 verisinin midiPISA2 verisi ile eşleşen satırları ele alındığından “79201118” id numaralı öğrenci yeni veri setine dahil edilmemiştir. Ayrıca yeni veri setinde sadece midiPISA1 değişkeninde yer alan CINSIYET, ST097Q01TA, ST097Q02TA değişkenleri yer almıştır.

3.7 anti_join()

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.

Şekil 6.anti_join fonksiyonu
Şekil 6.anti_join fonksiyonu

Şekil 6’da, anti_join() fonksiyonu ile öncelikle “ID” değişkeni baz alınarak ortak olmayan satırlar yani sadece 1. satır ve A veri setindeki değişken (X1) alınmıştır.

midiPISA1%>% anti_join(midiPISA2) # veri birleştirme
## # A tibble: 1 × 4
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA
##       <dbl>    <dbl>      <dbl>      <dbl>
## 1  79201118        1          2          3

Çıktıda midiPISA1 verisinin midiPISA2 verisi ile eşleşmeyen satırları ele alındığından “79201118” id numaralı öğrenci yeni veri setine dahil edilmiştir. Ayrıca yeni veri setinde sadece midiPISA1 değişkeninde yer alan CINSIYET, ST097Q01TA, ST097Q02TA değişkenleri yer almıştır.

Not: Aynı değerleri içeren satırların olduğu sütunların eşleşmesi gerektiğini söyledik. Bunları birleştirme için aslında bir by = argümanı da kullanılır. Fakat birleştirme yapmak istediğimiz sütun/ların isimleri aynı olduğunda by = argümanını kullanmaya gerek kalmaz. Buraya kadar yapılan örnekler aşağıdaki gibi pipe operatörü kullanIlmadan da yapılabilir.

left_join(midiPISA1,midiPISA2, by=join_by(OGRENCIID))
## # A tibble: 6 × 6
##   OGRENCIID CINSIYET ST097Q01TA ST097Q02TA OKUMA_ZEVK ODOKUMA1
##       <dbl>    <dbl>      <dbl>      <dbl>      <dbl>    <dbl>
## 1  79200768        2          1          2     -0.289     376.
## 2  79201064        2          3          2      0.604     512.
## 3  79201118        1          2          3     NA          NA 
## 4  79201275        2          2          2     -1.15      393.
## 5  79201481        2          3          3      0.667     552.
## 6  79201556        2          3          3      0.357     441.

Elde edilen çıktı midiPISA1%>% left_join(midiPISA2) fonksiyonu ile elde edilen çıktı ile aynıdır. Fakat değişken isimleri farklı olduğunda by argümanını kullanmak anlamlı olabilir. Şimdi bununla ilgili bir örnek yapalım. Öncelikle midiPISA2 veri setindeki “OGRENCIID” değişken ismini “STDNTID” olarak değiştirelim.

midiPISA3<-midiPISA2 %>% 
  rename(STDNTID=OGRENCIID) 
head(midiPISA3)
## # A tibble: 6 × 3
##    STDNTID OKUMA_ZEVK ODOKUMA1
##      <dbl>      <dbl>    <dbl>
## 1 79200768    -0.289      376.
## 2 79201064     0.604      512.
## 3 79201275    -1.15       393.
## 4 79201481     0.667      552.
## 5 79201556     0.357      441.
## 6 79201652    -0.0886     411.

midiPISA3 verisi aslında midiPISA2 verisinin aynısıdır sadece tek bir değişkenin ismi değişmiştir.

Veri setinde eşleştirme yapılması istenilen değişkenin farklı adları olduğunda aşağıdaki kod kullanılabilir.

left_join(midiPISA2, midiPISA3, by=c("OGRENCIID"="STDNTID"))
## # A tibble: 6 × 5
##   OGRENCIID OKUMA_ZEVK.x ODOKUMA1.x OKUMA_ZEVK.y ODOKUMA1.y
##       <dbl>        <dbl>      <dbl>        <dbl>      <dbl>
## 1  79200768      -0.289        376.      -0.289        376.
## 2  79201064       0.604        512.       0.604        512.
## 3  79201275      -1.15         393.      -1.15         393.
## 4  79201481       0.667        552.       0.667        552.
## 5  79201556       0.357        441.       0.357        441.
## 6  79201652      -0.0886       411.      -0.0886       411.

Bu bölümde farklı veri setlerini birleştirme işlemlerine yer verilmiştir. Veri Düzenleme IV bölümünde veri setlerini farklı formatlara getirme ve analize hazırlık işlemlerine değinilecektir.

Bölüm 4 Veri Düzenleme IV

Bir veriyi R ortamına aktardıktan sonra veri setinde yer alan tüm satır ya da sütunların doğru bir şekilde aktarılıp aktarılmadığı, değişken isimlerinin düzgün olup olmadığı yani özellikle sütun adlarında boşluk olmaması ya da farklı karakterler bulunmaması kontrol edilmelidir. İlk olarak R ortamına aktarılan boş satır ve sütunlar olup olmadığı filter() ve select() gibi fonksiyonlarla incelenebilir. Eksik verilerin nasıl temsil edildiği kontrol edilmelidir. NA,” “ (bosluk), ., 999 , 9999 vb. şekilde ifade edilen eksik veriler mutate() ve ifelse() ile düzenlenebilir. Ayrıca karakter (character) ve faktör (factor) değişkenlerinin de düzgün tanımlanıp tanımlanmadığı incelenmelidir.

Sütunlarda program, kadın ve erkek isimleri olan dağınık bir veri seti üzerinden veri düzenlemesinin temel aşamalarını gerçekleştirelim:

Program Kadın Erkek
Olcme 6 6
Program 5 5
Yonetim 7 8
PDR 5 3

Bir veri setindeki gözlem, değişken isim ve değişken değerlerinin ne olduğu öncelikle belirlenmelidir. Örnekteki veri setinde her bir programda yer alan öğrencilerin cinsiyete göre dağılımı gözlem; program, CINSIYET, frekans ise değişkenleri oluşturmalıdır. Program: Olcme, Program, Yonetim, PDR; CINSIYET: Kadın, Erkek kategorilerinden oluşmalıdır. Bunların değişken değeri olması gerekiyor, örnekteki gibi sütun başlığı değil. Frekansların ise iki sütuna dağıldığı görülmektedir.

Örnekte verilen dağınık verinin olması gereken düzgün veri hali aşağıda yer almaktadır.

Program CINSIYET Frekans
Olcme Kadın 6
Olcme Erkek 6
Program Kadın 5
Program Erkek 5
Yonetim Kadın 7
Yonetim Erkek 8
PDR Kadın 5
PDR Erkek 3

Düzgün veri seti incelendiğinde, değişkenlerin sütunlarda, gözlemlerin satırlarda olduğu görülmektedir. Bu veri setinde program, CINSIYET ve Frekans olmak üzere üç farklı değişken bulunmaktadır. Değişken adları mümkün olduğunca örnekte olduğu gibi anlamlı olmalıdır.

Aslında çok sayıda satırı anlamlandırmak, çok sayıda sütunu anlamlandırmaktan daha kolaydır. Verinin bu şekilde düzenlenmesi dplyr, ggplot2, plotly, lattice gibi paketleri rahat kullanabilmek için oldukça önemlidir. Hiyerarşik ve karma modeller için de verinin düzgün olması gerekmektedir. Ayrıca düzgün bir veri seti, eksik değerler ve dengesiz tekrarlanan ölçüm verileriyle ilgili daha az sorun sağlar.

4.1 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.

Fonksiyonun kullanımını göstermek için örnek bir veri seti üzerinde çalışalı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
## # A tibble: 6 × 6
##   OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1  79200768     376.     418.     421.     414.     434.
## 2  79201064     512.     473.     564.     485.     500.
## 3  79201118     396.     414.     423.     452.     392.
## 4  79201275     393.     429.     365.     383.     379.
## 5  79201481     552.     570.     563.     531.     532.
## 6  79201556     441.     416.     407.     437.     473.

Elde edilen çıktıda öğrenci ıd ve beş okuma olası değerinin yer aldığı toplam altı değişkenden oluşan veri seti görüntülenmektedir. Bu değişkenler sütunlarda yer almaktadır. gather() fonksiyonu geniş veriyi, uzun veri haline getirir.

uzun <- genisveri %>% gather(O_OD,okumapuan,ODOKUMA1:ODOKUMA5)
uzun %>%  arrange(OGRENCIID) %>% head(10)
## # A tibble: 10 × 3
##    OGRENCIID O_OD     okumapuan
##        <dbl> <chr>        <dbl>
##  1  79200001 ODOKUMA1      450.
##  2  79200001 ODOKUMA2      458.
##  3  79200001 ODOKUMA3      413.
##  4  79200001 ODOKUMA4      430.
##  5  79200001 ODOKUMA5      439.
##  6  79200002 ODOKUMA1      669.
##  7  79200002 ODOKUMA2      666.
##  8  79200002 ODOKUMA3      685.
##  9  79200002 ODOKUMA4      665.
## 10  79200002 ODOKUMA5      660.

Çıktı incelendiğinde, oluşan veride ODOKUMA1, ODOKUMA2, ODOKUMA3, ODOKUMA4 ve ODOKUMA5 okumapuanı değişkeninin değerleri hâline gelmiştir. Çıktıda görüldüğü gibi, şimdi ID dışında iki sütunumuz var: Biri kategorik diğeri sayısal değerleri içerir. Her katılımcı icin beş farklı okuma olası değeri olduğu için her bir ID değeri beş kere tekrarlanmaktadır. Burada veri setinin ilk on satırı görüntülendiğinden sadece 79200001 ve 79200002 id numaralı öğrenciler görüntülenmektedir.

4.2 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
## # A tibble: 6 × 6
##   OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1  79200001     450.     458.     413.     430.     439.
## 2  79200002     669.     666.     685.     665.     660.
## 3  79200003     452.     502.     444.     456.     437.
## 4  79200004     347.     317.     339.     325.     367.
## 5  79200005     467.     498.     415.     471.     446.
## 6  79200006     366.     364.     384.     420.     351.

Öğ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.

4.3 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
## # A tibble: 6 × 6
##   OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1  79200768     376.     418.     421.     414.     434.
## 2  79201064     512.     473.     564.     485.     500.
## 3  79201118     396.     414.     423.     452.     392.
## 4  79201275     393.     429.     365.     383.     379.
## 5  79201481     552.     570.     563.     531.     532.
## 6  79201556     441.     416.     407.     437.     473.

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)
## # A tibble: 5 × 3
##   OGRENCIID okumapuan deger
##       <dbl> <chr>     <dbl>
## 1  79200768 ODOKUMA1   376.
## 2  79200768 ODOKUMA2   418.
## 3  79200768 ODOKUMA3   421.
## 4  79200768 ODOKUMA4   414.
## 5  79200768 ODOKUMA5   434.

Çıktı incelendiğinde, oluşan veride ODOKUMA1, ODOKUMA2, ODOKUMA3, ODOKUMA4 ve ODOKUMA5 ayrı bir sütunun değerleri haline gelmiştir. Bu okuma puan türlerinin sütununun yer aldığı değişken names_to argümanı ile “okumapuan” olarak isimlendirilmiştir. Ayrıca values_to argümanı ise okuma puanı değerlerinin yer aldığı sütun isimlendirilmiştir. Çıktıda görüldüğü gibi, şimdi ID dışında iki sütunumuz var: Biri okuma puanı türü için, diğeri okuma puanı türleri için. Her katılımcı icin beş farklı okuma olası değeri olduğu için her bir ID değeri beş kere tekrarlanmaktadır. Burada veri setinin ilk beş satırı görüntülendiğinden sadece 792200768 id numaralı öğrencinin değerleri görüntülenmektedir.

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)
## # A tibble: 5 × 6
##   OGRENCIID ODOKUMA1 ODOKUMA2 ODOKUMA3 ODOKUMA4 ODOKUMA5
##       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1  79200768     376.     418.     421.     414.     434.
## 2  79201064     512.     473.     564.     485.     500.
## 3  79201118     396.     414.     423.     452.     392.
## 4  79201275     393.     429.     365.     383.     379.
## 5  79201481     552.     570.     563.     531.     532.

4.4 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
## # A tibble: 3 × 4
##   OGRENCIID OD    Sayi  deger
##       <dbl> <chr> <chr> <dbl>
## 1  79200768 ODOKU 1      376.
## 2  79200768 ODOKU 2      418.
## 3  79200768 ODOKU 3      421.

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.

4.5 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
## # A tibble: 3 × 3
##   OGRENCIID ODOKUMA deger
##       <dbl> <chr>   <dbl>
## 1  79200768 ODOKU_1  376.
## 2  79200768 ODOKU_2  418.
## 3  79200768 ODOKU_3  421.

Elde edilen çıktı incelendiğinde, öğrenci id değişkeni hariç iki sütunun olduğu görülmektedir. ODOKUMA sütunu, okuma puanlarının isimlerinden, değer ise okuma olası puanı değerlerinden oluşmaktadır.

separate() fonksiyonunun alternatifi extract() ve unite() fonksiyonları ile yapılabilecek olan işlemler mutate() fonksiyonu ile de yapılabilir.

Bu alternatiflerin uygunluğunun özel kullanım durumunuza ve verilerinizin niteliğine bağlı olduğunu unutmayın. Paketler zaman içinde yeni fonksiyonlara veya iyileştirmelere sahip olabileceğinden, en son güncellemeler için her zaman fonksiyon yardım sayfalarını kontrol etmenizi öneriyoruz.

Bölüm 5 Betimleyici İstatistikler

Bu bölümde veri setine ait en sık kullanılan betimleyici istatistikler hesaplanmıştır.

5.1 Minimum ve maksimum değerler

min() ve max() fonksiyonları sayesinde veri setinin minimum ve maksimum değerleri bulunabilir:

min(midiPISA$ODOKUMA1) # minimum değer hesaplama
## [1] 175.608

midiPISA verisinin minimum değeri 175.61 olarak bulunmuştur.

max(midiPISA$ODOKUMA1) # maksimum değer hesaplama
## [1] 771.508

midiPISA verisinin maksimum değeri 771.51 olarak bulunmuştur.

Alternatif olarak range() fonksiyonu: size doğrudan minimum ve maksimum değerleri verir. range() fonksiyonunun çıktısının aslında minimum ve maksimum değerleri (bu sırayla) içeren bir nesne olduğuna dikkat edin. Bu, aslında minimuma şu şekilde erişebileceğiniz anlamına gelir:

min<-range(midiPISA$ODOKUMA1)[1] #minimum değer hesaplama
min
## [1] 175.608
max<-range(midiPISA$ODOKUMA1)[2] #maksimum değer hesaplama
max
## [1] 771.508

Elde edilen çıktıda, sırasıyla midiPISA verisindeki okuma olası değeri1’ e ait minimum ve maksimum değerleri sırasıyla görüntülenmiştir.

5.2 Ortalama

Ortalama, mean() fonksiyonu ile hesaplanabilir:

mean(midiPISA$ODOKUMA1) # ortalama hesaplama
## [1] 464.2299

midiPISA verisinin ortalama değeri 464.23 olarak bulunmuştur.

Veri setinde en az bir eksik(kayıp) değer varsa, ortalama NA hariç tutularak hesaplanabilir. Bunun için na.rm_TRUE argümanı kullanılabilir. Bu argüman sadece ortalama için değil, R’da sunulan çoğu fonksiyon için kullanılabilir.

mean(midiPISA$ODOKUMA1,na.rm=TRUE) # kayıp değerler hariç ortalama hesaplama
## [1] 464.2299

midiPISA verisine ait okuma olası değeri1 de kayıp değer olmadığı için ortalama değer yine 464.23 olarak bulunmuştur. Ayrıca kırpılmış bir ortalama için mean(midiPISA$O_OD1, trim = 0.10) kullanılabilir ve trim bağımsız değişkenini ihtiyaçlarınıza göre değiştirebilirsiniz.

5.3 Medyan

Medyan(ortanca değer), median() fonksiyonu sayesinde hesaplanabilir:

median(midiPISA$ODOKUMA1) # medyan hesaplama
## [1] 463.403

midiPISA verisinin medyanı 463.405 olarak bulunmuştur.Aynı zamandabu değer -quantile() fonksiyonu ile de hesaplanabilir.

quantile(midiPISA$ODOKUMA1,0.5) # medyan hesaplama
##     50% 
## 463.403

5.4 I. ve III. Çeyrekler

Medyan gibi, birinci ve üçüncü çeyrekler de quantile() işlevi sayesinde ve ikinci bağımsız değişkenin 0.25 veya 0.75 olarak ayarlanmasıyla hesaplanabilir:

quantile(midiPISA$ODOKUMA1,0.25) # I. çeyrekler hesaplama
##      25% 
## 402.5635

midiPISA verisinin I.çeyrekler 402.5625 olarak bulunmuştur.

quantile(midiPISA$ODOKUMA1,0.75) # III. çeyrekler hesaplama
##      75% 
## 525.7188

midiPISA verisinin III.çeyrekler 525.72 olarak bulunmuştur.

5.5 Standart sapma ve varyans

Standart sapma ve varyans, sd() ve var() fonksiyonları ile hesaplanır:

sd(midiPISA$ODOKUMA1) # standart sapma hesaplama
## [1] 87.78006

midiPISA verisinin standart sapması 87.78 olarak bulunmuştur.

var(midiPISA$ODOKUMA1) # varyans hesaplama
## [1] 7705.339

midiPISA verisinin varyansı 7705.345 olarak bulunmuştur.

Standart sapma ve varyansın bir örneklem veya popülasyon için hesaplanmasının farklı olduğu hatırlanmalıdır (örneklem ve popülasyon arasındaki fark ilgili kaynaklardan incelenmelidir). R’de standart sapma ve varyans, veriler bir örneklem temsil ediyormuş gibi hesaplanır. Birden fazla değişkenin standart sapmasını veya varyansını aynı anda hesaplamak için, ikinci bağımsız değişken olarak uygun istatistiklerle birlikte lapply() fonksiyonu ile kullanılmalıdır.

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

Çıktıda da görüldüğü üzere, veri setinde “O” ile başlayan ve “OD” içeren beş değişkene ait standart sapma değerleri hesaplanır.

Aynı işlemi veri seti olarak elde etmek istiyorsanız summarise() fonksiyonunu kullabailirsiniz.

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ı
## # A tibble: 1 × 5
##   ODOKUMA1_sd ODOKUMA2_sd ODOKUMA3_sd ODOKUMA4_sd ODOKUMA5_sd
##         <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
## 1        87.8        87.7        87.1        87.4        87.2

5.6 Tüm özet istatistikler

summary() fonksiyonu ise betimleyici istatistikleri özet olarak verir.

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

Bu tanımlayıcı istatistikleri gruba göre hesaplamak istenirse by() fonksiyonu kullanıılır.

# 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

lapply() kullanımında bağımsız değişkenler veri setinin adı, gruplama değişkeni ve özet fonksiyonudur. Bu sıra takip edilmeli veya bu sıra takip edilemiyorsa argümanların adı belirtilmelidir.

Daha açıklayıcı istatistiklere ihtiyaç varsa, psych paketindeki describe() fonksiyonu kullanılmalıdır.

library(psych)
describe(midiPISA %>% 
  select(CINSIYET,ODOKUMA1)) # özetleyici istatistiklerinin hesaplanması
##          vars    n   mean    sd median trimmed   mad    min    max range  skew
## CINSIYET    1 6890   1.51  0.50    2.0    1.51  0.00   1.00   2.00   1.0 -0.03
## ODOKUMA1    2 6890 464.23 87.78  463.4  463.90 91.11 175.61 771.51 595.9  0.04
##          kurtosis   se
## CINSIYET     -2.0 0.01
## ODOKUMA1     -0.3 1.06

5.7 Değişkenlik katsayısı

Değişkenlik katsayısı stat.desc() ile veya manuel olarak hesaplanarak bulunabilir (Değişkenlik katsayısının standart sapmanın ortalamaya bölümü olduğu hatırlanmalıdır):

library(pastecs) # paketin aktifleştirilmesi
round(stat.desc(midiPISA %>% 
  select(CINSIYET,OKUMA_ZEVK)),2)  # değişkenlik katsayısının hesaplanması
##              CINSIYET OKUMA_ZEVK
## nbr.val       6890.00    6821.00
## nbr.null         0.00       0.00
## nbr.na           0.00      69.00
## min              1.00      -2.73
## max              2.00       2.66
## range            1.00       5.39
## sum          10384.00    4659.70
## median           2.00       0.64
## mean             1.51       0.68
## SE.mean          0.01       0.01
## CI.mean.0.95     0.01       0.02
## var              0.25       0.95
## std.dev          0.50       0.98
## coef.var         0.33       1.43

Seçilen CINSIYET ve OKUMA_ZEVK değişkenlerinin değişkenlik katsayıları hesaplanmış ve sonuçlar round ile virgülden sonra iki basamak olacak şekilde yuvarlanmıştır.

5.8 Mod

Bir değişkenin modunu bulmak için table() ve sort() fonksiyonları kullanarak hesaplanmalıdır.

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

table() fonksiyonu, her bir benzersiz değer için oluşum sayısını verir, ardından sort() decreasing = TRUE argümanı ile oluşum sayısını en yüksekten en düşüğe doğru görüntüler.

5.9 Frekans tablosu oluşturma

Herhangi bir ek işlem (yani veri işleme) yapmadan içe aktarılan veri setini kullanarak örneklemin demografik özellikleri hakkında bazı temel tanımlayıcı bilgiler hesaplanabilir.

Veri kümesi midiPISA kullanılarak Anne_Egitim (anne eğitim düzeyi) değişkenine göre gruplama yapılır. Ardından her gruptaki gözlemlerin sayısı bulunur ve gruplandırma kaldırılır.

midiPISA %>%
  group_by(Anne_Egitim) %>% # Anne_Egitim e göre gruplandırma
  count() %>%  # frekans tablosu oluşturma
  ungroup() # gruplandırmanın kaldırılması
## # A tibble: 8 × 2
##   Anne_Egitim     n
##         <dbl> <int>
## 1           0   695
## 2           1  1882
## 3           2  1362
## 4           3   575
## 5           4   675
## 6           5   759
## 7           6   887
## 8          NA    55

group_by() fonkisyonu veri setinin yüzey düzeyinde değişikliklere neden olmaz, bunun yerine temel yapıyı değiştirir, böylece gruplar belirtilirse, daha sonra çağrılan fonksiyonlar gruplama değişkeninin her düzeyinde ayrı ayrı gerçekleştirilir. Bu gruplama oluşturulan nesnede kalır, bu nedenle nesne üzerinde gelecekte yapılacak işlemlerin gruplar tarafından bilinmeden gerçekleştirilmesini önlemek için ungroup() ile kaldırılması önemlidir.

Bu nedenle yukarıdaki kod, Anne_Egitim değişkeninin yani anne eğitim düzeyinin her bir grubundaki gözlem sayısını sayar. Eğer sadece toplam gözlem sayısına ihtiyacınız varsa, group_by() ve ungroup() satırlarını kaldırabilirsiniz, böylece işlemi gruplar yerine tüm veri seti üzerinde gerçekleştirebilirsiniz:

Benzer şekilde, örneklemin ortalama başarısı (ve SD’sini) hesaplanmak istendiğinde dplyr/tidyverse paketindeki summarise() fonkisyonu kullanılabilir.

midiPISA %>%
  summarise(ort = mean(ODOKUMA1), # ortalama
            sd = sd(ODOKUMA1),    # standart sapma 
            n = n())              # frekans hesaplama
## # A tibble: 1 × 3
##     ort    sd     n
##   <dbl> <dbl> <int>
## 1  464.  87.8  6890

Bu kod, başarı ortalamasının hesaplanmasının sonucunu içeren ort adlı bir sütun biçiminde özet veriler üretir. Daha sonra aynı işlemi standart sapma için yapan sd sütununu oluşturur. Son olarak, istatistiği hesaplamak için kullanılan değerlerin sayısını n adlı bir sütuna eklemek için n() fonksiyonu kullanır.

Yukarıdaki kodun bu işlemin sonucunu kaydetmeyeceğini, sadece konsolda çıktısını vereceğini unutmayın. İleride kullanmak üzere kaydetmek isterseniz, “<-” notasyonunu kullanarak bir nesnede saklanabilir ve daha sonra nesne adını yazarak yazdırılabilir. Son olarak, group_by() fonksiyonu özet istatistikleri hesaplarken aynı şekilde çalışacaktır. group_by() fonksiyonundan sonra çağrılan işlevin çıktısı gruplama değişkeninin her düzeyi için üretilecektir.