Employee Retention Dataset

Midterm Exam

Logo


1 Pendahuluan

Retensi karyawan merupakan salah satu aspek penting dalam manajemen sumber daya manusia karena berpengaruh langsung terhadap stabilitas dan kinerja organisasi. Perusahaan yang mampu mempertahankan karyawan berkualitas akan memiliki produktivitas yang lebih tinggi dan efisiensi yang lebih baik dibanding perusahaan dengan tingkat turnover tinggi.

Melalui analisis Employee Retention Dataset, penelitian ini bertujuan untuk memahami pola dan faktor yang memengaruhi lama karyawan bertahan di perusahaan. Variabel seperti gaji bulanan, kepuasan kerja, pelatihan, dan kinerja dianalisis menggunakan statistik deskriptif dan visualisasi data untuk memberikan gambaran yang jelas mengenai kondisi retensi karyawan di lingkungan kerja.

2 Persiapan Dataset

Pada tahap ini, dataset masih berupa data mentah yang belum melalui proses analisis atau pengolahan lanjutan. Beberapa variabel yang terdapat dalam dataset antara lain:

  • EmployeeID: kode identitas unik untuk setiap karyawan dalam dataset.
  • Department: menunjukkan divisi tempat karyawan bekerja (misalnya Sales, HR, Finance, IT, dll).
  • EmploymentType: status kepegawaian, seperti permanen, magang, atau kontrak.
  • WorkLocation: lokasi kerja karyawan (kantor pusat, kantor cabang, jarak jauh).
  • MonthlySalary: jumlah gaji bulanan yang diterima oleh karyawan (dalam satuan mata uang lokal).
  • WorkHours: jumlah jam kerja rata-rata per minggu yang dilakukan oleh karyawan.
  • TrainingHours: total jam pelatihan yang diikuti oleh karyawan selama periode tertentu.
  • PerformanceScore: skor penilaian kinerja karyawan berdasarkan evaluasi manajerial, biasanya dalam rentang tertentu (misalnya 0–100).
  • JobSatisfactionScore: tingkat kepuasan kerja karyawan terhadap pekerjaannya.
  • ManagerialExperience: jumlah tahun pengalaman kerja sebagai manajer atau supervisor.
  • RetentionPeriod: lama masa kerja karyawan di perusahaan (dalam bulan).

Dataset ini memungkinkan analisis deskriptif untuk memahami gambaran umum tenaga kerja berdasarkan berbagai aspek seperti kompensasi, jam kerja, performa, dan kepuasan kerja. Melalui analisis ukuran pemusatan (sentral tendensi) serta ukuran penyebaran (dispersi), dapat diketahui pola umum maupun variasi di antara karyawan, sehingga membantu perusahaan dalam merancang strategi peningkatan retensi dan kesejahteraan karyawan.

library(readr)
library(ggplot2)
library(knitr)
library(DT)
library(statip)

# Import Data CSV
dataset <- read_csv("MidtermExam.csv", show_col_types = FALSE)

# menampilkan Data CSV
datatable(head(dataset, 2000), caption = "Dataset Employee Retention")

3 Visualisasi

Visualisasi data digunakan untuk memahami pola dan hubungan antarvariabel pada dataset Employee Retention.

  • Diagram Batang: melihat perbandingan jumlah karyawan di tiap departemen.
  • Bagan Donat: menampilkan proporsi lokasi kerja karyawan.
  • Histogram: menunjukkan sebaran lama masa kerja karyawan.
  • Kotak Plot: memperlihatkan perbedaan gaji antar departemen.
  • Petak Sebar: menggambarkan hubungan antara skor performa dan gaji bulanan.

3.1 Diagram Batang

library(ggplot2)
library(plotly)
library(dplyr)

# Impor file CSV
data <- read.csv("MidtermExam.csv")

