#carica i dati del csv
df <- read.csv("Real Estate Texas.csv", sep = ",", header = TRUE)

# Crea una nuova colonna chiamata month_label
df$month_label <- factor(df$month,
                              levels = 1:12,
                              labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
                                         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),
                              ordered = TRUE)

# 6. Creazione di nuove variabili

# Calcola il prezzo medio, Volume è in milioni di dollari quindi va 
# moltiplicato per 1000000
df$mean_price <- (df$volume * 1000000) / df$sales

# Crea una nuova colonna volume_dollari con il valore reale
# per coerenza delle unità: altre variabili come median_price e mean_price 
#sono in dollari.
df$volume_dollars <- df$volume * 1000000

#nuovo pacchetto dplyr -> manipolare facilmente i dati
#nuovo pacchetto e1071 -> per skewness e kurtosis
# install.packages("dplyr")
# install.packages("e1071")
# install.packages("purrr") #funzioni potenti ed evita for loop
# install.packages("kableExtra") #kableExtra per la gestione delle tabelle nel                                   #documento markdown
# install.packages("ineq") #per le ditribuzioni GINI
# install.packages("ggplot2") # per i grafici

#se i pacchetti non sono installati li installa
if (!require("dplyr")) {
  install.packages("dplyr")
}
## Loading required package: 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
if (!require("e1071")) {
  install.packages("e1071")
}
## Loading required package: e1071
if (!require("purrr")) {
  install.packages("purrr")
}
## Loading required package: purrr
if (!require("ineq")) {
  install.packages("ineq")
}
## Loading required package: ineq
if (!require("kableExtra")) {
  install.packages("kableExtra")
}
## Loading required package: kableExtra
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
if (!require("ggplot2")) {
  install.packages("ggplot2")
}
## Loading required package: ggplot2
#carica i pachetti
library(ggplot2)
library(ineq)
library(kableExtra)
library(purrr)
library(dplyr)
library(e1071)

# Funzione per il calcolo della moda

get_mode <- function(v) {
  uniqv <- unique(v)
  uniqv[which.max(tabulate(match(v, uniqv)))]
}
#aggiunta variabile per le stagioni
df <- df %>%
  mutate(season = case_when(
    month %in% c(12, 1, 2) ~ "Winter",
    month %in% c(3, 4, 5) ~ "Spring",
    month %in% c(6, 7, 8) ~ "Summer",
    month %in% c(9, 10, 11) ~ "Autumn"
  ))


#2. Indici di posizione, variabilità e forma
# Funzione per calcolare tutti gli indici su un singolo vettore
calcola_indici <- function(x) {
  data.frame(
    media = mean(x, na.rm = TRUE),
    mediana = median(x, na.rm = TRUE),
    moda = get_mode(x),
    minimo = min(x, na.rm = TRUE),
    massimo = max(x, na.rm = TRUE),
    Q1 = quantile(x, 0.25, na.rm = TRUE),
    Q3 = quantile(x, 0.75, na.rm = TRUE),
    varianza = var(x, na.rm = TRUE),
    deviazione_std = sd(x, na.rm = TRUE),
    coeff_var = sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE),
    skewness = skewness(x, na.rm = TRUE),
    kurtosis = kurtosis(x, na.rm = TRUE)
  )
}


#efficacia annuci valore assoluto, immobili venduti (sales) / immobili in listino (listings)
df <- df %>%
  mutate(efficacia_annunci = round(sales / listings, 2))

#max(df$efficacia_annunci)
#min(df$efficacia_annunci)

#efficacia annunci in percentuale
df <- df %>%
  mutate(efficacia_percentuale = round((sales / listings) * 100, 2))

riassunto_statistico <- df %>%
  select(where(is.numeric)) %>%
  map_dfr(calcola_indici, .id = "variabile")

#tolgo le variabili non interessate dagli indici
riassunto_statistico <- riassunto_statistico %>%
  filter(!variabile %in% c("year", "month","sales_class","efficacia_livello","volume_dollars","volume","median_price"))

options(scipen = 999) #toglie la notazione scientica

riassunto_statistico <- riassunto_statistico %>%
  mutate(across(where(is.numeric), ~round(., 2)))

Analisi delle variabili

(1. Analisi delle variabili)

Di seguito una panoramica delle variabili contenute nel dataset e la loro tipologia statistica:

