Exploratory Data Analysis (EDA) adalah bagian dari proses data science. EDA menjadi sangat penting sebelum melakukan feature engineering dan modeling karena dalam tahap ini kita harus memahami datanya terlebih dahulu.
Exploratory Data Analysis mengacu pada proses kritis dalam melakukan investigasi awal pada data untuk menemukan pola, untuk menemukan anomali, untuk menguji hipotesis dan untuk memeriksa asumsi dengan bantuan statistik ringkasan dan representasi grafis. Dengan melakukan EDA, kita dapat lebih memahami kondisi dataset yang kita miliki.
library(heatmaply) #Untuk plot heatmap Missing Data
## Warning: package 'heatmaply' was built under R version 4.0.5
## Loading required package: plotly
## Warning: package 'plotly' was built under R version 4.0.5
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.0.5
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
## Loading required package: viridis
## Warning: package 'viridis' was built under R version 4.0.5
## Loading required package: viridisLite
## Warning: package 'viridisLite' was built under R version 4.0.5
##
## ======================
## Welcome to heatmaply version 1.3.0
##
## Type citation('heatmaply') for how to cite the package.
## Type ?heatmaply for the main documentation.
##
## The github page is: https://github.com/talgalili/heatmaply/
## Please submit your suggestions and bug-reports at: https://github.com/talgalili/heatmaply/issues
## You may ask questions at stackoverflow, use the r and heatmaply tags:
## https://stackoverflow.com/questions/tagged/heatmaply
## ======================
library(visdat) #Untuk plot Missing Data
## Warning: package 'visdat' was built under R version 4.0.5
library(reshape2) #Modifikasi DataFrame
## Warning: package 'reshape2' was built under R version 4.0.5
library(tidyr) #Modifikasi DataFrame
## Warning: package 'tidyr' was built under R version 4.0.5
##
## Attaching package: 'tidyr'
## The following object is masked from 'package:reshape2':
##
## smiths
library(ggplot2) #Plot
library(psych) #Pair Plot
## Warning: package 'psych' was built under R version 4.0.5
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(DataExplorer) #Corelation Plot
## Warning: package 'DataExplorer' was built under R version 4.0.5
library(plotly)
library(httr)
## Warning: package 'httr' was built under R version 4.0.5
##
## Attaching package: 'httr'
## The following object is masked from 'package:plotly':
##
## config
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.0.5
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.0.5
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(rjson)
## Warning: package 'rjson' was built under R version 4.0.3
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.0.5
library(RCurl)
## Warning: package 'RCurl' was built under R version 4.0.5
##
## Attaching package: 'RCurl'
## The following object is masked from 'package:tidyr':
##
## complete
df <- read.csv("D:/1. KULIAH/PSDS/Kelas Dasar 3.0/titanic.csv")
df[df==""] <- NA
df[0:5,]
## PassengerId Survived Pclass
## 1 1 0 3
## 2 2 1 1
## 3 3 1 3
## 4 4 1 1
## 5 5 0 3
## Name Sex Age SibSp Parch
## 1 Braund, Mr. Owen Harris male 22 1 0
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0
## 3 Heikkinen, Miss. Laina female 26 0 0
## 4 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0
## 5 Allen, Mr. William Henry male 35 0 0
## Ticket Fare Cabin Embarked
## 1 A/5 21171 7.2500 <NA> S
## 2 PC 17599 71.2833 C85 C
## 3 STON/O2. 3101282 7.9250 <NA> S
## 4 113803 53.1000 C123 S
## 5 373450 8.0500 <NA> S
Melakukan klasifikasi penumpang yang selamat dan tidak selamat pada kasus tenggelamnya kapal Titanic.
Dataset Titanic dibuat untuk membuat machine learning untuk melakukan klasifikasi biner (Selamat atau Tidak Selamat). Variabel-variabel yang terdapat pada dataset ini adalah sebagai berikut:
dim(df)
## [1] 891 12
Artinya kita memiliki data dengan 12 kolom dan 891 baris.
names(df)
## [1] "PassengerId" "Survived" "Pclass" "Name" "Sex"
## [6] "Age" "SibSp" "Parch" "Ticket" "Fare"
## [11] "Cabin" "Embarked"
str(df)
## 'data.frame': 891 obs. of 12 variables:
## $ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
## $ Survived : int 0 1 1 1 0 0 0 0 1 1 ...
## $ Pclass : int 3 1 3 1 3 3 1 3 3 2 ...
## $ Name : chr "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ...
## $ Sex : chr "male" "female" "female" "female" ...
## $ Age : num 22 38 26 35 35 NA 54 2 27 14 ...
## $ SibSp : int 1 1 0 1 0 0 0 3 0 1 ...
## $ Parch : int 0 0 0 0 0 0 0 1 2 0 ...
## $ Ticket : chr "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
## $ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
## $ Cabin : chr NA "C85" NA "C123" ...
## $ Embarked : chr "S" "C" "S" "S" ...
Kita dapat mengetahui tipe-tipe data masing-masing variabel dan nama-nama variabel dalam dataset.
Missing data sangat mempengaruhi hasil analisis, pada nantinya akan kita isi atau hapus. Namun sebelumnya dicek keberadaanya terlebih dahulu dengan syntax berikut:
sapply(df, function(x) sum(is.na(x)))
## PassengerId Survived Pclass Name Sex Age
## 0 0 0 0 0 177
## SibSp Parch Ticket Fare Cabin Embarked
## 0 0 0 0 687 2
Untuk lebih memudahkan dalam membaca missing data, dapat ditampilkan dalam visualisasi berikut:
heatmaply_na(
df[1:20,],
showticklabels = c(TRUE, FALSE)
)
Hasil plot di atas berupa tampilan interaktif, yang mana bagian dengan warna hitam adalah bagian data yang hilang. Hasil plot di atas efektif untuk data dengan jumlah baris yang sedikit, untuk jumlah data yang banyak dapat digunakan sytax berikut:
vis_miss(df)
Dari ketiga hasil di atas diketahui bahwa kolom dengan missing data adalah kolom Age dan Cabin. Kedua kolom ini perlu mendapat perlakuan khusus nantinya.
Outlier adalah data yang berbeda dengan data lainnya. Nilai ini kadang menjadi nilai yang penting untuk diamati, namun kadang juga menjadi gangguan pada penerapan metode Machine Learning. Pada modul ini, nantinya nilai ini akan dihapus dengan pertimbangan tertentu. Kemudian, untuk melihat apakah ada outlier atau tidak dalam suatu dataset dapat dilihat melalui boxplot berikut:
num_cols <- unlist(lapply(df, is.numeric)) #Memilih kolom bertipe numerik
df_num <- df[ , num_cols]
boxplot(df_num)
Titik lingkaran di luar boxplot adalah outlier. Sehingga kolom yang mengandung outlier adalah Age, SibSp, Parch, dan Fare.
plot_correlation(df_num)
## Warning: Removed 12 rows containing missing values (geom_text).
Perlu dicatat bahwa, missing data membuat hasil plot di atas kurang maksimal. Namun demikian, pada notebook ini kita fokus pada EDA dan Pemodelan SVM jadi kita biarkan dulu. Nanti baru dihapus.
summary(df)
## PassengerId Survived Pclass Name
## Min. : 1.0 Min. :0.0000 Min. :1.000 Length:891
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000 Class :character
## Median :446.0 Median :0.0000 Median :3.000 Mode :character
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Sex Age SibSp Parch
## Length:891 Min. : 0.42 Min. :0.000 Min. :0.0000
## Class :character 1st Qu.:20.12 1st Qu.:0.000 1st Qu.:0.0000
## Mode :character Median :28.00 Median :0.000 Median :0.0000
## Mean :29.70 Mean :0.523 Mean :0.3816
## 3rd Qu.:38.00 3rd Qu.:1.000 3rd Qu.:0.0000
## Max. :80.00 Max. :8.000 Max. :6.0000
## NA's :177
## Ticket Fare Cabin Embarked
## Length:891 Min. : 0.00 Length:891 Length:891
## Class :character 1st Qu.: 7.91 Class :character Class :character
## Mode :character Median : 14.45 Mode :character Mode :character
## Mean : 32.20
## 3rd Qu.: 31.00
## Max. :512.33
##
d <- melt(df_num)
## No id variables; using all as measure variables
ggplot(d,aes(x = value)) +
facet_wrap(~variable,scales = "free_x") +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 177 rows containing non-finite values (stat_bin).
Plot ini untuk melihat apakah variabel-variabel pada dataset berdistribusi normal. Variabel-variabel Age, SibSp, Parch, dan Fare cenderung memiliki skewnes positif. Itu berarti berarti ekor distribusi berada di sebelah kanan nilai terbanyak.
pairs.panels(df_num,
method = "pearson", # correlation method
hist.col = "#00AFBB",
density = TRUE, # show density plots
ellipses = TRUE # show correlation ellipses
)
Data preprocessing ini digunakan guna menyiapkan data untuk diklasifikasi menggunakan metode SVM (Hanya Contoh).
Setelah mengetahui hasil EDA di atas maka untuk hasil yang baik diperlukan beberapa hal sebagai berikut:
Setelah data diperbaiki dilakukan langkah sebagai berikut:
[Note] * Ini hanya contoh untuk melakukan pengisian data NaN(Kosong), nama kabin mungkin menjadi penting sehingga tidak segampang itu diganti.
df = subset(df, select = -c(Name, Ticket) )
head(df)
## PassengerId Survived Pclass Sex Age SibSp Parch Fare Cabin Embarked
## 1 1 0 3 male 22 1 0 7.2500 <NA> S
## 2 2 1 1 female 38 1 0 71.2833 C85 C
## 3 3 1 3 female 26 0 0 7.9250 <NA> S
## 4 4 1 1 female 35 1 0 53.1000 C123 S
## 5 5 0 3 male 35 0 0 8.0500 <NA> S
## 6 6 0 3 male NA 0 0 8.4583 <NA> Q
#Mengisi NA pada kolom Age dengan mean(Age)
df$Age[is.na(df$Age)] = 0
m<-mean(df$Age)
df$Age[df$Age==0]<-m
#Mengisi NA pada kolom Cabin dengan E49
df=df %>% replace_na(list(Cabin = "E49"))
#Mengisi NA pada kolom Embarked dengan C
df=df %>% replace_na(list(Embarked = "C"))
#Mengecek apakah NA sudah terganti
sapply(df, function(x) sum(is.na(x)))
## PassengerId Survived Pclass Sex Age SibSp
## 0 0 0 0 0 0
## Parch Fare Cabin Embarked
## 0 0 0 0
head(df)
## PassengerId Survived Pclass Sex Age SibSp Parch Fare Cabin
## 1 1 0 3 male 22.00000 1 0 7.2500 E49
## 2 2 1 1 female 38.00000 1 0 71.2833 C85
## 3 3 1 3 female 26.00000 0 0 7.9250 E49
## 4 4 1 1 female 35.00000 1 0 53.1000 C123
## 5 5 0 3 male 35.00000 0 0 8.0500 E49
## 6 6 0 3 male 23.79929 0 0 8.4583 E49
## Embarked
## 1 S
## 2 C
## 3 S
## 4 S
## 5 S
## 6 Q
df$Sex<- unclass(df$Sex)
df$Embarked<- unclass(df$Embarked)
df$Cabin<- unclass(df$Cabin)
head(df)
## PassengerId Survived Pclass Sex Age SibSp Parch Fare Cabin
## 1 1 0 3 male 22.00000 1 0 7.2500 E49
## 2 2 1 1 female 38.00000 1 0 71.2833 C85
## 3 3 1 3 female 26.00000 0 0 7.9250 E49
## 4 4 1 1 female 35.00000 1 0 53.1000 C123
## 5 5 0 3 male 35.00000 0 0 8.0500 E49
## 6 6 0 3 male 23.79929 0 0 8.4583 E49
## Embarked
## 1 S
## 2 C
## 3 S
## 4 S
## 5 S
## 6 Q
Rentang interkuartil (IQR) adalah ukuran penyebaran statistik dan dihitung sebagai perbedaan antara persentil ke-75 dan ke-25. Ini diwakili oleh rumus IQR = Q3 - Q1. Baris kode di bawah menghitung dan mencetak kisaran interkuartil untuk setiap variabel dalam dataset.
Teknik ini menggunakan skor IQR yang dihitung sebelumnya untuk menghilangkan pencilan. Aturan praktisnya adalah bahwa segala sesuatu yang tidak berada dalam kisaran (Q1 - 1.5 IQR) dan (Q3 + 1.5 IQR) adalah pencilan, dan dapat dihapus.
Metode ini dipakai karena untuk identifikasi outlier awal digunakan metode boxplot.
unit_length <- function(x) {
x / sqrt(sum(x^2))
}
unit_length_df <- as.data.frame(lapply(df, unit_length))
head(unit_length_df)
y=df$Survived
x=data.matrix(df[-c(2)])
x_train=x[1:7000]
x_test=x[7001:8019]
y_train=x[1:7000]
y_test=x[7001:8019]
#Belum kelar sih yang ini, masih proses mencari syntax yang bener buat ngebagi datanya. Ditunggu yaaa gaesss . . .