# Hitung jumlah data per Department dan urutkan dari yang tertinggi
dept_count <- data %>%
  group_by(Department) %>%
  summarise(Jumlah = n()) %>%
  arrange(desc(Jumlah))  # Sorting dari terbesar ke terkecil

# Buat bar chart interaktif
p <- ggplot(dept_count, aes(x = reorder(Department, -Jumlah), y = Jumlah, fill = Department)) +
  geom_bar(stat = "identity", width = 0.7, color = "black") +
  geom_text(aes(label = Jumlah), 
            vjust = -0.5,       
            fontface = "bold", 
            size = 4) +
  labs(
    title = "Total Karyawan per Departemen",
    x = "Departemen",
    y = "Total Karyawan"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 10),
    axis.text.x = element_text(angle = 25, hjust = 2),
    legend.position = "none"
  )

ggplotly(p)     # Membuat Interaktif

Interpretasi: Grafik menunjukkan jumlah karyawan di setiap departemen, dengan distribusi karyawan antar-departemen relatif merata. Terlihat bahwa departemen “Finance” memiliki jumlah karyawan terbanyak, sedangkan Operations paling sedikit. Pola ini mengindikasikan adanya perbedaan kebutuhan tenaga kerja antar-departemen sesuai fungsi organisasi.

3.2 Bagan Donat

library(plotly)
library(dplyr)

data <- read.csv("MidtermExam.csv")

# Hitung jumlah karyawan per WorkLocation
workloc <- data %>%
  group_by(WorkLocation) %>%
  summarise(Jumlah = n())

# Tambahkan proporsi
workloc <- workloc %>%
  mutate(Proporsi = round((Jumlah / sum(Jumlah)) * 100, 1))

# Donut chart menggunakan plotly
plot_ly(
  data = workloc,
  labels = ~WorkLocation,
  values = ~Jumlah,
  type = "pie",
  textinfo = "label+percent",
  insidetextorientation = "radial",
  hole = 0.5   # menjadikan pie → donut
) %>%
  layout(
    title = "Proporsi Lokasi Kerja Karyawan", face = "bold",
    showlegend = FALSE
  )

Interpretasi: Distribusi lokasi kerja menunjukkan bahwa mayoritas karyawan bekerja di kantor pusat (50%), sementara sisanya tersebar di kantor cabang (28.7%) dan bekerja jarak jauh (21.3%). Ini menandakan bahwa struktur kerja perusahaan masih berfokus di pusat, tetapi sudah mulai mengadopsi sistem model kerja campuran dengan proporsi “remote work” yang cukup signifikan.

3.3 Histogram

library(ggplot2)
library(plotly)

# Impor file CSV
data <- read.csv("MidtermExam.csv")

# Buat histogram statis dengan ggplot2
p <- ggplot(data, aes(x = RetentionPeriod)) +
  geom_histogram(
    bins = 25,              # jumlah batang
    fill = "#00BFC4",       # warna batang
    color = "black",        # garis tepi
    alpha = 0.8             # transparansi
  ) +
  scale_x_continuous(
    breaks = seq(0, max(data$RetentionPeriod), by = 12),   # interval tiap 12 bulan
    labels = function(x) paste(x)
  ) +
  labs(
    title = "Distribusi Masa Kerja Karyawan",
    x = "Periode Retensi (bulan)",
    y = "Frekuensi"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 12)
  )

ggplotly(p)     # Jadikan interaktif

Interpretasi: Histogram menunjukkan bahwa sebagian besar karyawan memiliki masa kerja menengah, dengan puncak frekuensi pada kisaran 6–8 tahun atau sekitar 80-94 bulan. Pola ini mengindikasikan tingkat retensi yang stabil di perusahaan dan loyalitas tinggi pada mayoritas karyawan. Meskipun terdapat beberapa karyawan yang memiliki masa kerja sangat pendek maupun sangat panjang, namun jumlahnya relatif kecil.

3.4 Kotak Plot

library(readr)
library(ggplot2)
library(plotly)

# Impor data
data <- read_csv("MidtermExam.csv")

