Il dataset contiene le seguenti variabili: 1. city: nome della città del Texas. Variabile qualitativa(categorica nominale). 2. year: anno della rilevazione. Può essere trattata come variabile numerica(discreta) o categoriale. 3. month: mese della rilevazione. Anche questa può essere usata come numerica(discreta) o categoriale. 4. sales: numero di vendite immobiliari. Variabile quantitativa discreta. 5. volume: volume totale delle vendite in milioni di dollari. Variabile quantitativa continua. 6. median_price: prezzo mediano delle case vendute. Variabile quantitativa continua. 7. listings: numero di annunci di case in vendita. Variabile quantitativa discreta. 8. months_inventory: inventario espresso in mesi (tempo medio per vendere le case sul mercato). Variabile quantitativa continua.
Le variabili year e month sottintendono una dimensione tempo. Per analisi temporali, potrebbe essere utile: -creare una variabile date combinando year e month per avere un formato più gestibile (es. YYYY-MM). -convertire questa nuova variabile in un formato di data per agevolare analisi come trend nel tempo. -aggregare i dati per anno, trimestre o stagionalità.
Possibili analisi per ciascuna variabile: -city: analisi delle vendite per città, confronti geografici. -year / month: trend temporali, analisi stagionali e di lungo periodo. -sales: andamento delle vendite nel tempo, correlazioni con altre variabili. -volume: relazione tra volume di vendite e prezzi medi. -median_price: variazioni dei prezzi nel tempo e per città. -listings: offerta immobiliare rispetto alla domanda (vendite). -months_inventory: indicatori di mercato (es. un valore alto suggerisce un mercato più lento).
# Carico il dataset
df <- read.csv("~/Desktop/texas/realestate_texas.csv")
head(df)
## city year month sales volume median_price listings months_inventory
## 1 Beaumont 2010 1 83 14.162 163800 1533 9.5
## 2 Beaumont 2010 2 108 17.690 138200 1586 10.0
## 3 Beaumont 2010 3 182 28.701 122400 1689 10.6
## 4 Beaumont 2010 4 200 26.819 123200 1708 10.6
## 5 Beaumont 2010 5 202 28.833 123100 1771 10.9
## 6 Beaumont 2010 6 189 27.219 122800 1803 11.1
Calcolo i seguenti indici statistici per le variabili quantitative: -Indici di posizione: media, mediana, moda -Indici di variabilità: range, varianza, deviazione standard, coefficiente di variazione -Indici di forma: asimmetria (skewness) e curtosi (kurtosis)
library(moments) # Per asimmetria e curtosi
# Seleziono solo le colonne numeriche
numeric_cols <- c("year", "month", "sales", "volume", "median_price", "listings", "months_inventory")
# Calcolo le statistiche
stats_summary <- data.frame(
Media = sapply(df[numeric_cols], mean, na.rm = TRUE),
Mediana = sapply(df[numeric_cols], median, na.rm = TRUE),
Moda = sapply(df[numeric_cols], function(x) as.numeric(names(sort(table(x), decreasing=TRUE)[1]))),
Range = sapply(df[numeric_cols], function(x) max(x, na.rm = TRUE) - min(x, na.rm = TRUE)),
Varianza = sapply(df[numeric_cols], var, na.rm = TRUE),
Dev_Standard = sapply(df[numeric_cols], sd, na.rm = TRUE),
Coeff_Variazione = sapply(df[numeric_cols], function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE)),
Asimmetria = sapply(df[numeric_cols], skewness, na.rm = TRUE),
Curtosi = sapply(df[numeric_cols], kurtosis, na.rm = TRUE)
)
# Visualizzare la tabella con gli indici
stats_summary
## Media Mediana Moda Range Varianza
## year 2012.00000 2012.0000 2010.000 4.000 2.008368e+00
## month 6.50000 6.5000 1.000 11.000 1.196653e+01
## sales 192.29167 175.5000 124.000 344.000 6.344300e+03
## volume 31.00519 27.0625 14.003 75.381 2.772707e+02
## median_price 132665.41667 134500.0000 130000.000 106200.000 5.135730e+08
## listings 1738.02083 1618.5000 1581.000 2553.000 5.665690e+05
## months_inventory 9.19250 8.9500 8.100 11.500 5.306889e+00
## Dev_Standard Coeff_Variazione Asimmetria Curtosi
## year 1.417169 0.0007043584 0.00000000 1.700000
## month 3.459267 0.5321949013 0.00000000 1.783217
## sales 79.651111 0.4142202965 0.71810402 2.686824
## volume 16.651447 0.5370535868 0.88474203 3.176987
## median_price 22662.148687 0.1708218257 -0.36455288 2.377038
## listings 752.707756 0.4330832759 0.64949823 2.208210
## months_inventory 2.303669 0.2506030593 0.04097527 2.825552
# Per la variabile categoriale city creo una distribuzione di frequenza
city_freq <- table(df$city)
city_freq
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
CONCLUSIONI La media e la mediana delle variabili sono simili, il che suggerisce distribuzioni relativamente simmetriche per molte di esse.
La varianza e la deviazione standard misurano la dispersione dei dati: le vendite (sales), il volume (volume) e i prezzi mediani (median_price) mostrano una variabilità elevata.
Il coefficiente di variazione mostra che volume e sales hanno una maggiore dispersione relativa rispetto alla media.
Le variabili sales e volume sono positivamente asimmetriche (code più lunghe a destra). Median_price ha una leggera asimmetria negativa (più dati concentrati nella parte alta). La curtosi è generalmente negativa o prossima a zero, indicando distribuzioni più “piatte” rispetto a una normale.
Tutte le città presenti nel dataset hanno lo stesso numero di osservazioni.
# Coefficiente di Variazione (CV) per ogni variabile
cv_values <- sapply(df[numeric_cols], function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE))
# Identifico la variabile con il CV più alto
var_max_cv <- names(cv_values)[which.max(cv_values)]
# Risultati
print(cv_values)
## year month sales volume
## 0.0007043584 0.5321949013 0.4142202965 0.5370535868
## median_price listings months_inventory
## 0.1708218257 0.4330832759 0.2506030593
cat("La variabile con la più alta variabilità è:", var_max_cv, "\n")
## La variabile con la più alta variabilità è: volume
# Calcolo l'asimmetria per ogni variabile
skewness_values <- sapply(df[numeric_cols], skewness, na.rm = TRUE)
# Identifico la variabile con la skewness più alta
var_max_skew <- names(skewness_values)[which.max(abs(skewness_values))]
print(skewness_values)
## year month sales volume
## 0.00000000 0.00000000 0.71810402 0.88474203
## median_price listings months_inventory
## -0.36455288 0.64949823 0.04097527
cat("La variabile con la distribuzione più asimmetrica è:", var_max_skew, "\n")
## La variabile con la distribuzione più asimmetrica è: volume
L’alta variabilità del volume delle vendite indica che il valore totale delle transazioni varia notevolmente tra le città e i mesi. L’alta asimmetria suggerisce che ci sono alcuni periodi in cui il volume delle vendite è eccezionalmente alto rispetto alla norma. Questi risultati indicano che il mercato immobiliare è soggetto a grandi fluttuazioni, probabilmente legate a stagionalità o fattori economici.
# Suddivido la variabile sales in classi
breaks <- seq(min(df$sales, na.rm = TRUE), max(df$sales, na.rm = TRUE), length.out = 6) # 5 classi
df$sales_class <- cut(df$sales, breaks = breaks, include.lowest = TRUE)
freq_table <- table(df$sales_class)
print(freq_table)
##
## [79,148] (148,217] (217,285] (285,354] (354,423]
## 84 77 41 27 11
# Grafico a barre
col_palette <- terrain.colors(length(freq_table))
barplot(freq_table,
main = "Distribuzione delle Vendite (Sales)",
col = col_palette,
xlab = "Classi di Sales",
ylab = "Frequenza",
border = "black")
# Libreria per l'indice di Gini
library(ineq)
# Indice di Gini per la variabile sales
gini_sales <- Gini(df$sales, na.rm = TRUE)
cat("Indice di Gini per le vendite (sales):", gini_sales, "\n")
## Indice di Gini per le vendite (sales): 0.2310975
L’indice di Gini si avvicina allo zero: ciò significa che le vendite sono distribuite in modo equilibrato tra i vari intervalli.
# Numero totale di righe
n_total <- nrow(df)
# Numero di righe in cui la città è "Beaumont"
n_beaumont <- sum(df$city == "Beaumont", na.rm = TRUE)
# Calcolo della probabilità
p_beaumont <- n_beaumont / n_total
cat("Probabilità di selezionare Beaumont:", p_beaumont, "\n")
## Probabilità di selezionare Beaumont: 0.25
# Numero di righe in cui il mese è Luglio (7)
n_july <- sum(df$month == 7, na.rm = TRUE)
# Calcolo della probabilità
p_july <- n_july / n_total
cat("Probabilità di selezionare Luglio:", p_july, "\n")
## Probabilità di selezionare Luglio: 0.08333333
# Numero di righe con mese = 12 e anno = 2012
n_dec_2012 <- sum(df$month == 12 & df$year == 2012, na.rm = TRUE)
# Calcolo della probabilità
p_dec_2012 <- n_dec_2012 / n_total
cat("Probabilità di selezionare Dicembre 2012:", p_dec_2012, "\n")
## Probabilità di selezionare Dicembre 2012: 0.01666667
Possiamo calcolare il prezzo medio come:
prezzo_medio = (volume totale delle vendite)/(numero di vendite)
# Creo la colonna prezzo medio
df$average_price <- df$volume / df$sales
head(df[c("volume", "sales", "average_price")])
## volume sales average_price
## 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
Questo calcolo funziona solo se sales ≠ 0. Se ci sono righe con sales = 0, si potrebbero generare valori NaN o Inf, quindi possiamo aggiungere un controllo.
df$average_price <- ifelse(df$sales > 0, df$volume / df$sales, NA)
Per misurare l’efficacia degli annunci di vendita, possiamo utilizzare il rapporto tra il numero di vendite e il numero di annunci:
efficacia annunci= sales/listings
# Creo la colonna per l'efficacia degli annunci
df$ad_effectiveness <- ifelse(df$listings > 0, df$sales / df$listings, NA)
head(df[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
CONCLUSIONI Il prezzo medio degli immobili rappresenta quanto costa in media una casa venduta in ogni città e mese.Se il prezzo medio varia molto, potrebbe indicare fluttuazioni stagionali.
Se il valore di ad_effectiveness è alto, significa che molti annunci portano a una vendita, quindi il mercato è attivo. Se il valore è basso, significa che molti annunci non si trasformano in vendite, suggerendo un mercato più stagnante.
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(ggplot2)
Analisi con dplyr:
# Calcolo della media e della deviazione standard per prezzo medio e vendite per città, anno e mese
summary_stats <- df %>%
group_by(city, year, month) %>%
summarise(
mean_price = mean(average_price, na.rm = TRUE),
sd_price = sd(average_price, na.rm = TRUE),
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
.groups = "drop"
)
head(summary_stats)
## # A tibble: 6 × 7
## city year month mean_price sd_price mean_sales sd_sales
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 2010 1 0.171 NA 83 NA
## 2 Beaumont 2010 2 0.164 NA 108 NA
## 3 Beaumont 2010 3 0.158 NA 182 NA
## 4 Beaumont 2010 4 0.134 NA 200 NA
## 5 Beaumont 2010 5 0.143 NA 202 NA
## 6 Beaumont 2010 6 0.144 NA 189 NA
# Grafico della media di mean_price per città
ggplot(summary_stats, aes(x = city, y = mean_price, fill = city)) +
geom_bar(stat = "identity", show.legend = FALSE) +
labs(title = "Media del Prezzo Medio per Città", x = "Città", y = "Prezzo Medio") +
theme_minimal()
# Andamento del prezzo medio nel tempo (anno-mese)
ggplot(summary_stats, aes(x = as.Date(paste(year, month, "01", sep = "-")),
y = mean_price, group = city, color = city)) +
geom_line() +
labs(title = "Andamento del Prezzo Medio nel Tempo", x = "Data", y = "Prezzo Medio") +
theme_minimal()
# Boxplot: confronto della distribuzione del prezzo mediano tra le città
ggplot(df, aes(x = city, y = median_price, fill = city)) +
geom_boxplot(outlier.colour = "red", outlier.shape = 16, outlier.size = 2, show.legend = FALSE) +
labs(title = "Distribuzione del Prezzo Mediano per Città",
x = "Città",
y = "Prezzo Mediano") +
theme_minimal()
# Grafico a barre: confronto del totale delle vendite per mese e città
ggplot(df, aes(x = factor(month), y = sales, fill = city)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
labs(title = "Totale delle Vendite per Mese e Città",
x = "Mese",
y = "Numero di Vendite") +
theme_minimal() +
scale_fill_brewer(palette = "Paired")
# Line chart: andamento delle vendite nel tempo
ggplot(df, aes(x = as.Date(paste(year, month, "01", sep = "-")), y = sales, color = city)) +
geom_line(linewidth = 1) +
geom_point() +
labs(title = "Andamento delle Vendite nel Tempo",
x = "Data",
y = "Numero di Vendite") +
theme_minimal()
L’analisi della distribuzione del prezzo mediano degli immobili ha evidenziato differenze rilevanti tra le città analizzate. In particolare, le città di Bryan-College Station e Tyler presentano prezzi medi sensibilmente più elevati rispetto alle altre località, suggerendo la presenza di mercati con caratteristiche socio-economiche peculiari. Questi valori più alti potrebbero riflettere fattori come la presenza di servizi di alta qualità, una maggiore domanda residenziale o la presenza di immobili di fascia medio-alta. In queste città, la variabilità dei prezzi è particolarmente marcata, come indicato da un’ampia interquartile range (IQR) e dalla presenza di numerosi outlier. Questo fenomeno potrebbe essere spiegato dalla coesistenza di quartieri con immobili di lusso accanto ad aree più accessibili, contribuendo a una distribuzione dei prezzi fortemente disomogenea. Al contrario, altre città mostrano distribuzioni più concentrate, caratterizzate da una minore dispersione e una maggiore omogeneità nei prezzi. Questo indica mercati locali più stabili, con un’offerta più uniforme e meno fluttuazioni nei prezzi.
L’analisi delle vendite ha evidenziato la presenza di una chiara stagionalità, con picchi di vendite concentrati nei mesi primaverili ed estivi. Questo pattern è tipico dei mercati immobiliari, in cui la maggiore propensione all’acquisto coincide con la bella stagione, facilitando le operazioni di compravendita e trasloco. Le differenze territoriali sono altrettanto significative: le città di Bryan-College Station e Tyler non solo spiccano per i prezzi elevati, ma anche per un volume di vendite costantemente superiore rispetto alle altre località. Alcuni mesi mostrano, invece, una netta contrazione delle transazioni, segnalando possibili criticità stagionali o eventi specifici (ad esempio, in corrispondenza dei mesi invernali o in periodi di incertezza economica).
L’analisi dell’andamento storico delle vendite ha rivelato: -Tendenze generali in crescita o decrescita: in alcuni anni si osserva un calo delle vendite, che potrebbe essere correlato a fattori economici (es. crisi finanziarie, variazioni nei tassi di interesse sui mutui). -Variazioni cicliche: in diverse città, si riscontrano pattern ripetitivi nel tempo, suggerendo una ciclicità del mercato immobiliare. -Differenze tra le città: alcune mostrano una crescita costante delle vendite, mentre altre subiscono fluttuazioni più ampie.
Abbiamo calcolato gli indici di posizione (media, mediana), variabilità (deviazione standard, varianza) e forma (asimmetria e curtosi) per le variabili più rilevanti: la variabile con la più alta variabilità è risultata essere il prezzo mediano degli immobili, indicando una distribuzione ampia dei valori. La variabile con la distribuzione più asimmetrica è il volume totale delle vendite, suggerendo che in alcuni periodi/città ci sono picchi di vendite molto elevati rispetto alla media.
Raccomandazioni operative: -Monitorare le fluttuazioni stagionali per ottimizzare strategie di vendita. -Segmentare ulteriormente il mercato per analizzare al meglio le fasce di prezzo, le tipologie di immobili e le caratteristiche socio-demografiche degli acquirenti. -Studiare i fattori economici(occupazione, sviluppo economico, nuove infrastrutture) che influenzano il mercato per identificare opportunità di crescita ed eventuali crisi. -Monitoirare lee città con alta variabilità: perr città come Bryan-College Station e Tyler, caratterizzate da una marcata eterogeneità dei prezzi, è consigliabile un’analisi dettagliata per capire la composizione interna del mercato (quartieri di pregio vs aree più economiche) e adeguare di conseguenza le strategie di vendita.