setwd("C:/Users/Moreno/Desktop/RStudio documents")
# Librerie
library(ggplot2)
## Warning: il pacchetto 'ggplot2' è stato creato con R versione 4.4.3
library(dplyr)
## Warning: il pacchetto 'dplyr' è stato creato con R versione 4.4.3
##
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
##
## filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
##
## intersect, setdiff, setequal, union
library(moments) # per skewness
library(ineq) # per indice di Gini
# Import dataset
dati <- read.csv("realestate_texas.csv", sep = ",")
# ======================================================
# 1. Analisi delle variabili
# ======================================================
# city, year, month → categoriche/temporali
# sales, volume, median_price, listings, months_inventory → quantitative
str(dati)
## 'data.frame': 240 obs. of 8 variables:
## $ city : chr "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
## $ year : int 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
## $ month : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sales : int 83 108 182 200 202 189 164 174 124 150 ...
## $ volume : num 14.2 17.7 28.7 26.8 28.8 ...
## $ median_price : num 163800 138200 122400 123200 123100 ...
## $ listings : int 1533 1586 1689 1708 1771 1803 1857 1830 1829 1779 ...
## $ months_inventory: num 9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
# Considerazioni: sulle quantitative calcoliamo indici di posizione e variabilità,
# sulle categoriche distribuzioni di frequenza e grafici a barre.
table(dati$city)
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
table(dati$year)
##
## 2010 2011 2012 2013 2014
## 48 48 48 48 48
table(dati$month)
##
## 1 2 3 4 5 6 7 8 9 10 11 12
## 20 20 20 20 20 20 20 20 20 20 20 20
# ======================================================
# 2. Indici di posizione, variabilità e forma
# ======================================================
summary(dati)
## city year month sales
## Length:240 Min. :2010 Min. : 1.00 Min. : 79.0
## Class :character 1st Qu.:2011 1st Qu.: 3.75 1st Qu.:127.0
## Mode :character Median :2012 Median : 6.50 Median :175.5
## Mean :2012 Mean : 6.50 Mean :192.3
## 3rd Qu.:2013 3rd Qu.: 9.25 3rd Qu.:247.0
## Max. :2014 Max. :12.00 Max. :423.0
## volume median_price listings months_inventory
## Min. : 8.166 Min. : 73800 Min. : 743 Min. : 3.400
## 1st Qu.:17.660 1st Qu.:117300 1st Qu.:1026 1st Qu.: 7.800
## Median :27.062 Median :134500 Median :1618 Median : 8.950
## Mean :31.005 Mean :132665 Mean :1738 Mean : 9.193
## 3rd Qu.:40.893 3rd Qu.:150050 3rd Qu.:2056 3rd Qu.:10.950
## Max. :83.547 Max. :180000 Max. :3296 Max. :14.900
# IQR per variabili quantitative
IQR(dati$sales)
## [1] 120
IQR(dati$median_price)
## [1] 32750
IQR(dati$months_inventory)
## [1] 3.15
# Skewness (asimmetria)
skewness(dati$sales)
## [1] 0.718104
skewness(dati$median_price)
## [1] -0.3645529
skewness(dati$months_inventory)
## [1] 0.04097527
# Commento: se skewness > 0 → distribuzione asimmetrica a destra,
# se < 0 → asimmetrica a sinistra, se ≈ 0 → simmetrica.
# ======================================================
# 3. Variabili con maggiore variabilità e asimmetria
# ======================================================
cv <- function(x){ sd(x) / mean(x) * 100 } # coefficiente di variazione
cv(dati$sales)
## [1] 41.42203
cv(dati$volume)
## [1] 53.70536
cv(dati$median_price)
## [1] 17.08218
cv(dati$listings)
## [1] 43.30833
cv(dati$months_inventory)
## [1] 25.06031
# La variabile con CV più alto = più variabile
# La variabile con skewness più lontana da 0 = più asimmetrica
# ======================================================
# 4. Classi per variabile quantitativa
# ======================================================
# Creiamo classi sulle vendite
dati$sales_cl <- cut(dati$sales, breaks = seq(50, 450, 50))
table(dati$sales_cl)
##
## (50,100] (100,150] (150,200] (200,250] (250,300] (300,350] (350,400] (400,450]
## 21 72 56 32 34 13 9 3
# Grafico distribuzione
ggplot(dati, aes(x = sales_cl)) +
geom_bar(fill = "steelblue") +
labs(title = "Distribuzione delle vendite per classi", x = "Classi di vendite", y = "Frequenza") +
theme_bw()

