Texas Realty Insights
Analisi statistica e visuale del mercato immobiliare texano
Luca Bennardo
25 ottobre 2025
Step 1 – Definizione delle variabili
# ===============================================================
# In questa sezione vengono descritte le principali variabili del dataset *Texas Realty*, specificandone la natura statistica e il ruolo funzionale all’interno del modello di analisi.
# ===============================================================
library(lubridate)
library(janitor)
library(dplyr)
library(readr)
library(tibble)
library(knitr)
# Import e tipizzazione coerente
re <- read_csv("Real Estate Texas.csv", show_col_types = FALSE) %>%
clean_names() %>%
mutate(
# Variabili di supporto numeriche
year_num = as.integer(year),
month_num = as.integer(month),
# Tipi variabili
city = factor(city), # qualitativa nominale
year = as.numeric(year), # quantitativa continua (trattata come ordinale nei confronti)
year_ord = factor(year_num, ordered = TRUE), # versione qualitativa ordinale da usare in analisi mirate)
month = factor(month_num, levels = 1:12, # qualitativa nominale (ciclica)
labels = as.character(1:12)),
sales = as.integer(sales), # quantitativa discreta
listings = as.integer(listings), # quantitativa discreta
volume = as.numeric(volume), # quantitativa continua
median_price = as.numeric(median_price), # quantitativa continua
months_inventory = as.numeric(months_inventory), # quantitativa continua
# Data utile per analisi temporali
date = make_date(year = year_num, month = month_num, day = 1)
)
# Tabella di metadati
meta <- tibble(
variabile = c("city", "year", "month", "sales", "volume",
"median_price", "listings", "months_inventory"),
tipo_statistico = c(
"Qualitativa nominale",
"Quantitativa continua (trattata come qualitativa ordinale)",
"Qualitativa nominale (ciclica) codificata in numeri",
"Quantitativa discreta",
"Quantitativa continua",
"Quantitativa continua",
"Quantitativa discreta",
"Quantitativa continua"
),
scala = c(
"Nominale",
"—", # trattata come ordinale
"Nominale (ciclica)",
"Rapporti",
"Rapporti",
"Rapporti",
"Rapporti",
"Rapporti"
)
)
kable(
meta,
booktabs = TRUE,
align = c("l", "l", "l"),
caption = "Tabella delle variabili definite"
)
Tabella delle variabili definite
| city |
Qualitativa nominale |
Nominale |
| year |
Quantitativa continua (trattata come qualitativa
ordinale) |
— |
| month |
Qualitativa nominale (ciclica) codificata in
numeri |
Nominale (ciclica) |
| sales |
Quantitativa discreta |
Rapporti |
| volume |
Quantitativa continua |
Rapporti |
| median_price |
Quantitativa continua |
Rapporti |
| listings |
Quantitativa discreta |
Rapporti |
| months_inventory |
Quantitativa continua |
Rapporti |
Step 2 – Indici descrittivi per variabili quantitative
# ===============================================================
# In questa sezione vengono analizzati gli indici descrittivi delle variabili quantitative
# del dataset, comprendendo misure di posizione (media, mediana),
# di dispersione (deviazione standard, varianza) e di forma (asimmetria, curtosi).
# Per ciascuna variabile viene inoltre fornito un breve commento interpretativo.
# ===============================================================
library(dplyr)
library(purrr)
library(knitr)
library(moments)
library(scales)
library(stringr)
# Selezione variabili quantitative coerenti con la definizione ufficiale
# (sono escluse 'city', 'month' e 'year' poiché qualitative o trattate come ordinali)
num_vars <- c("sales", "listings", "volume", "median_price", "months_inventory")
# Funzione per generare un commento sintetico sulla distribuzione
genera_commento <- function(media_val, sd_val, skew_val, kurt_val) {
out <- c()
# Dispersione relativa
if (!is.na(sd_val) && !is.na(media_val) && media_val != 0) {
if (sd_val / media_val > 0.5) out <- c(out, "alta dispersione")
else out <- c(out, "bassa dispersione")
}
# Asimmetria
if (!is.na(skew_val)) {
if (skew_val > 0.5) out <- c(out, "asimmetria positiva (coda a destra)")
else if (skew_val < -0.5) out <- c(out, "asimmetria negativa (coda a sinistra)")
else out <- c(out, "distribuzione simmetrica")
}
# Curtosi
if (!is.na(kurt_val)) {
if (kurt_val > 3) out <- c(out, "leptocurtica (molto concentrata)")
else if (kurt_val < 3) out <- c(out, "platicurtica (piatta)")
else out <- c(out, "mesocurtica (normale)")
}
paste(out, collapse = ", ")
}
# Calcolo delle statistiche descrittive
tabella_step2 <- map_dfr(num_vars, function(v) {
df <- re[[v]]
media_val <- mean(df, na.rm = TRUE)
mediana_val <- median(df, na.rm = TRUE)
sd_val <- sd(df, na.rm = TRUE)
var_val <- var(df, na.rm = TRUE)
skew_val <- skewness(df, na.rm = TRUE)
kurt_val <- kurtosis(df, na.rm = TRUE)
tibble(
variabile = v,
media = fmt_num(media_val),
mediana = fmt_num(mediana_val),
deviazione_standard = fmt_num(sd_val),
varianza = fmt_num(var_val),
asimmetria = fmt_num(skew_val),
curtosi = fmt_num(kurt_val),
commento = genera_commento(media_val, sd_val, skew_val, kurt_val) # <-- ora sicuro
)
})
# Tabella finale formattata
kable(
tabella_step2,
booktabs = TRUE,
align = c("l", rep("c", 6), "l"),
caption = "Indici descrittivi per le variabili quantitative del dataset Texas Realty"
)
Indici descrittivi per le variabili quantitative del dataset
Texas Realty
| sales |
192,29 |
175,50 |
79,65 |
6.344,30 |
0,72 |
2,69 |
bassa dispersione, asimmetria positiva (coda a destra),
platicurtica (piatta) |
| listings |
1.738,02 |
1.618,50 |
752,71 |
566.568,97 |
0,65 |
2,21 |
bassa dispersione, asimmetria positiva (coda a destra),
platicurtica (piatta) |
| volume |
31,01 |
27,06 |
16,65 |
277,27 |
0,88 |
3,18 |
alta dispersione, asimmetria positiva (coda a destra),
leptocurtica (molto concentrata) |
| median_price |
132.665,42 |
134.500,00 |
22.662,15 |
513.572.983,09 |
-0,36 |
2,38 |
bassa dispersione, distribuzione simmetrica,
platicurtica (piatta) |
| months_inventory |
9,19 |
8,95 |
2,30 |
5,31 |
0,04 |
2,83 |
bassa dispersione, distribuzione simmetrica,
platicurtica (piatta) |
Step 3 – Variabilità e asimmetria
# ===============================================================
# In questa sezione viene analizzata la variabilità relativa delle variabili quantitative
# del dataset, mediante il coefficiente di variazione (CV),
# definito come rapporto tra la deviazione standard e la media.
# ===============================================================
library(dplyr)
library(purrr)
library(knitr)
library(scales)
# Selezione variabili quantitative coerenti con la definizione ufficiale
# (sono escluse 'city', 'month' e 'year' poiché qualitative o trattate come ordinali)
num_vars <- c("sales", "listings", "volume", "median_price", "months_inventory")
# Funzione per classificare la variabilità in base al CV
classifica_cv <- function(cv_val) {
if (is.na(cv_val)) return("")
if (cv_val < 0.10) "variabilità molto bassa"
else if (cv_val < 0.25) "variabilità bassa"
else if (cv_val < 0.50) "variabilità moderata"
else "variabilità elevata"
}
# Calcolo del coefficiente di variazione (CV)
tabella_step3 <- map_dfr(num_vars, function(v) {
df <- re[[v]]
media_val <- mean(df, na.rm = TRUE)
sd_val <- sd(df, na.rm = TRUE)
cv_val <- ifelse(media_val != 0, sd_val / media_val, NA_real_)
tibble(
variabile = v,
media = fmt_num(media_val),
deviazione_standard = fmt_num(sd_val),
coefficiente_variazione = fmt_perc(cv_val),
interpretazione = classifica_cv(cv_val)
)
})
# Tabella finale formattata
kable(
tabella_step3,
booktabs = TRUE,
align = c("l", "c", "c", "c", "l"),
caption = "Analisi della variabilità tramite Coefficiente di Variazione (CV)"
)
Analisi della variabilità tramite Coefficiente di Variazione
(CV)
| sales |
192,29 |
79,65 |
41,42 % |
variabilità moderata |
| listings |
1.738,02 |
752,71 |
43,31 % |
variabilità moderata |
| volume |
31,01 |
16,65 |
53,71 % |
variabilità elevata |
| median_price |
132.665,42 |
22.662,15 |
17,08 % |
variabilità bassa |
| months_inventory |
9,19 |
2,30 |
25,06 % |
variabilità moderata |
Step 4 – Distribuzioni per classi e indici di Gini
# ===============================================================
# In questa sezione viene creata una distribuzione per classi della variabile
# quantitativa 'median_price' e calcolato l'indice di eterogeneità di Gini.
# L'indice misura il grado di concentrazione della distribuzione:
# valori vicini a 0 indicano omogeneità, valori vicini a 1 eterogeneità elevata.
# ===============================================================
library(dplyr)
library(tibble)
library(knitr)
library(ggplot2)
library(scales)
# --- Selezione della variabile quantitativa ---
x <- re$median_price
# --- Creazione delle classi automatiche (intervalli regolari) ---
breaks <- pretty(x, 8)
labels <- paste0(head(breaks, -1), " – ", tail(breaks, -1))
x_class <- cut(x, breaks = breaks, labels = labels, include.lowest = TRUE, right = FALSE)
# --- Distribuzione di frequenze assolute e relative ---
freq_tbl <- as_tibble(table(x_class)) %>%
rename(Classe = x_class, Frequenza = n) %>%
mutate(
Frequenza_relativa = Frequenza / sum(Frequenza),
Percentuale = fmt_perc(Frequenza_relativa)
)
# --- Funzione per il calcolo dell'indice di Gini normalizzato ---
gini.index <- function(x) {
ni <- table(x) # frequenze assolute
fi <- ni / length(x) # frequenze relative
fi2 <- fi^2 # quadrato delle frequenze relative
J <- length(fi) # numero di classi
gini <- 1 - sum(fi2) # Gini non normalizzato
gini_norm <- gini / ((J - 1) / J) # Gini normalizzato
return(gini_norm)
}
# --- Calcolo dell'indice di Gini per la distribuzione ---
gini_val <- gini.index(x_class)
# --- Tabella di riepilogo del risultato ---
tabella_step4 <- tibble(
Variabile = "median_price (classificata)",
`Indice di Gini` = fmt_num(as.numeric(gini_val))
)
# --- Tabella 1: distribuzione per classi ---
kable(
freq_tbl %>% select(Classe, Frequenza, Percentuale),
booktabs = TRUE,
align = c("l", "c", "c"),
caption = "Distribuzione per classi della variabile 'median_price'"
)
Distribuzione per classi della variabile
‘median_price’
| 70000 – 80000 |
1 |
0,42 % |
| 80000 – 90000 |
8 |
3,33 % |
| 90000 – 100000 |
15 |
6,25 % |
| 100000 – 110000 |
23 |
9,58 % |
| 110000 – 120000 |
18 |
7,50 % |
| 120000 – 130000 |
26 |
10,83 % |
| 130000 – 140000 |
48 |
20,00 % |
| 140000 – 150000 |
40 |
16,67 % |
| 150000 – 160000 |
40 |
16,67 % |
| 160000 – 170000 |
14 |
5,83 % |
| 170000 – 180000 |
7 |
2,92 % |
# --- Tabella 2: indice di Gini ---
kable(
tabella_step4,
booktabs = TRUE,
align = c("l", "c"),
caption = "Indice di eterogeneità di Gini (variabile 'median_price')"
)
Indice di eterogeneità di Gini (variabile
‘median_price’)
| median_price (classificata) |
0,96 |
# --- Grafico a barre della distribuzione ---
ggplot(freq_tbl, aes(x = Classe, y = Frequenza)) +
geom_col(fill = "steelblue") +
geom_text(aes(label = Percentuale), vjust = -0.3, size = 3) +
labs(
title = "Distribuzione per classi di 'median_price'",
subtitle = paste("Indice di Gini =", fmt_num(as.numeric(gini_val))),
x = "Classi di prezzo mediano ($)",
y = "Frequenza assoluta"
) +
theme_minimal(base_size = 10) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5)
)
Step 5 – Probabilità di eventi
# ===============================================================
# In questa sezione vengono calcolate le probabilità empiriche di alcuni eventi
# elementari del dataset *Texas Realty*. Le probabilità sono stimate come
# frequenze relative, cioè come rapporto tra il numero di casi favorevoli
# e il numero totale di osservazioni. I valori riportati rappresentano quindi
# stime sperimentali della probabilità che un evento si verifichi
# nel periodo osservato.
# ===============================================================
library(dplyr)
library(tibble)
library(knitr)
# === Calcolo delle probabilità empiriche ===
prob_tbl <- tibble(
Evento = c(
"City = Beaumont",
"Mese = Luglio",
"Mese = Dicembre 2012",
"Prezzo mediano > 200.000 $",
"Inventario < 5 mesi"
),
Probabilità = c(
mean(re$city == "Beaumont", na.rm = TRUE),
mean(as.numeric(re$month) == 7, na.rm = TRUE),
mean(as.numeric(re$month) == 12 & as.numeric(re$year) == 2012, na.rm = TRUE),
mean(re$median_price > 200000, na.rm = TRUE),
mean(re$months_inventory < 5, na.rm = TRUE)
)
) %>%
mutate(Probabilità = fmt_perc(Probabilità))
# === Tabella finale formattata ===
kable(
prob_tbl,
booktabs = TRUE,
align = c("l", "c"),
caption = "Probabilità empiriche di eventi elementari"
)
Probabilità empiriche di eventi elementari
| City = Beaumont |
25,00 % |
| Mese = Luglio |
8,33 % |
| Mese = Dicembre 2012 |
1,67 % |
| Prezzo mediano > 200.000 $ |
0,00 % |
| Inventario < 5 mesi |
4,17 % |
Step 6 – Nuove variabili derivate
# ===============================================================
# In questa sezione vengono introdotte tre nuove variabili derivate
# dal dataset originale, con l’obiettivo di sintetizzare informazioni
# economiche e operative sul mercato immobiliare texano:
# - avg_price_est : prezzo medio stimato per transazione
# - conv_rate : tasso di conversione (vendite / annunci)
# - eff_index : indice di efficienza (conversione / scorte)
# Un valore elevato di eff_index indica un mercato più dinamico
# e con un turnover più rapido.
# ===============================================================
library(dplyr)
library(knitr)
# === Creazione delle nuove variabili derivate ===
re <- re %>%
mutate(
avg_price_est = (volume * 1e6) / sales, # prezzo medio stimato per transazione
conv_rate = sales / listings, # tasso di conversione
eff_index = conv_rate / (months_inventory + 1e-6) # indice di efficienza (evita divisione per 0)
)
# === Calcolo delle medie globali delle nuove variabili ===
summary_long <- re %>%
summarise(
Prezzo_medio_stimato = mean(avg_price_est, na.rm = TRUE),
Tasso_conversione = mean(conv_rate, na.rm = TRUE),
Indice_efficienza = mean(eff_index, na.rm = TRUE)
) %>%
mutate(
Prezzo_medio_stimato = fmt_num(Prezzo_medio_stimato),
Tasso_conversione = fmt_perc(Tasso_conversione),
Indice_efficienza = fmt_perc(Indice_efficienza)
)
# === Tabella riassuntiva ===
kable(
summary_long,
booktabs = TRUE,
align = c("c", "c", "c"),
caption = "Medie delle nuove variabili derivate"
)
Medie delle nuove variabili derivate
| 154.320,37 |
11,87 % |
1,51 % |
Step 7 – Analisi condizionata (Anno × Mese × Città)
# ===============================================================
# In questa sezione vengono calcolate statistiche descrittive per ogni combinazione
# di Anno × Mese × Città. L'obiettivo è analizzare l'andamento del mercato immobiliare
# texano in chiave comparativa e temporale, concentrandosi sulle variabili chiave:
# - sales (volume di vendite)
# - median_price (valore mediano delle transazioni)
# - eff_index (indice sintetico di efficienza del mercato)
# Per ciascuna di esse viene fornita una sintesi tabellare e un grafico interpretativo.
# ===============================================================
library(dplyr)
library(ggplot2)
library(knitr)
library(stringr)
library(lubridate)
library(scales)
# === 1.Statistiche descrittive sintetiche per città ===
summary_city <- re %>%
group_by(city) %>%
summarise(
Vendite_medie = mean(sales, na.rm = TRUE),
Prezzo_medio = mean(median_price, na.rm = TRUE),
Efficienza_media = mean(eff_index, na.rm = TRUE)
) %>%
arrange(desc(Vendite_medie)) %>%
mutate(
Vendite_medie = fmt_num(Vendite_medie),
Prezzo_medio = fmt_num(Prezzo_medio),
Efficienza_media = fmt_perc(Efficienza_media)
)
# --- Tabella riassuntiva per città ---
kable(
summary_city,
booktabs = TRUE,
align = c("l", "c", "c", "c"),
caption = "Statistiche sintetiche per città (medie 2010–2014)"
)
Statistiche sintetiche per città (medie 2010–2014)
| Tyler |
269,75 |
141.441,67 |
0,88 % |
| Bryan-College Station |
205,97 |
157.488,33 |
2,39 % |
| Beaumont |
177,38 |
129.988,33 |
1,13 % |
| Wichita Falls |
116,07 |
101.743,33 |
1,66 % |
# === 2.Grafico comparativo: vendite medie per città ===
sales_city <- re %>%
group_by(city) %>%
summarise(Vendite_medie = mean(sales, na.rm = TRUE)) %>%
arrange(Vendite_medie)
ggplot(sales_city, aes(x = reorder(city, Vendite_medie), y = Vendite_medie)) +
geom_col(fill = "#1f78b4") +
coord_flip() +
labs(
title = "Confronto delle vendite medie per città",
subtitle = "Differenze territoriali nella dinamica delle transazioni",
x = "Città", y = "Vendite medie"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5)
)

