Το σύνολο δεδομένων που αναλύεται είναι το IBM HR Analytics Employee Attrition & Performance, το οποίο αντλήθηκε από την πλατφόρμα Kaggle.
Αποτελείται από 1470 εγγραφές και 35 μεταβλητές, που σχετίζονται με δημογραφικά στοιχεία, την απόδοση και την εργασιακή ικανοποίηση και κυρίως αν έχουν Αποχωρήσει από την εταιρεία ή όχι.
Η επιλογή του συγκεκριμένου dataset έγινε, διότι ο συνδυασμός των ποσοτικών και ποιοτικών δεδομένων, που προσφέρει σχετικά με το τμήμα του Ανθρωπίνου Δυναμικού στα πλαίσια της Επιχειρηματικής Αναλυτικής επιτρέπει την χρήση στατιστικών εργαλείων για τη λήψη αποφάσεων, που αφορούν τη διακράτηση του προσωπικού και τη βελτίωση του εργασιακού περιβάλλοντος.
| Μεταβλητή | Τύπος | Εύρος Τιμών | Μονάδες Μέτρησης |
|---|---|---|---|
| Age | Διακριτή | 18 - 60 | Έτη |
| DailyRate | Διακριτή | 102 - 1499 | Νομισματικές Μονάδες (π.χ. Ευρώ) |
| DistanceFromHome | Διακριτή | 1 - 29 | Απόσταση (συνήθως Μίλια) |
| HourlyRate | Διακριτή | 30 - 100 | Νομισματικές Μονάδες ανά ώρα |
| MonthlyIncome | Συνεχής | 1.009 - 19.999 | Νομισματικές Μονάδες ανά μήνα |
| MonthlyRate | Διακριτή | 2.094 - 26.999 | Νομισματικές Μονάδες |
| NumCompaniesWorked | Διακριτή | 0 - 9 | Αριθμός εταιρειών |
| PercentSalaryHike | Διακριτή | 11 - 25 | Ποσοστό (%) |
| TotalWorkingYears | Διακριτή | 0 - 40 | Έτη |
| TrainingTimesLastYear | Διακριτή | 0 - 6 | Αριθμός εκπαιδεύσεων |
| YearsAtCompany | Διακριτή | 0 - 40 | Έτη |
| YearsInCurrentRole | Διακριτή | 0 - 18 | Έτη |
| YearsSinceLastPromotion | Διακριτή | 0 - 15 | Έτη |
| YearsWithCurrManager | Διακριτή | 0 - 17 | Έτη |
| Μεταβλητή | Περιγραφή / Τιμές |
|---|---|
| Attrition | Εγκατάλειψη εργασίας (Yes, No) |
| BusinessTravel | Συχνότητα ταξιδιών (Non-Travel, Travel_Rarely, Travel_Frequently) |
| Department | Τμήμα (Sales, Research & Development, Human Resources) |
| EducationField | Τομέας εκπαίδευσης (Life Sciences, Medical, Marketing, κ.α.) |
| Gender | Φύλο (Female, Male) |
| JobRole | Ρόλος εργασίας (Manager, Sales Executive, Laboratory Technician, κ.α.) |
| MaritalStatus | Οικογενειακή κατάσταση (Single, Married, Divorced) |
| OverTime | Υπερωρίες (Yes, No) |
| Μεταβλητή | Εύρος (Κλίμακα) | Περιγραφή |
|---|---|---|
| Education | 1 - 5 | Επίπεδο εκπαίδευσης (1: Χαμηλό, 5: Υψηλό) |
| EnvironmentSatisfaction | 1 - 4 | Ικανοποίηση από το περιβάλλον εργασίας |
| JobInvolvement | 1 - 4 | Βαθμός εμπλοκής στην εργασία |
| JobLevel | 1 - 5 | Ιεραρχικό επίπεδο θέσης |
| JobSatisfaction | 1 - 4 | Ικανοποίηση από την εργασία |
| PerformanceRating | 3 - 4 | Αξιολόγηση απόδοσης |
| RelationshipSatisfaction | 1 - 4 | Ικανοποίηση από τις σχέσεις στην εργασία |
| StockOptionLevel | 0 - 3 | Επίπεδο δικαιωμάτων προαίρεσης μετοχών |
| WorkLifeBalance | 1 - 4 | Ισορροπία επαγγελματικής/προσωπικής ζωής |
##* Φόρτωση Δεδομένων*
# Φόρτωση των δεδομένων
hr_data <- read.csv("WA_Fn-UseC_-HR-Employee-Attrition.csv", stringsAsFactors = TRUE)
# Έλεγχος των πρώτων γραμμών για να δούμε αν φορτώθηκαν σωστά
head(hr_data)
## Age Attrition BusinessTravel DailyRate Department
## 1 41 Yes Travel_Rarely 1102 Sales
## 2 49 No Travel_Frequently 279 Research & Development
## 3 37 Yes Travel_Rarely 1373 Research & Development
## 4 33 No Travel_Frequently 1392 Research & Development
## 5 27 No Travel_Rarely 591 Research & Development
## 6 32 No Travel_Frequently 1005 Research & Development
## DistanceFromHome Education EducationField EmployeeCount EmployeeNumber
## 1 1 2 Life Sciences 1 1
## 2 8 1 Life Sciences 1 2
## 3 2 2 Other 1 4
## 4 3 4 Life Sciences 1 5
## 5 2 1 Medical 1 7
## 6 2 2 Life Sciences 1 8
## EnvironmentSatisfaction Gender HourlyRate JobInvolvement JobLevel
## 1 2 Female 94 3 2
## 2 3 Male 61 2 2
## 3 4 Male 92 2 1
## 4 4 Female 56 3 1
## 5 1 Male 40 3 1
## 6 4 Male 79 3 1
## JobRole JobSatisfaction MaritalStatus MonthlyIncome MonthlyRate
## 1 Sales Executive 4 Single 5993 19479
## 2 Research Scientist 2 Married 5130 24907
## 3 Laboratory Technician 3 Single 2090 2396
## 4 Research Scientist 3 Married 2909 23159
## 5 Laboratory Technician 2 Married 3468 16632
## 6 Laboratory Technician 4 Single 3068 11864
## NumCompaniesWorked Over18 OverTime PercentSalaryHike PerformanceRating
## 1 8 Y Yes 11 3
## 2 1 Y No 23 4
## 3 6 Y Yes 15 3
## 4 1 Y Yes 11 3
## 5 9 Y No 12 3
## 6 0 Y No 13 3
## RelationshipSatisfaction StandardHours StockOptionLevel TotalWorkingYears
## 1 1 80 0 8
## 2 4 80 1 10
## 3 2 80 0 7
## 4 3 80 0 8
## 5 4 80 1 6
## 6 3 80 0 8
## TrainingTimesLastYear WorkLifeBalance YearsAtCompany YearsInCurrentRole
## 1 0 1 6 4
## 2 3 3 10 7
## 3 3 3 0 0
## 4 3 3 8 7
## 5 3 3 2 2
## 6 2 2 7 7
## YearsSinceLastPromotion YearsWithCurrManager
## 1 0 5
## 2 1 7
## 3 0 0
## 4 3 0
## 5 2 2
## 6 3 6
##* Διαχωρισμός dataset σε train και test*
# Καθορισμός σταθεράς
set.seed(71)
# Δημιουργία δείκτη για το 80% των δεδομένων
index <- sample(1:nrow(hr_data), 0.8 * nrow(hr_data))
# Χωρισμός σε Train (80%) και Test (20%)
train_set <- hr_data[index, ]
test_set <- hr_data[-index, ]
str(train_set)
## 'data.frame': 1176 obs. of 35 variables:
## $ Age : int 30 27 52 24 36 50 37 35 35 38 ...
## $ Attrition : Factor w/ 2 levels "No","Yes": 2 1 1 1 1 1 1 1 1 1 ...
## $ BusinessTravel : Factor w/ 3 levels "Non-Travel","Travel_Frequently",..: 3 2 1 1 1 3 3 3 3 2 ...
## $ DailyRate : int 945 793 771 1269 845 1322 124 1402 992 240 ...
## $ Department : Factor w/ 3 levels "Human Resources",..: 3 3 3 2 3 2 2 3 2 2 ...
## $ DistanceFromHome : int 9 2 2 4 1 28 3 28 1 2 ...
## $ Education : int 3 1 4 1 5 3 3 4 3 4 ...
## $ EducationField : Factor w/ 6 levels "Human Resources",..: 4 2 2 2 4 2 5 2 4 2 ...
## $ EmployeeCount : int 1 1 1 1 1 1 1 1 1 1 ...
## $ EmployeeNumber : int 1876 1371 329 888 479 1317 1062 1554 1564 803 ...
## $ EnvironmentSatisfaction : int 2 4 1 1 4 4 4 2 4 1 ...
## $ Gender : Factor w/ 2 levels "Female","Male": 2 2 2 2 1 1 1 1 2 1 ...
## $ HourlyRate : int 89 43 79 46 45 43 35 98 68 75 ...
## $ JobInvolvement : int 3 1 2 2 3 3 3 2 2 4 ...
## $ JobLevel : int 1 2 5 1 2 4 2 1 1 2 ...
## $ JobRole : Factor w/ 9 levels "Healthcare Representative",..: 9 8 4 3 8 6 1 9 3 5 ...
## $ JobSatisfaction : int 4 4 3 4 4 1 2 3 1 1 ...
## $ MaritalStatus : Factor w/ 3 levels "Divorced","Married",..: 3 3 3 2 3 2 3 2 3 3 ...
## $ MonthlyIncome : int 1081 5071 19068 3162 6653 16880 4107 2430 2450 5980 ...
## $ MonthlyRate : int 16019 20392 21030 10778 15276 22422 13848 26204 21731 26085 ...
## $ NumCompaniesWorked : int 1 3 1 0 4 4 3 0 1 6 ...
## $ Over18 : Factor w/ 1 level "Y": 1 1 1 1 1 1 1 1 1 1 ...
## $ OverTime : Factor w/ 2 levels "No","Yes": 1 1 2 1 1 2 1 1 1 2 ...
## $ PercentSalaryHike : int 13 20 18 17 15 11 15 23 19 12 ...
## $ PerformanceRating : int 3 4 3 3 3 3 3 4 3 3 ...
## $ RelationshipSatisfaction: int 3 2 4 4 2 2 1 1 2 4 ...
## $ StandardHours : int 80 80 80 80 80 80 80 80 80 80 ...
## $ StockOptionLevel : int 0 0 0 0 0 0 0 2 0 0 ...
## $ TotalWorkingYears : int 1 8 33 6 7 25 8 6 3 17 ...
## $ TrainingTimesLastYear : int 3 3 2 2 6 2 3 5 3 2 ...
## $ WorkLifeBalance : int 2 3 4 2 3 3 2 3 3 3 ...
## $ YearsAtCompany : int 1 6 33 5 1 3 4 5 3 15 ...
## $ YearsInCurrentRole : int 0 2 7 2 0 2 3 3 0 7 ...
## $ YearsSinceLastPromotion : int 0 0 15 3 0 1 0 4 1 4 ...
## $ YearsWithCurrManager : int 0 0 12 4 0 2 1 2 2 12 ...
summary(train_set)
## Age Attrition BusinessTravel DailyRate
## Min. :18.00 No :981 Non-Travel :118 Min. : 102.0
## 1st Qu.:30.00 Yes:195 Travel_Frequently:227 1st Qu.: 445.5
## Median :36.00 Travel_Rarely :831 Median : 781.5
## Mean :37.07 Mean : 788.3
## 3rd Qu.:43.00 3rd Qu.:1146.0
## Max. :60.00 Max. :1499.0
##
## Department DistanceFromHome Education
## Human Resources : 52 Min. : 1.000 Min. :1.000
## Research & Development:757 1st Qu.: 2.000 1st Qu.:2.000
## Sales :367 Median : 7.000 Median :3.000
## Mean : 9.173 Mean :2.931
## 3rd Qu.:14.000 3rd Qu.:4.000
## Max. :29.000 Max. :5.000
##
## EducationField EmployeeCount EmployeeNumber EnvironmentSatisfaction
## Human Resources : 21 Min. :1 Min. : 1.0 Min. :1.000
## Life Sciences :505 1st Qu.:1 1st Qu.: 485.8 1st Qu.:2.000
## Marketing :130 Median :1 Median :1023.0 Median :3.000
## Medical :350 Mean :1 Mean :1027.8 Mean :2.718
## Other : 64 3rd Qu.:1 3rd Qu.:1563.2 3rd Qu.:4.000
## Technical Degree:106 Max. :1 Max. :2068.0 Max. :4.000
##
## Gender HourlyRate JobInvolvement JobLevel
## Female:470 Min. : 30 Min. :1.00 Min. :1.000
## Male :706 1st Qu.: 48 1st Qu.:2.00 1st Qu.:1.000
## Median : 66 Median :3.00 Median :2.000
## Mean : 66 Mean :2.73 Mean :2.079
## 3rd Qu.: 84 3rd Qu.:3.00 3rd Qu.:3.000
## Max. :100 Max. :4.00 Max. :5.000
##
## JobRole JobSatisfaction MaritalStatus MonthlyIncome
## Sales Executive :266 Min. :1.000 Divorced:269 Min. : 1051
## Research Scientist :232 1st Qu.:2.000 Married :539 1st Qu.: 2898
## Laboratory Technician :199 Median :3.000 Single :368 Median : 4941
## Manufacturing Director :110 Mean :2.722 Mean : 6563
## Healthcare Representative:101 3rd Qu.:4.000 3rd Qu.: 8406
## Manager : 85 Max. :4.000 Max. :19999
## (Other) :183
## MonthlyRate NumCompaniesWorked Over18 OverTime PercentSalaryHike
## Min. : 2094 Min. :0.000 Y:1176 No :851 Min. :11.00
## 1st Qu.: 8192 1st Qu.:1.000 Yes:325 1st Qu.:12.00
## Median :14366 Median :2.000 Median :14.00
## Mean :14326 Mean :2.696 Mean :15.19
## 3rd Qu.:20373 3rd Qu.:4.000 3rd Qu.:18.00
## Max. :26997 Max. :9.000 Max. :25.00
##
## PerformanceRating RelationshipSatisfaction StandardHours StockOptionLevel
## Min. :3.00 Min. :1.000 Min. :80 Min. :0.0000
## 1st Qu.:3.00 1st Qu.:2.000 1st Qu.:80 1st Qu.:0.0000
## Median :3.00 Median :3.000 Median :80 Median :1.0000
## Mean :3.15 Mean :2.709 Mean :80 Mean :0.7883
## 3rd Qu.:3.00 3rd Qu.:4.000 3rd Qu.:80 3rd Qu.:1.0000
## Max. :4.00 Max. :4.000 Max. :80 Max. :3.0000
##
## TotalWorkingYears TrainingTimesLastYear WorkLifeBalance YearsAtCompany
## Min. : 0.00 Min. :0.000 Min. :1.000 Min. : 0.00
## 1st Qu.: 6.00 1st Qu.:2.000 1st Qu.:2.000 1st Qu.: 3.00
## Median :10.00 Median :3.000 Median :3.000 Median : 5.00
## Mean :11.39 Mean :2.833 Mean :2.766 Mean : 7.03
## 3rd Qu.:16.00 3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.:10.00
## Max. :40.00 Max. :6.000 Max. :4.000 Max. :40.00
##
## YearsInCurrentRole YearsSinceLastPromotion YearsWithCurrManager
## Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 2.000 1st Qu.: 0.000 1st Qu.: 2.000
## Median : 3.000 Median : 1.000 Median : 3.000
## Mean : 4.203 Mean : 2.163 Mean : 4.189
## 3rd Qu.: 7.000 3rd Qu.: 2.000 3rd Qu.: 7.000
## Max. :18.000 Max. :15.000 Max. :17.000
##
α) Χρησιμοποιούμε τη συνάρτηση lm για να δημιουργήσουμε
το μοντέλο Γραμμικής Παλινδρόμησης μίας ανεξάρτητης μεταβλητής
(model1), με εξαρτημένη μεταβλητή το
MonthlyIncome και ανεξάρτητη το
TotalWorkingYears.
# Δημιουργία model1
model1 <- lm(MonthlyIncome ~ TotalWorkingYears, data = train_set)
summary(model1)
##
## Call:
## lm(formula = MonthlyIncome ~ TotalWorkingYears, data = train_set)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11397.3 -1726.6 -73.8 1425.5 10691.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1181.91 154.06 7.672 3.56e-14 ***
## TotalWorkingYears 472.31 11.12 42.459 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3004 on 1174 degrees of freedom
## Multiple R-squared: 0.6056, Adjusted R-squared: 0.6053
## F-statistic: 1803 on 1 and 1174 DF, p-value: < 2.2e-16
# Υπολογισμός SSE
SSE_train <- sum(model1$residuals^2)
print(paste("SSE στο Training Set:", round(SSE_train, 2)))
## [1] "SSE στο Training Set: 10596316602.98"
# Υπολογισμός RMSE
RMSE_train <- sqrt(SSE_train / nrow(train_set))
print(paste("RMSE στο Training Set:", round(RMSE_train, 2)))
## [1] "RMSE στο Training Set: 3001.75"
β) Ομοίως, δημιουργούμε το μοντέλο Πολλαπλής Γραμμικής Παλινδρόμησης (model2), με εξαρτημένη μεταβλητή το MonthlyIncome και ανεξάρτητες το TotalWorkingYears, Age, YearsInCurrentRole. Οι επιλογή τους έγινε με βάση το p-value -αν αυτό είναι μικρότερο του 0,05 θεωρείται στατιστικά σημαντική η μεταβλητή- δηλαδή επηρεάζει πραγματικά το εισόδημα.
# Δημιουργία model2
model2 <- lm(MonthlyIncome ~ TotalWorkingYears + Age + YearsInCurrentRole, data = train_set) #
summary(model2)
##
## Call:
## lm(formula = MonthlyIncome ~ TotalWorkingYears + Age + YearsInCurrentRole,
## data = train_set)
##
## Residuals:
## Min 1Q Median 3Q Max
## -11367.0 -1645.3 -96.3 1457.3 10470.2
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1979.08 412.62 4.796 1.82e-06 ***
## TotalWorkingYears 492.83 17.06 28.895 < 2e-16 ***
## Age -29.22 13.34 -2.190 0.0287 *
## YearsInCurrentRole 12.37 27.76 0.446 0.6559
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3000 on 1172 degrees of freedom
## Multiple R-squared: 0.6074, Adjusted R-squared: 0.6064
## F-statistic: 604.4 on 3 and 1172 DF, p-value: < 2.2e-16
# Υπολογισμός SSE
SSE_train_2 <- sum(model2$residuals^2) #
print(paste("SSE Model 2 (Train):", round(SSE_train_2, 2)))
## [1] "SSE Model 2 (Train): 10548082538.24"
# 4. Υπολογισμός RMSE
RMSE_train_2 <- sqrt(SSE_train_2 / nrow(train_set))
print(paste("RMSE Model 2 (Train):", round(RMSE_train_2, 2)))
## [1] "RMSE Model 2 (Train): 2994.91"
# Σύγκριση Adjusted R-squared
adj_r1 <- summary(model1)$adj.r.squared
adj_r2 <- summary(model2)$adj.r.squared
print(paste("Adjusted R-squared Model 1:", round(adj_r1, 4)))
## [1] "Adjusted R-squared Model 1: 0.6053"
print(paste("Adjusted R-squared Model 2:", round(adj_r2, 4)))
## [1] "Adjusted R-squared Model 2: 0.6064"
Παρατηρούμε ότι το SSE του model2 είναι μικρότερο του SSE του model1, που σημαίνει ότι βελτιώθηκε το μοντέλο και πλέον είναι πιο προσαρμοσμένο στα δεδομένα με την προσθήκη των επιπλέον μεταβλητών.
Παρατηρούμε επίσης ότι το Multiple R-squared του model2 είναι υψηλότερο από αυτό του model1, γεγονός που υποδηλώνει ότι το δεύτερο μοντέλο εξηγεί μεγαλύτερο ποσοστό της διακύμανσης των δεδομένων.
Παράλληλα, η αύξηση και του Adjusted R-squared επιβεβαιώνει ότι η προσθήκη των επιπλέον μεταβλητών βελτίωσε ουσιαστικά την ποιότητα του μοντέλου, καθώς η βελτίωση της ακρίβειας είναι μεγαλύτερη από την “ποινή” που επιβάλλεται για την προσθήκη νέων παραμέτρων.
Σε αυτό το βήμα χρησιμοποιούμε το test_set, δηλαδή το 20% των δεδομένων, ώστε να δοκιμάσουμε το model2, για να δούμε την διαφορές, που υπάρχουν σε σχέση με το training set.
Predictions_test <- predict(model2, newdata = test_set)
# Υπολογισμός SSE
# Μετράμε τη διαφορά μεταξύ πραγματικών τιμών και προβλέψεων
SSE_test <- sum((test_set$MonthlyIncome - Predictions_test)^2)
# Υπολογισμός SST (Total Sum of Squares)
# Η διακύμανση των πραγματικών τιμών σε σχέση με τον μέσο όρο του training set
SST_test <- sum((test_set$MonthlyIncome - mean(train_set$MonthlyIncome))^2)
# Υπολογισμός out-of-sample R-squared
R2_test <- 1 - (SSE_test / SST_test)
# Υπολογισμός RMSE (Root-Mean-Square Error)
# Ο δείκτης αυτός δηλώνει τον μέσο όρο σφάλματος σε ευρώ
RMSE_test <- sqrt(SSE_test / nrow(test_set))
# Εμφάνιση αποτελεσμάτων
print(paste("R-squared στο Test Set:", round(R2_test, 4)))
## [1] "R-squared στο Test Set: 0.5582"
print(paste("Μέσο σφάλμα (RMSE) στο Test Set:", round(RMSE_test, 2)))
## [1] "Μέσο σφάλμα (RMSE) στο Test Set: 2926.19"
Σε αυτό το σημείο θα δημιουργήσουμε παραδείγματα εργαζομένων για να δούμε τι προβλέπει το μοντέλο 2.
# Δημιουργία παραδειγμάτων
# Ένας έμπειρος υπάλληλος (45 ετών, 20 χρόνια προϋπηρεσία, 10 χρόνια στον ρόλο)
# Και ένας νέος υπάλληλος (25 ετών, 2 χρόνια προϋπηρεσία, 1 έτος στον ρόλο)
new_employees <- data.frame(
TotalWorkingYears = c(20, 2),
Age = c(45, 25),
YearsInCurrentRole = c(10, 1)
)
row.names(new_employees) <- c("Έμπειρος Εργαζόμενος", "Νέος Εργαζόμενος")
# Πρόβλεψη
final_predictions <- predict(model2, newdata = new_employees)
# Εμφάνιση των προβλέψεων
print("Προβλεπόμενο Μηνιαίο Εισόδημα:")
## [1] "Προβλεπόμενο Μηνιαίο Εισόδημα:"
print(round(final_predictions, 2))
## Έμπειρος Εργαζόμενος Νέος Εργαζόμενος
## 10644.58 2246.69
# Δημιουργία διαγράμματος διασποράς με τη γραμμή παλινδρόμησης
library(ggplot2)
ggplot(train_set, aes(x = TotalWorkingYears, y = MonthlyIncome)) +
geom_point(alpha = 0.5, color = "darkblue") +
geom_abline(intercept = coef(model2)[1],
slope = coef(model2)[2],
color = "red",
linewidth = 1) +
labs(title = "Γραμμή Παλινδρόμησης: Monthly Income vs Total Working Years",
x = "Συνολικά Έτη Προϋπηρεσίας",
y = "Μηνιαίο Εισόδημα") +
theme_minimal()
Φαίνεται από το διάγραμμα ξεκάθαρα η θετική συσχέτιση μεταξύ προϋπηρεσίας και μισθού.
Παρακάτω παρατίθονται κάποια από τα βασικότερα συμπεράσματα με βάση τα αποτελέσματα:
summary.