Analisi del Mercato Immobiliare del Texas

Il presente studio intende analizzare la situazione inerente al mercato immobiliare nel Texas, nel contesto del Master in Data Science erogato da Profession.AI. Nello studio saranno analizzati indici di posizione, di variabilità e di forma delle variabili in gioco, tutto corredato da svariati plots esplicativi per individuare tendenze positive e negative nei dati che possano essere utili alla comprensione della situazione immobiliare generale, con analisi specifiche nelle città e nei periodi storici presenti nel dataset.

1. Analisi delle variabili

Si procede ad ispezionare il dataset per capire da quali variabili è formato. Per questo si usano le funzioni ‘summary’, ‘head’ e ‘tail’ per visualizzare le principali statistiche del dataset e le prime ed ultime 5 righe.

data=read.csv("realestate_texas.csv")
library(knitr)
library(kableExtra)
kable(summary(data), format='html', caption="<b><span style='color: black;'>Sommario dataset<span></b>")%>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:8, extra_css = "padding-right: 10px;")
Sommario dataset
city year month sales volume median_price listings months_inventory
Length:240 Min. :2010 Min. : 1.00 Min. : 79.0 Min. : 8.166 Min. : 73800 Min. : 743 Min. : 3.400
Class :character 1st Qu.:2011 1st Qu.: 3.75 1st Qu.:127.0 1st Qu.:17.660 1st Qu.:117300 1st Qu.:1026 1st Qu.: 7.800
Mode :character Median :2012 Median : 6.50 Median :175.5 Median :27.062 Median :134500 Median :1618 Median : 8.950
NA Mean :2012 Mean : 6.50 Mean :192.3 Mean :31.005 Mean :132665 Mean :1738 Mean : 9.193
NA 3rd Qu.:2013 3rd Qu.: 9.25 3rd Qu.:247.0 3rd Qu.:40.893 3rd Qu.:150050 3rd Qu.:2056 3rd Qu.:10.950
NA Max. :2014 Max. :12.00 Max. :423.0 Max. :83.547 Max. :180000 Max. :3296 Max. :14.900
kable(head(data), format='html', caption="<b><span style='color: black;'>Prime righe dataset<span></b>")%>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:8, extra_css = "padding-right: 2px;")
Prime righe dataset
city year month sales volume median_price listings months_inventory
Beaumont 2010 1 83 14.162 163800 1533 9.5
Beaumont 2010 2 108 17.690 138200 1586 10.0
Beaumont 2010 3 182 28.701 122400 1689 10.6
Beaumont 2010 4 200 26.819 123200 1708 10.6
Beaumont 2010 5 202 28.833 123100 1771 10.9
Beaumont 2010 6 189 27.219 122800 1803 11.1
kable(tail(data), format='html', caption="<b><span style='color: black;'>Ultime righe dataset<span></b>")%>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:8, extra_css = "padding-right: 2px;")
Ultime righe dataset
city year month sales volume median_price listings months_inventory
235 Wichita Falls 2014 7 150 18.672 102500 941 8.0
236 Wichita Falls 2014 8 137 16.129 99600 973 8.3
237 Wichita Falls 2014 9 110 12.015 90000 940 8.1
238 Wichita Falls 2014 10 112 13.817 113300 905 7.8
239 Wichita Falls 2014 11 96 11.308 108000 870 7.5
240 Wichita Falls 2014 12 109 13.884 103800 821 7.0

Come si nota, sono presenti 8 variabili diverse.

  • city: variabile qualitativa nominale, indica le varie città analizzate.
  • year: variabile quantitativa continua, da trattare come qualitativa ordinale. Indica l’anno analizzato.
  • month: variabile qualitativa nominale codificata (ciclica), ai vari mesi ordinati da gennaio a dicembre è associato un numero da 1 a 12.
  • sales: variabile quantitativa discreta, indica il numero totale di vendite.
  • volume: variabile quantitativa continua, valore totale delle vendite in milioni di dollari.
  • median_price: variabile quantitativa continua (espressa come intero arrotondato sulle centinaia), prezzo mediano di vendita in dollari.
  • listings: variabile quantitativa discreta, numero totale di annunci attivi.
  • months_inventory: variabile quantitativa continua, quantità di tempo necessaria per vendere tutte le inserzioni correnti, espresso in mesi.

Le variabili quantitative continue sono su scale di rapporti. Le variabili ‘year’, ‘month’ e ‘months_inventory’ sottintendono un tempo. In particolare, ‘year’ e ‘month’ si prestano per analisi in cui si valuta una delle altre variabili al variare del tempo, cioè una serie storica o sui mesi o sugli anni, oppure su mesi fissati per anni diversi e/o città diverse. Per le altre variabili esclusa ‘city’, essendo tutte quantitative si potrebbe studiare la loro distribuzione di densità (per quelle continue) e la distribuzione discreta (per quelle discrete), anche condizionando l’analisi per città o periodo di tempo.

2. Indici di posizione, variabilità e forma

Si procede al calcolo di indici di posizione, variabilità e forma per le variabili ‘sales’, ‘volume’, ‘median_price’, ‘listings’, ‘months_inventory’. Gli indici di posizione sono già presentati nella tabella precedente.

Sales

library(moments)

sd_s=sd(data$sales)
range_s=max(data$sales)-min(data$sales)
inter_q_s=IQR(data$sales)
vc_s=sd(data$sales)/mean(data$sales)*100
skew_s=skewness(data$sales)
kurt_s=kurtosis(data$sales)-3
cat("Sales:\n",
    "Standard Deviation:", round(sd_s,2), "\n",
    "Range:", round(range_s,2), "\n",
    "Interquartile Range:", round(inter_q_s,2), "\n",
    "Coefficient of Variation (%):", round(vc_s,2), "\n",
    "Skewness:", round(skew_s,2), "\n",
    "Kurtosis:", round(kurt_s,2), "\n")
## Sales:
##  Standard Deviation: 79.65 
##  Range: 344 
##  Interquartile Range: 120 
##  Coefficient of Variation (%): 41.42 
##  Skewness: 0.72 
##  Kurtosis: -0.31

