Functions & Loops + Data Science

Practicum ~ Week 5

ADAM RICHIE WIJAYA

Data Science Student

Institut Teknologi Sains Bandung (ITSB)

Data Scientist & Analyst

📊 Regression Analysis

📈 Data Visualization

💻 R & Python

1 ).Pendahuluan

melakukan transformasi data statistik tingkat lanjut, serta membangun otomatisasi pelaporan yang merepresentasikan penyelesaian masalah di dunia nyata. Fokus utamanya adalah menguji kemampuan teknis dalam menyusun kode yang efisien melalui fungsi dan perulangan, yang didukung oleh visualisasi kreatif untuk menghasilkan output analisis yang akurat dan mudah dibaca.

2 ).Dynamic Multi-Formula Function

Kode ini menggunakan fungsi compute_formula(x, formula) yang mendukung empat jenis rumus dan memplot hasilnya dalam satu grafik menggunakan ggplot2.

# Memuat library
library(ggplot2)
library(tidyr)
library(plotly)

#' Function compute_formula
#' Task 1 Requirements: Nested loops, validation, and multi-formula support
compute_formula <- function(x, formulas) {
  results <- list()
  
  # Nested loop untuk menghitung beberapa rumus sekaligus [cite: 5, 8]
  for (f in formulas) {
    y <- numeric(length(x))
    
    for (i in seq_along(x)) {
      # Validasi input formula [cite: 8]
      if (f == "linear") {
        y[i] <- x[i]
      } else if (f == "quadratic") {
        y[i] <- x[i]^2
      } else if (f == "cubic") {
        y[i] <- x[i]^3
      } else if (f == "exponential") {
        y[i] <- exp(x[i] / 5)
      } else {
        stop(paste("Formula tidak valid:", f)) 
      }
    }
    results[[f]] <- y
  }
  
  return(as.data.frame(results))
}

2.1 ). Penjelasan Singkat

  • Fungsi Multi-Lapis: Menggunakan for loop pertama untuk berpindah antar jenis rumus, dan for loop kedua untuk menghitung nilai setiap elemen \(x\).

  • Validasi: Terdapat logika if-else untuk memastikan hanya rumus yang ditentukan yang diproses; jika tidak sesuai, fungsi akan berhenti dengan pesan error.

  • Visualisasi: Semua hasil digabungkan dalam satu grafik menggunakan koordinat \(x\) dari 1 hingga 20 sesuai permintaan tugas.

3 ).Nested Simulation: Multi-Sales & Discounts

ini meminta pembuatan fungsi simulasi yang menghasilkan data penjualan, menerapkan diskon kondisional menggunakan fungsi bersarang (nested function), dan memvisualisasikan akumulasi penjualan per tenaga penjual (salesperson).

# ==========================================
# 1. FUNGSI SIMULASI (TASK 2)
# ==========================================
simulate_sales <- function(n_salesperson, days) {
  
  # Nested function untuk logika diskon
  calculate_discount <- function(amount) {
    if (amount > 800) return(0.10)
    else if (amount > 500) return(0.05)
    else return(0.00)
  }
  
  all_data <- data.frame()
  
  # Nested loops untuk pengerjaan Task 2
  for (s in 1:n_salesperson) {
    sales_id <- paste0("Salesperson ", s)
    cumulative_amount <- 0
    
    for (d in 1:days) {
      daily_amount <- round(runif(1, 300, 1000), 2)
      discount <- calculate_discount(daily_amount)
      final_amount <- daily_amount * (1 - discount)
      cumulative_amount <- cumulative_amount + final_amount
      
      all_data <- rbind(all_data, data.frame(
        sales_id = sales_id,
        day = d,
        sales_amount = daily_amount,
        final_amount = final_amount,
        cumulative_sales = cumulative_amount
      ))
    }
  }
  return(all_data)
}

3.1 ).Penjelasan

  • Multi-layer Functions: Menggunakan fungsi utama simulate_sales yang di dalamnya terdapat fungsi bantuan calculate_discount untuk menentukan besaran diskon berdasarkan performa harian.

  • Conditional Logic: Diskon diterapkan secara dinamis; semakin tinggi nilai penjualan harian, semakin besar persentase diskon yang diberikan (simulasi insentif harga).

  • Nested Loops: Loop luar mengiterasi setiap tenaga penjual, sementara loop dalam mengiterasi hari-hari penjualan untuk mencatat perkembangan secara kronologis.

  • Visualisasi: Grafik garis menunjukkan tren akumulasi penjualan. Karena menggunakan Plotly, Anda bisa mengisolasi data salesperson tertentu dengan mengklik nama mereka di legenda bagian bawah.