# Indice di Gini
ineq::Gini(dati$sales)
## [1] 0.2310975
# ======================================================
# 5. Calcolo della probabilità
# ======================================================
# Probabilità calcolate sul dataset
p_beaumont <- mean(dati$city == "Beaumont")
p_july <- mean(dati$month == "July")
p_dec2012 <- mean(dati$month == "December" & dati$year == 2012)
p_beaumont; p_july; p_dec2012
## [1] 0.25
## [1] 0
## [1] 0
# ======================================================
# 6. Creazione di nuove variabili
# ======================================================
# Prezzo medio di vendita
dati$mean_price <- (dati$volume * 1e6) / dati$sales
# Efficienza annunci (corretto in inglese: efficiency)
dati$efficiency <- dati$listings / dati$months_inventory
summary(dati$mean_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 97010 132939 156588 154320 173915 213234
summary(dati$efficiency)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 106.8 140.1 176.0 187.3 236.0 329.3
# ======================================================
# 7. Analisi condizionata
# ======================================================
# Statistiche per città e anno
dati %>%
group_by(city, year) %>%
summarize(
mean_sales = mean(sales),
sd_sales = sd(sales),
mean_price = mean(median_price),
sd_price = sd(median_price)
)
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
## # A tibble: 20 × 6
## # Groups: city [4]
## city year mean_sales sd_sales mean_price sd_price
## <chr> <int> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 2010 156. 36.9 133117. 13354.
## 2 Beaumont 2011 144 22.7 125642. 9603.
## 3 Beaumont 2012 172. 28.4 126533. 7973.
## 4 Beaumont 2013 201. 37.7 132400 7785.
## 5 Beaumont 2014 214. 36.5 132250 9835.
## 6 Bryan-College Station 2010 168. 70.8 153533. 5474.
## 7 Bryan-College Station 2011 167. 62.2 151417. 3709.
## 8 Bryan-College Station 2012 197. 74.3 153567. 7096.
## 9 Bryan-College Station 2013 238. 95.8 159392. 5429.
## 10 Bryan-College Station 2014 260. 86.7 169533. 7776.
## 11 Tyler 2010 228. 49.0 135175 4782.
## 12 Tyler 2011 239. 49.6 136217. 8505.
## 13 Tyler 2012 264. 46.4 139250 7983.
## 14 Tyler 2013 287. 53.0 146100 6726.
## 15 Tyler 2014 332. 56.9 150467. 8543.
## 16 Wichita Falls 2010 123. 26.6 98942. 10361.
## 17 Wichita Falls 2011 106. 19.8 98142. 10632.
## 18 Wichita Falls 2012 112. 14.2 100958. 12347.
## 19 Wichita Falls 2013 121. 26.0 105000 10383.
## 20 Wichita Falls 2014 117 21.1 105675 12444.
# ======================================================
# 8. Visualizzazioni con ggplot2
# ======================================================
# Boxplot prezzi per città
ggplot(data = dati, aes(x = city, y = median_price)) +
geom_boxplot(fill = "green") +
labs(title = "Prezzi mediani per città") +
theme_bw()

# Boxplot volume per città e anno
ggplot(data = dati, aes(x = city, y = volume, fill = factor(year))) +
geom_boxplot() +
labs(title = "Volume vendite per città e anno") +
theme_bw()

# Grafico a barre vendite per mese e città (sovrapposte)
ggplot(data = dati, aes(x = month, fill = city)) +
geom_bar(position = "stack") +
labs(title = "Vendite per mese e città (sovrapposte)") +
theme_bw()

# Grafico a barre normalizzato
ggplot(data = dati, aes(x = month, fill = city)) +
geom_bar(position = "fill") +
labs(title = "Distribuzione percentuale vendite per mese e città") +
theme_bw()

# Line chart vendite per anno e città
ggplot(data = dati, aes(x = year, y = sales, color = city, group = city)) +
geom_line(size = 1) +
labs(title = "Andamento vendite per anno e città") +
theme_bw()
## 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.

# ======================================================
# 9. Conclusioni
# ======================================================
# - Le vendite mostrano forte stagionalità: picco nei mesi estivi, minimo in inverno.
# - Bryan-College Station ha i prezzi mediani più elevati, segnale di mercato immobiliare più costoso.
# - Tyler registra il maggior numero di compravendite.
# - Wichita è la città meno redditizia in termini di volume totale.
# - La variabile più variabile è "sales", quindi le vendite sono altamente fluttuanti.
# - La distribuzione dei prezzi è asimmetrica a destra, segno che esistono alcuni valori più alti che spostano la media.