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.