Studi Kasus

Dataset : Data Science Salaries 2023 💸

“Salaries of Different Data Science Fields in the Data Science Domain”, sumber dataset kaggle, kreotor mendeklarasikan “Data has been sourced from aijobs.net” for yearly salary.

Dengan begitu dapat kita pahami bahwa dataset tersebut menggambarkan perbedaan gaji tiap pekerjaan di bidang data(terutama data scientist), yang dikhususkan untuk pendapatan per-tahun (annual salary)

Data Preprocessing dengan dplyr

Import Library

library(dplyr) 
library(plotly)
library(glue) 
library(scales)

Import data

ds_salary <- read.csv("ds_salaries.csv")
head(ds_salary)

Cek struktur data

# dplyr
glimpse(ds_salary)
#> 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", "…

Detail Kolom

Data Science Job Salaries Dataset contains 11 columns, each are:

  1. work_year: The year the salary was paid.
  2. experience_level: The experience level in the job during the year
  3. employment_type: The type of employment for the role
  4. job_title: The role worked in during the year.
  5. salary: The total gross salary amount paid.
  6. salary_currency: The currency of the salary paid as an ISO 4217 currency code.
  7. salaryinusd: The salary in USD
  8. employee_residence: Employee’s primary country of residence in during the work year as an ISO 3166 country code.
  9. remote_ratio: The overall amount of work done remotely
  10. company_location: The country of the employer’s main office or contracting branch
  11. company_size: The median number of people that worked for the company during the year

IN BAHASA INDONESIA

  1. work year: tahun dimana gaji dibayarkan
  2. experience_level: level pekerjaan selama tahun tercantum(SE: Senior, EN: Entry Level, EX: Executive Level, MI: Mid level)
  3. employment_type: tipe pegawai tiap role(FT: Fulltime, CT:Contractor, FL: Freelancer, PT: Part-time)
  4. job_title : titel pekerjaan selama tahun tercantum
  5. salary: Jumlah total gaji kotor yang dibayarkan.
  6. salary_currency: kurensi gaji dalam mata uang tertentu sesuai ISO 4217
  7. salaryinusd: besaran gaji dalam USD
  8. employee_residence: negara tempat tinggal utama karyawan selama tahun kerja sebagai kode negara ISO 3166.
  9. remote_ratio: Jumlah keseluruhan pekerjaan yang dilakukan dari jarak jauh
  10. company_location: Negara kantor pusat pemberi kerja atau cabang kontrak
  11. company_size: nilai median orang yang bekerja untuk perusahaan selama tahun tercantum(S:100, M:500 and L:1000+)

Data Wrangling

Modifikasi tipe data dan kolom

ds_salary <- ds_salary %>% 
  mutate(work_year = as.factor(work_year),
         experience_level = as.factor(experience_level),
         employment_type = as.factor(employment_type),
         salary_currency = as.factor(salary_currency),
         employee_residence = as.factor(employee_residence),
         remote_ratio = as.factor(remote_ratio),
         company_location = as.factor(company_location),
         company_size = as.factor(company_size)
         )
glimpse(ds_salary)
#> Rows: 3,755
#> Columns: 11
#> $ work_year          <fct> 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023, 202…
#> $ experience_level   <fct> SE, MI, MI, SE, SE, SE, SE, SE, SE, SE, SE, SE, SE,…
#> $ employment_type    <fct> FT, CT, CT, FT, FT, FT, FT, 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    <fct> EUR, USD, USD, USD, USD, USD, USD, USD, USD, USD, U…
#> $ salary_in_usd      <int> 85847, 30000, 25500, 175000, 120000, 222200, 136000…
#> $ employee_residence <fct> ES, US, US, CA, CA, US, US, CA, CA, US, US, US, US,…
#> $ remote_ratio       <fct> 100, 100, 100, 100, 100, 0, 0, 0, 0, 0, 0, 100, 100…
#> $ company_location   <fct> ES, US, US, CA, CA, US, US, CA, CA, US, US, US, US,…
#> $ company_size       <fct> L, S, S, M, M, L, L, M, M, M, M, M, M, L, L, M, M, …

Modifikasi Kolom

Kita tidak akan mengambil kolom salary dan salary_currency karena masih tergolong subjektif dalam kasus kali ini. Setelah penyortiran kolom, simpan kedalam objek ds_select

# dplyr / dengan piping
ds_select <- ds_salary %>%
  select(-c(salary, salary_currency))