# Boxplot salary berdasarkan department
p <- ggplot(data, aes(x = Department, y = MonthlySalary, fill = Department)) +
  geom_boxplot(outlier.color = "red", outlier.size = 2, alpha = 0.7) +
  labs(
    title = "Distribusi Gaji Bulanan Karyawan per Departemen",
    x = "Departemen",
    y = "Gaji Bulanan"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 10, face = "bold", hjust = 0.5),
    axis.text.x = element_text(angle = 25, hjust = 1),   # agar label tidak menumpuk
    legend.position = "none"                      
  )

ggplotly(p)

Interpretasi: Boxplot menunjukkan bahwa median gaji antar-departemen relatif serupa, sekitar Rp10–12 juta. Departemen HR memiliki sebaran gaji paling lebar, sedangkan Finance menampilkan satu nilai pencilan dengan gaji jauh lebih tinggi (sekitar Rp21,8 juta). Hal ini menunjukkan adanya variasi kompensasi antar-departemen, yang mungkin terkait dengan perbedaan tanggung jawab dan jabatan.

3.5 Petak Sebar

# Import library
library(readr)
library(ggplot2)
library(plotly)

# Baca data
data <- read_csv("MidtermExam.csv")

# Scatter plot interaktif + garis tren

p <- ggplot(data, aes(x = PerformanceScore, y = MonthlySalary)) +
  geom_point(alpha = 0.5, color = "#2C73D2", size = 2) +  # alpha agar tidak menumpuk
  geom_smooth(method = "lm", se = TRUE, color = "red", linewidth = 1) +  # trend line
  labs(
    title = "Hubungan Antara Skor Kinerja Karyawan dengan Gaji Bulanan",
    x = "Skor Kinerja",
    y = "Gaji Bulanan"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5)
  )
ggplotly(p)   # interaktif

Interpretasi: Petak Sebar/Scatter Plot menunjukkan hubungan antara skor performa dan gaji bulanan tersebar cukup merata tanpa pola yang jelas, menandakan tidak ada hubungan yang signifikan antara performa dan gaji bulanan. Garis tren yang hampir datar memperkuat bahwa peningkatan kinerja belum secara konsisten diikuti oleh peningkatan gaji. Beberapa titik di bagian atas grafik tampak sebagai outlier, yaitu karyawan dengan gaji jauh lebih tinggi dari rata-rata yang mengindikasikan bahwa kompensasi karyawan lebih dipengaruhi oleh faktor lain.

4 Analisis Sentral Tendensi

Analisis sentral tendensi digunakan untuk melihat nilai yang mewakili pusat data. Dua variabel numerik yang akan dianalisis pada dataset ini adalah Monthly Salary dan Work Hours, karena keduanya mencerminkan kompensasi dan beban kerja karyawan yang berpotensi memengaruhi retensi.

4.1 Calculate Mean, Median, Mode

Tiga ukuran utama central tendency:

  • Rata-rata: Cocok digunakan ketika data tidak memiliki nilai ekstrem, karena mean menunjukkan kondisi umum seluruh data. \[ \bar{X} = \frac{\sum_{i=1}^{n} X_i}{n} \]
  • Nilai Tengah: Lebih tepat digunakan jika terdapat nilai ekstrem, karena median tidak dipengaruhi nilai yang terlalu tinggi atau terlalu rendah.

\[ \text{Nilai Tengah} = L + \left( \frac{\frac{n}{2} - F}{f} \right) \times c \]

  • Nilai yang Paling Sering Muncul (Modus): Digunakan untuk mengetahui kategori atau nilai yang paling sering muncul, misalnya tingkat kepuasan atau posisi jabatan yang paling umum.
library(dplyr)
library(DT)

# Impor data CSV
df <- read.csv("MidtermExam.csv")

# Fungsi Mode
get_mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

