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

Introduzione:

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.

Analisi delle variabili:

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.

Indici di posizione, variabilità e forma

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

Identificazione delle variabili con maggiore variabilità e asimmetria

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.

Creazione di classi per una variabile quantitativa

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.

Calcolo delle probabilità

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

Calcolo di nuove variabili

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.

Statistiche condizionate

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.

Creazione di visualizzazioni con ggplot2

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.

Conclusioni