INTRODUZIONE

In questo progetto svolgo un analisi esplorativa del mercato immobiliare del Texas.

ANALISI

library(ggplot2)
library(moments)
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
library(zoo)
## 
## Caricamento pacchetto: 'zoo'
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     as.Date, as.Date.numeric
setwd("C:/Users/Utente/OneDrive/Desktop")

## Caricare il dataset in R

dati <- read.csv("realestate_texas.csv", sep=",")

DESCRIZIONE VARIABILI

Le variabili presenti nel dataset sono: “year” è una variabile quantitativa continua ma da trattare come qualitativa ordinale mentre “month” è una variabilequalitativa nominale codificata in numeri ed identificano rispettivamente l’anno e il mese di vendita della proprietà. Nella maggior parte dei casi serviranno a confrontare tra loro periodi di tempo diversi o le stesse variabili ma confrontate nello stesso periodo di tempo per rendere il confronto significativo. La variabile “city” identifica la città dove si trova la proprietà e perciò dove è stata venduta; è una variabile qualitativa nominale. Con questa informazione si possono fare analisi riguardanti tutte le altre variabili permettendoci così di confrontare ad esempio il tempo necessario per la vendita di tutte le proprietà (o la quantità di proprietà in vendita) in diverse città a parità di periodo, idem per il numero totale o il volume totale delle vendite, ed anche per confrontare il prezzo mediano delle proprietà tra diverse città. Queste altre variabili sono contenute in “sales” (numero totale di vendite), “volume” (valore totale in milioni di dollari delle vendite), “median_price” (prezzo mediano di vendita in dollari), “listings” (numero totale di annunci attivi) e “months_inventory” (quantità di tempo necessaria per vendere tutte le inserzioni correnti, espresso in mesi). Tutte queste sono variabili quantitative di cui “sales” e “listings” sono discrete e su scali di intervalli mentre le altre sono continue e su scala di rapporti. Su quest’ultime si possono studiare, tramite l’analisi statistica, le varie dipendenze tra loro; per fare un esempio semplice si potrebbe voler vedere se la velocità di vendita varia con il prezzo mediano.

INDICI DI POSIZIONE, VARIABILITà E FORMA

summary(dati)
##      city                year          month           sales      
##  Length:240         Min.   :2010   Min.   : 1.00   Min.   : 79.0  
##  Class :character   1st Qu.:2011   1st Qu.: 3.75   1st Qu.:127.0  
##  Mode  :character   Median :2012   Median : 6.50   Median :175.5  
##                     Mean   :2012   Mean   : 6.50   Mean   :192.3  
##                     3rd Qu.:2013   3rd Qu.: 9.25   3rd Qu.:247.0  
##                     Max.   :2014   Max.   :12.00   Max.   :423.0  
##      volume        median_price       listings    months_inventory
##  Min.   : 8.166   Min.   : 73800   Min.   : 743   Min.   : 3.400  
##  1st Qu.:17.660   1st Qu.:117300   1st Qu.:1026   1st Qu.: 7.800  
##  Median :27.062   Median :134500   Median :1618   Median : 8.950  
##  Mean   :31.005   Mean   :132665   Mean   :1738   Mean   : 9.193  
##  3rd Qu.:40.893   3rd Qu.:150050   3rd Qu.:2056   3rd Qu.:10.950  
##  Max.   :83.547   Max.   :180000   Max.   :3296   Max.   :14.900

Vediamo un veloce riassunto dei vari indici di posizione ed eventuali distribuzioni di frequenza.

Nel caso della variabile “city” i risultati della funzione summary non sono significativi.

freq_ass_city <- table(dati["city"])

Infatti le frequenze assolute sono tutte pari ma perchè la chiava del data frame è la coppia anno-mese e perciò riferendosi allo stesso perdiodo di 60 mesi ci saranno 60 righe di dati per ogni località.

Riguardo la variabile “year” ci interessa solo il minimo e il massimo perchè ci dà un idea del periodo a cui si riferiscono i dati cioè dal 2010 al 2014. La stessa info dalla variabile “month” potrebbe sviare, è necessario controllare il dateframe per assicurarsi che il periodo sia da gennaio 2010 a dicembre 2014 (questo perchè come detto prima queste due variabili vanno lette in coppia anno-mese).

Per tutte le altre variabili gli indici di posizione sono significativi, è possibile farsi un idea dei range che contangono tutti i valori e notando le differenze tra media e mediana vediamo che nel caso delle variabili “median_price”, “listings” e ” months_inventory” i valori sono molto simili e ciò suggerisce che non ci sono valori troppo alti o troppo bassi rispetto agli altri (outliers) o comunque che i valori sono distribuiti in maniera omogenea (poi andremo più a fondo stufiando la variabilità); mentre per la variabile “volume” e “sales” i due valori si discostano, anche se non di molto, ma potrebbe suggerire la presenza di outliers di valore alto visto che la media è maggiore alla mediana.

