Eksplor Data
Ahmad Husain A
1 Februari 2018
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.