| |
|
|
| import streamlit as st |
| import pandas as pd |
| import joblib |
| from catboost import CatBoostClassifier |
|
|
| st.set_page_config( |
| page_title="Employee Attrition Classifier", |
| page_icon="👥", |
| layout="centered" |
| ) |
|
|
| st.title("👥 Employee Attrition Classifier") |
|
|
| st.write( |
| "This application predicts whether an employee is likely to leave the company " |
| "based on HR, job role, income, satisfaction, and work-life balance factors." |
| ) |
|
|
| st.write( |
| "Bu uygulama; insan kaynakları, iş rolü, gelir, memnuniyet ve iş-yaşam dengesi " |
| "bilgilerine göre çalışanın işten ayrılma olasılığını tahmin eder." |
| ) |
|
|
| model = CatBoostClassifier() |
| model.load_model("src/employee_attrition_model.cbm") |
|
|
| feature_columns = joblib.load("src/feature_columns.pkl") |
|
|
| age = st.number_input("Age / Yaş", min_value=18, max_value=65, value=35) |
| business_travel = st.selectbox("Business Travel / İş Seyahati", ["Travel_Rarely", "Travel_Frequently", "Non-Travel"]) |
| daily_rate = st.number_input("Daily Rate / Günlük Ücret", min_value=0, max_value=2000, value=800) |
| department = st.selectbox("Department / Departman", ["Research & Development", "Sales", "Human Resources"]) |
| distance_from_home = st.number_input("Distance From Home / Eve Uzaklık", min_value=0, max_value=50, value=10) |
| education = st.number_input("Education Level / Eğitim Seviyesi", min_value=1, max_value=5, value=3) |
| education_field = st.selectbox( |
| "Education Field / Eğitim Alanı", |
| ["Life Sciences", "Medical", "Marketing", "Technical Degree", "Other", "Human Resources"] |
| ) |
| environment_satisfaction = st.number_input("Environment Satisfaction / Çevre Memnuniyeti", min_value=1, max_value=4, value=3) |
| gender = st.selectbox("Gender / Cinsiyet", ["Male", "Female"]) |
| hourly_rate = st.number_input("Hourly Rate / Saatlik Ücret", min_value=0, max_value=150, value=70) |
| job_involvement = st.number_input("Job Involvement / İşe Katılım", min_value=1, max_value=4, value=3) |
| job_level = st.number_input("Job Level / İş Seviyesi", min_value=1, max_value=5, value=2) |
|
|
| job_role = st.selectbox( |
| "Job Role / İş Rolü", |
| [ |
| "Sales Executive", |
| "Research Scientist", |
| "Laboratory Technician", |
| "Manufacturing Director", |
| "Healthcare Representative", |
| "Manager", |
| "Sales Representative", |
| "Research Director", |
| "Human Resources" |
| ] |
| ) |
|
|
| job_satisfaction = st.number_input("Job Satisfaction / İş Memnuniyeti", min_value=1, max_value=4, value=3) |
| marital_status = st.selectbox("Marital Status / Medeni Durum", ["Married", "Single", "Divorced"]) |
| monthly_income = st.number_input("Monthly Income / Aylık Gelir", min_value=0, max_value=30000, value=5000) |
| monthly_rate = st.number_input("Monthly Rate / Aylık Oran", min_value=0, max_value=30000, value=15000) |
| num_companies_worked = st.number_input("Number of Companies Worked / Çalışılan Şirket Sayısı", min_value=0, max_value=10, value=2) |
| over18 = st.selectbox("Over 18 / 18 Yaş Üzeri", ["Y"]) |
| overtime = st.selectbox("OverTime / Fazla Mesai", ["Yes", "No"]) |
| percent_salary_hike = st.number_input("Percent Salary Hike / Maaş Artış Oranı", min_value=0, max_value=30, value=14) |
| performance_rating = st.number_input("Performance Rating / Performans Değeri", min_value=1, max_value=4, value=3) |
| relationship_satisfaction = st.number_input("Relationship Satisfaction / İlişki Memnuniyeti", min_value=1, max_value=4, value=3) |
| standard_hours = st.number_input("Standard Hours / Standart Saat", min_value=0, max_value=100, value=80) |
| stock_option_level = st.number_input("Stock Option Level / Hisse Opsiyon Seviyesi", min_value=0, max_value=3, value=1) |
| total_working_years = st.number_input("Total Working Years / Toplam Çalışma Yılı", min_value=0, max_value=50, value=10) |
| training_times_last_year = st.number_input("Training Times Last Year / Son Yıl Eğitim Sayısı", min_value=0, max_value=10, value=2) |
| work_life_balance = st.number_input("Work Life Balance / İş-Yaşam Dengesi", min_value=1, max_value=4, value=3) |
| years_at_company = st.number_input("Years at Company / Şirketteki Yıl", min_value=0, max_value=40, value=5) |
| years_in_current_role = st.number_input("Years in Current Role / Mevcut Roldeki Yıl", min_value=0, max_value=20, value=3) |
| years_since_last_promotion = st.number_input("Years Since Last Promotion / Son Terfiden Beri Yıl", min_value=0, max_value=20, value=1) |
| years_with_curr_manager = st.number_input("Years with Current Manager / Mevcut Yöneticiyle Yıl", min_value=0, max_value=20, value=3) |
|
|
| income_per_year = monthly_income / (total_working_years + 1) |
| promotion_gap = years_at_company - years_since_last_promotion |
| role_stability = years_in_current_role / (years_at_company + 1) |
|
|
| input_df = pd.DataFrame({ |
| "Age": [age], |
| "BusinessTravel": [business_travel], |
| "DailyRate": [daily_rate], |
| "Department": [department], |
| "DistanceFromHome": [distance_from_home], |
| "Education": [education], |
| "EducationField": [education_field], |
| "EmployeeCount": [1], |
| "EnvironmentSatisfaction": [environment_satisfaction], |
| "Gender": [gender], |
| "HourlyRate": [hourly_rate], |
| "JobInvolvement": [job_involvement], |
| "JobLevel": [job_level], |
| "JobRole": [job_role], |
| "JobSatisfaction": [job_satisfaction], |
| "MaritalStatus": [marital_status], |
| "MonthlyIncome": [monthly_income], |
| "MonthlyRate": [monthly_rate], |
| "NumCompaniesWorked": [num_companies_worked], |
| "Over18": [over18], |
| "OverTime": [overtime], |
| "PercentSalaryHike": [percent_salary_hike], |
| "PerformanceRating": [performance_rating], |
| "RelationshipSatisfaction": [relationship_satisfaction], |
| "StandardHours": [standard_hours], |
| "StockOptionLevel": [stock_option_level], |
| "TotalWorkingYears": [total_working_years], |
| "TrainingTimesLastYear": [training_times_last_year], |
| "WorkLifeBalance": [work_life_balance], |
| "YearsAtCompany": [years_at_company], |
| "YearsInCurrentRole": [years_in_current_role], |
| "YearsSinceLastPromotion": [years_since_last_promotion], |
| "YearsWithCurrManager": [years_with_curr_manager], |
| "income_per_year": [income_per_year], |
| "promotion_gap": [promotion_gap], |
| "role_stability": [role_stability] |
| }) |
|
|
| input_df = input_df[feature_columns] |
|
|
| if st.button("Predict Attrition Risk / İşten Ayrılma Riskini Tahmin Et"): |
| probability = model.predict_proba(input_df)[0][1] |
| risk_percent = probability * 100 |
|
|
| st.success(f"Attrition Probability: {risk_percent:.2f}%") |
| st.success(f"İşten Ayrılma Olasılığı: %{risk_percent:.2f}") |
|
|
| if probability >= 0.50: |
| st.warning("Risk Level: High / Risk Seviyesi: Yüksek") |
| else: |
| st.info("Risk Level: Low / Risk Seviyesi: Düşük") |