R ile Veri Manipülasyonu: Uygulama
Elimizde tarihsel Boston hava durumu verisi var.
- 2014 Aralık’tan başlayarak 12 aylık bir veri,
- Dirty Data formatında,
- Sütun isimleri birer değer,
- Değişkenler yanlış kodlanmış,
- Eksik ve Aykırı gözlemlerimiz bulunmakta,
- ve daha nice problemler.
AMACIMIZ: Veriyi analiz edebileceğimiz bir formata çevirmek.
Veri manipülasyonu için üç aşamayı takip edeceğiz.
- Ham verileri keşfetmek
- Düzenli veri formatı – Tidy data
- Veriyi analizler için hazırlamak
İlk olarak ham veriyi keşfetmemiz gerekiyor.
- Verinin yapısını anlamak,
- Veriyi gözlemlemek,
- Görselleştirme yapmak.
İkinci aşamamız ise düzenli veri prensiplerini uygulamak olacaktır.
Düzenli Veri Prensipleri – Gözlemler satır olmalıdır, – Değişkenler satır olmalıdır ve – Tablo başına gözlem birimi bir tür olmalıdır.
Üçüncü aşamamız ise veriyi analizler için hazırlayacağız.
- Tarih formatı
- Değişken dönüşümleri
- Eksik, Aykırı ve Beklenmeyen Gözlemler.
Yukarıdaki aşamaları teker teker uygulayarak weather veri setini düzenli hale getirelim.
1. Ham Veriyi Keşfetmek
- Verinin yüklenmesi.
weather <- readRDS("weather.rds")
class(), names(), dim() gibi fonksiyonlara girip işi uzatmadan str() veya dplyr kütüphanesinden glimpse() fonksiyonu ile verinin yapısını anlamaya çalışalım.
str(weather)
## 'data.frame': 286 obs. of 35 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ year : int 2014 2014 2014 2014 2014 2014 2014 2014 2014 2014 ...
## $ month : int 12 12 12 12 12 12 12 12 12 12 ...
## $ measure: chr "Max.TemperatureF" "Mean.TemperatureF" "Min.TemperatureF" "Max.Dew.PointF" ...
## $ X1 : chr "64" "52" "39" "46" ...
## $ X2 : chr "42" "38" "33" "40" ...
## $ X3 : chr "51" "44" "37" "49" ...
## $ X4 : chr "43" "37" "30" "24" ...
## $ X5 : chr "42" "34" "26" "37" ...
## $ X6 : chr "45" "42" "38" "45" ...
## $ X7 : chr "38" "30" "21" "36" ...
## $ X8 : chr "29" "24" "18" "28" ...
## $ X9 : chr "49" "39" "29" "49" ...
## $ X10 : chr "48" "43" "38" "45" ...
## $ X11 : chr "39" "36" "32" "37" ...
## $ X12 : chr "39" "35" "31" "28" ...
## $ X13 : chr "42" "37" "32" "28" ...
## $ X14 : chr "45" "39" "33" "29" ...
## $ X15 : chr "42" "37" "32" "33" ...
## $ X16 : chr "44" "40" "35" "42" ...
## $ X17 : chr "49" "45" "41" "46" ...
## $ X18 : chr "44" "40" "36" "34" ...
## $ X19 : chr "37" "33" "29" "25" ...
## $ X20 : chr "36" "32" "27" "30" ...
## $ X21 : chr "36" "33" "30" "30" ...
## $ X22 : chr "44" "39" "33" "39" ...
## $ X23 : chr "47" "45" "42" "45" ...
## $ X24 : chr "46" "44" "41" "46" ...
## $ X25 : chr "59" "52" "44" "58" ...
## $ X26 : chr "50" "44" "37" "31" ...
## $ X27 : chr "52" "45" "38" "34" ...
## $ X28 : chr "52" "46" "40" "42" ...
## $ X29 : chr "41" "36" "30" "26" ...
## $ X30 : chr "30" "26" "22" "10" ...
## $ X31 : chr "30" "25" "20" "8" ...
- str çıktısında elimizdeki verinin bir “Data Frame” formatında, 286 gözlem ve 35 değişkenden oluşan 286×35’lik boyutlu bir veri seti olduğunu görüyoruz.
- Değişkenlerimiz içerisinde çok fazla sayıda X’ler mevcut ve “year” ve “month” olarak tarihsel iki değişkenimizin olduğunu ve “measure” değişkenin de ise çok fazla sayıda tekil (unique) gözlemler olduğunu görüyoruz.
head(weather)
## X year month measure X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
## 1 1 2014 12 Max.TemperatureF 64 42 51 43 42 45 38 29 49 48 39 39
## 2 2 2014 12 Mean.TemperatureF 52 38 44 37 34 42 30 24 39 43 36 35
## 3 3 2014 12 Min.TemperatureF 39 33 37 30 26 38 21 18 29 38 32 31
## 4 4 2014 12 Max.Dew.PointF 46 40 49 24 37 45 36 28 49 45 37 28
## 5 5 2014 12 MeanDew.PointF 40 27 42 21 25 40 20 16 41 39 31 27
## 6 6 2014 12 Min.DewpointF 26 17 24 13 12 36 -3 3 28 37 27 25
## X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30
## 1 42 45 42 44 49 44 37 36 36 44 47 46 59 50 52 52 41 30
## 2 37 39 37 40 45 40 33 32 33 39 45 44 52 44 45 46 36 26
## 3 32 33 32 35 41 36 29 27 30 33 42 41 44 37 38 40 30 22
## 4 28 29 33 42 46 34 25 30 30 39 45 46 58 31 34 42 26 10
## 5 26 27 29 36 41 30 22 24 27 34 42 44 43 29 31 35 20 4
## 6 24 25 27 30 32 26 20 20 25 25 37 41 29 28 29 27 10 -6
## X31
## 1 30
## 2 25
## 3 20
## 4 8
## 5 5
## 6 1
tail(weather)
## X year month measure X1 X2 X3 X4 X5 X6 X7
## 281 281 2015 12 Mean.Wind.SpeedMPH 6 <NA> <NA> <NA> <NA> <NA> <NA>
## 282 282 2015 12 Max.Gust.SpeedMPH 17 <NA> <NA> <NA> <NA> <NA> <NA>
## 283 283 2015 12 PrecipitationIn 0.14 <NA> <NA> <NA> <NA> <NA> <NA>
## 284 284 2015 12 CloudCover 7 <NA> <NA> <NA> <NA> <NA> <NA>
## 285 285 2015 12 Events Rain <NA> <NA> <NA> <NA> <NA> <NA>
## 286 286 2015 12 WindDirDegrees 109 <NA> <NA> <NA> <NA> <NA> <NA>
## X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21
## 281 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 282 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 283 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 284 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 285 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 286 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## X22 X23 X24 X25 X26 X27 X28 X29 X30 X31
## 281 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 282 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 283 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 284 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 285 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## 286 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
Veriye küçük bir göz attığımızda ilk değişkenimizin herhangi bir anlam ifade etmediğini anlayabiliriz. Çok fazla sayıda X’imiz mevcut ve bunların ne anlama geldiğini bilmiyoruz. Buradaki X’ler yani sütun isimleri, aslında yeni değişkenimiz olacak olan günler değişkenini temsil edecek değerler olacaktır. Ayrıca measure değişkenine bakacak olursak, buradaki her bir değer aslında birer değişken ismi olmalıydı.
2. Tidy Data Süreci
Veriyi anladıktan sonra şimdi tidy data prensipleri ile veriyi düzenli hale getirmeye çalışalım. Bunun için tidyr paketine ihtiyacımız var.
library(tidyr)
Şimdi birinci problemimiz değişken isimleri yani X’ler aslında birer değerdir ve bu değerler ay içerisindeki günleri temisl ediyor. Bu yüzden gather fonksiyonunu devreye sokalım.
weather2 <- gather(weather, day, value, X1:X31, na.rm = TRUE)
head(weather2)
## X year month measure day value
## 1 1 2014 12 Max.TemperatureF X1 64
## 2 2 2014 12 Mean.TemperatureF X1 52
## 3 3 2014 12 Min.TemperatureF X1 39
## 4 4 2014 12 Max.Dew.PointF X1 46
## 5 5 2014 12 MeanDew.PointF X1 40
## 6 6 2014 12 Min.DewpointF X1 26
X’lerin değişken olma belasından kurtulduk. İlk değişkenimiz olan gereksiz X değişkenini ve day değişkeni içerisindeki X’leri kaldıralım.
weather2$X <- NULL # dplyr'dan select fonksyonu ile de X değişkeni çıkartılabilir.
head(weather2)
## year month measure day value
## 1 2014 12 Max.TemperatureF X1 64
## 2 2014 12 Mean.TemperatureF X1 52
## 3 2014 12 Min.TemperatureF X1 39
## 4 2014 12 Max.Dew.PointF X1 46
## 5 2014 12 MeanDew.PointF X1 40
## 6 2014 12 Min.DewpointF X1 26
stringr kütüpanesi ile “day” değişkenindeki tüm X’leri kaldıralım, elimizde sadece nümerik değerler olsun.
library(stringr)
weather2$day <- str_remove_all(weather2$day, "X")
head(weather2)
## year month measure day value
## 1 2014 12 Max.TemperatureF 1 64
## 2 2014 12 Mean.TemperatureF 1 52
## 3 2014 12 Min.TemperatureF 1 39
## 4 2014 12 Max.Dew.PointF 1 46
## 5 2014 12 MeanDew.PointF 1 40
## 6 2014 12 Min.DewpointF 1 26
İkinci büyük sorunumuz ise “measure” değişkeni. Buradaki değerler aslında birer değişken ismi olmalı. Bunu da yine tidyr’dan spread fonksiyonu ile halledebiliriz.
weather3 <- spread(weather2, measure, value)
Veriye bakmadan önce verinin yapısına bir bakalım.
dplyr::glimpse(weather3)
## Observations: 366
## Variables: 25
## $ year <int> 2014, 2014, 2014, 2014, 2014, 2014, ...
## $ month <int> 12, 12, 12, 12, 12, 12, 12, 12, 12, ...
## $ day <chr> "1", "10", "11", "12", "13", "14", "...
## $ CloudCover <chr> "6", "8", "8", "7", "5", "4", "2", "...
## $ Events <chr> "Rain", "Rain", "Rain-Snow", "Snow",...
## $ Max.Dew.PointF <chr> "46", "45", "37", "28", "28", "29", ...
## $ Max.Gust.SpeedMPH <chr> "29", "29", "28", "21", "23", "20", ...
## $ Max.Humidity <chr> "74", "100", "92", "85", "75", "82",...
## $ Max.Sea.Level.PressureIn <chr> "30.45", "29.58", "29.81", "29.88", ...
## $ Max.TemperatureF <chr> "64", "48", "39", "39", "42", "45", ...
## $ Max.VisibilityMiles <chr> "10", "10", "10", "10", "10", "10", ...
## $ Max.Wind.SpeedMPH <chr> "22", "23", "21", "16", "17", "15", ...
## $ Mean.Humidity <chr> "63", "95", "87", "75", "65", "68", ...
## $ Mean.Sea.Level.PressureIn <chr> "30.13", "29.5", "29.61", "29.85", "...
## $ Mean.TemperatureF <chr> "52", "43", "36", "35", "37", "39", ...
## $ Mean.VisibilityMiles <chr> "10", "3", "7", "10", "10", "10", "1...
## $ Mean.Wind.SpeedMPH <chr> "13", "13", "13", "11", "12", "10", ...
## $ MeanDew.PointF <chr> "40", "39", "31", "27", "26", "27", ...
## $ Min.DewpointF <chr> "26", "37", "27", "25", "24", "25", ...
## $ Min.Humidity <chr> "52", "89", "82", "64", "55", "53", ...
## $ Min.Sea.Level.PressureIn <chr> "30.01", "29.43", "29.44", "29.81", ...
## $ Min.TemperatureF <chr> "39", "38", "32", "31", "32", "33", ...
## $ Min.VisibilityMiles <chr> "10", "1", "1", "7", "10", "10", "10...
## $ PrecipitationIn <chr> "0.01", "0.28", "0.02", "T", "T", "0...
## $ WindDirDegrees <chr> "268", "357", "230", "286", "298", "...
Elimizdeki weather verisinin boyutu 286×35 iken düzenlemiş olduğumz weather3 verisinin boyutu ise 366×25 oldu. Ayrıca measure değişkenindeki tüm değerler ise birer değişken haline geldi ve kendilerine ait değerlere sahip oldular.
25 değişkenin hepsini yazdırmaya gerek olmadığından ilk 9 değikene bir bakalım istediğimiz formata gelmiş mi ?
head(weather3[1:9])
## year month day CloudCover Events Max.Dew.PointF Max.Gust.SpeedMPH
## 1 2014 12 1 6 Rain 46 29
## 2 2014 12 10 8 Rain 45 29
## 3 2014 12 11 8 Rain-Snow 37 28
## 4 2014 12 12 7 Snow 28 21
## 5 2014 12 13 5 28 23
## 6 2014 12 14 4 29 20
## Max.Humidity Max.Sea.Level.PressureIn
## 1 74 30.45
## 2 100 29.58
## 3 92 29.81
## 4 85 29.88
## 5 75 29.86
## 6 82 29.91
Evet istediğimiz formata sahip olduk gibi görünüyor.
3. Veriyi Analiz için Hazırlama
Analizlere geçmeden önce verinin yapısına tekrar bakalım ve nelere ihtiyacımız olduğunu görelim.
dplyr::glimpse(weather3)
## Observations: 366
## Variables: 25
## $ year <int> 2014, 2014, 2014, 2014, 2014, 2014, ...
## $ month <int> 12, 12, 12, 12, 12, 12, 12, 12, 12, ...
## $ day <chr> "1", "10", "11", "12", "13", "14", "...
## $ CloudCover <chr> "6", "8", "8", "7", "5", "4", "2", "...
## $ Events <chr> "Rain", "Rain", "Rain-Snow", "Snow",...
## $ Max.Dew.PointF <chr> "46", "45", "37", "28", "28", "29", ...
## $ Max.Gust.SpeedMPH <chr> "29", "29", "28", "21", "23", "20", ...
## $ Max.Humidity <chr> "74", "100", "92", "85", "75", "82",...
## $ Max.Sea.Level.PressureIn <chr> "30.45", "29.58", "29.81", "29.88", ...
## $ Max.TemperatureF <chr> "64", "48", "39", "39", "42", "45", ...
## $ Max.VisibilityMiles <chr> "10", "10", "10", "10", "10", "10", ...
## $ Max.Wind.SpeedMPH <chr> "22", "23", "21", "16", "17", "15", ...
## $ Mean.Humidity <chr> "63", "95", "87", "75", "65", "68", ...
## $ Mean.Sea.Level.PressureIn <chr> "30.13", "29.5", "29.61", "29.85", "...
## $ Mean.TemperatureF <chr> "52", "43", "36", "35", "37", "39", ...
## $ Mean.VisibilityMiles <chr> "10", "3", "7", "10", "10", "10", "1...
## $ Mean.Wind.SpeedMPH <chr> "13", "13", "13", "11", "12", "10", ...
## $ MeanDew.PointF <chr> "40", "39", "31", "27", "26", "27", ...
## $ Min.DewpointF <chr> "26", "37", "27", "25", "24", "25", ...
## $ Min.Humidity <chr> "52", "89", "82", "64", "55", "53", ...
## $ Min.Sea.Level.PressureIn <chr> "30.01", "29.43", "29.44", "29.81", ...
## $ Min.TemperatureF <chr> "39", "38", "32", "31", "32", "33", ...
## $ Min.VisibilityMiles <chr> "10", "1", "1", "7", "10", "10", "10...
## $ PrecipitationIn <chr> "0.01", "0.28", "0.02", "T", "T", "0...
## $ WindDirDegrees <chr> "268", "357", "230", "286", "298", "...
Elimizde tarih ile alakalı değişkenlerimiz ve hava durumu şartları ile ilgili değişkenlermiz var. Bu veri bir zaman serisi formatında olduğu için tarih değişkenleri integer veya character formatından çıkartılıp date formatına dönüştürülmeli. Bunun haricinde elimizde nümerik değerler alan değişkenlerimiz mevcut ve bunlar character formatında bunların da analizlerimiz için sayısal hale getirilmesi gereklidir.
- Tarih formatı
Öncelikle tarih değişkenlerini bir araya getirmek için tidyr kütüphanesinden unite() fonksiyonunu kullanmalıyız.
weather4 <- unite(weather3, date, year, month, day, sep = "-")
head(weather4[1:5])
## date CloudCover Events Max.Dew.PointF Max.Gust.SpeedMPH
## 1 2014-12-1 6 Rain 46 29
## 2 2014-12-10 8 Rain 45 29
## 3 2014-12-11 8 Rain-Snow 37 28
## 4 2014-12-12 7 Snow 28 21
## 5 2014-12-13 5 28 23
## 6 2014-12-14 4 29 20
Elde ettiğimiz date değişkeninin tipi nedir ?
class(weather4$date)
## [1] "character"
Bir karakter!
Tarih değişkenlerini R’da işleyebilmemiz için değişkenleri Date formatı haline getirmemiz gerekiyor. Bunun için de lubridate kütüphanesini kullanacağız.
library(lubridate)
##
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
##
## date
weather4$date <- ymd(weather4$date)
class(weather4$date)
## [1] "Date"
Bu işte tamam 🙂
Şimdi diğer değişkenleri de dönüştürme zamanı!
- Değişken dönüşümleri
head(weather4, 10)
## date CloudCover Events Max.Dew.PointF Max.Gust.SpeedMPH
## 1 2014-12-01 6 Rain 46 29
## 2 2014-12-10 8 Rain 45 29
## 3 2014-12-11 8 Rain-Snow 37 28
## 4 2014-12-12 7 Snow 28 21
## 5 2014-12-13 5 28 23
## 6 2014-12-14 4 29 20
## 7 2014-12-15 2 33 21
## 8 2014-12-16 8 Rain 42 10
## 9 2014-12-17 8 Rain 46 26
## 10 2014-12-18 7 Rain 34 30
## Max.Humidity Max.Sea.Level.PressureIn Max.TemperatureF
## 1 74 30.45 64
## 2 100 29.58 48
## 3 92 29.81 39
## 4 85 29.88 39
## 5 75 29.86 42
## 6 82 29.91 45
## 7 89 30.15 42
## 8 96 30.17 44
## 9 100 29.91 49
## 10 89 29.87 44
## Max.VisibilityMiles Max.Wind.SpeedMPH Mean.Humidity
## 1 10 22 63
## 2 10 23 95
## 3 10 21 87
## 4 10 16 75
## 5 10 17 65
## 6 10 15 68
## 7 10 15 75
## 8 10 8 85
## 9 10 20 85
## 10 10 23 73
## Mean.Sea.Level.PressureIn Mean.TemperatureF Mean.VisibilityMiles
## 1 30.13 52 10
## 2 29.5 43 3
## 3 29.61 36 7
## 4 29.85 35 10
## 5 29.82 37 10
## 6 29.83 39 10
## 7 30.05 37 10
## 8 30.09 40 9
## 9 29.75 45 6
## 10 29.78 40 10
## Mean.Wind.SpeedMPH MeanDew.PointF Min.DewpointF Min.Humidity
## 1 13 40 26 52
## 2 13 39 37 89
## 3 13 31 27 82
## 4 11 27 25 64
## 5 12 26 24 55
## 6 10 27 25 53
## 7 6 29 27 60
## 8 4 36 30 73
## 9 11 41 32 70
## 10 14 30 26 57
## Min.Sea.Level.PressureIn Min.TemperatureF Min.VisibilityMiles
## 1 30.01 39 10
## 2 29.43 38 1
## 3 29.44 32 1
## 4 29.81 31 7
## 5 29.78 32 10
## 6 29.78 33 10
## 7 29.91 32 10
## 8 29.92 35 5
## 9 29.69 41 1
## 10 29.71 36 10
## PrecipitationIn WindDirDegrees
## 1 0.01 268
## 2 0.28 357
## 3 0.02 230
## 4 T 286
## 5 T 298
## 6 0.00 306
## 7 0.00 324
## 8 T 79
## 9 0.43 311
## 10 0.01 281
Veriye tekrar bakınca bir şey karşımıza çıkıyor “PreciptationIn” değişkeninde ondalıklı sayılar ile birlikte “T” harfi de yer alıyor. Bu değişkeni nümerik hale getirebilir miyiz ?
as.numeric(weather4$PrecipitationIn)
## Warning: Zorlamadan dolayý ortaya çýkan NAs
## [1] 0.01 0.28 0.02 NA NA 0.00 0.00 NA 0.43 0.01 0.00 0.10 NA NA
## [15] 0.05 0.25 0.56 0.14 0.00 0.00 0.01 0.00 0.44 0.00 0.00 0.00 0.11 1.09
## [29] 0.13 0.03 2.90 0.00 0.00 0.00 0.20 0.00 NA 0.12 0.00 0.00 0.15 0.00
## [43] 0.00 0.00 0.00 NA 0.00 0.71 0.00 0.10 0.95 0.01 NA 0.62 0.06 0.05
## [57] 0.57 0.00 0.02 NA 0.00 0.01 0.00 0.05 0.01 0.03 0.00 0.23 0.39 0.00
## [71] 0.02 0.01 0.06 0.78 0.00 0.17 0.11 0.00 NA 0.07 0.02 0.00 0.00 0.00
## [85] 0.00 0.09 NA 0.07 0.37 0.88 0.17 0.06 0.01 0.00 0.00 0.80 0.27 0.00
## [99] 0.14 0.00 0.00 0.01 0.05 0.09 0.00 0.00 0.00 0.04 0.80 0.21 0.12 0.00
## [113] 0.26 NA 0.00 0.02 NA 0.00 0.00 NA 0.00 0.00 0.09 0.00 0.00 0.00
## [127] 0.01 0.00 0.00 0.06 0.00 0.00 0.00 0.61 0.54 NA 0.00 NA 0.00 0.00
## [141] 0.10 0.07 0.00 0.03 0.00 0.39 0.00 0.00 0.03 0.26 0.09 0.00 0.00 0.00
## [155] 0.02 0.00 0.00 0.00 NA 0.00 0.00 0.27 0.00 0.00 0.00 NA 0.00 0.00
## [169] NA 0.00 0.00 NA 0.00 0.00 0.00 0.91 0.00 0.02 0.00 0.00 0.00 0.00
## [183] 0.38 0.00 0.00 0.00 NA 0.00 0.40 NA 0.00 0.00 0.00 0.74 0.04 1.72
## [197] 0.00 0.01 0.00 0.00 NA 0.20 1.43 NA 0.00 0.00 0.00 NA 0.09 0.00
## [211] NA NA 0.50 1.12 0.00 0.00 0.00 0.03 NA 0.00 NA 0.14 NA 0.00
## [225] NA NA 0.00 0.00 0.01 0.00 NA 0.06 0.00 0.00 0.00 0.02 0.00 NA
## [239] 0.00 0.00 0.02 NA 0.15 NA 0.00 0.83 0.00 0.00 0.00 0.08 0.00 0.00
## [253] 0.14 0.00 0.00 0.00 0.63 NA 0.02 NA 0.00 NA 0.00 0.00 0.00 0.00
## [267] 0.00 0.00 0.49 0.00 0.00 0.00 0.00 0.00 0.00 0.17 0.66 0.01 0.38 0.00
## [281] 0.00 0.00 0.00 0.00 0.00 0.00 NA 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## [295] 0.00 0.04 0.01 2.46 NA 0.00 0.00 0.00 0.20 0.00 NA 0.00 0.00 0.00
## [309] 0.12 0.00 0.00 NA NA NA 0.00 0.08 NA 0.07 NA 0.00 0.00 0.03
## [323] 0.00 0.00 0.36 0.73 0.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.34 NA
## [337] 0.07 0.54 0.04 0.01 0.00 0.00 0.00 0.00 0.00 NA 0.00 0.86 0.00 0.30
## [351] 0.04 0.00 0.00 0.00 0.00 0.21 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## [365] 0.00 0.14
Böyle bir hata aldık.
Warning message: NAs introduced by coercion
Zorlanmadan kaynaklı harfleri NA – Eksik gözlem haline getirdi.
Bazen verilerde değişkenler içerisinde bu tarz değişkenler olabilir ve bu harfler aynı zamanda sayısal bir değeri temsil edyor olabilir. Buradaki PrecipitationIn değişkeni yağışı temsil etmekte ve “T” gözlemi de çok küçük ifade anlamına geliyor. Bu yüzden “T” harfi yerine bu gözlemlere 0 – sıfır yazdırırsak bu sorunda ortadan kalkmış olur.
weather4$PrecipitationIn <- str_replace_all(weather4$PrecipitationIn,"T","0")
head(weather4$PrecipitationIn, 10)
## [1] "0.01" "0.28" "0.02" "0" "0" "0.00" "0.00" "0" "0.43" "0.01"
Son olarak character formatında olan tüm sayısal değişkenleri numeric formatına dönüştürelim. Bunu da dplyr kütüphanesinden yardım alarak yapabiliriz.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:lubridate':
##
## intersect, setdiff, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
weather4 <- weather4 %>% select(date, Events, everything())
weather5 <- mutate_at(weather4, vars(CloudCover:WindDirDegrees), funs(as.numeric))
glimpse(weather5)
## Observations: 366
## Variables: 23
## $ date <date> 2014-12-01, 2014-12-10, 2014-12-11,...
## $ Events <chr> "Rain", "Rain", "Rain-Snow", "Snow",...
## $ CloudCover <dbl> 6, 8, 8, 7, 5, 4, 2, 8, 8, 7, 4, 7, ...
## $ Max.Dew.PointF <dbl> 46, 45, 37, 28, 28, 29, 33, 42, 46, ...
## $ Max.Gust.SpeedMPH <dbl> 29, 29, 28, 21, 23, 20, 21, 10, 26, ...
## $ Max.Humidity <dbl> 74, 100, 92, 85, 75, 82, 89, 96, 100...
## $ Max.Sea.Level.PressureIn <dbl> 30.45, 29.58, 29.81, 29.88, 29.86, 2...
## $ Max.TemperatureF <dbl> 64, 48, 39, 39, 42, 45, 42, 44, 49, ...
## $ Max.VisibilityMiles <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, ...
## $ Max.Wind.SpeedMPH <dbl> 22, 23, 21, 16, 17, 15, 15, 8, 20, 2...
## $ Mean.Humidity <dbl> 63, 95, 87, 75, 65, 68, 75, 85, 85, ...
## $ Mean.Sea.Level.PressureIn <dbl> 30.13, 29.50, 29.61, 29.85, 29.82, 2...
## $ Mean.TemperatureF <dbl> 52, 43, 36, 35, 37, 39, 37, 40, 45, ...
## $ Mean.VisibilityMiles <dbl> 10, 3, 7, 10, 10, 10, 10, 9, 6, 10, ...
## $ Mean.Wind.SpeedMPH <dbl> 13, 13, 13, 11, 12, 10, 6, 4, 11, 14...
## $ MeanDew.PointF <dbl> 40, 39, 31, 27, 26, 27, 29, 36, 41, ...
## $ Min.DewpointF <dbl> 26, 37, 27, 25, 24, 25, 27, 30, 32, ...
## $ Min.Humidity <dbl> 52, 89, 82, 64, 55, 53, 60, 73, 70, ...
## $ Min.Sea.Level.PressureIn <dbl> 30.01, 29.43, 29.44, 29.81, 29.78, 2...
## $ Min.TemperatureF <dbl> 39, 38, 32, 31, 32, 33, 32, 35, 41, ...
## $ Min.VisibilityMiles <dbl> 10, 1, 1, 7, 10, 10, 10, 5, 1, 10, 1...
## $ PrecipitationIn <dbl> 0.01, 0.28, 0.02, 0.00, 0.00, 0.00, ...
## $ WindDirDegrees <dbl> 268, 357, 230, 286, 298, 306, 324, 7...
veya apply ailesinden bir üyeyi kullanabiliriz.
glimpse(
cbind(
weather4[1:2], # İlk iki değişken date ve Events
lapply(weather4[3:23], as.numeric) # Geri kalanlar nümerik hale getirilir.
))
## Observations: 366
## Variables: 23
## $ date <date> 2014-12-01, 2014-12-10, 2014-12-11,...
## $ Events <chr> "Rain", "Rain", "Rain-Snow", "Snow",...
## $ CloudCover <dbl> 6, 8, 8, 7, 5, 4, 2, 8, 8, 7, 4, 7, ...
## $ Max.Dew.PointF <dbl> 46, 45, 37, 28, 28, 29, 33, 42, 46, ...
## $ Max.Gust.SpeedMPH <dbl> 29, 29, 28, 21, 23, 20, 21, 10, 26, ...
## $ Max.Humidity <dbl> 74, 100, 92, 85, 75, 82, 89, 96, 100...
## $ Max.Sea.Level.PressureIn <dbl> 30.45, 29.58, 29.81, 29.88, 29.86, 2...
## $ Max.TemperatureF <dbl> 64, 48, 39, 39, 42, 45, 42, 44, 49, ...
## $ Max.VisibilityMiles <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, ...
## $ Max.Wind.SpeedMPH <dbl> 22, 23, 21, 16, 17, 15, 15, 8, 20, 2...
## $ Mean.Humidity <dbl> 63, 95, 87, 75, 65, 68, 75, 85, 85, ...
## $ Mean.Sea.Level.PressureIn <dbl> 30.13, 29.50, 29.61, 29.85, 29.82, 2...
## $ Mean.TemperatureF <dbl> 52, 43, 36, 35, 37, 39, 37, 40, 45, ...
## $ Mean.VisibilityMiles <dbl> 10, 3, 7, 10, 10, 10, 10, 9, 6, 10, ...
## $ Mean.Wind.SpeedMPH <dbl> 13, 13, 13, 11, 12, 10, 6, 4, 11, 14...
## $ MeanDew.PointF <dbl> 40, 39, 31, 27, 26, 27, 29, 36, 41, ...
## $ Min.DewpointF <dbl> 26, 37, 27, 25, 24, 25, 27, 30, 32, ...
## $ Min.Humidity <dbl> 52, 89, 82, 64, 55, 53, 60, 73, 70, ...
## $ Min.Sea.Level.PressureIn <dbl> 30.01, 29.43, 29.44, 29.81, 29.78, 2...
## $ Min.TemperatureF <dbl> 39, 38, 32, 31, 32, 33, 32, 35, 41, ...
## $ Min.VisibilityMiles <dbl> 10, 1, 1, 7, 10, 10, 10, 5, 1, 10, 1...
## $ PrecipitationIn <dbl> 0.01, 0.28, 0.02, 0.00, 0.00, 0.00, ...
## $ WindDirDegrees <dbl> 268, 357, 230, 286, 298, 306, 324, 7...
- Eksik, Aykırı ve Beklenmeyen Gözlemler.
Eksik Gözlemler,
Verimizde kaç tane eksik gözlem var?
sum(is.na(weather5))
## [1] 6
summary(weather5)
## date Events CloudCover Max.Dew.PointF
## Min. :2014-12-01 Length:366 Min. :0.000 Min. :-6.00
## 1st Qu.:2015-03-02 Class :character 1st Qu.:3.000 1st Qu.:32.00
## Median :2015-06-01 Mode :character Median :5.000 Median :47.50
## Mean :2015-06-01 Mean :4.708 Mean :45.48
## 3rd Qu.:2015-08-31 3rd Qu.:7.000 3rd Qu.:61.00
## Max. :2015-12-01 Max. :8.000 Max. :75.00
##
## Max.Gust.SpeedMPH Max.Humidity Max.Sea.Level.PressureIn
## Min. : 0.00 Min. : 39.00 Min. :29.58
## 1st Qu.:21.00 1st Qu.: 73.25 1st Qu.:30.00
## Median :25.50 Median : 86.00 Median :30.14
## Mean :26.99 Mean : 85.69 Mean :30.16
## 3rd Qu.:31.25 3rd Qu.: 93.00 3rd Qu.:30.31
## Max. :94.00 Max. :1000.00 Max. :30.88
## NA's :6
## Max.TemperatureF Max.VisibilityMiles Max.Wind.SpeedMPH Mean.Humidity
## Min. :18.00 Min. : 2.000 Min. : 8.00 Min. :28.00
## 1st Qu.:42.00 1st Qu.:10.000 1st Qu.:16.00 1st Qu.:56.00
## Median :60.00 Median :10.000 Median :20.00 Median :66.00
## Mean :58.93 Mean : 9.907 Mean :20.62 Mean :66.02
## 3rd Qu.:76.00 3rd Qu.:10.000 3rd Qu.:24.00 3rd Qu.:76.75
## Max. :96.00 Max. :10.000 Max. :38.00 Max. :98.00
##
## Mean.Sea.Level.PressureIn Mean.TemperatureF Mean.VisibilityMiles
## Min. :29.49 Min. : 8.00 Min. :-1.000
## 1st Qu.:29.87 1st Qu.:36.25 1st Qu.: 8.000
## Median :30.03 Median :53.50 Median :10.000
## Mean :30.04 Mean :51.40 Mean : 8.861
## 3rd Qu.:30.19 3rd Qu.:68.00 3rd Qu.:10.000
## Max. :30.77 Max. :84.00 Max. :10.000
##
## Mean.Wind.SpeedMPH MeanDew.PointF Min.DewpointF Min.Humidity
## Min. : 4.00 Min. :-11.00 Min. :-18.00 Min. :16.00
## 1st Qu.: 8.00 1st Qu.: 24.00 1st Qu.: 16.25 1st Qu.:35.00
## Median :10.00 Median : 41.00 Median : 35.00 Median :46.00
## Mean :10.68 Mean : 38.96 Mean : 32.25 Mean :48.31
## 3rd Qu.:13.00 3rd Qu.: 56.00 3rd Qu.: 51.00 3rd Qu.:60.00
## Max. :22.00 Max. : 71.00 Max. : 68.00 Max. :96.00
##
## Min.Sea.Level.PressureIn Min.TemperatureF Min.VisibilityMiles
## Min. :29.16 Min. :-3.00 Min. : 0.000
## 1st Qu.:29.76 1st Qu.:30.00 1st Qu.: 2.000
## Median :29.94 Median :46.00 Median :10.000
## Mean :29.93 Mean :43.33 Mean : 6.716
## 3rd Qu.:30.09 3rd Qu.:60.00 3rd Qu.:10.000
## Max. :30.64 Max. :74.00 Max. :10.000
##
## PrecipitationIn WindDirDegrees
## Min. :0.0000 Min. : 1.0
## 1st Qu.:0.0000 1st Qu.:113.0
## Median :0.0000 Median :222.0
## Mean :0.1016 Mean :200.1
## 3rd Qu.:0.0400 3rd Qu.:275.0
## Max. :2.9000 Max. :360.0
##
6 eksik gözlemin 6’sı da Max.Gust.SpeedMPH değişkeninde yer alıyor.
Aykırı gözlemler, beklenmeyen gözlemler ve bariz hatalar bu maddeleri kontrol etmemiz gerekiyor. Her bir değişkenin neyi temsil ettiğini iyice anladıktan sonra bu işlemleri yapmalıyız.
- Değişkenlerin içerikleri önemlidir.
- Değişkenlerin aralıkları akla yatkın olmalıdır.
- Veri seti ölçütleri doğrulanmalıdır.
Bizim weather veri setimizde nümerik değerlerin olması gerekir ve her bir değişken bir etiket olarak bir değeri temsil eder.
Yüzdelikler (0-100) arasına olmalıdır. Temperatures Fahrenheit derecesi olarak, Wind Speed miles per hour olarak, Pressures inches of mercury olarak Distance miles olarak, Eigths cloud cover olarak belirtilmiştir.
Max.Humidity değişkeninin özetine baktığımızda maksimum değerinin 1000 olduğunu görüyoruz. Muhtemelen burada bir tane sıfır fazladan eklenmiş. Bu yüzden 1000 yerine sıfır yazdırmamız daha makul olur.
weather5$Max.Humidity[which(weather5$Max.Humidity == 1000)] <- 100
Bir başka sorun Mean.VisibilityMiles değişkeninde minimum değerin negatif bir sayı olması. Burada da medyanı negatif değere atayalım.
weather5$Mean.VisibilityMiles[which(weather5$Mean.VisibilityMiles == -1)] <- 10
Events değişkeninde eksik gözlem olduğunu görüyoruz ama bunlar NA olarak karşımıza çıkmıyor. Bu yüzden bu boşluk olan gözlemlere “None” diye br değer atayalım.
weather5$Events[weather5$Events == ""] <- "None"
Son bir kez verinin özetine bakalım.
summary(weather5)
## date Events CloudCover Max.Dew.PointF
## Min. :2014-12-01 Length:366 Min. :0.000 Min. :-6.00
## 1st Qu.:2015-03-02 Class :character 1st Qu.:3.000 1st Qu.:32.00
## Median :2015-06-01 Mode :character Median :5.000 Median :47.50
## Mean :2015-06-01 Mean :4.708 Mean :45.48
## 3rd Qu.:2015-08-31 3rd Qu.:7.000 3rd Qu.:61.00
## Max. :2015-12-01 Max. :8.000 Max. :75.00
##
## Max.Gust.SpeedMPH Max.Humidity Max.Sea.Level.PressureIn
## Min. : 0.00 Min. : 39.00 Min. :29.58
## 1st Qu.:21.00 1st Qu.: 73.25 1st Qu.:30.00
## Median :25.50 Median : 86.00 Median :30.14
## Mean :26.99 Mean : 83.23 Mean :30.16
## 3rd Qu.:31.25 3rd Qu.: 93.00 3rd Qu.:30.31
## Max. :94.00 Max. :100.00 Max. :30.88
## NA's :6
## Max.TemperatureF Max.VisibilityMiles Max.Wind.SpeedMPH Mean.Humidity
## Min. :18.00 Min. : 2.000 Min. : 8.00 Min. :28.00
## 1st Qu.:42.00 1st Qu.:10.000 1st Qu.:16.00 1st Qu.:56.00
## Median :60.00 Median :10.000 Median :20.00 Median :66.00
## Mean :58.93 Mean : 9.907 Mean :20.62 Mean :66.02
## 3rd Qu.:76.00 3rd Qu.:10.000 3rd Qu.:24.00 3rd Qu.:76.75
## Max. :96.00 Max. :10.000 Max. :38.00 Max. :98.00
##
## Mean.Sea.Level.PressureIn Mean.TemperatureF Mean.VisibilityMiles
## Min. :29.49 Min. : 8.00 Min. : 1.000
## 1st Qu.:29.87 1st Qu.:36.25 1st Qu.: 8.000
## Median :30.03 Median :53.50 Median :10.000
## Mean :30.04 Mean :51.40 Mean : 8.891
## 3rd Qu.:30.19 3rd Qu.:68.00 3rd Qu.:10.000
## Max. :30.77 Max. :84.00 Max. :10.000
##
## Mean.Wind.SpeedMPH MeanDew.PointF Min.DewpointF Min.Humidity
## Min. : 4.00 Min. :-11.00 Min. :-18.00 Min. :16.00
## 1st Qu.: 8.00 1st Qu.: 24.00 1st Qu.: 16.25 1st Qu.:35.00
## Median :10.00 Median : 41.00 Median : 35.00 Median :46.00
## Mean :10.68 Mean : 38.96 Mean : 32.25 Mean :48.31
## 3rd Qu.:13.00 3rd Qu.: 56.00 3rd Qu.: 51.00 3rd Qu.:60.00
## Max. :22.00 Max. : 71.00 Max. : 68.00 Max. :96.00
##
## Min.Sea.Level.PressureIn Min.TemperatureF Min.VisibilityMiles
## Min. :29.16 Min. :-3.00 Min. : 0.000
## 1st Qu.:29.76 1st Qu.:30.00 1st Qu.: 2.000
## Median :29.94 Median :46.00 Median :10.000
## Mean :29.93 Mean :43.33 Mean : 6.716
## 3rd Qu.:30.09 3rd Qu.:60.00 3rd Qu.:10.000
## Max. :30.64 Max. :74.00 Max. :10.000
##
## PrecipitationIn WindDirDegrees
## Min. :0.0000 Min. : 1.0
## 1st Qu.:0.0000 1st Qu.:113.0
## Median :0.0000 Median :222.0
## Mean :0.1016 Mean :200.1
## 3rd Qu.:0.0400 3rd Qu.:275.0
## Max. :2.9000 Max. :360.0
##
Özetleri incelediğimizde çok büyük bir sıkıntı yok gibi duruyor. Daha fazla uzatmamak adına görselleştirme kısmına girmiyorum. Histogram, boxplot ve scatterplotlara bakara değişkenlerin derinine inebilirsiniz.