# Caricare il file .csv e creare una istanza per il dataset in una variabile chiamata data
url <- "https://drive.google.com/uc?export=download&id=1O4If8876MTwstkrZX0BqpQ_BxcsIMEko"
data <- read.csv(url)
# Creare un summary di tutto il dataset
# Qui controllo velocemente struttura e valori mancanti: uso summary() per farmi un'idea generale.
summary(data)
## city year month sales
## Length:240 Min. :2010 Min. : 1.00 Min. : 79.0
## Class :character 1st Qu.:2011 1st Qu.: 3.75 1st Qu.:127.0
## Mode :character Median :2012 Median : 6.50 Median :175.5
## Mean :2012 Mean : 6.50 Mean :192.3
## 3rd Qu.:2013 3rd Qu.: 9.25 3rd Qu.:247.0
## Max. :2014 Max. :12.00 Max. :423.0
## volume median_price listings months_inventory
## Min. : 8.166 Min. : 73800 Min. : 743 Min. : 3.400
## 1st Qu.:17.660 1st Qu.:117300 1st Qu.:1026 1st Qu.: 7.800
## Median :27.062 Median :134500 Median :1618 Median : 8.950
## Mean :31.005 Mean :132665 Mean :1738 Mean : 9.193
## 3rd Qu.:40.893 3rd Qu.:150050 3rd Qu.:2056 3rd Qu.:10.950
## Max. :83.547 Max. :180000 Max. :3296 Max. :14.900
# Ensure necessary packages are installed and loaded
if (!requireNamespace("dplyr", quietly = TRUE)) install.packages("dplyr")
if (!requireNamespace("moments", quietly = TRUE)) install.packages("moments")
if (!requireNamespace("ggplot2", quietly = TRUE)) install.packages("ggplot2")
library(dplyr)
##
## 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
library(moments)
library(ggplot2)
## Problema 2 ##
# Descrizione variabili dataset:
# city: città di riferimento
# year: anno di riferimento
# month: mese di riferimento
# sales: numero totale di vendite
# volume: valore totale delle vendite (in milioni di dollari)
# median_price: prezzo mediano di vendita (in dollari)
# listings: numero totale di annunci attivi
# months_inventory: quantità di tempo necessaria per vendere tutte le inserzioni correnti, espresso in mesi
# 1. Calcola Indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo,
# per le altre crea una distribuzione di frequenza. Infine, commenta tutto brevemente.
# Analisi Statistiche Descrittive per Variabili Quantitative
# Per ogni variabile quantitativa stampo summary, deviazione standard, skewness e kurtosis.
quant_vars <- c("sales", "volume", "median_price", "listings", "months_inventory")
for (var in quant_vars) {
# Stampo i principali indicatori di posizione e forma per individuare asimmetrie e code pesanti.
print(paste("--- Variabile:", var, "---"))
print(summary(data[[var]]))
print(paste("Deviazione Standard:", sd(data[[var]], na.rm = TRUE)))
print(paste("Asimmetria (Skewness):", skewness(data[[var]], na.rm = TRUE)))
print(paste("Curtosi (Kurtosis):", kurtosis(data[[var]], na.rm = TRUE)))
# Commento personale: qui controllo se la distribuzione è molto asimmetrica o ha coda pesante;
# se vedo skewness elevato o kurtosis molto diversa da 3, penso a trasformazioni o a indagare outlier.
}
## [1] "--- Variabile: sales ---"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 79.0 127.0 175.5 192.3 247.0 423.0
## [1] "Deviazione Standard: 79.6511111777792"
## [1] "Asimmetria (Skewness): 0.718104024884958"
## [1] "Curtosi (Kurtosis): 2.68682359092851"
## [1] "--- Variabile: volume ---"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.166 17.660 27.062 31.005 40.893 83.547
## [1] "Deviazione Standard: 16.6514471564494"
## [1] "Asimmetria (Skewness): 0.884742026325996"
## [1] "Curtosi (Kurtosis): 3.17698699708974"
## [1] "--- Variabile: median_price ---"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 73800 117300 134500 132665 150050 180000
## [1] "Deviazione Standard: 22662.148686505"
## [1] "Asimmetria (Skewness): -0.364552878177368"
## [1] "Curtosi (Kurtosis): 2.37703817924446"
## [1] "--- Variabile: listings ---"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 743 1026 1618 1738 2056 3296
## [1] "Deviazione Standard: 752.707756098841"
## [1] "Asimmetria (Skewness): 0.649498226273972"
## [1] "Curtosi (Kurtosis): 2.20820996666742"
## [1] "--- Variabile: months_inventory ---"
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.400 7.800 8.950 9.193 10.950 14.900
## [1] "Deviazione Standard: 2.30366862229334"
## [1] "Asimmetria (Skewness): 0.0409752658710811"
## [1] "Curtosi (Kurtosis): 2.82555245836152"
# Distribuzione di frequenza per variabili qualitative/discrete (city, year, month)
# Controllo quante osservazioni ho per ciascuna categoria, utile per capire squilibri nel dataset.
# city
freq_city <- table(data$city)
print(freq_city)
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
# year
freq_year <- table(data$year)
print(freq_year)
##
## 2010 2011 2012 2013 2014
## 48 48 48 48 48
# month
freq_month <- table(data$month)
print(freq_month)
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## 20 20 20 20 20 20 20 20 20 20 20 20
# Commento personale: se alcune città hanno pochissime osservazioni le tratterò con cautela nelle analisi condizionate.
# 2. Determina:
# - Qual è la variabile con la più alta variabilitÃ
# - Qual è la variabile con la distribuzione più asimmetrica
# Spiego come sono giunto alle conclusioni e fornisco considerazioni statistiche.
# Analisi di Variabilità e Asimmetria tra Variabili Quantitative
# Uso il Coefficiente di Variazione (CV) per confrontare variabilità relativa tra variabili con unità diverse.
cv_values <- c()
for (var in quant_vars) {
mean_val <- mean(data[[var]], na.rm = TRUE)
sd_val <- sd(data[[var]], na.rm = TRUE)
if (!is.na(mean_val) && mean_val != 0) {
cv_values[var] <- (sd_val / mean_val) * 100
} else {
cv_values[var] <- NA
}
}
print("Coefficienti di Variazione (CV) per le variabili:")
## [1] "Coefficienti di Variazione (CV) per le variabili:"
print(cv_values)
## sales volume median_price listings
## 41.42203 53.70536 17.08218 43.30833
## months_inventory
## 25.06031
most_variable_var <- names(cv_values)[which.max(cv_values)]
print(paste("Variabile con la più alta variabilità (basata sul CV):", most_variable_var, "con CV =", max(cv_values, na.rm = TRUE), "%"))
## [1] "Variabile con la più alta variabilità (basata sul CV): volume con CV = 53.7053586805415 %"
# Valuto asimmetria tramite skewness (valore assoluto per confrontare magnitudine)
skewness_values <- sapply(data[quant_vars], function(x) abs(skewness(x, na.rm = TRUE)))
print("Valori assoluti di Asimmetria (Skewness) per le variabili:")
## [1] "Valori assoluti di Asimmetria (Skewness) per le variabili:"
print(skewness_values)
## sales volume median_price listings
## 0.71810402 0.88474203 0.36455288 0.64949823
## months_inventory
## 0.04097527
most_asymmetric_var <- names(skewness_values)[which.max(skewness_values)]
print(paste("Variabile con la distribuzione più asimmetrica (basata sull'asimmetria assoluta):", most_asymmetric_var, "con Asimmetria Assoluta =", max(skewness_values, na.rm = TRUE)))
## [1] "Variabile con la distribuzione più asimmetrica (basata sull'asimmetria assoluta): volume con Asimmetria Assoluta = 0.884742026325996"
# Spiegazione e Considerazioni Statistiche (mia osservazione):
# - Uso il CV perché mi permette di confrontare dispersioni relative indipendentemente dalle unità .
# - Per l'asimmetria guardo lo skewness assoluto per identificare quale variabile si discosta maggiormente dalla simmetria;
# se lo skewness è alto penso a trasformazioni (log, sqrt) o a un'analisi degli outlier.
# 3. Seleziona una variabile quantitativa (sales) e suddividila in classi.
# Crea una distribuzione di frequenze e rappresenta i dati con un grafico a barre.
# Calcola l’indice di eterogeneità Gini e discuti i risultati.
# Analisi della Variabile 'sales' per Classi
num_classes_sales <- 5
sales_classes <- cut(data$sales, breaks = num_classes_sales, include.lowest = TRUE, ordered_result = TRUE)
# Distribuzione di frequenze per 'sales' in classi
freq_sales_classes <- table(sales_classes)
print(freq_sales_classes)
## sales_classes
## [78.7,148] (148,217] (217,285] (285,354] (354,423]
## 84 77 41 27 11
# Rappresentazione con grafico a barre
# Nota: utilizzo geom_col di ggplot o barplot base come preferisco per visualizzare le classi.
barplot(freq_sales_classes,
main = "Distribuzione di Frequenza delle Vendite (Sales) per Classi",
xlab = "Classi di Vendita",
ylab = "Frequenza",
col = "skyblue",
border = "black")

