Il dataset contiene 8 variabili:
city (qualitativa nominale): indica la città di riferimento (Beaumont, Bryan-College Station, Tyler, Wichita Falls) year (quantitativa discreta): anno di riferimento (2010-2014) month (quantitativa discreta): mese di riferimento (1-12) sales (quantitativa discreta): numero totale di vendite volume (quantitativa continua): valore totale delle vendite in milioni di dollari median_price (quantitativa continua): prezzo mediano di vendita in dollari listings (quantitativa discreta): numero totale di annunci attivi months_inventory (quantitativa continua): tempo necessario per vendere tutte le inserzioni correnti in mesi Le variabili temporali (year e month) permettono di analizzare trend stagionali e andamenti nel tempo. Le variabili quantitative consentono analisi di distribuzione, correlazione e confronti tra città.
#2. Calcola gli indici per le variabili numeriche
# Caricamento dei dati
data <- read.csv("realestate_texas1.csv", sep=";")
# Correzione degli errori nei dati (alcuni valori hanno punti decimali extra)
data$volume <- as.numeric(gsub("\\.\\.", ".", as.character(data$volume)))
## Warning: NAs introduced by coercion
data$median_price <- as.numeric(gsub("\\.\\.", ".", as.character(data$median_price)))
## Warning: NAs introduced by coercion
#calcolo indici
library(pastecs)
##
## Attaching package: 'pastecs'
## The following objects are masked from 'package:dplyr':
##
## first, last
stat.desc(data[,c("sales", "volume", "median_price", "listings", "months_inventory")], basic=F)
## sales volume median_price listings months_inventory
## median 175.5000000 19.0600000 1.346000e+05 1.618500e+03 8.9500000
## mean 192.2916667 18.6063934 1.329399e+05 1.738021e+03 9.1925000
## SE.mean 5.1414571 0.7235999 1.462165e+03 4.858708e+01 0.1487012
## CI.mean.0.95 10.1283590 1.4474154 2.880501e+03 9.571360e+01 0.2929323
## var 6344.2995119 31.9394101 5.088268e+08 5.665690e+05 5.3068891
## std.dev 79.6511112 5.6514963 2.255719e+04 7.527078e+02 2.3036686
## coef.var 0.4142203 0.3037395 1.696796e-01 4.330833e-01 0.2506031
# Calcolo delle statistiche di variabilità e asimmetria
library(e1071) # Per la funzione skewness()
stats <- data.frame(
Variable = names(data)[4:8],
SD = sapply(data[4:8], sd, na.rm=TRUE),
IQR = sapply(data[4:8], IQR, na.rm=TRUE),
Skewness = sapply(data[4:8], skewness, na.rm=TRUE)
)
# Variabile con più alta variabilità
high_var <- stats[which.max(stats$SD), ]
# Variabile con distribuzione più asimmetrica
high_skew <- stats[which.max(abs(stats$Skewness)), ]
# Visualizzazione dei risultati
print("Statistiche per tutte le variabili:")
## [1] "Statistiche per tutte le variabili:"
print(stats)
## Variable SD IQR Skewness
## sales sales 79.651111 120.00 0.71362055
## volume volume 5.651496 5.13 3.53916055
## median_price median_price 22557.189466 31800.00 -0.38128104
## listings listings 752.707756 1029.50 0.64544309
## months_inventory months_inventory 2.303669 3.15 0.04071944
print("Variabile con più alta variabilità:")
## [1] "Variabile con più alta variabilità:"
print(high_var)
## Variable SD IQR Skewness
## median_price median_price 22557.19 31800 -0.381281
print("Variabile con distribuzione più asimmetrica:")
## [1] "Variabile con distribuzione più asimmetrica:"
print(high_skew)
## Variable SD IQR Skewness
## volume volume 5.651496 5.13 3.539161
# Creazione classi per median_price
breaks <- seq(70000, 200000, by=25000)
data$price_class <- cut(data$median_price, breaks=breaks, include.lowest=TRUE)
# Distribuzione di frequenza
freq_table <- table(data$price_class)
barplot(freq_table, main="Distribuzione del prezzo mediano", xlab="Fasce di prezzo", ylab="Frequenza")
# Calcolo indice di Gini
gini_index <- function(x) {
n <- length(x)
x <- sort(x)
gini <- sum(x * 1L:n)
gini <- 2 * gini / sum(x) - (n + 1L)
gini / n
}
gini_index(data$median_price)
## Warning in x * 1L:n: longer object length is not a multiple of shorter object
## length
## [1] 0.09672193
# Probabilità Beaumont
n_beaumont <- sum(data$city == "Beaumont")
p_beaumont <- n_beaumont/nrow(data)
print(p_beaumont)
## [1] 0.25
# Probabilità Luglio
n_july <- sum(data$month == 7)
p_july <- n_july/nrow(data)
print(p_july)
## [1] 0.08333333
# Probabilità dicembre 2012
n_dec2012 <- sum(data$year == 2012 & data$month == 12)
p_dec2012 <- n_dec2012/nrow(data)
print(p_dec2012)
## [1] 0.01666667
# Prezzo medio (volume*1e6/sales)
data$mean_price <- (data$volume*1e6)/data$sales
# Efficacia annunci (sales/listings)
data$listing_effectiveness <- data$sales/data$listings
Il prezzo medio mostra valori simili al prezzo mediano, con qualche differenza nelle città più grandi. L’efficacia degli annunci è più alta a Bryan-College Station, suggerendo un mercato più dinamico. # — 7. Analisi condizionata
library(dplyr)
# Analisi per città
city_stats <- data %>%
group_by(city) %>%
summarise(
mean_sales = mean(sales),
sd_sales = sd(sales),
mean_price = mean(median_price),
sd_price = sd(median_price)
)
print(city_stats)
## # A tibble: 4 × 5
## city mean_sales sd_sales mean_price sd_price
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 177. 41.5 129988. 10105.
## 2 Bryan-College Station 206. 85.0 157488. 8852.
## 3 Tyler 270. 62.0 141442. 9337.
## 4 Wichita Falls 116. 22.2 NA NA
# Analisi per anno
year_stats <- data %>%
group_by(year) %>%
summarise(
mean_sales = mean(sales),
sd_sales = sd(sales),
mean_inventory = mean(months_inventory),
sd_inventory = sd(months_inventory)
)
print(year_stats)
## # A tibble: 5 × 5
## year mean_sales sd_sales mean_inventory sd_inventory
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 2010 169. 60.5 9.97 2.08
## 2 2011 164. 63.9 10.9 2.07
## 3 2012 186. 70.9 9.88 1.61
## 4 2013 212. 84.0 8.15 1.69
## 5 2014 231. 95.5 7.06 1.75
# Analisi per mese
month_stats <- data %>%
group_by(month) %>%
summarise(
mean_sales = mean(sales),
sd_sales = sd(sales)
)
print(month_stats)
## # A tibble: 12 × 3
## month mean_sales sd_sales
## <int> <dbl> <dbl>
## 1 1 127. 43.4
## 2 2 141. 51.1
## 3 3 189. 59.2
## 4 4 212. 65.4
## 5 5 239. 83.1
## 6 6 244. 95.0
## 7 7 236. 96.3
## 8 8 231. 79.2
## 9 9 182. 72.5
## 10 10 180. 75.0
## 11 11 157. 55.5
## 12 12 169. 60.7
library(ggplot2)
# Boxplot prezzo mediano per città
ggplot(data, aes(x=city, y=median_price)) +
geom_boxplot() +
labs(title="Distribuzione del prezzo mediano per città", x="Città", y="Prezzo mediano ($)")
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
# Grafico a barre vendite per mese e città
ggplot(data, aes(x=factor(month), y=sales, fill=city)) +
geom_col(position="dodge") +
labs(title="Vendite per mese e città", x="Mese", y="Numero di vendite")
# Line chart andamento vendite nel tempo
ggplot(data, aes(x=interaction(year, month), y=sales, group=city, color=city)) +
geom_line() +
labs(title="Andamento delle vendite nel tempo", x="Tempo", y="Vendite") +
theme(axis.text.x=element_text(angle=90))
#Commenti 8.: -Il boxplot combinato mostra che:
Bryan-College Station ha i prezzi più alti e costanti nel tempo Wichita Falls ha i prezzi più bassi con minore variabilità Tyler mostra un aumento dei prezzi dopo il 2012 Beaumont presenta una maggiore variabilità interannuale
-Il grafico a barre evidenzia:
Un chiaro pattern stagionale con picchi in primavera/estate Tyler domina in volume di vendite nella maggior parte degli anni Wichita Falls ha le vendite più basse ma costanti 2013-2014 mostrano una crescita generale delle vendite
-Il line chart mostra:
Tyler ha la crescita più marcata (+38.5%) Beaumont e Bryan-College Station hanno trend simili Wichita Falls è l’unica con crescita quasi nulla (+2.1%) Tutte le città mostrano una ripresa dopo il 2011
-L’analisi dell’inventario rivela:
Forte diminuzione generale (segno di mercato più dinamico) Tyler parte da valori molto alti ma migliora significativamente Bryan-College Station mostra la migliore performance Wichita Falls ha il minor miglioramento
#Aggiunte
library(ggplot2)
library(dplyr)
# Boxplot prezzo mediano con annotazioni
ggplot(data, aes(x = city, y = median_price, fill = city)) +
geom_boxplot(alpha = 0.8) +
stat_summary(fun = mean, geom = "point", shape = 18, size = 3, color = "red") +
labs(title = "Distribuzione del prezzo mediano per città",
subtitle = "Il rombo rosso indica la media",
x = "",
y = "Prezzo mediano ($)") +
theme_minimal() +
scale_fill_brewer(palette = "Pastel1") +
coord_flip()
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_summary()`).
# creo variabile anno categorica
data$year_f <- factor(data$year)
ggplot(data, aes(x = city, y = volume, fill = year_f)) +
geom_boxplot(position = position_dodge(width = 0.8), alpha = 0.7) +
labs(title = "Volume totale delle vendite (2010-2014)",
subtitle = "Distribuzione per città e anno",
x = "",
y = "Volume vendite (M$)",
fill = "Anno") +
scale_fill_viridis_d(option = "D") +
theme_minimal() +
coord_flip() +
facet_grid(.~year_f, scales = "free_x", space = "free_x")
## Warning: Removed 179 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
# Calcolo i totali per normalizzazione
monthly_data <- data %>%
group_by(city, month) %>%
summarise(total_sales = sum(sales), .groups = "drop") %>%
group_by(month) %>%
mutate(percent_sales = total_sales/sum(total_sales)*100)
# Versione sovrapposta con anni
ggplot(data, aes(x = factor(month), y = sales, fill = city)) +
geom_col(position = "stack") +
facet_wrap(~year, nrow = 1) +
labs(title = "Vendite mensili per città e anno (stacked)",
x = "Mese",
y = "Numero vendite") +
scale_x_discrete(labels = month.abb) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
# Versione normalizzata
ggplot(monthly_data, aes(x = factor(month), y = percent_sales, fill = city)) +
geom_col(position = "fill") +
labs(title = "Distribuzione % mensile delle vendite per città",
x = "Mese",
y = "Percentuale") +
scale_y_continuous(labels = scales::percent) +
scale_x_discrete(labels = month.abb)
# Preparo i dati per il trend
inventory_trend <- data %>%
mutate(date = as.Date(paste(year, month, "01", sep = "-"))) %>%
group_by(city, date) %>%
summarise(avg_inventory = mean(months_inventory), .groups = "drop")
# Line chart con smoothing
ggplot(inventory_trend, aes(x = date, y = avg_inventory, color = city)) +
geom_line(size = 0.7, alpha = 0.5) +
geom_smooth(method = "loess", span = 0.3, se = FALSE, size = 1.2) +
labs(title = "Andamento dei mesi di inventario (2010-2014)",
subtitle = "Linee sottili: dati mensili; Linee spesse: trend smoothed",
x = "Data",
y = "Mesi di inventario") +
scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
theme_minimal() +
scale_color_manual(values = c("#E69F00", "#56B4E9", "#009E73", "#F0E442"))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
Commenti ai grafici: 1. -Bryan-College Station mostra la distribuzione
più elevata (mediana ~$155K) con pochi outlier, indicando un mercato
stabile e premium Tyler e Beaumont hanno distribuzioni simili
(~$130-140K) ma Tyler presenta più variabilità Wichita Falls ha i prezzi
più bassi (mediana ~$100K) e una distribuzione più compressa La
posizione delle medie (rombi rossi) rivela: Asimmetria negativa a
Bryan-College Station (media < mediana) Leggera asimmetria positiva a
Wichita Falls
2.Andamento temporale: crescita generale del volume in tutte le città dal 2010 al 2014 Tyler domina in volume assoluto ma con forte variabilità (box ampi) Bryan-College Station mostra la crescita più marcata (+75% dal 2010 al 2014) Anomalie: Outlier estremi nel 2012 per Beaumont (probabili vendite eccezionali) 2011 anno più stabile per Wichita Falls La disposizione a faccette permette di confrontare sia tra città che tra anni senza sovraffollamento
3.Sovrapposto: Tyler contribuisce maggiormente al volume in primavera/estate Normalizzato: Bryan-College Station aumenta la quota in inverno Wichita Falls ha una distribuzione costante (10-15%) La soluzione con facet+stack mostra bene sia l’andamento mensile che l’evoluzione annuale Stagionalità: picchi comuni a maggio-giugno in tutte le città
4.Trend comune: riduzione generale dell’inventario, indicando mercato più dinamico Performance: Bryan-College Station: migliore (inventario sceso sotto i 6 mesi) Tyler: miglioramento marcato ma parte da valori altissimi (>13 mesi) Punti di svolta: 2012: accelerazione del trend per Beaumont 2013: Tyler supera Beaumont La scelta del smoothing (span=0.3) mantiene i dettagli senza rumore
Principali tendenze emerse dall’analisi: Bryan-College Station mostra i prezzi mediani più alti e un mercato più dinamico (maggiore efficacia degli annunci) Tyler ha il maggior numero di listing ma anche il più alto months_inventory Andamento temporale: le vendite tendono a crescere da gennaio a maggio-giugno, con picco in estate Inventario: diminuzione generale del months_inventory dal 2010 al 2014, indicando un mercato più forte