Exploratory Data Analysis(EDA) adalah bagian dari proses data science. Dalam tahap ini kita harus bisa 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)
## Loading required package: plotly
## Loading required package: ggplot2
##
## 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 3.6.3
## Loading required package: viridisLite
## Warning: package 'viridisLite' was built under R version 3.6.3
##
## ======================
## 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 3.6.3
library(reshape2) #Modifikasi DataFrame
## Warning: package 'reshape2' was built under R version 3.6.3
library(tidyr) #Modifikasi DataFrame
## Warning: package 'tidyr' was built under R version 3.6.3
##
## Attaching package: 'tidyr'
## The following object is masked from 'package:reshape2':
##
## smiths
library(DataExplorer)
## Warning: package 'DataExplorer' was built under R version 3.6.3
df <- read.csv("https://raw.githubusercontent.com/nikmatunkhasanah29/PSDS-Kelas-Dasar/main/titanic.csv%20-%20titanic.csv.csv", stringsAsFactors = T)
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.25 <NA> S
## 2 PC 17599 712.833 C85 C
## 3 STON/O2. 3101282 7.925 <NA> S
## 4 113803 53.1 C123 S
## 5 373450 08.05 <NA> S
Tujuannya yaitu untuk mengklasifikasi penumpang yang selamat dan tidak selamat pada kasus tenggelamnya kapal Titanic.
Variabel-variabel yang terdapat pada dataset ini adalah sebagai berikut:
dim(df)
## [1] 891 12
Data terdiri dari 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 : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
## $ Sex : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ...
## $ 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 : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
## $ Fare : Factor w/ 248 levels "0.0","07.05",..: 176 201 199 145 3 220 142 73 15 108 ...
## $ Cabin : Factor w/ 148 levels "","A10","A14",..: NA 83 NA 57 NA NA 131 NA NA NA ...
## $ Embarked : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...
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
Menampilkan kedalam visualisasi berikut :
heatmaply_na(
df[1:20,],
showticklabels = c(TRUE, FALSE)
)
Bagian dengan warna hitam adalah bagian data yang hilang.Hasil plot di atas efektif untuk data dengan jumlah baris yang sedikit.
Untuk baris yang banyak dapat menggunakan syntax berikut :
vis_miss(df)
Berdasarkan data diatas 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.
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 10 rows containing missing values (geom_text).
Missing data membuat hasil plot di atas kurang maksimal.
summary(df)
## PassengerId Survived Pclass
## Min. : 1.0 Min. :0.0000 Min. :1.000
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000
## Median :446.0 Median :0.0000 Median :3.000
## 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
##
## Name Sex Age
## Abbing, Mr. Anthony : 1 female:314 Min. : 0.42
## Abbott, Mr. Rossmore Edward : 1 male :577 1st Qu.:20.12
## Abbott, Mrs. Stanton (Rosa Hunt) : 1 Median :28.00
## Abelson, Mr. Samuel : 1 Mean :29.70
## Abelson, Mrs. Samuel (Hannah Wizosky): 1 3rd Qu.:38.00
## Adahl, Mr. Mauritz Nils Martin : 1 Max. :80.00
## (Other) :885 NA's :177
## SibSp Parch Ticket Fare
## Min. :0.000 Min. :0.0000 1601 : 7 08.05 : 43
## 1st Qu.:0.000 1st Qu.:0.0000 347082 : 7 13.0 : 42
## Median :0.000 Median :0.0000 CA. 2343: 7 7.8958 : 38
## Mean :0.523 Mean :0.3816 3101295 : 6 7.75 : 34
## 3rd Qu.:1.000 3rd Qu.:0.0000 347088 : 6 26.0 : 31
## Max. :8.000 Max. :6.0000 CA 2144 : 6 10.5 : 24
## (Other) :852 (Other):679
## Cabin Embarked
## B96 B98 : 4 : 0
## C23 C25 C27: 4 C :168
## G6 : 4 Q : 77
## C22 C26 : 3 S :644
## D : 3 NA's: 2
## (Other) :186
## NA's :687
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.
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:
1. Menghapus kolom teks yang tidak diperlukan: Name dan Ticket
2. Mengisi NaN pada kolom Cabin dengan salah satu nama kabin tertentu, mengisi NaN pada kolom Age dengan nilai rata-ratanya
3. Melakukan pengkodean(Encoding) pada kolom Sex , Cabin, dan Embarked
4. Menghapus outlier
5. Karena nilai data ada yang sangat besar dan kecil maka perlu dilakukan normalisasi
Setelah data diperbaiki dilakukan langkah sebagai berikut:
1. Memilih variabel independent dan label
2. Membagi data menjadi data training dan data testing
[Note] * Ini hanya contoh untuk melakukan pengisian data NaN(Kosong).
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.25 <NA> S
## 2 2 1 1 female 38 1 0 712.833 C85 C
## 3 3 1 3 female 26 0 0 7.925 <NA> S
## 4 4 1 1 female 35 1 0 53.1 C123 S
## 5 5 0 3 male 35 0 0 08.05 <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.25 E49
## 2 2 1 1 female 38.00000 1 0 712.833 C85
## 3 3 1 3 female 26.00000 0 0 7.925 E49
## 4 4 1 1 female 35.00000 1 0 53.1 C123
## 5 5 0 3 male 35.00000 0 0 08.05 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 Embarked
## 1 1 0 3 2 22.00000 1 0 7.25 132 4
## 2 2 1 1 1 38.00000 1 0 712.833 83 2
## 3 3 1 3 1 26.00000 0 0 7.925 132 4
## 4 4 1 1 1 35.00000 1 0 53.1 57 4
## 5 5 0 3 2 35.00000 0 0 08.05 132 4
## 6 6 0 3 2 23.79929 0 0 8.4583 132 3
unit_length <- function(x) {
x / sqrt(sum(x^2))
}
unit_length_df <- as.data.frame(lapply(df, unit_length))
## Warning in Ops.factor(x, 2): '^' not meaningful for factors
## Warning in Ops.factor(x, sqrt(sum(x^2))): '/' not meaningful for factors
head(unit_length_df)
## PassengerId Survived Pclass Sex Age SibSp Parch
## 1 6.506968e-05 0.00000000 0.04093489 0.03905833 0.02344561 0.02746175 0
## 2 1.301394e-04 0.05407381 0.01364496 0.01952916 0.04049697 0.02746175 0
## 3 1.952090e-04 0.05407381 0.04093489 0.01952916 0.02770845 0.00000000 0
## 4 2.602787e-04 0.05407381 0.01364496 0.01952916 0.03729984 0.02746175 0
## 5 3.253484e-04 0.00000000 0.04093489 0.03905833 0.03729984 0.00000000 0
## 6 3.904181e-04 0.00000000 0.04093489 0.03905833 0.02536314 0.00000000 0
## Fare Cabin Embarked
## 1 NA 0.03582844 0.03701641
## 2 NA 0.02252849 0.01850821
## 3 NA 0.03582844 0.03701641
## 4 NA 0.01547137 0.03701641
## 5 NA 0.03582844 0.03701641
## 6 NA 0.03582844 0.02776231
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]