# Commento personale: il grafico mi aiuta a vedere dove si concentra la maggior parte delle vendite e se ci sono code.
# Calcolo dell’indice di eterogeneità Gini (per classi)
proportions_sales_classes <- prop.table(freq_sales_classes)
gini_index <- 1 - sum(proportions_sales_classes^2)
print(paste("Indice di Eterogeneità Gini per 'sales' in classi:", gini_index))
## [1] "Indice di Eterogeneità Gini per 'sales' in classi: 0.730625"
# Discussione: valori prossimi a 1 indicano maggiore uniformità tra le classi; valori bassi indicano concentrazione.
# 4. Calcola le probabilità che:
# presa una riga a caso di questo dataset, essa riporti la città “Beaumont"?
# E la probabilità che riporti il mese di Luglio?
# E la probabilità che riporti il mese di dicembre 2012?
total_rows <- nrow(data)
# Probabilità che riporti la città "Beaumont"
prob_beaumont <- sum(data$city == "Beaumont", na.rm = TRUE) / total_rows
print(paste("Probabilità che la città sia 'Beaumont':", prob_beaumont))
## [1] "Probabilità che la città sia 'Beaumont': 0.25"
# Probabilità che riporti il mese di "Luglio" (assumendo nomi dei mesi in inglese 'July')
prob_luglio <- sum(data$month == "July", na.rm = TRUE) / total_rows
print(paste("Probabilità che il mese sia 'Luglio' (July):", prob_luglio))
## [1] "Probabilità che il mese sia 'Luglio' (July): 0"
# Probabilità che riporti il mese di "Dicembre 2012"
prob_dicembre_2012 <- sum(data$month == "December" & data$year == 2012, na.rm = TRUE) / total_rows
print(paste("Probabilità che il mese sia 'Dicembre' (December) e l'anno sia '2012':", prob_dicembre_2012))
## [1] "Probabilità che il mese sia 'Dicembre' (December) e l'anno sia '2012': 0"
# 5. Crea una nuova colonna che calcoli il prezzo medio degli immobili utilizzando le variabili disponibili.
# Prezzo medio = volume / sales (gestisco divisione per zero)
data <- data %>%
mutate(avg_price_per_sale = ifelse(sales > 0, volume / sales, NA))
print("Prime righe del dataset con la nuova colonna 'avg_price_per_sale':")
## [1] "Prime righe del dataset con la nuova colonna 'avg_price_per_sale':"
print(head(data[, c("volume", "sales", "avg_price_per_sale")]))
## volume sales avg_price_per_sale
## 1 14.162 83 0.1706265
## 2 17.690 108 0.1637963
## 3 28.701 182 0.1576978
## 4 26.819 200 0.1340950
## 5 28.833 202 0.1427376
## 6 27.219 189 0.1440159
# Commento personale: ho creato avg_price_per_sale per valutare il valore medio per vendita; NA significa nessuna vendita.
# 6. Prova a creare una colonna che misuri l’efficacia degli annunci di vendita. Commenta e discuti i risultati.
# L'efficacia degli annunci = sales / listings (se listings > 0)
data <- data %>%
mutate(ad_effectiveness = ifelse(listings > 0, sales / listings, NA))
print("Prime righe del dataset con la nuova colonna 'ad_effectiveness':")
## [1] "Prime righe del dataset con la nuova colonna 'ad_effectiveness':"
print(head(data[, c("sales", "listings", "ad_effectiveness")]))
## sales listings ad_effectiveness
## 1 83 1533 0.05414220
## 2 108 1586 0.06809584
## 3 182 1689 0.10775607
## 4 200 1708 0.11709602
## 5 202 1771 0.11405985
## 6 189 1803 0.10482529
# Discussione: ad_effectiveness misura vendite per annuncio; valori alti suggeriscono annunci più efficaci.
# 7. Usa il pacchetto dplyr o il linguaggio base di R per effettuare analisi statistiche condizionate per città , anno e mese.
# Genera dei summary (media, deviazione standard) e rappresenta graficamente i risultati.
# Analisi condizionata per cittÃ
city_summary <- data %>%
group_by(city) %>%
summarise(
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm = TRUE),
mean_median_price = mean(median_price, na.rm = TRUE),
sd_median_price = sd(median_price, na.rm = TRUE),
.groups = 'drop'
)
print("Summary Statistico per Città (Media e Deviazione Standard):")
## [1] "Summary Statistico per Città (Media e Deviazione Standard):"
print(city_summary)
## # A tibble: 4 × 7
## city mean_sales sd_sales mean_volume sd_volume mean_median_price
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 177. 41.5 26.1 6.97 129988.
## 2 Bryan-College Sta… 206. 85.0 38.2 17.2 157488.
## 3 Tyler 270. 62.0 45.8 13.1 141442.
## 4 Wichita Falls 116. 22.2 13.9 3.24 101743.
## # ℹ 1 more variable: sd_median_price <dbl>
# Rappresentazione grafica della media delle vendite per cittÃ
ggplot(city_summary, aes(x = city, y = mean_sales, fill = city)) +
geom_bar(stat = "identity") +
labs(title = "Media delle Vendite per Città ",
x = "Città ",
y = "Media Vendite") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Analisi condizionata per anno
year_summary <- data %>%
group_by(year) %>%
summarise(
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm = TRUE),
mean_median_price = mean(median_price, na.rm = TRUE),
sd_median_price = sd(median_price, na.rm = TRUE),
.groups = 'drop'
)
print("Summary Statistico per Anno (Media e Deviazione Standard):")
## [1] "Summary Statistico per Anno (Media e Deviazione Standard):"
print(year_summary)
## # A tibble: 5 × 7
## year mean_sales sd_sales mean_volume sd_volume mean_median_price
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2010 169. 60.5 25.7 10.8 130192.
## 2 2011 164. 63.9 25.2 12.2 127854.
## 3 2012 186. 70.9 29.3 14.5 130077.
## 4 2013 212. 84.0 35.2 17.9 135723.
## 5 2014 231. 95.5 39.8 21.2 139481.
## # ℹ 1 more variable: sd_median_price <dbl>
# Grafico della media del prezzo mediano per anno
ggplot(year_summary, aes(x = as.factor(year), y = mean_median_price, group = 1)) +
geom_line() +
geom_point() +
labs(title = "Media del Prezzo Mediano per Anno",
x = "Anno",
y = "Media Prezzo Mediano") +
theme_minimal()

