Kelompok 4 Praktikum Statistika Sains Data RB

121450022 - Sarah Natalia Geraldine

121450094 - Syifa Firnanda

121450105 - Raditia Riandi

121450112 - Christian Arvianus Nathanael Biran

121450157 - Salwa Naqwadisa Madinna

i) Pengantar Dataset

Dataset ini berisi tentang Gaji pekerjaan di domain Ilmu Data dengan isi kolom sebagai berikut.

work_year: Tahun gaji dibayarkan.

experience_level: Tingkat pengalaman dalam pekerjaan selama tahun dengan nilai-nilai berikut: EN Tingkat pemula / Junior MI Tingkat menengah / Intermediate SE Tingkat senior / Ahli EX Tingkat eksekutif / Direktur.

employment_type: Jenis pekerjaan untuk peran: PT Paruh waktu FT Penuh waktu CT Kontrak FL Lepas.

job_title: Peran yang dijalankan selama tahun tersebut.

salary: Jumlah total gaji kotor yang dibayarkan.

salary_currency: Mata uang gaji yang dibayarkan sebagai kode mata uang ISO 4217.

salary_in_usd: Gaji dalam USD (kurs FX dibagi dengan rata-rata kurs USD untuk tahun yang bersangkutan melalui fxdata.foorilla.com).

employee_residence: Negara tempat tinggal utama karyawan selama tahun kerja sebagai kode negara ISO 3166.

remote_ratio: Jumlah total pekerjaan yang dilakukan secara remote, nilai-nilai yang mungkin adalah sebagai berikut: 0 Tidak ada pekerjaan remote (kurang dari 20%) 50 Sebagian remote 100 Sepenuhnya remote (lebih dari 80%).

company_location: Negara kantor utama atau cabang kontrak pemberi kerja sebagai kode negara ISO 3166.

company_size: Jumlah rata-rata orang yang bekerja untuk perusahaan selama tahun tersebut: S kurang dari 50 karyawan (kecil) M 50 hingga 250 karyawan (menengah) L lebih dari 250 karyawan (besar).

ii) Pertanyaan yang ingin dijawab

1. Bagaimana pengaruh variabel prediktor terhadap respon?

2. Bagaimana perbandingan MSE antara regreession tree dan random forest? mana yang lebih baik?

library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
library(ggplot2)
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:randomForest':
## 
##     margin
library(rpart)
library(rpart.plot)
library(tibble)
library(tree)
ds.salaries <- read.csv("C:/Users/sarah/Downloads/data science salaries.csv")
glimpse(ds.salaries)
## Rows: 3,755
## Columns: 11
## $ work_year          <int> 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 202…
## $ experience_level   <chr> "SE", "MI", "MI", "SE", "SE", "SE", "SE", "SE", "SE…
## $ employment_type    <chr> "FT", "CT", "CT", "FT", "FT", "FT", "FT", "FT", "FT…
## $ job_title          <chr> "Principal Data Scientist", "ML Engineer", "ML Engi…
## $ salary             <int> 80000, 30000, 25500, 175000, 120000, 222200, 136000…
## $ salary_currency    <chr> "EUR", "USD", "USD", "USD", "USD", "USD", "USD", "U…
## $ salary_in_usd      <int> 85847, 30000, 25500, 175000, 120000, 222200, 136000…
## $ employee_residence <chr> "ES", "US", "US", "CA", "CA", "US", "US", "CA", "CA…
## $ remote_ratio       <int> 100, 100, 100, 100, 100, 0, 0, 0, 0, 0, 0, 100, 100…
## $ company_location   <chr> "ES", "US", "US", "CA", "CA", "US", "US", "CA", "CA…
## $ company_size       <chr> "L", "S", "S", "M", "M", "L", "L", "M", "M", "M", "…

iii) Pembersihan Data