Variabile Descrizione Tipo di Variabile
city Nome della città (es. Beaumont, Wichita Falls, etc.) Qualitativa nominale
year Anno di riferimento (es. 2010, 2011, …) Quantitativa continua da trattare come qualitativa ordinale in questo caso
month Mese di riferimento (es. 1,2, …) Qualitativa nominale
sales Numero di vendite immobiliari Quantitativa discreta
volume Valore totale delle vendite (in milioni di dollari, con decimali) Quantitativa continua
median_price Prezzo mediano delle case vendute (in dollari) Quantitativa continua
listings Numero totale di annunci immobiliari attivi Quantitativa discreta
months_inventory Tempo stimato per esaurire le case in vendita (in mesi, es. 2.1, 4.7, …) Quantitativa continua

Al dataset iniziale sono state aggiunte le seguenti variabili, con l’obiettivo di migliorare la leggibilità dei grafici e l’analisi statistica del progetto:

Valori vicini a 1 indicano una efficacia alta viceversa valori vicini a 0 una efficacia bassa.

È un indicatore utile per valutare l’efficienza del mercato immobiliare locale.

#2. Indici di posizione, variabilità e forma
riassunto_statistico %>%
  kbl(caption = "Riepilogo statistico delle variabili numeriche",
      align = "c", 
      booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE,
                font_size = 14)
Riepilogo statistico delle variabili numeriche
variabile media mediana moda minimo massimo Q1 Q3 varianza deviazione_std coeff_var skewness kurtosis
25%…1 sales 192.29 175.50 124.00 79.00 423.00 127.00 247.00 6344.30 79.65 0.41 0.71 -0.34
25%…2 listings 1738.02 1618.50 1581.00 743.00 3296.00 1026.50 2056.00 566568.97 752.71 0.43 0.65 -0.81
25%…3 months_inventory 9.19 8.95 8.10 3.40 14.90 7.80 10.95 5.31 2.30 0.25 0.04 -0.20
25%…4 mean_price 154320.37 156588.48 170626.51 97010.20 213233.94 132938.94 173915.15 736984385.27 27147.46 0.18 -0.07 -0.80
25%…5 efficacia_annunci 0.12 0.11 0.10 0.05 0.39 0.09 0.13 0.00 0.05 0.40 2.09 6.93
25%…6 efficacia_percentuale 11.87 10.96 10.48 5.01 38.71 8.98 13.50 22.00 4.69 0.39 2.08 6.80

(2. Indici di posizione, variabilità e forma)

Distribuzione dei dati

Variabilità

Caratteristiche del mercato

#2. Indici di posizione, variabilità e forma)

#frequenze_city <- df %>%
#  count(city, name = "Frequenza") %>%
#  mutate(Frequenza_percentuale = round(Frequenza / sum(Frequenza) * 100, 2))


# Funzione per creare tabella con frequenze assolute e relative
get_frequenze <- function(var) {
  df %>%
    count({{var}}, name = "Frequenza") %>%
    mutate(Frequenza_percentuale = round(Frequenza / sum(Frequenza) * 100, 2))
}

frequenze_city        <- get_frequenze(city)
frequenze_year        <- get_frequenze(year)
frequenze_month       <- get_frequenze(month)
frequenze_month_label <- get_frequenze(month_label)
frequenze_season      <- get_frequenze(season)



#indice di GINI per variabili categoriche
gini.index <- function(x){
  ni = table(x)
  fi = ni/length(x)
  fi2 = fi^2
  j = length(table(x))
  
  gini = 1-sum(fi2)
  gini.normalizzato = gini/((j-1)/j)
  
  return(gini.normalizzato)
  
}
indice_gini_city <- gini.index(df$city) # valore 1

#ineq(df$sales, type = "Gini")

#  Calcolo dell'indice di Gini per le frequenze delle classi
sales_class_freq <- table(df$sales_class)
frequenze_city %>%
  kbl(caption = "Distribuzione di frequenza per la variabile City",
      align = "c", 
      booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE,
                font_size = 14)
Distribuzione di frequenza per la variabile City
city Frequenza Frequenza_percentuale
Beaumont 60 25
Bryan-College Station 60 25
Tyler 60 25
Wichita Falls 60 25

Cosa si evince:
L’indice di Gini per la variabile Città è 1, cioè equamente distribuita.

#2. Indici di posizione, variabilità e forma) 
  


frequenze_month %>%
  kbl(caption = "Distribuzione di frequenza per la variabile Month",
      align = "c", 
      booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = FALSE,
                font_size = 14)
