options(repos = c(CRAN = "https://cloud.r-project.org/"))
install.packages("moments")
## Installazione pacchetto in 'C:/Users/zav/AppData/Local/R/win-library/4.4'
## (perché 'lib' non è specificato)
## pacchetto 'moments' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\zav\AppData\Local\Temp\Rtmpa0dGPW\downloaded_packages
  1. Analisi delle variabili

city: Variabile qual. nominale year: Var. quant. continua month: Var. qual. nominale sales: variabile quantitativa discreta (esprime un conteggio) volume: varibile qua.tiva continua median_price: varibile qua.tiva continua listings: variabile quantitativa discreta (esprime un conteggio) months_inventory: varibile qua.tiva continua

Potrei calcolare per tutte la distribuzione di frequenza. -Indici di posizione: Media su sales,volume,month inventory e listings/Moda su Month e Year per capire i periodi più ricorrenti/Mediana su Sales essendoci presente già Median price -Indice di variabilità: Varianza & Deviazione standard su sales, volume, median price, months inventor/IQR: utile per median price, sales e months inventory/Range: sales, listings, e months_inventory (divario tra valori estremi?) -Indice di forma: Asimmetria su sales, volume e month inventory / Curtosi su Volume e sales

2.Calcoliamo indici di posizione

library(readr)
realestate_texas=read_csv("realestate_texas.csv")
## Rows: 240 Columns: 8
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): city
## dbl (7): year, month, sales, volume, median_price, listings, months_inventory
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
library(knitr)
#media
kable(round(mean(realestate_texas$sales), 2))
x
192.29
kable(round(mean(realestate_texas$volume), 2))
x
31.01
kable(round(mean(realestate_texas$months_inventory), 2))
x
9.19
kable(round(mean(realestate_texas$listings), 2))
x
1738.02
#Moda
kable(table(realestate_texas$month))
Var1 Freq
1 20
2 20
3 20
4 20
5 20
6 20
7 20
8 20
9 20
10 20
11 20
12 20
kable(table(realestate_texas$year))
Var1 Freq
2010 48
2011 48
2012 48
2013 48
2014 48
#Mediana
kable(round(median(realestate_texas$sales), 2))
x
175.5

#Calcoliamo indici di variabilità

##COEFFICIENTE DI VARIAZIONE
install.packages("raster")
## Installazione pacchetto in 'C:/Users/zav/AppData/Local/R/win-library/4.4'
## (perché 'lib' non è specificato)
## pacchetto 'raster' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\zav\AppData\Local\Temp\Rtmpa0dGPW\downloaded_packages
library(raster)
## Caricamento del pacchetto richiesto: sp
kable(round(cv(realestate_texas$sales), 2))
x
41.42
kable(round(cv(realestate_texas$volume), 2))
x
53.71
kable(round(cv(realestate_texas$median_price), 2))
x
17.08
kable(round(cv(realestate_texas$months_inventory), 2))
x
25.06
#Varianza
kable(round(var(realestate_texas$sales), 2))
x
6344.3
kable(round(var(realestate_texas$volume), 2))
x
277.27
kable(round(var(realestate_texas$median_price), 2))
x
513572983
kable(round(var(realestate_texas$months_inventory), 2))
x
5.31
#deviazione standard
kable(round(sd(realestate_texas$sales), 2))
x
79.65
kable(round(sd(realestate_texas$volume), 2))
x
16.65
kable(round(sd(realestate_texas$median_price), 2))
x
22662.15
kable(round(sd(realestate_texas$months_inventory), 2))
x
2.3

#range

kable(range(realestate_texas$sales))
x
79
423
kable(range(realestate_texas$listings))
x
743
3296
kable(range(realestate_texas$months_inventory))
x
3.4
14.9

#IQR

kable(round(IQR(realestate_texas$months_inventory), 2))
x
3.15
kable(round(IQR(realestate_texas$sales), 2))
x
120
kable(round(IQR(realestate_texas$median_price), 2))
x
32750

#indici di forma

install.packages("moments")
## Installazione pacchetto in 'C:/Users/zav/AppData/Local/R/win-library/4.4'
## (perché 'lib' non è specificato)
## pacchetto 'moments' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\zav\AppData\Local\Temp\Rtmpa0dGPW\downloaded_packages
library(moments)
kable(round(skewness(realestate_texas$sales), 2))
x
0.72
kable(round(skewness(realestate_texas$volume), 2))
x
0.88
kable(round(skewness(realestate_texas$months_inventory), 2))
x
0.04
kable(round(kurtosis(realestate_texas$sales) - 3, 2))
x
-0.31
kable(round(kurtosis(realestate_texas$volume) - 3, 2))
x
0.18

Considerazioni: L’analisi dei dati sulle vendite e sul volume rivela una notevole variabilità e una certa asimmetria verso destra. Questo significa che, sebbene la maggior parte dei valori si concentri attorno alla media, ci sono alcuni mesi in cui le vendite e il volume hanno raggiunto picchi particolarmente elevati, contribuendo ad allungare la coda della distribuzione verso l’alto.

Al contrario, il prezzo mediano degli immobili appare molto più stabile: la sua variabilità relativa è contenuta, suggerendo che, nel periodo analizzato, i prezzi non hanno subito oscillazioni significative.

La variabile relativa ai mesi di inventario mostra invece una distribuzione molto regolare, praticamente simmetrica e priva di code evidenti. Questo indica che i valori si distribuiscono in modo equilibrato attorno alla media, senza forti deviazioni o estremi.

Infine, gli indici di asimmetria (skewness) e curtosi confermano che le distribuzioni non seguono perfettamente un andamento normale, ma non presentano neanche deformazioni marcate. Le deviazioni dalla normalità sono lievi e non tali da compromettere l’interpretazione dei dati.

3.Identificazione delle variabili con maggiore variabilità e asimmetria

Il numero di vendite (sales) varia molto tra le osservazioni, suggerendo che le condizioni del mercato immobiliare cambiano molto nel tempo/anni o tra le varie città. La variabile con la distribuzione più asimmetrica è Volume, con una asimmetria di 0.884742. Questo valore indica una distribuzione asimmetrica positiva, quindi c’è una coda lunga verso i valori più alti.

  1. Creazione di classi per una variabile quantitativa #Divideremo la variabile sales in classi. 3 classi da 150 vendite ovvero: 0-150,150-300,300-450
Classi_sales<- cut(realestate_texas$sales,
                       breaks=c(79,150,300,450))
View(Classi_sales)
#Creiamo N

N=dim (realestate_texas)[1]

Costruiamo la tabella delle 4 frequenza

ni<-table(Classi_sales)
fi<-table(Classi_sales)/N
Ni<-cumsum(ni)
Fi<-cumsum(ni)/N

Vediamo la distribuzione totale

cbind(ni,fi,Ni,Fi)
##            ni        fi  Ni        Fi
## (79,150]   91 0.3791667  91 0.3791667
## (150,300] 122 0.5083333 213 0.8875000
## (300,450]  25 0.1041667 238 0.9916667
distr_fre_sales=as.data.frame(cbind(ni,fi,Ni,Fi))
#grafico a barre
barplot(distr_fre_sales$ni,
        main="distribuzione vendite",
        xlab="vendite",
        ylab="freq.assolute",
        ylim = c(0,450),#ylim estende il limite delle assi (va fino a 10 in questo caso)
        col = "red",
        names.arg = rownames(distr_fre_sales))

Calcolo Gini

install.packages("dplyr")
## Installazione pacchetto in 'C:/Users/zav/AppData/Local/R/win-library/4.4'
## (perché 'lib' non è specificato)
## pacchetto 'dplyr' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\zav\AppData\Local\Temp\Rtmpa0dGPW\downloaded_packages
library(dplyr)
## 
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:raster':
## 
##     intersect, select, union
## I seguenti oggetti sono mascherati da 'package:stats':
## 
##     filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     intersect, setdiff, setequal, union
Gini.index=function(Classi_sales){
  ni=table(Classi_sales)
  fi=ni/length(Classi_sales)
  fi2=fi^2
  j=length(table(Classi_sales))
  
  gini= 1-sum(fi2)
  gini.normalizzato= gini/((j-1)/j)
  return(gini.normalizzato)
}

kable(table(Classi_sales))
Classi_sales Freq
(79,150] 91
(150,300] 122
(300,450] 25
kable(round(Gini.index(Classi_sales), 2))
x
0.88

Il 50.83% delle osservazioni rientra nella classe 150-300, il che indica che la maggior parte delle vendite è “distribuita” in questo intervallo.Ciò è supportato dall’ indice di Gini vicino ad 1 che evidenzia una distribuzione non equa.

5 Calcolo delle probabilità

Non essendo variabili continue uso la definizione classica di probabilità, che è semplicemente il numero di casi favorevoli diviso il numero totale di casi possibili.

N = 240
A = nrow(subset(realestate_texas, city == "Beaumont")) / N
B = nrow(subset(realestate_texas, month == 7)) / N
C = nrow(subset(realestate_texas, month == 12 & year == 2012)) / N

kable(round(A, 3))
x
0.25
kable(round(B, 3))
x
0.083
kable(round(C, 3))
x
0.017

Le probabilità calcolate sono: Probabilità che una riga riporti la città “Beaumont”: 25%/Probabilità che il mese sia Luglio: 8.33%/Probabilità che il mese sia Dicembre 2012: 1.67%

  1. Creazione di nuove variabili Parto dividendo volume e vendite totali per ottenere prezzo medio
volume=sum(realestate_texas$volume)*1000
vendite=sum(realestate_texas$sales)
Prezzo_medio = round(volume / vendite, 2)
#Possiamo misurare l'efficacia degli annunci di vendita confrontando il numero di vendite (sales) con il numero di annunci (listings)
realestate_texas <- realestate_texas %>%
  mutate(efficacy = sales / listings)

summary(round(realestate_texas$efficacy, 2))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0500  0.0900  0.1100  0.1184  0.1325  0.3900

Considerazioni:In media solo il 12% degli annunci porta a una vendita. Questo indica un mercato con un turnover moderato, dove molte case rimangono invendute.Distribuzione: L’ampia variabilità indica che ci sono forti differenze tra città nei mesi e negli anni.

7.Analisi condizionata

library(dplyr)
library(ggplot2)

str(realestate_texas)
## tibble [240 × 9] (S3: tbl_df/tbl/data.frame)
##  $ city            : chr [1:240] "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
##  $ year            : num [1:240] 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ month           : num [1:240] 1 2 3 4 5 6 7 8 9 10 ...
##  $ sales           : num [1:240] 83 108 182 200 202 189 164 174 124 150 ...
##  $ volume          : num [1:240] 14.2 17.7 28.7 26.8 28.8 ...
##  $ median_price    : num [1:240] 163800 138200 122400 123200 123100 ...
##  $ listings        : num [1:240] 1533 1586 1689 1708 1771 ...
##  $ months_inventory: num [1:240] 9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
##  $ efficacy        : num [1:240] 0.0541 0.0681 0.1078 0.1171 0.1141 ...
summary(realestate_texas)
##      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  
##     efficacy      
##  Min.   :0.05014  
##  1st Qu.:0.08980  
##  Median :0.10963  
##  Mean   :0.11874  
##  3rd Qu.:0.13492  
##  Max.   :0.38713

Analisi statistica: media e deviazione standard per città, anno e mese

summary_stats_city <- realestate_texas %>%
  group_by(city) %>%
  summarise(
    mean_sales = round(mean(sales, na.rm = TRUE), 2),
    sd_sales = round(sd(sales, na.rm = TRUE), 2),
    mean_volume = round(mean(volume, na.rm = TRUE), 2),
    sd_volume = round(sd(volume, na.rm = TRUE), 2),
    mean_price = round(mean(median_price, na.rm = TRUE), 2),
    sd_price = round(sd(median_price, na.rm = TRUE), 2)
  )

summary_stats_month <- realestate_texas %>%
  group_by(month) %>%
  summarise(
    mean_sales = round(mean(sales, na.rm = TRUE), 2),
    sd_sales = round(sd(sales, na.rm = TRUE), 2),
    mean_volume = round(mean(volume, na.rm = TRUE), 2),
    sd_volume = round(sd(volume, na.rm = TRUE), 2),
    mean_price = round(mean(median_price, na.rm = TRUE), 2),
    sd_price = round(sd(median_price, na.rm = TRUE), 2)
  )

summary_stats_year <- realestate_texas %>%
  group_by(year) %>%
  summarise(
    mean_sales = round(mean(sales, na.rm = TRUE), 2),
    sd_sales = round(sd(sales, na.rm = TRUE), 2),
    mean_volume = round(mean(volume, na.rm = TRUE), 2),
    sd_volume = round(sd(volume, na.rm = TRUE), 2),
    mean_price = round(mean(median_price, na.rm = TRUE), 2),
    sd_price = round(sd(median_price, na.rm = TRUE), 2)
  )

kable(summary_stats_city)
city mean_sales sd_sales mean_volume sd_volume mean_price sd_price
Beaumont 177.38 41.48 26.13 6.97 129988.3 10104.99
Bryan-College Station 205.97 84.98 38.19 17.25 157488.3 8852.24
Tyler 269.75 61.96 45.77 13.11 141441.7 9336.54
Wichita Falls 116.07 22.15 13.93 3.24 101743.3 11320.03
kable(summary_stats_month)
month mean_sales sd_sales mean_volume sd_volume mean_price sd_price
1 127.40 43.38 19.00 8.37 124250 25151.28
2 140.85 51.07 21.65 10.09 130075 22822.59
3 189.45 59.18 29.38 12.02 127415 23442.03
4 211.70 65.40 33.30 14.52 131490 21458.40
5 238.85 83.12 39.70 19.02 134485 18796.26
6 243.55 95.00 41.30 21.08 137620 19231.02
7 235.75 96.27 39.12 21.41 134750 21944.78
8 231.45 79.23 38.01 18.05 136675 22488.38
9 182.35 72.52 29.60 15.22 134040 24344.10
10 179.90 74.95 29.08 15.13 133480 26358.07
11 156.85 55.47 24.81 11.15 134305 24691.47
12 169.40 60.75 27.09 12.57 133400 22809.76
kable(summary_stats_year)
year mean_sales sd_sales mean_volume sd_volume mean_price sd_price
2010 168.67 60.54 25.68 10.80 130191.7 21821.76
2011 164.12 63.87 25.16 12.20 127854.2 21317.80
2012 186.15 70.91 29.27 14.52 130077.1 21431.52
2013 211.92 84.00 35.15 17.93 135722.9 21708.08
2014 230.60 95.51 39.77 21.19 139481.2 25625.41