# === 3.Grafico temporale: andamento dei prezzi mediani ===
price_trend <- re %>%
group_by(year, month, city) %>%
summarise(Prezzo_medio = mean(median_price, na.rm = TRUE), .groups = "drop") %>%
mutate(Data = make_date(year, month, 1)) %>%
arrange(Data)
ggplot(price_trend, aes(x = Data, y = Prezzo_medio, color = city)) +
geom_line(linewidth = 0.9) +
geom_point(size = 1.2, alpha = 0.7) +
labs(
title = "Andamento temporale del prezzo mediano per città",
subtitle = "Trend mensile del valore medio delle transazioni (2010–2014)",
x = "Anno-Mese", y = "Prezzo mediano ($)", color = "Città"
) +
theme_minimal(base_size = 10) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom"
)

# === 4.Grafico sintetico: efficienza media per città ===
eff_city <- re %>%
group_by(city) %>%
summarise(Efficienza_media = mean(eff_index, na.rm = TRUE)) %>%
arrange(desc(Efficienza_media))
ggplot(eff_city, aes(x = reorder(city, Efficienza_media), y = Efficienza_media)) +
geom_col(fill = "#33a02c") +
coord_flip() +
scale_y_continuous(labels = percent_format(scale = 1)) +
labs(
title = "Indice medio di efficienza per città",
subtitle = "Rapporto tra conversione e scorte medie (months_inventory)",
x = "Città", y = "Efficienza media (%)"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5)
)

