import React, { useState, useEffect } from 'react'; import { Target, Search, Wrench, Cpu, BarChart, Rocket, CheckCircle, AlertTriangle, ArrowRight, Activity, Play } from 'lucide-react'; // --- MOCK DATA --- const rawData = [ { id: 'C001', tenure: 2, charge: 50.5, status: 'Aktif', churn: 'Ya' }, { id: 'C002', tenure: 24, charge: null, status: 'Aktif', churn: 'Tidak' }, { id: 'C003', tenure: 1, charge: 89.0, status: 'Nonaktif', churn: 'Ya' }, { id: 'C004', tenure: -5, charge: 20.0, status: 'Aktif', churn: 'Tidak' }, // Error data { id: 'C005', tenure: 12, charge: 65.0, status: 'Aktif', churn: 'Tidak' }, ]; const cleanData = [ { id: 'C001', tenure: 2, charge: 50.5, status: 1, churn: 1 }, { id: 'C002', tenure: 24, charge: 56.1, status: 1, churn: 0 }, // Imputed { id: 'C003', tenure: 1, charge: 89.0, status: 0, churn: 1 }, { id: 'C004', tenure: 5, charge: 20.0, status: 1, churn: 0 }, // Fixed abs { id: 'C005', tenure: 12, charge: 65.0, status: 1, churn: 0 }, ]; const steps = [ { id: 1, name: 'Business Understanding', icon: Target }, { id: 2, name: 'Data Understanding', icon: Search }, { id: 3, name: 'Data Preparation', icon: Wrench }, { id: 4, name: 'Modeling', icon: Cpu }, { id: 5, name: 'Evaluation', icon: BarChart }, { id: 6, name: 'Deployment', icon: Rocket }, ]; export default function App() { const [currentStep, setCurrentStep] = useState(1); const [isProcessing, setIsProcessing] = useState(false); const [dataCleaned, setDataCleaned] = useState(false); const [selectedModel, setSelectedModel] = useState(null); // Deployment Form State const [deployTenure, setDeployTenure] = useState(12); const [deployCharge, setDeployCharge] = useState(50); const [prediction, setPrediction] = useState(null); const handleNext = () => { if (currentStep < 6) setCurrentStep(c => c + 1); }; const handleSimulateProcessing = (callback, delay = 1500) => { setIsProcessing(true); setTimeout(() => { setIsProcessing(false); callback(); }, delay); }; const handlePredict = () => { handleSimulateProcessing(() => { // Simple mock logic for Decision Tree if (deployTenure < 6 && deployCharge > 60) { setPrediction('Tinggi (Akan Churn)'); } else { setPrediction('Rendah (Bertahan)'); } }, 800); }; return (
{/* Header */}

CRISP-DM Playground

Simulasi Proyek Data Mining: Memprediksi Customer Churn (Pelanggan Berhenti)

{/* Sidebar / Stepper */}

Fase CRISP-DM

