data <- read.csv("realestate_texas.csv")
  1. Tipi di variabili: city: qualitativa su scala nominale year: numerica, ma da trattare come qualitativa su scala ordinale month: numerica, ma da trattare come qualitativa su scala ordinale sales: quantitativa discreta volume: quantitativa continua median_price: quantitativa continua listings: quantitativa discreta months_inventory: quantitativa continua

  2. Per le variabili qualitative ho creato le distribuzioni di frequenza:

table(data$city)
## 
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60
table(data$year)
## 
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48
table(data$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

Tutte le variabili qualitative sono equidistribuite, quindi multimodali. Per le variabili quantitative, invece, ho calcolato gli indici di posizione (ho ritenuto adeguato utilizzare direttamente la funzione summary, piuttosto che calcolarli uno per uno):

summary(data$sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    79.0   127.0   175.5   192.3   247.0   423.0
summary(data$volume)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   8.166  17.660  27.062  31.005  40.893  83.547
summary(data$median_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   73800  117300  134500  132665  150050  180000
summary(data$listings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     743    1026    1618    1738    2056    3296
summary(data$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à:

max(data$sales)-min(data$sales)
## [1] 344
max(data$volume)-min(data$volume)
## [1] 75.381
max(data$median_price)-min(data$median_price)
## [1] 106200
max(data$listings)-min(data$listings)
## [1] 2553
max(data$months_inventory)-min(data$months_inventory)
## [1] 11.5
IQR(data$sales)
## [1] 120
IQR(data$volume)
## [1] 23.2335
IQR(data$median_price)
## [1] 32750
IQR(data$listings)
## [1] 1029.5
IQR(data$months_inventory)
## [1] 3.15
var(data$sales)
## [1] 6344.3
var(data$volume)
## [1] 277.2707
var(data$median_price)
## [1] 513572983
var(data$listings)
## [1] 566569
var(data$months_inventory)
## [1] 5.306889
sd(data$sales)
## [1] 79.65111
sd(data$volume)
## [1] 16.65145
sd(data$median_price)
## [1] 22662.15
sd(data$listings)
## [1] 752.7078
sd(data$months_inventory)
## [1] 2.303669
coeffv <- function(x){
  mu=mean(x)
  sigma=sd(x)
  return ((sigma/mu)*100)
}
coeffv(data$sales)
## [1] 41.42203
coeffv(data$volume)
## [1] 53.70536
coeffv(data$median_price)
## [1] 17.08218
coeffv(data$listings)
## [1] 43.30833
coeffv(data$months_inventory)
## [1] 25.06031

Confrontando i valori di media e deviazione standard per le singole variabili, la variabilità interna può essere considerata piuttosto omogenea per ciascuna variabile, nel senso che i due indici presentano ordini di grandezza paragonabili: questa affermazione è supportata anche dai valori proporzionatamente ridotti di IQR. Tuttavia, la differenza tra range totali e IQR suggerisce la presenza di outliers. Indici di forma:

library(moments)
skewness(data$sales)
## [1] 0.718104
skewness(data$volume)
## [1] 0.884742
skewness(data$median_price)
## [1] -0.3645529
skewness(data$listings)
## [1] 0.6494982
skewness(data$months_inventory)
## [1] 0.04097527
kurtosis(data$sales)-3
## [1] -0.3131764
kurtosis(data$volume)-3
## [1] 0.176987
kurtosis(data$median_price)-3
## [1] -0.6229618
kurtosis(data$listings)-3
## [1] -0.79179
kurtosis(data$months_inventory)-3
## [1] -0.1744475
  1. Tra le variabili quantitative, in base al valore dei coefficienti di variazione, volume presenta la maggiore variabilità. In base ai valori di skewness, volume è anche la variabile maggiormente asimmetrica (positiva).

  2. Scelgo di suddividere in 6 classi la variabile median_price

data$median_price_CL <- cut(data$median_price, 
                       breaks=c(70000,90000,110000,130000,150000,170000,190000))

freq <- table(data$median_price_CL)
barplot(freq,
        main="Distribuzione delle classi di prezzo mediano",
        col="light blue",
        xaxt="n",
        width=0.8)
axis(1, 
     at=0.5:5.5, 
     labels=c("70k-90k", 
              "90k-110k", 
              "110k-130k", 
              "130k-150k", 
              "150k-170k", 
              ">170k")
     )

La distribuzione e’ spostata verso destra, con piu’ occorrenze nella classe (130k-150k].

gini_index <- function(x){
  ni=table(x)
  fi=ni/length(x)
  fi2=fi^2
  j=length(table(x))
  
  g=1-sum(fi2)
  g_prime=g/((j-1)/j)
  
  return(g_prime)
}

gini_index(data$median_price_CL)
## [1] 0.9112917

Tuttavia, l’indice di Gini e’ vicino a 1, indicando che le classi sono “quasi” equidistribuite.

Di seguito ho provato a considerare il numero di vendite condizionatamente a queste classi:

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
data%>%
  group_by(median_price_CL)%>%
  summarise(media=mean(sales),dev_st=sd(sales))

Da cio’ sembrerebbe risultare un maggior numero di vendite per immobili piu’ costosi: tuttavia, considerata la variabilita’ interna per ciascuna classe (valori di sd altrettanto crescenti) e diversa numerosita’ delle classi, non la considererei una conclusione sufficientemente supportata. Pertanto, provo a valutare se questo andamento puo’ essere semplicemente dovuto a un altrettanto crescente numero di annunci:

data%>%
  group_by(median_price_CL)%>%
  summarise(media=mean(listings),dev_st=sd(listings))

Ma i risultati non sembrano suggerire cio’.

  1. L’indice di Gini per una variabile equidistribuita, come city, vale 1 ed indica massima eterogeneità.

  2. Calcoli di probabilita’:

prob_beaumont <- (sum(data$city=="Beaumont"))/nrow(data)
prob_beaumont
## [1] 0.25
prob_july <- (sum(data$month==7))/nrow(data)
prob_july
## [1] 0.08333333
prob_dec_2012 <- (sum(data$month==12 & data$year==2012))/nrow(data)
prob_dec_2012
## [1] 0.01666667
  1. Colonna mean_price:
data$mean_price <- (data$volume/data$sales)*1000000
  1. Ipotesi di colonna efficacy:
data$efficacy <- 100*data$sales/data$listings

Ricollegandomi al punto 4, ho provato a valutare se il maggior numero di vendite di immobili piu’ costosi possa essere dovuto non piu’ al numero di annunci, quanto alla loro efficacia:

data%>%
  group_by(median_price_CL)%>%
  summarise(media=mean(efficacy),dev_st=sd(efficacy))

I risultati sembrano confermare l’ipotesi che gli immobili piu’ costosi si “convertono meglio” in vendita perche’ i loro annunci sono piu’ efficaci (magari per come sono scritti e sponsorizzati o semplicemente per maggiore domanda nel mercato)

  1. Scelgo le variabili sales e mean_price :
data%>%
  group_by(city)%>%
  summarise(media_sales=mean(sales),dev_st_sales=sd(sales),
            media_mean_price=mean(mean_price),
            dev_st_mean_price=sd(mean_price))
data%>%
  group_by(year)%>%
  summarise(media_sales=mean(sales),dev_st_sales=sd(sales),
            media_mean_price=mean(mean_price),
            dev_st_mean_price=sd(mean_price))
data%>%
  group_by(month)%>%
  summarise(media_sales=mean(sales),dev_st_sales=sd(sales),
            media_mean_price=mean(mean_price),
            dev_st_mean_price=sd(mean_price))

Dai risultati osservo che: gli andamenti di sales e mean_price vanno all’incirca “di pari passo” e, in particolare, indicano un evidente aumento negli anni. Inoltre, si puo’ osservare una certa stagionalita’, con picchi massimi nei mesi estivi rispetto ai mesi invernali. Infine, per quanto riguarda le citta’, il tutto sembra proporzionato, nel senso che: citta’ dove si effettuano piu’ vendite (Tyler e Bryan-College Station) hanno anche i prezzi medi piu’ alti, viceversa citta’ dove si registrano meno vendite hanno prezzi medi piu’ bassi.

##Grafici Grafico 1:

boxplot(data$median_price~data$city,
        main = "Distribuzione del prezzo mediano per citta'",
        xlab=" ",
        ylab="prezzo mediano",
        col=c(2,3,4,5))

Il boxplot conferma l’osservazione precedente evidenziando prezzi mediani maggiori per Bryan-College Station e Tyler, anche se in ordine invertito rispetto a quello trovato per i prezzi medi (cio’ e’ dovuto a come essi sono stati calcolati, potendo risentire di valori estremi nelle variabili di partenza), e minori per Beaumont e Wichita Falls; queste ultime presentano un outlier. Dal boxplot si puo’ osservare l’asimmetria delle distribuzioni: tutte positive (media>mediana) tranne che per Bryan-College Station.

Grafico 2:

library(ggplot2)
ggplot(data, aes(x=interaction(year, city), y=sales, fill=city))+
  geom_boxplot() +
  scale_fill_manual(values=c("Beaumont"="red", 
                             "Bryan-College Station"="green",
                             "Tyler"="blue",
                             "Wichita Falls"="light blue"))+
  labs(title="Confronto delle vendite tra citta' e anni",
       x=" ",
       y="vendite",
       fill="citta'")+
  theme_minimal()+
  theme(axis.text.x=element_text(angle=45, hjust=1))

Da questo boxplot si osserva una crescita delle vendite negli anni per tutte le citta’ tranne che per Wichita Falls, che rimane stabile anche in termini di variabilita’ interna. La maggior dispersione dei dati di Bryan-College station puo’ essere indice di un mercato comunque piu’ instabile.

Grafico 3.1: grafico a barre normalizzato con solo mesi e citta’

month_names <- c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")
data$month_name <- factor(data$month, levels= 1:12, labels=month_names)

data_normalized <- data %>%
  group_by(month_name) %>%
  mutate(proportion=sales/sum(sales))

ggplot(data_normalized, aes(x=month_name, y=proportion, fill=city))+
  geom_col(position="stack")+
  labs(title="Normalizzazione delle vendite mensili per citta'",
       x=" ",
       y=" ",
       fill=" ")+
  theme_minimal()+
  theme(axis.text.x=element_text(angle=60, hjust=1, size=9))

Dalle dimensioni generali delle barre delle diverse citta’ si osserva il maggior numero di vendite per Tyler, seguita da Bryan-College Station, Beaumont e Wichita Falls; dalle dimensioni delle singole barre per ciascuna citta’, invece, si osservano le oscillazioni tra i mesi, particolarmente evidenti per Bryan-College Station.

Grafico 3.2:

ggplot(data, aes(x=year, y=sales, fill=month_name))+
  geom_col(position="stack")+
  facet_wrap(~city, ncol=1)+
  labs(title="Andamento annuale delle vendite per citta'",
       x=" ",
       y="vendite",
       fill=" ")+
  theme_minimal()

In questi grafici appare ancora evidente l’aumento delle vendite per Tyler, seguita da Bryan-College Station e Beaumont, contro la stabilita’ nel tempo del minor numero di vendite a Wichita Falls.

Grafico 4:

ggplot(data, aes(x=interaction(month_name,year), y=efficacy, color=city, group=city))+
  geom_line()+
  geom_point()+
  labs(title="Conversione degli annunci in vendite",
       x=" ",
       y="'efficacy' degli annunci",
       color=" "
       )+
  theme_minimal()+
  theme(axis.text.x=element_text(angle=60, hjust=1, size=5))

Questo quadro finale suggerisce: -per Beaumont l’efficacia degli annunci e’ proporzionata alla moderata crescita del mercato vista in precedenza -per Bryan-College Station l’efficacia degli annunci ha picchi notevoli nei mesi estivi, il che e’ coerente con l’ampia variabilita’ interna delle vendite in questa citta’ -per Tyler sembrerebbe smentire l’ipotesi che determinati annunci funzionino meglio di altri, a favore del semplice aumento della domanda -infine, per Wichita Falls, l’efficacia e’ addirittura superiore a quelle di Beaumont e Tyler, a fronte pero’ di un mercato piu’ piccolo e piu’ stabile. P.s.: tutte le considerazioni che ho provato a fare sono sottoposte alla regola: variabili che vanno “di pari passo” non necessariamente hanno un rapporto di causalita’