skimr::skim_without_charts(ds.salaries)
Data summary
Name ds.salaries
Number of rows 3755
Number of columns 11
_______________________
Column type frequency:
character 7
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
experience_level 0 1 2 2 0 4 0
employment_type 0 1 2 2 0 4 0
job_title 0 1 9 40 0 93 0
salary_currency 0 1 3 3 0 20 0
employee_residence 0 1 2 2 0 78 0
company_location 0 1 2 2 0 72 0
company_size 0 1 1 1 0 3 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100
work_year 0 1 2022.37 0.69 2020 2022 2022 2023 2023
salary 0 1 190695.57 671676.50 6000 100000 138000 180000 30400000
salary_in_usd 0 1 137570.39 63055.63 5132 95000 135000 175000 450000
remote_ratio 0 1 46.27 48.59 0 0 0 100 100
sum(is.na(ds.salaries))
## [1] 0

Oleh karena dataset bersih sudah bersih, maka tidak perlu dilakukan pembersihan untuk menghapus data yang hilang.

dim(ds.salaries)
## [1] 3755   11

iv) Analisis deskriptif awal

summary(ds.salaries)
##    work_year    experience_level   employment_type     job_title        
##  Min.   :2020   Length:3755        Length:3755        Length:3755       
##  1st Qu.:2022   Class :character   Class :character   Class :character  
##  Median :2022   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :2022                                                           
##  3rd Qu.:2023                                                           
##  Max.   :2023                                                           
##      salary         salary_currency    salary_in_usd    employee_residence
##  Min.   :    6000   Length:3755        Min.   :  5132   Length:3755       
##  1st Qu.:  100000   Class :character   1st Qu.: 95000   Class :character  
##  Median :  138000   Mode  :character   Median :135000   Mode  :character  
##  Mean   :  190696                      Mean   :137570                     
##  3rd Qu.:  180000                      3rd Qu.:175000                     
##  Max.   :30400000                      Max.   :450000                     
##   remote_ratio    company_location   company_size      
##  Min.   :  0.00   Length:3755        Length:3755       
##  1st Qu.:  0.00   Class :character   Class :character  
##  Median :  0.00   Mode  :character   Mode  :character  
##  Mean   : 46.27                                        
##  3rd Qu.:100.00                                        
##  Max.   :100.00

Hasil output di atas merupakan ringkasan statistik dari setiap variabel pada dataset yang berisi berbagai informasi seperti jumlah observasi, nilai minimum, median, mean, nilai maksimum, dan quartil dari setiap variabel numerik pada dataset, serta jumlah observasi, jumlah nilai unik, dan nilai modus dari setiap variabel kategorik pada dataset.

ds.salaries$salary <- scale(ds.salaries$salary)

Dilakukan penskalaan data pada kolom salary dalam dataset ds.salaries.

ggplot(ds.salaries, aes(x=salary)) + 
  geom_histogram(binwidth = 0.8, color="black", fill="blue") +
  ggtitle("Salary Data Science 2023") + 
  xlab("Salary") + ylab("Frekuensi")

ggplot(ds.salaries, aes(x=salary, y=salary_in_usd)) +
  geom_point(alpha=0.8) +
  ggtitle("Relasi pada Salary in USD dan Salary in Indonesia") +
  xlab("Salary in Indonesia") +
  ylab("Salary in USD")

#v) Metode klasifikasi yang digunakan

Regresion tree

set.seed(1)
train <- sample(nrow(ds.salaries), 0.8*nrow(ds.salaries))
ds.salaries_train <- ds.salaries[train, ]
ds.salaries_test <- ds.salaries[-train, ]

Dilakukan pembagian data menjadi data train dan data test.

