ID: 52250073
Institut Teknologi Sains Bandung
Data Science Programming
Dalam analisis data dan pemodelan statistik, pemilihan fungsi yang tepat sangat krusial untuk menggambarkan tren data secara akurat. Kode ini dirancang untuk memvisualisasikan bagaimana berbagai jenis model matematika—mulai dari yang sederhana hingga yang kompleks—merespons perubahan nilai input (\(x\)). Tujuan utama dari simulasi ini adalah:
Melihat perbedaan visual yang kontras antara pertumbuhan konstan (linear) dengan pertumbuhan yang dipercepat (polinomial dan eksponensial).
Memahami seberapa cepat fungsi eksponensial “meninggalkan” fungsi lainnya seiring bertambahnya nilai \(x\).
Membantu dalam menentukan model mana yang paling sesuai untuk fenomena tertentu (misalnya: pertumbuhan penduduk, bunga majemuk, atau degradasi fisik).
library(plotly)
compute_formula <- function(x, formula_type){
if(formula_type == "linear"){
return(2*x + 3)
} else if(formula_type == "quadratic"){
return(x^2 + 2*x + 1)
} else if(formula_type == "cubic"){
return(x^3)
} else if(formula_type == "exponential"){
return(exp(x))
} else {
stop("Formula tidak valid")
}
}
x <- 1:20
plot_ly() %>%
add_lines(x = x, y = compute_formula(x, "linear"), name = "Linear") %>%
add_lines(x = x, y = compute_formula(x, "quadratic"), name = "Quadratic") %>%
add_lines(x = x, y = compute_formula(x, "cubic"), name = "Cubic") %>%
add_lines(x = x, y = compute_formula(x, "exponential"), name = "Exponential")
Meskipun pada nilai \(x\) yang kecil (seperti 1 atau 2) fungsi-fungsi ini mungkin terlihat berdekatan, saat memasuki rentang \(x = 10\) hingga \(20\), fungsi Eksponensial akan mendominasi grafik secara drastis. Hal ini menunjukkan mengapa fenomena eksponensial (seperti penyebaran virus atau bunga bank) seringkali sulit diprediksi secara intuitif oleh manusia dibandingkan dengan tren linear.
Simulasi ini bertujuan memodelkan fluktuasi kinerja penjualan harian dari lima tenaga penjual untuk mengevaluasi efektivitas kebijakan diskon otomatis. Manfaatnya adalah memberikan gambaran visual bagi manajemen dalam membandingkan stabilitas performa antar individu serta memantau distribusi hasil penjualan secara lebih akurat.
simulate_sales <- function(n_salesperson, days){
results <- data.frame()
for(i in 1:n_salesperson){
for(d in 1:days){
sales <- sample(100:1000,1)
discount <- ifelse(sales > 500, 0.1, 0.05)
results <- rbind(results, data.frame(id=i, day=d, sales=sales, discount=discount))
}
}
return(results)
}
data_sales <- simulate_sales(5,10)
plot_ly(data_sales,
x = ~day,
y = ~sales,
color = ~factor(id),
type = "scatter",
mode = "lines")
Data menunjukkan variabilitas yang tinggi tanpa dominasi konsisten oleh satu individu, mencerminkan kondisi pasar yang dinamis. Grafik ini menyoroti bagaimana ambang batas diskon 500 unit mempengaruhi pola transaksi, sekaligus membantu perusahaan menetapkan target kuota yang lebih realistis berdasarkan sebaran nilai penjualan harian yang teramati.
Visualisasi ini bertujuan untuk mengelompokkan hasil penjualan ke dalam lima kategori performa guna mengukur distribusi efektivitas tim secara kolektif. Dengan memetakan data ke dalam diagram lingkaran (pie chart), manajemen dapat dengan cepat menilai kesehatan operasional melalui komposisi persentase kontribusi penjualan dari level “Poor” hingga “Excellent”.
categorize_performance <- function(sales){
cut(sales,
breaks=c(-Inf,200,400,600,800,Inf),
labels=c("Poor","Average","Good","Very Good","Excellent"))
}
categories <- categorize_performance(data_sales$sales)
plot_ly(labels = names(table(categories)),
values = table(categories),
type = "pie")
Diagram ini mengungkapkan profil kekuatan tim secara visual, di mana dominasi pada kategori tertentu menunjukkan standar pencapaian yang sedang berjalan. Sebaran ini memberikan indikasi apakah target penjualan saat ini terlalu mudah dicapai atau justru terlalu kompetitif, sehingga memudahkan perusahaan dalam merumuskan strategi pelatihan yang lebih tepat sasaran bagi kategori yang tertinggal.
Implementasi tabel interaktif ini bertujuan untuk menyediakan basis data komprehensif yang mengintegrasikan aspek kompensasi dan metrik keberhasilan karyawan di tiga entitas perusahaan yang berbeda. Dengan fitur filter dan pencarian real-time, manajemen dapat dengan mudah melakukan audit internal, memonitor struktur penggajian, serta memvalidasi korelasi antara investasi sumber daya manusia (gaji) terhadap output kerja (KPI dan skor performa).
library(DT)
generate_company_data <- function(n_company, n_employees){
# Menggunakan list untuk performa yang lebih baik daripada rbind dalam loop
data_list <- lapply(1:n_company, function(c) {
data.frame(
company = paste("Company", c),
emp = 1:n_employees,
salary = sample(3000:10000, n_employees, replace = TRUE),
performance = round(runif(n_employees, 60, 100), 2),
kpi = round(runif(n_employees, 50, 100), 2)
)
})
return(do.call(rbind, data_list))
}
## Generate data
company_data <- generate_company_data(3, 50)
## Menampilkan Tabel Interaktif
datatable(
company_data,
filter = 'top', # Menambahkan kolom filter di atas
options = list(
pageLength = 10, # Menampilkan 10 baris per halaman
autoWidth = TRUE,
columnDefs = list(list(className = 'dt-center', targets = "_all"))
),
colnames = c('ID', 'Company Name', 'Employee ID', 'Salary ($)', 'Performance Score', 'KPI Score'),
caption = 'Tabel Data Gaji dan Performa Karyawan'
)
Data ini memungkinkan identifikasi anomali produktivitas, di mana manajemen dapat menyaring karyawan dengan gaji tinggi namun memiliki skor KPI rendah, atau sebaliknya, untuk penyesuaian kebijakan insentif. Selain itu, sebaran data yang dihasilkan secara acak mencerminkan keberagaman talenta dalam perusahaan; melalui fungsi filter di setiap kolom, pengguna dapat langsung memetakan distribusi talenta unggul (skor > 90) di tiap perusahaan guna mendukung keputusan strategis terkait promosi atau pengembangan kapasitas tim secara lebih transparan.
Simulasi ini menggunakan metode Monte Carlo untuk mengestimasi nilai matematika \(\pi\) melalui pendekatan probabilitas statistik dan geometri. Dengan menempatkan ribuan titik secara acak di dalam sebuah persegi yang memuat seperempat lingkaran, visualisasi ini bertujuan mendemonstrasikan bagaimana sampel acak yang besar dapat digunakan untuk memecahkan masalah deterministik—dalam hal ini, menghitung rasio luas area untuk menemukan nilai konstan \(\pi\).
library(plotly)
monte_carlo_pi <- function(n) {
# 1. Generate titik acak
x <- runif(n)
y <- runif(n)
# 2. Cek apakah titik berada di dalam lingkaran
inside <- (x^2 + y^2 <= 1)
pi_est <- 4 * mean(inside)
# 3. Siapkan data untuk plot
df <- data.frame(
x = x,
y = y,
status = ifelse(inside, "Inside", "Outside")
)
# 4. Buat visualisasi interaktif dengan Plotly
fig <- plot_ly(data = df, x = ~x, y = ~y, color = ~status,
colors = c("#0f4c81", "#ff6b6b"), # Sesuai tema navy Anda
type = "scatter", mode = "markers",
marker = list(size = 5, opacity = 0.7)) %>%
layout(
title = paste("Monte Carlo Pi Estimation:", pi_est),
xaxis = list(title = "X", range = c(0, 1)),
yaxis = list(title = "Y", range = c(0, 1), scaleanchor = "x", scaleratio = 1),
shapes = list(
list(
type = "path",
path = "M 1,0 A 1,1 0 0 0 0,1 L 0,0 Z", # Menggambar busur lingkaran
line = list(color = "#2c3e50", width = 2)
)
),
margin = list(t = 50)
)
return(fig)
}
# Jalankan fungsi dengan 2000 titik agar lebih akurat tapi tetap ringan
monte_carlo_pi(2000)
Visualisasi ini menunjukkan bahwa keakuratan estimasi \(\pi\) sangat bergantung pada kerapatan titik (sampel); semakin banyak titik yang tersebar, semakin presisi nilai yang dihasilkan mendekati 3,14. Secara visual, sebaran warna yang memisahkan titik di dalam (inside) dan di luar (outside) busur lingkaran memberikan bukti intuitif mengenai hukum bilangan besar (Law of Large Numbers), di mana pola geometris yang jelas mulai muncul dari keacakan murni, membuktikan bahwa metode stokastik merupakan alat analisis yang kuat untuk estimasi numerik yang kompleks.
Analisis ini berfokus pada transformasi dan rekayasa fitur (feature engineering) untuk menyelaraskan berbagai metrik karyawan yang memiliki satuan berbeda menjadi skala yang seragam. Dengan menerapkan teknik Min-Max Normalization (skala 0-1) dan Z-Score Standardization (rata-rata 0, standar deviasi 1), data mentah seperti gaji dan skor KPI dapat diperbandingkan secara apel-ke-apel (apple-to-apple). Tujuannya adalah untuk menghilangkan bias skala, sehingga variabel dengan angka besar (seperti gaji ribuan dolar) tidak mendominasi variabel dengan rentang kecil (seperti skor performa) saat dilakukan analisis statistik atau pemodelan lebih lanjut.
# --- 1. Persiapan Library ---
library(dplyr)
library(tidyr)
library(plotly)
library(DT)
# --- 2. Fungsi Transformasi ---
# Normalisasi: Skala 0-1 (Min-Max)
normalize_min_max <- function(x) {
(x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}
# Z-score: Standardisasi (Mean=0, SD=1)
standardize_zscore <- function(x) {
(x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)
}
# --- 3. Transformasi dengan Loop & Feature Engineering ---
numeric_cols <- c("salary", "performance", "kpi")
company_data_final <- company_data
# Loop untuk Normalisasi dan Z-Score
for(col in numeric_cols) {
# Normalisasi (0-1)
company_data_final[[paste0(col, "_norm")]] <- normalize_min_max(company_data[[col]])
# Z-score (Standard)
company_data_final[[paste0(col, "_z")]] <- standardize_zscore(company_data[[col]])
}
# Membuat Fitur Baru (Categorical)
company_data_final <- company_data_final %>%
mutate(
# Kategori Performa dari skor asli
performance_category = case_when(
performance >= 90 ~ "Elite",
performance >= 75 ~ "High Performer",
performance >= 60 ~ "Average",
TRUE ~ "Under Review"
),
# Kelompok Gaji (High, Mid, Low) berdasarkan kuantil
salary_bracket = ntile(salary, 3) %>%
factor(labels = c("Low", "Mid", "High"))
)
# Tampilkan tabel interaktif (Data yang sudah diproses)
datatable(head(company_data_final, 10), options = list(scrollX = TRUE))
# --- 4. Visualisasi Distribusi: Sebelum vs Sesudah ---
# A. Histogram Perbandingan (Salary vs Normalized Salary)
p1 <- plot_ly(x = ~company_data_final$salary, type = "histogram",
name = "Original Salary", marker = list(color = '#0f4c81')) %>%
layout(xaxis = list(title = "Value"))
p2 <- plot_ly(x = ~company_data_final$salary_norm, type = "histogram",
name = "Normalized Salary", marker = list(color = '#1f6f8b')) %>%
layout(xaxis = list(title = "Value (0-1 Scale)"))
subplot(p1, p2, nrows = 1, margin = 0.05) %>%
layout(title = "Perbandingan Distribusi: Original vs Normalized (Min-Max Scaling)")
# B. Boxplot Perbandingan (Standardization vs Normalization pada Performance)
plot_ly(company_data_final) %>%
add_trace(y = ~performance_norm, type = "box", name = "Min-Max (0-1)",
marker = list(color = '#2c7da0')) %>%
add_trace(y = ~performance_z, type = "box", name = "Z-Score (Standard)",
marker = list(color = '#ff6b6b')) %>%
layout(
title = "Perbandingan Skala: Normalisasi vs Z-Score (Performance)",
yaxis = list(title = "Transformed Value"),
xaxis = list(title = "Method")
)
Melalui visualisasi histogram dan boxplot, terlihat bahwa meskipun bentuk distribusi data asli tetap terjaga, rentang nilai telah bergeser menjadi lebih ramping. Normalisasi sangat efektif untuk melihat posisi relatif karyawan dalam rentang 0-1, sedangkan Z-score memudahkan identifikasi pencilan (outliers) atau karyawan yang kinerjanya berada jauh di atas atau di bawah rata-rata perusahaan.
Penambahan fitur kategori seperti Performance Category (Elite, High Performer, dsb.) dan Salary Bracket memungkinkan manajemen untuk melakukan pemetaan talenta yang lebih tajam. Insight ini memudahkan identifikasi segmen “High Impact”, yaitu karyawan di braket gaji menengah namun memiliki performa “Elite”, yang merupakan aset paling efisien bagi organisasi.
Analisis ini bertujuan untuk mengevaluasi hubungan antara kompensasi finansial dan produktivitas serta membandingkan stabilitas kualitas kerja antar entitas perusahaan. Melalui Scatter Plot, kita memetakan korelasi antara besaran gaji dengan pencapaian KPI untuk melihat apakah investasi gaji yang lebih tinggi berbanding lurus dengan output kerja. Sementara itu, penggunaan Box Plot berfungsi untuk membedah distribusi skor performa, memberikan gambaran mengenai konsistensi kualitas karyawan serta sebaran nilai (rentang minimum hingga maksimum) di setiap perusahaan.
plot_ly(company_data,
x = ~salary,
y = ~kpi,
color = ~factor(company),
type = "scatter",
mode = "markers")
plot_ly(company_data,
x = ~company,
y = ~performance,
type = "box")
Grafik sebaran menunjukkan apakah terdapat pola linear antara gaji dan KPI; jika titik-titik tersebar secara acak, hal ini mengindikasikan bahwa gaji tinggi tidak menjamin KPI yang tinggi, sehingga perusahaan perlu meninjau ulang sistem insentif mereka. Perbedaan warna memudahkan identifikasi perusahaan mana yang memiliki klaster karyawan “berbiaya rendah namun berprestasi tinggi”.
Melalui boxplot, manajemen dapat melihat perusahaan mana yang memiliki standar kerja paling stabil. Perusahaan dengan kotak (IQR) yang lebih sempit menunjukkan konsistensi performa antar karyawan, sedangkan kotak yang lebar atau adanya titik pencilan (outliers) menandakan adanya kesenjangan kompetensi yang signifikan di dalam tim tersebut yang memerlukan intervensi pelatihan atau standarisasi kerja.
Sistem ini dirancang untuk menghasilkan laporan performa bisnis secara mandiri bagi setiap entitas perusahaan tanpa memerlukan intervensi manual. Dengan mengintegrasikan fungsi pengolahan data dan visualisasi interaktif dalam satu alur kerja (workflow), laporan ini menyajikan metrik kunci seperti rata-rata gaji, efektivitas KPI, dan skor performa karyawan secara spesifik. Tujuannya adalah untuk memberikan transparansi data yang objektif dan konsisten bagi para pengambil keputusan di masing-masing cabang perusahaan.
library(dplyr)
library(plotly)
library(knitr)
library(htmltools)
# 1. Fungsi Utama
generate_report <- function(data, company_name) {
# Filter data
comp_data <- data %>% filter(company == company_name)
# Statistik Ringkas
summary_stats <- comp_data %>%
summarise(
Avg_Salary = round(mean(salary), 2),
Avg_Performance = round(mean(performance), 2),
Avg_KPI = round(mean(kpi), 2),
Total_Employees = n()
)
# Menggunakan tagList untuk menampung semua elemen HTML
report_elements <- tagList(
tags$h3(paste("LAPORAN STRATEGIS:", company_name)),
# Mengonversi tabel kable ke HTML agar aman di dalam loop
HTML(kable(summary_stats, format = "html",
table.attr = "class='table table-striped' style='width:100%;'")),
tags$br(),
# Plotly Plot
plot_ly(comp_data, x = ~performance, y = ~kpi,
text = ~paste("Emp ID:", emp),
type = "scatter", mode = "markers",
marker = list(size = 10, color = '#0f4c81', opacity = 0.6)) %>%
layout(title = paste("Korelasi Performa vs KPI -", company_name),
xaxis = list(title = "Performance Score"),
yaxis = list(title = "KPI Score")),
tags$hr() # Garis pemisah antar perusahaan
)
# Opsional: Tetap simpan CSV di latar belakang
write.csv(comp_data, paste0("Report_", gsub(" ", "_", company_name), ".csv"), row.names = FALSE)
return(report_elements)
}
# 2. Automation Loop dengan tagList
all_companies <- unique(company_data$company)
# Simpan semua hasil laporan ke dalam satu list besar
final_reports <- lapply(all_companies, function(comp) {
generate_report(company_data, comp)
})
# Tampilkan semua laporan sekaligus (ini yang membuat Knit HTML berhasil)
tagList(final_reports)
| Avg_Salary | Avg_Performance | Avg_KPI | Total_Employees |
|---|---|---|---|
| 6624.16 | 79.85 | 76.72 | 50 |
| Avg_Salary | Avg_Performance | Avg_KPI | Total_Employees |
|---|---|---|---|
| 6067.68 | 78.91 | 76.8 | 50 |
| Avg_Salary | Avg_Performance | Avg_KPI | Total_Employees |
|---|---|---|---|
| 6179.22 | 79.2 | 75.03 | 50 |
Melalui pemisahan data per perusahaan, terlihat adanya variasi distribusi talenta yang unik di setiap entitas. Grafik scatter plot yang dihasilkan secara otomatis memudahkan identifikasi hubungan antara tingkat kompensasi dan produktivitas; misalnya, kita dapat langsung mendeteksi kelompok karyawan “High-Achievers” (KPI dan Performa tinggi) di masing-masing perusahaan. Selain itu, ringkasan statistik yang tersaji memberikan gambaran instan mengenai efisiensi biaya tenaga kerja, yang sangat berguna bagi manajemen untuk menentukan apakah alokasi anggaran gaji di perusahaan tersebut sudah menghasilkan output kerja yang optimal atau memerlukan evaluasi lebih lanjut.