# 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à.