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;
- 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.
## # 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.