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.

  1. Ham verileri keşfetmek
  2. Düzenli veri formatı – Tidy data
  3. 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.

  1. Değişkenlerin içerikleri önemlidir.
  2. Değişkenlerin aralıkları akla yatkın olmalıdır.
  3. 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.

4. Bölüm Sonu Canavarı

Tebrikler, bölüm sonu canavarını yendik ve veri bilimi maceramızda bir sonraki bölümlere geçmeye hak kazandık.

Düzenli verimize bir göz atalım.

head(weather5[1:8])
##         date    Events CloudCover Max.Dew.PointF Max.Gust.SpeedMPH
## 1 2014-12-01      Rain          6             46                29
## 2 2014-12-10      Rain          8             45                29
## 3 2014-12-11 Rain-Snow          8             37                28
## 4 2014-12-12      Snow          7             28                21
## 5 2014-12-13      None          5             28                23
## 6 2014-12-14      None          4             29                20
##   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
tail(weather5[1:8])
##           date Events CloudCover Max.Dew.PointF Max.Gust.SpeedMPH
## 361 2015-11-05   None          4             61                31
## 362 2015-11-06   None          4             62                32
## 363 2015-11-07   None          6             45                33
## 364 2015-11-08   None          0             34                25
## 365 2015-11-09   None          2             36                20
## 366 2015-12-01   Rain          7             43                17
##     Max.Humidity Max.Sea.Level.PressureIn Max.TemperatureF
## 361          100                    30.30               76
## 362           93                    30.07               73
## 363           57                    30.02               69
## 364           65                    30.38               56
## 365           70                    30.43               60
## 366           96                    30.40               45

Her bir satır bir gözlemi, her bir sütunda bir değişkeni temsil ediyor. date değişkeni bir zaman serisi olduğunu gösterirken, geri kalan değişkenler hava durumunu temsil eden özellikler diyebiliriz.

  • Peki neler öğrendik ?

Veriyi incelemeyi, Düzenli veri formatını, Tarih formatını ve değişken tipi dönüşümleri, Değişken etiketlendirmeleri, Eksik ve Aykırı gözlem ve bariz hata tespitini ve bunlar ile neler yapılacağını öğrenmiş olduk.

Şimdi tek yapmamız tüm öğrendiklerimizi diğer veriler üzerinde teker teker uygulamak.

Kaynak: https://www.datacamp.com/courses/cleaning-data-in-r

Yazar Hakkında
Toplam 18 yazı
Ekrem Bayar
Ekrem Bayar
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara