EA - 004

2026-03-23

Michail Ioannidis

# Εισαγωγή βιβλιοθήκης 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). Στο σύγχρονο εκπαιδευτικό περιβάλλον, τα εκπαιδευτικά ιδρύματα λειτουργούν ως οργανισμοί που επιδιώκουν τη βελτιστοποίηση των αποτελεσμάτων τους.

Η ανάλυση αυτών των δεδομένων επιτρέπει:

Αναφορά σε πιθανά επιχειρηματικά ερωτήματα που θα μπορούσαν να απαντηθούν

Μέσω της αναλυτικής επεξεργασίας, παρακάτω θα επιδιώξουμε να απαντήσουμε στα εξής κρίσιμα ερωτήματα:

Ερώτημα 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

Παρακάτω, υπάρχει μια μικρή περιγραφή για την κάθε στήλη ξεχωριστά, καθώς και σε παρένθεση ο τύπος μεταβλητής κάθε μίας:

  1. student_id: Μοναδικός αριθμός για κάθε φοιτητή (int)
  2. age: Ηλικία (int)
  3. gender: Φύλο (Male/Female) (chr)
  4. study_hours_per_day: Ο χρόνος που αφιερώνεται ενεργά στο διάβασμα (num)
  5. sleep_hours: Πόσες ώρες κοιμάται ο φοιτητής (num)
  6. phone_usage_hours: Συνολική χρήση κινητού (num)
  7. social_media_hours: Χρόνος σε Instagram, TikTok κ.λπ (num)
  8. youtube_hours: Χρόνος παρακολούθησης βίντεο (num)
  9. gaming_hours: Χρόνος σε παιχνίδια (num)
  10. breaks_per_day: Πόσα διαλείμματα κάνει (int)
  11. coffee_intake_mg: Πόσο καφέ πίνει (διεγερτικό) (int)
  12. exercise_minutes: Σωματική δραστηριότητα (int)
  13. assignments_completed: Πόσες εργασίες παρέδωσε ο φοιτητής (int)
  14. attendance_percentage: Πόσο συχνά πηγαίνει στις παραδόσεις (0-100%) (num)
  15. stress_level: Πόσο αγχωμένος νιώθει (1-10) (num)
  16. focus_score: Πόσο συγκεντρωμένος είναι (0-100) (int)
  17. final_grade: Η τελική του βαθμολογία (num)
  18. 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. Η σχέση αυτή είναι ισχυρά θετική, που σημαίνει ότι ο χρόνος που αφιερώνεται ενεργά στη μελέτη είναι ο κύριος «μοχλός» της παραγωγικότητας.

Διαγράμματα

Έπειτα από κατανόηση του 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()

Σύντομος σχολιασμός:

Στο παραπάνω διάγραμμα, φαίνεται η βάση του πληθυσμού που έχει χρησιμοποιηθεί. Όπως παρατηρείται, η συντριπτική πλειοψηφία είναι άνδρες και γυναίκες, ενώ υπάρχει και ένα πολύ μικρό πλήθος <<Άλλο>>. Το ενδιαφέρον εδώ, είναι ότι οι άνδρες με τις γυναίκες υπάρχουν στο δείγμα σχεδόν στον ίδιο αριθμό.