La variabile ‘sales’ risulta asimmetrica a favore di valori piccoli della variabile, come si evince dalla skewness positiva. Inoltre la curtosi indica che i valori tendono ad essere meno concentrati verso la media rispetto ad una distribuzione normale. Il range interquartile indica la tendenza del corpo centrale dei dati ad essere abbastanza concentrato, mentre il coefficiente di variazione suggerisce la presenza di valori anche molto variabili tra loro.

Volume

library(moments)
sd_v=sd(data$volume)
range_v=max(data$volume)-min(data$volume)
inter_q_v=IQR(data$volume)
vc_v=sd(data$volume)/mean(data$volume)*100
skew_v=skewness(data$volume)
kurt_v=kurtosis(data$volume)-3
cat("Volume:\n",
    "Standard Deviation:", round(sd_v,2), "\n",
    "Range:", round(range_v,2), "\n",
    "Interquartile Range:", round(inter_q_v,2), "\n",
    "Coefficient of Variation (%):", round(vc_v,2), "\n",
    "Skewness:", round(skew_v,2), "\n",
    "Kurtosis:", round(kurt_v,2), "\n")
## Volume:
##  Standard Deviation: 16.65 
##  Range: 75.38 
##  Interquartile Range: 23.23 
##  Coefficient of Variation (%): 53.71 
##  Skewness: 0.88 
##  Kurtosis: 0.18

La variabile ‘volume’ risulta anch’essa asimmetrica a favore di valori piccoli della variabile, come da skewness positiva. La curtosi indica che i valori tendono ad essere più concentrati verso la media rispetto ad una distribuzione normale. Il coefficiente di variazione indica una dispersione dei dati rispetto alla media relativamente elevata, mentre il range interquartile suggerisce un corpo centrale dei dati abbastanza concentrato, con valori vicini uno all’altro.

Median price

library(moments)
sd_med=sd(data$median_price)
range_med=max(data$median_price)-min(data$median_price)
inter_q_med=IQR(data$median_price)
vc_med=sd(data$median_price)/mean(data$median_price)*100
skew_med=skewness(data$median_price)
kurt_med=kurtosis(data$median_price)-3
cat("Median price:\n",
    "Standard Deviation:", round(sd_med,2), "\n",
    "Range:", round(range_med,2), "\n",
    "Interquartile Range:", round(inter_q_med,2), "\n",
    "Coefficient of Variation (%):", round(vc_med,2), "\n",
    "Skewness:", round(skew_med,2), "\n",
    "Kurtosis:", round(kurt_med,2), "\n")
## Median price:
##  Standard Deviation: 22662.15 
##  Range: 106200 
##  Interquartile Range: 32750 
##  Coefficient of Variation (%): 17.08 
##  Skewness: -0.36 
##  Kurtosis: -0.62

La variabile ‘median_price’ risulta asimmetrica a favore di valori grandi della variabile, come si nota dalla skewness negativa. La curtosi indica che il picco risulta essere meno accentuato rispetto ad una distribuzione normale. Il coefficiente di variazione indica una dispersione dei dati rispetto alla media relativamente bassa, inoltre il range interquartile assume un valore piccolo rispetto al range totale, suggerendo una buona concentrazione del corpo centrale dei dati.

Listings

library(moments)
sd_l=sd(data$listings)
range_l=max(data$listings)-min(data$listings)
inter_q_l=IQR(data$listings)
vc_l=sd(data$listings)/mean(data$listings)*100
skew_l=skewness(data$listings)
kurt_l=kurtosis(data$listings)-3
cat("Listings:\n",
    "Standard Deviation:", round(sd_l,2), "\n",
    "Range:", round(range_l,2), "\n",
    "Interquartile Range:", round(inter_q_l,2), "\n",
    "Coefficient of Variation (%):", round(vc_l,2), "\n",
    "Skewness:", round(skew_l,2), "\n",
    "Kurtosis:", round(kurt_l,2), "\n")
## Listings:
##  Standard Deviation: 752.71 
##  Range: 2553 
##  Interquartile Range: 1029.5 
##  Coefficient of Variation (%): 43.31 
##  Skewness: 0.65 
##  Kurtosis: -0.79

La skewness della variabile ‘listings’ indica che questa risulta asimmetrica positiva, a favore di piccoli valori della variabile. La curtosi indica che il picco risulta essere meno accentuato rispetto ad una distribuzione normale in modo moderato. Il coefficiente di variazione indica una dispersione dei dati rispetto alla media abbastanza alta. Anche il range interquartile assume un valore elevato rispetto al range totale, suggerendo una dispersione del corpo centrale dei dati importante.

Months inventory

library(moments)
sd_mo=sd(data$months_inventory)
range_mo=max(data$months_inventory)-min(data$months_inventory)
inter_q_mo=IQR(data$months_inventory)
vc_mo=sd(data$months_inventory)/mean(data$months_inventory)*100
skew_mo=skewness(data$months_inventory)
kurt_mo=kurtosis(data$months_inventory)-3
cat("Months inventory:\n",
    "Standard Deviation:", round(sd_mo,2), "\n",
    "Range:", round(range_mo,2), "\n",
    "Interquartile Range:", round(inter_q_mo,2), "\n",
    "Coefficient of Variation (%):", round(vc_mo,2), "\n",
    "Skewness:", round(skew_mo,2), "\n",
    "Kurtosis:", round(kurt_mo,2), "\n")
## Months inventory:
##  Standard Deviation: 2.3 
##  Range: 11.5 
##  Interquartile Range: 3.15 
##  Coefficient of Variation (%): 25.06 
##  Skewness: 0.04 
##  Kurtosis: -0.17

La skewness della variabile ‘months_invetory’ suggerisce una quasi perfetta simmetria. La curtosi indica che il picco risulta essere meno accentuato rispetto ad una distribuzione normale, anche se non di molto. Il coefficiente di variazione indica una dispersione dei dati rispetto alla media non eccessiva. Il range interquartile assume un valore di un quarto circa rispetto al range totale, suggerendo che il corpo centrale dei dati è concentrato.

City, year e month

Per le variabili ‘city’, ‘year’ e ‘month’ si costruisce la distribuzione delle frequenze.

ni_city=table(data$city)
print(ni_city)
## 
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60

La variabile ‘city’ risulta presente in quattro categorie rappresentative di quattro diverse città analizzate. Tutte sono equamente presenti nel dataset.

ni_year=table(data$year)
print(ni_year)
## 
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48