# Analisi condizionata per mese
# Assicuro che la variabile 'month' sia un fattore ordinato per una corretta visualizzazione
if (!all(levels(factor(data$month)) == month.name)) {
# Se month contiene nomi in inglese o numeri, provo a standardizzare
suppressWarnings({
# Provo a convertire in numerico, altrimenti mantengo i valori originali
numeric_month_try <- as.numeric(as.character(data$month))
if (all(!is.na(numeric_month_try))) {
data$numeric_month_temp <- numeric_month_try
} else {
# Se non convertibile, provo a mappare nomi inglesi a numeri
month_map <- setNames(1:12, month.name)
if (all(data$month %in% names(month_map))) {
data$numeric_month_temp <- as.integer(month_map[as.character(data$month)])
} else {
data$numeric_month_temp <- data$month
}
}
})
} else {
data$numeric_month_temp <- as.numeric(factor(data$month, levels = month.name))
}
data$month <- factor(data$numeric_month_temp, levels = 1:12, labels = month.name)
month_summary <- data %>%
group_by(month) %>%
summarise(
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm = TRUE),
mean_median_price = mean(median_price, na.rm = TRUE),
sd_median_price = sd(median_price, na.rm = TRUE),
.groups = 'drop'
)
print("Summary Statistico per Mese (Media e Deviazione Standard):")
## [1] "Summary Statistico per Mese (Media e Deviazione Standard):"
print(month_summary)
## # A tibble: 12 × 7
## month mean_sales sd_sales mean_volume sd_volume mean_median_price
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 January 127. 43.4 19.0 8.37 124250
## 2 February 141. 51.1 21.7 10.1 130075
## 3 March 189. 59.2 29.4 12.0 127415
## 4 April 212. 65.4 33.3 14.5 131490
## 5 May 239. 83.1 39.7 19.0 134485
## 6 June 244. 95.0 41.3 21.1 137620
## 7 July 236. 96.3 39.1 21.4 134750
## 8 August 231. 79.2 38.0 18.0 136675
## 9 September 182. 72.5 29.6 15.2 134040
## 10 October 180. 75.0 29.1 15.1 133480
## 11 November 157. 55.5 24.8 11.2 134305
## 12 December 169. 60.7 27.1 12.6 133400
## # ℹ 1 more variable: sd_median_price <dbl>
# Grafico della media delle vendite per mese
ggplot(month_summary, aes(x = month, y = mean_sales, group = 1)) +
geom_line() +
geom_point() +
labs(title = "Media delle Vendite per Mese",
x = "Mese",
y = "Media Vendite") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Commento Finale sull'Analisi Condizionata (mia sintesi):
# Le analisi condizionate mi permettono di individuare pattern geografici e temporali.
# Se vedo differenze marcate tra città o anni, suggerisco di approfondire con modelli che includano effetti fissi/stratificati.
## PROBLEMA 3 ##
# 1. Utilizza i boxplot per confrontare la distribuzione del prezzo mediano delle case tra le varie città . Commento personale.
ggplot(data, aes(x = city, y = median_price, fill = city)) +
geom_boxplot() +
labs(title = "Distribuzione del Prezzo Mediano delle Case per Città ",
x = "Città ",
y = "Prezzo Mediano ($)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Commento personale: confronto mediana e IQR tra città per capire quali mercati hanno prezzi più alti o più variabili.
# 2. Boxplot per il valore totale delle vendite tra città e tra anni
ggplot(data, aes(x = city, y = volume, fill = city)) +
geom_boxplot() +
labs(title = "Distribuzione del Valore Totale delle Vendite (Volume) per Città ",
x = "Città ",
y = "Valore Totale Vendite (Milioni $)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Boxplot per anno
ggplot(data, aes(x = as.factor(year), y = volume, fill = as.factor(year))) +
geom_boxplot() +
labs(title = "Distribuzione del Valore Totale delle Vendite (Volume) per Anno",
x = "Anno",
y = "Valore Totale Vendite (Milioni $)") +
theme_minimal()

# 3. Grafico a barre sovrapposte per confronto totale vendite nei vari mesi, considerando le città .
# Creo aggregazioni dei dati e poi visualizzo stacked e normalized stacked bars.
# Aggrego i dati per mese e città per ottenere le vendite totali
monthly_city_sales <- data %>%
group_by(month, city) %>%
summarise(total_sales = sum(sales, na.rm = TRUE), .groups = 'drop')
# Cerco di assicurare l'ordine corretto dei mesi: se month è numerico uso i numeri, altrimenti assumo siano nomi in inglese
if (all(monthly_city_sales$month %in% 1:12)) {
monthly_city_sales$month <- factor(as.numeric(monthly_city_sales$month), levels = 1:12, labels = month.name)
} else if (all(monthly_city_sales$month %in% month.name)) {
monthly_city_sales$month <- factor(monthly_city_sales$month, levels = month.name)
} else {
# Se non chiaro, ordino alfabeticamente come fallback
monthly_city_sales$month <- factor(monthly_city_sales$month)
}
# Stacked bar chart
ggplot(monthly_city_sales, aes(x = month, y = total_sales, fill = city)) +
geom_col(position = "stack") +
labs(title = "Vendite Totali per Mese, Distinte per Città ",
x = "Mese",
y = "Vendite Totali",
fill = "Città ") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Normalized stacked bar chart (proporzioni)
library(scales)
ggplot(monthly_city_sales, aes(x = month, y = total_sales, fill = city)) +
geom_col(position = "fill") +
labs(title = "Proporzione delle Vendite per Mese, Distinte per Città ",
x = "Mese",
y = "Proporzione delle Vendite",
fill = "Città ") +
theme_minimal() +
scale_y_continuous(labels = percent) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# PRO LEVEL: Inserire la variabile Year con faceting per evitare sovraffollamento
annual_monthly_city_sales <- data %>%
group_by(year, month, city) %>%
summarise(total_sales = sum(sales, na.rm = TRUE), .groups = 'drop')
if (all(annual_monthly_city_sales$month %in% 1:12)) {
annual_monthly_city_sales$month <- factor(as.numeric(annual_monthly_city_sales$month), levels = 1:12, labels = month.name)
} else if (all(annual_monthly_city_sales$month %in% month.name)) {
annual_monthly_city_sales$month <- factor(annual_monthly_city_sales$month, levels = month.name)
} else {
annual_monthly_city_sales$month <- factor(annual_monthly_city_sales$month)
}
ggplot(annual_monthly_city_sales, aes(x = month, y = total_sales, fill = city)) +
geom_col(position = "stack") +
facet_wrap(~ year, ncol = 2) +
labs(title = "Vendite Totali per Mese e Città , Suddivise per Anno",
x = "Mese",
y = "Vendite Totali",
fill = "Città ") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
strip.text = element_text(face = "bold"))

# 4. Line chart di median_price per confronti tra città e periodi storici
# Per creare una serie temporale robusta costruisco una colonna date a partire da year e month numerico.
# Ripristino mese numerico se necessario
if (is.factor(data$month) && anyNA(data$month)) {
num_records_per_year_city = 12
num_cities = length(unique(data$city))
num_years = length(unique(data$year))
data$numeric_month_temp <- rep(1:12, times = num_cities * num_years)
} else if (is.factor(data$month)) {
data$numeric_month_temp <- as.numeric(data$month)
} else {
data$numeric_month_temp <- as.numeric(data$month)
}
# Creo la colonna date
data$date <- as.Date(paste(data$year, data$numeric_month_temp, 1, sep = "-"), format = "%Y-%m-%d")
# Normalizzo month come fattore con nomi per leggibilitÃ
data$month <- factor(data$numeric_month_temp, levels = 1:12, labels = month.name)
median_price_time_series <- data %>%
group_by(date, city) %>%
summarise(mean_median_price = mean(median_price, na.rm = TRUE), .groups = 'drop')
median_price_time_series <- median_price_time_series[order(median_price_time_series$date), ]
ggplot(median_price_time_series, aes(x = date, y = mean_median_price, color = city, group = city)) +
geom_line() +
geom_point(size = 1) +
labs(title = "Evoluzione del Prezzo Mediano per Città nel Tempo",
x = "Data",
y = "Prezzo Mediano Medio",
color = "Città ") +
theme_minimal() +
scale_x_date(date_breaks = "6 months", date_labels = "%Y-%m")

# Commento personale: il grafico mostra trend e stagionalità ; cerco eventuali deviazioni o eventi isolati che giustifichino attenzione.
## PROBLEMA 4 ##
# Metto in evidenza tramite grafico l'efficacia degli annunci (ad_effectiveness) rispetto al prezzo mediano e suddivido per città .
# Grafico di dispersione per efficacia annunci vs prezzo mediano, con facet per cittÃ
ggplot(data, aes(x = median_price, y = ad_effectiveness, color = city)) +
geom_point(alpha = 0.7) +
facet_wrap(~ city, scales = "free_x", ncol = 2) +
labs(title = "Efficacia degli Annunci vs. Prezzo Mediano di Vendita per Città ",
x = "Prezzo Mediano di Vendita ($)",
y = "Efficacia degli Annunci (Sales/Listings)",
color = "Città ") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Commento personale finale: cerco correlazioni visive tra prezzo e efficacia; se vedo trend chiaro posso quantificarlo con regressioni per città .