In ogni caso sarebbe utili dividere quest’ultime variabili in classe e vederne la distribuzione di frequenza in funzione della località (lo faremo più avanti).

VARIABILITà E ASIMMETRIA

Funzione per coefficiente di variazione

CV <- function(x){
  return(sd(x)/mean(x)*100)
  }

variables <- c("sales", "volume", "median_price", "listings", "months_inventory")


for (i in variables) {
  var <- assign(paste0("var_", i), var(dati[[i]]))
  print(paste0("Varianza di ", i, " = ", var))
  dev_std <- assign(paste0("dev_std_", i), sd(dati[[i]]))
  print(paste0("Deviazione Standard di ", i, " = ", dev_std))
  coeff_var <- assign(paste0("coeff_var_", i), CV(dati[[i]]))
  print(paste0("Coefficiente di Variazione di ", i, " = ", coeff_var))
  as_index <- assign(paste0("as_index_", i), skewness(dati[[i]]))
  print(paste0("Indice di Asimmetria di ", i, " = ", as_index))
}
## [1] "Varianza di sales = 6344.29951185495"
## [1] "Deviazione Standard di sales = 79.6511111777793"
## [1] "Coefficiente di Variazione di sales = 41.4220296482492"
## [1] "Indice di Asimmetria di sales = 0.718104024884959"
## [1] "Varianza di volume = 277.270692404027"
## [1] "Deviazione Standard di volume = 16.6514471564494"
## [1] "Coefficiente di Variazione di volume = 53.7053586805415"
## [1] "Indice di Asimmetria di volume = 0.884742026325995"
## [1] "Varianza di median_price = 513572983.089261"
## [1] "Deviazione Standard di median_price = 22662.148686505"
## [1] "Coefficiente di Variazione di median_price = 17.0821825732064"
## [1] "Indice di Asimmetria di median_price = -0.364552878177372"
## [1] "Varianza di listings = 566568.966091353"
## [1] "Deviazione Standard di listings = 752.707756098841"
## [1] "Coefficiente di Variazione di listings = 43.3083275909432"
## [1] "Indice di Asimmetria di listings = 0.649498226273971"
## [1] "Varianza di months_inventory = 5.30688912133891"
## [1] "Deviazione Standard di months_inventory = 2.30366862229334"
## [1] "Coefficiente di Variazione di months_inventory = 25.0603059264982"
## [1] "Indice di Asimmetria di months_inventory = 0.040975265871081"

La variabile con la più alta variabilità è “volume” perchè calcolando il coeffieciente di variazione di tutte le variabili (escluse “city”; “year” e “month” per ovvi motivi) risulta quella ad averlo maggiore. Questo significa che la variabile “volume” è quella che ha valori più sparsi rispetto alle altre e perciò è caratterizzata da una minore omogeneità. La variapibile con maggior asimmetria è sempre “volume” poichè è quella con il coefficienti di asimmetria che si discosta di più da 0 (condizione di simmetria), “volume è asimmetrica positiva (l’unica asimmetrica negativa invece è”median_price”). Questo significa che nella variabile “volume” la maggior parte dei dati tenderà ad essere a sinistra della media perciò di valore minore alla media; poichè è una distribuzione “sbilanciata” a sinistra.

CLASSI VARIABILE QUANTITATIVA

## Divido median_price che va da 73500 a 180000 in classi da 70000 a 180000 con
## un passo da 10000 e lo aggiungo come colonna al dataset

dati$median_price_cl <- cut(dati$median_price, breaks = seq(70000,180000,10000))
median_price_cl <- table(dati$median_price_cl)

## Per etichetta asse x

labels_x = seq(70000,180000,10000)
labels <- paste0("(", labels_x[-length(labels_x)]/1000, "k-", labels_x[-1]/1000, "k]")

g1 <- ggplot(data = dati)+
  geom_bar(aes(x = median_price_cl),
           stat = "count",
           col = "black",
           fill = "gold")+
  labs(title = "Distribuzione della mediana dei prezzi di vendita per classi",
       x = "Suddivisione in classi mediana dei prezzi di vendita delle proprietà",
       y = "Numero di proprietà vendute appartenenti alla suddivisone")+
  scale_y_continuous(breaks = seq(0,50,5))+
  scale_x_discrete(labels = labels)+
  theme_classic()

print(g1)

## Funzione per calcolo dell'indice di eterogeneità 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.normalized = gini/((j-1)/j)
  return(gini.normalized)
}