La variabile ‘year’ presenta cinque diverse categorie equipopolate che rappresentano gli anni dal 2010 al 2014.

ni_month=table(data$month)
print(ni_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

La variabile ‘month’ è presente in 12 categorie rappresentative dei mesi dell’anno (1=Gennaio, 12=Dicembre), tutti presenti con 20 occorrenze ciascuno.

Nota: le variabili ‘city’, ‘month’ e ‘year’ sono tutte variabili n-modali dove n è il numero di categorie di ognuna, in quanto tutte le loro categorie sono equipopolate.

3. Variabili con maggiore variabilità e asimmetria

Considerando i risultati presentati in sezione 2, per individuare la variabile con maggior variabilità si confrontano i vari coefficienti di variazione che permettono di confrontare variabili diverse, presenatandone la variabilità in forma adimensionale e quindi confrontabile. La variabile con maggior variabilità risulta quindi essere ‘volume’, con un coefficiente di variazione che si attesta sul 53.71%. La variabile con la distribuzione più asimmetrica risulta ancora ‘volume’ con un coefficiente di asimmetria di Fisher(skewness) di 0.88, con lo 0 riferito ad una distribuzione gaussiana, per costruzione simmetrica. Questo porta ad avere la distribuzione della variabile più concentrata verso valori piccoli della variabile stessa, essendo asimmetrica positiva, e ad avere il valore della media superiore a quello della mediana, come si può notare nella tabella riassuntiva in sezione 1, colonna ‘volume’. A ulteriore conferma dell’asimmetria si può notare come il terzo quartile, che per definizione si lascia alle spalle il 75% dei dati ordinati, si attesti intorno al valore di 41, pur avendo un range che va da un minimo di 8.2 a un massimo di 83.5.

4. Creazione di classi per la variabile sales

Si procede lo studio del dataset facendo un focus sulla variable ‘sales’, dividendola in classi.

library(knitr)
library(kableExtra)
sales_cl=cut(data$sales, breaks=seq(75,425,35))
ni_sales=table(sales_cl)
fi_sales=(ni_sales/length(data$sales))
Ni_sales=cumsum(ni_sales)
Fi_sales=cumsum(fi_sales)
sales_matrix=cbind(ni_sales, round(fi_sales,3), Ni_sales, round(Fi_sales,3))
colnames(sales_matrix) <- c("ni", "fi", "Ni", "Fi")
kable(sales_matrix, format='html') %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:4, extra_css = "padding-right: 5px;")
ni fi Ni Fi
(75,110] 35 0.146 35 0.146
(110,145] 47 0.196 82 0.342
(145,180] 43 0.179 125 0.521
(180,215] 36 0.150 161 0.671
(215,250] 20 0.083 181 0.754
(250,285] 21 0.088 202 0.842
(285,320] 18 0.075 220 0.917
(320,355] 9 0.038 229 0.954
(355,390] 8 0.033 237 0.988
(390,425] 3 0.013 240 1.000

Dopo aver diviso la variabile in classi seguendo il criterio tale per cui si limitano le classi troppo vuote o troppo piene con un numero adeguato di bins, si genera la tabella delle frequenze con le seguenti colonne: frequenze assolute (ni), frequenze relative (fi), frequenze assolute comulate (Ni) e frequenze relative comulate (Fi). Dalla prima colonna della tabella delle frequenze si può notare nuovamente l’asimmetria positiva già chiara nelle analisi della sezione 2. Si possono anche individuare i quartili: la classe ‘117-131’ contiene il primo quartile, la classe ‘173-187’ la mediana e la classe ‘243-257’ il terzo quartile, come già visibile in tabella nella sezione 1.

library("ggplot2")

ggplot(data=data)+
  geom_bar(aes(x=sales_cl), stat='count', col='blue', fill='light blue')+
  theme_classic()+
  labs( x = "Classi variabile 'sales'",  y = "Conteggi variabile 'sales'", title = "Variabile 'sales' divisa in classi")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

#calcolo del coeff. di Gini
gini=function(matrix){
  J=length(matrix[,1])
  fi2=matrix[,2]^2
  g=1-sum(fi2)
  g_norm=g/((J-1)/J)
  return (g_norm)
}

gini_c=gini(sales_matrix)
cat("Coeff. di Gini normalizzato: ", round(gini_c,2))
## Coeff. di Gini normalizzato:  0.96

Dal grafico a barre e dal coefficiente di Gini normalizzato (valore 0: omogeneità, valore 1: eterogeneità) si nota come la distribuzione della variabile ‘sales’ (numero di vendite mensili) tenda ad assumere valori anche molto diversi tra loro (coeff. di Gini tende a 1). Dal grafico si può anche notare come la classe modale corrisponda all’intervallo di vendite tra 110 e 145. Dalla tendenza generale del grafico si nota come un numero di vendite molto elevato sia molto poco frequente, avendo la distribuzione una tendenza a prediligere numeri medio-bassi di vendite, come si nota dall’asimmetria positiva della distribuzione che si addensa maggiormente verso l’origine degli assi del grafico.

5. Calcolo della probabilità

La probabilità di estrarre una riga del dataset corrispondente alla città “Beaumont” si può dedurre tramite approccio classico, come numero di casi favorevoli diviso casi totali, con i casi favorevoli pari alle righe dove compare la città in esame e i casi totali pari al numero totale di righe del dataset. Allo stesso modo si possono calcolare la probabilità di estrarre una riga riportante il mese di luglio oppure il mese di dicembre relativo all’anno 2012. Il numero di casi favorevoli da inserire in ogni probabilità da analizzare è stato già calcolato in sezione 2 nella tabella delle occorrenze.

p_beau=60/nrow(data)
p_lugl=20/nrow(data)
p_dic_2012=4/nrow(data)

cat("P_Beaumont (%): ",round(p_beau*100,2) , "\n",
    "P_Luglio (%): ", round(p_lugl*100,2) , "\n",
    "P_Dic_2012 (%): ",round(p_dic_2012*100,2) , "\n")
## P_Beaumont (%):  25 
##  P_Luglio (%):  8.33 
##  P_Dic_2012 (%):  1.67

