data <- read.csv("realestate_texas.csv")
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
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
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).
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’.
L’indice di Gini per una variabile equidistribuita, come city, vale 1 ed indica massima eterogeneità.
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
data$mean_price <- (data$volume/data$sales)*1000000
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)
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’