Prediksi-Karyawan-Resign / app /gradio_simple.py
fendy07's picture
Add model, gradio app, and documentation files
177e42b
"""
HR Analytics - Simple Gradio App
Versi sederhana untuk quick deployment
Usage:
python gradio_simple.py
"""
import gradio as gr
import pandas as pd
import pickle
import warnings
warnings.filterwarnings('ignore')
# Load model dan preprocessing objects
print("Loading model...")
with open('model/best_model_RF_SMOTETomek.pkl', 'rb') as f:
model = pickle.load(f)
with open('model/scaler.pkl', 'rb') as f:
scaler = pickle.load(f)
with open('model/label_encoders.pkl', 'rb') as f:
encoders = pickle.load(f)
print("โœ“ Model loaded successfully!")
def predict_employee(tingkat_kepuasan, skor_evaluasi, jumlah_proyek,
jam_kerja_perbulan, lama_bekerja, kecelakaan_kerja,
promosi, divisi, gaji):
"""
Predict resignation probability for an employee
"""
# Create dataframe
data = {
'tingkat_kepuasan': [tingkat_kepuasan],
'skor_evaluasi': [skor_evaluasi],
'jumlah_proyek': [jumlah_proyek],
'jam_kerja_perbulan': [jam_kerja_perbulan],
'lama_bekerja': [lama_bekerja],
'kecelakaan_kerja': [kecelakaan_kerja],
'promosi': [promosi],
'divisi': [divisi],
'gaji': [gaji]
}
df = pd.DataFrame(data)
# Encode categorical features
for col in ['kecelakaan_kerja', 'promosi', 'divisi', 'gaji']:
df[col] = encoders[col].transform(df[col])
# Scale features
X_scaled = scaler.transform(df)
# Predict
prediction = model.predict(X_scaled)[0]
probability = model.predict_proba(X_scaled)[0]
resign_prob = probability[1] * 100
# Determine risk level
if resign_prob < 30:
risk_level = "๐ŸŸข LOW RISK"
risk_color = "#2ecc71"
elif resign_prob < 60:
risk_level = "๐ŸŸก MEDIUM RISK"
risk_color = "#f39c12"
else:
risk_level = "๐Ÿ”ด HIGH RISK"
risk_color = "#e74c3c"
# Result
result = f"""
## Hasil Prediksi
**Status:** {'AKAN RESIGN' if prediction == 1 else 'TIDAK AKAN RESIGN'}
**Probabilitas Resign:** {resign_prob:.1f}%
**Risk Level:** {risk_level}
---
### Informasi Karyawan:
- Kepuasan: {tingkat_kepuasan:.2f}
- Evaluasi: {skor_evaluasi:.2f}
- Proyek: {jumlah_proyek}
- Jam Kerja: {jam_kerja_perbulan} jam/bulan
- Lama Kerja: {lama_bekerja} tahun
- Divisi: {divisi}
- Gaji: {gaji}
"""
# Recommendations
recs = ["### ๐Ÿ’ก Rekomendasi:"]
if resign_prob >= 60:
recs.append("- โš ๏ธ URGENT: Schedule meeting segera")
recs.append("- Review kompensasi dan benefit")
if tingkat_kepuasan < 0.4:
recs.append("- Tingkatkan kepuasan karyawan")
recs.append("- Identifikasi sumber ketidakpuasan")
if jam_kerja_perbulan > 250:
recs.append("- Kurangi beban kerja")
recs.append("- Improve work-life balance")
if resign_prob < 30:
recs.append("- โœ… Karyawan dalam kondisi baik")
recs.append("- Maintain current engagement")
return result, "\n".join(recs)
# Create Gradio interface
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# ๐ŸŽฏ HR Analytics - Prediksi Karyawan Resign
Masukkan data karyawan untuk memprediksi kemungkinan resign
""")
with gr.Row():
with gr.Column():
gr.Markdown("### ๐Ÿ“ Input Data Karyawan")
tingkat_kepuasan = gr.Slider(0, 1, value=0.5, step=0.01,
label="Tingkat Kepuasan")
skor_evaluasi = gr.Slider(0, 1, value=0.7, step=0.01,
label="Skor Evaluasi")
jumlah_proyek = gr.Slider(2, 7, value=3, step=1,
label="Jumlah Proyek")
jam_kerja_perbulan = gr.Slider(96, 310, value=200, step=1,
label="Jam Kerja/Bulan")
lama_bekerja = gr.Slider(2, 10, value=3, step=1,
label="Lama Bekerja (tahun)")
kecelakaan_kerja = gr.Radio(["tidak", "pernah"], value="tidak",
label="Kecelakaan Kerja")
promosi = gr.Radio(["tidak", "ya"], value="tidak",
label="Promosi (5 tahun terakhir)")
divisi = gr.Dropdown(
["sales", "accounting", "hr", "technical", "support",
"management", "IT", "product_mng", "marketing", "RandD"],
value="sales", label="Divisi"
)
gaji = gr.Radio(["low", "medium", "high"], value="medium",
label="Kategori Gaji")
predict_btn = gr.Button("๐Ÿ”ฎ Prediksi", variant="primary", size="lg")
with gr.Column():
gr.Markdown("### ๐Ÿ“Š Hasil Prediksi")
output_result = gr.Markdown()
output_recommendations = gr.Markdown()
# Connect
predict_btn.click(
fn=predict_employee,
inputs=[tingkat_kepuasan, skor_evaluasi, jumlah_proyek,
jam_kerja_perbulan, lama_bekerja, kecelakaan_kerja,
promosi, divisi, gaji],
outputs=[output_result, output_recommendations]
)
gr.Markdown("""
---
**Model:** Random Forest + SMOTE | **Akurasi:** 95%+
""")
if __name__ == "__main__":
demo.launch(share=True, debug=True)