# Hitung mean, median, mode
tabel_central <- data.frame(
  Variable = c("MonthlySalary", "WorkHours"),
  Mean = c(mean(df$MonthlySalary, na.rm = TRUE),
           mean(df$WorkHours, na.rm = TRUE)),
  Median = c(median(df$MonthlySalary, na.rm = TRUE),
             median(df$WorkHours, na.rm = TRUE)),
  Mode = c(get_mode(df$MonthlySalary),
           get_mode(df$WorkHours))
)

# Tabel interaktif rapi
datatable(
  tabel_central,
  caption = htmltools::tags$caption(
    style = 'caption-side: top; text-align: center; 
             font-size:16px; font-weight:bold; color:#003366;',
    'Ukuran Central Tendency: Monthly Salary & Work Hours'
  ),
  options = list(dom = 't', pageLength = 5)
) %>%
  formatStyle(
    "Variable",
    fontWeight = "bold"
  )

4.2 Grafik Variabel Gaji Bulanan (Left Skewed)

library(ggplot2)
library(plotly)
library(dplyr)
library(readr)

# Import Data CSV
data_ct <- read_csv("MidtermExam.csv", show_col_types = FALSE)


# VISUALISASI 1: MONTHLY SALARY
data_salary <- data_ct %>%
  select(MonthlySalary) %>%
  filter(!is.na(MonthlySalary))

# Hitung ukuran pemusatan untuk MonthlySalary
mean_salary   <- mean(data_salary$MonthlySalary)
median_salary <- median(data_salary$MonthlySalary)
mode_salary   <- as.numeric(names(
  sort(table(round(data_salary$MonthlySalary, 1)), decreasing = TRUE)[1]
))

# Visualisasi: Histogram + Density Curve Interaktif untuk MonthlySalary
p_salary <- ggplot(data_salary, aes(x = MonthlySalary)) +
  geom_histogram(
    aes(y = after_stat(density)),
    bins = 30,
    fill = "#80cdc1",               # warna batang lembut
    color = "white",
    alpha = 0.85
  ) +
  geom_density(
    color = "#01665e",              # warna kurva lebih tegas
    linewidth = 1.2,
    alpha = 0.8,
    adjust = 1.2
  ) +
  geom_vline(aes(xintercept = mean_salary, color = "Rata-rata"), linewidth = 1.1) +
  geom_vline(aes(xintercept = median_salary, color = "NilaiTengah"), 
             linewidth = 1.1, linetype = "dashed") +
  geom_vline(aes(xintercept = mode_salary, color = "Modus"), 
             linewidth = 1.1, linetype = "dotdash") +
  scale_color_manual(
    values = c("Rata-rata" = "#b2182b", "NilaiTengah" = "#4dac26", "Modus" = "#2166ac")
  ) +
  labs(
    title = "Distribusi Gaji Bulanan",
    subtitle = paste("Rata-rata:", round(mean_salary, 2), 
                     "| NilaiTengah:", round(median_salary, 2),
                     "| Modus:", round(mode_salary, 2)),
    x = "Gaji Bulanan",
    y = "Kepadatan",
    color = "Sentral Tendensi"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40", size = 12),
    legend.position = "bottom",
    legend.title = element_text(face = "bold"),
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(color = "grey90")
  )

# Jadikan interaktif
ggplotly(p_salary, tooltip = c("x", "y", "density")) %>%
  layout(legend = list(orientation = "h", x = 0.5, y = -0.2, xanchor = "center"))

Interpretasi: Sebaran gaji karyawan cenderung mendekati normal, namun sedikit miring ke kiri yang terlihat dari posisi rata-rata berada di sebelah kiri nilai tengah dan modus, sehingga urutannya menjadi rata-rata < nilai tengah < modus. Kondisi ini terjadi karena terdapat sebagian kecil karyawan dengan gaji yang lebih rendah, yang menarik nilai rata-rata ke arah kiri. Nilai tengah tetap berada di tengah dan tidak terpengaruh oleh nilai ekstrem, sementara modus menggambarkan rentang gaji yang paling sering muncul di dalam perusahaan. Meskipun terdapat kemiringan ke kiri, ketiga ukuran pemusatan masih berada dalam rentang yang berdekatan, sehingga distribusi gaji secara keseluruhan tetap stabil dan tidak menunjukkan variasi yang ekstrem antar karyawan.