{steps.map((step, index) => { const Icon = step.icon; const isActive = currentStep === step.id; const isPast = currentStep > step.id; return (
{isPast ? : }
{step.id}. {step.name}
); })}
{/* Main Content Area */}
{/* Step 1: Business Understanding */} {currentStep === 1 && (

1. Business Understanding

Skenario Bisnis: Perusahaan Telekomunikasi "TelcoFast" menyadari banyak pelanggannya yang beralih ke kompetitor bulan lalu (Churn).

Tujuan Bisnis: Mencegah pelanggan pindah dengan memberikan promo khusus sebelum mereka memutuskan untuk berhenti.

Tujuan Data Mining: Membangun model yang dapat memprediksi pelanggan mana yang kemungkinan besar akan churn di bulan berikutnya berdasarkan data historis mereka.

)} {/* Step 2: Data Understanding */} {currentStep === 2 && (

2. Data Understanding

Kita telah mengambil sampel data pelanggan. Mari kita lihat datanya. Apakah Anda melihat keanehan?

{rawData.map((row, i) => ( ))}
ID Pelanggan Lama Berlangganan (Bulan) Tagihan Bulanan ($) Status Sistem Churn (Target)
{row.id} {row.tenure < 0 ? {row.tenure} (Aneh) : row.tenure} {row.charge === null ? KOSONG : row.charge} {row.status} {row.churn}

Temuan: Terdapat nilai tagihan yang kosong (Null/Missing Value), nilai bulan negatif (Error input), dan format data teks ('Aktif'/'Ya') yang tidak bisa dibaca algoritma matematika.

)} {/* Step 3: Data Preparation */} {currentStep === 3 && (

3. Data Preparation

Tahap ini memakan waktu paling lama di dunia nyata. Kita harus memperbaiki kesalahan yang ditemukan pada tahap sebelumnya.

{!dataCleaned ? (

Data Masih Kotor

Klik tombol di bawah untuk menjalankan proses Data Cleaning & Transformation.

) : (
Data Berhasil Disiapkan!
  • Nilai negatif diubah menjadi absolut.
  • Nilai kosong diisi dengan rata-rata (Imputasi).
  • Teks 'Ya/Tidak' dan 'Aktif/Nonaktif' diubah menjadi angka biner 1 dan 0 (Encoding).
{cleanData.map((row, i) => ( ))}
ID Lama (Bln) Tagihan ($) Status (Encoded) Churn (Target)
{row.id} {row.tenure} {row.charge} {row.status} {row.churn}
)}
)} {/* Step 4: Modeling */} {currentStep === 4 && (

4. Modeling

Data kita sudah memiliki target (kolom Churn: 1 atau 0). Algoritma mana yang harus kita pilih?

setSelectedModel('kmeans')} className={`border-2 p-6 rounded-xl cursor-pointer transition-all ${selectedModel === 'kmeans' ? 'border-red-500 bg-red-50' : 'border-slate-200 hover:border-indigo-300'}`} >

K-Means Clustering

Teknik untuk mengelompokkan data tanpa label (Unsupervised). Mengelompokkan pelanggan berdasarkan kemiripan profil.

{selectedModel === 'kmeans' && (

Salah! Kita sudah punya data label/target (Churn: Ya/Tidak), jadi metode Unsupervised kurang tepat untuk prediksi spesifik ini.

)}
setSelectedModel('decisionTree')} className={`border-2 p-6 rounded-xl cursor-pointer transition-all ${selectedModel === 'decisionTree' ? 'border-emerald-500 bg-emerald-50' : 'border-slate-200 hover:border-indigo-300'}`} >

Decision Tree (Klasifikasi)

Teknik supervised learning untuk memprediksi kategori/label spesifik berdasarkan aturan keputusan (seperti pohon cabang).

{selectedModel === 'decisionTree' && (

Tepat! Karena kita ingin memprediksi label khusus (Churn: 1 atau 0), ini adalah masalah Klasifikasi.

)}
)} {/* Step 5: Evaluation */} {currentStep === 5 && (

5. Evaluation

Model Decision Tree selesai dilatih! Apakah model ini bekerja dengan baik sebelum kita terapkan di dunia nyata?

Akurasi Model

87.5%

Model dapat menebak dengan benar 87 dari 100 pelanggan.

Aturan Keputusan (Insight)

  • Pelanggan dengan Tagihan Tinggi & Lama Langganan Singkat berisiko Churn paling besar.
  • Pelanggan yang bertahan {'>'} 24 bulan jarang berpindah.

Model dianggap sukses dan memenuhi Business Understanding awal. Siap untuk diterjunkan!

)} {/* Step 6: Deployment */} {currentStep === 6 && (

6. Deployment

Model kini diintegrasikan ke sistem perusahaan. Mari coba prediksi untuk 1 pelanggan baru hari ini!

Simulator Aplikasi Prediksi Churn

setDeployTenure(e.target.value)} className="w-full accent-indigo-600" />
setDeployCharge(e.target.value)} className="w-full accent-indigo-600" />
{prediction && !isProcessing && (

Hasil Prediksi Risiko Churn

{prediction}

{prediction.includes('Tinggi') ? (

Saran Sistem: Kirimkan voucher diskon 20% segera!

) : (

Saran Sistem: Pelanggan aman, tidak perlu tindakan khusus.

)}
)}
)}
); }