Eksplor Data

Eksplor Data

Yes! Selamat datang lagi hehe. Pada kesempatan ini saya akan menggunakan dataset weather dari package rattle. Teman2 dapat mengunduh di tautan berikut. Silahkan!! download data.

Pada materi ini sesuai dengan judul nya ‘eksplor data’ haha berarti nanti kita akan belajar bersama mulai dari nge-describe dan mengvisualkan data. Yeho! Mari mulai.

Input Data

library(rattle)
library(magrittr)
library(Hmisc)
library(fBasics)
fname <- "file:///C:/Users/Husein-PC/Documents/R/win-library/3.4/rattle.data/csv/weather.csv" 
crs$dataset <- read.csv(fname)
str(crs$dataset)
## 'data.frame':    366 obs. of  24 variables:
##  $ Date         : Factor w/ 366 levels "2007-11-01","2007-11-02",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ Location     : Factor w/ 1 level "Canberra": 1 1 1 1 1 1 1 1 1 1 ...
##  $ MinTemp      : num  8 14 13.7 13.3 7.6 6.2 6.1 8.3 8.8 8.4 ...
##  $ MaxTemp      : num  24.3 26.9 23.4 15.5 16.1 16.9 18.2 17 19.5 22.8 ...
##  $ Rainfall     : num  0 3.6 3.6 39.8 2.8 0 0.2 0 0 16.2 ...
##  $ Evaporation  : num  3.4 4.4 5.8 7.2 5.6 5.8 4.2 5.6 4 5.4 ...
##  $ Sunshine     : num  6.3 9.7 3.3 9.1 10.6 8.2 8.4 4.6 4.1 7.7 ...
##  $ WindGustDir  : Factor w/ 16 levels "E","ENE","ESE",..: 8 2 8 8 11 10 10 1 9 1 ...
##  $ WindGustSpeed: int  30 39 85 54 50 44 43 41 48 31 ...
##  $ WindDir9am   : Factor w/ 16 levels "E","ENE","ESE",..: 13 1 4 15 11 10 10 10 1 9 ...
##  $ WindDir3pm   : Factor w/ 16 levels "E","ENE","ESE",..: 8 14 6 14 3 1 3 1 2 3 ...
##  $ WindSpeed9am : int  6 4 6 30 20 20 19 11 19 7 ...
##  $ WindSpeed3pm : int  20 17 6 24 28 24 26 24 17 6 ...
##  $ Humidity9am  : int  68 80 82 62 68 70 63 65 70 82 ...
##  $ Humidity3pm  : int  29 36 69 56 49 57 47 57 48 32 ...
##  $ Pressure9am  : num  1020 1012 1010 1006 1018 ...
##  $ Pressure3pm  : num  1015 1008 1007 1007 1018 ...
##  $ Cloud9am     : int  7 5 8 2 7 7 4 6 7 7 ...
##  $ Cloud3pm     : int  7 3 7 7 7 5 6 7 7 1 ...
##  $ Temp9am      : num  14.4 17.5 15.4 13.5 11.1 10.9 12.4 12.1 14.1 13.3 ...
##  $ Temp3pm      : num  23.6 25.7 20.2 14.1 15.4 14.8 17.3 15.5 18.9 21.7 ...
##  $ RainToday    : Factor w/ 2 levels "No","Yes": 1 2 2 2 2 1 1 1 1 2 ...
##  $ RISK_MM      : num  3.6 3.6 39.8 2.8 0 0.2 0 0 16.2 0 ...
##  $ RainTomorrow : Factor w/ 2 levels "No","Yes": 2 2 2 2 1 1 1 1 2 1 ...

Ringkasan Data

