— 1. Analisi delle variabili

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

— 4. Frequenze e Gini per Sales Classificate

# 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

— 5. Calcolo della probabilità

# 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

— 6. Creazione di nuove variabili

# 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

  1. Conclusioni

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