Distribuzione di frequenza per la variabile Month
month Frequenza Frequenza_percentuale
1 20 8.33
2 20 8.33
3 20 8.33
4 20 8.33
5 20 8.33
6 20 8.33
7 20 8.33
8 20 8.33
9 20 8.33
10 20 8.33
11 20 8.33
12 20 8.33
#5. Calcolo della probabilità

p_beaumont <- round((sum(df$city == "Beaumont") / nrow(df)) * 100,2)
p_luglio <- round((sum(df$month == 7) / nrow(df))* 100,2)
p_dicembre_2012 <- round((sum(df$month == 12 & df$year == 2012) / nrow(df))* 100,2)

La probabilità che preso un record a caso del dataset esso riporti: (5. Calcolo della probabilità)

#4. Creazione di classi per una variabile quantitativa


# 4. Creazione di classi per una variabile quantitativa

 #classi
breaks <- seq(0, 500, by = 100)
df <- df %>%
  mutate(sales_class = cut(
    sales,
    breaks = breaks,   # numero di classi
    include.lowest = TRUE,
    right = FALSE, # intervalli chiusi a sinistra, aperti a destra
    dig.lab = 10   # evita notazione scientifica 
  ))

frequenze_sales_class <- df %>%
  count(sales_class, name = "Frequenza") %>%
  mutate(Frequenza_percentuale = round(Frequenza / sum(Frequenza) * 100, 2))

gini_sales_class <- ineq(as.numeric(sales_class_freq), type = "Gini")

frequenze_sales_class %>%
  kbl(caption = "Distribuzione di frequenza delle Classi della variabile Sales (4. Creazione di classi per una variabile quantitativa)",
      align = "c", 
      booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = TRUE,
                font_size = 14)
Distribuzione di frequenza delle Classi della variabile Sales (4. Creazione di classi per una variabile quantitativa)
sales_class Frequenza Frequenza_percentuale
[0,100) 20 8.33
[100,200) 127 52.92
[200,300) 67 27.92
[300,400) 23 9.58
[400,500] 3 1.25
df %>%
  count(sales_class) %>%
  mutate(perc = round(n / sum(n) * 100, 1)) %>%
  ggplot(aes(x = sales_class, y = perc)) +
  geom_col(fill = "#4C9F70") +
  geom_text(aes(label = paste0(perc, "%")), vjust = -0.5) +
  theme_minimal() +
  labs(
    title = "Distribuzione % delle Classi di Sales",
    x = "Classi di Sales",
    y = "Percentuale"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Cosa si evince:

# 7. Analisi condizionata
riassunto_statistico_per_Beaumont <- df %>%
  filter(city == "Beaumont") %>%
  select(where(is.numeric)) %>%
  map_dfr(calcola_indici, .id = "variabile")

riassunto_statistico_per_Beaumont <- riassunto_statistico_per_Beaumont %>%
  filter(!variabile %in% c("year", "month","sales_class","efficacia_livello","volume_dollars","volume","median_price"))

options(scipen = 999) #toglie la notazione scientica

riassunto_statistico_per_Beaumont <- riassunto_statistico_per_Beaumont %>%
  mutate(across(where(is.numeric), ~round(., 2)))


riassunto_statistico_per_Beaumont %>%
  kbl(caption = "Riassunto Statistico per la città di Beaumont (7. Analisi condizionata)",
      align = "c", 
      booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
               # full_width = TRUE,
                font_size = 14)
Riassunto Statistico per la città di Beaumont (7. Analisi condizionata)
variabile media mediana moda minimo massimo Q1 Q3 varianza deviazione_std coeff_var skewness kurtosis
25%…1 sales 177.38 176.5 182.00 83.00 273.00 150.00 202.00 1720.92 41.48 0.23 0.18 -0.26
25%…2 listings 1679.32 1676.0 1708.00 1500.00 1857.00 1619.25 1743.75 8305.37 91.13 0.05 0.02 -0.79
25%…3 months_inventory 9.97 10.4 11.60 7.00 12.60 8.57 11.40 2.72 1.65 0.17 -0.21 -1.35
25%…4 mean_price 146640.41 145808.6 170626.51 120713.33 174723.93 141631.15 153598.03 126160695.61 11232.13 0.08 -0.14 0.13
25%…5 efficacia_annunci 0.11 0.1 0.10 0.05 0.17 0.09 0.12 0.00 0.03 0.26 0.30 -0.47
25%…6 efficacia_percentuale 10.61 10.3 15.19 5.41 16.51 8.91 11.89 7.12 2.67 0.25 0.36 -0.48
riassunto_statistico_per_Beaumont_estate_2014 <- df %>%
  filter(city == "Beaumont" & season == "Summer" & year == 2014) %>%
  select(where(is.numeric)) %>%
  map_dfr(calcola_indici, .id = "variabile")

riassunto_statistico_per_Beaumont_estate_2014 <- riassunto_statistico_per_Beaumont_estate_2014 %>%
  filter(!variabile %in% c("year", "month","sales_class","efficacia_livello","volume_dollars","volume","median_price"))

options(scipen = 999) #toglie la notazione scientica

riassunto_statistico_per_Beaumont_estate_2014 <- riassunto_statistico_per_Beaumont_estate_2014 %>%
  mutate(across(where(is.numeric), ~round(., 2)))

riassunto_statistico_per_Beaumont_estate_2014 %>%
  kbl(caption = "Riassunto Statistico per la città di Beaumont Estate 2014(7. Analisi condizionata)",
      align = "c", 
      booktabs = TRUE) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
               # full_width = TRUE,
                font_size = 14)