## Calcolo Gini

gini_index_median_price <- gini.index(dati$median_price)

L’indice di Gini della variabile “median_price” risulta 1 perciò praticamente la variabile è caratterizzata da variabilità massima cioè equidistribuzione.

Probabilità: le calcolo facendo il numero in cui la variabile compare nella rispettiva colonna fratto la lunghezza (numero di elementi) della colonna.

prob_city <- sum(dati$city == "Beaumont")/length(dati$city)
prob_month <- sum(dati$month == 7)/length(dati$month)
prob_year <- sum(dati$year == 2012)/length(dati$year)

## Colonna prezzo medio degli immobili

dati$mean_price <- (dati$volume/dati$sales)*1000000

## Colonna efficacia annunci di vendita

dati$ad_effectiveness <- (dati$sales/dati$listings)

E’ stata creata la variabile “ad_effectiveness” calcolata come rapporto dei campi “sales” (= numero totale di vendite) e “listings” (= numero totale di annunci attivi). Questo fattore perciò è adimensionale e mostra quante sono le vendite in rapporto agli annunci attivi, cioè una sorta di percentuale di vendita. Maggiore sarà “ad_effectiveness” maggiore sarà l’efficacia degli annunci di vendita.

g2 <- ggplot(dati, aes(x = city, y = ad_effectiveness))+
  geom_boxplot()+
  labs(x = "Città", y = "Efficcacia degli annunci di vendita", title = "Efficacia annunci di vendita per città")

print(g2)

Come si può notare dai boxplot accostati le città dove in media gli annunci sono più efficaci sono Bryan-College Station e Wichita Falls con una media simile intorno al 12.5% (0.125). La differenza tra la due e la variabilità maggiore nella prima, infatti il boxplot in questa risulta più “largo”.

# Variabili di riferimento

group_vars <- c("city", "year", "month")

# Variabili da analizzare

measure_vars <- c("median_price", "sales", "volume")

# Creo delle liste per salvare risultati e grafici

summary_list <- list()
plot_list <- list()

