# Streamlit uygulaması 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")