Riassunto Statistico per la città di Beaumont Estate 2014(7. Analisi condizionata)
variabile media mediana moda minimo massimo Q1 Q3 varianza deviazione_std coeff_var skewness kurtosis
25%…1 sales 242.67 254.00 254.00 212.00 262.00 233.00 258.00 721.33 26.86 0.11 -0.35 -2.33
25%…2 listings 1648.67 1657.00 1672.00 1617.00 1672.00 1637.00 1664.50 808.33 28.43 0.02 -0.27 -2.33
25%…3 months_inventory 7.93 8.00 8.00 7.80 8.00 7.90 8.00 0.01 0.12 0.01 -0.38 -2.33
25%…4 mean_price 157335.54 157217.56 150350.39 150350.39 164438.68 153783.98 160828.12 49630387.94 7044.88 0.04 0.02 -2.33
25%…5 efficacia_annunci 0.15 0.15 0.15 0.13 0.16 0.14 0.16 0.00 0.02 0.10 -0.21 -2.33
25%…6 efficacia_percentuale 14.73 15.19 15.19 12.79 16.20 13.99 15.70 3.07 1.75 0.12 -0.25 -2.33
  1. 8. Creazione di visualizzazioni con ggplot2
  2. Distribuzione del prezzo mediano per città
    # 1 boxplot per confrontare la distribuzione del prezzo mediano tra le varie città , fill = city
    ggplot(df, aes(x = city, y = median_price)) +
      geom_boxplot() +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
      labs(
       # title = "Distribuzione del prezzo mediano per città",
        x = "Città",
        y = "Prezzo Mediano",
        fill = "Città"
      )

Prezzi più alti: Bryan-College Station ha i prezzi mediani più elevati, con valori che si aggirano intorno ai 150.000-160.000 $.

Prezzi intermedi: Tyler mostra prezzi leggermente inferiori rispetto a Bryan-College Station, con una mediana intorno ai 140.000 $ e una distribuzione abbastanza ampia.

Prezzi più bassi: Beaumont ha prezzi poco più bassi, con una mediana di circa 130.000 $. Wichita Falls presenta i prezzi più bassi del gruppo, con una mediana intorno ai 100.000 $.

Variabilità: Bryan-College Station e Tyler mostrano una maggiore variabilità nei prezzi (box più ampie), mentre Beaumont e Wichita Falls hanno delle distribuzioni più concentrate.

Outliers: Si possono notare alcuni valori anomali a Bryan-College Station e a Wichita Falls.

Il grafico suggerisce la presenza di differenze importanti nel mercato immobiliare tra le città prese in esame.

  1. Distribuzione del valore totale delle vendite tra le varie città

    # 2 distribuzione delle vendite  tra le varie città e anni
    
    
    # 2-1 Boxplot per confronto tra città , fill = city
    ggplot(df, aes(x = city, y = sales)) +
      geom_boxplot(alpha = 0.7) +
      labs(#title = "Distribuzione valore vendite per città",
           x = "Città",
           y = "Sales") +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 45, hjust = 1),
            legend.position = "none") 

Tyler al top: ha la mediana più alta (intorno a 275) e la seconda distribuzione più ampia. È il mercato più forte, con vendite che possono arrivare oltre 400.

Bryan-College Station interessante: ha una mediana più bassa di Tyler (circa 190), ma una distribuzione più ampia.

