R ile Veri Manipülasyonu | Bölüm 3/3
En önemli bölümümüz birinci bölümdü. Temel prensipleri anladığımız taktirde işlemleri bir şekilde yapabiliriz, geri kalan kısım ise bu prensipleri uygulayacağımız kısımlardır. Burada çok detaya girmeden metin manipülasyonu için bazı fonksiyonları anlatacağız. Ardından ise eksik gözlem, aykırı gözlem ve bazı bariz hatalardan bahsedeceğiz.
5. Metin Manipülasyonu
Verilerde metinler başlı başına bir problem bu yüzden yeri geldiğinde metinleri de manipüle edebilmemiz gerekiyor. Bu yüzden bazı base R komutlarını ve stringr kütüphanesini kullanıyor olacağız.
5.1. Metin Manipülasyonunda Önemli Fonksiyonlar
- stringr
library(stringr)
- str_trim() fonksiyonu metin içerisindeki baştaki ve sondaki fazlalık olan boşlukları siler.
str_trim(" Ali ata bak. ")
## [1] "Ali ata bak."
- str_pad() fonksiyonu metinin sağına,soluna veya hem sağına hem de soluna bir değer/karakter girmek için kullanılır.
str_pad("12345", width = 8, side = "left", pad = "0")
## [1] "00012345"
- str_detect() fonksiyonu veri içerisinde belirttiğimiz elemanın varlığını sorgulamak için yaptığımız mantıksal bir işlemdir.
yazi <- "Ali ata bak"
str_detect(yazi, "Ali")
## [1] TRUE
str_detect(c("Ali", "ata", "bak"), "Ali")
## [1] TRUE FALSE FALSE
- str_replace() fonksiyonu ile metin içerisindeki bir elemanı değiştirmek istenirse kullanılır. Elimizde uzun bir metin varsa str_replace_all() fonksiyonu ile metin içerisindeki tüm Alileri Mahmut yapma fırsatımız vardır.
str_replace(yazi, "Ali", "Mahmut")
## [1] "Mahmut ata bak"
- str_remove() fonksiyonu ile metin içerisinde istemediğimiz bir kelime / karakter / noktalama işaretini kaldırmaya yarar. Uzun bir metin verisinde hepsini kaldırmak istersek str_remove_all() fonknsiyonu kullanılır.
str_remove(yazi, "ata")
## [1] "Ali bak"
- Base R
paste() fonksiyonu iki karakteri birleştirmeye yarar.
paste("Ali", "topu tut", sep = "-*-")
## [1] "Ali-*-topu tut"
paste("Ali", "topu tut", sep = " ")
## [1] "Ali topu tut"
noquote() fonksiyonu ile bazı işlemler sonucunda çıktısının tırnaksız veya nümerik değerler olarak almamız gerekiyor. Bu yüzden bu fonksiyon işinize yarayacaktır.
noquote("karakter")
## [1] karakter
# veya
print("karakter", quote = FALSE)
## [1] karakter
cat() fonksiyonu metine yukarıdaki işlemler gibi bir vektör muamelesi yapmadan direk çıktısını verir.
cat("R mı Python mı ?")
## R mý Python mý ?
nchar() metnin karakter uzunluğunu verir.
nchar("MFÖ")
## [1] 3
nchar(c("Mahzar","Fuat","Özkan"))
## [1] 6 4 5
tolower() ve toupper() harfleri küçültmeye veya büyütmemeye yarar.
tolower("ALEX DE SOUZA")
## [1] "alex de souza"
toupper("gheorghe hagi")
## [1] "GHEORGHE HAGI"
chartr() fonksiyonu metin içerisindeki karakter değişimi yapmak istersek.
chartr("E", "e", "FENERBAHÇE")
## [1] "FeNeRBAHÇe"
Metin manipülasyonu konusunu çok fazla uzatmaya gerek yok. Bu gösterdiklerimiz haricindeki Base R komutlarını ve stringr cheat sheet’indeki komutları kolaylıkla öğrenebilirsiniz.
6. Eksik Gözlemler ve Özel Değerler
Eksik gözlemler,
- rastgele olabilir ama varsayımı tehlikelidir.
- Bazen değişkenler veya ilgili çıktılar ile ilişkilidir.
- R’da eksik gözlemler NA olarak temsil edilir.
- Diğer formatlarda da olabilir. Örneğin, Excelde #N/A şeklinde, SPSS ve SAS’ta . şeklinde veya boş bir metin olarak karşımıza çıkabilir.
Özel Değerler,
- Inf – Infinte Value = Sonsuz Değerler
1/0
## [1] Inf
22222^22222
## [1] Inf
- Nan – Not a number = Bir sayı değil
0/0
## [1] NaN
6.1. Eksik Gözlem Tespiti
Eksik gözlemlerimizin olduğu bir veri seti oluşturalım.
df <- data.frame(
a = c(1,NA,8,NA),
b = c(3,NA,88,23),
c = c(2,45,3,1)
)
df
## a b c
## 1 1 3 2
## 2 NA NA 45
## 3 8 88 3
## 4 NA 23 1
- is.na() tüm veri setinde mantıksal olarak eksik gözlem tespiti için kullanılır.
is.na(df)
## a b c
## [1,] FALSE FALSE FALSE
## [2,] TRUE TRUE FALSE
## [3,] FALSE FALSE FALSE
## [4,] TRUE FALSE FALSE
- any(is.na()) veri setinde herhangi bir eksik gözlem var mı diye bakmak için kullanılır.
any(is.na(df))
## [1] TRUE
Eksik gözlemlerimizin olduğunu artık biliyoruz. Peki ne kadar eksi gözlemimiz var ?
sum(is.na(df))
## [1] 3
Elimizde 3 tane eksik gözlemimiz bulunmakta. Yani mantıksal olarak 3 tane TRUE mevcut.
Ayrıca summary fonksiyonu ile veri setinin özetine bakarsak eksik gözlemlerimizin nerede kaç tane olduğunu da görebiliriz.
summary(df)
## a b c
## Min. :1.00 Min. : 3.0 Min. : 1.00
## 1st Qu.:2.75 1st Qu.:13.0 1st Qu.: 1.75
## Median :4.50 Median :23.0 Median : 2.50
## Mean :4.50 Mean :38.0 Mean :12.75
## 3rd Qu.:6.25 3rd Qu.:55.5 3rd Qu.:13.50
## Max. :8.00 Max. :88.0 Max. :45.00
## NA's :2 NA's :1
6.2. Eksik Gözlemler ile Mücadele
- Satır bazında eksik gözlem olmayan değerleri mantıksal olarak göstermek,
complete.cases(df)
## [1] TRUE FALSE TRUE FALSE
- Eksik gözlemlerin silinmesi,
df[complete.cases(df),]
## a b c
## 1 1 3 2
## 3 8 88 3
veya,
na.omit(df)
## a b c
## 1 1 3 2
## 3 8 88 3
7. Aykırı Değerler
Örneğin 30 kişilik bir sınıfın boy ortalamasını bulmak istiyoruz.Ama bu sınıfta 2 metrelik bir öğrencinin olduğunu düşünelim. Bu öğrenci nedeniyle boy ortalaması olması gerekenden yüksek çıkacaktır. Bu yüzden analizi yapmadan bu öğrenciyi hesaba katmamak gerekir. İşte bu 2 metrelik öğrenci bir aykırı gözlem / değerdir.
Aykırı gözlem tespitinde boxplot kullanışlı bir araçtır. Boxplotun uçlarının dışındaki noktalar bize aykırı değerleri göstermektedir.
set.seed(10)
outliers <- c(rnorm(30, mean = 15, sd = 5), -5,30,55)
boxplot(outliers, horizontal = TRUE)
Aykırı değerler,
- veri içerisindeki diğer değerlerden uzaktadır
- yanlış veri girişinden, deneysel bir hatadan, ölçme hatalarından kaynaklanır.
Bir veri bilimci olarak kendimize sormamız gereken soru, “bu aykırı gözlemler neden veri içerisinde ?”. Buna karar verdikten sonra problemimize bağlı olarak aykırı değerlere veri setinden atılablir veya tutulabilir.
7.1. Bariz Hatalar
boxplot(outliers, horizontal = TRUE)
Yukarıdaki boxplotun aslında bir şirkette çalışanların yaş dağılımını olduğunu söylersek, verideki -5 değeri yanlış bir veridir.
- Bariz hataları pek çok formatta karşımıza çıkabilir.
Örneğin, yaş verisinde aykırı gözlemin negatif veya 250 gibi olması akla yatkın bir gözlem değildir.
- Bariz hatalara bazı yanlışlıklar neden olur.
Veri giriş hataları, ölçüm hataları, eksik gözlemler için özel değerler girilmesi (-1 gibi) ve benzer yanlışlıklar ile bariz hatalar karşımıza çıkar.
- Bariz hatalar ortadan kaldırılmalı veya düzeltilmelidir.
7.2. Aykırı Değerleri ve Hataları Bulma
Aykırı değerlerin olduğu bir veri seti oluşturalım.
set.seed(10)
df2 <- data.frame(A = rnorm(100,50,10),
B = c(rnorm(99,50,10),500),
C = c(rnorm(99,50,10),-1))
summary fonksiyonundaki özet istatistikler ile aykırı gözlemleri tespit edebiliriz. Çıktıda minimum ve maksimum değerlere bakara değişkenlerdeki aykırı değerler görülebilir.
summary(df2)
## A B C
## Min. :28.15 Min. : 26.79 Min. :-1.00
## 1st Qu.:41.71 1st Qu.: 41.35 1st Qu.:43.01
## Median :48.07 Median : 50.82 Median :50.53
## Mean :48.63 Mean : 53.66 Mean :49.57
## 3rd Qu.:55.93 3rd Qu.: 56.73 3rd Qu.:57.14
## Max. :72.21 Max. :500.00 Max. :74.30
B değişkeninin maksimum değeri 500, C değişkeninin minimum değeri ise -1’dir. B değişkeninin histogramına bakalım.
hist(df2$B, breaks = 20)
Histogramdaki tüm değerler 0 ile 100 arasındadır fakat grafiğin en sağında tek bir gözlem bulunmakta. Muhtemelen 500 değeri yanlışıkla girilmiş olabilir diye düşünebiliriz.
Aykırı gözlemleri daha iyi görmek için bir boxplot çizdirelim. Boxplotta da görüleceği üzere 500 ve -1 değerleri birer aykırı gözlemlerdir.
boxplot(df2)
Sonuç
Tüm süreç boyunca veri manipülasyonu hakkında teorik bilgiler edindik. Artık önümüze veri geldiğinde neler yapacağımızı, hangi yaklaşımlarla hareket edeceğimizi biliyoruz. Bundan sonrasında bu teorik bilgilerimizi pratiğe dökme zamanı. Aşağıdaki üç aşamayı dikkatli bir şekilde uyguladığınızda daha bilinçli bir şekilde veri manipülasyonunu gerçekleştirebiliriz.
- Ham verileri keşfetmek
- Düzenli veri formatı – Tidy data
- Veriyi analizler için hazırlamak
Tüm bu teorik bilgileri bir hava durumu seti üzerinde uygulamasını yaptığımız bölüme de göz atarmanız, teorik bilgilerin pekişmesine yardımcı olacaktır. Ayrıca bu teorik bilgileri kendi veri setleriniz üzerinde denemeniz sizlere iyi bir deneyim kazandıracakır.
Uygulama linki aşağıdadır.
Kaynak: https://www.datacamp.com/courses/cleaning-data-in-r