In questo progetto analizzo i dati del modulo 2.
#install.packages("ggplot2")
library(ggplot2)
#install.packages("moments")
library(moments)
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(zoo)
##
## Caricamento pacchetto: 'zoo'
## I seguenti oggetti sono mascherati da 'package:base':
##
## as.Date, as.Date.numeric
## Ho dovuto mettere questa parte per settare la directory ogni volta perchè
## con l'aggiornamento Windows nuova mi aveva fatto perdere tutte le connessioni.
setwd("C:/Users/Utente/OneDrive/Desktop")
## Caricare il dataset in R
dati <- read.csv("realestate_texas.csv", sep=",")
## DESCRIZIONE VARIABILI:
## Le variabili presenti nel dataset sono: "year" e "month" che identificano
## rispettivamente l'anno e il mese di vendita della proprietà. Queste due sono
## variabili qualitative ordinali e nella maggior parte dei casi serviranno a
## confrontare tra loro periodi di tempo diversi o le stesse variabili ma
## confrontate nello stesso periodo di tempo per rendere il confronto
## sgnificativo.
## La variabile "city" identifica la città dove si trova la proprietà e perciò
## dove è stata venduta; è una variabile qualitativa nominale. Con questa
## informazione si possono fare analisi riguardanti tutte le altre variabili
## permettendoci così di confrontare ad esempio il tempo necessario per la
## vendita di tutte le proprietà (o la quantità di proprietà in vendita) in
## diverse città a parità di periodo, idem per il numero totale o il volume
## totale delle vendite, ed anche per confrontare il prezzo mediano delle
## proprietà tra diverse città.
## Queste altre variabili sono contenute in "sales" (numero totale di vendite),
## "volume" (valore totale in milioni di dollari delle vendite), "median_price"
## (prezzo mediano di vendita in dollari), "listings" (numero totale di annunci
## attivi) e "months_inventory" (quantità di tempo necessaria per vendere tutte
## le inserzioni correnti, espresso in mesi). Tutte queste sono variabili
## quantitative di cui "sales" e "listings" sono discrete e su scala di rapporti
## mentre le altre sono continue e su scala di intervalli.
## Su quest'ultime si possono studiare, tramite l'analisi statistica, le varie
## dipendenze tra loro; per fare un esempio semplice si potrebbe voler vedere
## se la velocità di vendita varia con il prezzo mediano.
## INDICI DI POSIZIONE, VARIABILITà E FORMA
summary(dati)
## 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
## Vediamo un veloce riassunto dei vari indici di posizione ed eventuali
## distribuzioni di frequenza.
## Nel caso della variabile "city" i risultati della funzione summary non sono
## significativi.
freq_ass_city <- table(dati["city"])
## Infatti le frequenze assolute sono tutte pari ma perchè la chiava del data
## frame è la coppia anno-mese e perciò riferendosi allo stesso perdiodo di 60
## mesi ci saranno 60 righe di dati per ogni località.
## Riguardo la variabile "year" ci interessa solo il minimo e il massimo perchè
## ci dà un idea del periodo a cui si riferiscono i dati cioè dal 2010 al 2014.
## La stessa info dalla variabile "month" potrebbe sviare, è necessario
## controllare il dateframe per assicurarsi che il periodo sia da gennaio 2010
## a dicembre 2014 (questo perchè come detto prima queste due variabili vanno
## lette in coppia anno-mese).
## Per tutte le altre variabili gli indici di posizione sono significativi,
## è possibile farsi un idea dei range che contangono tutti i valori e notando
## le differenze tra media e mediana vediamo che nel caso delle variabili
## "median_price", "listings" e " months_inventory" i valori sono molto simili
## e ciò suggerisce che non ci sono valori troppo alti o troppo bassi rispetto
## agli altri (outliers) o comunque che i valori sono distribuiti in maniera
## omogenea (poi andremo più a fondo stufiando la variabilità); mentre per la
## variabile "volume" e "sales" i due valori si discostano, anche se non di
## molto, ma potrebbe suggerire la presenza di outliers di valore alto visto che
## la media è maggiore alla mediana.
## In ogni caso sarebbe utili dividere quest'ultime variabili in classe e vederne
## la distribuzione di frequenza in funzione della località (lo faremo più
## avanti).
## VARIABILITà E ASIMMETRIA
## Funzione per coefficiente di variazione
CV <- function(x){
return(sd(x)/mean(x)*100)
}
## Varianza e asimmetria "sales"
var_sales <- var(dati$sales)
dev_std_sales <- sd(dati$sales)
CV_sales <- CV(dati$sales)
as_index_sales <- skewness(dati$sales)
## Varianza e asimmetria "volume"
var_volume <- var(dati$volume)
dev_std_volume <- sd(dati$volume)
CV_volume <- CV(dati$volume)
as_index_volume <- skewness(dati$volume)
## Varianza e asimmetria "median_price"
var_median_price <- var(dati$median_price)
dev_std_median_price <- sd(dati$median_price)
CV_median_price <- CV(dati$median_price)
as_index_median_price <- skewness(dati$median_price)
## Varianza e asimmetria "listings"
var_listings <- var(dati$listings)
dev_std_listings <- sd(dati$listings)
CV_listings <- CV(dati$listings)
as_index_listings <- skewness(dati$listings)
## Varianza e asimmetria "months_inventory"
var_months_inventory <- var(dati$months_inventory)
dev_std_months_inventory <- sd(dati$months_inventory)
CV_months_inventory <- CV(dati$months_inventory)
as_index_months_inventory <- skewness(dati$months_inventory)
## La variabile con la più alta variabilità è "volume" perchè calcolando il
## coeffieciente di variazione di tutte le variabili (escluse "city"; "year" e
## "month" per ovvi motivi) risulta quella ad averlo maggiore.
## Questo significa che la variabile "volume" è quella che ha valori più sparsi
## rispetto alle altre e perciò è caratterizzata da una minore omogeneità.
## La variapibile con maggior asimmetria è sempre "volume" poichè è quella con
## il coefficienti di asimmetria che si discosta di più da 0 (condizione di
## simmetria), "volume è asimmetrica positiva (l'unica asimmetrica negativa
## invece è "median_price").
## Questo significa che nella variabile "volume" la maggior parte dei dati
## tenderà ad essere a sinistra della media perciò di valore minore alla media;
## poichè è una distribuzione "sbilanciata" a sinistra.
## CLASSI VARIABILE QUANTITATIVA
## Divido median_price che va da 73500 a 180000 in classi da 70000 a 180000 con
## un passo da 10000 e lo aggiungo come colonna al dataset
dati$median_price_cl <- cut(dati$median_price, breaks = seq(70000,180000,10000))
median_price_cl <- table(dati$median_price_cl)
## Per etichetta asse x
labels_x = seq(70000,180000,10000)
labels <- paste0("(", labels_x[-length(labels_x)]/1000, "k-", labels_x[-1]/1000, "k]")
x11()
ggplot(data = dati)+
geom_bar(aes(x = median_price_cl),
stat = "count",
col = "black",
fill = "gold")+
labs(title = "Distribuzione della mediana dei prezzi di vendita per classi",
x = "Suddivisione in classi mediana dei prezzi di vendita delle proprietà",
y = "Numero di proprietà vendute appartenenti alla suddivisone")+
scale_y_continuous(breaks = seq(0,50,5))+
scale_x_discrete(labels = labels)+
theme_classic()
## Funzione per calcolo dell'indice di eterogeneità 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.normalized = gini/((j-1)/j)
return(gini.normalized)
}
## Calcolo Gini
gini_index_median_price <- gini.index(dati$median_price)
## L'indice di Gini della variabile "median_price" risulta 1 perciò praticamente
## la variabile è caratterizzata da variabilità massima cioè equidistribuzione.
## Probabilità: le calcolo facendo il numero in cui la variabile compare nella
## rispettiva colonna fratto la lunghezza (numero di elementi) della colonna.
prob_city <- sum(dati$city == "Beaumont")/length(dati$city)
prob_month <- sum(dati$month == 7)/length(dati$month)
prob_year <- sum(dati$year == 2012)/length(dati$year)
## Colonna prezzo medio degli immobili
dati$mean_price <- (dati$volume/dati$sales)*1000000
## Colonna efficacia annunci di vendita
dati$ad_effectiveness <- (dati$sales/dati$listings)
## E' stata creata la variabile "ad_effectiveness" calcolata come rapporto dei
## campi "sales" (= numero totale di vendite) e "listings" (= numero totale di
## annunci attivi). Questo fattore perciò è adimensionale e mostra quante
## sono le vendite in rapporto agli annunci attivi, cioè una sorta di
## percentuale di vendita. Maggiore sarà "ad_effectiveness" maggiore sarà
## l'efficacia degli annunci di vendita.
x11()
ggplot(dati, aes(x = city, y = ad_effectiveness))+
geom_boxplot()+
labs(x = "Città", y = "Efficcacia degli annunci di vendita", title = "Efficacia annunci di vendita per città")
## Come si può notare dai boxplot accostati le città dove in media gli annunci
## sono più efficaci sono Bryan-College Station e Wichita Falls con una media
## simile intorno al 12.5% (0.125). La differenza tra la due e la variabilità
## maggiore nella prima, infatti il boxplot in questa risulta più "largo".
## Analisi condizionata per "median_price"
sum_city_median_price<-dati%>%
group_by(city)%>%
summarize(media=mean(median_price),
dev_st=sd(median_price))
sum_year_median_price<-dati%>%
group_by(year)%>%
summarize(media=mean(median_price),
dev_st=sd(median_price))
sum_month_median_price<-dati%>%
group_by(month)%>%
summarize(media=mean(median_price),
dev_st=sd(median_price))
## La città con il prezzo medio di vendita maggiore è Bryan-College Station,
## mentre la città col prezzo medio di vendita minore è Wichita Falls, questa
## è anche caratterizzata dalla maggiore variabilità del prezzo. Il 2014 è
## l'anno caratterizzato da una media prezzi maggiore ed anche da una
## variabilità dei prezzi maggiore. Mentre in media i prezzi maggiori si sono
## registrati nel mese di giugno con il mese di ottobre come mese con prezzi
## più variabili.
## Analisi condizionata per "sales"
sum_city_sales<-dati%>%
group_by(city)%>%
summarize(media=mean(sales),
dev_st=sd(sales))
sum_year_sales<-dati%>%
group_by(year)%>%
summarize(media=mean(sales),
dev_st=sd(sales))
sum_month_sales<-dati%>%
group_by(month)%>%
summarize(media=mean(sales),
dev_st=sd(sales))
## La città in cui in media si vendono più proprietà è Tyler mentre la città in
## cui la variabilità del numero di vendite è maggiore è Bryan-College Station.
## L'andamento delle vendite medie negli anni sembra mostrare un trend di crescita
## con il 2014 con il maggior numero di vendite e la maggiore variabilità.
## Il periodo dell'anno in cui si registrano più vendite è quello estivo da
## maggio ad agosto.
## Analisi condizionata per "volume"
sum_city_volume<-dati%>%
group_by(city)%>%
summarize(media=mean(volume),
dev_st=sd(volume))
sum_year_volume<-dati%>%
group_by(year)%>%
summarize(media=mean(volume),
dev_st=sd(volume))
sum_month_volume<-dati%>%
group_by(month)%>%
summarize(media=mean(volume),
dev_st=sd(volume))
## E' stato poco fa notato che in media la maggior parte delle vendite è
## registratto nella città di Tyler, come si poteva ipotizzare detiene anche il
## primato di entrate dovute alle vendite. Si nota anche qui l'andamento in
## crescita delle entrate negli anni riconfermando il 2014 come anno con più
## entrate e maggiore variabilità. E infine come ci aspettavamo si riconferma
## il periodo estivo come periodo in cui in media ci sono più entrate dovute
## alla vendita di case.
## Rappresento graficamente i risultati delle variabili "median_price" e "volume"
## (non rappresento anche "sales" perchè il senso dei risultati rispecchia ciò
## che si ottiene analizzando "volume")
## Rappresentazione grafica per "median_price"; uso i boxplot così da vedere la
## media e avere un indicazione visiva della variabilità (per avere un idea della
## dev std).
x11()
ggplot(dati, aes(x = city, y = median_price)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(
title = "Distribuzione del prezzo mediano per città",
x = "Città",
y = "Prezzo mediano ($)"
) +
theme_minimal()
x11()
ggplot(dati, aes(x = factor(year), y = median_price)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(
title = "Distribuzione del prezzo mediano per anno",
x = "Anno",
y = "Prezzo mediano ($)"
) +
theme_minimal()
x11()
ggplot(dati, aes(x = factor(month), y = median_price)) +
geom_boxplot(fill = "lightblue", color = "black") +
scale_x_discrete(limits = as.character(1:12),
labels = 1:12) +
labs(
title = "Distribuzione del prezzo mediano per mese",
x = "Mese",
y = "Prezzo mediano ($)"
) +
theme_minimal()
## Rappresentazione grafica per "volume"; uso i boxplot così da vedere la
## media e avere un indicazione visiva della variabilità (per avere un idea della
## dev std).
x11()
ggplot(dati, aes(x = city, y = volume)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(
title = "Distribuzione del valore totale delle vendite per città",
x = "Città",
y = "Valore Totale delle Vendite (milioni di $)"
) +
theme_minimal()
x11()
ggplot(dati, aes(x = factor(year), y = volume)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(
title = "Distribuzione del valore totale delle vendite per anno",
x = "Anno",
y = "Valore Totale delle Vendite (milioni di $)"
) +
theme_minimal()
x11()
ggplot(dati, aes(x = factor(month), y = volume)) +
geom_boxplot(fill = "lightblue", color = "black") +
scale_x_discrete(limits = as.character(1:12),
labels = 1:12) +
labs(
title = "Distribuzione del valore totale delle vendite per mese",
x = "Mese",
y = "Valore Totale delle Vendite (milioni $)"
) +
theme_minimal()
## Creazione di visualizzazioni con ggplot2
## Boxplot per confrontare la distribuzione del prezzo mediano per città.
x11()
ggplot(dati, aes(x = city, y = median_price))+
geom_boxplot()+
labs(x = "Città",
y = "Prezzo mediano",
title = "Prezzo mediano per città")
## Il grafico riconferma le info ottenute dai summary, infatti si nota che la
## città Bryan-College Station è dove il prezzo di vendita delle case è maggiore
## mentre la città dove è più economico è Wichita Falls. Quest'ultima è anche la
## città dove il prezzo mediano è più variabile.
## Grafici a barre per confrontare il totale delle vendite per mese e città.
sum_month_sales<-dati%>%
group_by(month, city)%>%
summarize(total_sales=sum(sales))
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
x11()
ggplot(sum_month_sales, aes(x = factor(month), y = total_sales, fill = city)) +
geom_bar(stat = "identity", color = "black") +
scale_x_discrete(limits = as.character(1:12), labels = 1:12) +
labs(
title = "Numero Totale di Vendite per Mese",
x = "Mese",
y = "Numero Totale di Vendite"
) +
theme_minimal()
## Il grafico ottenuto riconferma che i mesi del periodo estivo (maggio-agosto)
## sono quelli con più altro numero di vendite. Inoltre sembra che a differenza
## delle altre città, in quella di Wichita Falls, il numero di vendite siano più
## costanti durante l'anno.
sum_month_sales<-dati%>%
group_by(city)%>%
summarize(total_sales=sum(sales))
x11()
ggplot(sum_month_sales, aes(x = factor(city), y = total_sales)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
labs(
title = "Numero Totale di Vendite per Mese",
x = "Mese",
y = "Numero Totale di Vendite"
) +
theme_minimal()
## Il grafico riconferma che la città in cui si vendono più proprietà è Tyler.
## Line charts per confrontare l'andamento delle vendite in periodi storici
## differenti.
## Concateno "year" e "month"
dati$year_month <- paste0(dati$year, "_", dati$month)
## Line charts
sum_year_month_sales<-dati%>%
group_by(year_month)%>%
summarize(total_sales=sum(sales))
## Converto "2010_01" in oggetti yearmon (anno+mese)
sum_year_month_sales$year_month <- as.yearmon(sum_year_month_sales$year_month, "%Y_%m")
x11()
ggplot(sum_year_month_sales) +
geom_line(aes(x = year_month, y = total_sales), col = "red", linewidth = 1) +
geom_point(aes(x = year_month, y = total_sales), col = "black", size = 3) +
labs(
x = "Anno_Mese",
y = "Numero Totale di Vendite",
title = "Andamento del Numero Totale di Vendite dal 2010 al 2014"
) +
theme_minimal()
## Dal line chart si vedono in ogni anno i picchi di vendite nei periodi estivi
## e si può notare un trend di crescita nel numero di vendite dal 2010 al 2014.
## Conclusioni
## Visto l'efficacia degli annunci nelle due città di Bryan-Station College e
## Wichita Falls consiglierei di prendere da modello per le altre città le
## inserzioni di queste zone ma spingere di più nella vendita o nella ricerca
## di proprietà da vendere nella zona di Wichita Falls vista l'efficacia appunto
## delle inserzioni ma il basso numero di vendite rispetto le altre città.
## Ricordando il grafico in cui si nota che le vendite a Wichita Falls sono
## costanti durante tutto l'anno, e ciò conferma l'efficacia degli annunci in
## quella zona, utilizzandolo come modello per gli annunci punterei ad aumentare
## le vendite anche nel periodo invernale nelle altre città.
## Consiglierei inoltre uno studio sul perchè le vendite si concentrino nei
## mesi caldi nelle altre zone in modo da capire se c'è possibilità di alzarle
## nei mesi freddi ed in caso questa possibilità non ci sia consiglierei una
## campagna pubblicitaria qualche mese prima del periodo estivo per poi
## intensificare gli annunci nel periodo estivo.
## In generale comunque il mercato è in crescita perciò investimenti per
## l'ottimizzazione delle vendite o per aumentare il numero di proprietà da
## da vendere hanno alta probabilità di ritorno e darebbero la possibilità
## di prendersi una fetta "più grande" del mercato che si sta allargando.