Si può notare che la probabilità relativa alla città è la stessa per tutte le città e lo stesso vale per la probabilità di ognuno dei mesi. Questo perchè il dataset è equipopolato in tal senso. Esaminando la probabilità relativa al mese di dicembre 2012, si può notare una tendenza interessante: si nota come ponenedo più di una condizione sull’evento che si vuole osservare, la sua probabilità diventi più piccola perchè può realizzarsi in meno casi favorevoli.

6. Creazione di nuove variabili

Si procede col creare una nuova colonna del dataset immobiliare che contenga il prezzo medio degli immobili espresso in dollari, ‘mean_price’, tramite divisione della variabile ‘volume’ per la variabile ‘sales’.

library(dplyr)
data=data %>%
  mutate(mean_price = as.integer(((data$volume/data$sales)*1000000)))

Si studia inoltre l’efficacia degli annunci di vendita tramite un indice appositamente creato , ‘sale_efficiency’, inteso come il complemento a uno della differenza tra il numero di annunci attivi e il numero di vendite effettuate normalizzata tramite divisione per il numero di annunci attivi. In tal modo la variabile sarà compresa tra 0 (minima efficacia degli annunci: no vendite) e 1 (massima efficacia: vendite=annunci attivi). In tal modo la si può leggere anche come una percentuale di efficienza semplicemente moltiplicandola per cento.

library(dplyr)
data=data %>%
  mutate(sale_effciency = round((1-((data$listings - data$sales)/(data$listings))),2))
kable(head(data), format='html', caption="<b><span style='color: black;'>Prime righe dataset<span></b>")%>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:10, extra_css = "padding-right: 2px;")
Prime righe dataset
city year month sales volume median_price listings months_inventory mean_price sale_effciency
Beaumont 2010 1 83 14.162 163800 1533 9.5 170626 0.05
Beaumont 2010 2 108 17.690 138200 1586 10.0 163796 0.07
Beaumont 2010 3 182 28.701 122400 1689 10.6 157697 0.11
Beaumont 2010 4 200 26.819 123200 1708 10.6 134095 0.12
Beaumont 2010 5 202 28.833 123100 1771 10.9 142737 0.11
Beaumont 2010 6 189 27.219 122800 1803 11.1 144015 0.10
kable(tail(data), format='html', caption="<b><span style='color: black;'>Ultime righe dataset<span></b>")%>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:10, extra_css = "padding-right: 2px;")
Ultime righe dataset
city year month sales volume median_price listings months_inventory mean_price sale_effciency
235 Wichita Falls 2014 7 150 18.672 102500 941 8.0 124480 0.16
236 Wichita Falls 2014 8 137 16.129 99600 973 8.3 117729 0.14
237 Wichita Falls 2014 9 110 12.015 90000 940 8.1 109227 0.12
238 Wichita Falls 2014 10 112 13.817 113300 905 7.8 123366 0.12
239 Wichita Falls 2014 11 96 11.308 108000 870 7.5 117791 0.11
240 Wichita Falls 2014 12 109 13.884 103800 821 7.0 127376 0.13
cat("Sale_efficiency \n",
    "Mean: ", round(mean(data$sale_effciency),2), "\n",
    "Standard Deviation: ", round(sd(data$sale_effciency),2), "\n"
    )
## Sale_efficiency 
##  Mean:  0.12 
##  Standard Deviation:  0.05

Come si può notare esaminando i primi e gli ultimi valori delle colonne ‘median_price’ e ‘mean_price’, definendo una ipotetica variabile inerente al prezzo di vendita della singola abitazione, questa avrebbe presumibilmente una distribuzione asimmetrica positiva, in quanto si nota come il prezzo medio sia sistematicamnete maggiore di quello mediano. Ciò indica che il prezzo di vendita delle case predilige valori medio-bassi rispetto al possibile range di valori, indicando inoltre la presenza di pochi valori estremamente alti. Inoltre, l’ispezione dell’indice ‘sale_efficiency’ suggerisce come l’efficacia degli annunci sia relativamente bassa, con una media del 12% portando ad un bilancio tra annunci aperti e vendite decisamente in negativo per il mercato immobiliare, denotando la necessità dell’adozione di strategie di mercato differenti.

7. Analisi condizionata

In questa sezione saranno presentate analisi condizionate tre le varie variabili per individuare andamenti utili all’azienda. Per facilitare la visualizzazione, si usano sempre gli stessi colori per le variabili esaminate declinate nelle varie analisi condizionate.

Analisi per città

Si inizia esaminando i dati raggruppati per città, stimando medie e deviazioni standard per le principali variabili.

library(dplyr)
library(knitr)
 
sales_city=data %>%
  group_by(city) %>%
  summarise(
    mean_sal = round(mean(sales),2),
    sd_sal = round(sd(sales),2),
    mean_vol=round(mean(volume),2),
    sd_vol=round(sd(volume),2), 
    m_med_p=round(mean(median_price),0),
    sd_med=round(sd(median_price),0),
    mean_lis=as.integer(mean(listings)),
    m_eff.index=round(mean(sale_effciency),2)
  )

kable(sales_city, format = "html", caption="<b><span style='color: black;'>Medie e dev. standard variabili in base alla città</span></b>") %>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:8, extra_css = "padding-right: 2px;")
Medie e dev. standard variabili in base alla città
city mean_sal sd_sal mean_vol sd_vol m_med_p sd_med mean_lis m_eff.index
Beaumont 177.38 41.48 26.13 6.97 129988 10105 1679 0.11
Bryan-College Station 205.97 84.98 38.19 17.25 157488 8852 1458 0.15
Tyler 269.75 61.96 45.77 13.11 141442 9337 2905 0.09
Wichita Falls 116.07 22.15 13.93 3.24 101743 11320 909 0.13
library(ggplot2)
library(gridExtra)
g1=ggplot(data=sales_city)+
  geom_col(aes(x=city, y=mean_sal), col=2, fill="orange")+
  theme_classic()+
  labs( x = "Città",  y = "Vendite", title = "Vendite medie per città")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))
  

g2=ggplot(data=sales_city)+
  geom_col(aes(x=city, y=mean_vol), fill="orange")+
  geom_text(aes(x = city, y = mean_vol, label = round(mean_vol, 2)), 
            vjust = +1.5, # Posiziona il testo leggermente sopra le barre
            color = "black") + 
   theme_classic()+
   labs( x = "Città",  y = "Introiti totali in milioni di dollari", title = "Guadagni di vendita medi per città")+
   theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