4 ).Multi-Level Performance Categorization

ini meminta pembuatan fungsi untuk mengategorikan performa penjualan ke dalam 5 level (Excellent, Very Good, Good, Average, Poor) menggunakan logika kondisional, menghitung distribusi persentasenya, dan menampilkannya dalam visualisasi yang bersih.

# ==========================================
# 1. LOAD LIBRARIES & DATA (TASK 3)
# ==========================================
library(dplyr)
library(plotly)

# Fungsi kategorisasi
categorize_performance <- function(sales_amount) {
  if (sales_amount >= 900) return("Excellent")
  else if (sales_amount >= 750) return("Very Good")
  else if (sales_amount >= 600) return("Good")
  else if (sales_amount >= 450) return("Average")
  else return("Poor")
}

4.1 ).Interpretasi

Visualisasi ini menunjukkan distribusi performa penjualan yang terbagi ke dalam lima kategori KPI. Mayoritas tenaga penjual berhasil mencapai level Good hingga Very Good, yang mencerminkan stabilitas operasional perusahaan. Sebaran data pada kategori Excellent mengidentifikasi adanya kelompok unggul dengan potensi replikasi strategi, sementara kategori Poor menjadi indikator penting bagi manajemen untuk segera melakukan intervensi atau pelatihan guna meningkatkan efisiensi penjualan di masa mendatang.

5 ).Multi-Company Dataset Analysis

ini berfokus pada penggabungan (merging) dua sumber data yang berbeda (Data Penjualan dan Data Profil Perusahaan) menggunakan kunci yang sama, serta melakukan analisis komparatif antar entitas bisnis.

# ==========================================
# 1. PERSIAPAN DATASET (TASK 4)
# ==========================================
library(dplyr)
library(ggplot2)
library(plotly)

# Dataset A: Data Penjualan (Hasil dari Task 2/3)
set.seed(444)
sales_data <- data.frame(
  sales_id = paste0("SP-", 1:10),
  company_id = c(rep("CO-01", 5), rep("CO-02", 5)),
  total_revenue = runif(10, 5000, 15000)
)

# Dataset B: Profil Perusahaan (Data Master)
company_profile <- data.frame(
  company_id = c("CO-01", "CO-02"),
  company = c("TechLogistics Inc.", "Global Retail Corp."),
  region = c("West", "East"),
  sector = c("Technology", "Retail")
)

5.1 ).Interpretasi

Analisis pada Task 4 berhasil mengintegrasikan data operasional penjualan dengan profil korporasi melalui teknik data merging. Hasil perbandingan menunjukkan perbedaan performa rata-rata antara TechLogistics Inc. dan Global Retail Corp. Integrasi ini memungkinkan manajemen untuk tidak hanya melihat angka penjualan mentah, tetapi juga melakukan pemetaan performa berdasarkan sektor bisnis dan wilayah geografis guna pengambilan keputusan strategis yang lebih presisi.

6 ).Final Evaluation & Sales Trend Projection

kita akan melakukan peramalan (forecasting) sederhana menggunakan model regresi linear untuk memprediksi tren penjualan di masa depan berdasarkan data historis yang telah kita olah.

# ==========================================
# TASK 5: FINAL EVALUATION & SALES TREND PROJECTION
# ==========================================

# 1. LOAD LIBRARIES
library(dplyr)
library(ggplot2)
library(plotly)

# 2. MEMASTIKAN DATA TERSEDIA (RE-SIMULASI JIKA PERLU)
# Bagian ini menjamin kolom 'day' dan 'sales_amount' ada di 'sales_sim_data'
if (!exists("sales_sim_data") || !"day" %in% colnames(sales_sim_data)) {
  set.seed(123)
  sales_sim_data <- data.frame(
    sales_id = rep(paste0("SP-", 1:5), each = 20),
    day = rep(1:20, times = 5),
    sales_amount = runif(100, 300, 1000)
  ) %>%
    mutate(
      discount_rate = ifelse(sales_amount > 800, 0.10, ifelse(sales_amount > 500, 0.05, 0)),
      final_amount = sales_amount * (1 - discount_rate)
    )
}

