Import del dataset

texas <- read.csv("realestate_texas.csv")
head(texas, 5)
##       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

1. Analisi delle variabili

Nel dataset è presente una variabile stringa (city) e 7 varaibili numeriche, di cui 4 caratterizzate da numeri interi (year, month, sales e listings).

In particolare, le tipologie di variabili sono le seguenti:

city: qualitativa nominale
year: quantitativa continua
month: qualitativa ordinale codificata in numeri
sales: quantitativa discreta
volume: quantitativa continua
median_price: quantitativa continua
listings: quantitativa discreta
months_inventory: quantitativa discreta

La variabile year e la variabile month sottintendono una dimensione temporale e possono essere utilizzate per visualizzare grafici di serie storiche: con la variabile year si può studiare l’andamento delle vendite immobiliari negli anni e, con la variabile month, all’interno dello stesso anno, si può osservare l’andamento stagionale.

str(texas)
## '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 ...

2. Indici di posizione, variabilità e forma

Calcolo degli indici di posizione, variabilità e forma per le variabili quantitative non temporali

Variabile sales

#min, max, median, mean, 1st quartile, 3rd quartile

summary(texas$sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    79.0   127.0   175.5   192.3   247.0   423.0
#range
print(paste("range: ", max(texas$sales) - min(texas$sales)))
## [1] "range:  344"
#IQR
print(paste("IQR: ", IQR(texas$sales)))
## [1] "IQR:  120"
#variance
print(paste("variance: ", var(texas$sales)))
## [1] "variance:  6344.29951185495"
#standard deviation
print(paste("standard deviation: ", sd(texas$sales)))
## [1] "standard deviation:  79.6511111777793"
#form indexes
library(moments)

print(paste("skwness: ", skewness(texas$sales)))
## [1] "skwness:  0.718104024884959"
print(paste("kurtosi: ", kurtosis(texas$sales) - 3))
## [1] "kurtosi:  -0.313176409071494"

Variabile volume

#min, max, median, mean, 1st quartile, 3rd quartile

summary(texas$volume)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   8.166  17.660  27.062  31.005  40.893  83.547
#range
print(paste("range: ", max(texas$volume) - min(texas$volume)))
## [1] "range:  75.381"
#IQR
print(paste("IQR: ", IQR(texas$volume)))
## [1] "IQR:  23.2335"
#variance
print(paste("variance: ", var(texas$volume)))
## [1] "variance:  277.270692404027"
#standard deviation
print(paste("standard deviation: ", sd(texas$volume)))
## [1] "standard deviation:  16.6514471564494"
#form indexes

print(paste("skwness: ", skewness(texas$volume)))
## [1] "skwness:  0.884742026325995"
print(paste("kurtosi: ", kurtosis(texas$volume) - 3))
## [1] "kurtosi:  0.176986997089741"

Variabile median_price

#min, max, median, mean, 1st quartile, 3rd quartile

summary(texas$median_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   73800  117300  134500  132665  150050  180000
#range
print(paste("range: ", max(texas$median_price) - min(texas$median_price)))
## [1] "range:  106200"
#IQR
print(paste("IQR: ", IQR(texas$median_price)))
## [1] "IQR:  32750"
#variance
print(paste("variance: ", var(texas$median_price)))
## [1] "variance:  513572983.089261"
#standard deviation
print(paste("standard deviation: ", sd(texas$median_price)))
## [1] "standard deviation:  22662.148686505"
#form indexes

print(paste("skwness: ", skewness(texas$median_price)))
## [1] "skwness:  -0.364552878177372"
print(paste("kurtosi: ", kurtosis(texas$median_price) - 3))
## [1] "kurtosi:  -0.622961820755544"

Variabile listings

#min, max, median, mean, 1st quartile, 3rd quartile

summary(texas$listings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     743    1026    1618    1738    2056    3296
#range
print(paste("range: ", max(texas$listings) - min(texas$listings)))
## [1] "range:  2553"
#IQR
print(paste("IQR: ", IQR(texas$listings)))
## [1] "IQR:  1029.5"
#variance
print(paste("variance: ", var(texas$listings)))
## [1] "variance:  566568.966091353"
#standard deviation
print(paste("standard deviation: ", sd(texas$listings)))
## [1] "standard deviation:  752.707756098841"
#form indexes

print(paste("skwness: ", skewness(texas$listings)))
## [1] "skwness:  0.649498226273971"
print(paste("kurtosi: ", kurtosis(texas$listings) - 3))
## [1] "kurtosi:  -0.791790033332591"

Variabile months_inventory

#min, max, median, mean, 1st quartile, 3rd quartile

summary(texas$months_inventory)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.400   7.800   8.950   9.193  10.950  14.900
#range
print(paste("range: ", max(texas$months_inventory) - min(texas$months_inventory)))
## [1] "range:  11.5"
#IQR
print(paste("IQR: ", IQR(texas$months_inventory)))
## [1] "IQR:  3.15"
#variance
print(paste("variance: ", var(texas$months_inventory)))
## [1] "variance:  5.30688912133891"
#standard deviation
print(paste("standard deviation: ", sd(texas$months_inventory)))
## [1] "standard deviation:  2.30366862229334"
#form indexes

print(paste("skwness: ", skewness(texas$months_inventory)))
## [1] "skwness:  0.040975265871081"
print(paste("kurtosi: ", kurtosis(texas$months_inventory) - 3))
## [1] "kurtosi:  -0.174447541638487"

Tutte le variabili quantitative mostrano una media e una mediana molto simili tra loro, pertanto non ci si aspetta di trovare valori estremamente anomali all’interno dei dati. Tuttavia le distribuzioni non sono simmetriche, infatti si può osservare, ad esempio nella variabile sales, che il valore medio è più vicino al minimo che al massimo, ad indicare che i dati sono maggiormente distribuiti sui valori bassi; questo è confermato dal valore di skewness positivo. Dal valore di skewness si può osservare che, oltre a sales, anche volume e listings hanno un’asimmetria positiva, mentre median_price ha un’asimmetria negativa e months_inventory è praticamente simmetrica. Per quanto riguarda i valori di kurtosi, invece, tutte le variabili risultano leggermente platicurtiche, ad eccezione di volume che è leggermente leptocurtica.

Costruzione delle distribuzioni di frequenza delle variabili qualitative e della variabile anno

#select the number of rows as the number of samples N
N = dim(texas)[1] 

Variabile city

frq_ass <- table(texas$city)
frq_rel <- frq_ass/N

distr_frq_city <- cbind(frq_ass,frq_rel)
distr_frq_city
##                       frq_ass frq_rel
## Beaumont                   60    0.25
## Bryan-College Station      60    0.25
## Tyler                      60    0.25
## Wichita Falls              60    0.25

Variabile year

frq_ass <- table(texas$year)
frq_rel <- frq_ass/N
frq_cum <- cumsum(frq_ass)
frq_rel_cum <- frq_cum/N

distr_frq_year <- cbind(frq_ass,frq_rel, frq_cum, frq_rel_cum)
distr_frq_year
##      frq_ass frq_rel frq_cum frq_rel_cum
## 2010      48     0.2      48         0.2
## 2011      48     0.2      96         0.4
## 2012      48     0.2     144         0.6
## 2013      48     0.2     192         0.8
## 2014      48     0.2     240         1.0

Variabile month

frq_ass <- table(texas$month)
frq_rel <- frq_ass/N
frq_cum <- cumsum(frq_ass)
frq_rel_cum <- frq_cum/N

distr_frq_month <- cbind(frq_ass,frq_rel, frq_cum, frq_rel_cum)
distr_frq_month
##    frq_ass    frq_rel frq_cum frq_rel_cum
## 1       20 0.08333333      20  0.08333333
## 2       20 0.08333333      40  0.16666667
## 3       20 0.08333333      60  0.25000000
## 4       20 0.08333333      80  0.33333333
## 5       20 0.08333333     100  0.41666667
## 6       20 0.08333333     120  0.50000000
## 7       20 0.08333333     140  0.58333333
## 8       20 0.08333333     160  0.66666667
## 9       20 0.08333333     180  0.75000000
## 10      20 0.08333333     200  0.83333333
## 11      20 0.08333333     220  0.91666667
## 12      20 0.08333333     240  1.00000000

Dalle distibuzioni di frequenza si osserva che per tutte le variabili qualitative i dati sono distribuiti equamente tra tutte le categorie, quindi sia nei vari anni, sia nei mesi e sia nelle quattro città. Ci si aspetta quindi massima eterogeneità e un indice di Gini pari a 1.

3. Identificazione delle variabili con maggiore variabilità e asimmetria

Per confrontare la variabilità delle diverse variabili si può calcolare il coefficiente di variazione per ognuna delle variabili quantitative, il quale misura la variabilità relativa rispetto alla media.

cv_sales <- sd(texas$sales)/mean(texas$sales) *100
cv_volume <- sd(texas$volume)/mean(texas$volume) *100
cv_median_price <- sd(texas$median_price)/mean(texas$median_price) *100
cv_listings <- sd(texas$listings)/mean(texas$listings) *100
cv_months_inventory <- sd(texas$months_inventory)/mean(texas$months_inventory) *100

cbind(cv_sales,cv_volume,cv_median_price,cv_listings,cv_months_inventory)
##      cv_sales cv_volume cv_median_price cv_listings cv_months_inventory
## [1,] 41.42203  53.70536        17.08218    43.30833            25.06031

La variabile con il coefficiente di variazione maggiore risulta essere volume, pertanto è quella a più alta variabilità. Essa infatti ha una variabilità attorno alla media del 54% circa.

Inoltre, osservando i valori di skewness calcolati per ogni variabile, volume risulta anche la variabile più asimmetrica, essendo quella con il valore assoluto di skewness più alto. In particolare, essendo il valore maggiore di zero, avrà un’asimmetria positiva, ovvero una distribuzione scodata verso valori più alti della media. Questo implica che potrebbero essere presenti alcuni valori molto alti rispetto al resto della distribuzione dei dati rispetto a questa variabile.

cbind(skewness(texas$sales), skewness(texas$volume), skewness(texas$median_price), skewness(texas$listings), skewness(texas$months_inventory))
##          [,1]     [,2]       [,3]      [,4]       [,5]
## [1,] 0.718104 0.884742 -0.3645529 0.6494982 0.04097527

L’asimettria della distribuzione si può osservare anche nel seguente grafico.

plot(density(texas$volume), main="Density curve - Volume")

4. Creazione di classi per una variabile quantitativa

Si considera la variabile sales e, considerando i suoi valori di minimo e massimo, si decide di dividerla in 8 classi da 50 a 450 che spaziano di 50.

min(texas$sales)
## [1] 79
max(texas$sales)
## [1] 423
N = dim(texas)[1] 

texas$sales_cl <- cut(texas$sales, breaks=c(50,100,150,200,250,300,350,400,450))

frq_ass <-table(texas$sales_cl) 
frq_rel <-frq_ass/N 
frq_cum <-cumsum(frq_ass) 
frq_rel_cum <-frq_cum/N 

cbind(frq_ass,frq_rel,frq_cum,frq_rel_cum)
##           frq_ass    frq_rel frq_cum frq_rel_cum
## (50,100]       21 0.08750000      21   0.0875000
## (100,150]      72 0.30000000      93   0.3875000
## (150,200]      56 0.23333333     149   0.6208333
## (200,250]      32 0.13333333     181   0.7541667
## (250,300]      34 0.14166667     215   0.8958333
## (300,350]      13 0.05416667     228   0.9500000
## (350,400]       9 0.03750000     237   0.9875000
## (400,450]       3 0.01250000     240   1.0000000
barplot(frq_rel,
        main = "Distribution of sales classes",
        xlab = "Sales classes",
        ylab = "Relative frequencies",
        col="lightgreen",
        )

Si calcola l’indice di gini per le classi costruite

#define the function for the gini index calculus
gini_index <- function(x){
  ni = table(x) #freq assolute
  fi = ni/length(x) #freq relative
  fi2 = fi^2 #freq rel al quad
  J = length(table(x)) #numero di classi
  
  gini = 1-sum(fi2)
  gini_norm = gini/((J-1)/J)
  
  return(gini_norm)
}

frq_ass
## 
##  (50,100] (100,150] (150,200] (200,250] (250,300] (300,350] (350,400] (400,450] 
##        21        72        56        32        34        13         9         3
gini_index(texas$sales_cl)
## [1] 0.9206349

Si può osservare che la classe più numerosa è quella compresa tra 100 e 150 vendite, con il 30% delle osservazioni. Inoltre più del 50% delle osservazioni (il 62% per l’esattezza) si trova ad un valore inferiore a 200, infatti la mediana della variabile sales, corrispondente al cinquantesimo percentile, è pari a 175.5, incluso quindi nella classe 150-200 (classe mediana). Le classi più alte sono invece poco popolate, ad indicare che raramente è stato registrato un numero di vendite così elevato. Nonostante la bassa popolazione delle ultime due classi, l’indice di gini normalizzato, che misura l’eterogeneità delle classi, rimane elevato, pari a 0.92, ad indicare che i dati sono distribuiti in maniera abbastanza equa tra le varie categorie e, nonostante ci sia una classe più popolata, essa non è preponderante al punto da rendere la variabile omogenea.

5. Calcolo della probabilità

Per calcolare la probabilità che, presa una riga a caso, essa si riferisca alla città Beaumont, si devono contare quante osservazioni della città Beaumont sono presenti rispetto al totale (numero di casi favorevoli rispetto al numero di casi possibili)

table(texas$city)
## 
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60
Prob_beaumont = 60/240
Prob_beaumont
## [1] 0.25

Ci sono 60 osservazioni con Beaumont rispetto a 240 totali, ovvero il 25% di probabilità che esca la città Beaumont.

Si procede allo stesso modo per calcolare la probabilità che esca il mese di luglio

table(texas$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
Prob_july = 20/240
Prob_july
## [1] 0.08333333

C’è l’8.33% di probabilità che, prendendo una riga a caso, essa riporti il mese di luglio.

Per calcolare la probabilità che esca il mese dicembre 2012 bisogna calcolare la probabilità che si verifichino contemporaneamente l’evento del mese dicembre e dell’anno 2012 e poi moltiplicare le due probabilità.

table(texas$year)
## 
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48
table(texas$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
prob_2012 = 48/240
prob_dic = 20/240

print(prob_2012)
## [1] 0.2
print(prob_dic)
## [1] 0.08333333
prob_dic_2012 = prob_2012*prob_dic
prob_dic_2012
## [1] 0.01666667

La probabilità che esca il mese dicembre 2012 risulta essere dell’1.667%.

Si può calcolare la stessa probabilità andando a contare quante osservazioni di dicembre ci sono nell’anno 2012 e rapportarle al totale delle osservazioni

table(texas$month[texas$year == 2012])
## 
##  1  2  3  4  5  6  7  8  9 10 11 12 
##  4  4  4  4  4  4  4  4  4  4  4  4
prob_dic_2012_bis = 4/240
prob_dic_2012_bis
## [1] 0.01666667

Questo calcolo conferma che la probabilià di osservare dicembre 2012 è dell’1.667%.

6. Creazione di nuove variabili

Per calcolare il prezzo medio degli immobili si divide la variabile volume, che rappresenta il valore totale delle vendite (ovvero la somma totale del ricavato delle vendite effettuate) per il numero di vendite. Si converte poi il valore in dollari moltiplicando per 1000000.

texas$mean_price <- texas$volume/texas$sales *1000000

Per valutare l’efficacia degli annunci di vendita, si crea una variabile data dal rapporto tra numero di vendite e numero di annunci. In questo modo si può osservare il numero di vendite effettuate rispetto al numero di annunci pubblicati: più il rapporto è alto più la presenza di annunci è efficace nell’effettuare le vendite, più è basso più indica che non c’è stata particolare relazione tra vendite e annunci.

texas$listings_eff <- texas$sales/texas$listings
summary(texas$listings_eff)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.05014 0.08980 0.10963 0.11874 0.13492 0.38713

Si osserva che in media il numero di vendite è circa il 10% degli annunci pubblicati

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
#calculate monthly mean
monthly_mean <- 
  texas %>%
  group_by(year, month) %>%
  summarise(mean_efficacy = mean(listings_eff), .groups="drop")

#calculate annual mean
annual_mean <- monthly_mean %>%
  group_by(year) %>%
  summarise(annual_mean_efficacy = mean(mean_efficacy))

Il seguente grafico a barre mostra l’andamento medio dell’efficacia degli annunci negli anni, la quale è andata ad aumentare.

library(ggplot2)

ggplot(annual_mean, aes(x=as.factor(year), y=annual_mean_efficacy)) +
  geom_col(fill="skyblue") +
  labs(title = "Mean efficacy per year (sales)",
       x = "Year",
       y = "Annual mean efficacy (number of sales/list)")+
  theme(plot.title = element_text(hjust = 0.5))

Nel grafico sottostante sono mostrati gli andamenti mensili per ogni anno. Si può osservare come da aprile ad agosto l’efficacia è maggiore. Inoltre anche da questo grafico si evince l’aumento dell’efficacia dal 2010 nal 2014.

ggplot(monthly_mean, aes(x = as.factor(month), y = mean_efficacy, group = year, color = as.factor(year))) +
  geom_line(linewidth=1) +
  geom_point() +
  labs(title = "Monthly trend of efficacy by year (sales)",
       x = "Month", y = "Mean efficacy (number of sales/list)", color= "Year")+
  theme(plot.title = element_text(hjust = 0.5))

Si può inoltre creare una colonna che misuri anche l’efficacia degli annunci in termini di fatturato, dividendo quindi il valore totale delle vendite (volume) per il numero di annunci e osservando il ricavato medio per annuncio. Più il rapporto è elevato più l’efficacia sarà alta.

texas$listings_eff_vol <- texas$volume/texas$listings
#calculate monthly mean
monthly_mean_vol <- 
  texas %>%
  group_by(year, month) %>%
  summarise(mean_efficacy_vol = mean(listings_eff_vol), .groups="drop")

#calculate annual mean
annual_mean_vol <- monthly_mean_vol %>%
  group_by(year) %>%
  summarise(annual_mean_efficacy_vol = mean(mean_efficacy_vol))
ggplot(annual_mean_vol, aes(x=as.factor(year), y=annual_mean_efficacy_vol)) +
  geom_col(fill="skyblue") +
  labs(title = "Mean efficacy per year (volume)",
       x = "Anno",
       y = "Annual mean efficacy (millions of dollars/list)")+
  theme(plot.title = element_text(hjust = 0.5))

ggplot(monthly_mean_vol, aes(x = as.factor(month), y = mean_efficacy_vol, group = year, color = as.factor(year))) +
  geom_line(linewidth=1) +
  geom_point() +
  labs(title = "Monthly trend of efficacy by year (volume)",
       x = "Month", y = "Mean efficacy (millions of dollars/list)", color = "Year")+
  theme(plot.title = element_text(hjust = 0.5))

L’andamento risulta in linea con quello dell’efficacia per numero di annunci.

7. Analisi condizionata

Numero di vendite per città

Si calcola la media e la deviazione standard del numero di vendite per città e si mostrano in un barplot.

city_summary <- 
  texas %>%
  group_by(city) %>%
  summarise(mean = mean(sales),
            dv_std = sd(sales))
city_summary
## # A tibble: 4 × 3
##   city                   mean dv_std
##   <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
ggplot(city_summary)+theme_bw()+
  geom_col(aes(x=city, y=mean),fill="darkgreen")+
  geom_errorbar(aes(x=city,
                    ymin=mean-dv_std,
                    ymax=mean+dv_std),col=2)+
  labs(title="Number of sales by city", x="City", y="Mean of sales")+
  theme(plot.title = element_text(hjust = 0.5))

La città con il maggior numero di vendite medio risulta essere Tyler.

Numero di vendite per anno

Si calcolano media e deviazione standard del numero di vendite per ogni anno

year_summary <- 
  texas %>%
  group_by(year) %>%
  summarise(mean = mean(sales),
            dv_std = sd(sales))
year_summary
## # A tibble: 5 × 3
##    year  mean dv_std
##   <int> <dbl>  <dbl>
## 1  2010  169.   60.5
## 2  2011  164.   63.9
## 3  2012  186.   70.9
## 4  2013  212.   84.0
## 5  2014  231.   95.5
ggplot(year_summary)+theme_bw()+
  geom_col(aes(x=year, y=mean),fill="darkgreen")+
  geom_errorbar(aes(x=year,
                    ymin=mean-dv_std,
                    ymax=mean+dv_std),col=2)+
  labs(title="Number of sales by year", x="Year", y="Mean of sales")+
  theme(plot.title = element_text(hjust = 0.5))

Si conferma l’aumento delle vendite negli anni.

Numero di vendite per mese (complessivo di tutti gli anni)

Si calcola media e deviazione standard del numero di vendite in ogni mese, considerando tutti gli anni.

month_summary <- 
  texas %>%
  group_by(month) %>%
  summarise(mean = mean(sales),
            dv_std = sd(sales))
month_summary
## # A tibble: 12 × 3
##    month  mean dv_std
##    <int> <dbl>  <dbl>
##  1     1  127.   43.4
##  2     2  141.   51.1
##  3     3  189.   59.2
##  4     4  212.   65.4
##  5     5  239.   83.1
##  6     6  244.   95.0
##  7     7  236.   96.3
##  8     8  231.   79.2
##  9     9  182.   72.5
## 10    10  180.   75.0
## 11    11  157.   55.5
## 12    12  169.   60.7
ggplot(month_summary)+theme_bw()+
  geom_col(aes(x=as.factor(month), y=mean),fill="darkgreen")+
  geom_errorbar(aes(x=month,
                    ymin=mean-dv_std,
                    ymax=mean+dv_std),col=2)+
  labs(title="Number of sales by month (all years)", x="Month", y="Mean of sales")+
  theme(plot.title = element_text(hjust = 0.5))

Si conferma una maggior vendita nei mesi centrali dell’anno.

Numero di vendite per mese per anno

Si raggruppano i dati per anno e mese e si calcolano media e deviazione standard del numero di vendite per ogni mese di ogni anno.

month_per_year_summary <- 
  texas %>%
  group_by(year, month) %>%
  summarise(mean = mean(sales),
            dv_std = sd(sales))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
month_per_year_summary
## # A tibble: 60 × 4
## # Groups:   year [5]
##     year month  mean dv_std
##    <int> <int> <dbl>  <dbl>
##  1  2010     1  105.   36.6
##  2  2010     2  122.   40.3
##  3  2010     3  189.   43.6
##  4  2010     4  229    64.0
##  5  2010     5  233.   58.8
##  6  2010     6  216.   71.4
##  7  2010     7  178    62.5
##  8  2010     8  184.   45  
##  9  2010     9  150.   47.2
## 10  2010    10  141.   45.7
## # ℹ 50 more rows

Si mostra in un lineplot l’andamento del numero di vendite mensile in ogni anno.

ggplot(month_per_year_summary, aes(x = as.factor(month), y = mean, group = year, color = as.factor(year))) +
  geom_line(linewidth=1) +
  geom_point() +
  labs(title = "Numero di vendite mensili per anno",
       x = "Mese", y = "Numero di vendite medio", color="Year")+
  labs(title="Number of sales by month (per years)", x="Month", y="Mean of sales")+
  theme(plot.title = element_text(hjust = 0.5))

8. Creazione di visualizzazioni con ggplot2

Analisi di prezzi e annunci per città in relazione a numero di vendite e fatturato

Si analizza la distribuzione dei prezzi mediani di vendita per città

ggplot(data= texas)+
  geom_boxplot(aes(
    x = city,
    y = median_price),
    col = "black",
    fill="lightblue")+
  labs(title = "Distribution of median sale prices in cities",
       x = "City",
       y="Median price (dollars)")+
  theme(plot.title = element_text(hjust = 0.5))

Si può osservare come la città con i prezzi più alti sia Bryan-Colege Station, mentre quella con i prezzi più bassi è Wichita Falls.

Ora si osserva la stessa distribuzione ma aggiungendo l’informazione dell’anno

ggplot(data= texas)+
  geom_boxplot(aes(
    x = city,
    y = median_price, 
    fill=as.factor(year)),
    col = "black")+
  labs(title = "Distribution of median sale prices in cities by year",
       x = "City",
       y="Median price (dollars)",
       fill="Year")+
  theme(plot.title = element_text(hjust = 0.5))

Si osserva che negli anni si è registrato un aumento dei prezzi di vendita maggiormente evidente nella città di Bryan-College Station e di Tyler. Anche nella città di Beaumont, ad eccezione del 2010, gli altri anni mostrano questo andamento crescente.

Con i boxplot seguenti si osserva che anche il valore totale delle vendite è aumentato negli anni per tutte le città, ad eccezione di Wichita Falls in cui è rimasto praticamente invariato.

  ggplot(data= texas)+
  geom_boxplot(aes(
    x = city,
    y = volume, 
    fill=as.factor(year)),
    col = "black")+
  labs(title = "Distribution of total sales value in the cities by year",
       x = "City",
       y="Volume (million of dollars)",
       fill="Year")+
  theme(plot.title = element_text(hjust = 0.5))

Il numero delle vendite segue lo stesso andamento osservato per prezzi e valore: crescente per tutte le città ad eccezione di Wichita Falls. Si può osservare come, mentre la città di Bryan-College Station è quella con i prezzi mediani più alti, quella che ha avuto un maggior numero di vendite e che ha fatturato maggiormente è Tyler.

ggplot(data= texas)+
  geom_boxplot(aes(
    x = city,
    y = sales, 
    fill=as.factor(year)),
    col = "black")+
  labs(title = "Distribution of the number of sales in the cities by year",
       x = "City",
       y="Number of sales",
       fill="Year")+
  theme(plot.title = element_text(hjust = 0.5))

Questo si può spiegare andando ad osservare il numero degli annunci attivi per ogni città.

ggplot(data= texas)+
  geom_boxplot(aes(
    x = city,
    y = listings, 
    fill=as.factor(year)),
    col = "black")+
  labs(title = "Distribution of the number of listings in the cities by year",
       x = "City",
       y="Number of listings",
       fill="Year")+
  theme(plot.title = element_text(hjust = 0.5))

Si può osservare come la città di Tyler abbia pubblicato un numero di annunci nettamente superiore alle altre città e come, Wichita Falls, sia invece la città con meno annunci. In generale in tutte le città il numero di annunci negli anni è andato però a diminuire. Probabilmente però sono stati sviluppati in numero inferiore ma in maniera più efficace, infatti, se osserviamo l’andamento degli anni dell’efficacia degli annunci, sia rispetto al numero di vendite sia rispetto al fatturato, osserviamo un andamento crescente.

ggplot(data= texas)+
  geom_boxplot(aes(
    x = city,
    y = listings_eff, 
    fill=as.factor(year)),
    col = "black")+
  labs(title = "Distribution of the efficacy (sales) of listings in cities per year",
       x = "City",
       y="Efficacy (number of sales)",
       fill = "Year")+
  theme(plot.title = element_text(hjust = 0.5))

ggplot(data= texas)+
  geom_boxplot(aes(
    x = city,
    y = listings_eff_vol, 
    fill=as.factor(year)),
    col = "black")+
  labs(title = "Distribution of the efficacy (value) of listings in cities per year",
       x = "City",
       y="Efficacy (million of dollars)",
       fill="Year")+
  theme(plot.title = element_text(hjust = 0.5))

Si può osservare come in generale la città di Bryan-College Station abbia degli annunci più efficaci rispetto alla città di Tyler, tuttavia quest’ultima, compensando con un elevato numero di annunci, tende a fatturare maggiormente.

Totale vendite per mese e città

library(viridis)
## Caricamento del pacchetto richiesto: viridisLite

Grafico a barre sovrapposte

ggplot(data = texas)+
  geom_col(aes(x=city, 
               y=sales,
              fill = as.factor(month)), position = "stack")+
  labs(title = "Total sales by month and cities",
        x="City",
        y="Number of sales",
       fill="Month")+
  scale_fill_viridis_d(option="H")+
  theme(plot.title = element_text(hjust = 0.5))

Grafico a barre sovrapposte normalizzato

ggplot(data = texas)+
  geom_col(aes(x=city, 
               y=sales,
              fill = as.factor(month)), position = "fill")+
  labs(title = "Total sales by month and cities",
        x="City",
        y="Number of sales",
       fill="Month")+
  scale_fill_viridis_d(option="H")+
  theme(plot.title = element_text(hjust = 0.5))

Dai grafici a barre Si osserva che il numero di vendite della città di Tyler, come già emerso dai boxplot, è quello più elevato. Dal grafico normalizzato si osserva che negli stessi mesi le città hanno all’incirca gli stessi quantitativi di vendite rispetto al totale. In tutte le città inoltre c’è un aumento delle vendite nei mesi centrali dell’anno ovvero da aprile ad agosto.

Ora si mostrano gli stessi grafici divisi per anno

ggplot(data = texas)+
  geom_col(aes(x=city, 
               y=sales,
              fill = as.factor(month)), position = "stack")+
  facet_wrap(~year)+
  labs(title = "Total sales by month and cities per year",
        x="City",
        y="Number of sales",
       fill = "Month")+
  scale_fill_viridis_d(option="H")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5))

Si fa lo stesso con i grafici a barre normalizzati

ggplot(data = texas)+
  geom_col(aes(x=city, 
               y=sales,
              fill = as.factor(month)), position = "fill")+
  facet_wrap(~year)+
  labs(title = "Total sales by month and cities per year",
        x="City",
        y="Number of sales",
       fill="Month")+
  scale_fill_viridis_d(option="H")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5))

Andamento delle vendite negli anni

Si costruiscono dei lineplot per mostrare l’andamento delle vendite mensili (plot 1) e del numero degli annunci (plot 2) per ogni mese nei diversi anni e nelle diverse città.

ggplot(data = texas) +
  geom_line(aes(x = month, y = sales, color = as.factor(year))) +
  geom_point(aes(x = month, y = sales, color = as.factor(year))) +
  scale_x_continuous(breaks = 1:12, labels = 1:12) +
  facet_wrap(~city) +
  labs(
    x = "Month",
    y = "Number of sales",
    color = "Year",
    title = "Plot 1: Trend of monthly sales by city and year"
  )+
  theme(plot.title = element_text(hjust = 0.5))

Si può osservare, come osservato in precedenza, che negli anni il numero di vendite è andato ad aumentare e che, in particolare per la città di Bryan-College Station e di Tyler, le vendite all’interno dell’anno sono più numerose nei mesi centrali.

ggplot(data = texas) +
  geom_line(aes(x = month, y = listings, color = as.factor(year))) +
  geom_point(aes(x = month, y = listings, color = as.factor(year))) +
  scale_x_continuous(breaks = 1:12, labels = 1:12) +
  facet_wrap(~city) +
  labs(
    x = "Month",
    y = "Number of sales",
    color = "Year",
    title = "Plot 2: Trend of monthly number of listings by city and year"
  )+
  theme(plot.title = element_text(hjust = 0.5))

9. Conclusioni

Dall’analisi è emerso che le città con fatturato maggiore sono quelle in cui gli annunci attivi o sono più efficaci, quindi fatti probabilmente con maggior attenzione, come nel caso di Bryan-College Station, oppure sono più numerosi. Infatti, nel caso della città di Tyler, anche se per singolo annuncio le vendite risultano inferiori, il numero elevato di annunci presenti consente alla città di essere quella con il valore totale delle vendite più alto. Nel caso della città di Wichita Falls, la quale ha un’efficacia di annunci pari a quella delle altre città, bisognerebbe probabilmente incrementare il numero di annunci che invece è sempre rimasto esiguo.