# === 5.Commento automatico sintetico ===
# (estrae le città con valori estremi e genera un testo analitico coerente)
city_best_sales <- sales_city %>% slice_tail(n = 1) %>% pull(city)
city_low_sales <- sales_city %>% slice_head(n = 1) %>% pull(city)
city_best_eff <- eff_city %>% slice_head(n = 1) %>% pull(city)
city_low_eff <- eff_city %>% slice_tail(n = 1) %>% pull(city)
commento_step7 <- glue::glue("
Nel periodo analizzato (2010–2014), la città con il maggior volume medio di vendite è **{city_best_sales}**,
mentre quella con i valori più contenuti risulta **{city_low_sales}**.
L’analisi dell’indice di efficienza mostra che **{city_best_eff}** presenta un mercato più dinamico,
caratterizzato da un buon equilibrio tra domanda e offerta, mentre **{city_low_eff}**
evidenzia condizioni meno favorevoli, con tempi di assorbimento più lunghi.
Nel complesso, l’andamento dei prezzi mediani conferma una tendenza alla crescita moderata,
più stabile nelle città con volumi elevati di transazioni.
")
cat(commento_step7)
## Nel periodo analizzato (2010–2014), la città con il maggior volume medio di vendite è **Tyler**,
## mentre quella con i valori più contenuti risulta **Wichita Falls**.
## L’analisi dell’indice di efficienza mostra che **Bryan-College Station** presenta un mercato più dinamico,
## caratterizzato da un buon equilibrio tra domanda e offerta, mentre **Tyler**
## evidenzia condizioni meno favorevoli, con tempi di assorbimento più lunghi.
## Nel complesso, l’andamento dei prezzi mediani conferma una tendenza alla crescita moderata,
## più stabile nelle città con volumi elevati di transazioni.
Step 8 – Visualizzazioni sintetiche con ggplot2
# ===============================================================
# In questa sezione vengono generate visualizzazioni sintetiche tramite ggplot2
# per analizzare la stagionalità, la distribuzione e la dinamica
# del mercato immobiliare texano.
# ===============================================================
library(ggplot2)
library(dplyr)
library(scales)
# 1️⃣ BOX PLOT PREZZI MEDIANI
ggplot(re, aes(x = reorder(city, median_price, median), y = median_price, fill = city)) +
geom_boxplot(outlier.alpha = 0.3, show.legend = FALSE) +
coord_flip() +
labs(
title = "Distribuzione del Prezzo Mediano per Città",
subtitle = "Analisi della dispersione e dei valori medi",
x = "Città", y = "Prezzo mediano ($)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))

# 2️⃣ TOTALE VENDITE PER MESE (BARRE)
sales_monthly <- re %>%
group_by(year, month) %>%
summarise(sales_tot = sum(sales, na.rm = TRUE), .groups = "drop")
ggplot(sales_monthly, aes(x = factor(month, levels = 1:12), y = sales_tot, fill = factor(year))) +
geom_col(position = "dodge") +
scale_x_discrete(labels = month.abb) +
labs(
title = "Totale Vendite per Mese e Anno",
x = "Mese", y = "Totale vendite", fill = "Anno"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom")

# 3️⃣ DISTRIBUZIONE PERCENTUALE DELLE VENDITE
sales_monthly_pct <- sales_monthly %>%
group_by(month) %>%
mutate(pct = sales_tot / sum(sales_tot))
ggplot(sales_monthly_pct, aes(x = factor(month, levels = 1:12), y = pct, fill = factor(year))) +
geom_col(position = "fill") +
scale_x_discrete(labels = month.abb) +
scale_y_continuous(labels = percent_format(scale = 1)) +
labs(
title = "Distribuzione Percentuale delle Vendite per Mese e Anno",
x = "Mese", y = "Percentuale sul totale", fill = "Anno"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom")

# 4️⃣ DISTRIBUZIONE DEL VOLUME TOTALE PER CITTÀ
ggplot(re, aes(x = reorder(city, volume, median), y = volume, fill = factor(year))) +
geom_boxplot(outlier.alpha = 0.3) +
coord_flip() +
labs(
title = "Distribuzione del Volume Totale di Vendite per Città",
x = "Città", y = "Volume totale (milioni $)", fill = "Anno"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
legend.position = "bottom")

# 5️⃣ ANDAMENTO STORICO DELLE VENDITE
sales_trend <- re %>%
group_by(city, date) %>%
summarise(sales_tot = sum(sales, na.rm = TRUE), .groups = "drop")
ggplot(sales_trend, aes(x = date, y = sales_tot, color = city)) +
geom_line(linewidth = 1) +
geom_point(size = 1.2, alpha = 0.7) +
geom_smooth(se = FALSE, method = "loess", span = 0.25,
linewidth = 0.6, linetype = "dashed", color = "black") +
labs(
title = "Andamento Storico delle Vendite per Città",
subtitle = "Evoluzione mensile 2010–2014",
x = "Anno", y = "Totale vendite", color = "Città"
) +
theme_minimal(base_size = 10) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom")
Step 9 – Conclusioni
# ===============================================================
# In questa sezione vengono sintetizzati i principali risultati
# dell'analisi storica condotta sul mercato immobiliare texano (2010–2014).
# ===============================================================
library(dplyr)
library(knitr)
library(kableExtra)
library(glue)
# === Tabella riassuntiva finale ===
summary_cities <- re %>%
group_by(city) %>%
summarise(
Vendite_medie = mean(sales, na.rm = TRUE),
Prezzo_medio = mean(median_price, na.rm = TRUE),
Efficienza_media = mean(eff_index, na.rm = TRUE)
) %>%
arrange(desc(Vendite_medie)) %>%
mutate(
Vendite_medie = fmt_num(Vendite_medie),
Prezzo_medio = fmt_num(Prezzo_medio),
Efficienza_media = fmt_perc(Efficienza_media)
)
# === Tabella finale formattata ===
kable(
summary_cities,
booktabs = TRUE,
align = c("l", "c", "c", "c"),
caption = "Indicatori medi per città (periodo 2010–2014)"
) %>%
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center",
font_size = 11
)
Indicatori medi per città (periodo 2010–2014)
|
city
|
Vendite_medie
|
Prezzo_medio
|
Efficienza_media
|
|
Tyler
|
269,75
|
141.441,67
|
0,88 %
|
|
Bryan-College Station
|
205,97
|
157.488,33
|
2,39 %
|
|
Beaumont
|
177,38
|
129.988,33
|
1,13 %
|
|
Wichita Falls
|
116,07
|
101.743,33
|
1,66 %
|
# === Commento testuale dinamico conclusivo ===
city_top_sales <- re %>% group_by(city) %>% summarise(Vendite = mean(sales, na.rm = TRUE)) %>% slice_max(Vendite, n = 1) %>% pull(city)
city_top_eff <- re %>% group_by(city) %>% summarise(Eff = mean(eff_index, na.rm = TRUE)) %>% slice_max(Eff, n = 1) %>% pull(city)
city_low_eff <- re %>% group_by(city) %>% summarise(Eff = mean(eff_index, na.rm = TRUE)) %>% slice_min(Eff, n = 1) %>% pull(city)
gini_val <- gini.index(re$city)
commento_finale <- glue("
L’analisi storica del mercato immobiliare texano (2010–2014) evidenzia una crescita complessiva
del volume di vendite e un progressivo incremento dell’efficienza operativa del mercato.
Tra le città analizzate, **{city_top_sales}** risulta la più attiva in termini di transazioni,
mentre **{city_top_eff}** mostra il miglior equilibrio tra domanda e offerta, con il valore medio
più elevato dell’indice di efficienza. All’estremo opposto, **{city_low_eff}** presenta dinamiche
più lente e una minore capacità di assorbimento dell’invenduto.
Le variabili **sales** e **listings** mostrano la maggiore variabilità nel periodo,
mentre **median_price** si distingue per una maggiore stabilità.
L’indice di eterogeneità di Gini (≈ {fmt_num(gini_val)}) conferma un’elevata diversificazione
del mercato, coerente con la segmentazione geografica e socioeconomica delle aree analizzate.
Nel complesso, il mercato texano nel periodo osservato si presenta in espansione,
con differenze territoriali marcate ma tendenzialmente convergenti verso una maggiore efficienza.
")
cat(commento_finale)
## L’analisi storica del mercato immobiliare texano (2010–2014) evidenzia una crescita complessiva
## del volume di vendite e un progressivo incremento dell’efficienza operativa del mercato.
##
## Tra le città analizzate, **Tyler** risulta la più attiva in termini di transazioni,
## mentre **Bryan-College Station** mostra il miglior equilibrio tra domanda e offerta, con il valore medio
## più elevato dell’indice di efficienza. All’estremo opposto, **Tyler** presenta dinamiche
## più lente e una minore capacità di assorbimento dell’invenduto.
##
## Le variabili **sales** e **listings** mostrano la maggiore variabilità nel periodo,
## mentre **median_price** si distingue per una maggiore stabilità.
## L’indice di eterogeneità di Gini (≈ 1,00) conferma un’elevata diversificazione
## del mercato, coerente con la segmentazione geografica e socioeconomica delle aree analizzate.
##
## Nel complesso, il mercato texano nel periodo osservato si presenta in espansione,
## con differenze territoriali marcate ma tendenzialmente convergenti verso una maggiore efficienza.