Working directory
setwd("C:/Users/csant/Desktop/ProfessionAI/Statistica Descrittiva")
texas <- read_csv("realestate_texas.csv")
## Rows: 240 Columns: 8
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## chr (1): city
## dbl (7): year, month, sales, volume, median_price, listings, months_inventory
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
attach(texas)
str(texas)
## spc_tbl_ [240 x 8] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ city : chr [1:240] "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
## $ year : num [1:240] 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
## $ month : num [1:240] 1 2 3 4 5 6 7 8 9 10 ...
## $ sales : num [1:240] 83 108 182 200 202 189 164 174 124 150 ...
## $ volume : num [1:240] 14.2 17.7 28.7 26.8 28.8 ...
## $ median_price : num [1:240] 163800 138200 122400 123200 123100 ...
## $ listings : num [1:240] 1533 1586 1689 1708 1771 ...
## $ months_inventory: num [1:240] 9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
## - attr(*, "spec")=
## .. cols(
## .. city = col_character(),
## .. year = col_double(),
## .. month = col_double(),
## .. sales = col_double(),
## .. volume = col_double(),
## .. median_price = col_double(),
## .. listings = col_double(),
## .. months_inventory = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
City: variabile qualitativa nominale
Year: anche se espressa con numeri interi è da considerare come variabile qualitativa ordinale
Month: per la motivazione espressa precedentemente è una variabile qualitativa ordinale
Sales: variabile quantitativa
Volume: variabile quantitativa
Median price: variabile quantitativa
Listings: variabile quantitativa
Months inventory: variabile quantitativa
#Variabile "city"
ni.city<-table(city)
fi.city<-table(city)/dim(texas)[1]
Tabcity<-cbind(ni.city,fi.city)
#Variabile "year"
ni.year<-table(year)
fi.year<-table(year)/dim(texas)[1]
Ni.year<-cumsum(table(year))
Fi.year<-cumsum(table(year))/dim(texas)[1]
Tabyear<-cbind(ni.year,fi.year,Ni.year,Fi.year)
#Variabile "month"
ni.month<-table(month)
fi.month<-table(month)/dim(texas)[1]
Ni.month<-cumsum(table(month))
Fi.month<-cumsum(table(month))/dim(texas)[1]
Tabmonth<-cbind(ni.month,fi.month,Ni.month,Fi.month)
#Altre variabili
quant_var <- colnames(texas[4:8])
lista_tab <- c()
for (i in quant_var) {
#Indici di posizione
Mean<-mean(texas[[i]]) #media
Mode<-as.numeric(names(which.max(table(texas[[i]])))) #moda
Median<-median(texas[[i]]) #mediana
Min<-min(texas[[i]])
Max<-max(texas[[i]])
#Indici di variabilità
Range<-Max-Min
IQR<-IQR(texas[[i]])
SD<-sd(texas[[i]]) #varianza
#Variance.sales<-(var(sales)*(length(sales)-1))/length(sales) in alternativa
Variance<-SD^2
CV<-SD/Mean
#Indici di forma
Kurtosis<-kurtosis(texas[[i]])-3
Skewness<-skewness(texas[[i]])
Tab<-cbind(Mean,Mode,Median,Min,Max,Range,IQR,Variance,SD,CV,Skewness,Kurtosis)
lista_tab[[i]] <- Tab
}
Tabcompl_quant<-rbind(lista_tab[[(1)]], lista_tab[[(2)]], lista_tab[[(3)]], lista_tab[[(4)]], lista_tab[[(5)]])
Tabcompl_quant<-as.data.frame(Tabcompl_quant)
rownames(Tabcompl_quant)<-colnames(texas[4:8])
Per le variabili quantitative ho calcolato i principali indici di posizione, di variabilità e di forma. In seguito li ho raggruppati in una tabella di sintesi. Possiamo confrontare le variabili con gli indici di asimmetria e coefficiente di variazione per comprendere meglio la loro distribuzione e variabilità. La maggior parte delle variabili presenta un’asimmetria positiva, dove i valori si concentrano maggiormente nella parte bassa della distribuzione, lasciando una coda più lunga verso destra. Fa eccezione la variabile “median_price”. Dal punto di vista della variabilità relativa, misurata attraverso il coefficiente di variazione (CV), la variabile con la dispersione maggiore rispetto alla media è volume. Questa variabile è anche quella con il grado di asimmetria più elevato, come indicato dall’indice di skewness nella tabella, riflettendo una distribuzione particolarmente sbilanciata verso valori più alti.
kable(round(Tabcompl_quant, 2))
| Mean | Mode | Median | Min | Max | Range | IQR | Variance | SD | CV | Skewness | Kurtosis | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sales | 192.29 | 124.0 | 175.50 | 79.00 | 423.00 | 344.00 | 120.00 | 6.34430e+03 | 79.65 | 0.41 | 0.72 | -0.31 |
| volume | 31.01 | 14.0 | 27.06 | 8.17 | 83.55 | 75.38 | 23.23 | 2.77270e+02 | 16.65 | 0.54 | 0.88 | 0.18 |
| median_price | 132665.42 | 130000.0 | 134500.00 | 73800.00 | 180000.00 | 106200.00 | 32750.00 | 5.13573e+08 | 22662.15 | 0.17 | -0.36 | -0.62 |
| listings | 1738.02 | 1581.0 | 1618.50 | 743.00 | 3296.00 | 2553.00 | 1029.50 | 5.66569e+05 | 752.71 | 0.43 | 0.65 | -0.79 |
| months_inventory | 9.19 | 8.1 | 8.95 | 3.40 | 14.90 | 11.50 | 3.15 | 5.31000e+00 | 2.30 | 0.25 | 0.04 | -0.17 |
Per le variabili “city”, “years” e “month”, essendo qualitative, ho creato solo le distribuzioni di frequenza. Come si può vedere, all’interno del dataset, il numero di osservazioni per ogni città è identico e sono stati raccolti dati per ogni mese dal 2010 al 2014, per le città di Beaumont, Bryan-College Station, Tyler, Wichita Falls
kable(Tabcity, caption = "Tabella di frequenze per la variabile city", align = "c")
| ni.city | fi.city | |
|---|---|---|
| Beaumont | 60 | 0.25 |
| Bryan-College Station | 60 | 0.25 |
| Tyler | 60 | 0.25 |
| Wichita Falls | 60 | 0.25 |
kable(round(Tabmonth,2), caption = "Tabella di frequenze per la variabile month", align = "c")
| ni.month | fi.month | Ni.month | Fi.month |
|---|---|---|---|
| 20 | 0.08 | 20 | 0.08 |
| 20 | 0.08 | 40 | 0.17 |
| 20 | 0.08 | 60 | 0.25 |
| 20 | 0.08 | 80 | 0.33 |
| 20 | 0.08 | 100 | 0.42 |
| 20 | 0.08 | 120 | 0.50 |
| 20 | 0.08 | 140 | 0.58 |
| 20 | 0.08 | 160 | 0.67 |
| 20 | 0.08 | 180 | 0.75 |
| 20 | 0.08 | 200 | 0.83 |
| 20 | 0.08 | 220 | 0.92 |
| 20 | 0.08 | 240 | 1.00 |
kable(Tabyear, caption = "Tabella di frequenze per la variabile year", align = "c")
| ni.year | fi.year | Ni.year | Fi.year | |
|---|---|---|---|---|
| 2010 | 48 | 0.2 | 48 | 0.2 |
| 2011 | 48 | 0.2 | 96 | 0.4 |
| 2012 | 48 | 0.2 | 144 | 0.6 |
| 2013 | 48 | 0.2 | 192 | 0.8 |
| 2014 | 48 | 0.2 | 240 | 1.0 |
la variabile con indice 2, ovvero “volume”, ha CV più alto, quindi variabilità più elevata
kable(rownames(Tabcompl_quant[which.max(Tabcompl_quant$CV),]))
| x |
|---|
| volume |
la variabile “volume” ha indice skewness più elevato in valore assoluto, quindi è più asimmetrica
kable(rownames(Tabcompl_quant[which.max(abs(Tabcompl_quant$Skewness)),]))
| x |
|---|
| volume |
Per il numero di classi utilizzo la formula di Sturges
S<-round(1+10/3*log(length(sales)))
W<-ceiling((max(sales)-min(sales))/S)
class.sales<-cut(sales,breaks=c(seq(min(sales)-1,max(sales),W),max(sales)))
ni.class.sales<-table(class.sales)
Ni.class.sales<-cumsum(table(class.sales))
fi.class.sales<-table(class.sales)/length(sales)
Fi.class.sales<-cumsum(table(class.sales)/length(sales))
Tabclass.sales<-cbind(ni.class.sales,Ni.class.sales,fi.class.sales,Fi.class.sales)
kable(round(Tabclass.sales, 2), caption = "Tabella di frequenze della variabile sales divisa in classi", align = "c")
| ni.class.sales | Ni.class.sales | fi.class.sales | Fi.class.sales | |
|---|---|---|---|---|
| (78,97] | 19 | 19 | 0.08 | 0.08 |
| (97,116] | 26 | 45 | 0.11 | 0.19 |
| (116,135] | 29 | 74 | 0.12 | 0.31 |
| (135,154] | 21 | 95 | 0.09 | 0.40 |
| (154,173] | 23 | 118 | 0.10 | 0.49 |
| (173,192] | 21 | 139 | 0.09 | 0.58 |
| (192,211] | 19 | 158 | 0.08 | 0.66 |
| (211,230] | 10 | 168 | 0.04 | 0.70 |
| (230,249] | 12 | 180 | 0.05 | 0.75 |
| (249,268] | 11 | 191 | 0.05 | 0.80 |
| (268,287] | 13 | 204 | 0.05 | 0.85 |
| (287,306] | 13 | 217 | 0.05 | 0.90 |
| (306,325] | 5 | 222 | 0.02 | 0.92 |
| (325,344] | 5 | 227 | 0.02 | 0.95 |
| (344,363] | 5 | 232 | 0.02 | 0.97 |
| (363,382] | 4 | 236 | 0.02 | 0.98 |
| (382,401] | 1 | 237 | 0.00 | 0.99 |
| (401,420] | 2 | 239 | 0.01 | 1.00 |
| (420,423] | 1 | 240 | 0.00 | 1.00 |
barplot(table(class.sales),ylim = c(0,30),xlab = "Classi di sales",ylab = "Freq. Ass.")
Ci sono 19 classi, delle quali 18 con ampiezza 19 e l’ultima di ampiezza 3. Nella maggior parte dei mesi si ha un numero totale di vendite appartanente all’intervallo (116, 135], con una probabilità del 12%,
L’indice di Gini è pari a 0.97, molto vicino al valore limite superiore. Ciò significa che c’è quasi un’equa distribuzione delle classi delle vendite totali, come prevedibile, data la bassa frequenza della classe più frequente.
gini.index <- function(x){
ni = table(x)
fi = ni/length(x)
fi2 = fi^2
J = length(table(x))
gini = 1 - sum(fi2)
gini.normalizzato = gini/((J-1)/J)
return(gini.normalizzato)}
kable(round(gini.index(class.sales),2))
| x |
|---|
| 0.97 |
L’indice di Gini sarà pari a 1, in quanto c’è un’equa ripartizione delle frequenze assolute delle modalità della variabile city
p1 <- sum(city=="Beaumont")/nrow(texas)
p2 <- sum(month==7)/nrow(texas)
p3 <- sum(month==12 & year==2012)/nrow(texas)
p1 <- sum(city == "Beaumont") / nrow(texas)
p2 <- sum(month == 7) / nrow(texas)
p3 <- sum(month == 12 & year == 2012) / nrow(texas)
probabilities <- data.frame(
p1,
p2,
p3)
kable(
round(probabilities, 2),
align = "c",
col.names = c("P(city='Beaumont')", "P(month=7)", "P(month=12 & year=2012)"))
| P(city=‘Beaumont’) | P(month=7) | P(month=12 & year=2012) |
|---|---|---|
| 0.25 | 0.08 | 0.02 |
texas$mean_price<-(volume/sales)*1000000
texas$efflistings<-(sales/listings)*100
texas$date <- as.Date(paste(texas$year,texas$month,"01",sep = "-"))
Per creare una colonna che rifletta l’efficacia degli annunci di vendita ho calcolato, per ogni osservazione, la percentuale di annunci che hanno portato ad un’effettiva vendita.
texas$efflistings<-(sales/listings)*100
texas$date <- as.Date(paste(texas$year,texas$month,"01",sep = "-"))
ggplot(data = texas) +
geom_line(aes(x = date, y = efflistings, colour = city)) +
geom_point(aes(x = date, y = efflistings, colour = city)) + # Aggiunge i punti
labs(
title = "Serie storica dell'efficacia degli annunci per città",
x = "Periodo",
y = "Percentuale di vendita sugli annunci attivi"
) +
scale_x_date(
breaks = seq(as.Date("2010-01-01"), as.Date("2014-12-01"), by = "6 months"),
date_labels = "%m/%Y",
expand = expansion(mult = c(0.001, 0.001))
) +
theme_classic()
Ci sono due considerazioni da fare:
Gli annunci di vendita più efficaci sono quelli presenti nella città Bryan-Colege Station;
In generale si osserva che i trend positivi e negativi si verificano contemporaneamente nelle quattro città ma con magnitudine diversa.
summary_texas <- texas %>%
group_by(year, city) %>%
summarise(
media.di.sales = round(mean(sales),2),
sd.di.volume = round(sd(volume),2))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
kable(summary_texas)
| year | city | media.di.sales | sd.di.volume |
|---|---|---|---|
| 2010 | Beaumont | 156.17 | 4.95 |
| 2010 | Bryan-College Station | 167.58 | 10.82 |
| 2010 | Tyler | 227.50 | 8.39 |
| 2010 | Wichita Falls | 123.42 | 4.07 |
| 2011 | Beaumont | 144.00 | 4.30 |
| 2011 | Bryan-College Station | 167.42 | 10.31 |
| 2011 | Tyler | 238.83 | 9.41 |
| 2011 | Wichita Falls | 106.25 | 2.52 |
| 2012 | Beaumont | 171.92 | 4.92 |
| 2012 | Bryan-College Station | 196.75 | 13.49 |
| 2012 | Tyler | 263.50 | 10.23 |
| 2012 | Wichita Falls | 112.42 | 2.66 |
| 2013 | Beaumont | 201.17 | 6.44 |
| 2013 | Bryan-College Station | 237.83 | 19.54 |
| 2013 | Tyler | 287.42 | 10.33 |
| 2013 | Wichita Falls | 121.25 | 3.11 |
| 2014 | Beaumont | 213.67 | 7.05 |
| 2014 | Bryan-College Station | 260.25 | 17.97 |
| 2014 | Tyler | 331.50 | 12.76 |
| 2014 | Wichita Falls | 117.00 | 3.13 |
ggplot(summary_texas, aes(x = year, y = media.di.sales, color = city, group = city)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(
title = "Vendite medie mensili per Città e Anno",
x = "Anno",
y = "Vednite medie mensili",
color = "Città"
) +
theme_classic()
Si registra un calo delle vendite medie mensili nel 2011 per tutte le città del campione, successivamente incremento ad ogni anno, ad eccezione della città Wichita Falls, con una decrescita nel 2014
ggplot(data=texas)+
geom_boxplot(aes(y=median_price,x=city))+
labs(title = "BoxPlot prezzo mediano tra città",
x="Città",
y="Prezzo mediano")+
theme_classic()
Dal grafico si evince che la variabile “median_price” presenta una maggiore variabilità per la città Wichita Falls, dove ci sono anche case con i prezzi minori, mentre la stessa variabile si distribuisce con una minore variabilità per le osservazioni relative alla città Bryan-College Station, dove sono presenti le case più costose
ggplot(data=texas)+
geom_boxplot(aes(y=volume,x=city,fill=as.factor(year)))+
labs(title = "BoxPlot valore totale vendite per città",
x="Città",
y="Valore totale vendite",
fill="Anno")+
theme_classic()
Dal grafico si può osservare che la variabile “volume” è caratterizzata da variabilità maggiore quando si tratta della città Bryan-College Station. In particolare il valore totale delle vendite ha una variabilità maggiore nell’anno 2013. Invece “volume” è meno variabile per la città Wichita Falls. Infine nell’anno 2012, limitatamente alla città Beumont, il volume delle vendite si caratterizza, in assoluto, per una minore variabilità
for (i in 2010:2014) {
grafico <- ggplot(data=subset(texas, year == i)) +
geom_col(aes(x = month, y = sales, fill = city), position = "stack") +
labs(
title = paste("Totale vendite per mese e città nell'anno", i),
x = "Mese",
y = "Totale delle vendite",
fill = "Città"
) +
scale_x_continuous(breaks = seq(1, 12, 1)) +
scale_y_continuous(breaks = seq(100, 1200, 100)) +
theme_classic() +
theme(plot.title = element_text(size = 12))
print(grafico)
}
for (i in 2010:2014) {
grafico1 <- ggplot(data=subset(texas, year == i)) +
geom_col(aes(x = month, y = sales, fill = city), position = "fill") +
labs(
title = paste("Percentuale totale vendite per mese e città nell'anno", i),
x = "Mese",
y = "Percentuale delle vendite",
fill = "Città"
) +
scale_x_continuous(breaks = seq(1, 12, 1)) +
scale_y_continuous(breaks = seq(0, 1, 0.05)) +
theme_classic() +
theme(plot.title = element_text(size = 10))
print(grafico1)
}
Dai grafici si nota che per gran parte dei mesi presi in esame la percentuale di vendite più alta si registra nella città di Tyler mentre la più bassa nella città di Wichita Falls. Inoltre le percentuali di vendita per ogni città risultano essere più o meno costanti nel tempo. Un’altra considerazione da aggiungere riguarda il fatto che le vendite si concentrano, per ogni anno, durante il periodo estivo.
ggplot(data = texas) +
geom_line(aes(x = date, y = mean_price, colour = city)) +
geom_point(aes(x = date, y = mean_price, colour = city)) + # Aggiunge i punti
labs(
title = "Serie storica del prezzo medio tra le città",
x = "Periodo",
y = "Prezzo medio",
colour = "Città"
) +
scale_x_date(
breaks = seq(as.Date("2010-01-01"), as.Date("2014-12-01"), by = "6 months"),
date_labels = "%m/%y",
expand = expansion(mult = c(0.01, 0.01)) # Aumenta lo spazio sull'asse x
) +
theme_classic()
Ho scelto di rappresentare il prezzo medio delle vendite in ciascun mese dal 2010 al 2015 per le città presenti nel dataset. Si vede che i prezzi medi più alti si verificano nella città di Bryan-College Station mentre i più bassi riguardano la città di Wichita Falls. Considerazioni: - Ad inizio 2012 si è verificato un brusco calo dei prezzi che ha coinvolto tutte le città; - Il prezzo medio subisce delle forti variazioni, per tutte le città, subisce forti variazioni, rappresentato come delle rette spezzate -Spesso, le variazioni dei prezzi medi delle città di Beaumont e Tyler vanno nella stessa direzione - Al 2014, il prezzo medio è in crescita per tutte le città, è dovuto ad uno shock positivo che ha coinvolto l’intero mercato immobiliare?
Dalle analisi descrittive condotte sul dataset sono stati estratti degli insight interessanti. Innanzitutto si notano le continue variazioni di prezzo che coinvolgono tutte le città facenti parte del campione, quindi sono shock che riguardano il mercato immobiliare in sè. Dal lato delle vendite c’è da constatare che i trend sono generalmente in crescita, con le transazioni che si concludono con maggior frequenza durante i mesi estivi dell’anno. Dal punto di vista delle singole città si osserva che il prezzo medio più alto si registra nella città di Bryan-College Station mentre il più basso nella città di Wichita Falls. Nella città di Tyler vengono effettuate più compra-vendite immobiliari rispetto alle altre e allo stesso tempo si rileva un fatturato complessivo del settore maggiore. Scendendo ancora di livello, andando a considerare la qualità delle agenzie immobiliari, bisogna citare gli agenti della città di Bryan-College Station che sovrastano i colleghi delle altre città in termini di percentuale di vendita sugli annunci attivi.