# import dati
dati <- read.csv("realestate_texas.csv", sep=",")
head(dati)
## 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
N = nrow(dati)
Nel dataset sono presenti 240 osservazioni e 8 variabili:
city è una variabile qualitativa nominale
analisi: distribuzione di frequenza, moda, indice di Gini
year è una variabile quantitativa discreta
analisi: distribuzione di frequenze, range
month è una variabile quantitativa discreta, potrebbe essere
considerata come una variabile categorica ordinale codificata
analisi: distribuzione di frequenze
sales è una variabile quantitativa discreta
analisi: tutti gli indici di posizone, variabilità e forma
volume è una variabile quantitativa continua
analisi: tutti gli indici di posizione, variabilità e forma
median_price è una variabile quantitativa continua
analisi: tutti gli indici di posizione, variabilità e forma
listings è una variabile quantitativa discreta
analisi: tutti gli indici di posizone, variabilità e forma
months_inventory è una variabile quantitativa continua
analisi: tutti gli indici di posizione, variabilità e forma
attach(dati)
# funzione per Coefficiente di Variazione
CV <-function(x){
return( sd(x)/mean(x) * 100 )
}
# libreria per indici di forma
library(moments)
table(city)
## city
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
La variabile city ha 4 modalità, le frequenze assolute sono uguali su tutte le modalità (equidistribuzione delle modalità), non è quindi necessario calcolare Moda e Indice Etereogenità di Gini.
table(year)
## year
## 2010 2011 2012 2013 2014
## 48 48 48 48 48
range(year)
## [1] 2010 2014
La variabile year ha un range dal 2010 al 2014, con 5 modalità equamente distribuite.
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
La variabile month ha 12 modalità equamente distribuite.
# indici di posizione
summary(sales)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 79.0 127.0 175.5 192.3 247.0 423.0
# indici di variabilità
## Range
max(sales)-min(sales)
## [1] 344
## Range Interquartile
IQR(sales)
## [1] 120
## Varianza
var(sales)
## [1] 6344.3
## Deviazione Standard
sd(sales)
## [1] 79.65111
## CV
CV(sales)
## [1] 41.42203
# indici di forma
skewness(sales)
## [1] 0.718104
kurtosis(sales)-3
## [1] -0.3131764
Il numero di vendite va da un minimo di 79 a un massimo di 423, con
una media di 192,3.
IQR di 120, con sd 79,65. CV 41,42. Variabilità moderata.
Distribuzione Platicurtica con Asimmetria positiva.
# indici di posizione
summary(volume)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.166 17.660 27.062 31.005 40.893 83.547
# indici di variabilità
## Range
max(volume)-min(volume)
## [1] 75.381
## Range Interquartile
IQR(volume)
## [1] 23.2335
## Varianza
var(volume)
## [1] 277.2707
## Deviazione Standard
sd(volume)
## [1] 16.65145
## CV
CV(volume)
## [1] 53.70536
# indici di forma
skewness(volume)
## [1] 0.884742
kurtosis(volume)-3
## [1] 0.176987
Il valore totale delle vendite (in milioni di $) vanno da un minimo
di 8,17 a un massimo di 83,55, con una media di 31.
IQR di 23,23, con sd 16,65. CV 53,70. Variabilità moderata.
Distribuzione Leptocurtica con Asimmetria positiva.
# indici di posizione
summary(median_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 73800 117300 134500 132665 150050 180000
# indici di variabilità
## Range
max(median_price)-min(median_price)
## [1] 106200
## Range Interquartile
IQR(median_price)
## [1] 32750
## Varianza
var(median_price)
## [1] 513572983
## Deviazione Standard
sd(median_price)
## [1] 22662.15
## CV
CV(median_price)
## [1] 17.08218
# indici di forma
skewness(median_price)
## [1] -0.3645529
kurtosis(median_price)-3
## [1] -0.6229618
Il prezzo mediano di vendita (in $) va da un minimo di 73.800 a un
massimo di 180.000, con una media di 132.665.
IQR di 32.750, con sd 22.662. CV 17. Variabilità bassa/moderata.
Distribuzione Platicurtica con Asimmetria negativa.
# indici di posizione
summary(listings)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 743 1026 1618 1738 2056 3296
# indici di variabilità
## Range
max(listings)-min(listings)
## [1] 2553
## Range Interquartile
IQR(listings)
## [1] 1029.5
## Varianza
var(listings)
## [1] 566569
## Deviazione Standard
sd(listings)
## [1] 752.7078
## CV
CV(listings)
## [1] 43.30833
# indici di forma
skewness(listings)
## [1] 0.6494982
kurtosis(listings)-3
## [1] -0.79179
Il numero totale di annunci attivi va da un minimo di 743 a un
massimo di 3.296, con una media di 1.738.
IQR di 1029, con sd 752,7. CV 43,3. Variabilità moderata.
Distribuzione Platicurtica con Asimmetria positiva.
# indici di posizione
summary(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à
## Range
max(months_inventory)-min(months_inventory)
## [1] 11.5
## Range Interquartile
IQR(months_inventory)
## [1] 3.15
## Varianza
var(months_inventory)
## [1] 5.306889
## Deviazione Standard
sd(months_inventory)
## [1] 2.303669
## CV
CV(months_inventory)
## [1] 25.06031
# indici di forma
skewness(months_inventory)
## [1] 0.04097527
kurtosis(months_inventory)-3
## [1] -0.1744475
Il tempo per vendere le inserzioni correnti (in mesi) va da un minimo
di 3,4 a un massimo di 14,9, con una media di 9,19.
IQR di 3,15, con sd 2,3. CV 25. Variabilità moderata.
Distribuzione Platicurtica con Asimmetria positiva.
La variabile con maggiore variabilità è volume in quanto, confrontando i Coefficienti di Variabilià, è quella con CV maggiore (53,7).
Anche la varibile con maggiore asimmetria è volume in quanto, confrontando i valori assoluti dell’Indice di Asimmetria di Fisher, è quella con skewness maggiore (0,88).
Analisi variabile sales
# numero di classi (metodo della radice quadrata)
num_classi <- ceiling(sqrt(N))
# calcolo approssimativo dell'ampiezza
range_sales <- max(sales) - min(sales)
ampiezza_classe <- ceiling(range_sales / num_classi)
# definizione degli estremi delle classi
min_sales <- min(sales)
max_sales_teorico <- min_sales + (num_classi * ampiezza_classe)
breaks <- seq(min_sales, max_sales_teorico, by = ampiezza_classe)
# divisione della variabile 'sales' in classi
sales_classi <- cut(sales, breaks = breaks, include.lowest = TRUE)
# calcolo frequenze
ni <- table(sales_classi) # assolute
fi <- ni/N # relative
Ni <- cumsum(ni) # assolute cumulative
Fi <- Ni/N # relative cumulative
sales_frequenze <-cbind(ni,fi,Ni,Fi)
sales_frequenze
## ni fi Ni Fi
## [79,101] 24 0.100000000 24 0.1000000
## (101,123] 28 0.116666667 52 0.2166667
## (123,145] 30 0.125000000 82 0.3416667
## (145,167] 31 0.129166667 113 0.4708333
## (167,189] 25 0.104166667 138 0.5750000
## (189,211] 20 0.083333333 158 0.6583333
## (211,233] 12 0.050000000 170 0.7083333
## (233,255] 16 0.066666667 186 0.7750000
## (255,277] 10 0.041666667 196 0.8166667
## (277,299] 18 0.075000000 214 0.8916667
## (299,321] 6 0.025000000 220 0.9166667
## (321,343] 7 0.029166667 227 0.9458333
## (343,365] 5 0.020833333 232 0.9666667
## (365,387] 4 0.016666667 236 0.9833333
## (387,409] 3 0.012500000 239 0.9958333
## (409,431] 1 0.004166667 240 1.0000000
library(ggplot2)
# Visualizzazione con grafico a barre
ggplot(data = dati)+
geom_bar(
aes(x=sales_classi),
stat="count",
col="black",
fill="darkblue")+
labs(x="Numero vendite in classi",
y="Frequenze assolute",
title="Distribuzione delle Vendite")+
theme_bw()+
theme(axis.text.x = element_text(angle = 90, hjust = 1))
# funzione per l'indice di Gini
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(sales_classi)
## [1] 0.9702593
Anche con la suddivisione in classi la distribuzione di
sales risulta visivamente con Asimmetria positiva.
L’indice di Gini indica una alta etereogenità infatti, come si vede
anche dal grafico, le classi hanno frequenze molto diverse.
Probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”
city_ni = table(city)
city_ni["Beaumont"]/N
## Beaumont
## 0.25
Probabilità che riporti il mese di Luglio
month_ni = table(month)
month_ni["7"]/N
## 7
## 0.08333333
Probabilità che riporti il mese di dicembre 2012
distr_y_m = table(year,month)
distr_y_m["2012","12"]/N
## [1] 0.01666667
dati$mean_price = round((volume*1000000)/sales)
summary(dati$mean_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 97010 132939 156589 154320 173915 213234
Il prezzo medio di vendita va da un minimo di 97k $ ad un massimo di 21,3k $ con media di 15,4k $.
Calcoliamo l’efficacia dell’annuncio come tasso di conversioni degli annunci (rapporto tra numero annunci e vendite). Un tasso di conversione più alto indica che gli annunci sono efficaci nell’attrarre acquirenti e finalizzare le vendite.
dati$listings_effectiveness = sales/listings*100
summary(dati$listings_effectiveness)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.014 8.980 10.963 11.874 13.492 38.713
Il tasso di conversione degli annunci va da un minimo del 5% ad un massimo del 38,7% con una media dell’11,9%.
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
sales_by_city <-
dati %>%
group_by(city) %>%
summarise(media=mean(sales),
devst=sd(sales))
sales_by_city
## # A tibble: 4 × 3
## city media devst
## <chr> <dbl> <dbl>
## 1 Beaumont 177. 41.5
## 2 Bryan-College Station 206. 85.0
## 3 Tyler 270. 62.0
## 4 Wichita Falls 116. 22.2
# Creazione del grafico a barre per la media delle vendite per città
ggplot(sales_by_city, aes(x = city, y = media)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = round(media, 0)), vjust = -0.3, size = 3) + labs(title = "Media del numero totale Vendite per Città",
x = "Città",
y = "Media totale Vendite") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Tyler è la città con il maggior numero di vendite medie.
volume_by_year <-
dati %>%
group_by(year) %>%
summarise(media=mean(volume),
devst=sd(volume))
volume_by_year
## # A tibble: 5 × 3
## year media devst
## <int> <dbl> <dbl>
## 1 2010 25.7 10.8
## 2 2011 25.2 12.2
## 3 2012 29.3 14.5
## 4 2013 35.2 17.9
## 5 2014 39.8 21.2
# Creazione del grafico a barre per la media delle volume per anno
ggplot(volume_by_year, aes(x = year, y = media)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = round(media, 2)), vjust = -0.3, size = 3) + labs(title = "Media del valore totale delle vendite (in milioni di dollari)",
x = "Anno",
y = "Media valore totale Vendite") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Il valore medio delle vendite è in crescita negli anni.
volume_by_month <-
dati %>%
group_by(month) %>%
summarise(media=mean(volume),
devst=sd(volume))
volume_by_month
## # A tibble: 12 × 3
## month media devst
## <int> <dbl> <dbl>
## 1 1 19.0 8.37
## 2 2 21.7 10.1
## 3 3 29.4 12.0
## 4 4 33.3 14.5
## 5 5 39.7 19.0
## 6 6 41.3 21.1
## 7 7 39.1 21.4
## 8 8 38.0 18.0
## 9 9 29.6 15.2
## 10 10 29.1 15.1
## 11 11 24.8 11.2
## 12 12 27.1 12.6
mesi <- c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic")
ggplot(volume_by_month, aes(x = factor(month, levels = 1:12), y = media)) +
geom_bar(stat = "identity", fill = "skyblue") +
geom_text(aes(label = round(media, 2)), vjust = -0.3, size = 3) +
labs(title = "Media del valore totale delle vendite (in milioni di dollari)",
x = "Mese",
y = "Media valore totale Vendite") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_x_discrete(labels = mesi, breaks = factor(1:12, levels = 1:12))
Tra maggio e agosto si realizza il valore totale di vendite maggiore.
ggplot(data = dati)+
geom_boxplot(aes(
x=city,
y=median_price),
fill="lightblue")+
labs(title = "Prezzo mediano (in dollari) per Città",
x = "Città",
y = "Prezzo mediano") +
theme_minimal()
Il prezzo mediano è più alto a Bryan-College Station e più basso a
Wichita Falls.
In tutte le città tranne Tyler ci sono dei valori anomali.
# calcola il totale delle vendite per mese e città
total_sales_by_city_month <- dati %>%
group_by(city, month) %>%
summarise(total_sales = sum(sales))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
# crea il grafico a barre affiancate
ggplot(total_sales_by_city_month, aes(x = factor(month, levels = 1:12), y = total_sales, fill = city)) +
geom_bar(stat = "identity", position = "dodge") +
scale_x_discrete(labels = mesi) +
labs(
title = "Totale Vendite per Mese e Città",
x = "Mese",
y = "Totale Vendite",
fill = "Città"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Le vendite sono maggiori tra maggio e agosto, ma segmentando per città vediamo che a Wichita Falls e Beaumant sono più stabili durante l’anno, mentre a Tyler e Bryan College Station hanno dei picchi nel periodo estivo.
# nuova colonna data che combina anno e mese
dati <- dati %>%
mutate(date = as.Date(paste(year, month, "01", sep = "-")))
# calcola totale vendite per anno-mese
sales_by_month_overall <- dati %>%
group_by(date) %>%
summarise(total_sales = sum(sales))
# crea il line chart
ggplot(sales_by_month_overall, aes(x = date, y = total_sales)) +
geom_line(color = "darkgreen") +
geom_point(color = "darkgreen") +
scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
labs(
title = "Andamento delle Vendite nel Tempo",
x = "Anno",
y = "Totale Vendite"
) +
theme_minimal()
Le vendite hanno un andamento stagionale e hanno un trend di crescita nel tempo.
ggplot(dati, aes(x = city, y = volume, fill = factor(year))) +
geom_boxplot() +
labs(
title = "Distribuzione del Valore Totale delle Vendite per Città e Anno",
x = "Città",
y = "Valore Totale Vendite",
fill = "Anno"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3")
La distribuzione del valore totale di vendite è abbastanza stabile
negli anni (considerando la media) per Wichita Falls, in leggera
crescita per Beaumont, mentre è in crescita più significativa per Tyler
e Bryan-College Station.
Per quest’ultima città si nota anche che l’IQR aumenta visibilmente dal
2012, ad indicare una maggiore variabilità del valore totale delle
vendite.
# calcola il totale delle vendite per mese e città
total_sales_by_city_month <- dati %>%
group_by(month, city) %>%
summarise(total_sales = sum(sales))
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
# calcola il totale delle vendite per ogni mese
total_sales_by_month <- total_sales_by_city_month %>%
group_by(month) %>%
summarise(monthly_total = sum(total_sales))
# unisce i due data frame per poter calcolare le proporzioni
normalized_sales <- total_sales_by_city_month %>%
left_join(total_sales_by_month, by = "month") %>%
mutate(proportion = total_sales / monthly_total)
# crea il grafico a barre sovrapposte normalizzato
ggplot(normalized_sales, aes(x = factor(month, levels = 1:12), y = proportion, fill = city)) +
geom_bar(stat = "identity", position = "stack") +
scale_y_continuous(labels = scales::percent) +
scale_x_discrete(labels = mesi) +
labs(
title = "Proporzione delle Vendite nei Mesi per Città",
x = "Mese",
y = "Proporzione delle Vendite",
fill = "Città"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Wichita Falls risulta la città con meno vendite durante l’anno, mentre Tyler risulta quella con maggiori vendite.
# crea il line chart
ggplot(dati, aes(x = date, y = listings_effectiveness, color = city)) +
geom_line() +
geom_point() +
scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
labs(
title = "Andamento dell'Efficacia delle Inserzioni nel Tempo per Città",
x = "Anno",
y = "Tasso conversione delle Inserzioni in %",
color = "Città"
) +
theme_minimal() +
theme(legend.position = "top")
Brian-College Station è la città dove le inserzioni hanno più efficacia.
Il valore medio delle vendite è in crescita negli anni, e tra maggio e agosto si realizza il valore totale di vendite maggiore.
Il numero di vendite ha un andamento stagionale e ha un trend di
crescita nel tempo. Anche numero di vendite è maggiore tra maggio e
agosto ma, segmentando per città, vediamo che a Wichita Falls e Beaumant
sono più stabili durante l’anno, mentre a Tyler e Bryan College Station
ci sono dei picchi nel periodo estivo.
Wichita Falls risulta la città con meno numero vendite durante l’anno,
mentre Tyler risulta quella con maggior numero di vendite.
Il prezzo mediano è più alto a Bryan-College Station e più basso a Wichita Falls.
Brian-College Station è la città dove le inserzioni hanno più efficacia.