g3=ggplot(data=sales_city)+
  geom_col(aes(x=city, y=m_eff.index), col="darkblue", fill="skyblue")+
   theme_classic()+
   labs( x = "Città",  y = "Efficienza di vendita", title = "Efficienza vendita media \nper città")+
   theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

g4=ggplot(data=sales_city)+
  geom_col(aes(x=city, y=m_med_p), col="darkblue", fill="skyblue")+
   theme_classic()+
   labs( x = "Città",  y = "Prezzo mediano di vendita mediato", title = "Prezzo mediano medio \nper città")+
   theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))
grid.arrange(g1, g2, ncol = 2)

grid.arrange(g3, g4, ncol = 2)

Come si nota dai grafici, pur essendo Tyler la città con più vendite (e quindi più introiti totali), questa tendenza non è dovuta ad una maggiore efficacia di annunci: infatti l’elevato valore di annunci rispetto alle vendite comporta un valore dell’indice di efficienza di vendita che è il più basso tra le città indagate, anche se non è presente una grande differenza tra i vaori di efficenza per le varie città. Al contrario la politica di annunci risulta più efficace nella città di Bryan-College Station. Si può inoltre notare come Wichita Falls sia la città con meno rendimento rispetto alla vendita di immobili. C’è però da aggiungere che proprio Wichita Falls è anche la città che offre il numero di vendite (e quindi di introiti) più stabile, mentre Bryan-College Station è caratterizzata dalla più alta variabilità dei risultati. Infine, si può notare come passando dal grafico sulle vendite a quello sugli introiti vengano rispettate le classifiche delle città seppur con variazioni di livelli rispettivi. Questo è dovuto al fatto che gli introiti oltre che dal numero di vendite, sono influenzati anche dal prezzo di vendita che varia tra le varie città, come evidenziato dal prezzo mediano. Si nota anche come il prezzo mediano sia maggiormente variabile nella città di Wichita Falls, mentre sia relativamente più stabile a Bryan-College Station.

Analisi per anni

Si procede analizzando i dati raggruppati per anno.

library(dplyr)
sales_year=data %>%
  group_by(year) %>%
  summarise(
    mean_sal = round(mean(sales),2),
    sd_sal = round(sd(sales),2),
    mean_vol=round(mean(volume),2),
    sd_vol=round(sd(volume),2),  
    m_med_p=round(mean(median_price),0),
    sd_med=round(sd(median_price),0),
    mean_lis=as.integer(mean(listings)),
    m_eff.index=round(mean(sale_effciency),2)
  )

kable(sales_year,format = 'html', caption="<b><span style='color: black;'>Medie e dev.standard delle variabili su base annuale<span></b>") %>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:8, extra_css = "padding-right: 2px;")
Medie e dev.standard delle variabili su base annuale
year mean_sal sd_sal mean_vol sd_vol m_med_p sd_med mean_lis m_eff.index
2010 168.67 60.54 25.68 10.80 130192 21822 1826 0.10
2011 164.12 63.87 25.16 12.20 127854 21318 1849 0.09
2012 186.15 70.91 29.27 14.52 130077 21432 1776 0.11
2013 211.92 84.00 35.15 17.93 135723 21708 1677 0.13
2014 230.60 95.51 39.77 21.19 139481 25625 1560 0.16
library(ggplot2)
library(gridExtra)
g1=ggplot(data=sales_year, aes(x=year, y=mean_sal))+
  geom_point(col='red',size = 3)+
  geom_line(aes(x=year, y=mean_sal), size=1, col='orange')+
  theme_classic()+
  labs( x = "Anno",  y = "Vendite", title = "Vendite medie per anno")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))
## 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.
g2=ggplot(data=sales_year, aes(x=year, y=mean_vol))+
  geom_point(col='darkviolet', size=3)+
  geom_line(aes(x=year, y=mean_vol), size=1, col='violet')+
  theme_classic()+
  labs( x = "Anno",  y = "Introiti in milioni di dollari", title = "Introiti medi per anno")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

grid.arrange(g1, g2, ncol = 2)

g3=ggplot(data=sales_year, aes(x=year, y=m_eff.index))+
  geom_point(col='darkgreen', size=3)+
  geom_line(aes(x=year, y=m_eff.index), size=1, col='green')+
  theme_classic()+
  labs( x = "Anno",  y = "Efficienza annunci di vendita", title = "Efficienza media vendita \nper anno")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

g4=ggplot(data=sales_year, aes(x=year, y=m_med_p))+
  geom_point(col='darkblue', size=3)+
  geom_line(aes(x=year, y=m_med_p), size=1, col='skyblue')+
  theme_classic()+
  labs( x = "Anno",  y = "Prezzo mediano di vendita", title = "Prezzo mediano medio \nper anno")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

grid.arrange(g3, g4, ncol = 2)

Dall’analisi condizionata sui vari anni si nota come in media la vendita di immobili sia cresciuta nel tempo, con l’unica eccezione con decrescita segnata dall’anno 2011, aumentando di conseguenza gli introiti totali dell’azienda, pur notando un parallelo incremento della variabilità del numero di vendite e introiti. Si nota anche come l’efficienza degli annunci di vendita sia migliorata, ma questo è anche dovuto alla diminuzione del numero di annunci attivi medio nel tempo. Anche il prezzo mediano è salito nel corso degli anni, mantenendo una variabilità piuttosto stabile, con unca eccezione per l’anno 2014.

Analisi per mese

Infine si analizzano i dati su base mensile.

library(dplyr)
sales_month=data %>%
  group_by(month) %>%
  summarise(
    mean_sal = round(mean(sales),2),
    sd_sal = round(sd(sales),2),
    mean_vol=round(mean(volume),2),
    sd_vol=round(sd(volume),2),  
    m_med_p=round(mean(median_price),0),
    sd_med=round(sd(median_price),0),
    mean_lis=as.integer(mean(listings)),
    m_eff.index=round(mean(sale_effciency),2)
  )

