#Imposto la directory
getwd()
## [1] "C:/Users/Francesco Innocenti/Desktop/Statistica Descrittiva in R"
setwd("C:/Users/Francesco Innocenti/Desktop/Statistica Descrittiva in R")
getwd()
## [1] "C:/Users/Francesco Innocenti/Desktop/Statistica Descrittiva in R"
#Carico i dati in R (file csv)
data<-read.csv("Real Estate Texas.csv")
#Indago sul Dataset : struttura e tipo variabili
head(data)
## 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
names(data)
## [1] "city" "year" "month" "sales"
## [5] "volume" "median_price" "listings" "months_inventory"
str(data)
## 'data.frame': 240 obs. of 8 variables:
## $ city : chr "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
## $ year : int 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
## $ month : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sales : int 83 108 182 200 202 189 164 174 124 150 ...
## $ volume : num 14.2 17.7 28.7 26.8 28.8 ...
## $ median_price : num 163800 138200 122400 123200 123100 ...
## $ listings : int 1533 1586 1689 1708 1771 1803 1857 1830 1829 1779 ...
## $ months_inventory: num 9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
summary(data)
## 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
Analisi Variabili del Dataset [ Tipo Variabile | Descrizione | Tipo Analisi] :
City : Variabile Qualitativa | indica le città a cui si riferiscono i dati | Possibile utilizzo: confronto vendite/volume tra città o aree geografiche.
Year : Variabile Quantitativa Discreta | indica Anno di osservazione | Dimensione temporale, utilizzabile per analisi di trend.
Month : Variabile Quantitativa Discreta | indica Mese di osservazione | Dimensione temporale, utile per analisi di stagionalità.
Sales : Variabile Quantitativa Discreta | Numero totale di case vendute. | Analisi Descrittiva della domanda immobiliare (media, dispersione, distribuzione)
Volume : Variabile Quantitativa continua | misura Valore totale delle vendite (in milioni di dollari). | Analisi descrittiva del giro d’affari del mercato (media, dispersione, distribuzione)
Median Price : Variabile Quantitativa Continua | misura prezzo mediano di vendita (in dollari) | Analisi Descrittiva sul livello dei prezzi delle case
Listings : Variabile Quantitativa Discreta | misura v numero totale di annunci attivi | Analisi dell’offerta immobiliare (media, dispersione, distribuzione).
months_inventory : Variabile Quantitativa Continua | Tempo (in mesi) stimato per vendere tutte le inserzioni correnti. | Indicatore dell’equilibrio domanda/offerta.
Tipo Analisi Possibili :
City -> Confronto tra gruppi
Year / Month -> Trend & Stagionalità
Variabili Quantitative -> Distribuzioni, Variabilità e Correlazione
Per Variabili Quantitative (
sales
, volume
,
median_price
, listings
,
month_inventory
)
-> Calcolo indici di :
Posizione : Media, Mediana, Minimo , Massimo , Quartili
Variabilità : Varianza , Deviazione Standard , Range
Forma : Asimmetria , Curtosi
Per variabili quantitative/temporali
(city
, year
, month
)
-> Calcolo Distribuzione di frequenza
attach(data)
library(moments)
#Quantitative Variable Index
#Sales
summary(sales)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 79.0 127.0 175.5 192.3 247.0 423.0
sales_avg<-mean(sales)
sales_median<- median(sales)
sales_sd<- sd(sales)
sales_range<- range(sales)[2]-range(sales)[1];
sales_iqr<- IQR(sales)
sales_var<- var(sales);
sales_asimmetry<-skewness(sales);
sales_curtosis<- kurtosis(sales)
##Position
sales_avg; sales_median
## [1] 192.2917
## [1] 175.5
##Variability
sales_sd; sales_var;
## [1] 79.65111
## [1] 6344.3
sales_range ;sales_iqr
## [1] 344
## [1] 120
##Shape
sales_asimmetry; sales_curtosis
## [1] 0.718104
## [1] 2.686824
#Volume
summary(volume)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.166 17.660 27.062 31.005 40.893 83.547
volume_avg<-mean(volume)
volume_median<- median(volume)
volume_sd<- sd(volume)
volume_range<- range(volume)[2]-range(volume)[1];
volume_iqr<- IQR(volume)
volume_var<- var(volume);
volume_asimmetry<-skewness(volume);
volume_curtosis<- kurtosis(volume)
##Position
volume_avg; volume_median
## [1] 31.00519
## [1] 27.0625
##Variability
volume_sd; volume_var;
## [1] 16.65145
## [1] 277.2707
volume_range ;volume_iqr
## [1] 75.381
## [1] 23.2335
#Shape
volume_asimmetry; volume_curtosis
## [1] 0.884742
## [1] 3.176987
#Median Price
summary(median_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 73800 117300 134500 132665 150050 180000
median_price_avg<-mean(median_price)
median_price_median<- median(median_price)
median_price_sd<- sd(median_price)
median_price_range<- range(median_price)[2]-range(median_price)[1];
median_price_iqr<- IQR(median_price)
median_price_var<- var(median_price);
median_price_asimmetry<-skewness(median_price);
median_price_curtosis<- kurtosis(median_price)
##Position
median_price_avg; median_price_median
## [1] 132665.4
## [1] 134500
##Variability
median_price_sd; median_price_var;
## [1] 22662.15
## [1] 513572983
median_price_range; median_price_iqr
## [1] 106200
## [1] 32750
##Shape
median_price_asimmetry; median_price_curtosis
## [1] -0.3645529
## [1] 2.377038
#Listings
summary(listings)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 743 1026 1618 1738 2056 3296
listings_avg<-mean(listings)
listings_median<- median(listings)
listings_sd<- sd(listings)
listings_range<- range(listings)[2]-range(listings)[1];
listings_iqr<- IQR(listings)
listings_var<- var(listings);
listings_asimmetry<-skewness(listings);
listings_curtosis<- kurtosis(listings)
##Position
listings_avg; listings_median
## [1] 1738.021
## [1] 1618.5
##Variability
listings_sd; listings_var;
## [1] 752.7078
## [1] 566569
listings_range; listings_iqr
## [1] 2553
## [1] 1029.5
##Shape
listings_asimmetry; listings_curtosis
## [1] 0.6494982
## [1] 2.20821
#Month Inventory
summary(months_inventory)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.400 7.800 8.950 9.193 10.950 14.900
months_inventory_avg<-mean(months_inventory)
months_inventory_median<- median(months_inventory)
months_inventory_sd<- sd(months_inventory)
months_inventory_range<- range(months_inventory)[2]-range(months_inventory)[1];
months_inventory_iqr<- IQR(months_inventory)
months_inventory_var<- var(months_inventory);
months_inventory_asimmetry<-skewness(months_inventory);
months_inventory_curtosis<- kurtosis(months_inventory)
##Position
months_inventory_avg; months_inventory_median
## [1] 9.1925
## [1] 8.95
##Variability
months_inventory_sd; months_inventory_var;
## [1] 2.303669
## [1] 5.306889
months_inventory_range;months_inventory_iqr
## [1] 11.5
## [1] 3.15
##Shape
months_inventory_asimmetry; months_inventory_curtosis
## [1] 0.04097527
## [1] 2.825552
#Distribuzione di Frequenza
table(city)
## city
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
table(year)
## year
## 2010 2011 2012 2013 2014
## 48 48 48 48 48
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
Sales :
Distribuzione Asimmetrica (Media [192.3] e Mediana [175.3] non coincidono) Positiva (Asim_Index: 0.72, Kurtosis : 2.69) con pochi picchi molto alti e infatti sono più frequenti i valori bassi (quindi con una coda verso Dx). La variabilità è leggermente alta (sd: 79.7) e Range e IQR sono molto diversi tra loro e quindi potrebbe suggerire presenza di outlier.
Volume :
Distribuzione Asimmetrica (Media [37.005] e Mediana [27.062] non coincidono) Positiva (Asim_Index: 0.84, Kurtosis : 3.17) con pochi picchi molto alti e infatti sono più frequenti i valori bassi (quindi con una coda verso Dx). La variabilità è moderata (sd: 16.7) ma la differenza marcata tra Range e IQR potrebbe suggerire anche in questo caso presenza di outlier.
Median Price :
Distribuzione quasi simmetrica (Media e Mediana quasi coincidono, AVG: 1738.021, Mediana: 1618.5 ) con lieve asimmetria negativa (Asim_Index: -0.36). Curtosi vicino a 3 e quindi molto simile a una distribuzione normale (Kurtosis : 2.38). Tuttavia La variabilità è molto alta (sd : 22662.15) rispetto alla media, suggerendo un alta eterogeneità dei prezzi.
Listings :
Distribuzione leggermente asimmetrica (Media e Mediana quasi coincidono, AVG: 132665.4, Mediana: 134500) Positiva (Asim_Index: 0.64, Kurtosis : 2.02). La dispersione è elevata come mostrato dalla deviazione standard molto ampia (sd: 752.7). Inoltre l’asimmetria e la curtosi indicano che la distribuzione è leggermente spostata verso valori alti.
Month Inventory :
Distribuzione sostanzialmente simmetrica (Media e Mediana quasi coincidono), con bassa variabilità (sd : 2.3) e una bassa asimmetria (Asim_Index: 0.04, Kurtosis : 2.82). La sua distribuzione si avvicina a quella di una distribuzione normale.
Coefficienti da impiegare per confrontare “Variabilità” & “Asimmetria” :
Variabilità : utilizzo il coefficiente di variazione ( CV = sd / mean ), che essendo un valore percentuale permette il confronto tra scale diverse.
Asimmetria : utilizzo la funzione “skewness” e verifico la variabile con valore più alto (in questo caso distribuzione più asimmetrica).
library(moments)
var<- c("sales","volume", "median_price", "listings", "months_inventory")
#function
ds<- function(x){
return(sd(x))
}
cv <- function(x){
return(sd(x, na.rm = TRUE)/mean(x, na.rm= TRUE)*100)
}
sk <- function(x){
return(skewness(x))
}
#apply to the variables
DV<-sapply(data[var],ds)
CV<- sapply(data[var], cv)
SK<- sapply(data[var], sk)
DV
## sales volume median_price listings
## 79.651111 16.651447 22662.148687 752.707756
## months_inventory
## 2.303669
CV
## sales volume median_price listings
## 41.42203 53.70536 17.08218 43.30833
## months_inventory
## 25.06031
SK
## sales volume median_price listings
## 0.71810402 0.88474203 -0.36455288 0.64949823
## months_inventory
## 0.04097527
#combine into table
results<- data.frame(
Deviazione_Std= DV,
Coeff_Var = CV,
Skewness = SK
)
#sorting
return_CV<- results[order(-results$Coeff_Var),]
return_SK<- results[order(-results$Skewness),]
results
## Deviazione_Std Coeff_Var Skewness
## sales 79.651111 41.42203 0.71810402
## volume 16.651447 53.70536 0.88474203
## median_price 22662.148687 17.08218 -0.36455288
## listings 752.707756 43.30833 0.64949823
## months_inventory 2.303669 25.06031 0.04097527
return_CV
## Deviazione_Std Coeff_Var Skewness
## volume 16.651447 53.70536 0.88474203
## listings 752.707756 43.30833 0.64949823
## sales 79.651111 41.42203 0.71810402
## months_inventory 2.303669 25.06031 0.04097527
## median_price 22662.148687 17.08218 -0.36455288
return_SK
## Deviazione_Std Coeff_Var Skewness
## volume 16.651447 53.70536 0.88474203
## sales 79.651111 41.42203 0.71810402
## listings 752.707756 43.30833 0.64949823
## months_inventory 2.303669 25.06031 0.04097527
## median_price 22662.148687 17.08218 -0.36455288
Variabilità ( Deviazione Satndard & Coefficente di Variazione CV )
La Variabile con la maggiore deviazione standard è “median_price” (22662) , ma ha diversa unità di misura rispetto alle altre variabili e questo influisce sulla sua scala di grandezza.
Per un confronto più equo , utilizzo il CV (coefficiente di variazione): la variabile con una maggiore variabilità risulta ” volume ” (CV = 53,7%). Questo indica che nel caso della variabile “volume” i dati si disperdono del 53,7% rispetto alla media.
Asimmetria ( Skewness )
La variabile che risulta più asimmetrica è ” volume ” , con indice di skewness pari a 0,88 (Asimmetria Positiva e quindi coda verso destra).
Asimmetria positiva significa che la distribuzione è formata da molti valori bassi e pochi alti che trascinano la coda a destra.
Per svolgere questa analisi ho usato come variabile ” sales ” (variabile quantitativa continua).
Costruzione delle Classi
min(sales)
## [1] 79
max(sales)
## [1] 423
sales_range<- range(sales)
sales_classes<- cut(sales, breaks = seq(0,500,50))
sales_classes
## [1] (50,100] (100,150] (150,200] (150,200] (200,250] (150,200] (150,200]
## [8] (150,200] (100,150] (100,150] (100,150] (100,150] (100,150] (100,150]
## [15] (100,150] (150,200] (100,150] (150,200] (150,200] (150,200] (100,150]
## [22] (150,200] (100,150] (150,200] (100,150] (100,150] (150,200] (150,200]
## [29] (150,200] (150,200] (150,200] (200,250] (150,200] (150,200] (150,200]
## [36] (150,200] (150,200] (100,150] (150,200] (150,200] (200,250] (200,250]
## [43] (200,250] (250,300] (200,250] (150,200] (150,200] (200,250] (100,150]
## [50] (150,200] (150,200] (200,250] (200,250] (250,300] (200,250] (250,300]
## [57] (200,250] (250,300] (150,200] (200,250] (50,100] (100,150] (150,200]
## [64] (200,250] (250,300] (250,300] (150,200] (150,200] (100,150] (50,100]
## [71] (100,150] (100,150] (50,100] (100,150] (150,200] (150,200] (200,250]
## [78] (250,300] (200,250] (150,200] (100,150] (100,150] (100,150] (100,150]
## [85] (100,150] (100,150] (100,150] (150,200] (250,300] (250,300] (250,300]
## [92] (250,300] (100,150] (150,200] (150,200] (100,150] (100,150] (100,150]
## [99] (150,200] (250,300] (300,350] (350,400] (400,450] (300,350] (150,200]
## [106] (150,200] (150,200] (150,200] (150,200] (150,200] (250,300] (300,350]
## [113] (350,400] (350,400] (400,450] (250,300] (200,250] (200,250] (150,200]
## [120] (150,200] (150,200] (150,200] (200,250] (300,350] (250,300] (250,300]
## [127] (250,300] (200,250] (200,250] (200,250] (150,200] (200,250] (100,150]
## [134] (150,200] (200,250] (250,300] (250,300] (300,350] (250,300] (250,300]
## [141] (250,300] (200,250] (200,250] (150,200] (150,200] (200,250] (250,300]
## [148] (250,300] (250,300] (300,350] (300,350] (300,350] (250,300] (250,300]
## [155] (200,250] (200,250] (150,200] (200,250] (250,300] (250,300] (300,350]
## [162] (300,350] (350,400] (350,400] (250,300] (250,300] (250,300] (200,250]
## [169] (200,250] (200,250] (250,300] (300,350] (350,400] (400,450] (350,400]
## [176] (300,350] (350,400] (350,400] (250,300] (300,350] (50,100] (50,100]
## [183] (100,150] (150,200] (150,200] (100,150] (100,150] (100,150] (100,150]
## [190] (100,150] (50,100] (100,150] (50,100] (50,100] (100,150] (100,150]
## [197] (100,150] (100,150] (100,150] (100,150] (100,150] (50,100] (50,100]
## [204] (50,100] (100,150] (50,100] (100,150] (100,150] (100,150] (100,150]
## [211] (100,150] (100,150] (50,100] (50,100] (100,150] (100,150] (50,100]
## [218] (100,150] (150,200] (100,150] (100,150] (100,150] (100,150] (100,150]
## [225] (100,150] (100,150] (50,100] (50,100] (50,100] (50,100] (100,150]
## [232] (100,150] (100,150] (100,150] (100,150] (100,150] (100,150] (100,150]
## [239] (50,100] (100,150]
## 10 Levels: (0,50] (50,100] (100,150] (150,200] (200,250] ... (450,500]
#Absolute Frequency
ni<- table(sales_classes)
#Relative Frequency
fi<- ni/length(sales)
#Cumulative Frequency
Ni<- cumsum(ni)
#Relative Cumulative Frequency
Fi<- cumsum(fi)
df_freq<- data.frame(cbind(ni,fi,Ni,Fi))
df_freq
## ni fi Ni Fi
## (0,50] 0 0.00000000 0 0.0000000
## (50,100] 21 0.08750000 21 0.0875000
## (100,150] 72 0.30000000 93 0.3875000
## (150,200] 56 0.23333333 149 0.6208333
## (200,250] 32 0.13333333 181 0.7541667
## (250,300] 34 0.14166667 215 0.8958333
## (300,350] 13 0.05416667 228 0.9500000
## (350,400] 9 0.03750000 237 0.9875000
## (400,450] 3 0.01250000 240 1.0000000
## (450,500] 0 0.00000000 240 1.0000000
#Bar Graph
bar<- barplot(df_freq$ni, names.arg = row.names(df_freq),col="lightblue", xlab="Classes Range", ylab= "Absolute Frequency",main="Bar Graph x Sales", ylim = c(0,80) )
text(bar, df_freq$ni, labels= df_freq$ni , pos=3)
Indice di Gini
Formula :
\(G = 1-Σ fi^2\)
dove \(fi\) sono le frequenze relative per classe.
G = 0 -> Distribuzione concentrata in poche classi (Bassa Eterogeneità)
G = 1 -> Distribuzione più uniforme (alta eterogeneità)
fi<- ni/length(sales)
fi2<- fi^2
j<- length(ni)
#Gini Index
gini<- 1-sum(fi2)
#Gini Index Normalized
gini_norm<- gini/(j-1)/j
gini
## [1] 0.8055556
gini_norm
## [1] 0.008950617
Dato che G = 0,805 , la distribuzione del sales è abbastanza eterogenea , quindi non tutte le vendite sono concentrate nella stessa classe.
G = 0,805 ( Gini normalizzata = 0,0089) , la distribuzione del sales è abbastanza eterogenea , quindi non tutte le vendite sono concentrate nella stessa fascia e si distribuiscono in modo diversificato.
Dal grafico a barre si può osservare che la maggioranza delle sales cadono tra 100 e 200.
Richiesta : “Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”? E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?“
Per risolvere tutte e 3 le richieste utilizzo il metodo di calcolo della Probabilità Frequentista :
\(P(evento) = n° Casi favorevoli/ n° Tot casi Possibili\)
#Probability of city Beamount
head(data)
## 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
attach(data)
## I seguenti oggetti sono mascherati da data (pos = 4):
##
## city, listings, median_price, month, months_inventory, sales,
## volume, year
nrows<- dim(data)[1]
n_beaumont <- sum(city =="Beaumont")
n_beaumont
## [1] 60
p_beamount<- n_beaumont/nrows
p_beamount
## [1] 0.25
#Probability month Luglio
n_july<- sum(month== 7)
p_july<- n_july/nrows
p_july
## [1] 0.08333333
#Probability December 2012
n_dec_2012<- sum(month == 12 & year== 2012)
p_dec_2012<- n_dec_2012/nrows
p_dec_2012
## [1] 0.01666667
Per calcolare il prezzo medio degli immobili ho effettutato il
rapporto tra ” volume
” ( valore totale delle vendite ,
espressa in milioni ) e ” sales
” (numero di immobili
venduti)
#Average Real Estate Price
data$avg_price<- data$volume *10^6/data$sales
head(data$avg_price)
## [1] 170626.5 163796.3 157697.8 134095.0 142737.6 144015.9
Per calcolare l’efficacia degli annunci di vendita , ho effettuato il
rapporto tra ” sales
” ( vendite effettive ) e ”
listings
” ( numero di annunci ). Questo nuovo indice
permette di misurare l’efficacia degli annunci di vendita.
#Ads Efficency
data$efficency<- data$sales/data$listings
head(data$efficency)
## [1] 0.05414220 0.06809584 0.10775607 0.11709602 0.11405985 0.10482529
Il risultato sarà compreso tra 0 & 1 :
valori vicini a 1 -> alta Efficacia : Quasi tutti gli annunci hanno generato una vendita
valori vicini a 0 -> Bassa Efficacia : Molti annunci non si trasformano in vendita
Analizzo nel dettaglio come le 2 variabili si distribuiscono e concentrano la maggior parte degli immobili per AVG Price & Ads Efficency.
summary(data$avg_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 97010 132939 156588 154320 173915 213234
#Histogram x AVG_Price
library(ggplot2)
ggplot(data)+
geom_histogram(aes(x= avg_price),binwidth = 10000 ,fill= "lightblue",color= "black")+
geom_vline(xintercept = 132939, color= "red",lty="dashed", lwd=2)+
geom_vline(xintercept = 173915, color= "red",lty= "dashed", lwd=2)+
labs(title = "Distribution of Real Estate's AVG price", x="AVG Price [$]", y="Frequency")+
theme_classic()
#Line Chart x Avg-Price
data$period <- as.Date(paste(data$year, data$month, "01", sep = "-"))
data$period <- as.Date(paste(data$year, data$month, "01", sep = "-"))
ggplot(data)+geom_line(aes(x = period, y = avg_price, color = city, group = city)) +
geom_point(aes(x = period, y = avg_price, color = city, group = city),size = 1) +
labs(title = "AVG Price for city in time",
x = "Period",
y = "AVG Price ($)") +
scale_x_date(date_labels = "%Y-%m")+theme_minimal()+
theme(legend.position = "bottom")
Range : I prezzi medi oscillano tra 97.000 $ e i 213.000 $.
Quartili : il 1° Quartile ( 132.939 $) e il 3° quartile (173.915 $) racchiudono il 50% centrale delle osservazioni.
Mediana : Pari a 156.588 $ ) è molto vicina alla Media ( 154.320 $ ) , suggerendo una distribuzione abbastanza simmetrica.
Concentrazione : La maggior parte degli immobili ha un prezzo medio di vendita tra 130.000 $ - 175.000 $ , con alcuni valori estremi ( 97.000$ - 21000 $ ).
Trend Temporale : dal 2010 al 2011, Il prezzo medio mantiene un andamento costante per tutte le città , mentre dal 2012 si denota una tendenza alla crescita, sopratutto per città come Bryan-Collage Station.
data_efficency_sort<- data[order(data$efficency),]
head(data_efficency_sort)
## city year month sales volume median_price listings months_inventory
## 133 Tyler 2011 1 143 21.050 120600 2852 12.6
## 131 Tyler 2010 11 155 24.411 130000 3042 13.4
## 1 Beaumont 2010 1 83 14.162 163800 1533 9.5
## 121 Tyler 2010 1 160 25.487 138900 2727 11.3
## 145 Tyler 2012 1 169 25.386 124200 2811 11.7
## 134 Tyler 2011 2 181 28.320 128800 2938 13.0
## avg_price efficency period
## 133 147202.8 0.05014025 2011-01-01
## 131 157490.3 0.05095332 2010-11-01
## 1 170626.5 0.05414220 2010-01-01
## 121 159293.8 0.05867253 2010-01-01
## 145 150213.0 0.06012095 2012-01-01
## 134 156464.1 0.06160654 2011-02-01
summary(data$efficency)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.05014 0.08980 0.10963 0.11874 0.13492 0.38713
#Line Chart x Avg-Price
ggplot(data)+geom_line(aes(x = period, y = efficency, color = city, group = city))+
geom_point(aes(x = period, y = efficency, color = city, group = city),size = 1) +
labs(title = "Ads Efficency for city in time",
x = "Period",
y = "Ads Efficency") +
scale_x_date(date_labels = "%Y-%m")+theme_minimal()+
theme(legend.position = "bottom")
Range : Il tasso di conversione tra annuncio pubblicitario e vendita immobile varia tra 5% e 39% -> range non elevato , con qualche outlier verso l’alto che si stacca dalla maggior parte della distribuzione.
Quartili : il 1° Quartile ( 8,9 %) e il 3° quartile (13,49% ) racchiudono il 50% centrale delle efficienze.
Mediana : Pari a 10,96 % è leggermente superiore alla Media ( 11,87 % ) e questo suggerisce una leggera asimmetria verso destra dovuto a pochi annunci molto efficienti (+ valori bassi nella distribuzione).
Concentrazione : La maggior parte degli annunci ha un tasso di conversione tra il 9% e il 13 % , con pochi casi oltre il 20%.
Trend Temporale : Dal 2010 - 2011 l’efficienza resta bassa (5 % -10%) ; dal 2012 si denota un trend crescente , con gran parte delle città che arriva tra il 10% e il 15%.. Dal 2013 si registra un trend crescente raggiungendo picchi notevoli (Le città che raggiunge più rapidamente questi picchi è Bryan-College Station.
AVG Price : I prezzi medi degli immobili si attesta intorno ai 150-170k $ con un distribuzione abbastanza simmetrica/ equilibrata
Ads Efficency : il tasso di conversione pubblicità / vendita degli immobili si concentra sul 10 % con pochi casi che innalzano la media. Dal 2012 mostra un trend crescente nel tempo, suggerendo un miglioramento delle capacità di convertire gli annunci di vendite.
Usa il pacchetto dplyr
o il linguaggio base di R per
effettuare analisi statistiche condizionate per città, anno e mese.
Genera dei summary (media, deviazione standard) e
rappresenta graficamente i risultati.
Inzialmente generiamo dei summary (media e deviazione standard) per effettuare analisi statistiche condizionate per città , anno, mese.
#Mean & standard deviation for City & Year/Month
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
df_summary<- data %>%
group_by(city,year,month) %>%
summarise(
mean_sales = mean(sales, na.rm= TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm= TRUE),
mean_listings = mean(listings, na.rm= TRUE),
sd_listings= sd(listings, na.rm = TRUE),
mean_avg_price = mean(avg_price, na.rm = TRUE),
sd_avg_price = sd(avg_price, na.rm = TRUE),
mean_efficency = mean(efficency, na.rm = TRUE ),
sd_efficency = sd(efficency, na.rm = TRUE),
.groups= "drop"
)
df_summary
## # A tibble: 240 × 13
## city year month mean_sales sd_sales mean_volume sd_volume mean_listings
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 2010 1 83 NA 14.2 NA 1533
## 2 Beaumont 2010 2 108 NA 17.7 NA 1586
## 3 Beaumont 2010 3 182 NA 28.7 NA 1689
## 4 Beaumont 2010 4 200 NA 26.8 NA 1708
## 5 Beaumont 2010 5 202 NA 28.8 NA 1771
## 6 Beaumont 2010 6 189 NA 27.2 NA 1803
## 7 Beaumont 2010 7 164 NA 22.7 NA 1857
## 8 Beaumont 2010 8 174 NA 25.2 NA 1830
## 9 Beaumont 2010 9 124 NA 17.2 NA 1829
## 10 Beaumont 2010 10 150 NA 23.9 NA 1779
## # ℹ 230 more rows
## # ℹ 5 more variables: sd_listings <dbl>, mean_avg_price <dbl>,
## # sd_avg_price <dbl>, mean_efficency <dbl>, sd_efficency <dbl>
df_summary<- df_summary%>%
mutate(period= as.Date(paste(year, month,"01",sep= "-")))
Ora posso utilizzare questo summarise per le seguenti variabili :
sales
, volume
, avg_price
,
listings
, efficency
per costruire dei grafici
per visualizzare analisi statistiche condizionate per città , anno ,
mese.
library(dplyr)
summary_city_year<- data %>%
group_by(city,year) %>%
summarise(
mean_sales = mean(sales, na.rm= TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm= TRUE),
mean_listings = mean(listings, na.rm= TRUE),
sd_listings= sd(listings, na.rm = TRUE),
mean_avg_price = mean(avg_price, na.rm = TRUE),
sd_avg_price = sd(avg_price, na.rm = TRUE),
mean_efficency = mean(efficency, na.rm = TRUE ),
sd_efficency = sd(efficency, na.rm = TRUE),
.groups= "drop"
)
#Graphics per Year
library(scales)
library(ggplot2)
#Barplot x Sales
ggplot(summary_city_year, aes(x= year, y= mean_sales, fill=city))+
geom_bar(stat= "identity", position= "dodge")+
geom_errorbar(aes(ymin=mean_sales-sd_sales, ymax = mean_sales+sd_sales), position = position_dodge(width = 0.9))+geom_text(aes(label = round(mean_sales, 1)),position = position_dodge(width = 0.9), size=2.5, vjust= -0.4, hjust= 0.5) +
labs(title= "Avg Sales Trend x city", x= "Year", y= "Avg Sales")+theme_gray()+
theme(legend.position = "bottom")
#Barplot x Volume
ggplot(summary_city_year, aes(x= year, y= mean_volume, fill=city))+
geom_bar(stat= "identity", position="dodge")+
geom_errorbar(aes(ymin=mean_volume-sd_volume, ymax = mean_volume+sd_volume), position = position_dodge(width = 0.9))+
geom_text(aes(label = round(mean_volume, 1)),position = position_dodge(width = 0.9), size=2.5, vjust= -0.4, hjust= 0.5) +
labs(title= "Avg Volume Trend x city", x= "Year", y= "Avg Volume [$]")+theme_gray()+theme(legend.position = "bottom")
#Barplot x Listings
ggplot(summary_city_year, aes(x= year, y= mean_listings, fill=city))+
geom_bar(stat= "identity", position="dodge")+
geom_errorbar(aes(ymin=mean_listings- sd_listings, ymax = mean_listings+sd_listings), position = position_dodge(width = 0.9))+geom_text(aes(label = round(mean_listings, 1)),position = position_dodge(width = 0.9), size=2.5, vjust= -0.4, hjust= 0.5)+
labs(title= "Listings Trend x city", x= "Year", y= "N° Listings")+theme_grey()+theme_gray()+theme(legend.position = "bottom")
#Barplot x AVG Price
ggplot(summary_city_year, aes(x= year, y= mean_avg_price, fill=city))+
geom_bar(stat= "identity", position="dodge")+
geom_errorbar(aes(ymin=mean_avg_price- sd_avg_price, ymax = mean_avg_price+sd_avg_price), position = position_dodge(width = 0.9))+ geom_text(aes(label = round(mean_avg_price, 1)),position = position_dodge(width = 0.9), size=2.5, vjust= -0.4, hjust= 0.5)+ labs(title= "Avg Price Trend x city", x= "Year", y= "Avg Price [$]")+theme_gray()+theme_gray()+theme(legend.position = "bottom")
#Barplot x Ads Efficency
ggplot(summary_city_year, aes(x= year, y= mean_efficency, fill=city))+
geom_bar(stat= "identity", position= "dodge")+
geom_errorbar(aes(ymin=mean_efficency- sd_efficency, ymax = mean_efficency+sd_efficency), position = position_dodge(width = 0.9))+ geom_text(aes(label = round(mean_efficency, 3)),position = position_dodge(width = 0.9), size=2.5, vjust= -0.4, hjust= 0.5)+ labs(title= "Ads Efficency Trend x city", x= " Year", y= "Ads Efficency")+theme_grey()+theme_gray()+theme(legend.position = "bottom")
library(dplyr)
#Add Var "Period" : Month +Year
df_summary<- df_summary%>%
mutate(period= as.Date(paste(year, month,"01",sep= "-")))
library(scales)
library(ggplot2)
#Barplot x Sales
ggplot(df_summary, aes(x= period, y= mean_sales, fill=city))+
geom_bar(stat= "identity", position= position_dodge(width=0.9))+
geom_errorbar(aes(ymin=mean_sales-sd_sales, ymax = mean_sales+sd_sales), position = position_dodge(width = 0.9))+
labs(title= "Avg Sales Trend x city", x= "Month - Year", y= "Avg Sales")+theme_gray()+scale_x_date(labels = date_format("%m\n%Y"), breaks="4 months")+
theme(axis.text = element_text(angle=45, hjust= 1))+theme(legend.position = "bottom")
#Barplot x Volume
ggplot(df_summary, aes(x= period, y= mean_volume, fill=city))+
geom_bar(stat= "identity", position= position_dodge(width=0.9))+
geom_errorbar(aes(ymin=mean_volume-sd_volume, ymax = mean_volume+sd_volume), position = position_dodge(width = 0.9))+
labs(title= "Avg Volume Trend x city", x= "Month - Year", y= "Avg Volume [$]")+theme_gray()+scale_x_date(labels = date_format("%m\n%Y"), breaks="4 months")+
theme(axis.text = element_text(angle=45, hjust= 1))+theme(legend.position = "bottom")
#Barplot x Listings
ggplot(df_summary, aes(x= period, y= mean_listings, fill=city))+
geom_bar(stat= "identity", position= position_dodge(width=0.9))+
geom_errorbar(aes(ymin=mean_listings- sd_listings, ymax = mean_listings+sd_listings), position = position_dodge(width = 0.9))+
labs(title= "Listings Trend x city", x= "Month - Year", y= "N° Listings")+theme_grey()+scale_x_date(labels = date_format("%m\n%Y"), breaks="4 months")+
theme(axis.text = element_text(angle=45, hjust= 1))+theme(legend.position = "bottom")
#Barplot x AVG Price
ggplot(df_summary, aes(x= period, y= mean_avg_price, fill=city))+
geom_bar(stat= "identity", position=position_dodge(width=0.9))+
geom_errorbar(aes(ymin=mean_avg_price- sd_avg_price, ymax = mean_avg_price+sd_avg_price), position = position_dodge(width = 0.9))+
labs(title= "Avg Price Trend x city", x= "Month - Year", y= "Avg Price [$]")+theme_gray()+scale_x_date(labels = date_format("%m\n%Y"), breaks="4 months")+
theme(axis.text = element_text(angle=45, hjust= 1))+theme(legend.position = "bottom")
#Barplot x Ads Efficency
ggplot(df_summary, aes(x= period, y= mean_efficency, fill=city))+
geom_bar(stat= "identity", position= position_dodge(width=0.9))+
geom_errorbar(aes(ymin=mean_efficency- sd_efficency, ymax = mean_efficency+sd_efficency), position = position_dodge(width = 0.9))+
labs(title= "Ads Efficency Trend x city", x= "Month - Year", y= "Ads Efficency")+theme_grey()+scale_x_date(labels = date_format("%m\n%Y"), breaks="4 months")+
theme(axis.text = element_text(angle=45, hjust= 1))+theme(legend.position = "bottom")
Beaumont : Ha una crescita moderata in termini di vendite e ricavi dalle vendite, con picchi solo nel 2013 e nel 2014. Questo può essere dovuto a uno dei più bassi tassi di conversione annuncio - vendita degli immobili. Beaumont si dimostra tra la città peggiori in termini di vendite; un aumento di annunci pubblicitari porterebbe portare un drastico incremento del fatturato.
Bryan-College Station : si dimostra la città con la crescita migliore in termini di vendita, ricavi, prezzi medi. Per ora dimostra un volume di vendita e un fatturato peggiore rispetto a Tyler , probabilmente dovuti a bassi investimenti in annunci pubblicitari. Tuttavia dimostra sempre un alto tasso di conversione e ciò potrebbe suggerire un maggiore investimento in advertising per consentire una crescita sostanziale delle vendite.
Tyler : presenta un crescita solita in termini di vendite e ricavi, ma ciò è dovuto a maggior investimenti in annunci pubblicitari e un minor prezzo medio degli immobili venduti rispetto a Bryan-College Station. La usa efficienza pubblicitaria è buona ma non eccellente. Per Tyler è preferibile ottimizzare il rapporto tra pubblicità e prezzi medi contenuti per aumentare i ricavi.
Wichita Falls : mostra le performance più basse in termini di vendite e ricavi di vendita , nonostante ha tassi di conversione più alti rispetto ad altre città come Beaumont e Tyler. Quindi l’unico modo per risollevare le vendite in questa città sembra essere un aumento significativo degli investimenti pubblicitari.
library(ggplot2)
library(dplyr)
attach(data)
## I seguenti oggetti sono mascherati da data (pos = 6):
##
## city, listings, median_price, month, months_inventory, sales,
## volume, year
## I seguenti oggetti sono mascherati da data (pos = 8):
##
## city, listings, median_price, month, months_inventory, sales,
## volume, year
#Group Median Price by City
data_mean<- data%>%
group_by(city)%>%
summarise(mean_price =mean(median_price, na.rm = TRUE))
#Boxplot Avg Price x city
ggplot(data)+geom_boxplot(aes(x=city, y=median_price, fill=city))+
geom_text(data = data_mean, aes(x = city, y = mean_price, label = round(mean_price, 2)),
size = 3, vjust = -0.5, hjust = 0.5)+labs(title= "Median Price Boxplot for City", x= "City", y= "Median Price [$]")+
theme(legend.position = "bottom")
Insights :
Beaumont : Mediana intermedia (= 130k $) e una variabilità moderata con un outlier isolato -> mercato concentrato conpochi immobili con prezzo elevato.
Bryan-College Station : Mediana più alta (= 157k $) e variabilità moderata -> mercato prevede richiesta di immobile a range di prezzo più alto ma con valori stabili.
Tyler : Mediana intermedia (= 141k $) ma con IQR più ampio -> maggiore variabilità dei prezzi , con immobili che spaziano dalla fascia media e a quella economicia
Witcha Falls : Mediana nettamente più bassa (102,7k $) e IQR ridotto -> città con immobili a basso prezzo , che ci concentrano intorno al valore medio.
#BarChart Sales x month & city
ggplot(data, aes(x= period, y= sales, fill=city))+
geom_bar(stat= "identity", position= "stack")+
labs(title= " Sales Trend x city", x= "Month - Year", y= "Avg Sales")+theme_gray()+scale_x_date(labels = date_format("%m\n%Y"), breaks="4 months")+
theme(axis.text = element_text(angle=45, hjust= 1))+theme(legend.position = "bottom")
Andamento stabile delle vendite in tutte le città , tranne Bryan-College Station che mostraun crescita visibile nel tempo.
Si denotano picchi ricorrenti nei mesi estivi (generalmente da Marzo a Settembre di ogni anno) e cali durante l’inverno -> La stagionalità è uno dei fattori principali per pianificare strategie di marketing.
ggplot(summary_city_year, aes(x = year, y = mean_sales, color = city)) +
geom_line(size = 1) +
geom_text(aes(label = round(mean_sales,2)) ,size =3, vjust = -0.5, hjust = 0.5)+
theme_grey() +
labs(title = "Storic Sales Trend by City",
x = "Year", y = "Sales") +
theme(legend.position = "bottom")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Tramite il Line Chart si evidenzia meglio il trend storico delle vendite degli immobili nelle singole città:
Tyler è quella che mantiene durante tutti gli anni volumi di vendita maggiori con una crescita costante dal 2010 al 2015.
Bryan-College Station ha un trend con una maggiore crescita tra il 2012 e il 2014,
Beaumont ha una andamento costante senza grandi variazioni e con una piccola crescita negli ultimi 2 anni.
Wichita-Falls è l’unica città in cui si denota un calo delle vendite negli ultimi 2 anni.
Nel complesso tutte le città (tranne Wichita-Falls) mostrano un crescita positiva nel periodo analizzato , sintomo di una fase di espansione del mercato immobiliare.
Nel periodo 2010 - 2014, il mercato immobiliare presenta alcune caratteristiche distintive :
Crescita costante : Si osserva una crescita costante sia in termini di vendite che di importo generato dalle vendite , seppur con dinamiche decisamente diverse da città a città.
Stagionalità Marcata : Le vendite di immobili si concentrano tra marzo e settembre, mentre nei mesi invernali si registra un rallentamento significativo.
Segmentazione di Mercato Netta : Alcune città si attestano su prezzi elevati e stabili, altre privilegiavano i volumi , con prezzi medi più bassi ma un maggiore numero di vendite.
Bryan-College Station
Volumi di Vendita : Vendite e Ricavi crescono in modo rilevante soprattutto dal 2012 in poi.
Prezzo Medio degli Immobili : Prezzo medio è il più alto (175k $) tra le città analizzzate , confermando il posizionamento nel segmento dei immobili di fascia alta.
Tasso di conversione tra annunci e vendite : è tra i più alti tra le città analizzate con un picco del 23,6% nel
In termini operativi , conviene incrementare l’investimento pubblicitario per sfruttare al massimo l’efficienza ed aumentare ulteriormente i volumi.
Tyler
Volumi di Vendita : Leader indiscusso in termini di vendite e ricavi in tutta la serie storica.
Prezzo Medio degli Immobili : Il prezzo medio si colloca intorno a 141k $ ma con alta variabilità , segno di un mercato eterogeneo.
Tasso di conversione tra annunci e vendite : l’efficienza pubblicitaria è buona con una media del 10% , ma non a livello dei top performer.
La strategia dovrebbe integrare campagne pubblicitarie mirate con una revisione del pricing, al fine di massimizzare i ricavi per unità venduta.
Beaumont
Volumi di Vendita : andamento stabile per vendite e ricavi , con alcuni picchi nel biennio 2013 - 2014.
Prezzo Medio degli Immobili : Il prezzo medio si colloca intorno a 131k $ , con variabilità contenuta.
Tasso di conversione tra annunci e vendite : l’efficienza pubblicitaria è tra i più bassi.
La priorità è aumentare il numero di annunci e ottimizzare le campagne per migliorare i tassi di conversione.
Wichita Falls
Volumi di Vendita : Vendite e Ricavi sono contenuti e mostrano una tendenza verso il basso.
Prezzo Medio degli Immobili : Prezzo medio basso (circa 102k $) e una bassa variabilità, segno di un mercato omogeneo.
Tasso di conversione tra annunci e vendite : l’efficienza pubblicitaria, rapportata alla dimensione del mercato, è discreta.
Un ampliamento dell’offerta e un potenziamento della visibilità potrebbero stimolare la domanda.
Variabilità : misurata con il coefficiente di variazione, risulta massima su ricavi (“Volume”) e annunci pubblicitari (“listings”), indicando differenze sostanziali tra mercati per dimensione e valori delle vendite.
Asimmetria : Positiva su vendite e ricavi riflette la presenza di code destre, con pochi casi di valori molto elevati che influenzano la media.
Distribuzione : L’analisi tramite il boxplot conferma la netta separazione nei livelli di prezzo tra città; inoltre la concentrazione in specifiche fasce è evidente, con indice di eterogenità (Gini) più elevati dove il mercato mostra una segmentazione spinta.
Sul piano operativo, è fondamentale pianificare le campagne nei mesi di maggiore attività (primavera-estate) per ottimizzare l’impatto.
Strategie specifiche per area :
Bryan-College Station : incrementare i volumi mantenendo elevato il prezzo d’acquisto.
Tyler : lavorare sull’aumento del prezzo medio senza perdere competitività.
Beaumont : migliorare l’efficienza pubblicitaria per valorizzare il potenziale di crescita.
Wichita Falls : espandere offerta e visibilità per stimolare la domanda.
In sintesi, le analisi statistiche confermano che le dinamiche locali che le dinamiche locali devono giudare le strategie operative, evitando approcci uniformi al mercato texano.