4.3 Grafik Variabel Jam Kerja (Right Skewed)

library(ggplot2)
library(plotly)
library(dplyr)
library(readr)

# Import Data CSV
data_ct <- read_csv("MidtermExam.csv", show_col_types = FALSE)

# VISUALISASI 2: WORK HOURS
data_hours <- data_ct %>%
  select(WorkHours) %>%
  filter(!is.na(WorkHours))

# Hitung mean, median, modus
mean_hours   <- mean(data_hours$WorkHours)
median_hours <- median(data_hours$WorkHours)
mode_hours   <- as.numeric(names(
  sort(table(round(data_hours$WorkHours, 1)), decreasing = TRUE)[1]
))

# Visualisasi: Histogram + Density Curve Interaktif
p_hours <- ggplot(data_hours, aes(x = WorkHours)) +
  geom_histogram(
    aes(y = after_stat(density)),
    bins = 30,                     # jumlah batang
    fill = "#92c5de",              
    color = "white",
    alpha = 0.85
  ) +
  geom_density(
    color = "#0571b0",             # garis density
    linewidth = 1.2,
    alpha = 0.8,
    adjust = 1.2
  ) +
  geom_vline(aes(xintercept = mean_hours, color = "Rata-rata"), linewidth = 1.1) +
  geom_vline(aes(xintercept = median_hours, color = "NilaiTengah"),
             linewidth = 1.1, linetype = "dashed") +
  geom_vline(aes(xintercept = mode_hours, color = "Modus"),
             linewidth = 1.1, linetype = "dotdash") +
  scale_color_manual(
    values = c("Rata-rata" = "#b2182b", "NilaiTengah" = "#4dac26", "Modus" = "#2166ac")
  ) +
  labs(
    title = "Distribusi Jam Kerja",
    subtitle = paste("Rata-rata:", round(mean_hours, 2),
                     "| NilaiTengah:", round(median_hours, 2),
                     "| Modus:", round(mode_hours, 2)),
    x = "Jam Kerja (per minggu)",
    y = "Kepadatan",
    color = "Sentral Tendensi"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40", size = 12),
    legend.position = "bottom",
    legend.title = element_text(face = "bold"),
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(color = "grey90"),
    axis.text.x = element_text(angle = 0, vjust = 0.5)  # sumbu x rapi
  )

# Buat interaktif
ggplotly(p_hours, tooltip = c("x", "y", "density")) %>%
  layout(legend = list(orientation = "h", x = 0.5, y = -0.2, xanchor = "center"))

Interpretasi: Jam kerja karyawan per minggu cenderung terpusat pada satu rentang nilai yang umum, sehingga distribusinya tampak stabil dan mendekati normal. Berdasarkan posisi ukuran pemusatan, urutannya adalah modus < nilai tengah < rata-rata, yang menunjukkan bahwa nilai rata-rata berada sedikit lebih tinggi dibanding nilai tengah dan modus. Pola ini mengindikasikan adanya kemiringan ke kanan, di mana sebagian kecil karyawan memiliki jam kerja lebih panjang dari mayoritas, sehingga menarik nilai rata-rata ke kanan. Meskipun begitu, posisi ukuran pemusatan masih cukup berdekatan, sehingga penyimpangan tersebut tidak terlalu signifikan dan sebagian besar karyawan tetap memiliki jam kerja yang konsisten dalam rentang normal yang sama.

4.4 Perbandingan Gaji Bulanan dan Jam Kerja