Beaumont stabile: ha una mediana intorno a 175 con una distribuzione meno ampia rispetto alle precedenti.

Wichita Falls ultima: ha una mediana bassa (circa 120) ed una distribuzione ristretta. È chiaramente il mercato più piccolo.

Variabilità: Tyler e Bryan-College Station hanno molta più variabilità nelle vendite rispetto a Beaumont e Wichita Falls

Distribuzione valore vendite per anno e città

# 2-4 anni per ogni città 
ggplot(df, aes(x = as.factor(year), y = sales)) +
  geom_boxplot(alpha = 0.7) +
  facet_wrap(~city, ncol = 2) +
  labs(title = "Distribuzione valore vendite per anno e città",
       x = "Anno",
       y = "Sales") +
  theme_minimal() +
  theme(legend.position = "none") 

Beaumont: rappresenta il mercato più stabile, con una mediana che, nel corso degli anni, resta sempre con valori intorno a 175-200.

Bryan-College Station: nel 2010-2011 ha un mercato stabile; nel 2012, pur con una mediana stabile rispetto agli anni precedenti si osserva un’ampia distribuzione verso l’alto che culmina nel 2014 con un notevole aumento anche della mediana.

Tyler: Cresce costantemente dal 2010 al 2014, raggiungendo il picco nel 2014 con mediana intorno a 340.

Wichita Falls: è sicuramente il mercato più piccolo, con valori di mediana sempre inferiori a 150 con il minimo raggiunto nel 2014.

  1. Totale delle vendite mensili per città

    # 3 grafico a barre sovrapposte per confrontare il totale delle vendite nei vari mesi,
    #    per città. Grafico a barre normalizzato. prova ad inserire la variabile YEAR
    
    
    df %>%
      group_by(month_label, city) %>%  # Raggruppa per mese e città
      summarise(total_sales = sum(sales, na.rm = TRUE), .groups = 'drop') %>%
      ggplot(aes(x = factor(month_label), y = total_sales, fill = city)) +
      geom_bar(stat = "identity") +  
      labs(
        #title = "Totale Sales per mese",
        x = "Mese",
        y = "Totale vendite",
        fill = "Città"
      ) +
      theme_minimal()

Il boom della primavera-estate: i mesi di maggio, giugno, luglio e agosto sono chiaramente i migliori, con vendite totali che superano le 4.500 unità, con giugno che rappresenta l’apice della crescita.

Autunno in calo: a partire dal mese di settembre si ha un calo progressivo delle vendite che culmina a novembre.

L’inverno è duro: i mesi invernali, in particolare gennaio e febbraio, sono i mesi più deboli, con vendite sotto le 3.000 unità.

È interessante vedere come tutte le città seguano lo stesso pattern stagionale, ma Tyler e Bryan-College Station amplificano molto di più l’effetto estate-inverno.

Distribuzione percentuale delle vendite per mese e città

