Το Interquartile Range (IQR) είναι το εύρος (range) μεταξύ:
IQR=Q3−Q1
IQR=Q3−Q1
όπου:
Q1 (1ο τεταρτημόριο) = η τιμή κάτω από την οποία βρίσκεται το 25% των δεδομένων
Q3 (3ο τεταρτημόριο) = η τιμή κάτω από την οποία βρίσκεται το 75% των δεδομένων
Τι μετράει το IQR
Το IQR σου λέει πόσο “απλωμένα” είναι τα μεσαία 50% των δεδομένων.
Δεν επηρεάζεται από ακραίες τιμές (outliers), σε αντίθεση με το σύνολο των δεδομένων ή την τυπική απόκλιση.
Για ανίχνευση outliers — θεωρούμε ότι μια τιμή είναι ακραία όταν:
x<Q1−1.5×IQR ή x>Q3+1.5×IQR
Για ανάλυση κατανομών — ειδικά όταν δεν είναι κανονικές. Χρησιμοποιείται στα boxplots — το κουτί δείχνει Q1 έως Q3 (άρα ύψος = IQR)
Min. 1st Qu. Median Mean 3rd Qu. Max.
16.00 19.00 20.00 27.73 21.00 130.00
Μέση τιμή
[1] 27.72727
Διάμεσος
[1] 20
Τυπική απόκλιση
[1] 27.37775
Q1 = as.numeric(quantile(temps, 0.25, type = 7))
Q3 = as.numeric(quantile(temps, 0.75, type = 7))
IQR_val = IQR(temps, type = 7)
lower = Q1 - 1.5 * IQR_val
upper = Q3 + 1.5 * IQR_valIQR / Τεταρτημόρια
Q1
[1] 19
Q3
[1] 21
IQR_val
[1] 2
Κάτω όριο
[1] 16
Άνω όριο
[1] 24
Outliers (κανόνας IQR)
[1] 90 130
df = data.frame(
day = seq_along(temps),
temp = temps
)
df$outlier_flag = "OK"
df$outlier_flag[df$temp < lower] = "LOW"
df$outlier_flag[df$temp > upper] = "HIGH"Πρώτες γραμμές του data frame
day temp outlier_flag
1 1 18 OK
2 2 19 OK
3 3 21 OK
4 4 20 OK
5 5 19 OK
6 6 22 OK
7 7 21 OK
8 8 20 OK
9 9 19 OK
10 10 90 HIGH
11 11 20 OK
12 12 21 OK
13 13 19 OK
14 14 18 OK
15 15 17 OK
z_scores = as.numeric(scale(temps)) # (x - mean) / sd
df$z = z_scores
outliers_z = temps[abs(z_scores) > 3]Outliers με βάση |Z| > 3:
[1] 130
par(mfrow = c(1, 2)) # δύο γραφήματα δίπλα-δίπλα
# (α) Απλό boxplot με επισήμανση outliers
boxplot(temps, main = "Boxplot θερμοκρασιών", ylab = "Θερμοκρασία")
out_idx = which(temps < lower | temps > upper)
points(rep(1, length(out_idx)), temps[out_idx], col = "red", pch = 19) # Σημειώνουμε τα outliers του IQR με κόκκινα σημεία
text(rep(1, length(out_idx)), temps[out_idx], labels = temps[out_idx], pos = 3, col = "red", cex = 0.8)
# (β) Scatter per day για να δούμε πού βρίσκονται χρονικά
plot(df$day, df$temp, main = "Θερμοκρασία ανά ημέρα", xlab = "Ημέρα", ylab = "Θερμοκρασία", pch = 19)
points(df$day[df$outlier_flag == "HIGH"], df$temp[df$outlier_flag == "HIGH"], col = "red", pch = 19, cex = 1.3) # Χρωματίζουμε τους outliers
text(df$day[df$outlier_flag == "HIGH"], df$temp[df$outlier_flag == "HIGH"], labels = df$temp[df$outlier_flag == "HIGH"], pos = 3, col = "red", cex = 0.8)
abline(h = mean_val, lty = 2, col = "gray40") # γραμμή μέσης τιμής