Berdasarkan kedua variabel, distribusi Gaji Bulanan cenderung normal namun sedikit miring ke kiri (left-skewed). Hal ini menunjukkan adanya sebagian kecil karyawan bergaji rendah yang menurunkan rata-rata, tetapi secara umum gaji tetap stabil antarindividu. Sementara itu, jam kerja sedikit miring ke kanan (right-skewed), menandakan sebagian kecil karyawan bekerja lebih lama dari rata-rata. Kedua variabel memiliki nilai rata-rata, nilai tengah, dan modus yang berdekatan, sehingga data tergolong stabil tanpa penyimpangan besar.

5 Ukuran Dispersi

Ukuran penyebaran data adalah cara untuk melihat seberapa jauh data menyebar atau bervariasi dari nilai rata-ratanya. Jadi, kalau ukuran pemusatan (seperti mean atau median) memberi tahu kita pusat dari data, maka ukuran penyebaran ini memberi tahu kita seberapa beragam data tersebut.

Dengan kata lain, ukuran dispersi membantu kita memahami apakah data yang kita miliki cenderung seragam (mirip-mirip) atau justru menyebar luas (banyak perbedaan) antar nilainya.

Untuk memahami tingkat variasi data, dihitung empat ukuran dispersi utama yaitu jangkauan, varians, simpangan baku, dan IQR pada dua variabel numerik yang sama dengan analisis sentral tendensi, Gaji Bulanan dan Jam Kerja. Hasil perhitungannya ditampilkan pada tabel berikut.

library(dplyr)
library(DT)
library(readr)

# Baca dataset
data_disp <- read_csv("MidtermExam.csv", show_col_types = FALSE)

# Hitung ukuran dispersi untuk MonthlySalary & WorkHours
disp_summary <- data_disp %>%
  summarise(
    Min_MonthlySalary  = min(MonthlySalary, na.rm = TRUE),
    Maks_MonthlySalary  = max(MonthlySalary, na.rm = TRUE),
    Jangkauan_MonthlySalary = Maks_MonthlySalary - Min_MonthlySalary,
    Varians_MonthlySalary = var(MonthlySalary, na.rm = TRUE),
    SimpanganBaku_MonthlySalary = sd(MonthlySalary, na.rm = TRUE),
    Q1_MonthlySalary = quantile(MonthlySalary, 0.25, na.rm = TRUE),
    Q3_MonthlySalary = quantile(MonthlySalary, 0.75, na.rm = TRUE),
    IQR_MonthlySalary = IQR(MonthlySalary, na.rm = TRUE),
    
    Min_WorkHours  = min(WorkHours, na.rm = TRUE),
    Maks_WorkHours  = max(WorkHours, na.rm = TRUE),
    Jangkauan_WorkHours = Maks_WorkHours - Min_WorkHours,
    Varians_WorkHours = var(WorkHours, na.rm = TRUE),
    SimpanganBaku_WorkHours = sd(WorkHours, na.rm = TRUE),
    Q1_WorkHours = quantile(WorkHours, 0.25, na.rm = TRUE),
    Q3_WorkHours = quantile(WorkHours, 0.75, na.rm = TRUE),
    IQR_WorkHours = IQR(WorkHours, na.rm = TRUE)
  ) %>%
  tidyr::pivot_longer(
    everything(),
    names_to = c(".value", "Variabel"),
    names_sep = "_"
  ) %>%
  mutate(across(where(is.numeric), ~round(., 2)))   # pembulatan angka (agar rapih)

# Tampilkan tabel interaktif
datatable(
  disp_summary,
  caption = htmltools::tags$caption(
    style = 'caption-side: top; text-align: center; 
             font-size:16px; font-weight:bold; color:#003366;',
    'Ukuran Penyebaran: Gaji Bulanan & Jam Kerja'
  ),
  options = list(dom = 't', pageLength = 5)
) %>%
  formatStyle(
    "Variabel",
    fontWeight = "bold"
  )