kable(sales_month, format='html', caption="<b><span style='color: black;'>Medie e dev.standard delle variabili su base mensile<span></b>") %>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:8, extra_css = "padding-right: 2px;")
Medie e dev.standard delle variabili su base mensile
month mean_sal sd_sal mean_vol sd_vol m_med_p sd_med mean_lis m_eff.index
1 127.40 43.38 19.00 8.37 124250 25151 1647 0.08
2 140.85 51.07 21.65 10.09 130075 22823 1692 0.09
3 189.45 59.18 29.38 12.02 127415 23442 1756 0.12
4 211.70 65.40 33.30 14.52 131490 21458 1825 0.13
5 238.85 83.12 39.70 19.02 134485 18796 1823 0.14
6 243.55 95.00 41.30 21.08 137620 19231 1833 0.14
7 235.75 96.27 39.12 21.41 134750 21945 1821 0.14
8 231.45 79.23 38.01 18.05 136675 22488 1786 0.14
9 182.35 72.52 29.60 15.22 134040 24344 1748 0.11
10 179.90 74.95 29.08 15.13 133480 26358 1710 0.11
11 156.85 55.47 24.81 11.15 134305 24691 1652 0.10
12 169.40 60.75 27.09 12.57 133400 22810 1557 0.12
library(ggplot2)
library(gridExtra)

g1=ggplot(data=sales_month, aes(x=factor(month), y=mean_sal))+
  scale_x_discrete(labels = c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")) +
  geom_point(col='red', size=3)+
  geom_line(aes(x=month, y=mean_sal), size=1, col='orange')+
  theme_classic()+
  labs( x = "Mese",  y = "Vendite", title = "Vendite medie per mese")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))
  
g2=ggplot(data=sales_month, aes(x=factor(month), y=mean_vol))+
  scale_x_discrete(labels = c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")) +
  geom_point(col='darkviolet', size=3)+
  geom_line(aes(x=month, y=mean_vol), size=1, col='violet')+
  theme_classic()+
  labs( x = "Mese",  y = "Introiti in milioni di dollari", title = "Introiti medi per mese")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

grid.arrange(g1, g2, ncol = 2)

g3=ggplot(data=sales_month, aes(x=factor(month), y=m_eff.index))+
  scale_x_discrete(labels = c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")) +
  geom_point(col='darkgreen', size=3)+
  geom_line(aes(x=month, y=m_eff.index), size=1, col='green')+
  theme_classic()+
  labs( x = "Mese",  y = "Efficienza annunci di vendita", title = "Efficienza media per mese")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

g4=ggplot(data=sales_month, aes(x=factor(month), y=m_med_p))+
  scale_x_discrete(labels = c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")) +
  geom_point(col='darkblue', size=3)+
  geom_line(aes(x=month, y=m_med_p), size=1, col='skyblue')+
  theme_classic()+
  labs( x = "Mese",  y = "Prezzo mediano di vendita", title = "Prezzo mediano medio \nper mese")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))
grid.arrange(g3, g4, ncol = 2)

Dalle analisi condizionate per mese, si può notare come il mercato immobiliare sia più attivo nella stagione primavera-estate, raggiungendo un picco in estate. Questo si nota anche dal fatto che pur avendo un numero di annunci maggiore in tale stagione, l’efficienza di vendita si alza, suggerendo che nonostante il numero di annunci attivi sia in crescita, anche la domanda da parte dei clienti lo sia, portando ad un maggior numero di vendite. In corrispondenza alla maggior attività estiva, si raggiungono anche picchi di prezzo mediano. Va inoltre osservato come il prezzo mediano risulti meno variabile nei mesi di maggio e giugno, mentre abbia massima variabilità nei mesi autunno/inverno.

8. Creazione di visualizzazioni

Tramite alcune ulteriori visulaizzazioni si esplorano nuove relazione tra le variabili.

Studio distribuzione prezzo mediano e volume introiti

In queata sezione si vuole studiare la distribuzione del prezzo mediano e degli introiti tra le città usando un boxplot unito al grafico di distribuzione di densità della variabile.

library(ggplot2)
library(gghalves)
group_city=data%>%
  group_by(city)

ggplot(data=group_city)+
  geom_half_boxplot(aes(x=city, y=median_price), side='l', fill='skyblue')+
  geom_half_violin(aes(x=city, y=median_price), side='r', fill='lightgreen')+
  theme_linedraw()+
  labs( x = "Città",  y = "Prezzo mediano di vendita", title = "Distribuzione prezzo mediano di vendita per città")+
  theme(plot.title = element_text(face = "bold"))

ggplot(data=group_city)+
  geom_half_boxplot(aes(x=city, y=volume), side='l', fill='yellow')+
  geom_half_violin(aes(x=city, y=volume), side='r', fill='red')+
  theme_linedraw()+
  labs( x = "Città",  y = "Intriti totali di vendita in milioni di dollari", title = "Distribuzione introiti di vendita per città")+
  theme(plot.title = element_text(face = "bold"))

Ogni città è rappresentata da un simbolo grafico diviso in due. Sulla metà sinistra sono rappresentati il range interquartile, la mediana, massimo e minimi relativi (posti ripsettivamente sul valore pari al terzo/primo quartile +/-1.5 volte il range interquartile) e eventuali outliers, cioè valori che distano dal corpo centrale della distribuzione più di max e min relativi. Sulla metà di destra è raffigurata la distribuzione della variabile stessa per la determinata città. Dal grafico sul prezzo mediano si può notare come la distribuzione del prezzo mediano per Bryan-College Station sia la più stretta in termimi di corpo centrale dei dati, indicando come la variabilità del prezzo mediano per tale città sia la più bassa. La stessa città è anche quella con il prezzo mediano con valori più alti, ad indicare come il prezzo dell’immobile sia mediamente più elevato. Wichita Falls si conferma ancora una volta la meno remunerativa tra le città, anche considerando il prezzo del singolo immobile. Per concludere, le distribuzioni di prezzo mediano per Tyler e Wichita Falls risultano essere le più simmetriche, mentre le restanti presentano asimmetrie maggiori, non coerenti tra loro in tendenza, dato che in un caso c’è asimmetria positiva (Bryan-College Station), negativa nell’altro(Beaumont).

Il secondo grafico mostra la distribuzione della variabile ‘volume’ sulle varie città. Si nota come Tyler segni la città con introiti mediamete maggiori, dovuti sia ad un maggior numero di vendite che ad un prezzo mediano relativamente alto, data la seconda posizione nel plot precedente sul prezzo mediano. Si può inoltre osservare come le distribuzioni di introiti siano molto allungate sia per Bryan-College Station che per Tyler, ad indicare una elevata variabilità dei valori. La situazione si capovolge per Beaumont e Wichita Falls, aventi varibilità inferiore. Questo indica come le città più redditizie siano anche le più variabili in guadagni generati. Per conlcudere, si nota come le disrtibuzioni di introiti siano in media asimmetriche positive.

Studio vendite totali

Si studiano adesso le vendite totali per mese e città.

library(dplyr)
library(ggplot2)
library(gridExtra)

month.names=c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")

sales_tot_city=data %>%
  group_by(city) %>%
  summarise(sales_sum = round(sum(sales),2), volume_sum=round(sum(volume),0))

kable(sales_tot_city, format='html', caption = "<b><span style='color: black;'>Riepilogo delle Vendite totali per Città<span></b>") %>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:3, extra_css = "padding-right: 2px;")
Riepilogo delle Vendite totali per Città
city sales_sum volume_sum
Beaumont 10643 1568
Bryan-College Station 12358 2291
Tyler 16185 2746
Wichita Falls 6964 836
g1=ggplot(data=sales_tot_city)+
  geom_col(aes(x=city, y=sales_sum), col='blue', fill='lightblue')+
  theme_classic()+
  labs( x = "Città",  y = "Vendite totali", title = "Vendite totali per città")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

