In questa fase iniziale vengono caricati i pacchetti necessari per l’analisi dei dati (dplyr per la manipolazione e trasformazione dei dati, ggplot2 per la visualizzazione grafica, moments per il calcolo di indici statistici descrittivi come asimmetria e curtosi, e knitr per la generazione di report dinamici e l’integrazione ordinata di codice e output nei documenti), e successivamente viene importato il dataset “realestate_texas.csv”.
Le funzioni head() e str() vengono utilizzate per effettuare una prima esplorazione dei dati: la prima permette di visualizzare le prime osservazioni del dataset, mentre la seconda consente di analizzarne la struttura, il tipo delle variabili e il numero di osservazioni disponibili.
Le variabili presenti nel dataset sono classificate come segue:
Le variabili quantitative continue sono tutte misurate su scala di rapporti, poiché possiedono uno zero assoluto e consentono confronti di proporzione.
Variabili quantitative
Per le variabili quantitative è possibile analizzarle tramite le principali misure di posizione e di dispersione.
In particolare, vengono calcolate:
Per approfondire l’analisi delle variabili, vengono calcolate alcune misure sintetiche che permettono di confrontare la variabilità e la forma della distribuzione.
In particolare:
descrittive <- function(x){
c(
Media = round(mean(x),2),
Mediana = round(median(x),2),
Min = round(min(x),2),
Max = round(max(x),2),
Dev_Std = round(sd(x),2),
Varianza = round(var(x),2),
CV = round(sd(x)/mean(x)*100,2),
Skewness = round(skewness(x),2),
Kurtosis = round(kurtosis(x),2)
)
}
variabili <- dati[, c("sales", "volume", "median_price",
"listings", "months_inventory")]
risultati <- sapply(variabili, descrittive)
knitr::kable(risultati)
| sales | volume | median_price | listings | months_inventory | |
|---|---|---|---|---|---|
| Media | 192.29 | 31.01 | 132665.42 | 1738.02 | 9.19 |
| Mediana | 175.50 | 27.06 | 134500.00 | 1618.50 | 8.95 |
| Min | 79.00 | 8.17 | 73800.00 | 743.00 | 3.40 |
| Max | 423.00 | 83.55 | 180000.00 | 3296.00 | 14.90 |
| Dev_Std | 79.65 | 16.65 | 22662.15 | 752.71 | 2.30 |
| Varianza | 6344.30 | 277.27 | 513572983.09 | 566568.97 | 5.31 |
| CV | 41.42 | 53.71 | 17.08 | 43.31 | 25.06 |
| Skewness | 0.72 | 0.88 | -0.36 | 0.65 | 0.04 |
| Kurtosis | 2.69 | 3.18 | 2.38 | 2.21 | 2.83 |
Commenti:
Sales: Il coefficiente di variazione delle vendite è pari a circa 41%, indicando una variabilità piuttosto elevata rispetto al valore medio. L’indice di asimmetria è positivo (0,72), segnalando una distribuzione asimmetrica a destra, con una maggiore concentrazione di osservazioni su valori di vendita più bassi. La curtosi risulta inferiore a 3, suggerendo una distribuzione leggermente più appiattita rispetto alla distribuzione normale.
Volume:
Il volume delle vendite mostra un’elevata variabilità relativa (CV ≈ 54%), indicando forti differenze tra le osservazioni. La media è maggiore della mediana e l’indice di asimmetria positivo segnala una distribuzione asimmetrica a destra. La curtosi leggermente superiore a 3 suggerisce una distribuzione moderatamente più appuntita rispetto alla normale.
Median price:
Il prezzo mediano degli immobili ha una variabilità relativamente
contenuta (CV ≈ 17%), con valori che vanno da circa 73.800 a 180.000
$.
L’asimmetria negativa indica una leggera concentrazione di osservazioni
verso valori più alti, mentre la curtosi inferiore a 3 suggerisce una
distribuzione leggermente più piatta rispetto alla normale.
Listings:
La variabile listings presenta una dispersione piuttosto elevata, come evidenziato dal coefficiente di variazione pari a circa 43%. La distribuzione risulta moderatamente asimmetrica a destra, indicando una maggiore concentrazione di valori medio-bassi e alcuni valori più elevati. La curtosi inferiore a 3 suggerisce una distribuzione leggermente più piatta rispetto alla normale.
Months inventory:
La variabile months_inventory mostra una variabilità contenuta, come indicato dal coefficiente di variazione pari a circa 25%. La distribuzione risulta pressoché simmetrica, con un valore di asimmetria molto vicino a zero, mentre la curtosi prossima a 3 suggerisce una forma simile a quella di una distribuzione normale. Questo indica una buona stabilità del numero di mesi di inventario nel periodo analizzato.
Le variabili mostrano livelli di variabilità diversi: sales e volume sono le più disperse e asimmetriche, mentre median_price e months_inventory risultano più stabili e con distribuzioni quasi simmetriche.
Variabili qualitative
Di seguito vengono analizzate le variabili qualitative del dataset, in particolare city e month, attraverso distribuzioni di frequenza assolute e relative, al fine di descriverne la composizione.
freq_city <- prop.table(table(dati$city))
knitr::kable(freq_city)
| Var1 | Freq |
|---|---|
| Beaumont | 0.25 |
| Bryan-College Station | 0.25 |
| Tyler | 0.25 |
| Wichita Falls | 0.25 |
freq_month <- prop.table(table(dati$month))
knitr::kable(freq_month)
| Var1 | Freq |
|---|---|
| 1 | 0.0833333 |
| 2 | 0.0833333 |
| 3 | 0.0833333 |
| 4 | 0.0833333 |
| 5 | 0.0833333 |
| 6 | 0.0833333 |
| 7 | 0.0833333 |
| 8 | 0.0833333 |
| 9 | 0.0833333 |
| 10 | 0.0833333 |
| 11 | 0.0833333 |
| 12 | 0.0833333 |
La distribuzione della variabile city risulta perfettamente uniforme: ciascuna città è rappresentata da 60 osservazioni, pari al 25% del totale. Anche la variabile month mostra una distribuzione uniforme, con 20 osservazioni per ogni mese (circa l’8,3%), indicando che i dati sono equamente distribuiti nel tempo e tra le città.
vars <- c("sales", "volume", "median_price", "listings", "months_inventory")
sapply(dati[vars], function(x) 100 * sd(x) / mean(x))
## sales volume median_price listings
## 41.42203 53.70536 17.08218 43.30833
## months_inventory
## 25.06031
sapply(dati[vars], moments::skewness)
## sales volume median_price listings
## 0.71810402 0.88474203 -0.36455288 0.64949823
## months_inventory
## 0.04097527
Per determinare qual’è la variabile con più variabilità ho scelto di utilizzare il coefficiente di variazione perchè confronta variabili con unità diverse: il coefficiente di variazione mostra che la variabile con maggiore variabilità relativa è volume, indicando che il valore totale delle vendite cambia in modo significativo tra città e periodi diversi.
Per determinare invece qual è la variabile con più asimmetria utilizzo la funzione skewness. Sapendo che più il valore si allontana da zero e più c’è asimmetria: il volume delle vendite risulta la variabile più asimmetrica, mentre i mesi di inventario mostrano una distribuzione quasi simmetrica.
sales <- dati$sales
n <- length(sales)
sales_cl <- cut(
sales,
breaks = seq(min(sales), max(sales)+50, 50,),
include.lowest = TRUE
)
table(sales_cl)
## sales_cl
## [79,129] (129,179] (179,229] (229,279] (279,329] (329,379] (379,429]
## 64 60 44 29 27 12 4
distr_freq <- as.data.frame(
cbind(
ni = table(sales_cl),
fi = table(sales_cl)/n,
Ni = cumsum(table(sales_cl)),
Fi = cumsum(table(sales_cl)/n)
)
)
knitr::kable(distr_freq)
| ni | fi | Ni | Fi | |
|---|---|---|---|---|
| [79,129] | 64 | 0.2666667 | 64 | 0.2666667 |
| (129,179] | 60 | 0.2500000 | 124 | 0.5166667 |
| (179,229] | 44 | 0.1833333 | 168 | 0.7000000 |
| (229,279] | 29 | 0.1208333 | 197 | 0.8208333 |
| (279,329] | 27 | 0.1125000 | 224 | 0.9333333 |
| (329,379] | 12 | 0.0500000 | 236 | 0.9833333 |
| (379,429] | 4 | 0.0166667 | 240 | 1.0000000 |
ggplot(data=dati)+
geom_bar(aes(x=sales_cl),
stat="count",
col="black",
fill="#69b3a2")+
labs(title="Distribuzione delle vendite immobiliari",
x="Classi di vendite",
y="Frequenze assolute")+
theme_classic()+
theme(panel.grid.major.y = element_line(color="grey90"),
panel.grid.minor.y = element_line(color="grey95"))
## Coefficiente di Gini
fi <- distr_freq$fi
gini <- 1 - sum(fi^2)
gini
## [1] 0.8027431
La variabile sales è stata suddivisa in classi di ampiezza pari a 50. Dalla distribuzione di frequenza emerge che la maggior parte delle osservazioni si concentra nelle classi con valori di vendita più bassi. In particolare, oltre il 50% delle osservazioni rientra nelle prime due classi, comprese tra 79 e 179 vendite.All’aumentare delle classi, le frequenze diminuiscono progressivamente, mentre le classi con valori di vendita più elevati presentano un numero ridotto di osservazioni. Questo andamento suggerisce una distribuzione asimmetrica a destra, caratterizzata dalla presenza di una coda verso i valori più alti.L’indice di eterogeneità di Gini risulta pari a circa 0,81, valore elevato che indica una marcata eterogeneità nella distribuzione delle vendite tra le classi. Ciò significa che le osservazioni non sono distribuite in modo uniforme, ma risultano concentrate principalmente in alcune classi.
n <- nrow(dati)
P_beaumont <- sum(dati$city == "Beaumont") / n
P_beaumont
## [1] 0.25
La probabilità che un’osservazione riporti la città di Beaumont è stata calcolata come frequenza relativa delle righe corrispondenti a questa città sul totale del dataset.
P_luglio <- sum(dati$month == 7) / n
P_luglio
## [1] 0.08333333
La probabilità che un’osservazione riporti il mese di luglio è stata calcolata come frequenza relativa del mese 7 sul totale delle osservazioni.
P_dic2012 <- sum(dati$month == 12 & dati$year == 2012) / n
P_dic2012
## [1] 0.01666667
La probabilità che un’osservazione corrisponda a dicembre 2012 è stata calcolata considerando la combinazione del mese 12 e dell’anno 2012, divisa per il totale delle osservazioni.
dati$avg_price <- dati$volume * 1e6 / dati$sales
knitr::kable(
head(dati[, c("sales","volume","avg_price")])
)
| sales | volume | avg_price |
|---|---|---|
| 83 | 14.162 | 170626.5 |
| 108 | 17.690 | 163796.3 |
| 182 | 28.701 | 157697.8 |
| 200 | 26.819 | 134095.0 |
| 202 | 28.833 | 142737.6 |
| 189 | 27.219 | 144015.9 |
dati$efficacy <- dati$sales / dati$listings
knitr::kable(
head(dati[, c("sales","listings","efficacy")]))
| sales | listings | efficacy |
|---|---|---|
| 83 | 1533 | 0.0541422 |
| 108 | 1586 | 0.0680958 |
| 182 | 1689 | 0.1077561 |
| 200 | 1708 | 0.1170960 |
| 202 | 1771 | 0.1140599 |
| 189 | 1803 | 0.1048253 |
min(dati$avg_price)
## [1] 97010.2
max(dati$avg_price)
## [1] 213233.9
min(dati$efficacy)
## [1] 0.05014025
max(dati$efficacy)
## [1] 0.3871278
La variabile avg_price mostra che il prezzo medio degli immobili varia tra circa 97.000 e 213.000 dollari.
Per quanto riguarda l’efficacia degli annunci (efficacy), i valori variano tra circa 5% e 39%, mostrando che nella maggior parte dei casi solo una piccola parte degli annunci porta a vendite effettive.
summary_city <- dati %>%
group_by(city) %>%
summarise(
sales_mean = round(mean(sales),2),
sales_sd = round(sd(sales),2),
volume_mean = round(mean(volume),2),
volume_sd = round(sd(volume),2)
)
knitr::kable(summary_city)
| city | sales_mean | sales_sd | volume_mean | volume_sd |
|---|---|---|---|---|
| Beaumont | 177.38 | 41.48 | 26.13 | 6.97 |
| Bryan-College Station | 205.97 | 84.98 | 38.19 | 17.25 |
| Tyler | 269.75 | 61.96 | 45.77 | 13.11 |
| Wichita Falls | 116.07 | 22.15 | 13.93 | 3.24 |
ggplot(dati, aes(x = city, y = sales, fill = city)) +
geom_boxplot() +
theme_minimal() +
labs(title = "Distribuzione delle vendite per città",
x = "Città",
y = "Vendite")
summary_year <- dati %>%
group_by(year) %>%
summarise(
sales_mean = round(mean(sales),2),
sales_sd = round(sd(sales),2),
volume_mean = round(mean(volume),2),
volume_sd = round(sd(volume),2)
)
knitr::kable(summary_year)
| year | sales_mean | sales_sd | volume_mean | volume_sd |
|---|---|---|---|---|
| 2010 | 168.67 | 60.54 | 25.68 | 10.80 |
| 2011 | 164.12 | 63.87 | 25.16 | 12.20 |
| 2012 | 186.15 | 70.91 | 29.27 | 14.52 |
| 2013 | 211.92 | 84.00 | 35.15 | 17.93 |
| 2014 | 230.60 | 95.51 | 39.77 | 21.19 |
ggplot(dati, aes(x = year, y = sales, group = city, color = city)) +
geom_line() +
geom_point() +
theme_minimal() +
labs(title = "Andamento medio delle vendite per anno",
x = "Anno",
y = "Vendite medie")
summary_month <- dati %>%
group_by(month) %>%
summarise(
sales_mean = round(mean(sales),2),
sales_sd = round(sd(sales),2)
)
knitr::kable(summary_month)
| month | sales_mean | sales_sd |
|---|---|---|
| 1 | 127.40 | 43.38 |
| 2 | 140.85 | 51.07 |
| 3 | 189.45 | 59.18 |
| 4 | 211.70 | 65.40 |
| 5 | 238.85 | 83.12 |
| 6 | 243.55 | 95.00 |
| 7 | 235.75 | 96.27 |
| 8 | 231.45 | 79.23 |
| 9 | 182.35 | 72.52 |
| 10 | 179.90 | 74.95 |
| 11 | 156.85 | 55.47 |
| 12 | 169.40 | 60.75 |
ggplot(dati, aes(x = factor(month), y = sales)) +
stat_summary(fun = mean, geom = "bar", fill = "steelblue") +
theme_minimal() +
labs(title = "Vendite medie per mese",
x = "Mese",
y = "Vendite medie")
Commenti generali
Avg_price_mean varia da circa 119.000 $ a 183.000 $, con Wichita Falls la città con prezzo medio più basso e Bryan-College Station la più alta. Efficacy_mean varia tra circa 9% e 15%, con Bryan-College Station che ha annunci più efficaci e Tyler quelli meno efficaci.
Il prezzo medio cresce leggermente dal 2010 (150.000 $) al 2014 (163.000 $), mostrando un trend positivo. Anche l’efficacia degli annunci aumenta negli anni, da circa 10% nel 2010 a 16% nel 2014, suggerendo un miglioramento complessivo della performance degli annunci nel tempo.
Il prezzo medio varia tra 145.000 $ e 161.000 $, con valori più alti nei mesi estivi (maggio-luglio).
L’efficacia degli annunci è più alta nei mesi estivi (giugno-luglio, circa 14%), mentre nei primi mesi dell’anno è più bassa (gennaio-febbraio, circa 8-9%).
Boxplot
ggplot(dati, aes(x=factor(year), y=avg_price, fill=city)) +
geom_boxplot() +
theme_minimal() +
labs(title="Distribuzione del prezzo medio per anno e città",
x="Anno", y="Prezzo medio ($)")
Il boxplot mostra differenze nette tra le quattro città in termini di prezzo medio. Bryan–College Station presenta sistematicamente i valori più elevati in tutti gli anni, con mediane che crescono progressivamente e superano i 200.000$ nel 2014. Tyler si colloca su un livello intermedio, con una crescita evidente nel tempo e una distribuzione più ampia rispetto a Beaumont, segnalando maggiore variabilità. Beaumont mostra prezzi medi più contenuti e una dispersione moderata, con un lieve incremento nel periodo 2010–2014. Wichita Falls è la città con i livelli di prezzo più bassi, con mediane intorno ai 115.000–125.000$, e presenta una variabilità relativamente contenuta. In generale, si osserva un trend crescente dei prezzi in tutte le città, particolarmente marcato per Bryan–College Station e Tyler, suggerendo una dinamica espansiva del mercato immobiliare nel periodo analizzato.
Grafico a barre
ggplot(dati, aes(x=factor(month), y=sales, fill=city)) +
geom_col(position="dodge") +
facet_wrap(~year) +
theme_minimal() +
labs(title="Vendite mensili per città suddivise per anno",
x="Mese", y="Vendite")
I grafici annuali mostrano una chiara stagionalità delle vendite: in ogni anno i mesi centrali (circa maggio–agosto) registrano i livelli più elevati, mentre i primi e gli ultimi mesi dell’anno mostrano valori inferiori. Nel passaggio dal 2010 al 2014 si nota un incremento generale delle vendite in quasi tutte le città. Tyler e Bryan–College Station evidenziano i picchi più alti, con valori che superano le 350–400 unità nei mesi centrali degli anni 2013 e 2014. Beaumont mostra una crescita più moderata ma comunque evidente nel tempo. Wichita Falls mantiene livelli più bassi e una dinamica meno accentuata, confermando una minore dimensione del mercato locale. La struttura ricorrente delle barre nei diversi anni rafforza l’ipotesi di una componente stagionale stabile.
Line charts
dati <- dati %>%
mutate(
date = as.Date(sprintf("%d-%02d-01", year, month))
)
ggplot(dati, aes(x = date, y = sales, color = city)) +
geom_line() +
theme_minimal() +
labs(
title = "Andamento temporale delle vendite",
x = "Tempo",
y = "Vendite"
)
Il grafico temporale conferma visivamente sia il trend crescente di medio periodo sia la stagionalità ricorrente. Le curve di Tyler e Bryan–College Station mostrano una crescita progressiva dal 2010 al 2014, con picchi sempre più elevati nel tempo. In particolare, nel 2014 Tyler supera le 400 vendite nei mesi di massima attività, rappresentando il livello più alto dell’intero periodo osservato. Beaumont segue un andamento simile ma su livelli inferiori, mentre Wichita Falls rimane costantemente sotto le altre città, con oscillazioni più contenute. L’alternanza regolare di picchi e flessioni all’interno di ciascun anno evidenzia chiaramente una componente ciclica annuale, coerente con quanto osservato nei grafici mensili.
Commento generale L’analisi grafica evidenzia quindi tre elementi principali: differenze strutturali tra città, crescita dei prezzi e delle vendite nel periodo 2010–2014 e una marcata stagionalità del fenomeno. Tali risultati sono coerenti con le statistiche descrittive calcolate nelle sezioni precedenti.