tree.ds_salaries <- tree(salary ~.,data=ds.salaries_train)
## Warning in tree(salary ~ ., data = ds.salaries_train): NAs introduced by
## coercion
summary(tree.ds_salaries)
## 
## Regression tree:
## tree(formula = salary ~ ., data = ds.salaries_train)
## Variables actually used in tree construction:
## [1] "salary_in_usd" "work_year"    
## Number of terminal nodes:  4 
## Residual mean deviance:  0.3655 = 1097 / 3000 
## Distribution of residuals:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -5.46400 -0.09471 -0.03583  0.00000  0.02625 12.41000
plot(tree.ds_salaries)
text(tree.ds_salaries,pretty = 0, cex=.75)

Random forest

set.seed(1)
rf.ds.salaries <- randomForest(salary ~.,data=ds.salaries_train, importance=T, ntree = 1000, mtry=5)
rf.ds.salaries
## 
## Call:
##  randomForest(formula = salary ~ ., data = ds.salaries_train,      importance = T, ntree = 1000, mtry = 5) 
##                Type of random forest: regression
##                      Number of trees: 1000
## No. of variables tried at each split: 5
## 
##           Mean of squared residuals: 0.1380517
##                     % Var explained: 66.88
importance(rf.ds.salaries)
##                      %IncMSE IncNodePurity
## work_year          -5.453764    33.1509372
## experience_level    8.953108    26.3067178
## employment_type     2.698888     0.3584406
## job_title           2.118716    85.6559110
## salary_currency    24.001103   338.3908585
## salary_in_usd      32.268015   301.8670838
## employee_residence 13.032891   197.1959997
## remote_ratio        3.256194    28.2749308
## company_location   11.519196   153.2049822
## company_size        1.917575    28.2873501

Dari hasil output di atas, diketahui bahwa variable yang terpenting adalah variable ‘salary_currency’ karena memiliki nilai IncNodePurtiy yang tertinggi dibandingkan variable yang lain, yang berarti bahwa variabel tersebut memiliki pengaruh yang cukup besar terhadap variable response.

vi) Pilihan model- kesalahan uji (test error)/ validasi silang (cross validation)

pred.tree <- predict(tree.ds_salaries, ds.salaries_test)
## Warning in pred1.tree(object, tree.matrix(newdata)): NAs introduced by coercion
MSE.tree <- mean((ds.salaries_test$salary - pred.tree)^2)
MSE.tree
## [1] 3.286878
pred.rf <- predict(rf.ds.salaries, ds.salaries_test)

MSE.rf <- mean((ds.salaries_train$salary - pred.rf)^2)
MSE.rf
## [1] 0.9287736

Dari hasil output di atas, didapatkan nilai MSE pada regression tree sebesar 3.286878 dan pada model random forest sebesar 0.9287736. Berdasarkan hasil tersebut, dapat disimpulkan bahwa MSE pada model random forest lebih kecil dibandingkan dengan regression tree sehingga model random forest memiliki performa yang lebih baik.

vii) Kesimpulan dan diskusi

  1. Bagaimana pengaruh variabel prediktor terhadap respon ?

Pengaruh variabel prediktor terhadap respon menunjukkan bahwa semakin tinggi prediktor, semakin rendah respon-nya. Pola garis yang menurun (negative slope) juga menunjukkan adanya korelasi negatif antara variablel prediktor dan respon.

  1. Bagaimana perbandingan MSE antara regreession tree dan random forest? mana yang lebih baik?

Mean Squared Error (MSE) adalah Rata-rata Kesalahan kuadrat diantara nilai aktual dan nilai peramalan. Metode Mean Squared Error secara umum digunakan untuk mengecek estimasi berapa nilai kesalahan pada peramalan. Nilai Mean Squared Error yang rendah atau nilai mean squared error mendekati nol menunjukkan bahwa hasil peramalan sesuai dengan data aktual dan bisa dijadikan untuk perhitungan peramalan di periode mendatang.

Nilai MSE pada regreesion tree sebesar 3.286878 sedangkan nilai MSE pada random forest sebesar 0.9287736. Mendapat kesimpulan bahwa MSE pada model random forest lebih kecil dibandingkan dengan regression tree sehingga model random forest memiliki performa yang lebih baik.