summary(crs$dataset[7:9])
##     Sunshine       WindGustDir  WindGustSpeed  
##  Min.   : 0.000   NW     : 73   Min.   :13.00  
##  1st Qu.: 5.950   NNW    : 44   1st Qu.:31.00  
##  Median : 8.600   E      : 37   Median :39.00  
##  Mean   : 7.909   WNW    : 35   Mean   :39.84  
##  3rd Qu.:10.500   ENE    : 30   3rd Qu.:46.00  
##  Max.   :13.600   (Other):144   Max.   :98.00  
##  NA's   :3        NA's   :  3   NA's   :2
describe(crs$dataset[7])
## crs$dataset[7] 
## 
##  1  Variables      366  Observations
## ---------------------------------------------------------------------------
## Sunshine 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      363        3      114        1    7.909    3.875     0.60     2.04 
##      .25      .50      .75      .90      .95 
##     5.95     8.60    10.50    11.80    12.60 
## 
## lowest :  0.0  0.1  0.2  0.3  0.4, highest: 13.1 13.2 13.3 13.5 13.6
## ---------------------------------------------------------------------------
basicStats(crs$dataset$Sunshine)
##             X..crs.dataset.Sunshine
## nobs                     366.000000
## NAs                        3.000000
## Minimum                    0.000000
## Maximum                   13.600000
## 1. Quartile                5.950000
## 3. Quartile               10.500000
## Mean                       7.909366
## Median                     8.600000
## Sum                     2871.100000
## SE Mean                    0.182732
## LCL Mean                   7.550016
## UCL Mean                   8.268716
## Variance                  12.120962
## Stdev                      3.481517
## Skewness                  -0.723454
## Kurtosis                  -0.270625

Nah. jadi summary adalah command paling sederhana untuk menyediakan ringkasan statistik data kita. Nanti akan muncul beberapa gambaran statistik tiap variabel. Untuk variabel numerik summary() menyediakan keluaran min, max, quartile, median dan missing value. kalau untuk variabel kategorik, keluaran yang diberikan adalah jumlah masing-masing kategorik pada variabel tersebut. perhatiin outputnya deh!^^

Selanjutnya, kalau perintah describe() itu bawaan daari package Hmisc (jangan sambil bersin bacanya). Hasil outputnya lebih rinci sedikit dari summary(). Disana ada nilai desil (10% dan 90%) sama ada nilai persentilnya juga. Kemudian, ada informasi tambahan berupa keluaran kontinyu data terendah dan tertinggi.

satu lagi! perintah basicStats() menyediakan output yang lebih lengkap dari kedua perintah sebelumnya. Coba di perhatiin aja klo ga percaya.

Visualisasi

Histogram

p01 <- crs %>%
  with(dataset) %>%
  dplyr::mutate(RainTomorrow=as.factor(RainTomorrow)) %>%
  dplyr::select(Sunshine, RainTomorrow) %>%
  ggplot2::ggplot(ggplot2::aes(x=Sunshine)) +
  ggplot2::geom_density(lty=3) +
  ggplot2::geom_histogram(ggplot2::aes(fill=RainTomorrow, colour=RainTomorrow), alpha=0.55) +
  ggplot2::xlab("Sunshine\n\nHusain-PC") +
  ggplot2::ggtitle("Distribution of Sunshine (sample)\nby RainTomorrow") +
  ggplot2::labs(fill="RainTomorrow", y="Frekuensi")
gridExtra::grid.arrange(p01) #memunculkan plot

Kita dapat melihat sebaran data variabel sunshine berdasarkan variabel RainTomorrow. Nampak terlihat jelas perbedaan sebaran data status besok hujan dan tidaknya. Jika dilihat dari jumlah status ‘ya’ pada variabel RainTomorrow memang lebih sedikit dibandingkan status ‘tidak’. Sebaran data sunshine berada pada range 7 hingga 15 dan sebagian besar range tersebut tidak hujan.

Cummulative distribution plot

# Membuat plot cdf variabel 'MaxTemp'
ds <- rbind(data.frame(dat=crs$dataset[,"MaxTemp"], grp="All"),
            data.frame(dat=crs$dataset[crs$dataset$RainTomorrow=="No","MaxTemp"], grp="No"),
            data.frame(dat=crs$dataset[crs$dataset$RainTomorrow=="Yes","MaxTemp"], grp="Yes"))