Tidy Data

Cek NA - Not Available (Missing Values)

# dplyr
ds_select %>% 
  is.na %>% 
  colSums()

karena tidak ada nilai yg NA, maka tidak dilakukan handling missing value

Static Visualization Transformation/Interactive Plot

tema algoritma untuk branding visualization

theme_algoritma <- theme(legend.key = element_rect(fill="black"),
           legend.background = element_rect(color="white", fill="#263238"),
           plot.subtitle = element_text(size=6, color="white"),
           panel.background = element_rect(fill="#dddddd"),
           panel.border = element_rect(fill=NA),
           panel.grid.minor.x = element_blank(),
           panel.grid.major.x = element_blank(),
           panel.grid.major.y = element_line(color="darkgrey", linetype=2),
           panel.grid.minor.y = element_blank(),
           plot.background = element_rect(fill="#263238"),
           text = element_text(color="white"),
           axis.text = element_text(color="white")
           )

📊 Tahapan pembuatan interactive plot menggunakan plotly:

  1. Formulasikan business question
  2. Persiapan data
  3. visualisasi statis dengan ggplot()
  4. Mengubah objek ggplot menjadi plotly dengan ggplotly()

Business Questions

  1. Ingin mengetahui perbedaan frekuensi job_title yang di publish berdasarkan tahun
  2. Trend Tahunan Data Science Fields yang dipublish berdasarkan experience_level
  3. Trend Tahunan rata-rata gaji(salary_in_usd) berdasarkan experience_level
  4. Trend Tahunan Pergerakan rata-rata gaji(salary_in_usd) pada tiap company_size

Case 1

  1. Ingin mengetahui perbedaan frekuensi job_title yang di publish berdasarkan tahun
plot_agg1 <- ds_select %>% 
  distinct(job_title, work_year, .keep_all= TRUE) %>% #remove duplicates
  group_by(work_year) %>% 
  summarise(freq = n())

Plot Statis 1

