Spaces:
Sleeping
Sleeping
| """ | |
| 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) |