data <- read.csv("C:\\Users\\devel\\Documents\\realestate_texas.csv",sep=",")
attach(data)
N=dim(data)[1]
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(ggplot2)
Dimensione del dataset:
N=dim(data)[1]
N
## [1] 240
Prime righe del datataset:
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
Dai dati visualizzati possimo definire che le varibili contenute nel dataset sono:
È possibile calcolare:
Calcoliamo la distribuzione di fequenze per le variabili month, city, e year in quanto presentano poche modalità ripetute. Grazie a questi calcoli stabiliremo con che frequenza sono stati raccolti i dati nelle varie località.
Calcoliamo gli indici di posizione per tutte la variabili eccetto city per verificare la distribuzione dei dati
Calcoliamo gli indici di variabilità e forma arrotondando alla terza cifra decimale per tutte le variabili eccetto month, city, e year così da poter avere delle indicazioni sulle tendenze delle variabili ad assumere deteminati valori.
freq_abs <- table(city)
freq_rel <- table(city)/N
distr_freq_CITY<-cbind(freq_abs,freq_rel)
distr_freq_CITY
## freq_abs freq_rel
## Beaumont 60 0.25
## Bryan-College Station 60 0.25
## Tyler 60 0.25
## Wichita Falls 60 0.25
freq_ass <- table(month)
freq_rel <- table(month)/N
distr_freq_month<-cbind(freq_abs,freq_rel)
distr_freq_month
## freq_abs freq_rel
## 1 60 0.08333333
## 2 60 0.08333333
## 3 60 0.08333333
## 4 60 0.08333333
## 5 60 0.08333333
## 6 60 0.08333333
## 7 60 0.08333333
## 8 60 0.08333333
## 9 60 0.08333333
## 10 60 0.08333333
## 11 60 0.08333333
## 12 60 0.08333333
freq_ass <- table(year)
freq_rel <- table(year)/N
distr_freq_year<-cbind(freq_ass,freq_rel)
distr_freq_year
## freq_ass freq_rel
## 2010 48 0.2
## 2011 48 0.2
## 2012 48 0.2
## 2013 48 0.2
## 2014 48 0.2
t = subset(data, select = -city)
position_indices = cbind(summary(t))
position_indices
## year month sales volume
## "Min. :2010 " "Min. : 1.00 " "Min. : 79.0 " "Min. : 8.166 "
## "1st Qu.:2011 " "1st Qu.: 3.75 " "1st Qu.:127.0 " "1st Qu.:17.660 "
## "Median :2012 " "Median : 6.50 " "Median :175.5 " "Median :27.062 "
## "Mean :2012 " "Mean : 6.50 " "Mean :192.3 " "Mean :31.005 "
## "3rd Qu.:2013 " "3rd Qu.: 9.25 " "3rd Qu.:247.0 " "3rd Qu.:40.893 "
## "Max. :2014 " "Max. :12.00 " "Max. :423.0 " "Max. :83.547 "
## median_price listings months_inventory
## "Min. : 73800 " "Min. : 743 " "Min. : 3.400 "
## "1st Qu.:117300 " "1st Qu.:1026 " "1st Qu.: 7.800 "
## "Median :134500 " "Median :1618 " "Median : 8.950 "
## "Mean :132665 " "Mean :1738 " "Mean : 9.193 "
## "3rd Qu.:150050 " "3rd Qu.:2056 " "3rd Qu.:10.950 "
## "Max. :180000 " "Max. :3296 " "Max. :14.900 "
CV <-function(x){
return( sd(x)/mean(x) * 100 )
}
VARIABILITY_INDICES <- function (x){
mu=mean(x)
n=length(x)
dif = max(x) - min(x)
iqr = round(IQR(x), digits = 3)
var = round((var(x) * (n-1)) /n , digits = 3)
dv = round( sqrt(var), digits = 3)
cv = round( CV(x), digits = 3)
return( c(dif,iqr,var,dv,cv))
}
variability_indices <- data.frame(misura = c("DIF","IQR","VAR","DV", "CV"),
sales = VARIABILITY_INDICES(sales),
volume = VARIABILITY_INDICES(volume),
median_price =VARIABILITY_INDICES(median_price ),
listings = VARIABILITY_INDICES(listings ),
months_inventory = VARIABILITY_INDICES(months_inventory))
variability_indices
## misura sales volume median_price listings months_inventory
## 1 DIF 344.000 75.381 1.062000e+05 2553.000 11.500
## 2 IQR 120.000 23.233 3.275000e+04 1029.500 3.150
## 3 VAR 6317.865 276.115 5.114331e+08 564208.262 5.285
## 4 DV 79.485 16.617 2.261489e+04 751.138 2.299
## 5 CV 41.422 53.705 1.708200e+01 43.308 25.060
SHAPE_INDEXES <- function (x){
#asimmetria
mu<-mean(x)
sigma <- sd(x)
m3 <- sum( (x-mu)^3 ) / length(x)
asim.fisher <- round( m3 / sigma^3, digits = 3)
#curtosi
m4 <- sum( (x-mu)^4 ) / length(x)
curtosi <- round( m4 / sigma^4 - 3, digits = 3)
return( c( asim.fisher, curtosi))
}
shape_indices <- data.frame(misura = c("Fisher","curtosi"),
sales = SHAPE_INDEXES(sales),
volume = SHAPE_INDEXES(volume),
median_price = SHAPE_INDEXES(median_price ),
listings = SHAPE_INDEXES(listings ),
months_inventory = SHAPE_INDEXES(months_inventory))
shape_indices
## misura sales volume median_price listings months_inventory
## 1 Fisher 0.714 0.879 -0.362 0.645 0.041
## 2 curtosi -0.336 0.151 -0.643 -0.810 -0.198
Dall’ analisi della distribuzione di frequenze delle variabili city, year, e month possiamo affermare che le misurazioni sono state effettuate con una frequenza omogenea (una al mese dal 2014 al 2014) perchè le frequenze relative e assolute sono uguali per ogni anno, mese e anno
Dagli indici di forma possiamo riscontrre che le variabili sales, volume e listngs hanno una maggiore frequenza di modalità alte (distribuzione asimetrica positiva) mentre la variabile media_price ha una maggiore frequenza di modalità basse (distribuzione asimetrica negativa)
la variabile con variabilità più alta è il volume in quanto presenta il coefficiente di variazione maggiore. La variabile più asimmetrica è sempre il volume perchè presenta il valore assoluto dell’ indice di asimmetria di Fisher più elevato
Si è deciso di suddividere in classi la variabile sales. Il valore massimo e minimo riscontrati per la variabile sono rispettivamente 423 e 79 per cui è stato deciso di dividere la variabile nelle seguenti classi : (70,120], (120,170], (170,220], (220,270], (270,320], (320,370], (370,420], (420,470]
min(sales)
## [1] 79
max(sales)
## [1] 423
#suddivisione in classi variabile sales
sales_cl <- cut(sales,
breaks = c(70,120,170,220,270,320,370,420,470))
#calcolo distribuzioni di frequenze
ni<-table(sales_cl)
fi<-ni/N
Ni<-cumsum(ni)
Fi<-Ni/N
distr_freq_sales_cl<-as.data.frame(cbind(ni,fi,Ni,Fi))
distr_freq_sales_cl
## ni fi Ni Fi
## (70,120] 48 0.200000000 48 0.2000000
## (120,170] 68 0.283333333 116 0.4833333
## (170,220] 48 0.200000000 164 0.6833333
## (220,270] 27 0.112500000 191 0.7958333
## (270,320] 29 0.120833333 220 0.9166667
## (320,370] 14 0.058333333 234 0.9750000
## (370,420] 5 0.020833333 239 0.9958333
## (420,470] 1 0.004166667 240 1.0000000
data$sales_cl<-sales_cl
ggplot(data = data)+
geom_bar(
aes(x= sales_cl),
stat = "count",
col="black")+
labs(x="Classi",
y="Frequenze assoluta",
title="Frequenza assoluta per ogni classe di sales ")+
theme_bw()+
scale_y_continuous(breaks = seq(0,70,5))
gini.index <- function(x){
ni = table(x)
fi = ni/length(x)
fi2 = fi^2
J = length(table(x))
gini = 1-sum(fi2)
gini.norm = gini/((J-1)/J)
return(gini.norm)
}
gini.index(data$sales_cl)
## [1] 0.924127
L’indice di Gini per la classe è 0.924127 questo indica che l’ eterogeneità è quasi massima
La probabilità che, presa una riga a caso di questo dataset essa riporti la città “Beaumont” è la sua frequenza relativa ovvero 0,25 ( numero di volte in cui compare / numero totale elementi) . La probabilità che riporti il mese di Luglio è la sua frequenza relativa ovvero 0,083 ( numero di volte in cui compare / numero totale elementi). E la probabilità che riporti il mese di dicembre 2012 è data dalla somma della probabilità che venga riportato il mese dicembre (0,083) con la probabilità che sia riportato l’anno 2012 ( 0,2) che corrisponde a 0,283
data$mean_price <- volume/sales
ggplot(data)+
geom_bar( aes(x = city , y = mean_price ),
stat = "identity")+
labs(x="città",
y="Prezzo medio",
title="Prezzo medio degli annunci di vendita in milioni di dollari ")
# il numero totale di vendite fratto annunci attivi
data$efficacy <- sales/listings
ggplot(data)+
geom_bar( aes(x = city , y = efficacy ),
stat = "identity")+
labs(x="città",
y="Efficacia",
title="Efficacia degli annunci di vendita")
Considerando efficacia di vendita come il rapporto tra le vendite il numero totale di annunci attivi la città che presenta maggiore efficacia è Bryan-Collage e quella che presenta una minore efficacia è Tyler
dataForCity = data %>% group_by(city)%>%
summarise(mean_Sales = mean(sales), sd_sales = sd(sales),
mean_volume = mean(volume), sd_volume = sd(volume))
#Media vendite per città
ggplot(dataForCity, aes(x = city , y = mean_Sales , fill = city))+
geom_bar( stat = "identity")+
geom_text(aes(label=round(mean_Sales, 2)), vjust=-0.5)+
labs(x="città",
y="media vendite ",
title="Media vendite per città")+
theme(legend.position = "none")
dataForMonth = data %>% group_by(month)%>%
summarise(mean_Sales = mean(sales), sd_sales = sd(sales), mean_volume = mean(volume), sd_volume = sd(volume))
#Media vendite per mese
ggplot(dataForMonth, aes(x = month , y = mean_Sales , fill = month))+
geom_bar( stat = "identity")+
geom_text(aes(label=round(mean_Sales, 2)), vjust=-0.5)+
scale_x_continuous(breaks = seq(1, 12, 1)) +
labs(x="mese",
y="media vendite ",
title="Media vendite per mese")+
theme(legend.position = "none")
dataForYear = data %>% group_by(year)%>%
summarise(mean_Sales = mean(sales), sd_sales = sd(sales), mean_volume = mean(volume), sd_volume = sd(volume))
#Media vendite per città
ggplot(dataForYear, aes(x = year , y = mean_Sales , fill = year))+
geom_bar( stat = "identity")+
geom_text(aes(label=round(mean_Sales, 2)), vjust=-0.5)+
labs(x="Anno",
y="media vendite ",
title="Media vendite per anno")+
theme(legend.position = "none")
ggplot(data)+
geom_boxplot(aes(
x=city,
y= median_price),
col="red",
fill="darkblue")+
labs(x="cità ",
y="Prezzo medio",
title="Distribuzione prezzo medio")+
theme_bw()+
scale_y_continuous(breaks = seq(75000,175000,3000))
ggplot(data)+
geom_boxplot(aes(
x=city,
y= median_price,
fill= factor(year)))+
labs(x="città",
y="Prezzo medio",
title="Distribuzione prezzo medio per anno ")+
theme_bw()+
scale_y_continuous(breaks = seq(75000,175000,3000))+
scale_fill_discrete(name = "Legenda")
ggplot(data)+
geom_bar( aes(x = month, y = sales, fill = city),
stat = "identity", position = "dodge", width = 0.8)+
scale_x_continuous(breaks = seq(1, 12, 1)) +
scale_y_continuous(breaks = seq(100,5000,50))+
labs(title = "Vendite totali mensili per ogni città",
x = "Month",
y = "Total Sales",
fill = "City")
ggplot(data)+
geom_bar( aes(x = month, y = sales, fill = city),
stat = "identity")+
scale_x_continuous(breaks = seq(1, 12, 1)) +
scale_y_continuous(breaks = seq(100,5000,250))+
labs(title = "Vendite totali mensili per ogni città",
x = "Month",
y = "Total Sales",
fill = "City")
ggplot(data)+
geom_bar( aes(x = month, y = sales),
stat = "identity")+
scale_x_continuous(breaks = seq(1, 12, 1)) +
scale_y_continuous(breaks = seq(100,5000,250))+
labs(title = "Vendite totali per ogni mese",
x = "Month",
y = "Total Sales",
fill = "City")
dataForCityYear = data %>% group_by(city, year)%>%
summarise(sales = mean(sales))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
ggplot(dataForCityYear, aes(x = year, y = sales,fill = city, color = city , group = city)) +
geom_line() +
geom_point() +
labs(title = "Evoluzione andamendo delle vendite ",
x = "cità",
y = "numero vendite") +
theme_minimal()
dataForCityYear = data %>% group_by(year,city)%>%
summarise(median_price = mean(median_price))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
ggplot(dataForCityYear, aes(x = year, y = median_price,fill = city, color = city , group = city)) +
geom_line() + # Aggiungi la linea
geom_point() +
labs(title = "Evoluzione andamendo prezzi medi ",
x = "cità",
y = "Prezzo medio in dollari ") +
theme_minimal()
ggplot(data)+
geom_bar( aes(x = month, y = listings , fill = city),
stat = "identity", position = "dodge", width = 0.8)+
scale_x_continuous(breaks = seq(1, 12, 1)) +
labs(title = "numero annunci attivi per ogni città e mese",
x = "Month",
y = "Annunci attivi",
fill = "City")
Dai boxplot del prezzo medio per città è anno possiamo riscontrare (questo grafico ci da valori più attendibili rispetto al line charts per confrontare l’andamento delle vendite in periodi storici differenti in quanto evidenzia gli Outlier):
Dal grafici a barre per confrontare la distribuzione delle vendite tra le varie città possiamo riscontrare:
Dai grafici a barre per confrontare il numero di annunci attivi per mese e città possiamo riscontrare: