1. Analisi delle variabili

In questa sezione andremo ad analizzare il dataset relativo alle vendite immobiliari nello stato del Texas.

real_estate <- read.csv("~/Desktop/realestate_texas.csv")

head(real_estate)
##       city year month sales volume median_price listings months_inventory
## 1 Beaumont 2010     1    83 14.162       163800     1533              9.5
## 2 Beaumont 2010     2   108 17.690       138200     1586             10.0
## 3 Beaumont 2010     3   182 28.701       122400     1689             10.6
## 4 Beaumont 2010     4   200 26.819       123200     1708             10.6
## 5 Beaumont 2010     5   202 28.833       123100     1771             10.9
## 6 Beaumont 2010     6   189 27.219       122800     1803             11.1
str(real_estate)
## '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 ...
unique(real_estate$city)
## [1] "Beaumont"              "Bryan-College Station" "Tyler"                
## [4] "Wichita Falls"
library(ggplot2)

Analisi delle variabili

Il dataset “real_estate” è composto da 240 osservazioni e 8 variabili inerenti al mercato immobiliare del Texas.

“City” –> Variabile qualitativa nominale, identifica la città di riferimento per ciascuna osservazione. Non è caratterizzata da un ordinamento naturale, quindi può essere usata per confrontare i diversi mercati locali; “Year” e “Month” –> Variabili temporali discrete, indicano la dimensione temporale del dataset, Year ci permette di studiare l’evoluzione del mercato negli anni e Month permette di studiare gli eventi stagionali; “Sales” e “Listings” –> Variabili quantitative discrete, “Sales” rappresenta il numero di immobili venduti, “Listings” indica il numero di annunci immobiliari attivi “Volume”, “Median_price” e “Month_inventory” –> Variabili quantitative continue. “Volume” indica il numero complessivo di vendite espresso in mln di dollari, “Median_price” indica il prezzo mediano degli immobili venduti, “Months_inventory” indica il numero di mesi necessario per vendere l’intero inventario di immobili disponibili sul mercato, assumendo che il ritmo delle vendite rimanga costante. Le variabili quantitative possono essere analizzate con misure di sintesi quali: media, mediana, deviazione standard e quartili, inoltre, possono essere rappresentate graficamente con istogrammi e boxplot. Le variabili qualitative possono essere utilizzate per confrontare gruppi. Le variabili temporali si possono utilizzare per studiare trend e stagionalità mediante grafici a linee o aggregati per anno o mese

2. Indici di posizione, variabilità e forma

summary(real_estate[, c("sales", "volume", "median_price", "listings", "months_inventory")])
##      sales           volume        median_price       listings   
##  Min.   : 79.0   Min.   : 8.166   Min.   : 73800   Min.   : 743  
##  1st Qu.:127.0   1st Qu.:17.660   1st Qu.:117300   1st Qu.:1026  
##  Median :175.5   Median :27.062   Median :134500   Median :1618  
##  Mean   :192.3   Mean   :31.005   Mean   :132665   Mean   :1738  
##  3rd Qu.:247.0   3rd Qu.:40.893   3rd Qu.:150050   3rd Qu.:2056  
##  Max.   :423.0   Max.   :83.547   Max.   :180000   Max.   :3296  
##  months_inventory
##  Min.   : 3.400  
##  1st Qu.: 7.800  
##  Median : 8.950  
##  Mean   : 9.193  
##  3rd Qu.:10.950  
##  Max.   :14.900
variabili_quantitative <- real_estate[,c(
  "sales",
  "volume",
  "median_price",
  "listings",
  "months_inventory"
)]

sapply(variabili_quantitative, function(x) max(x)-min(x))
##            sales           volume     median_price         listings 
##          344.000           75.381       106200.000         2553.000 
## months_inventory 
##           11.500
sapply(variabili_quantitative, var)
##            sales           volume     median_price         listings 
##     6.344300e+03     2.772707e+02     5.135730e+08     5.665690e+05 
## months_inventory 
##     5.306889e+00
sapply(variabili_quantitative, sd)
##            sales           volume     median_price         listings 
##        79.651111        16.651447     22662.148687       752.707756 
## months_inventory 
##         2.303669
sapply(variabili_quantitative, function(x) sd(x)/mean(x)*100)
##            sales           volume     median_price         listings 
##         41.42203         53.70536         17.08218         43.30833 
## months_inventory 
##         25.06031
skewness <- function(x) {
  mean((x-mean(x))^3)/sd(x)^3
}