# Memunculkan plot cdf
Ecdf(ds[ds$grp=="All",1], col="#E495A5", xlab="MaxTemp", lwd=2, ylab=expression(Proportion <= x), subtitles=FALSE)
Ecdf(ds[ds$grp=="No",1], col="#86B875", lty=2, xlab="", lwd=2, subtitles=FALSE, add=TRUE)
Ecdf(ds[ds$grp=="Yes",1], col="#7DB0DD", lty=3, xlab="", lwd=2, subtitles=FALSE, add=TRUE)
legend("bottomright", c("All","No","Yes"), bty="n",  col=colorspace::rainbow_hcl(3) , lwd=2, lty=1:3, inset=c(0.05,0.05))
title(main="Distribution of MaxTemp (sample)\nby RainTomorrow")

Gambar diatas merupakan plot cdf MaxTemp berdasarkan status RainTomorrow. Kita dapat melihat dengan jelas perbedaan antara 2 garis respresentatif status yes dan no. Nilai MaxTemp yang rendah berasosiasi dengan status tidak hujan keesokan harinya. Pun begitu sebaliknya.

Box Plot

# Membuat box plot variabbel 'Evaporation'
p01 <- crs %>%
  with(dataset) %>%
  dplyr::mutate(RainTomorrow=as.factor(RainTomorrow)) %>%
  ggplot2::ggplot(ggplot2::aes(y=Evaporation)) +
  ggplot2::geom_boxplot(ggplot2::aes(x="All"), notch=TRUE, fill="grey") +
  ggplot2::stat_summary(ggplot2::aes(x="All"), fun.y=mean, geom="point", shape=8) +
  ggplot2::geom_boxplot(ggplot2::aes(x=RainTomorrow, fill=RainTomorrow), notch=TRUE) +
  ggplot2::stat_summary(ggplot2::aes(x=RainTomorrow), fun.y=mean, geom="point", shape=8) +
  ggplot2::ggtitle("Distribution of Evaporation (sample)\nby RainTomorrow") +
  ggplot2::theme(legend.position="none")
gridExtra::grid.arrange(p01)

Garis horizontal di tengah box merepresentasikan nilai median atau quartile 2 (q2). berdasarkan gambar diatas maka nilai median status yes lebih tinggi diantara yang lain. maka nilai evaporasi yang tinggi berasosiasi dengan status hujan keesokan harinya.

Plot Korelasi

library(corrplot, quietly=TRUE)
vars <- c(3,4,5,6,7,9,12,13,14,15,16)
crs$cor <- cor(crs$dataset[vars], use = "pairwise", method = "pearson")
crs$cor
##                   MinTemp     MaxTemp     Rainfall  Evaporation
## MinTemp        1.00000000  0.75247079  0.201938716  0.649930175
## MaxTemp        0.75247079  1.00000000 -0.073559584  0.690026268
## Rainfall       0.20193872 -0.07355958  1.000000000 -0.007292963
## Evaporation    0.64993018  0.69002627 -0.007292963  1.000000000
## Sunshine       0.03571111  0.45206352 -0.150990361  0.318025230
## WindGustSpeed  0.21801955  0.10967234  0.096190406  0.288477489
## WindSpeed9am   0.12754211 -0.21681434  0.219637055  0.068928900
## WindSpeed3pm  -0.06592182 -0.16787312  0.056008488  0.048601300
## Humidity9am   -0.20789714 -0.35960171  0.150108950 -0.519586660
## Humidity3pm   -0.04070877 -0.53332688  0.289013411 -0.391779645
## Pressure9am   -0.50170701 -0.29088256 -0.331581354 -0.381905999
##                   Sunshine WindGustSpeed WindSpeed9am WindSpeed3pm
## MinTemp        0.035711113    0.21801955   0.12754211  -0.06592182
## MaxTemp        0.452063516    0.10967234  -0.21681434  -0.16787312
## Rainfall      -0.150990361    0.09619041   0.21963705   0.05600849
## Evaporation    0.318025230    0.28847749   0.06892890   0.04860130
## Sunshine       1.000000000    0.09584272  -0.06452235   0.07257280
## WindGustSpeed  0.095842717    1.00000000   0.52765303   0.69394458
## WindSpeed9am  -0.064522350    0.52765303   1.00000000   0.47296617
## WindSpeed3pm   0.072572802    0.69394458   0.47296617   1.00000000
## Humidity9am   -0.499017450   -0.34979307  -0.27062286  -0.26609247
## Humidity3pm   -0.759429203   -0.06943918   0.14665712  -0.02636775
## Pressure9am    0.006276442   -0.54018010  -0.35633183  -0.35980011
##               Humidity9am Humidity3pm  Pressure9am
## MinTemp        -0.2078971 -0.04070877 -0.501707010
## MaxTemp        -0.3596017 -0.53332688 -0.290882563
## Rainfall        0.1501089  0.28901341 -0.331581354
## Evaporation    -0.5195867 -0.39177965 -0.381905999
## Sunshine       -0.4990174 -0.75942920  0.006276442
## WindGustSpeed  -0.3497931 -0.06943918 -0.540180097
## WindSpeed9am   -0.2706229  0.14665712 -0.356331828
## WindSpeed3pm   -0.2660925 -0.02636775 -0.359800112
## Humidity9am     1.0000000  0.54671844  0.135726974
## Humidity3pm     0.5467184  1.00000000 -0.087946135
## Pressure9am     0.1357270 -0.08794614  1.000000000
corrplot(crs$cor, method = "circle")

