EA - 004
2026-03-23
# Εισαγωγή βιβλιοθήκης ggplot2()
library(ggplot2)
# Εισαγωγή dataset
data <- read.csv("student_productivity_distraction_dataset_20000.csv")Dataset
Περιγραφή του dataset και της πηγής του
Το επιλεγμένο dataset προέρχεται από φοιτητές και εξετάζει τα επίπεδα παραγωγικότητας και απόσπασης προσοχής, σε συνάρτηση με ακασημαϊκές συνήθειες/επιδόσεις. Περιλαμβάνεις 20.000 εγγραφές (20 χιλιάδες φοιτητές) και έχει 18 στήλες. Στόχος της συλλογής των δεδομένων είναι η διερεύνηση της αλληλεπίδρασης μεταξύ των καθημερινών συνηθειών, της ψυχολογικής κατάστασης και της τελικής ακαδημαϊκής επίδοσης.
Πηγή Δεδομένων: Το dataset προέρχεται από το Kaggle (αποθετήριο ανοιχτών δεδομένων).
Μέγεθος: Περιλαμβάνει 20.000 εγγραφές (φοιτητές) και πολλαπλές μεταβλητές που καλύπτουν δημογραφικά και ποιοτικά χαρακτηριστικά.
Αιτιολόγηση της επιλογής σε σχέση με την επιχειρηματική αναλυτική
Η επιλογή του συγκεκριμένου dataset για την εφαρμογή μεθόδων Business Analytics βασίζεται στη δυνατότητα εξαγωγής “δράσιμης πληροφορίας” (actionable insight). Στο σύγχρονο εκπαιδευτικό περιβάλλον, τα εκπαιδευτικά ιδρύματα λειτουργούν ως οργανισμοί που επιδιώκουν τη βελτιστοποίηση των αποτελεσμάτων τους.
Η ανάλυση αυτών των δεδομένων επιτρέπει:
Predictive Modeling: Την πρόβλεψη της πιθανότητας αποτυχίας ενός φοιτητή πριν αυτή συμβεί.
Resource Allocation: Την ορθή κατανομή πόρων σε υπηρεσίες υποστήριξης (π.χ. συμβουλευτική για το άγχος ή τον ύπνο).
Personalized Learning: Την προσαρμογή του εκπαιδευτικού φορτίου βάσει των ατομικών ορίων παραγωγικότητας.
Αναφορά σε πιθανά επιχειρηματικά ερωτήματα που θα μπορούσαν να απαντηθούν
Μέσω της αναλυτικής επεξεργασίας, παρακάτω θα επιδιώξουμε να απαντήσουμε στα εξής κρίσιμα ερωτήματα:
Ερώτημα 1: Υπάρχει στατιστικά σημαντική διαφορά στα επίπεδα άγχους ανάμεσα στα φύλα και πώς αυτό επηρεάζει τον τελικό βαθμό;
Ερώτημα 2: Ποια είναι η επίδραση του ύπνου στην παραγωγικότητα και ποιο είναι το “σημείο καμπής” (threshold) πέρα από το οποίο η απόδοση σταθεροποιείται;
Ερώτημα 3: Πόσο αγχωμένοι είναι οι φοιτητές; Μπορούμε να πούμε ότι είναι πολύ ή λίγο αγχωμένοι, ή υπάρχει ομοιόμορφη κατανομή; Πολύ σημαντική ερώτηση, καθώς το άγχος φαίνεται και από μελέτες ότι είναι καταλυτικός παράγωντας.
Φυσικά, μπορούμε με τη βοήθεια της βάσης δεδομένων να απαντηθούν πολλά περισσότερα ερωτήματα και να εξετάσουμε κάθε πιθανή συσχέτιση.
Περιγραφή των μεταβλητών (τύπος, εύρος τιμών, μονάδες μέτρησης)
# Εμφάνιση της δομής και των τύπων των μεταβλητών
str(data)## 'data.frame': 20000 obs. of 18 variables:
## $ student_id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ age : int 23 20 29 27 24 29 21 23 26 19 ...
## $ gender : chr "Female" "Male" "Female" "Female" ...
## $ study_hours_per_day : num 4.35 6.14 4.98 3.19 7.67 7.18 9.06 6.37 4.19 7.28 ...
## $ sleep_hours : num 3.63 6.58 3.26 4.58 6.21 3.52 6.36 4.86 4.87 9.56 ...
## $ phone_usage_hours : num 3.38 5.48 4.83 10.06 3.02 ...
## $ social_media_hours : num 2.73 1.51 3.63 3.95 1.59 3.74 5.99 1.37 2.87 0.81 ...
## $ youtube_hours : num 1.83 3.13 0.18 5.75 5.46 1.42 2.2 4.36 0.1 1.35 ...
## $ gaming_hours : num 5.26 1.73 4.71 2.52 5.65 0.16 4.44 5.13 3.38 2.55 ...
## $ breaks_per_day : int 6 13 1 9 8 10 14 2 13 7 ...
## $ coffee_intake_mg : int 347 403 419 178 436 392 87 152 460 416 ...
## $ exercise_minutes : int 111 28 102 28 105 12 28 103 42 107 ...
## $ assignments_completed: int 2 10 8 18 7 3 15 17 11 6 ...
## $ attendance_percentage: num 57.2 91.3 63.1 40.5 45.5 ...
## $ stress_level : int 10 10 2 6 6 10 8 6 3 10 ...
## $ focus_score : int 57 49 38 50 41 70 35 59 39 73 ...
## $ final_grade : num 81.9 60.9 86.2 71.8 90.1 ...
## $ productivity_score : num 33.8 49 36.6 19.9 52.9 ...
# Εμφάνιση στατιστικών στοιχείων και εύρους τιμών
summary(data)## student_id age gender study_hours_per_day
## Min. : 1 Min. :17.00 Length:20000 Min. : 0.500
## 1st Qu.: 5001 1st Qu.:20.00 Class :character 1st Qu.: 2.900
## Median :10000 Median :23.00 Mode :character Median : 5.250
## Mean :10000 Mean :23.01 Mean : 5.255
## 3rd Qu.:15000 3rd Qu.:26.00 3rd Qu.: 7.640
## Max. :20000 Max. :29.00 Max. :10.000
## sleep_hours phone_usage_hours social_media_hours youtube_hours
## Min. : 3.000 Min. : 0.500 Min. :0.000 Min. :0.000
## 1st Qu.: 4.770 1st Qu.: 3.380 1st Qu.:2.000 1st Qu.:1.488
## Median : 6.510 Median : 6.240 Median :4.010 Median :2.980
## Mean : 6.518 Mean : 6.250 Mean :4.004 Mean :2.990
## 3rd Qu.: 8.310 3rd Qu.: 9.102 3rd Qu.:5.970 3rd Qu.:4.480
## Max. :10.000 Max. :12.000 Max. :8.000 Max. :6.000
## gaming_hours breaks_per_day coffee_intake_mg exercise_minutes
## Min. :0.000 Min. : 1.000 Min. : 0.0 Min. : 0.00
## 1st Qu.:1.490 1st Qu.: 4.000 1st Qu.:125.0 1st Qu.: 30.00
## Median :2.970 Median : 8.000 Median :249.0 Median : 60.00
## Mean :2.988 Mean : 7.542 Mean :249.7 Mean : 59.65
## 3rd Qu.:4.490 3rd Qu.:11.000 3rd Qu.:373.0 3rd Qu.: 90.00
## Max. :6.000 Max. :14.000 Max. :499.0 Max. :119.00
## assignments_completed attendance_percentage stress_level focus_score
## Min. : 0.000 Min. : 40.00 Min. : 1.000 Min. :30.00
## 1st Qu.: 4.000 1st Qu.: 54.81 1st Qu.: 3.000 1st Qu.:47.00
## Median : 9.000 Median : 69.98 Median : 5.000 Median :65.00
## Mean : 9.494 Mean : 69.95 Mean : 5.479 Mean :64.44
## 3rd Qu.:15.000 3rd Qu.: 85.05 3rd Qu.: 8.000 3rd Qu.:82.00
## Max. :19.000 Max. :100.00 Max. :10.000 Max. :99.00
## final_grade productivity_score
## Min. :40.00 Min. : 0.00
## 1st Qu.:55.46 1st Qu.: 38.70
## Median :70.31 Median : 50.23
## Mean :70.27 Mean : 50.18
## 3rd Qu.:85.34 3rd Qu.: 61.78
## Max. :99.99 Max. :100.00
Παρακάτω, υπάρχει μια μικρή περιγραφή για την κάθε στήλη ξεχωριστά, καθώς και σε παρένθεση ο τύπος μεταβλητής κάθε μίας:
- student_id: Μοναδικός αριθμός για κάθε φοιτητή (int)
- age: Ηλικία (int)
- gender: Φύλο (Male/Female) (chr)
- study_hours_per_day: Ο χρόνος που αφιερώνεται ενεργά στο διάβασμα (num)
- sleep_hours: Πόσες ώρες κοιμάται ο φοιτητής (num)
- phone_usage_hours: Συνολική χρήση κινητού (num)
- social_media_hours: Χρόνος σε Instagram, TikTok κ.λπ (num)
- youtube_hours: Χρόνος παρακολούθησης βίντεο (num)
- gaming_hours: Χρόνος σε παιχνίδια (num)
- breaks_per_day: Πόσα διαλείμματα κάνει (int)
- coffee_intake_mg: Πόσο καφέ πίνει (διεγερτικό) (int)
- exercise_minutes: Σωματική δραστηριότητα (int)
- assignments_completed: Πόσες εργασίες παρέδωσε ο φοιτητής (int)
- attendance_percentage: Πόσο συχνά πηγαίνει στις παραδόσεις (0-100%) (num)
- stress_level: Πόσο αγχωμένος νιώθει (1-10) (num)
- focus_score: Πόσο συγκεντρωμένος είναι (0-100) (int)
- final_grade: Η τελική του βαθμολογία (num)
- productivity_score: Ένας συνδυαστικός δείκτης που δείχνει πόσο αποδοτικός είναι ο φοιτητής (σκοπός dataset) (num)
Υπολογισμός και παρουσίαση περιγραφικών στατιστικών
Μέτρα κεντρικής τάσης (μέσος όρος, διάμεσος, επικρατούσα τιμή)
# 1. Μέσος Όρος (Mean)
mean_grade <- mean(data$final_grade)
print(paste("Μέσος Όρος:", round(mean_grade, 2)))## [1] "Μέσος Όρος: 70.27"
# 2. Διάμεσος (Median)
median_grade <- median(data$final_grade)
print(paste("Διάμεσος:", round(median_grade, 2)))## [1] "Διάμεσος: 70.32"
# 3. Επικρατούσα Τιμή (Mode)
mode_grade <- names(sort(table(data$final_grade), decreasing = TRUE))[1]
print(paste("Επικρατούσα Τιμή:", mode_grade))## [1] "Επικρατούσα Τιμή: 98.79"
Μέτρα διασποράς (τυπική απόκλιση, διακύμανση, εύρος)
Αυτός ο κώδικας δείχνει πόσο μεγάλη “ποικιλία” έχουν οι βαθμοί των φοιτητών (αν είναι όλοι κοντά ή πολύ διασκορπισμένοι).
# 1. Τυπική Απόκλιση (Standard Deviation)
sd_grade <- sd(data$final_grade, na.rm = TRUE)
print(paste("Τυπική Απόκλιση:", round(sd_grade, 2)))## [1] "Τυπική Απόκλιση: 17.28"
# 2. Διακύμανση (Variance)
var_grade <- var(data$final_grade, na.rm = TRUE)
print(paste("Διακύμανση:", round(var_grade, 2)))## [1] "Διακύμανση: 298.68"
# 3. Εύρος (Range)
range_grade <- range(data$final_grade, na.rm = TRUE) # Δίνει Min και Max
print(paste("Ελάχιστο:", range_grade[1], "| Μέγιστο:", range_grade[2]))## [1] "Ελάχιστο: 40 | Μέγιστο: 99.99"
diff_range <- diff(range_grade) # Δίνει την απόσταση Max - Min
print(paste("Συνολικό Εύρος:", diff_range))## [1] "Συνολικό Εύρος: 59.99"
Διερεύνηση συσχετίσεων
Υπολογισμός συντελεστών συσχέτισης μεταξύ αριθμητικών μεταβλητών
# Επιλογή των αριθμητικών μεταβλητών που θέλουμε να εξετάσουμε
vars_to_correlate <- data[, c("sleep_hours", "study_hours_per_day",
"stress_level", "final_grade", "productivity_score")]
# Υπολογισμός του πίνακα συσχέτισης
cor_matrix <- cor(vars_to_correlate, use = "complete.obs")
# Εμφάνιση του πίνακα στρογγυλοποιημένου σε 2 δεκαδικά
knitr::kable(round(cor_matrix, 2), caption = "Πίνακας Συσχέτισης Μεταβλητών")| sleep_hours | study_hours_per_day | stress_level | final_grade | productivity_score | |
|---|---|---|---|---|---|
| sleep_hours | 1.00 | 0.00 | 0.00 | 0.01 | 0.34 |
| study_hours_per_day | 0.00 | 1.00 | 0.00 | -0.01 | 0.73 |
| stress_level | 0.00 | 0.00 | 1.00 | -0.01 | -0.20 |
| final_grade | 0.01 | -0.01 | -0.01 | 1.00 | 0.00 |
| productivity_score | 0.34 | 0.73 | -0.20 | 0.00 | 1.00 |
Αναγνώριση πιθανών σχέσεων μεταξύ μεταβλητών και ερμηνεία τους
Βάσει του πίνακα συσχέτισης, προκύπτουν τα ακόλουθα συμπεράσματα: - Η ισχυρότερη θετική συσχέτιση εντοπίζεται μεταξύ των ωρών μελέτης ανά ημέρα (study_hours_per_day) και του δείκτη παραγωγικότητας (productivity_score), με r = 0.73. Η σχέση αυτή είναι ισχυρά θετική, που σημαίνει ότι ο χρόνος που αφιερώνεται ενεργά στη μελέτη είναι ο κύριος «μοχλός» της παραγωγικότητας.
Υπάρχει μια μέτρια θετική συσχέτιση μεταξύ των ωρών ύπνου (sleep_hours) και της παραγωγικότητας, με r = 0.34. Παρόλο που η μελέτη είναι σημαντική, η παραγωγικότητα συνδέεται και με την επαρκή ξεκούραση. Φοιτητές με πολύ χαμηλές ώρες ύπνου (όπως φαίνεται στο εύρος 3 − 10 από το summary) δυσκολεύονται να διατηρήσουν υψηλά επίπεδα απόδοσης.
Παρατηρείται μια ασθενής αρνητική συσχέτιση μεταξύ του επιπέδου άγχους (stress_level) και της παραγωγικότητας, με r = −0.20. Το αρνητικό πρόσημο υποδηλώνει ότι όσο αυξάνεται το άγχος, η παραγωγικότητα τείνει να μειώνεται. Αν και η σχέση δεν είναι ακραία ισχυρή στο συγκεκριμένο δείγμα, παραμένει ένας παράγοντας που, κατά κάποιο τρόπο, εμποδίζει τον φοιτητή.
Ενδιαφέρον προκαλεί το γεγονός ότι ο τελικός βαθμός (final_grade) δεν παρουσιάζει γραμμική συσχέτιση με τις ώρες μελέτης ή τον ύπνο στο συγκεκριμένο δείγμα (r ≈ 0.00). Αυτό υποδεικνύει ότι ο βαθμός μπορεί να επηρεάζεται από άλλους παράγοντες που δεν εξετάστηκαν (π.χ. πρότερη γνώση, ποιότητα διδασκαλίας) ή ότι η σχέση δεν είναι απλή γραμμική (π.χ. κάποιοι φοιτητές με λιγότερη μελέτη αλλά υψηλή ποιότητα επιτυγχάνουν καλούς βαθμούς).
Διαγράμματα
Έπειτα από κατανόηση του dataset, προκύπτουν τα παρακάτω διαγράμματα:
scatterplot
ggplot(data = data, aes(x = study_hours_per_day, y = final_grade, color = as.factor(stress_level))) +
geom_point(size = 1, alpha = 0.2) +
labs(
title = "Ώρες διαβάσματος VS Τελικός Βαθμός ανά Φύλο και Επίπεδα Άγχους",
x = "Ώρες διαβάσματος",
y = "Τελικός Βαθμός",
color = "Επίπεδο Άγχους") +
facet_wrap(~ gender) +
theme_minimal() +
geom_smooth(method="lm", color = "black") ## `geom_smooth()` using formula = 'y ~ x'
Σύντομος σχολιασμός:
Ο κώδικας δείχνει πώς οι ώρες διαβάσματος επηρεάζουν τον τελικό βαθμό ανά φύλο και επίπεδα άγχους. Δημιουργείται μια αριθμητική κλίμακα (1-10) δίνοντας ανίστοιχα χρώματα ανάλογα με τη βαθμίδα άγχους κάθε μαθητή (as.factor(stress_level)), αντιλαμβάνοντας δηλαδή κάθε βαθμίδα άγχους σαν διαφορετική πληροφορία. Έπειτα, σύμφνωα και με τις πληροφορίες της βάσης δεδομένων, οι 20.000 εγγραφές χωρίζονται με βάση το φύλο (άνδρες, γυναίκες, άλλο), ώστε να χωρίσουμε το δείγμα και να δούμε πώς επηρεάζει το καθένα (facet_wrap(~ gender)). Το σημαντικό που πρέπει να παρατηρήσουμε εδώ, είναι η γραμμή τάσης (geom_smooth(method=“lm”)). Αυτή, τόσο στις γυναίκες, όσο και στους άνδρες φαίνεται σχεδόν σταθερή, με μια πού μικρή καθοδική κλίση που δείχνει ότι αυξάνοντας τις ημερήσιες ώρες διαβάσματος (>5) ο τελικός βαθμός τείνει να είναι ελαφρώς χαμηλότερος. Αυτό φαίνεται αρκετά πιο ξεκάθαρα στο φύλο <<Άλλο>>, όπου όσο αυξάνονται οι ημερήσιες ώρες διαβάσματος, έχει μειώμενο ρυθμό ο τελικός βαθμός. Ωστόσο, το δείγμα στην τελευταία περίπτωση είναι πολύ μικρότερο και τα αποτελέσματα δε μπορούν να θεωρηθούν τόσο αξιόπιστα. Αυτό που φαίνεται είναι πως ίσως οι ημερήσιες ώρες διαβάσματος να μην έχουν την αναμενόμενη επίδραση στον τελικό βαθμό, όπως επίσης και ο βαθμός άγχους, λόγω και άλλων παραγόντων που πρέπει να εξετασθούν. Για παράδειγμα, οι ώρες ύπνου των μαθητών, ο χρόνος χρήσης κινητού, ο αριθμός συγκέντρωσης και το σκορ παραγωγικότητας.
boxplot
ggplot(data = data, aes(x = factor(round(sleep_hours)), y = productivity_score)) +
geom_boxplot(fill = "steelblue", color = "black", alpha = 0.7) +
labs(
title = "Η Επίδραση του Ύπνου στην Παραγωγικότητα",
x = "Ώρες Ύπνου (Στρογγυλοποίηση)",
y = "Score Παραγωγικότητας"
) +
theme_minimal()Σύντομος σχολιασμός:
Στο παραπάνω Boxplot εξετάζουμε την επίδραση του ύπνου στην παραγωγικότητα. Είναι εμφανές ότι η διάμεση παραγωγικότητα αυξάνεται αναλογικά με τις ώρες ύπνου (τις οποίες έχουμε στρογγυλοποιήσει factor(round(sleep_hours))). Η τάση είναι σταθερά ανοδική από ώρα σε ώρα. Παρατηρούνται ανοδικές μεταβολές σε κάθε μία. Ωστόσο, η ύπαρξη ακραίων τιμών (outliers) και το μεγάλο εύρος των τιμών σε κάθε κατηγορία υποδηλώνουν ότι η παραγωγικότητα πιθανότατα επηρεάζεται και από άλλες μεταβλητές του dataset, όπως η χρήση κινητού τηλεφώνου, τα επίπεδο άγχους κτλ. Χαρακτηριστικά, μπορούμε να δούμε ότι υπάρχει τουλάχιστον ένας φοιτητής, που παρόλο που κοιμάται 4 ώρες, εμφανίζει εξαιρετικά ασυνήθιστα υψηλά επίπεδα παραγωγικότητας, ειδικά με το υπόλοιπο δείγμα που κοιμάται 4 ώρες. Αντίστοιχα, υπάρχει σίγουρα ένας φοιτητής, που παρόλο που κοιμάται 9 ώρες, εμφανίζει πολύ χαμηλά επίπεδα παραγωγικότητας.
histogram
ggplot(data = data, aes(x = stress_level)) +
geom_histogram(binwidth = 1, fill = "steelblue", color = "white", alpha = 0.7) +
scale_x_continuous(breaks = 1:10) +
labs(
title = "Συχνότητα Επιπέδων Άγχους",
x = "Επίπεδο Άγχους (1-10)",
y = "Συχνότητα (Φοιτητές)"
) +
theme_minimal()Σύντομος σχολιασμός:
Γενικότερα, παρατηρούμε ότι υπάρχει μια ομοιόμορφη κατανομή. Όπως δηλαδή φαίνεται, οι φοιτητές έχουν μοιραστεί σχεδόν ομοιόμορφα στα διάφορα επίπεδα άγχους, χωρίς να προκύπτει κάποιο συγκεκριμένο αποτέλεσμα (ότι τείνουν να είναι πολύ ή λίγο αγχωμένοι). Όσον αφορά τον κώδικα, υπάρχει μια στήλη για κάθε επίπεδο άγχους και φαίνεται ξεκάθαρα από τις τιμές (binwidth = 1) και κάθε μπάρα βρίσκεται ακριβώς πάνω στον αντίστοιχο αριθμό (scale_x_continuous(breaks = 1:10)).
bar chart
ggplot(data = data, aes(x = gender)) +
geom_bar(fill = "steelblue", color = "black", alpha = 0.7) +
labs(
title = "Συχνότητα Φύλου Φοιτητών",
x = "Φύλο",
y = "Συχνότητα (Φοιτητές)"
) +
theme_minimal()Σύντομος σχολιασμός:
Στο παραπάνω διάγραμμα, φαίνεται η βάση του πληθυσμού που έχει χρησιμοποιηθεί. Όπως παρατηρείται, η συντριπτική πλειοψηφία είναι άνδρες και γυναίκες, ενώ υπάρχει και ένα πολύ μικρό πλήθος <<Άλλο>>. Το ενδιαφέρον εδώ, είναι ότι οι άνδρες με τις γυναίκες υπάρχουν στο δείγμα σχεδόν στον ίδιο αριθμό.