Berdasarkan hasil perhitungan, Jam Kerja memiliki Jangkauan, Varians, dan Simpangan Baku yang lebih tinggi dibandingkan Gaji Bulanan. Hal ini menunjukkan bahwa jam kerja lebih beragam, sedangkan gaji karyawan relatif seragam.

5.1 Kotak Plot

library(ggplot2)
library(plotly)
library(dplyr)
library(tidyr)

# Ambil data
data_disp <- data_ct %>%
  select(MonthlySalary, WorkHours) %>%
  pivot_longer(cols = everything(), names_to = "Variabel", values_to = "Nilai")

# Hitung mean tiap variabel
summary_disp <- data_disp %>%
  group_by(Variabel) %>%
  summarise(Mean = mean(Nilai, na.rm = TRUE))

# Plot gabungan interaktif
p_disp <- ggplot(data_disp, aes(x = Variabel, y = Nilai, fill = Variabel)) +
  geom_violin(alpha = 0.4, trim = FALSE, color = NA) +
  geom_boxplot(width = 0.15, outlier.color = "red", alpha = 0.6) +
  stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "blue", color = "black") +
  geom_text(
    data = summary_disp,
    aes(x = Variabel, y = Mean + 2,
        label = paste0("Rata-rata = ", round(Mean, 2))),
    color = "blue", size = 3.5, fontface = "bold", inherit.aes = FALSE
  ) +
  labs(
    title = "Perbandingan Dispersi: Gaji Bulanan & Jam Kerja",
    subtitle = "Memvisualisasikan sebaran, outlier, dan perbedaan rata-rata",
    x = "",
    y = "Nilai"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold") 
  )

# Jadikan interaktif
ggplotly(p_disp, tooltip = c("x", "y"))

Interpretasi: Visualisasi kotak plot menunjukkan bahwa Gaji Bulanan memiliki penyebaran data yang lebih sempit di sekitar rata-rata, menandakan gaji antar karyawan relatif seragam sehingga variabilitasnya rendah. Sebaliknya, Jam Kerja memiliki kotak dan rentang yang lebih panjang serta beberapa outlier, yang menandakan variasi jam kerja lebih tinggi. Dengan demikian, Jam Kerja memiliki variabilitas yang lebih besar, karena perbedaan peran atau sistem kerja fleksibel di perusahaan.

5.2 Histogram

library(dplyr)
library(ggplot2)
library(plotly)
library(tidyr)

# Siapkan Data
data_disp <- data_ct %>%
  select(MonthlySalary, WorkHours) %>%
  pivot_longer(cols = everything(),
               names_to = "Variabel",
               values_to = "Nilai") %>%
  filter(!is.na(Nilai))

# Hitung Mean dan Peak Density untuk Label
summary_disp <- data_disp %>%
  group_by(Variabel) %>%
  summarise(
    RataRata = mean(Nilai, na.rm = TRUE),
    PeakY = max(density(Nilai, na.rm = TRUE)$y)
  )

# Buat Histogram & Density Interaktif
p_disp <- ggplot(data_disp, aes(x = Nilai, fill = Variabel)) +
  geom_histogram(aes(y = after_stat(density)),
                 alpha = 0.5, color = "black", bins = 50,
                 position = "identity") +
  geom_density(alpha = 0.4, color = "darkblue", linewidth = 1) +
  geom_vline(data = summary_disp,
             aes(xintercept = RataRata, color = Variabel),
             linetype = "dashed", linewidth = 1) +
  geom_text(
    data = summary_disp,
    aes(x = RataRata, y = PeakY + 0.002,
        label = paste0("RataRata = ", round(RataRata, 2))),
    color = "blue", fontface = "bold", size = 3.5
  ) +
  facet_wrap(~Variabel, ncol = 1, scales = "free_y") +
  labs(
    title = "Histogram & Kepadatan: Distribusi Gaji Bulanan dan Jam Kerja",
    subtitle = "setiap panel menunjukkan distribusi dan garis putus-putus rata-rata",
    x = "Nilai (Gaji Bulanan dan Jam Kerja)",
    y = "Kepadatan"
  ) +
  theme_minimal(base_size = 10) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40")
  )