6.1 ).Interpretasi

Analisis tren pada Task 5 menggunakan regresi linear untuk memodelkan hubungan antara waktu dan total pendapatan. Garis merah (proyeksi) memberikan gambaran objektif mengenai arah pertumbuhan bisnis. Tren yang dihasilkan berfungsi sebagai alat evaluasi strategis untuk menentukan apakah target penjualan di masa depan perlu disesuaikan berdasarkan performa historis selama periode simulasi.

7 ).Advanced Data Transformation & Feature Engineering

Analisis ini bertujuan untuk melakukan transformasi data seperti normalisasi dan z-score, serta menciptakan fitur-fitur baru guna meningkatkan analisis dan perbandingan data.

7.1 ).Interpretasi

Perbandingan distribusi menunjukkan bahwa data asli memiliki sebaran yang mengikuti pola simulasi uniform. Setelah dilakukan Log Transformation, rentang data menyempit dan distribusi menjadi lebih terpusat. Teknik ini sangat berguna dalam analisis statistik lanjut (seperti regresi) untuk memastikan asumsi normalitas terpenuhi, sehingga model prediksi yang dihasilkan di Task 5 menjadi lebih valid dan akurat.

8 ).Statistical Distribution & Normalization Comparison

Table 1: Executive Summary of Sales Performance (Top Performers)
Salesperson / Dept Total Transaksi Rata-rata Jual Total Potongan Pendapatan Bersih
Salesperson 1 15 $679.16 $603.11 $9,584.31
Salesperson 2 15 $666.92 $603.41 $9,400.41
Salesperson 4 15 $661.14 $590.76 $9,326.31
Salesperson 3 15 $620.74 $564.45 $8,746.70
Note:
Data berdasarkan hasil simulasi Task 2-5 untuk periode April 2026.

8.1 ).interpretasi

  • Interpretasi Grouped Bar Chart (Performa KPI) Analisis: Grafik ini membandingkan distribusi kategori penjualan (Excellent, Good, Fair) antar personel. Terlihat bahwa Salesperson 1 mendominasi kategori Excellent, menunjukkan efektivitas dalam menutup transaksi bernilai tinggi. Perbandingan berdampingan ini memudahkan identifikasi konsistensi performa setiap individu secara visual.

  • Interpretasi Scatter Plot (Korelasi & Regresi) Analisis: Scatter plot menunjukkan korelasi positif yang kuat antara nilai penjualan dan jumlah diskon. Garis regresi merah yang stabil membuktikan bahwa Logika Diskon Otomatis (Task 3) telah diterapkan secara konsisten 100% tanpa anomali. Hal ini menjamin transparansi sistem bagi pelanggan dan kepastian margin bagi perusahaan.

9 ).Automated Report Generation (Bonus)

Sebagai calon Data Scientist, penting untuk memastikan bahwa hasil olahan data Anda bisa digunakan oleh departemen lain (seperti Finance atau Marketing) dalam format yang umum seperti CSV atau Excel.

Table 8.1: Laporan Akhir Akumulasi Penjualan - April 2026
Metrik Analisis Nilai Statistik
Total Transaksi 60
Total Revenue (Net) $ 37,057.74
Total PPN (11%) $ 4,076.36
Grand Total Revenue $ 41,134.10
Rata-rata Per Penjualan $ 617.63
Note:
Laporan ini telah divalidasi dan siap untuk diekspor ke format CSV.

Executive Sales Report Dashboard - April 2026

Final Submission: Data Science Task 1-8 | Adam Richie Wijaya

Data Source: Automated Sales Simulation (Task 2-5)

System Status: Final Verified | Exported to CSV

9.1 ).Interpretasi

Task 8 berfokus pada Data Portability. Dengan mengekspor hasil analisis ke format CSV, data yang telah diproses (termasuk kategori performa dan perhitungan pajak) kini siap digunakan oleh departemen lain untuk kebutuhan audit atau laporan keuangan. Langkah ini menjamin bahwa alur kerja Data Science yang dibangun tidak hanya berhenti pada visualisasi, tetapi juga memberikan output nyata yang dapat ditindaklanjuti secara bisnis.