for (i in measure_vars) {
  
  summary_list[[i]] <- list()
  plot_list[[i]] <- list()
  
  for (j in group_vars) {
    
    # Summary
    summary_df <- dati %>%
      group_by(.data[[j]]) %>%
      summarize(
        media = mean(.data[[i]]),
        dev_st = sd(.data[[i]]))
    
    summary_list[[i]][[j]] <- summary_df
    
    # Grafici
    graphs <- ggplot(summary_df, aes_string(x = j, y = "media")) +
      geom_point(size = 3, color = "steelblue") +
      geom_errorbar(aes(ymin = media - dev_st, ymax = media + dev_st),
                    width = 0.2, color = "steelblue") +
      theme_minimal() +
      labs(
        title = paste("Media e Deviazione Standard di", i, "per", j),
        x = j,
        y = paste("Media", i, "± SD")
      )
    
    # Correzione asse x per i mesi
    if (j == "month") {
      graphs <- graphs + scale_x_discrete(limits = as.character(1:12), labels = 1:12)
    }
    
    plot_list[[i]][[j]] <- graphs
    
    print(graphs)
  }
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Graficamente ho rappresentato media e deviazione standard tramite gli interval plot.

La città con il prezzo medio di vendita maggiore è Bryan-College Station, mentre la città col prezzo medio di vendita minore è Wichita Falls, questa è anche caratterizzata dalla maggiore variabilità del prezzo. Il 2014 è l’anno caratterizzato da una media prezzi maggiore ed anche da una variabilità dei prezzi maggiore. Mentre in media i prezzi maggiori si sono registrati nel mese di giugno con il mese di ottobre come mese con prezzi più variabili.

La città in cui in media si vendono più proprietà è Tyler mentre la città in cui la variabilità del numero di vendite è maggiore è Bryan-College Station. L’andamento delle vendite medie negli anni sembra mostrare un trend di crescita con il 2014 con il maggior numero di vendite e la maggiore variabilità. Il periodo dell’anno in cui si registrano più vendite è quello estivo da maggio ad agosto.

E’ stato poco fa notato che in media la maggior parte delle vendite è registratto nella città di Tyler, come si poteva ipotizzare detiene anche il primato di entrate dovute alle vendite. Si nota anche qui l’andamento in crescita delle entrate negli anni riconfermando il 2014 come anno con più entrate e maggiore variabilità. E infine come ci aspettavamo si riconferma il periodo estivo come periodo in cui in media ci sono più entrate dovute alla vendita di case.

Creazione di visualizzazioni con ggplot2

Boxplot per confrontare la distribuzione del prezzo mediano per città:

g3 <- ggplot(dati, aes(x = city, y = median_price))+
  geom_boxplot()+
  labs(x = "Città", 
       y = "Prezzo mediano", 
       title = "Prezzo mediano per città")

print(g3)

Il grafico riconferma le info ottenute dai summary, infatti si nota che la città Bryan-College Station è dove il prezzo di vendita delle case è maggiore mentre la città dove è più economico è Wichita Falls. Quest’ultima è anche la città dove il prezzo mediano è più variabile.

Grafici a barre per confrontare il totale delle vendite per mese e città.

sum_month_sales<-dati%>%
  group_by(month, city)%>%
  summarize(total_sales=sum(sales))
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
sum_month_sales
## # A tibble: 48 × 3
## # Groups:   month [12]
##    month city                  total_sales
##    <int> <chr>                       <int>
##  1     1 Beaumont                      608
##  2     1 Bryan-College Station         591
##  3     1 Tyler                         907
##  4     1 Wichita Falls                 442
##  5     2 Beaumont                      677
##  6     2 Bryan-College Station         628
##  7     2 Tyler                        1058
##  8     2 Wichita Falls                 454
##  9     3 Beaumont                      855
## 10     3 Bryan-College Station         949
## # ℹ 38 more rows
g4 <- ggplot(sum_month_sales, aes(x = factor(month), y = total_sales, fill = city)) +
  geom_bar(stat = "identity", color = "black") +
  scale_x_discrete(limits = as.character(1:12), labels = 1:12) +
  labs(
    title = "Numero Totale di Vendite per Mese",
    x = "Mese",
    y = "Numero Totale di Vendite"
  ) +
  theme_minimal()

print(g4)

Il grafico ottenuto riconferma che i mesi del periodo estivo (maggio-agosto) sono quelli con più altro numero di vendite. Inoltre sembra che a differenza delle altre città, in quella di Wichita Falls, il numero di vendite siano più costanti durante l’anno.

sum_month_sales<-dati%>%
  group_by(city)%>%
  summarize(total_sales=sum(sales))

g5 <- ggplot(sum_month_sales, aes(x = factor(city), y = total_sales)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +
  labs(
    title = "Numero Totale di Vendite per Mese",
    x = "Mese",
    y = "Numero Totale di Vendite"
  ) +
  theme_minimal()

print(g5)

Il grafico riconferma che la città in cui si vendono più proprietà è Tyler.

Line charts per confrontare l’andamento delle vendite in periodi storici differenti.

## Concateno "year" e "month"

dati$year_month <- paste0(dati$year, "_", dati$month)

## Line charts

sum_year_month_sales<-dati%>%
  group_by(year_month)%>%
  summarize(total_sales=sum(sales))

## Converto "2010_01" in oggetti yearmon (anno+mese)

sum_year_month_sales$year_month <- as.yearmon(sum_year_month_sales$year_month, "%Y_%m")

g5 <- ggplot(sum_year_month_sales) +
  geom_line(aes(x = year_month, y = total_sales), col = "red", linewidth = 1) +
  geom_point(aes(x = year_month, y = total_sales), col = "black", size = 3) +
  labs(
    x = "Anno_Mese",
    y = "Numero Totale di Vendite",
    title = "Andamento del Numero Totale di Vendite dal 2010 al 2014"
  ) +
  theme_minimal()

print(g5)

Dal line chart si vedono in ogni anno i picchi di vendite nei periodi estivi e si può notare un trend di crescita nel numero di vendite dal 2010 al 2014.

Conclusioni

Visto l’efficacia degli annunci nelle due città di Bryan-Station College e Wichita Falls consiglierei di prendere da modello per le altre città le inserzioni di queste zone ma spingere di più nella vendita o nella ricerca di proprietà da vendere nella zona di Wichita Falls vista l’efficacia appunto delle inserzioni ma il basso numero di vendite rispetto le altre città. Ricordando il grafico in cui si nota che le vendite a Wichita Falls sono costanti durante tutto l’anno, e ciò conferma l’efficacia degli annunci in quella zona, utilizzandolo come modello per gli annunci punterei ad aumentare le vendite anche nel periodo invernale nelle altre città. Consiglierei inoltre uno studio sul perchè le vendite si concentrino nei mesi caldi nelle altre zone in modo da capire se c’è possibilità di alzarle nei mesi freddi ed in caso questa possibilità non ci sia consiglierei una campagna pubblicitaria qualche mese prima del periodo estivo per poi intensificare gli annunci nel periodo estivo. In generale comunque il mercato è in crescita perciò investimenti per l’ottimizzazione delle vendite o per aumentare il numero di proprietà da da vendere hanno alta probabilità di ritorno e darebbero la possibilità di prendersi una fetta “più grande” del mercato che si sta allargando. ```