Korelasi untuk mengukur seberapa kuat hubungan antara 2 variabel. Pada visualisasi diatas semakin kuat hubungannya maka ukuran lingkarannya semakin besar dan berwarna biru gelap. Adapun range nilai korelasi dikatakan kuat jika mendekati 1 atau -1 dan dikatakan lemah (atau bahkan dikatakan tidak ada hubungan) jika mendekati 0.

# Menggabungkan korelogram dengan tingkat signifikansi
cor.mtest <- function(mat, ...) {
  mat <- as.matrix(mat)
  n <- ncol(mat)
  p.mat<- matrix(NA, n, n)
  diag(p.mat) <- 0
  for (i in 1:(n - 1)) {
    for (j in (i + 1):n) {
      tmp <- cor.test(mat[, i], mat[, j], ...)
      p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
    }
  }
  colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
  p.mat
}
p.mat <- cor.mtest(crs$dataset[vars])
head(p.mat[, 1:5])
##                    MinTemp      MaxTemp     Rainfall  Evaporation
## MinTemp       0.000000e+00 5.347541e-68 0.0001001403 2.639373e-45
## MaxTemp       5.347541e-68 0.000000e+00 0.1602095744 4.771650e-53
## Rainfall      1.001403e-04 1.602096e-01 0.0000000000 8.894129e-01
## Evaporation   2.639373e-45 4.771650e-53 0.8894128579 0.000000e+00
## Sunshine      4.976082e-01 1.102438e-19 0.0039343356 5.646553e-10
## WindGustSpeed 2.718842e-05 3.648049e-02 0.0667822580 2.089050e-08
##                   Sunshine
## MinTemp       4.976082e-01
## MaxTemp       1.102438e-19
## Rainfall      3.934336e-03
## Evaporation   5.646553e-10
## Sunshine      0.000000e+00
## WindGustSpeed 6.892893e-02
corrplot(crs$cor, type="lower", order="hclust", 
         p.mat = p.mat, sig.level = 0.05)

Nah kalau gambar diatas ini lebih memudahkan untuk pengambilan hipotesis. karena menggunakan nilai signifikansi. maka gambar yang ada tanda silang tidak lolos hipotesis.

Sekian postingan kali ini. Semoga bermanfaat, ingatkan kalau ada yang keliru. kan sama-sama belajar~


Referensi:

Graham William. 2011. Data Mining with Rattle and R. The Art of Excavating Data for Knowledge Discovery. New York: Springer Science.

Terpopuler