df %>%
  group_by(month_label, city,year) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE), .groups = 'drop') %>%
  group_by(month_label,year) %>%
  mutate(perc_sales = total_sales / sum(total_sales)) %>%
  ggplot(aes(x = factor(month_label), y = perc_sales, fill = city)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(
    #title = "Distribuzione percentuale delle vendite per mese e città",
    x = "Mese",
    y = "Percentuale vendite",
    fill = "Città"
  ) +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

Beaumont costante: La fascia rossa è rappresentata in modo stabile nel corso dell’anno.

Bryan-College Station tiene bene: La fascia verde è ben rappresentata particolarmente nei mesi estivi, indice che questa città contribuisce notevolmente al totale delle vendite.

Tyler domina sempre: La fascia azzurra è la più ampia ogni mese, confermando che è il mercato più forte durante tutto l’anno.

Wichita Falls sempre piccola: La fascia viola è la meno rappresentata, confermando che è il mercato più piccolo.

  1. Andamento dell’Efficacia degli annunci per città nel tempo

    # 4 line chart di una variabile per fare confronti fra città e periodi #storici
    # df %>%
    #   group_by(year, city) %>%
    #   summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
    #   ggplot(aes(x = year, y = media_eff, color = city)) +
    #   geom_line(linewidth = 1) +
    #   labs(
    #     #title = "Andamento dell'efficacia percentuale per città",
    #     x = "Anno",
    #     y = "Efficacia (%)",
    #     color = "Città"
    #   ) +
    #   theme_minimal()
    
    # df %>%
    #   group_by(year, month, city) %>%
    #   summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
    #   ggplot(aes(x = paste(year, month, sep = "-"), y = media_eff, color = city)) +
    #   geom_line(linewidth = 1) +
    #   labs(
    #     #title = "Andamento dell'efficacia percentuale per città",
    #     x = "Anno-Mese",
    #     y = "Efficacia (%)",
    #     color = "Città"
    #   ) +
    #   theme_minimal()
    
    # df %>%
    #   mutate(
    #     date = as.Date(paste(year, month, "01", sep = "-")),
    #     month_label = factor(month_label, levels = unique(month_label[order(year, month)]))
    #   ) %>%
    #   group_by(month_label, date, city) %>%
    #   summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
    #   ggplot(aes(x = month_label, y = media_eff, group = city, color = city)) +
    #   geom_line(linewidth = 1) +
    #   labs(
    #     x = "Mese",
    #     y = "Efficacia (%)",
    #     color = "Città"
    #   ) +
    #   theme_minimal()
    
    # df %>%
    #   mutate(
    #     date = as.Date(paste(year, month, "01", sep = "-")),
    #     month_label = factor(month_label, levels = month.abb)  # ordina correttamente i mesi
    #   ) %>%
    #   group_by(date, city) %>%
    #   summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
    #   arrange(date) %>%
    #   ggplot(aes(x = date, y = media_eff, color = city)) +
    #   geom_line(linewidth = 1) +
    #   scale_x_date(
    #     date_labels = "%b %Y",  # etichette tipo "Jan 2024"
    #     date_breaks = "1 month"
    #   ) +
    #   labs(
    #     x = "Mese",
    #     y = "Efficacia (%)",
    #     color = "Città"
    #   ) +
    #   theme_minimal() +
    #   theme(axis.text.x = element_text(angle = 45, hjust = 1))
    ?mutate
    
    df %>%
      mutate(date = as.Date(paste(year, month, "01", sep = "-"))) %>%
      group_by(date, city) %>%
      summarise(media_eff = mean(efficacia_percentuale, na.rm = TRUE), .groups = 'drop') %>%
      ggplot(aes(x = date, y = media_eff, color = city)) +
      geom_line(linewidth = 1) +
      scale_x_date(
        date_labels = "%b %Y",
        date_breaks = "6 months"   # una label ogni sei mesi
      ) +
      labs(
        x = "Mese - Anno",
        y = "Efficacia (%)",
        color = "Città"
      ) +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 45, hjust = 1))

Beaumont mostra una lieve flessione nell’efficacia nel 2011 per poi cresce costantemente fino al 2014;

Bryan-College Station ha avuto un picco di crescita a partire dal 2012 arrivando a superare il 20% nel 2014, rappresentando la città con l’efficacia migliore;

Tyler rappresenta una crescita dell’efficacia costante pur rimanendo con la percentuale di efficacia minore;

Wichita Falls ha un andamento altalenante, tuttavia i valori iniziali e finali sono simili mostrando una buona efficacia.

  1. Considerazioni sulle vendite

Autunno e primavera le mezze stagioni: queste due stagioni hanno vendite simili, con la primavera che presenta vendite leggermente più alte.

Estate al primo posto: l’estate è chiaramente la stagione con più vendite, raggiungendo i picchi più alti soprattutto nel 2013 e 2014.

Inverno fanalino di coda: l’inverno è la stagione con vendite minori in tutti gli anni considerati.

Nel tempo: analizzando l’andamento delle vendite nel corso degliannisi nota una progressiva crescita dal 2011 con culmine nel 2014 in tutte le stagioni.

Conclusioni (9. Conclusioni)

Dall’analisi dei grafici emerge un quadro interessante del mercato immobiliare delle quattro città studiate.

Bryan-College Station è il mercato più promettente: mostra un netto miglioramento nell’efficacia delle vendite con i prezzi più elevati.

Tyler conferma la promessa iniziale con una crescita costante con elevati valori di vendite.

Beaumont si posiziona in una fascia intermedia, con una crescita più lenta ma costante.

Wichita Falls presenta i valori più contenuti sia in termini di vendite che di prezzi.

Il dato più rilevante riguarda l’efficacia commerciale: anche se i tassi di conversione da annuncio a vendita sono generalmente bassi in tutte le città, si osservano miglioramenti per Beaumont e Tyler e un boom per quanto riguarda Bryan-College Station.

Raccomandazioni per Texas Realty Insights