library(lubridate)
##
## Caricamento pacchetto: 'lubridate'
## I seguenti oggetti sono mascherati da 'package:base':
##
## date, intersect, setdiff, union
library(ggplot2)
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
Come prima cosa viene caricato il dataset Real Estate Texas.csv, che contiene le informazioni relativo al mercato immobiliare in Texas. Questo viene caricato all’interno di dati e visualizzato attraverso la funzione head.
dati<-read.csv("realestate_texas.csv")
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
Successivamente con la funzione dim viene salvato il numero di righe totali presenti nel dataset ed attraverso la funzione str, si ha una prima descrizione del tipo di variabili presenti.
N=dim(dati)[1]
str(dati)
## '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 ...
Come si può vedere sono presenti 8 variabili e 240 righe. In particolare year, month, sales e listings sono definite secondo il formato intero, mentre volume, median_price e months_inventory più generalmente in formato numerico. city è l’unica variabile in formato carattere.
Si può dunque fornire un elenco ed una descrizione delle otto variabili presenti:
In prima anlisi si vogliono capire quali siano le modalità di ciascuna variabile qualitativa, così da avere un’idea della suddivisione del database, per fare questo viene utilizzata la funzione levels.
for (var in c("city", "year", "month")) {
cat("Modalità di", var, ":\n")
print(levels(as.factor(dati[[var]])))
cat("\n")
}
## Modalità di city :
## [1] "Beaumont" "Bryan-College Station" "Tyler"
## [4] "Wichita Falls"
##
## Modalità di year :
## [1] "2010" "2011" "2012" "2013" "2014"
##
## Modalità di month :
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12"
Osservazione: Sono presenti quattro città, 5 anni di vendita (2010-2014) e tutti i mesi dell’anno. Bisognerà capire se mesi ed anni sono presenti per ciascuna città, attraverso il calcolo delle frequenze assolute e la moda.
Le variabili year e month sottointendono il tempo, in questo caso sono separate ma potrebbe essere utile creare una nuova colonna in cui togliere la ciclicità del mese, in modo da interpretare le variabili quantitative per ogni città come serie storiche. In questo modo nel caso fossero trimodali si potrebbe interpretare il comportamento delle vendite in 60 mesi, considerando il mese di gennaio del 2010 come primo, e dicembre 2014 come 60 esimo.
Per rendere più chiara al lettore la descrizione dei grafici potrebbe essere utile, riscrivere nei grafici month nel formato chr, utilizzando il vero nome di ciascun mese. Ricordando che un anno è formato da quattro stagioni, potrebbe anche essere significativo associare i quattro periodi, per vedere se la vendita di case sia associata alla stagionalità.
Nel caso delle le variabili quantitative sarebbe utile avere un’idea generale del loro andamento, attraverso la funzione summary, in base a questi risultati, si può decidere per quali di queste può aver senso calcolare indici di variabilità come varianza e deviazione standard e di conseguenza eventuali simmetrie.
Si può partire dal calcolo delle frequenze per le tre variabili qualitative, utilizzia la funzione table.
for (var in c("city","year","month")){
cat("Frequenze assolute di", var, ":\n")
print(table(dati[[var]]))
cat("\n")
}
## Frequenze assolute di city :
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
##
## Frequenze assolute di year :
##
## 2010 2011 2012 2013 2014
## 48 48 48 48 48
##
## Frequenze assolute di 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
Osservazione: Sono variabili trimodali, in quanto tutte le loro modalità hanno lo stesso numero di componenti. Dunque per ogni città si ha la descrizione di 5 anni e di 12 mesi di vendite.
Viene applicata la funzione summary sulle colonne relative alle variabili quantitative, così da avere un’idea di indici di posizione, come media e mediana e un’idea di distribuzione.
summary(dati[c("sales", "volume", "median_price", "listings", "months_inventory")])
## sales volume median_price listings
## Min. : 79.0 Min. : 8.166 Min. : 73800 Min. : 743
## 1st Qu.:127.0 1st Qu.:17.660 1st Qu.:117300 1st Qu.:1026
## Median :175.5 Median :27.062 Median :134500 Median :1618
## Mean :192.3 Mean :31.005 Mean :132665 Mean :1738
## 3rd Qu.:247.0 3rd Qu.:40.893 3rd Qu.:150050 3rd Qu.:2056
## Max. :423.0 Max. :83.547 Max. :180000 Max. :3296
## months_inventory
## Min. : 3.400
## 1st Qu.: 7.800
## Median : 8.950
## Mean : 9.193
## 3rd Qu.:10.950
## Max. :14.900
Osservazione: Nessuna delle variabili è simmetrica, in quanto come si può vedere media e mediana non coincidono. Nel caso di sales è possibile osservare che il range di vendite (differenza tra massimo e minimo), è abbastanza elevato, potrebbe essere dovuto alla presenza di outlier, questo potrebbe spiegare anche la differenza tra media e mediana. Sarebbe utile capire se questo sia dovuto alla città considerata o al periodo. (vedi sezione grafici)
Anche nel caso della variabile volume, che esprime il valore totale di vendita si può vedere un range molto ampio, di circa 75 milioni dollari, quando nell’effettivo il 50% delle righe è compresa tra i 17 ed i 40 milioni, per questo si potrebbe calcolare anche in questo caso varianza e deviazione standard.
Per median_price sarebbe utile capire la variabilità, cercando di capire quanto i dati si discostino dalla media, calcolando la deviazione standard. Una maggiore variabilità potrebbe essere causata dalla zona di acquisto, sapendo questo al momento di una richiesta di acquisto si potrebbe veicolare un acquirente presso la scelta in una zona più in linea con il suo budget.
Per quanto riguarda la variabile listings, si può vedere che in generale nel 50 % dei casi gli annunci sono stati tra i mille ed i 2000, non si può parlare di effettiva simmetria, ma in generale avendo una mediana di 1618 annunci, poco si discosta. Sarà interessante verificare quanto questi siano stati efficaci, nei vari casi.
months_inventory, non ha una grande variabilità in generale entro l’anno (10,9) nel 50 % dei casi, tutte le inserzioni presenti sono vendute.
Si possono quindi aggiungere al summary, alcune delle metriche citate, come varianza, range ed IQR.
metrics<-function(var,x){
cat("Variabile:", var,"\n")
cat("Deviazione standard:",round(sd(x),2),"\n")
cat("IQR:",round(IQR(x),2),"\n")
cat("Range:",round(max(x)-min(x),2),"\n")
cat("\n")
}
for (var in c("sales", "volume", "median_price", "listings", "months_inventory")){
metrics(var,dati[[var]])
}
## Variabile: sales
## Deviazione standard: 79.65
## IQR: 120
## Range: 344
##
## Variabile: volume
## Deviazione standard: 16.65
## IQR: 23.23
## Range: 75.38
##
## Variabile: median_price
## Deviazione standard: 22662.15
## IQR: 32750
## Range: 106200
##
## Variabile: listings
## Deviazione standard: 752.71
## IQR: 1029.5
## Range: 2553
##
## Variabile: months_inventory
## Deviazione standard: 2.3
## IQR: 3.15
## Range: 11.5
Per capire quale sia la variabile con maggiore variabilità, si calcola il coefficiente di variazione per le variabili quantitative, questo permette di confrontarle in quanto riscala la deviazione standard di ciascuna variabile per la media.
cv<-function(x){
return(sd(x)/mean(x)*100)
}
for (colname in c("sales", "volume", "median_price", "listings", "months_inventory")) {
var<-dati[[colname]]
cat(colname,":",round(cv(var),2),"\n" )
}
## sales : 41.42
## volume : 53.71
## median_price : 17.08
## listings : 43.31
## months_inventory : 25.06
Osservazione: A seguito del calcolo del coefficiente di variazione si può vedere che la variabile volume ha la più alta variabilità, con deviazione standard che supera circa del 54 % la media. Mentre median_price la minore.
Per vedere invece quale delle variabili quantitative presenta la distribuzione più asimmetrica, calcolo per ciascuna variabile l’indice di asimmetria di Fisher.
asim.index<-function(x){
n<-length(x)
mu<-mean(x)
sigma<-sd(x)
m_3<-sum((x-mu)^3)/n
return(m_3/sigma^3)
}
for (colname in c("sales", "volume", "median_price", "listings", "months_inventory")) {
var<-dati[[colname]]
cat(colname,":",round(asim.index(var),2),"\n" )
}
## sales : 0.71
## volume : 0.88
## median_price : -0.36
## listings : 0.65
## months_inventory : 0.04
Osservazione: Si può notare che la variabile volume è la più asimmetrica, con un valore di 0.88 e la maggior parte dei valori è bassa.
Viene suddivisa in classi la variabile sales, considerando che ha un minimo di 79 ed un massimo di 423 potrebbe essere utile considerare degli intervalli di ampiezza 75.
dati$sales_cl<-cut(dati$sales, breaks=c(75,150,225,300,375,450))
ni<-table(dati$sales_cl) #frequenza assoluta
fi<-round(table(dati$sales_cl)/N,2) #frequenza relativa
Ni<-cumsum(ni) #frequenza cumulata
Fi<-round(Ni/N,2) #frequenza cumulata relativa
distr_freq_sales_cl<-as.data.frame(cbind(ni,fi,Ni,Fi))
distr_freq_sales_cl
## ni fi Ni Fi
## (75,150] 93 0.39 93 0.39
## (150,225] 73 0.30 166 0.69
## (225,300] 49 0.20 215 0.90
## (300,375] 20 0.08 235 0.98
## (375,450] 5 0.02 240 1.00
ggplot(data=dati)+
geom_bar(aes(x=sales_cl),
stat='count',
col='black',
fill='red')+
labs(title="Distribuzione delle vendite di case",
x="Classi di vendie",
y="Frequenze assolute")+
theme_classic()+
theme(legend.position="bottom")
Osservazione: si può vedere che nella maggior parte dei casi il numero di vendite si concentra nella fascia (75;150] e in generale si ha un trend decrescente all’aumentare del numero di vendite.
Indice di Gini:
gini.index<-function(x){
ni=table(x)
fi=ni/length(x)
fi2=fi^2
j=length(x)
gini=1-sum(fi2)
gini.normalizzato=round(gini/((j-1)/j),2)
return(gini.normalizzato)
}
gini.index(dati$sales_cl)
## [1] 0.71
Osservazione: La variabile sales_cl presa in considerazione presenta 5 modalità, un indice di Gini di 0,71 indica una eterogeneità media, quindi in generale come ci si aspettava, sono presenti campioni per tutte le classi, ma con frequenza diversa.
Per trovare la probabilità che, presa una riga a caso del dataset, questa riporti la città “Beamount”, si va a calcolare il rapporto tra il numero di righe in cui è presente “Beamount” (casi favorevoli), che dall’analisi delle frequenze assolute sappiamo essere 60, e il numero totale di righe del dataset, che troviamo in N (casi possibili). Nel caso del mese di Luglio, si utilizza lo stesso procedimento, ma con il numero di righe in cui appare quest’ultimo.
n_Beamount=sum(dati$city=="Beaumont")
p_Beaumont=round(n_Beamount/N,2)
cat("Probabilità di pescare Beamount:",p_Beaumont, "\n")
## Probabilità di pescare Beamount: 0.25
n_Luglio=sum(dati$month==7)
p_luglio=round(n_Luglio/N,2)
cat("Probabilità di pescare Luglio:",p_luglio, "\n")
## Probabilità di pescare Luglio: 0.08
La probabilità che, presa una riga a caso del dataset, riporti il mese di Dicembre 2012, si ottiene moltiplicando le due probabilità. Ricordando che essendo month trimodale, la probabilità di ottenere il mese di Luglio è uguale a quella di ottenere il mese di Dicembre.
a=sum(dati$year==2012)
p_dec2012=round(p_luglio*(a/N),2)
cat("Probabilità di pescare Dicembre 2012:",p_luglio, "\n")
## Probabilità di pescare Dicembre 2012: 0.08
Prezzo medio immobili
Per calcolare il prezzo medio degli immobili, si divide la variabile del valore totale di vendita volume per il numero totale di vendite sales. Ricordando che il volume è espresso in milioni di dollari. Il risultato viene inserito in una nuova colonna: average_price.
dati$average_price=dati$volume*10^6/dati$sales
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
## sales_cl average_price
## 1 (75,150] 170626.5
## 2 (75,150] 163796.3
## 3 (150,225] 157697.8
## 4 (150,225] 134095.0
## 5 (150,225] 142737.6
## 6 (150,225] 144015.9
Efficacia delle inserzioni
dati$efficacy=round((dati$sales)/(dati$listings)*100)
summary(dati$efficacy)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.00 9.00 11.00 11.84 13.25 39.00
Per valutare l’efficacia è stata calcoltata la percentuale del rapporto tra il numero di vendite effetive e il totale degli annunci esposti. Come si può vedere dalla stampa di summary, in generale il 50% dei valori si concentra tra il 9 ed il 13.25 %. Da questi valori in generale si può dire che non sono stati troppi efficaci, in quanto in nessun caso si è superato il 50% degli annunci.
Come prima analisi, vengono calcolate media e deviazione standard per vendite e prezzo mediano, andando a raggruppare prima per città e mese, poi per città ed anno, vengono successivamente riportati i seguenti valori in un geom_col, nel caso degli anni e in un geom_smooth, nel caso del mese.
ANNO:
summary_stats_year <- dati %>%
group_by(city,year) %>%
summarise(
mean_sales =round(mean(sales, na.rm = TRUE),2),
sd_sales = round(sd(sales, na.rm = TRUE),2),
mean_price =round(mean(median_price, na.rm = TRUE),2),
sd_price = round(sd(median_price, na.rm = TRUE),2), .groups = "drop")
summary_stats_year
## # A tibble: 20 × 6
## city year mean_sales sd_sales mean_price sd_price
## <chr> <int> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 2010 156. 36.9 133117. 13354.
## 2 Beaumont 2011 144 22.7 125642. 9603.
## 3 Beaumont 2012 172. 28.4 126533. 7973.
## 4 Beaumont 2013 201. 37.7 132400 7785.
## 5 Beaumont 2014 214. 36.5 132250 9835.
## 6 Bryan-College Station 2010 168. 70.8 153533. 5474.
## 7 Bryan-College Station 2011 167. 62.2 151417. 3709.
## 8 Bryan-College Station 2012 197. 74.3 153567. 7096.
## 9 Bryan-College Station 2013 238. 95.8 159392. 5429.
## 10 Bryan-College Station 2014 260. 86.7 169533. 7776.
## 11 Tyler 2010 228. 49.0 135175 4782.
## 12 Tyler 2011 239. 49.6 136217. 8505.
## 13 Tyler 2012 264. 46.4 139250 7983.
## 14 Tyler 2013 287. 53.0 146100 6726.
## 15 Tyler 2014 332. 56.8 150467. 8543.
## 16 Wichita Falls 2010 123. 26.6 98942. 10361.
## 17 Wichita Falls 2011 106. 19.8 98142. 10632.
## 18 Wichita Falls 2012 112. 14.2 100958. 12347.
## 19 Wichita Falls 2013 121. 26 105000 10383.
## 20 Wichita Falls 2014 117 21.1 105675 12444.
ggplot(data=summary_stats_year)+
geom_col(aes(x=year, y=mean_sales,fill=city),col="black",position="dodge" )+
geom_hline(yintercept = 192.3, col="red")+
labs(title='Distribuzione delle medie di vendite tra il 2010-2014',
x='Anno',
y='Media vendite')+
theme(legend.position="bottom")
Osservazione: In tutti gli anni, la media delle vendite si è mantenuta più alta nella città di Tyler, ed in particolare è cresciuta nel corso degli anni. Più altalenante è stata la media di Wichita Falls, che è rimasta anche la più bassa. Si può vedere come anche Beaumont e Byran-College Station abbiano avuto una crescita nel corso degli anni, le loro medie infatti ad un certo punto si sono posizionate sopra quella generale, indicata dalla linea rossa.
ggplot(data=summary_stats_year)+
geom_col(aes(x=year, y=mean_price,fill=city),col="black",position="dodge" )+
geom_hline(yintercept = 132665, col="red")+
labs(title='Distribuzione delle medie dei prezzi mediani tra il 2010-2014',
x='Anno',
y='Media prezzo mediano')+
theme(legend.position="bottom")
Osservazione: I prezzi mediani più elevati sono stati trovati per Byran-College Station e Tyler, le altre due città invece si sono collocate sotto la media generale. A differenza del grafico precedente i risultati di crescita non sono molto evidenti, difatti si può notare solo una lieve crescita nelle città con i prezzi più alti.
MESE:
summary_stats_month <- dati %>%
group_by(city,month) %>%
summarise(
mean_sales =round(mean(sales, na.rm = TRUE),2),
sd_sales = round(sd(sales, na.rm = TRUE),2),
mean_price =round(mean(median_price, na.rm = TRUE),2),
sd_price = round(sd(median_price, na.rm = TRUE),2), .groups = "drop")
summary_stats_month
## # A tibble: 48 × 6
## city month mean_sales sd_sales mean_price sd_price
## <chr> <int> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 1 122. 31.2 127460 22742.
## 2 Beaumont 2 135. 32.0 126980 9500.
## 3 Beaumont 3 171 14.9 124460 4547.
## 4 Beaumont 4 190. 17.7 129820 5731.
## 5 Beaumont 5 207. 42.6 129320 6828.
## 6 Beaumont 6 205 36.0 130680 4708.
## 7 Beaumont 7 185. 22.9 130900 7024.
## 8 Beaumont 8 217. 50.6 138480 4785.
## 9 Beaumont 9 174 46.9 127760 11298.
## 10 Beaumont 10 189. 44.0 130820 9112.
## # ℹ 38 more rows
ggplot(data=summary_stats_month)+
geom_smooth(aes(x=month, y=mean_sales, color=city))+
geom_point(aes(x=month,y=mean_sales), col="black",size=3)+
labs(title='Distribuzione delle medie di vendite durante i mesi',
x='Mese',
y='Media vendite')+
scale_x_continuous(breaks = 1:12,
labels = c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu",
"Lug", "Ago", "Set", "Ott", "Nov", "Dic"))+
theme(legend.position="bottom")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Osservazione: Anche rispetto ai mesi, Tyler mantiene la media delle vendite più elevata, in tutte le città si trova un picco nei mesi centrali, più o meno da maggio ad agosto, si ritrova quindi un trend di stagionalità. infatti poi le vendite decrescono nei mesi più freddi. Anche in questo caso, la città con i valori più bassi è quella di Wichita Falls.
ggplot(data=summary_stats_month)+
geom_smooth(aes(x=month, y=mean_price, color=city))+
geom_point(aes(x=month,y=mean_price), col="black",size=3)+
labs(title='Distribuzione delle medie di vendite durante i mesi',
x='Mese',
y='Media vendite')+
scale_x_continuous(breaks = 1:12,
labels = c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu",
"Lug", "Ago", "Set", "Ott", "Nov", "Dic"))+
theme(legend.position="bottom")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Osservazione: Come si era potuto notare anche negli anni, si nota che in questo caso non sono fortemente evidenti dei trend di crescita o decrescita, per questo si può invece dire che in generale nel corso dei mesi i prezzi si sono mantenuti superioni nella città di Byran-College Station, per poi passare a Tyler, Beamount, e si riconferma con i prezzi minori Wichita Falls.
Boxplot per confrontare la ditribuzione del prezzo mediano fra le varie città:
ggplot(data=dati)+
geom_boxplot(aes(x=city,
y=median_price),
fill="lightblue")+
labs(title='Distribuzione del prezzo mediano per città',
x='Città',
y='Prezzo mediano di vendita')
Osservazione; Da questo grafico si può vedere, che Byran-College Station ha avuto in generale i prezzi più alti, si era osservato anche guardando i grafici per mese ed anno, ed è quasi simmetrica. L’IQR più alto lo presenta Wichita Falls, che ha anche i prezzi più bassi. Si può vedere che la città di Tyler non presenta outlier, mentre le altre tre ne hanno solamente uno, che identifica un prezzo superiore agli altri.
Invece si può vedere lo stesso comportamento per il valore totale delle vendite? A seguito dell’analisi condizionata ci si aspetta di vedere uno scambio tra Tyler e Bryan-College Station.
Grafico a barre per confrontare il totale delle vendite per città:
ggplot(data=dati)+
aes(x=city,y=sales)+
stat_summary(fun=sum,geom="bar", col='blue',fill="lightblue")+
labs(title='Distribuzione delle vendite totali per città',
x='Città',
y='Vendite totali')+
theme_minimal()
Osservazione: Anche in questo caso infatti la città che in 5 anni ha effettuato il maggior numero di vendite è Tyler, può dunque essere che i prezzi siano i secondi più elevanti vista la grande richiesta. Si vede invece che Wichita Falls risulta quella con il numero minore di vendite ed i prezzi più bassi.
Grafico a barre per confrontare il totale delle vendite per mese. Anche in questo caso, avendolo già scomposto per città, ci si aspetta di vedere il trend stagionale.
ggplot(data=dati)+
aes(x=month,y=sales)+
stat_summary(fun=sum,geom="bar", col='black',fill="lightgreen")+
labs(title='Distribuzione delle vendite totali per mese',
x='Mese',
y='Vendite totali')+
theme_minimal()+
scale_x_continuous(breaks = 1:12,
labels = c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu",
"Lug", "Ago", "Set", "Ott", "Nov", "Dic"))
Questo grafico infatti presenta i picchi nei mesi centrali, prendendo quindi tutto il periodo estivo e la fine della primavera.
Come si comportano le vendite in periodi storici differenti?
Al momento si è potuto scorgere dal grafico sovrastante una sorta di trend stagionale, in cui si può osservare un aumento della richiesta durante i mesi estivi.
Sarebbe ora interessante capire come è stato l’andamento delle vendite durante anni differenti ed in seguito andare a valutare anno e mese insieme come suggerito durante l’analisi iniziale delle variabili, osservando le differenze anche secondo la città.
Line Chart per osservare la distribuzione delle medie delle vendite, durante i vari anni
Poligono di frequenza per vedere la distribuzione delle vendite durante gli anni 2010-2014:
s_year <- dati %>%
group_by(year) %>%
summarise(
mean_sales =round(mean(sales, na.rm = TRUE),2),
sd_sales = round(sd(sales, na.rm = TRUE),2))
ggplot(data=s_year)+
geom_col(aes(x=year, y=mean_sales), col="black", fill="lightgreen")+
geom_line(aes(x=year,y=mean_sales), col="black",lwd=1)+
geom_point(aes(x=year, y=mean_sales), col="red",size=3)+
labs(title='Distribuzione delle medie di vendite tra il 2010-2014',
x='Anno',
y='Media vendite')
Da questo grafico si può osservare un trend in crescita per le vendite dal 2012.
Ora viene creato un nuovo oggetto a cui è aggiunta la colonna contenente il mese e l’anno, così da avere una visione del comportamento per tutto il range temporale.
new_dati<-dati %>%
mutate(new_date = make_date(year, month))
ggplot(data=new_dati)+
geom_line(aes(x=new_date, y=sales, color=city),lwd=2)+
geom_point(aes(x=new_date,y=sales), col="black",size=1)+
labs(title='Distribuzione delle vendite durante i 5 anni',
x='Data',
y='Vendite')+
scale_x_date(
date_breaks = "1 year",
date_labels = "%Y"
) +
theme(legend.position="bottom")
Osservazione: Per le città con valori di vendita più elevati rimane il trend stagionale, ossia picchi al centro di ciascun anno, corrispondenti ad i mesi più caldi. Per avere un grafico più leggibile si può provare ad approssimarlo con smooth.
ggplot(data=new_dati)+
geom_smooth(aes(x=new_date, y=sales, color=city),lwd=2)+
geom_point(aes(x=new_date,y=sales), col="black",size=1)+
labs(title='Distribuzione delle vendite durante i 5 anni',
x='Data',
y='Vendite')+
scale_x_date(
date_breaks = "1 year",
date_labels = "%Y"
) +
theme(legend.position="bottom")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Grafico a barre sovrapposte per confrontare il totale delle vendite nei vari mesi:
ggplot(data=dati)+
aes(x=month,y=sales, fill=city)+
stat_summary(fun=sum, geom="bar", col='blue',position='stack')+
labs(title='Distribuzione delle vendite totali per mese',
x='Mese',
y='Vendite totali')+
scale_x_continuous(breaks = 1:12,
labels = c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu",
"Lug", "Ago", "Set", "Ott", "Nov", "Dic"))+
theme_minimal()
Osservazione: è presente sia il trend stagionale, che quello che afferma che Tyler ha avuto il maggior numero di vendite e Wichita Falls il minore.
Si può vedere da ultimo il grafico a barre normalizzato:
ggplot(data=dati)+
aes(x=month,y=sales, fill=city)+
facet_wrap(~ year, nrow = 3)+
stat_summary(fun=sum, geom="bar", col='blue',position="fill")+
labs(title='Distribuzione delle vendite totali per mese e per anno',
x='Mese',
y='Vendite totali')+
scale_x_continuous(breaks = 1:12,
labels = c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu",
"Lug", "Ago", "Set", "Ott", "Nov", "Dic"))+
theme_minimal()+
theme(legend.position="bottom")
Anche in questo caso rimane marcata la differenza tra Tyler e Wichita Falls.