g3=ggplot(data=sales_tot_city)+
  geom_col(aes(x=city, y=volume_sum), col='darkviolet', fill='pink')+
  theme_classic()+
  labs( x = "Città",  y = "Introiti totali in milioni di dollari", title = "Introiti totali per città")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))


sales_tot_month=data %>%
  group_by(month) %>%
  summarise(sales_sum = round(sum(sales),2), volume_sum=round(sum(volume),2))
 
kable(sales_tot_month, factor='html', caption = "<b><span style='color: black;'>Riepilogo delle Vendite totali per mese<span></b>") %>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:3, extra_css = "padding-right: 2px;")
Riepilogo delle Vendite totali per mese
month sales_sum volume_sum
1 2548 380.02
2 2817 433.03
3 3789 587.69
4 4234 666.09
5 4777 794.04
6 4871 826.06
7 4715 782.44
8 4629 760.28
9 3647 591.98
10 3598 581.57
11 3137 496.14
12 3388 541.89
g2=ggplot(data=sales_tot_month)+
  geom_col(aes(x=format(month), y=sales_sum), col='blue', fill='lightblue')+
   scale_x_discrete(labels = month.names) +
  theme_classic()+
  labs( x = "Mese",  y = "Vendite totali", title = "Vendite totali per mese")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))
  
g4=ggplot(data=sales_tot_month)+
  geom_col(aes(x=format(month), y=volume_sum), col='darkviolet', fill='pink')+
   scale_x_discrete(labels = month.names) +
  theme_classic()+
  labs( x = "Mese",  y = "Introiti totali in milioni di dollari", title = "Introiti totali per mese")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

grid.arrange(g1, g2, ncol = 2)

grid.arrange(g3,g4, ncol=2)

sales_tot_city_month=data %>%
  group_by(city, month) %>%
  summarise(sales_sum_city_month=round(sum(sales),2))

sales_tot_city_month=sales_tot_city_month %>%
  group_by(city)%>%
  mutate(percent=round((sales_sum_city_month/sum(sales_sum_city_month)),2))

sales_tot_month_city=data %>%
  group_by(month,city,year)%>%
  summarise(sales_sum_month_city=round(sum(sales),2))

sales_tot_month_city=sales_tot_month_city %>%
   group_by(month)%>%
  mutate(percent=round((sales_sum_month_city/sum(sales_sum_month_city)),2))



#grafici a barre sovrapposte con le città sovrapposte

ggplot(data=sales_tot_month_city)+
  geom_col(aes(x=factor(month), y=sales_sum_month_city, fill=factor(city)), position='stack')+
   scale_fill_brewer(palette = "Paired")+
   scale_x_discrete(labels = month.names) +
  theme_classic()+
  labs( x = "Mesi",  y = "Vendite totali", title = "Vendite totali per mese in base alla città e all'anno", fill = "Città")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))+
  facet_wrap(~year, scales='free')+
  theme(panel.spacing.y = unit(1, "lines"), panel.spacing.x = unit(0.5, "lines"),axis.text.x = element_text(angle = 45, hjust = 1, size = 7))  # Regola spazio tra i pannelli

ggplot(data=sales_tot_month_city)+
  geom_col(aes(x=factor(month), y=sales_sum_month_city, fill=factor(city)), position='fill')+
   scale_fill_brewer(palette = "Paired")+
   scale_x_discrete(labels = month.names) +
  theme_classic()+
  labs( x = "Mesi",  y = "Vendite totali", title = "Vendite totali per mese in base alla città e all'anno-normalizzato", fill = "Città")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))+
  facet_wrap(~year, scales='free')+
  theme(panel.spacing.y = unit(1, "lines"), panel.spacing.x = unit(0.5, "lines"), axis.text.x = element_text(angle = 45, hjust = 1, size = 7))

Anche in questi grafici sulle vendite totali si ripropongono gli andamenti delle vendite medie per città e mese già esaminati in precedenza. Si nota sempre come Tyler sia la città con più vendite e come le vendite siano concentrate in generale nella stagione primavera/estate. Nal grafico a colonne normalizzato non è possibile confrontare in modo diretto l’ampiezza dei singoli contributi delle varie città per mesi diversi, in quanto i vari mesi hanno vendite totali diverse e per effetto della normalizzazione subiscono distorsioni. Si nota inoltre come in generale le vendite siano aumentate negli anni (si veda sezione successiva).

Studio di vendite ed introiti nel tempo

Si analizzano le vendite e gli introiti nel tempo.

library(dplyr)
sales_time=data %>%
  group_by(year, month) %>%
  arrange(year, month, city) %>%  
  summarize(
    tot_s=sum(sales),
    tot_vol=round(sum(volume),2)
  )

sales_time$month_year=as.Date(paste(sales_time$year, sales_time$month, "01", sep = "-"), format = "%Y-%m-%d")
kable(sales_time, format='html', caption="<b><span style='color: black;'>Vendite totali per periodo storico</span></b>") %>%
   kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(1:5, extra_css = "padding-right: 2px;")
