106 lines
7.0 KiB
Python
106 lines
7.0 KiB
Python
# %% [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.")
|
|
# %%
|