Για την παρούσα εργασία επιλέχθηκε το σύνολο δεδομένων Cost of Living Index, το οποίο περιλαμβάνει λεπτομερή στοιχεία για το κόστος ζωής σε πόλεις παγκοσμίως. Τα δεδομένα αφορούν τιμές για αγαθά και υπηρεσίες όπως εστιατόρια, είδη παντοπωλείου, μεταφορές, κοινόχρηστους λογαριασμούς και ενοίκια.
Στόχος της ανάλυσης είναι να εντοπιστούν “φυσικές” ομάδες πόλεων της Ευρώπης που μοιάζουν μεταξύ τους ως προς το οικονομικό τους προφίλ.
Για τη διεξαγωγή της συσταδοποίησης, επιλέχθηκαν συγκεκριμένες μεταβλητές και πόλεις ώστε το δείγμα να είναι αντιπροσωπευτικό και τα αποτελέσματα ερμηνεύσιμα.
Από τις 55 διαθέσιμες μεταβλητές του dataset, επιλέχθηκαν οι εξής 6, οι οποίες καλύπτουν τους βασικούς πυλώνες του κόστους ζωής:
Meal_Inexpensive: Το κόστος ενός απλού γεύματος.
Monthly_Pass: Το κόστος της μηνιαίας κάρτας μετακινήσεων.
Gasoline: Η τιμή του λίτρου της βενζίνης.
Basic_Utilities: Λογαριασμοί ρεύματος, θέρμανσης και νερού.
Apartment_1br_Centre: Το ενοίκιο για διαμέρισμα ενός υπνοδωματίου στο κέντρο.
Salary: Ο μέσος μηνιαίος καθαρός μισθός.
Επιλέχθηκαν 15 πόλεις που καλύπτουν γεωγραφικά και οικονομικά όλη την Ευρώπη.ψ
Βόρεια Ευρώπη: Oslo, Stockholm, Amsterdam.
Κεντρική Ευρώπη: Berlin, Vienna, Paris, London.
Νότια Ευρώπη: Athens, Madrid, Rome, Lisbon.
Ανατολική Ευρώπη: Sofia, Bucharest, Prague, Warsaw.
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
raw_data <- read.csv("cost-of-living.csv")
# Ορισμός ονομάτων στηλών
new_colnames <- c("Meal_Inexpensive", "Meal_For_2", "McMeal", "Beer_Domestic_Rest",
"Beer_Imported_Rest", "Cappuccino", "Coke_Pepsi", "Water_Rest",
"Milk", "Bread", "Rice", "Eggs", "Cheese", "Chicken", "Beef",
"Apples", "Bananas", "Oranges", "Tomatoes", "Potatoes", "Onions",
"Lettuce", "Water_Market", "Wine_Market", "Beer_Domestic_Market",
"Beer_Imported_Market", "Cigarettes", "Ticket_OneWay", "Monthly_Pass",
"Taxi_Start", "Taxi_1km", "Taxi_1hour", "Gasoline", "VW_Golf",
"Toyota_Corolla", "Basic_Utilities", "Mobile_Tariff", "Internet",
"Gym_Fee", "Tennis", "Cinema", "Preschool", "Primary_School",
"Jeans", "Summer_Dress", "Nike_Shoes", "Leather_Shoes",
"Apartment_1br_Centre", "Apartment_1br_Outside", "Apartment_3br_Centre",
"Apartment_3br_Outside", "Price_sqm_Centre", "Price_sqm_Outside",
"Salary", "Mortgage_Rate")
colnames(raw_data)[4:58] <- new_colnames
# Φιλτράρισμα και αφαίρεση διπλοτύπων
my_cities <- c("Athens", "Paris", "Berlin", "Madrid", "Rome", "London",
"Sofia", "Bucharest", "Oslo", "Stockholm", "Vienna",
"Prague", "Warsaw", "Lisbon", "Amsterdam")
final_df <- raw_data %>%
filter(city %in% my_cities) %>%
distinct(city, .keep_all = TRUE) %>%
select(city, Meal_Inexpensive, Monthly_Pass, Gasoline, Basic_Utilities, Apartment_1br_Centre, Salary)
# Τελική διαμόρφωση
final_df <- na.omit(final_df)
rownames(final_df) <- final_df$city
data_for_clustering <- final_df[, -1]
# Δημιουργία κανονικοποιημένων δεδομένων
data_scaled <- scale(data_for_clustering)Σε αυτή την ενότητα εφαρμόζουμε δύο μεθόδους συσταδοποίησης: την Ιεραρχική και τον αλγόριθμο K-means.
Η ιεραρχική συσταδοποίηση μας επιτρέπει να δούμε τη δομή των δεδομένων σε μορφή “δέντρου” . Χρησιμοποιούμε την Ευκλείδεια απόσταση για να μετρήσουμε πόσο “απέχουν” οικονομικά οι πόλεις μεταξύ τους και τη μέθοδο Ward, η οποία τείνει να δημιουργεί συμπαγείς και ομοιογενείς συστάδες.
# Υπολογισμός απόστασης και δέντρου
dist_matrix <- dist(data_scaled, method = "euclidean")
hc_ward <- hclust(dist_matrix, method = "ward.D2")
# Σχεδίαση
plot(hc_ward,
main = "Δενδρόγραμμα Ομαδοποίησης Ευρωπαϊκών Πόλεων",
xlab = "Πόλεις",
ylab = "Απόσταση",
sub = "Μέθοδος Ward",
col = "#2E86C1",
lwd = 2)
# Πλαίσια συστάδων
rect.hclust(hc_ward, k = 3, border = "red")Σε αντίθεση με την ιεραρχική μέθοδο, ο αλγόριθμος K-means χωρίζει απευθείας τα δεδομένα σε έναν προκαθορισμένο αριθμό ομάδων (\(k\)). Με βάση το δενδρόγραμμα, επιλέγουμε \(k=3\) για να δούμε ποιες πόλεις θα τοποθετηθούν σε κάθε “γκρουπ”.
set.seed(123)
km_res <- kmeans(data_scaled, centers = 3, nstart = 25)
# Αποτελέσματα σε πίνακα
clusters_result <- data.frame(City = rownames(final_df),
Cluster = km_res$cluster)
# Προβολή αποτελεσμάτων
print(clusters_result)## City Cluster
## Paris Paris 2
## London London 3
## Madrid Madrid 2
## Berlin Berlin 3
## Rome Rome 2
## Vienna Vienna 2
## Bucharest Bucharest 1
## Warsaw Warsaw 1
## Sofia Sofia 1
## Stockholm Stockholm 2
## Amsterdam Amsterdam 3
## Oslo Oslo 3
## Athens Athens 2
## Lisbon Lisbon 2
Για να κατανοήσουμε τη λογική της ομαδοποίησης, υπολογίζουμε τον μέσο όρο των τιμών για κάθε cluster. Αυτό μας αποκαλύπτει τα κοινά οικονομικά χαρακτηριστικά των πόλεων κάθε ομάδας.
# Προσθήκη του αριθμού cluster στα αρχικά (μη κανονικοποιημένα) δεδομένα
profile_data <- final_df %>%
mutate(Cluster = km_res$cluster)
# Υπολογισμός μέσων όρων ανά Cluster (ομαδοποίηση ανά Cluster)
cluster_summary <- profile_data %>%
group_by(Cluster) %>%
summarise(
Cities_Count = n(),
Avg_Meal = mean(Meal_Inexpensive),
Avg_Rent = mean(Apartment_1br_Centre),
Avg_Salary = mean(Salary),
Avg_Utilities = mean(Basic_Utilities)
)
# Εμφάνιση του πίνακα με τους μέσους όρους
print(cluster_summary)## # A tibble: 3 × 6
## Cluster Cities_Count Avg_Meal Avg_Rent Avg_Salary Avg_Utilities
## <int> <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 3 9.65 559. 1062. 151.
## 2 2 7 13.9 1071. 1998. 180.
## 3 3 4 17.5 1699. 3542. 277.
Η στατιστική ανάλυση των συστάδων (clusters) αποκάλυψε τρεις πολύ συγκεκριμένες οικονομικές πραγματικότητες στην Ευρώπη. Τα δεδομένα επιβεβαιώνουν ότι η ομαδοποίηση δεν έγινε τυχαία, αλλά βασίστηκε σε σαφείς διαφορές στο κόστος διαβίωσης και την αγοραστική δύναμη.
Η πρώτη ομάδα περιλαμβάνει 3 πόλεις. Τα χαρακτηριστικά τους είναι:
Κόστος Στέγασης: Το χαμηλότερο της ανάλυσης, με μέσο ενοίκιο περίπου 559 USD.
Διατροφή: Ένα γεύμα κοστίζει κατά μέσο όρο 9.65 USD.
Αγοραστική Δύναμη: Ο μέσος μισθός κινείται στα 1.062 USD, γεγονός που εξηγεί και τις χαμηλές τιμές στα υπόλοιπα αγαθά.
Αυτή είναι η μεγαλύτερη ομάδα με 7 πόλεις. Εδώ βλέπουμε μια ισορροπία:
Κόστος Στέγασης: Το ενοίκιο ανεβαίνει σημαντικά στα 1.071 USD κατά μέσο όρο.
Διατροφή: Το κόστος ενός γεύματος διαμορφώνεται στα 13.9 USD.
Αγοραστική Δύναμη: Ο μέσος μισθός είναι σχεδόν διπλάσιος από την πρώτη ομάδα, φτάνοντας τα 1.998 USD.
Η τρίτη ομάδα αποτελείται από τις 4 πιο ακριβές πόλεις. Οι διαφορές εδώ είναι εντυπωσιακές:
Κόστος Στέγασης: Το μέσο ενοίκιο εκτοξεύεται στα 1.699 USD, δηλαδή τρεις φορές πάνω από την πρώτη ομάδα.
Διατροφή: Ένα απλό γεύμα κοστίζει κατά μέσο όρο 17.5 USD.
Αγοραστική Δύναμη: Οι υψηλές τιμές αντισταθμίζονται από τους πολύ υψηλούς μισθούς, οι οποίοι αγγίζουν κατά μέσο όρο τα 3.542 USD.
Η ανάλυση δείχνει ότι η Αθήνα και οι πόλεις της δεύτερης συστάδας βρίσκονται σε μια μεταβατική ζώνη. Παρόλο που το κόστος ζωής (ενοίκια, utilities) είναι υψηλότερο από τις πόλεις της Ανατολικής Ευρώπης, οι μισθοί παραμένουν σε επίπεδα που απέχουν πολύ από τα δεδομένα της Βόρειας Ευρώπης. Η συσταδοποίηση αποδεικνύει ότι το κόστος των βασικών υπηρεσιών (Utilities) ακολουθεί και αυτό την ίδια αυξητική τάση, ξεκινώντας από 151 USD στην πρώτη ομάδα και φτάνοντας τα 277 USD στην τρίτη.