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).
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", "…
skimr::skim_without_charts(ds.salaries)
| 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
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
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)
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.
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.
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.
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.