Analisi del Mercato Immobiliare del Texas

1. Analisi delle variabili

# import dati
dati <- read.csv("realestate_texas.csv", sep=",")
head(dati)
##       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
N = nrow(dati)

Nel dataset sono presenti 240 osservazioni e 8 variabili:

  1. city è una variabile qualitativa nominale
    analisi: distribuzione di frequenza, moda, indice di Gini

  2. year è una variabile quantitativa discreta
    analisi: distribuzione di frequenze, range

  3. month è una variabile quantitativa discreta, potrebbe essere considerata come una variabile categorica ordinale codificata
    analisi: distribuzione di frequenze

  4. sales è una variabile quantitativa discreta
    analisi: tutti gli indici di posizone, variabilità e forma

  5. volume è una variabile quantitativa continua
    analisi: tutti gli indici di posizione, variabilità e forma

  6. median_price è una variabile quantitativa continua
    analisi: tutti gli indici di posizione, variabilità e forma

  7. listings è una variabile quantitativa discreta
    analisi: tutti gli indici di posizone, variabilità e forma

  8. months_inventory è una variabile quantitativa continua
    analisi: tutti gli indici di posizione, variabilità e forma

2. Indici di posizione, variabilità e forma

attach(dati)
# funzione per Coefficiente di Variazione
CV <-function(x){
  return( sd(x)/mean(x) * 100 )
}
# libreria per indici di forma
library(moments)

city

table(city)
## city
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60

La variabile city ha 4 modalità, le frequenze assolute sono uguali su tutte le modalità (equidistribuzione delle modalità), non è quindi necessario calcolare Moda e Indice Etereogenità di Gini.

year

table(year)
## year
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48
range(year)
## [1] 2010 2014

La variabile year ha un range dal 2010 al 2014, con 5 modalità equamente distribuite.

month

table(month)
## 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 ha 12 modalità equamente distribuite.

sales