ggplotly(p_disp, tooltip = c("x", "y"))

Interpretasi: Histogram menunjukkan bahwa Gaji Bulanan memiliki penyebaran data yang lebih sempit dan terkonsentrasi di sekitar nilai rata-rata (~9.97), menandakan gaji antar karyawan relatif seragam. Sebaliknya, Jam Kerja memiliki distribusi yang lebih lebar dengan sebaran nilai yang bervariasi di sekitar rata-rata (~45.09). Hal ini menunjukkan variabilitas yang lebih besar pada jam kerja, kemungkinan disebabkan oleh perbedaan posisi, kebijakan shift, atau fleksibilitas waktu kerja di perusahaan.

5.3 Petak Sebar

library(ggplot2)
library(plotly)

p <- ggplot(data, aes(x = `WorkHours`, y = `MonthlySalary`)) +
  geom_point(color = "steelblue", alpha = 0.4, size = 2) +
  geom_smooth(method = "lm", color = "red", se = FALSE, linewidth = 1) +
  geom_hline(yintercept = mean(data$MonthlySalary), 
             linetype = "dashed", color = "black") +
  geom_vline(xintercept = mean(data$WorkHours),
             linetype = "dashed", color = "gray40") +
  labs(
    title = "Hubungan Antara Gaji Bulanan dan Jam Kerja",
    subtitle = "Setiap titik mewakili seorang karyawan; garis merah menunjukkan tren linier",
    x = "Jam Kerja per minggu",
    y = "Gaji Bulanan"
  ) +
  theme_minimal(base_size = 10)

ggplotly(p)

Interpretasi: Petak Sebar menunjukkan bahwa hubungan antara Jam Kerja dan Gaji Bulanan bersifat acak tanpa pola yang jelas. Meskipun sebagian besar karyawan memiliki jam kerja yang berada dalam rentang yang sama, gaji mereka tersebar luas pada setiap level jam kerja. Hal ini mengindikasikan bahwa lamanya jam kerja tidak berpengaruh signifikan terhadap besarnya gaji. Dibandingkan dengan Jam Kerja, Gaji Bulanan memiliki variabilitas yang lebih tinggi, yang menunjukkan adanya perbedaan gaji antar karyawan meskipun jam kerja mereka serupa, kemungkinan dipengaruhi oleh faktor lain seperti posisi atau pengalaman.

6 Kesimpulan dan Interpretasi

Berdasarkan hasil analisis “Employee Retention Dataset”, variabel Gaji Bulanan menunjukkan konsistensi tertinggi dengan penyebaran data yang rendah. Nilai rata-rata, nilai tengah, dan modus yang berdekatan menggambarkan bahwa sistem kompensasi perusahaan cukup stabil dan merata di antara karyawan. Sebaliknya, variabel Jam Kerja memiliki variasi terbesar dengan rentang jam kerja yang luas antarindividu, menandakan adanya perbedaan pola kerja yang kemungkinan dipengaruhi oleh posisi, tanggung jawab, atau fleksibilitas jadwal kerja.

Melalui hasil visualisasi, terlihat bahwa Departemen “Finance” memiliki jumlah karyawan terbanyak, mayoritas bekerja di kantor pusat, dan masa kerja puncak terjadi pada kisaran 7–8 tahun, menunjukkan tingkat retensi yang baik. Petak Sebar mengindikasikan tidak adanya korelasi kuat antara kinerja dan gaji, sehingga faktor seperti kepuasan kerja atau keseimbangan hidup mungkin lebih berpengaruh. Secara keseluruhan, perusahaan memiliki struktur kompensasi yang stabil, namun perlu memperhatikan variasi jam kerja dan sistem penghargaan berbasis performa untuk meningkatkan keseimbangan dan loyalitas karyawan.

7 Vidio Penjelasan

Klik untuk menonton video