sapply(variabili_quantitative, skewness)
##            sales           volume     median_price         listings 
##       0.71362055       0.87921815      -0.36227680       0.64544309 
## months_inventory 
##       0.04071944
kurtosis <- function(x) {
  mean((x - mean(x))^4) / sd(x)^4 -3
}

sapply(variabili_quantitative, kurtosis)
##            sales           volume     median_price         listings 
##       -0.3355200        0.1505673       -0.6427292       -0.8101534 
## months_inventory 
##       -0.1979448
table(real_estate$city)
## 
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60
prop.table(table(real_estate$city))
## 
##              Beaumont Bryan-College Station                 Tyler 
##                  0.25                  0.25                  0.25 
##         Wichita Falls 
##                  0.25
table(real_estate$year)
## 
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48
prop.table(table(real_estate$year))
## 
## 2010 2011 2012 2013 2014 
##  0.2  0.2  0.2  0.2  0.2
table(real_estate$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
prop.table(table(real_estate$month))
## 
##          1          2          3          4          5          6          7 
## 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333 
##          8          9         10         11         12 
## 0.08333333 0.08333333 0.08333333 0.08333333 0.08333333

Commento risultati

L’analisi degli indici di posizione mostra delle differenze tra le variabili quantitative considerate. “Sales”: si ha un valore medio degli immobili venduti pari a 192,3 e una mediana di 175,5; “Volume”: il valore medio è di 31,005 mln di dollari con una mediana di 27,062 mln; “Median_price”: si ha una media di 132.665 dollari e una mediana pari a 134.500 dollari; “Listings”: la media è di 1.738 annunci e la mediana è di 1.618; “Months_inventory”: restituisce una media di 9,193 mesi e una mediana di 8,95 mesi.

Gli indici di variabilità evidenziano delle differenze nelle dispersioni delle variabili. Il coefficiente di variazione ad esempio, che permette di confrontare la variabilità relativa è maggiore per il volume con il 53,71% seguito da listings con 43,31% e sales con 41,42%. Abbiamo poi months_inventory con una variabilità relativa minore, pari al 25,06% e median_price presenta un coefficiente di variazione pari al 17,08% ossia il minore di tutti. Andando ad analizzare i risultati inerenti alla forma delle distribuzioni, l’indice di asimmetria indica dei valori positivi per sales, volume e listings, in particolare indica una distribuzione asimmetrica a destra. median_price ha una leggera asimmetria a sinistra e months_inventory è rappresentata da una distribuzione quasi simmetrica con un valore prossimo allo zero. Il valore di asimmetria più elevato riscontrato è quello di volume. Per i valori di curtosi, gli indici risultano abbastanza contenuti, il valore più alto e positivo si riscontra in volume, mentre le altre variabili presentano dei valori negativi e la variabile con il valore minore è listings. Infine, andando ad esaminare le distribuzioni di frequenza delle variabili qualitative e temporali, emerge che il dataset è bilanciato. Le 4 città hanno 60 osservazioni ognuna pari a un 25% del totale. Anche per gli anni si osservano 48 osservazioni ciascuno, ossia il 20% per ogni anno (5 anni in totale) e ogni mese è rappresentato da 20 osservazioni, ossia l’8,33% del totale. In questa rappresentazione quindi, emerge la possibilità di fare dei confronti tra città, anni e mesi senza avere una categoria sovrarappresentata.

3. Identificazione delle variabili con maggiore variabilità e asimmetria

#Coefficiente di variazione
cv <- sapply(variabili_quantitative, function(x) sd(x)/mean(x) *100)

#Variabile con maggiore variabilità relativa
names(which.max(cv))
## [1] "volume"
#Indice di asimmetria
asimmetria <- sapply(variabili_quantitative, skewness)
asimmetria
##            sales           volume     median_price         listings 
##       0.71362055       0.87921815      -0.36227680       0.64544309 
## months_inventory 
##       0.04071944
#Variabile con maggiore asimmetria in valore assoluto
names(which.max(abs(asimmetria)))
## [1] "volume"

Commento punto 3

Per individuare la variabile che presenta la maggiore variabilità relativa è stato utilizzato il coefficiente di variazione, questo ci permette di confrontare la dispersione delle variabili espresse con unità di misura differenti. Quello che emerge è che volume ha il valore maggiore, il che indica che i valori del volume totale delle vendite sono relativamente più dispersi rispetto alla loro media. Invece per la distribuzione maggiormente asimmetrica è stato confrontato il valore assoluto degli indici di asimmetria. Nuovamente Volume presenta il valore maggiore. Avendo un valore di 0,879 ossia positivo, indica un’asimmetria verso destra, ossia una concentrazione maggiore di osservazioni con valori più bassi e una coda verso i valori più alti.

4. Creazione di classi per una variabile quantitativa

classi_sales <- cut(
  real_estate$sales,
  breaks= c(78,147,216,285,354,423),
  labels= c("79-147", "148-216", "217-285", "286-354", "355-423")
)

table(classi_sales)
## classi_sales
##  79-147 148-216 217-285 286-354 355-423 
##      84      77      41      27      11
freq_sales <- table(classi_sales)
prop.table(freq_sales)
## classi_sales
##     79-147    148-216    217-285    286-354    355-423 
## 0.35000000 0.32083333 0.17083333 0.11250000 0.04583333
ggplot(data.frame(classi_sales), aes(x=classi_sales))+
  geom_bar()+
  labs(
    title = "Distribuzione delle vendite per classe",
    x="Numero di vendite",
    y="Frequenza"
  )+
  theme_minimal()

frequenze <- prop.table(table(classi_sales))

gini_index <- 1-sum(frequenze^2)

gini_index
## [1] 0.730625

Commento punto 4

La variabile quantitativa scelta per l’analisi è Sales, in questo caso, dall’analisi dei dati quello che emerge è che si ha una concentrazione maggiore nelle classi che hanno un numero di vendite minore. Al contrario, le classi con valori più elevati risultano meno frequenti. Calcolando l’indice di eterogeneità di Gini, il risultato ottenuto è pari a 0,73, il quale indica un’elevata eterogenità nelle distribuzione delle ossrvazioni tra le classi, con le osservazioni che risultano concentrate maggiormente nelle prime due classi

5. Calcolo della probabilità

#Probabilità Beaumont
mean(real_estate$city =="Beaumont")
## [1] 0.25
#Probabilità Luglio
mean(real_estate$month == 7)
## [1] 0.08333333
#Probabilità Dicemnre 2012
mean(real_estate$month == 12 & real_estate$year == 2012)
## [1] 0.01666667

6. Creazione di nuove variabili

#Prezzo medio per immobile venduto
real_estate$average_price <- (real_estate$volume * 1000000/ real_estate$sales)

head(real_estate$average_price)
## [1] 170626.5 163796.3 157697.8 134095.0 142737.6 144015.9
#Indicatore di efficacia degli annunci

real_estate$listing_effectiveness <- real_estate$sales/real_estate$listings

head(real_estate$listing_effectiveness)
## [1] 0.05414220 0.06809584 0.10775607 0.11709602 0.11405985 0.10482529
#Espressione dell'indicatore in percentuale

real_estate$listing_effect_pct <- real_estate$listing_effectiveness*100

head(real_estate$listing_effect_pct)
## [1]  5.414220  6.809584 10.775607 11.709602 11.405985 10.482529
#Statistiche descrittive delle nuove variabili

summary(real_estate[, c("average_price",
                        "listing_effect_pct")])
##  average_price    listing_effect_pct
##  Min.   : 97010   Min.   : 5.014    
##  1st Qu.:132939   1st Qu.: 8.980    
##  Median :156588   Median :10.963    
##  Mean   :154320   Mean   :11.874    
##  3rd Qu.:173915   3rd Qu.:13.492    
##  Max.   :213234   Max.   :38.713
ggplot(real_estate, aes(x= city, y=listing_effect_pct))+
  geom_boxplot()+
  labs(
    title="Efficiacia degli annunci per città",
    x= "Città",
    y= "Prezzo medio ($)"
  )+
  theme_minimal()

##Commento punto 6 Sono state create due nuove variabili, la prima, average_price, rappresenta il prezzo medio degli immobili venduti ed è stata calcolata dividendo il volume totale delle vendite per il numero delle vendite. La seconda è listing_effect_pct, questa variabile misura il rapporto tra vendite e annunci attivi in percentuale. Si tratta di un indicatore che può essere utilizzato come misura approssimativa della capacità del mercato di trasformare gli annunci immobiliari in vendite, quindi un valore elevato indica un maggiore assorbimento di annunci. Si tratta di un indicatore approssimativo. Infine, il confronto tra le città, permette di individuare eventuali differenze sia nei prezzi medi degli immobili che nell’efficacia degli annunci.

7. Analisi condizionata

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Vendite medie per città
sales_city <- real_estate %>%
  group_by(city) %>%
  summarise(
    media_sales = mean(sales),
    sd_sales = sd(sales)
  )
sales_city
## # A tibble: 4 × 3
##   city                  media_sales sd_sales
##   <chr>                       <dbl>    <dbl>
## 1 Beaumont                     177.     41.5
## 2 Bryan-College Station        206.     85.0
## 3 Tyler                        270.     62.0
## 4 Wichita Falls                116.     22.2
ggplot(sales_city, aes (x=city, y=media_sales))+
  geom_col(fill="lightblue")+
  labs(
    title= "Vendite medie per città",
    x="Città",
    y="Vendite medie"
  ) +
  theme_minimal()

# Prezzo mediano
price_city <- real_estate %>%
  group_by(city) %>%
  summarise(
    media_price= mean(median_price),
    sd_price = sd(median_price)
  )
price_city
## # A tibble: 4 × 3
##   city                  media_price sd_price
##   <chr>                       <dbl>    <dbl>
## 1 Beaumont                  129988.   10105.
## 2 Bryan-College Station     157488.    8852.
## 3 Tyler                     141442.    9337.
## 4 Wichita Falls             101743.   11320.
ggplot(price_city, aes(x= city, y= media_price))+
  geom_col(fill="pink")+
  labs(
    title="Prezzo mediano per città",
    x="Città",
    y="Prezzo medio ($)"
  )+
  theme_minimal()

#Analisi andamento vendite per anno

sales_year <- real_estate %>%
  group_by(year) %>%
  summarise(
    media_sales = mean(sales),
    sd_sales = sd(sales)
  )

sales_year
## # A tibble: 5 × 3
##    year media_sales sd_sales
##   <int>       <dbl>    <dbl>
## 1  2010        169.     60.5
## 2  2011        164.     63.9
## 3  2012        186.     70.9
## 4  2013        212.     84.0
## 5  2014        231.     95.5
ggplot(sales_year, aes(x= factor(year), y=media_sales))+
  geom_col(fill="darkgreen")+
  labs(
    title = "Vendite medie per anno",
    x = "Anno",
    y = "Vendite medie"
  ) +
  theme_minimal()

#Analisi della stagionalità

sales_month <- real_estate %>%
  group_by(month) %>%
  summarise(
    media_sales = mean(sales),
    sd_sales = sd(sales)
  )

sales_month
## # A tibble: 12 × 3
##    month media_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
ggplot(sales_month, aes(x=factor(month), y=media_sales))+
  geom_col(fill="orange")+
  labs(
    title = "Vednite medie per mese",
    x = "Mese",
    y = "Vendite medie"
  )+
  theme_minimal()

## Commento punto 7 dall’analisi condizionata effettuata, si può analizzare il comportamento delle vendite considerando in modo individuale città, mesi e anni. Per quanto riguarda le città, si hanno delle differenze nei livelli medi di vendite: Tyler e Bryan-College Station hanno un numero di vendite maggiore, mentre Wichita Falls ha dei valori più contenuti. La deviazione standard inoltre, permette di valutare quanto le vendite siano variabili all’interno di ciascun mercato. Nel caso degli anni, si osserva una tendenza generale alla crescita delle vendite nel corso degli stessi, anche se l’andamento può differire tra le singole città. Infine, l’analisi per mese, permette di evidenziare una componente stagionale. Si evidenzia infatti, che le vendite sono maggiori nei mesi primaverili ed estivi, mentre tendono a ridursi nei mesi autunnali e invernali. Questo lascia intendere la presenza di una componente stagionale che non deve essere sottovalutata nell’interpretazione dei risultati.

8. Creazione di visualizzazioni con ggplot2

#boxplot per prezzo mediano tra le città
ggplot(real_estate, aes(x=city, y=median_price))+
  geom_boxplot(fill="lightblue")+
  labs(
    title="Distribuzione del prezzo mediano per città",
    x="Città",
    y="Prezzo mediano ($)"
  )+
  theme_minimal()

#boxplot del volume delle vendite per città
ggplot(real_estate, aes(x=city, y=volume))+
  geom_boxplot(fill="lightgreen")+
  labs(
    title="Distribuzione del volume delle vendite per città",
    x="Città",
    y="Volume delle vendite (mln $)"
  )+
  theme_minimal()

#boxplot volume delle vendite per anno
ggplot(real_estate, aes(x=factor(year), y=volume))+
  geom_boxplot(fill="lightcoral")+
  labs(
    title="Distribuzione del volume delle vendite per anno",
    x="Anno",
    y="Volume delle vendite (mln $)"
  )+
  theme_minimal()

#Grafico a barre sovrapposte:vendite per mese e città
ggplot(real_estate, aes(x=factor(month), y=sales, fill=city))+
  geom_col()+
  labs(
    title="Vednite per mese e città",
    x="Mese",
    y="Numero di vendite",
    fill="Città"
  )+
  theme_minimal()

#barre normalizzate
ggplot(real_estate, aes(x=factor(month), y=sales, fill=city))+
  geom_col(position = "fill")+
  labs(
    title="Distribuzione percentuale delle vendite per mese e città",
    x="Mese",
    y="Percentuale",
    fill="Città"
  )+
  scale_y_continuous(labels = scales::percent)+
  theme_minimal()

#Grafico comprensivo di anno
ggplot(real_estate, aes(x=factor(month), y=sales, fill=city))+
  geom_col()+
  facet_wrap(~ year)+
  labs(
    title="Vendite mensili per città e anno",
    x="Mese",
    y="Numero di vendite",
    fill="Città"
  )+
  theme_minimal()

#Line chart
real_estate$date <- as.Date(
  paste(real_estate$year, real_estate$month, "01", sep = "-")
)
ggplot(real_estate, aes(x = date, y = sales)) +
  geom_line(color = "black") +
  facet_wrap(~ city) +
  labs(
    title = "Andamento delle vendite per città",
    x = "Periodo",
    y = "Numero di vendite"
  ) +
  theme_minimal()

## Commento boxplot punto 8 I boxplot mostrano la distribuzione del prezzo mediano degli immobili nelle 4 città considerate. Si osservano delle differenze molto evidenti nei 4 mercati immobiliari. Wichita Falls ha una distribuzione dei prezzi minore, Beaumont presenta valori intermedi, Tyler e Bryan-College Station hanno invece i valori di prezzi più elevati. Il secondo boxplot, ossia quello inerente al volume delle vendite, evidenzia delle differenze tra i mercati delle quattro città, in questo caso, Tyler e Bryan-College Station hanno mediamente dei valori maggiori, mentre Wichita Falls mostra volumi più contenuti. La diversa ampiezza dei box, indica che la variabilità del volume delle vendite non è uguale tra le città.Anche confrontando il volume delle vendite tra i diversi anni si osservano differenze nella distribuzione. In generale, negli anni più recenti i valori risultano maggiori, evidenziando una crescita del valore complessivo delle vendite nel periodo considerato. Il grafico a barre mostra delle differenze nelle vendite mensili tra le città. In generale, nei mesi primaverili ed estivi si hanno livelli di vendita maggiori rispetto ai mesi autunnali e invernali. Il grafico normalizzato permette invece di confrontare la percentuale delle vendite tra le città, mentre l’utilizzo dell’anno mediante facet_wrap, permette di osservare il cambiamento dell’andamento nel corso del periodo anlizzato.

9. Conclusioni

Dall’analisi dei dati a disposizione, sono state evidenziate delle differenze significative tra i mercati immobiliari delle città prese in esame, questo vale sia per i prezzi che per il numero e il valore delle vendite. In particolare, Wichita Falls presenta i valori più contenuti, mentre Tyler e Bryan-College Station mostrano dei livelli di vendita maggiori. Il volume delle vendite si è rivelato la variabile con maggiore variabilità relativa e maggiore asimmetria. L’analisi temporale ha inoltre evidenziato una componente stagionale, in questo caso infatti, le vendite sono concentrate nei mesi primaverili ed estivi, per poi calare nel periodo invernale ed autunnale. Nel complesso, i risultati suggeriscono di adottare una strategia di vendita differenziata a seconda della città e del periodo dell’anno, concentrando maggiormente le attività promozionali nei periodi di maggior richiesta e monitorando l’efficacia degli annunci nei diversi mercati.