Visualizzazione grafica delle vendite medie nel tempo per città

summary_stats <- realestate_texas %>%
  group_by(city, year, month) %>%
  summarise(
    mean_sales = mean(sales, na.rm = TRUE),
    .groups = "drop"
  )


ggplot(summary_stats, aes(x = factor(month), y = mean_sales, color = factor(year))) +
  geom_line(aes(group = year)) +
  facet_wrap(~ city) +
  labs(title = "Andamento delle vendite medie per città", x = "Mese", y = "Vendite medie") +
  theme_minimal()

8.Creazione di visualizzazioni con ggplot2

library(ggplot2)
library(dplyr)


#Boxplot della distribuzione del prezzo mediano per città
ggplot(realestate_texas, aes(x = city, y = median_price)) +
  geom_boxplot() +
  labs(title = "Distribuzione del Prezzo Mediano delle Case per Città",
       x = "Città",
       y = "Prezzo Mediano")

#Boxplot del valore totale delle vendite per città e anno
ggplot(realestate_texas, aes(x = city, y = volume, fill = factor(year))) +
  geom_boxplot() +
  labs(title = "Distribuzione del Valore Totale delle Vendite",
       x = "Città",
       y = "Volume delle Vendite",
       fill = "Anno")

#Grafico a barre sovrapposte per il totale delle vendite per mese e città
ggplot(realestate_texas, aes(x = factor(month), y = sales, fill = city)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(title = "Totale delle Vendite nei Vari Mesi per Città",
       x = "Mese",
       y = "Numero di Vendite",
       fill = "Città")

#Grafico a barre normalizzato
ggplot(realestate_texas, aes(x = factor(month), y = sales, fill = city)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(title = "Distribuzione Normalizzata delle Vendite per Mese e Città",
       x = "Mese",
       y = "Proporzione di Vendite",
       fill = "Città")

9.Considerazioni

1)Prezzo Mediano delle Case per Città:Il boxplot ci permette di confrontare la distribuzione dei prezzi mediani delle case tra le varie città. Si notano differenze significative tra alcune città: Bryan è la citta con il prezzo mediano più alto (circa 160.000\() mentre Wichita falls quella con il minore(circa 105.000\)), con alcune che presentano prezzi più alti rispetto ad altre. Inoltre, la presenza di outlier potrebbe indicare vendite di proprietà particolarmente costose o economiche in alcune aree.

2)Valore Totale delle Vendite per Città e Anno:Questo grafico evidenzia come il valore totale delle vendite vari non solo tra le città, ma anche tra gli anni.Tyler e Bryan-College Station hanno volumi molto più elevati rispetto a Beaumont e Wichita Falls.C’è una discreta variabilità nei vai anni, specialmente per Tyler, suggerendo che ci sono anni con picchi più alti. Alcune città mostrano una certa stabilità nei volumi di vendita, mentre altre evidenziano forti fluttuazioni.Le città di Tyler e Bryan hanno dinamiche di mercato molto più attive

3)Totale delle Vendite nei Vari Mesi per Città:Il grafico a barre sovrapposte evidenzia una stagionalità nelle vendite. Notiamo mesi con picchi di vendite(Maggio-Luglio)il che significa che la stagionalità è marcata. Inoltre, alcune città dominano il numero di vendite totali, suggerendo che i mercati immobiliari locali possono avere dimensioni e dinamiche differenti.Tyler e Bryan-College Station sono più consistenti a supporto di quanto espresso anche prima.I mesi gennaio, novembre e dicembre risultano i più deboli in termini di vendite.

4)Distribuzione Normalizzata delle Vendite per Mese e Città:Questo grafico aiuta a comprendere la variazione relativa delle vendite tra le città nei diversi mesi. Le proporzioni rimangono stabili significa che le dinamiche del mercato sono simili in tutte le città analizzate.Tyler rappresenta una parte significativa delle vendite quasi ogni mese. Anche la quota di vendite di Wichita Falls e Beaumont è più stabile ma minore.Non ci sono grossi cambiamenti nella proporzione mese per mese, quindi il rapporto di vendite delle città tra loro è costante nel tempo. Anche se i volumi cambiano mese per mese (come visto nel secondo grafico), la composizione delle vendite tra le città è abbastanza stabile.