# %% [1] IMPORT LIBRARIES & SETUP import pandas as pd import numpy as np print("--- [STEP 1] Memuat Data 15 Mapel & Kuesioner RIASEC ---") # Set seed agar hasil random selalu sama setiap kali dijalankan np.random.seed(42) # %% [2] FUNGSI GENERATOR DATA REALISTIS (30 JURUSAN & RIASEC) def generate_realistic_data(n_samples_per_class=200): rows = [] # Konfigurasi 30 Jurusan dengan fokus Mapel dan profil RIASEC dominan jurusan_config = { 'Kedokteran': {'mapel': ['biologi', 'kimia', 'matematika'], 'riasec': ['I', 'S'], 'eko_min': ['Mampu', 'Menengah']}, 'Farmasi': {'mapel': ['kimia', 'biologi', 'matematika'], 'riasec': ['I', 'C'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Kesehatan Masyarakat': {'mapel': ['sosiologi', 'biologi'], 'riasec': ['S', 'E'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Ilmu Gizi': {'mapel': ['biologi', 'kimia'], 'riasec': ['I', 'S'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Keperawatan': {'mapel': ['biologi', 'sosiologi'], 'riasec': ['S', 'R'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Teknik Sipil': {'mapel': ['matematika', 'fisika'], 'riasec': ['R', 'C'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Teknik Mesin': {'mapel': ['fisika', 'matematika'], 'riasec': ['R', 'I'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Teknik Industri': {'mapel': ['fisika', 'ekonomi_mapel'], 'riasec': ['E', 'I'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Teknik Pertambangan': {'mapel': ['fisika', 'geografi', 'matematika'], 'riasec': ['R', 'E'], 'eko_min': ['Mampu', 'Menengah']}, 'Teknik Geologi': {'mapel': ['geografi', 'fisika', 'kimia'], 'riasec': ['I', 'R'], 'eko_min': ['Mampu', 'Menengah']}, 'Teknik Informatika': {'mapel': ['informatika', 'matematika'], 'riasec': ['I', 'C'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Sistem Informasi': {'mapel': ['informatika', 'ekonomi_mapel'], 'riasec': ['C', 'I'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Pertanian': {'mapel': ['biologi', 'geografi'], 'riasec': ['R', 'I'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Peternakan': {'mapel': ['biologi', 'ekonomi_mapel'], 'riasec': ['R', 'E'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Agribisnis': {'mapel': ['ekonomi_mapel', 'biologi'], 'riasec': ['E', 'R'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Akuntansi': {'mapel': ['ekonomi_mapel', 'matematika'], 'riasec': ['C', 'E'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Manajemen': {'mapel': ['ekonomi_mapel', 'sosiologi'], 'riasec': ['E', 'C'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Ilmu Ekonomi': {'mapel': ['ekonomi_mapel', 'matematika', 'sejarah'], 'riasec': ['I', 'C'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Ilmu Hukum': {'mapel': ['pkn', 'sosiologi', 'bahasa_indonesia'], 'riasec': ['E', 'S'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Hubungan Internasional': {'mapel': ['bahasa_inggris', 'sejarah', 'pkn'], 'riasec': ['E', 'S'], 'eko_min': ['Mampu', 'Menengah']}, 'Ilmu Komunikasi': {'mapel': ['bahasa_indonesia', 'sosiologi', 'bahasa_inggris'], 'riasec': ['E', 'A'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Psikologi': {'mapel': ['sosiologi', 'bahasa_indonesia', 'biologi'], 'riasec': ['S', 'I'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Administrasi Negara': {'mapel': ['pkn', 'sosiologi'], 'riasec': ['C', 'E'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Desain Komunikasi Visual': {'mapel': ['seni_budaya', 'informatika'], 'riasec': ['A', 'E'], 'eko_min': ['Mampu', 'Menengah']}, 'Arsitektur': {'mapel': ['seni_budaya', 'fisika', 'matematika'], 'riasec': ['A', 'I'], 'eko_min': ['Mampu', 'Menengah']}, 'Sastra Inggris': {'mapel': ['bahasa_inggris', 'sejarah', 'seni_budaya'], 'riasec': ['A', 'S'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Pendidikan Guru SD': {'mapel': ['pkn', 'bahasa_indonesia', 'seni_budaya'], 'riasec': ['S', 'C'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Pendidikan Matematika': {'mapel': ['matematika', 'pkn'], 'riasec': ['S', 'I'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Pendidikan Jasmani': {'mapel': ['pjok', 'biologi'], 'riasec': ['S', 'R'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']}, 'Pariwisata': {'mapel': ['bahasa_inggris', 'geografi', 'seni_budaya'], 'riasec': ['E', 'S'], 'eko_min': ['Mampu', 'Menengah', 'Kurang Mampu']} } siswa_id = 1 for jurusan, config in jurusan_config.items(): for _ in range(n_samples_per_class): # 1. Base Scores Mapel (Acak Normal 75-84) scores = {k: np.random.randint(75, 85) for k in [ 'agama', 'pkn', 'bahasa_indonesia', 'bahasa_inggris', 'matematika', 'fisika', 'kimia', 'biologi', 'sejarah', 'geografi', 'ekonomi_mapel', 'sosiologi', 'seni_budaya', 'pjok', 'informatika' ]} # Naikkan skor mapel utama jurusan tersebut for m in config['mapel']: scores[m] = np.random.randint(88, 98) # 2. Base Scores Kuesioner RIASEC (Acak Normal 50-70) riasec = {k: np.random.randint(50, 71) for k in ['R', 'I', 'A', 'S', 'E', 'C']} # Naikkan skor RIASEC dominan jurusan tersebut for r_key in config['riasec']: riasec[r_key] = np.random.randint(85, 98) # 3. Ekonomi Orang Tua eko = np.random.choice(config['eko_min']) # 4. Susun Baris Data row = [f"SW{siswa_id:05d}", f"Siswa_{siswa_id}"] + \ list(scores.values()) + \ [riasec['R'], riasec['I'], riasec['A'], riasec['S'], riasec['E'], riasec['C']] + \ [eko, jurusan] rows.append(row) siswa_id += 1 columns = ['id_siswa', 'nama_lengkap', 'agama', 'pkn', 'bahasa_indonesia', 'bahasa_inggris', 'matematika', 'fisika', 'kimia', 'biologi', 'sejarah', 'geografi', 'ekonomi_mapel', 'sosiologi', 'seni_budaya', 'pjok', 'informatika', 'riasec_r', 'riasec_i', 'riasec_a', 'riasec_s', 'riasec_e', 'riasec_c', 'ekonomi_orang_tua', 'rekomendasi_jurusan'] # Acak urutan baris data agar tidak terurut per jurusan saat di training df = pd.DataFrame(rows, columns=columns) df = df.sample(frac=1, random_state=42).reset_index(drop=True) return df # %% [3] EKSEKUSI DAN SIMPAN DATA # Mengambil 200 sampel per jurusan x 30 jurusan = 6.000 data latih df_synthetic = generate_realistic_data(n_samples_per_class=200) df_synthetic.to_csv('dataset_15mapel_bersih.csv', index=False) print(f"Dataset berhasil dibuat dengan total {len(df_synthetic)} baris!") print("Fitur baru: Skor RIASEC ditambahkan untuk 30 Jurusan.") # %%