Vendite totali per periodo storico
year month tot_s tot_vol month_year
2010 1 421 63.75 2010-01-01
2010 2 487 76.90 2010-02-01
2010 3 755 111.88 2010-03-01
2010 4 916 135.20 2010-04-01
2010 5 931 143.69 2010-05-01
2010 6 866 138.19 2010-06-01
2010 7 712 106.76 2010-07-01
2010 8 738 114.36 2010-08-01
2010 9 598 88.83 2010-09-01
2010 10 565 87.16 2010-10-01
2010 11 503 73.66 2010-11-01
2010 12 604 92.07 2010-12-01
2011 1 425 60.66 2011-01-01
2011 2 469 69.38 2011-02-01
2011 3 668 101.57 2011-03-01
2011 4 716 110.27 2011-04-01
2011 5 780 122.04 2011-05-01
2011 6 885 138.99 2011-06-01
2011 7 812 130.86 2011-07-01
2011 8 786 120.82 2011-08-01
2011 9 629 95.10 2011-09-01
2011 10 594 88.27 2011-10-01
2011 11 549 86.29 2011-11-01
2011 12 565 83.35 2011-12-01
2012 1 499 69.79 2012-01-01
2012 2 574 82.50 2012-02-01
2012 3 711 109.13 2012-03-01
2012 4 747 112.13 2012-04-01
2012 5 882 147.53 2012-05-01
2012 6 898 149.33 2012-06-01
2012 7 928 152.46 2012-07-01
2012 8 954 154.27 2012-08-01
2012 9 707 112.76 2012-09-01
2012 10 742 115.00 2012-10-01
2012 11 650 102.55 2012-11-01
2012 12 643 97.39 2012-12-01
2013 1 576 91.74 2013-01-01
2013 2 593 89.95 2013-02-01
2013 3 814 125.50 2013-03-01
2013 4 878 145.62 2013-04-01
2013 5 1057 184.47 2013-05-01
2013 6 1045 184.32 2013-06-01
2013 7 1127 188.55 2013-07-01
2013 8 1107 185.64 2013-08-01
2013 9 814 136.78 2013-09-01
2013 10 738 124.59 2013-10-01
2013 11 690 110.20 2013-11-01
2013 12 733 119.96 2013-12-01
2014 1 627 94.08 2014-01-01
2014 2 694 114.30 2014-02-01
2014 3 841 139.62 2014-03-01
2014 4 977 162.88 2014-04-01
2014 5 1127 196.32 2014-05-01
2014 6 1177 215.24 2014-06-01
2014 7 1136 203.80 2014-07-01
2014 8 1044 185.20 2014-08-01
2014 9 899 158.51 2014-09-01
2014 10 959 166.54 2014-10-01
2014 11 745 123.45 2014-11-01
2014 12 843 149.12 2014-12-01
library(ggplot2)

ggplot(data=sales_time, aes(x=month_year, y=tot_s))+
  geom_point(col='red', size=3)+
  geom_line(aes(x=month_year, y=tot_s), size=1, col='orange')+
  geom_smooth(method = "loess", se = FALSE, color = "red") +  
  theme_linedraw()+
  labs( x = "Tempo",  y = "Vendite totali", title = "Vendite totali nel tempo")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  theme(plot.title = element_text(face = "bold"))

ggplot(data=sales_time, aes(x=month_year, y=tot_vol))+
  geom_point(col='darkblue', size=3)+
  geom_line(aes(x=month_year, y=tot_vol), size=1, col='skyblue')+
  geom_smooth(method = "loess", se = FALSE, color = "blue") +  
  theme_linedraw()+
  labs( x = "Tempo",  y = "Introiti totali in milioni di dollari", title = "Introiti totali nel tempo", color = "Legenda")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+ 
  theme(plot.title = element_text(face = "bold"))

Il grafico in rosso rappresenta l’andamento delle vendite totali della società nel tempo, cioè la somma delle vendite in ogni città ad un dato tempo. Si nota un andamento altalenante: il grafico mostra massimi relativi nei punti corripondenti alla stagione estiva mentre mostra minimi relativi nella stagione invernale. La tendenza generale del grafico (curva rossa), mediando l’andamento oscillante su base stagionale, è di crescita nel tempo, ad indicare come le vendite effettuate siano aumentate negli anni. Bisogna comunque segnalare un’eccezione a questo andamento di crescita presente nell’anno 2011 che ha registrato un lieve calo delle vendite. Il grafico in blu mostra l’andamento temporale per gli introiti complessivi delle varie città nel tempo. Le tendenze già discusse si riporongono anche su tale variabile.

9. Conclusioni

Dalle analisi svolte sul mercato immobiliare texano si possono estrarre diverse conclusioni utili. Si è notato infatti, come il mercato immobiliare sia cresciuto negli anni dal 2010 a 2014, aumentando le vendite, gli incassi, l’efficienza delle vendite (vedi dopo) e anche il prezzo mediano di vendita, traducendo il tutto in un incasso generale crescene nel tempo. L’unica parentesi negativa è risultata l’anno 2011. Su base mensile il mercato presenta un andamento oscillante, con picchi di vendite e incassi nei mesi estivi e minimi in quelli invernali. Per studiare l’efficienza degli annunci di vendita si è messo a punto un indice con valore tra zero (annunci inadatti, invenduti) e uno (annunci di successo, vendite pari agli annunci aperti). Da tale indice si nota come la strategia di marketing possa essere notevomente migliorata, dato che in media solo un numero di annunci tra 10-20% viene venduto. Anche tale efficienza mostra miglioramenti nei mesi estivi e questo, unito ad un maggior numero di annunci, indica la presenza di una tendenza della popolazione a cercare casa soprattutto in estate, evidenziando possibili scenari di ulteriore investimento per le società immobiliari. Per quello che concerne le città, dallo studio risulta che Tyler sia la città più remunerativa, in contrapposaizione a Wichita Falls, la meno produttiva in termini economici. C’è però da aggiungere che la tendenza generale mostra come le città più remunerative, come Tyler e Bryan-College Satation siano anche quelle con variabilità di incasso maggiore, mentre Wichita Falls rappresenti la città con la minor variabilità in introiti. In ultima analisi, si è notato come le disrtibuzioni delle vendite, incassi e prezzo mediano tendano a privilegiare valori medio-bassi, mentre valori elevati sono più rari.