# plot 1 statis (ggplot2)
plot_1 <- plot_agg1 %>% 
  ggplot(mapping = aes(x = work_year,
                       y = freq,
                       text = glue("Tahun : {work_year}
                                   Frekuensi : {freq}")))+
  geom_col(fill = "#FF7F50", width = 0.3)+
  geom_text(aes(label = freq), nudge_y = 2)+
    labs(title = "Number of Distinct 'Job Titles' in Data Science Fields by year",
       x = NULL,
       y = NULL,
       caption = "Source: aijobs.net")+
  theme_algoritma
plot_1

> Insight:

  • Berdasarkan perbedaan frekuensi job_title yang dipublish berdasarkan tahun, dari 2020-2022 perkembangan job_title mengalami peningkatan yg signifikan, seiring berjalanya waktu mungkin saja suatu perusahaan membutuhkan role data yang lebih spesifik dalam menjalankan jobdesk-nya
  • Grafik mulai melandai pada 2023. Hal ini bisa terjadi karena kebutuhan perusahaan akan talent data sudah terpenuhi di tahun sebelumnya

Case 2

  1. Trend Tahunan Data Science Fields yang dipublish berdasarkan experience_level
ds_select$experience_level <- sapply(X = as.character(ds_select$experience_level),
                           FUN = switch, 
                           "EN" = "Entry Level",
                           "EX" = "Executive Level", 
                           "MI" = "Mid Level", 
                           "SE" = "Senior Level"
                           )
plot_agg2 <- ds_select %>% 
  group_by(work_year, experience_level) %>% 
  summarise(freq = n()) %>% 
  ungroup()

Plot Statis 2

plot_2 <- plot_agg2 %>% 
  ggplot(mapping = aes(x = work_year, 
                       y = freq))+
  geom_line(aes(group = experience_level, 
                color = experience_level),
            size=1.2)+
  geom_point(aes(text = glue("{experience_level}
                            Frekuensi: {freq}"),
                 color = experience_level),
             size = 2)+
  geom_text(aes(label = freq),check_overlap = TRUE)+
  labs(title = "Number of Data Science Fields published by Experience",
       x = NULL,
       y = NULL,
       caption = "Source: aijobs.net",
       ) +
  theme(legend.position = "bottom",
        legend.title = element_blank())+
  theme_algoritma
plot_2 

> Insight:

  • Trend Tahunan Data Science Fields yang diposting berdasarkan experience_level, menunjukkan tren tiap kategori experience_levelnya mengalami kenaikan tiap tahun,
  • Tetapi khusus untuk Senior Level mengalami kenaikan yang paling tinggi dimulai pada periode 2021-2022, dan terus meningkat hingga periode 2022-2023, bisa jadi pada saat itu perusahaan sedang berlomba-lomba untuk merekrut expertise dan berpengalaman di bidang data tech dan bisa memanage tim data.
  • Trend dari Executive Level tidak begitu signifikan karena role tersebut bisa jadi tetap diisi oleh orang yang sudah lama di perusahaan, baik dari sisi internal ataupun berpengaruh dalam tatanan struktural perusahaan itu dan mengerti benar akan role tersebut
  • Entry dan Medium level bergerak cenderung positif naik namun tidak signifikan karena sempat mengalami penurunan pada periode 2022-2023, menandakan role tersebut tetap dibutuhkan ditengah banyak perusahaan yang ingin ke arah digitalisasi.

Case 3

  1. Trend Tahunan rata-rata gaji(salary_in_usd) berdasarkan experience_level
plot_agg3 <- ds_select %>% 
  group_by(work_year, experience_level) %>% 
  summarise(mean_salary = round(mean(salary_in_usd),2)) %>% 
  ungroup()

Plot Statis 3

plot_3 <- plot_agg3 %>% 
  ggplot(mapping = aes(x = work_year, 
                       y = mean_salary))+
  geom_line(aes(group = experience_level, 
                color = experience_level
                ),
            size=1.2,
            )+
  geom_point(aes(text = glue("{experience_level}
                            mean_salary: ${mean_salary}"),
                 color = experience_level),
             size = 2)+
  geom_text(aes(label = label_number_si()(mean_salary)),check_overlap = TRUE)+
  labs(title = "Annual Average Salary(US$) of Data Science Fields published by Experience",
       x = NULL,
       y = NULL,
       caption = "Source: aijobs.net",
       ) +
  theme(legend.position = "bottom",
        legend.title = element_blank())+
  theme_algoritma
plot_3

> Insight:

  • Sejak 2020-2023, trend rata-rata gaji tiap level meningkat
  • Entry Level, Medium level, dan Senior Level memiliki pola yang relatif sama
  • Entry, Mid, dan Senior level sempat mengalami penurunan rerata gaji pada periode 2020-2021, diramalkan karena pada periode tersebut sedang terjadi inflasi dan berpengaruh pada perusahaan
  • Namun kebalikannya, pada periode 2020-2021, rerata gaji Excecutive Level mengalami kenaikan, diramalkan karena role tersebut mengambil peranan penting dalam pengambilan keputusan suatu perusahaan pada periode kritis yang sedang terjadi
  • Gaji tiap level diperkirakan akan terus steady/bahkan mengalami kenaikan dikarenakan demand akan kebutuhan talent data yang besar

Case 4

  1. trend of salary movement each company_size by average
plot_agg4 <- ds_select %>% 
  group_by(company_size, work_year) %>% 
  summarise(salary_movement = round(mean(salary_in_usd),2)) %>% 
  ungroup()

Plot Statis 4

plot_4 <- plot_agg4 %>% 
  ggplot(mapping = aes(x = work_year, 
                       y = salary_movement))+
  geom_line(aes(group = company_size, 
                color = company_size
                ),
            size=1.2,
            )+
  geom_point(aes(text = glue("Company Size: {company_size}
                            Salary Movement: ${salary_movement}"),
                 color = company_size),
             size = 2)+
  geom_text(aes(label = label_number_si()(salary_movement)))+
  labs(title = "Trend of Salary Movement by Company Size",
       x = NULL,
       y = NULL,
       color = "Company Size",
       caption = "Source: aijobs.net",
       ) +
  theme(legend.position = "bottom")+
  theme_algoritma
plot_4

> Insight:

  • Medium Company sempat menurunkan rerata gaji pada peridoe 2020-2021, namun mulai menaikkan rerata gaji karyawannya pada periode 2021-2022 dan masih berlanjut secara signifikan sampai periode 2022-2023
  • pergerakan rata-rata gaji pada perusahaan Large dan Small tidak terlalu fluktuatif terlihat dari visualisasi pada plot
  • Large company memiliki rata-rata gaji dalam setahun kisaran US$100K - $133K
  • Small Company memiliki rata-rata gaji dalam setahun kisaran US$70K - US$80K

Plot Interaktif

Dapat diakses disini: link rpubs