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.