# indici di posizione
summary(sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    79.0   127.0   175.5   192.3   247.0   423.0
# indici di variabilità
## Range
max(sales)-min(sales)
## [1] 344
## Range Interquartile
IQR(sales)
## [1] 120
## Varianza
var(sales) 
## [1] 6344.3
## Deviazione Standard
sd(sales)
## [1] 79.65111
## CV
CV(sales)
## [1] 41.42203
# indici di forma
skewness(sales)
## [1] 0.718104
kurtosis(sales)-3
## [1] -0.3131764

Il numero di vendite va da un minimo di 79 a un massimo di 423, con una media di 192,3.
IQR di 120, con sd 79,65. CV 41,42. Variabilità moderata.
Distribuzione Platicurtica con Asimmetria positiva.

volume

# indici di posizione
summary(volume)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   8.166  17.660  27.062  31.005  40.893  83.547
# indici di variabilità
## Range
max(volume)-min(volume)
## [1] 75.381
## Range Interquartile
IQR(volume)
## [1] 23.2335
## Varianza
var(volume) 
## [1] 277.2707
## Deviazione Standard
sd(volume)
## [1] 16.65145
## CV
CV(volume)
## [1] 53.70536
# indici di forma
skewness(volume)
## [1] 0.884742
kurtosis(volume)-3
## [1] 0.176987

Il valore totale delle vendite (in milioni di $) vanno da un minimo di 8,17 a un massimo di 83,55, con una media di 31.
IQR di 23,23, con sd 16,65. CV 53,70. Variabilità moderata.
Distribuzione Leptocurtica con Asimmetria positiva.

median_price

# indici di posizione
summary(median_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   73800  117300  134500  132665  150050  180000
# indici di variabilità
## Range
max(median_price)-min(median_price)
## [1] 106200
## Range Interquartile
IQR(median_price)
## [1] 32750
## Varianza
var(median_price) 
## [1] 513572983
## Deviazione Standard
sd(median_price)
## [1] 22662.15
## CV
CV(median_price)
## [1] 17.08218
# indici di forma
skewness(median_price)
## [1] -0.3645529
kurtosis(median_price)-3
## [1] -0.6229618

Il prezzo mediano di vendita (in $) va da un minimo di 73.800 a un massimo di 180.000, con una media di 132.665.
IQR di 32.750, con sd 22.662. CV 17. Variabilità bassa/moderata.
Distribuzione Platicurtica con Asimmetria negativa.

listings

# indici di posizione
summary(listings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     743    1026    1618    1738    2056    3296
# indici di variabilità
## Range
max(listings)-min(listings)
## [1] 2553
## Range Interquartile
IQR(listings)
## [1] 1029.5
## Varianza
var(listings) 
## [1] 566569
## Deviazione Standard
sd(listings)
## [1] 752.7078
## CV
CV(listings)
## [1] 43.30833
# indici di forma
skewness(listings)
## [1] 0.6494982
kurtosis(listings)-3
## [1] -0.79179

Il numero totale di annunci attivi va da un minimo di 743 a un massimo di 3.296, con una media di 1.738.
IQR di 1029, con sd 752,7. CV 43,3. Variabilità moderata.
Distribuzione Platicurtica con Asimmetria positiva.

months_inventory

# indici di posizione
summary(months_inventory)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.400   7.800   8.950   9.193  10.950  14.900
# indici di variabilità
## Range
max(months_inventory)-min(months_inventory)
## [1] 11.5
## Range Interquartile
IQR(months_inventory)
## [1] 3.15
## Varianza
var(months_inventory) 
## [1] 5.306889
## Deviazione Standard
sd(months_inventory)
## [1] 2.303669
## CV
CV(months_inventory)
## [1] 25.06031
# indici di forma
skewness(months_inventory)
## [1] 0.04097527
kurtosis(months_inventory)-3
## [1] -0.1744475

Il tempo per vendere le inserzioni correnti (in mesi) va da un minimo di 3,4 a un massimo di 14,9, con una media di 9,19.
IQR di 3,15, con sd 2,3. CV 25. Variabilità moderata.
Distribuzione Platicurtica con Asimmetria positiva.

3. Variabili con maggiore variabilità e asimmetria

La variabile con maggiore variabilità è volume in quanto, confrontando i Coefficienti di Variabilià, è quella con CV maggiore (53,7).

Anche la varibile con maggiore asimmetria è volume in quanto, confrontando i valori assoluti dell’Indice di Asimmetria di Fisher, è quella con skewness maggiore (0,88).

4. Creazione di classi per una variabile quantitativa

Analisi variabile sales

# numero di classi (metodo della radice quadrata)
num_classi <- ceiling(sqrt(N))

# calcolo approssimativo dell'ampiezza
range_sales <- max(sales) - min(sales)
ampiezza_classe <- ceiling(range_sales / num_classi)

# definizione degli estremi delle classi
min_sales <- min(sales)
max_sales_teorico <- min_sales + (num_classi * ampiezza_classe)
breaks <- seq(min_sales, max_sales_teorico, by = ampiezza_classe)

# divisione della variabile 'sales' in classi
sales_classi <- cut(sales, breaks = breaks, include.lowest = TRUE)

# calcolo frequenze 
ni <- table(sales_classi) # assolute
fi <- ni/N                # relative
Ni <- cumsum(ni)          # assolute cumulative
Fi <- Ni/N                # relative cumulative

sales_frequenze <-cbind(ni,fi,Ni,Fi)
sales_frequenze
##           ni          fi  Ni        Fi
## [79,101]  24 0.100000000  24 0.1000000
## (101,123] 28 0.116666667  52 0.2166667
## (123,145] 30 0.125000000  82 0.3416667
## (145,167] 31 0.129166667 113 0.4708333
## (167,189] 25 0.104166667 138 0.5750000
## (189,211] 20 0.083333333 158 0.6583333
## (211,233] 12 0.050000000 170 0.7083333
## (233,255] 16 0.066666667 186 0.7750000
## (255,277] 10 0.041666667 196 0.8166667
## (277,299] 18 0.075000000 214 0.8916667
## (299,321]  6 0.025000000 220 0.9166667
## (321,343]  7 0.029166667 227 0.9458333
## (343,365]  5 0.020833333 232 0.9666667
## (365,387]  4 0.016666667 236 0.9833333
## (387,409]  3 0.012500000 239 0.9958333
## (409,431]  1 0.004166667 240 1.0000000
library(ggplot2)
# Visualizzazione con grafico a barre
ggplot(data = dati)+
  geom_bar(    
    aes(x=sales_classi),
    stat="count",
    col="black",
    fill="darkblue")+
  labs(x="Numero vendite in classi",
       y="Frequenze assolute",
       title="Distribuzione delle Vendite")+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

# funzione per l'indice di Gini
gini.index <- function(x){
  ni = table(x)
  fi = ni/length(x)
  fi2 = fi^2
  J = length(table(x))
  
  gini = 1-sum(fi2)
  gini.norm = gini/((J-1)/J)
  
  return(gini.norm)
}

gini.index(sales_classi)
## [1] 0.9702593

Anche con la suddivisione in classi la distribuzione di sales risulta visivamente con Asimmetria positiva.
L’indice di Gini indica una alta etereogenità infatti, come si vede anche dal grafico, le classi hanno frequenze molto diverse.

5. Calcolo della probabilità

Probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”

city_ni = table(city)
city_ni["Beaumont"]/N
## Beaumont 
##     0.25

Probabilità che riporti il mese di Luglio

month_ni = table(month)
month_ni["7"]/N
##          7 
## 0.08333333

Probabilità che riporti il mese di dicembre 2012

distr_y_m = table(year,month)
distr_y_m["2012","12"]/N
## [1] 0.01666667

6. Creazione di nuove variabili

mean_price

dati$mean_price = round((volume*1000000)/sales)
summary(dati$mean_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   97010  132939  156589  154320  173915  213234

Il prezzo medio di vendita va da un minimo di 97k $ ad un massimo di 21,3k $ con media di 15,4k $.

listings_effectiveness

Calcoliamo l’efficacia dell’annuncio come tasso di conversioni degli annunci (rapporto tra numero annunci e vendite). Un tasso di conversione più alto indica che gli annunci sono efficaci nell’attrarre acquirenti e finalizzare le vendite.

dati$listings_effectiveness = sales/listings*100
summary(dati$listings_effectiveness)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   5.014   8.980  10.963  11.874  13.492  38.713

Il tasso di conversione degli annunci va da un minimo del 5% ad un massimo del 38,7% con una media dell’11,9%.

7. Analisi condizionata

library(dplyr)
## 
## 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

city

sales_by_city <- 
  dati %>% 
  group_by(city) %>% 
  summarise(media=mean(sales),
            devst=sd(sales))
sales_by_city
## # A tibble: 4 × 3
##   city                  media devst
##   <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
# Creazione del grafico a barre per la media delle vendite per città
ggplot(sales_by_city, aes(x = city, y = media)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  geom_text(aes(label = round(media, 0)), vjust = -0.3, size = 3) +   labs(title = "Media del numero totale Vendite per Città",
       x = "Città",
       y = "Media totale Vendite") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

Tyler è la città con il maggior numero di vendite medie.

year

volume_by_year <- 
  dati %>% 
  group_by(year) %>% 
  summarise(media=mean(volume),
            devst=sd(volume))
volume_by_year
## # A tibble: 5 × 3
##    year media devst
##   <int> <dbl> <dbl>
## 1  2010  25.7  10.8
## 2  2011  25.2  12.2
## 3  2012  29.3  14.5
## 4  2013  35.2  17.9
## 5  2014  39.8  21.2
# Creazione del grafico a barre per la media delle volume per anno
ggplot(volume_by_year, aes(x = year, y = media)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  geom_text(aes(label = round(media, 2)), vjust = -0.3, size = 3) +   labs(title = "Media del valore totale delle vendite (in milioni di dollari)",
       x = "Anno",
       y = "Media valore totale Vendite") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

Il valore medio delle vendite è in crescita negli anni.

month

volume_by_month <- 
  dati %>% 
  group_by(month) %>% 
  summarise(media=mean(volume),
            devst=sd(volume))
volume_by_month
## # A tibble: 12 × 3
##    month media devst
##    <int> <dbl> <dbl>
##  1     1  19.0  8.37
##  2     2  21.7 10.1 
##  3     3  29.4 12.0 
##  4     4  33.3 14.5 
##  5     5  39.7 19.0 
##  6     6  41.3 21.1 
##  7     7  39.1 21.4 
##  8     8  38.0 18.0 
##  9     9  29.6 15.2 
## 10    10  29.1 15.1 
## 11    11  24.8 11.2 
## 12    12  27.1 12.6
mesi <- c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic")

ggplot(volume_by_month, aes(x = factor(month, levels = 1:12), y = media)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  geom_text(aes(label = round(media, 2)), vjust = -0.3, size = 3) +
  labs(title = "Media del valore totale delle vendite (in milioni di dollari)",
       x = "Mese",
       y = "Media valore totale Vendite") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_x_discrete(labels = mesi, breaks = factor(1:12, levels = 1:12))

Tra maggio e agosto si realizza il valore totale di vendite maggiore.

8. Visualizzazioni con ggplot2

ggplot(data = dati)+
  geom_boxplot(aes(
    x=city,
    y=median_price),
    fill="lightblue")+
  labs(title = "Prezzo mediano (in dollari) per Città",
       x = "Città",
       y = "Prezzo mediano") +
  theme_minimal()

Il prezzo mediano è più alto a Bryan-College Station e più basso a Wichita Falls.
In tutte le città tranne Tyler ci sono dei valori anomali.

# calcola il totale delle vendite per mese e città
total_sales_by_city_month <- dati %>%
  group_by(city, month) %>%
  summarise(total_sales = sum(sales))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
# crea il grafico a barre affiancate
ggplot(total_sales_by_city_month, aes(x = factor(month, levels = 1:12), y = total_sales, fill = city)) +
  geom_bar(stat = "identity", position = "dodge") +
  scale_x_discrete(labels = mesi) +
  labs(
    title = "Totale Vendite per Mese e Città",
    x = "Mese",
    y = "Totale Vendite",
    fill = "Città"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Le vendite sono maggiori tra maggio e agosto, ma segmentando per città vediamo che a Wichita Falls e Beaumant sono più stabili durante l’anno, mentre a Tyler e Bryan College Station hanno dei picchi nel periodo estivo.

# nuova colonna data che combina anno e mese
dati <- dati %>%
  mutate(date = as.Date(paste(year, month, "01", sep = "-")))
# calcola totale vendite per anno-mese
sales_by_month_overall <- dati %>%
  group_by(date) %>% 
  summarise(total_sales = sum(sales))

# crea il line chart
ggplot(sales_by_month_overall, aes(x = date, y = total_sales)) +
  geom_line(color = "darkgreen") +
  geom_point(color = "darkgreen") +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  labs(
    title = "Andamento delle Vendite nel Tempo",
    x = "Anno",
    y = "Totale Vendite"
  ) +
  theme_minimal()

Le vendite hanno un andamento stagionale e hanno un trend di crescita nel tempo.

ggplot(dati, aes(x = city, y = volume, fill = factor(year))) +
  geom_boxplot() +
  labs(
    title = "Distribuzione del Valore Totale delle Vendite per Città e Anno",
    x = "Città",
    y = "Valore Totale Vendite",
    fill = "Anno"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set3") 

La distribuzione del valore totale di vendite è abbastanza stabile negli anni (considerando la media) per Wichita Falls, in leggera crescita per Beaumont, mentre è in crescita più significativa per Tyler e Bryan-College Station.
Per quest’ultima città si nota anche che l’IQR aumenta visibilmente dal 2012, ad indicare una maggiore variabilità del valore totale delle vendite.

# calcola il totale delle vendite per mese e città
total_sales_by_city_month <- dati %>%
  group_by(month, city) %>%
  summarise(total_sales = sum(sales))
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
# calcola il totale delle vendite per ogni mese
total_sales_by_month <- total_sales_by_city_month %>%
  group_by(month) %>%
  summarise(monthly_total = sum(total_sales))

# unisce i due data frame per poter calcolare le proporzioni
normalized_sales <- total_sales_by_city_month %>%
  left_join(total_sales_by_month, by = "month") %>%
  mutate(proportion = total_sales / monthly_total)

# crea il grafico a barre sovrapposte normalizzato
ggplot(normalized_sales, aes(x = factor(month, levels = 1:12), y = proportion, fill = city)) +
  geom_bar(stat = "identity", position = "stack") +
  scale_y_continuous(labels = scales::percent) + 
  scale_x_discrete(labels = mesi) +
  labs(
    title = "Proporzione delle Vendite nei Mesi per Città",
    x = "Mese",
    y = "Proporzione delle Vendite",
    fill = "Città"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Wichita Falls risulta la città con meno vendite durante l’anno, mentre Tyler risulta quella con maggiori vendite.

# crea il line chart
ggplot(dati, aes(x = date, y = listings_effectiveness, color = city)) +
  geom_line() +
  geom_point() +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") + 
  labs(
    title = "Andamento dell'Efficacia delle Inserzioni nel Tempo per Città",
    x = "Anno",
    y = "Tasso conversione delle Inserzioni in %",
    color = "Città"
  ) +
  theme_minimal() +
  theme(legend.position = "top") 

Brian-College Station è la città dove le inserzioni hanno più efficacia.

9. Conclusioni

Il valore medio delle vendite è in crescita negli anni, e tra maggio e agosto si realizza il valore totale di vendite maggiore.

Il numero di vendite ha un andamento stagionale e ha un trend di crescita nel tempo. Anche numero di vendite è maggiore tra maggio e agosto ma, segmentando per città, vediamo che a Wichita Falls e Beaumant sono più stabili durante l’anno, mentre a Tyler e Bryan College Station ci sono dei picchi nel periodo estivo.
Wichita Falls risulta la città con meno numero vendite durante l’anno, mentre Tyler risulta quella con maggior numero di vendite.

Il prezzo mediano è più alto a Bryan-College Station e più basso a Wichita Falls.

Brian-College Station è la città dove le inserzioni hanno più efficacia.