Statistica descrittiva · R

Analisi del mercato immobiliare del Texas

Versione integrata nel sito senza iframe. Il notebook ricostruito resta disponibile come file .ipynb.

Analisi del mercato immobiliare del Texas

Gabriele Iocco

2024-05-24

Tipo di variabili contenute nel dataframe

Setto la cartella di lavoro, leggo il file csv e calcolo le dimensioni del dataframe assegnandolo all’oggetto N
Codice
setwd("D:/R/mercato immobiliare del Texas")

dati <- read.csv("D:/R/mercato immobiliare del Texas/Real Estate Texas.csv",sep = ",",encoding = "latin1")

dim(dati)
## [1] 240   8
Codice
N<-dim(dati)[1]
Con la funzione save.image salvo gli oggetti presenti nell’ambiente virtuale in un file RData da richiamare all’occorrenza
Codice
save.image(file = "global_environment_texas.RData")
Con la funzione load carico gli oggetti nell’ambiente virtuale
Codice
load("D:/R/mercato immobiliare del Texas/global_environment_texas.RData")
Con la funzione attach rendo visibili i componenti di una lista come se fossero variabili definite indipendentemente
Codice
attach(dati)
Tramite il comando typeof determino che tipo di variabili popolano il dataframe
Codice
type = sapply(dati, typeof)
type
##             city             year            month            sales 
##      "character"        "integer"        "integer"        "integer" 
##           volume     median_price         listings months_inventory 
##         "double"         "double"        "integer"         "double"

Variabile city - qualitativa nominale

Distribuzione di frequenze

Con la funzione table costruisco le frequenze assolute e le assegno all’etichetta freq_ass
Costruisco le frequenze relative freq_rel
Costruisco la distribuzione di frequenze distr_freq_city
Codice
freq_ass<-table(dati["city"])

freq_rel<-freq_ass/N

distr_freq_city<-cbind(freq_ass,freq_rel)
distr_freq_city
##                       freq_ass freq_rel
## Beaumont                    60     0.25
## Bryan-College Station       60     0.25
## Tyler                       60     0.25
## Wichita Falls               60     0.25
## La variabile city ha una distribuzione quadrimodale.

Variabile year - qualitativa ordinale

Numero di modalità
Frequenza assoluta
Codice
levels(as.factor(year))
## [1] "2010" "2011" "2012" "2013" "2014"
Codice
table(year)
## year
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48
## La variabile year ha cinque modalità e ogni modalità ha la stessa frequenza assoluta
Suddivido in classi la variabile per poi calcolare le frequenze assolute della variabile qualitativa ordinale ciclica month per ogni classe e per ogni città
Codice
year_cl<-cut(year,seq(2009,2014,1))

freq_ass_month <- table(year_cl, city)
freq_ass_month
##              city
## year_cl       Beaumont Bryan-College Station Tyler Wichita Falls
##   (2009,2010]       12                    12    12            12
##   (2010,2011]       12                    12    12            12
##   (2011,2012]       12                    12    12            12
##   (2012,2013]       12                    12    12            12
##   (2013,2014]       12                    12    12            12
## Per ogni città ogni anno sono stati osservati 12 mesi

Variabile sales - quantitativa discreta

Indici di posizione
Codice
summary(sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    79.0   127.0   175.5   192.3   247.0   423.0
Quantili
Codice
quantile(sales,seq(0,1,0.1))
##    0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
##  79.0 101.9 120.6 135.0 155.0 175.5 197.0 228.5 271.0 302.1 423.0
Range interquartile
Codice
IQR(sales)
## [1] 120
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
mean_sales=mean(sales)
sigma2_sales=sum((sales-mean_sales)^2)/N

sigma_sales=sqrt(sigma2_sales)

sigma2_sales
## [1] 6317.865
Codice
sigma_sales
## [1] 79.485
Indice di asimmetria di Fischer e Curtosi
Codice
library(moments)

skewness(sales)
## [1] 0.718104
Codice
kurtosis(sales)-3
## [1] -0.3131764
## L'asimmetria è positiva, la maggior parte dei dati si trova sulla sinistra della distribuzione
## Il valore della curtosi indica una distribuzione platicurtica

Variabile volume - quantitativa continua

Indici di posizione
Codice
summary(volume)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   8.166  17.660  27.062  31.005  40.893  83.547
Quantili
Codice
quantile(volume,seq(0,1,0.1))
##      0%     10%     20%     30%     40%     50%     60%     70%     80%     90% 
##  8.1660 13.0967 16.1206 19.0344 23.9976 27.0625 31.8436 36.9307 45.5920 53.7391 
##    100% 
## 83.5470
Range interquartile
Codice
IQR(volume)
## [1] 23.2335
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
mean_volume=mean(volume)
sigma2_volume=sum((volume-mean_volume)^2)/N

sigma_volume=sqrt(sigma2_volume)

sigma2_volume
## [1] 276.1154
Codice
sigma_volume
## [1] 16.61672
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(volume)
## [1] 0.884742
Codice
kurtosis(volume)-3
## [1] 0.176987
## L'asimmetria è positiva, la maggior parte dei dati si trova sulla sinistra della distribuzione
## Il valore della curtosi indica una distribuzione leptocurtica

Variabile median_price - quantitativa continua

Indici di posizione
Codice
summary(median_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   73800  117300  134500  132665  150050  180000
Quantili
Codice
quantile(median_price,seq(0,1,0.1))
##     0%    10%    20%    30%    40%    50%    60%    70%    80%    90%   100% 
##  73800  99960 110000 121650 130700 134500 141220 147960 152360 158850 180000
Range interquartile
Codice
IQR(median_price)
## [1] 32750
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
mean_median_price=mean(median_price)
sigma2_median_price=sum((median_price-mean_median_price)^2)/N

sigma_median_price=sqrt(sigma2_median_price)

sigma2_median_price
## [1] 511433096
Codice
sigma_median_price
## [1] 22614.89
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(median_price)
## [1] -0.3645529
Codice
kurtosis(median_price)-3
## [1] -0.6229618
## L'asimmetria è negativa, buona parte dei dati si trova sulla destra della distribuzione
## Il valore della curtosi indica una distribuzione platicurtica

Variabile listings - quantitativa discreta

Indici di posizione
Codice
summary(listings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     743    1026    1618    1738    2056    3296
Quantili
Codice
quantile(listings,seq(0,1,0.1))
##     0%    10%    20%    30%    40%    50%    60%    70%    80%    90%   100% 
##  743.0  899.9  968.0 1208.7 1525.2 1618.5 1687.8 1796.0 2721.4 2946.7 3296.0
Range interquartile
Codice
IQR(listings)
## [1] 1029.5
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
mean_listings=mean(listings)
sigma2_listings=sum((listings-mean_listings)^2)/N

sigma_listings=sqrt(sigma2_listings)

sigma2_listings
## [1] 564208.3
Codice
sigma_listings
## [1] 751.138
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(listings)
## [1] 0.6494982
Codice
kurtosis(listings)-3
## [1] -0.79179
## L'asimmetria è positiva, buona parte dei dati si trova sulla sinistra della distribuzione
## Il valore della curtosi indica una distribuzione platicurtica

Variabile months_inventory - quantitativa continua

Indici di posizione
Codice
summary(months_inventory)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.400   7.800   8.950   9.193  10.950  14.900
Quantili
Codice
quantile(months_inventory,seq(0,1,0.1))
##    0%   10%   20%   30%   40%   50%   60%   70%   80%   90%  100% 
##  3.40  6.69  7.50  7.97  8.40  8.95  9.40 10.53 11.40 12.21 14.90
Range interquartile
Codice
IQR(months_inventory)
## [1] 3.15
Calcolo la varianza sigma2 e la deviazione standard sigma
Codice
mean_months_inventory=mean(months_inventory)
sigma2_months_inventory=sum((months_inventory-mean_months_inventory)^2)/N

sigma_months_inventory=sqrt(sigma2_months_inventory)

sigma2_months_inventory
## [1] 5.284777
Codice
sigma_months_inventory
## [1] 2.298864
Indice di asimmetria di Fischer e Curtosi
Codice
skewness(months_inventory)
## [1] 0.04097527
Codice
kurtosis(months_inventory)-3
## [1] -0.1744475
## L’asimmetria è leggermente positiva, indicando che ci sono alcuni dati che si trovano leggermente a destra della distribuzione
## Il valore della curtosi indica una distribuzione platicurtica

Calcolo il coefficiente di variazione CV per determinare la variabile con variabilità più elevata

Codice
mean <- c(mean_sales, mean_volume, mean_median_price, mean_listings, mean_months_inventory)
sd <- c(sigma_sales, sigma_volume, sigma_median_price, sigma_listings, sigma_months_inventory)

variables <- c('sales', 'volume', 'median_price', 'listings', 'months_inventory')

data_cv <- data.frame()

for (i in 1:length(variables)) {
  cv <- (sd[i] / mean[i]) * 100
  data_cv <- rbind(data_cv, data.frame(Variable = variables[i], CV = round(cv, 2), "Percentage" =  "%"))

}

cv_ordered <- data_cv[order(-data_cv$CV), ]
cv_ordered
##           Variable    CV Percentage
## 2           volume 53.59          %
## 4         listings 43.22          %
## 1            sales 41.34          %
## 5 months_inventory 25.01          %
## 3     median_price 17.05          %
## La variabile con la variabilità più elevata è la variabile  volume con un coefficiente di variazione di 53.59 , vuol dire che presenta una deviazione standard che è il 53.59 % della rispettiva media

Calcolo la variabile con asimmetria più elevata

Codice
asim <- c(skewness(sales), skewness(volume), skewness(median_price), skewness(listings), skewness(months_inventory))

variables <- c('sales', 'volume', 'median_price', 'listings', 'months_inventory')

data_asim <- data.frame()

for (i in 1:length(variables)) {
  data_asim <- rbind(data_asim, data.frame(Variable = variables[i], Asim = round(asim[i], 2)))
}

asim_ordered <- data_asim[order(-data_asim$Asim), ]
asim_ordered
##           Variable  Asim
## 2           volume  0.88
## 1            sales  0.72
## 4         listings  0.65
## 5 months_inventory  0.04
## 3     median_price -0.36
## La variabile più asimmetrica è la variabile  volume con una asimmetria di 0.88

Divido la variabile sales in classi, creo la colonna sales_cl nel dataframe e calcolo la distribuzione di frequenze

Codice
dati$sales_cl <- cut(dati$sales,
            breaks=c(50,100,150,200,250,300,350,400,450))
Codice
distr_freq_sales <- as.data.frame(
  cbind(
    ni=table(dati$sales_cl),
    fi=table(dati$sales_cl)/N,
    Ni=cumsum(table(dati$sales_cl)),
    Fi=cumsum(table(dati$sales_cl)/N)
  )
)
distr_freq_sales
##           ni         fi  Ni        Fi
## (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
Codice
library(ggplot2)

ggplot(data = dati)+
  geom_bar(aes(x=sales_cl),
           stat = "count",
           fill = "yellow3")+
  labs(title = "Suddivisione in classi della variabile sales",
       x="Sales in classi ",
       y="Frequenze assolute")+
       scale_y_continuous(breaks = seq(0,80,5))+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12)
  )

Indice di Gini
Codice
gini.index<-function(x){
     ni=table(x)
     fi=ni/length(x)
     fi2=fi^2
     J = length(table(x))
 
     gini = 1-sum(fi2)
     gini.normalizzato = gini/((J-1)/J)
 
 return(gini.normalizzato)
}

table(dati$sales_cl)
## 
##  (50,100] (100,150] (150,200] (200,250] (250,300] (300,350] (350,400] (400,450] 
##        21        72        56        32        34        13         9         3
Codice
gini.index(dati$sales_cl)
## [1] 0.9206349
## La distribuzione della variabile sales_cl è abbastanza eterogenea, le unità statistiche si distribuiscono lungo tutte le modalità
Indice di Gini per la variabile city
Codice
gini.index(city)
## [1] 1

Probabilità di selezionare la città di Beaumont selezionando una riga a caso del dataframe

Codice
unique_cities_num <- length(unique(city))
unique_cities_num
## [1] 4
Codice
probability <- (1/unique_cities_num)*100
probability
## [1] 25
## Le città sono 4 e le modalità della variabile city hanno la stessa frequenza assoluta, quindi la probabilità di selezionare una città tra quattro è 1/4, il 25%

Probabilità di selezionare il mese di Luglio selezionando una riga a caso del dataframe

Le modalità di month hanno le stesse frequenze assolute
Moltiplico le frequenze assolute per il numero di città
Codice
freq_ass_cities <- max(freq_ass_month*unique_cities_num)
freq_ass_cities
## [1] 48
Codice
probability=(unique_cities_num/freq_ass_cities)*100
probability
## [1] 8.333333
## La probabilità di selezionare il mese di Luglio è pari all'8.3%

Probabilità di selezionare il mese di Dicembre 2012 selezionando una riga a caso del dataframe

Sommo le frequenze assolute di month per ottenere il numero di righe del dataframe
Codice
total_freq <- sum(freq_ass_month)
total_freq
## [1] 240
Codice
probability <- (1 / total_freq) * 100
probability
## [1] 0.4166667
## La probabilità è pari allo 0.41%

Creo la colonna mean_price

Codice
dati=data.frame(dati,mean_price=(volume/sales)*1000)
## Ho diviso il volume di affari di ogni mese per il numero di vendite di quel mese e ho moltiplicato *1000 perchè la variabile volume esprime il suo valore in milioni di dollari

Creo una colonna che esprima l’efficacia degli annunci

Codice
dati=data.frame(dati,effectiveness_ads=sales/listings)
## Ho diviso il numero di vendite mensili per il numero degli annunci attivi ogni mese ricavando così un valore che esprima la validità degli annunci. Più il valore di questo rapporto è alto più gli annunci hanno avuto efficacia generando un numero maggiore di vendite

Summary della variabile sales condizionatamente a city, year e month

Codice
library(dplyr)

dati%>%
  group_by(city,month)%>%
  summarise(media_sales=mean(sales),
            stand_dev_sales=sd(sales))
## # A tibble: 48 × 4
## # Groups:   city [4]
##    city     month media_sales stand_dev_sales
##    <chr>    <int>       <dbl>           <dbl>
##  1 Beaumont     1        122.            31.2
##  2 Beaumont     2        135.            31.9
##  3 Beaumont     3        171             14.9
##  4 Beaumont     4        190.            17.7
##  5 Beaumont     5        207.            42.6
##  6 Beaumont     6        205             36.0
##  7 Beaumont     7        185.            22.9
##  8 Beaumont     8        217.            50.6
##  9 Beaumont     9        174             46.9
## 10 Beaumont    10        189.            44.0
## # ℹ 38 more rows
Codice
dati%>%
  group_by(year)%>%
  summarise(media_sales=mean(sales),
            stand_dev_sales=sd(sales))
## # A tibble: 5 × 3
##    year media_sales stand_dev_sales
##   <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

Distribuzione del volume degli affari negli anni e nelle varie città

Codice
ggplot(data=dati)+
  geom_boxplot(aes(x=year_cl,
                   y=median_price,
                   fill=city))+
  labs(title = "Distribuzione del volume degli affari",
       x = "Year in classi",
       y = "Volume",
       fill = "")+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12),
    
    strip.background = element_blank(),
    
    legend.title = element_text(size = 10),
    legend.text = element_text(size = 10),
    legend.key.size = unit(1, "cm"),
    legend.position = "bottom"
  )

## Wichita Falls e Beaumont hanno aumentato di poco il loro volume degli affari nel corso degli anni presi in esame, mentre le città di Tyler e Bryan-College Station hanno avuto un incremento maggiore nel 2013 e nel 2014. 
## La mediana del volume degli affari a Wichita Falls nel 2011 è notevolmente più alta rispetto ad altre città e ad altri anni. Questo suggerisce la possibilità che ci sia stato un incremento delle vendite con un focus su immobili di valore superiore.
## Gli outliers superiori indicano che c'è stato un aumento significativo del volume degli affari in alcuni mesi. Al contrario gli outliers inferiori indicano un sostanziale calo degli affari

Distribuzione delle vendite tra le varie città negli anni

Codice
ggplot(data=dati)+
  geom_boxplot(aes(x=year_cl,
                   y=sales,
                   fill=city))+
  labs(title = "Distribuzione delle vendite",
       x = "Year in classi",
       y = "Sales",
       fill = "")+
  theme_minimal() +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=12),
    axis.text.y = element_text(size=12),
    
    strip.background = element_blank(),
    
    legend.title = element_text(size = 10),
    legend.text = element_text(size = 10),
    legend.key.size = unit(1, "cm"),
    legend.position = "bottom"
  )

## Le vendite a Whichita Falls si mantengono pressocchè costanti nel corso degli anni mentre nelle altre città c'è un aumento. Nel 2012 il valore della mediana a Bryan-College Station è molto basso, questo vuol dire che sono stati venduti pochi immobili nella maggior parte dei mesi . Sempre nel 2012 la città di Tyler ha venduto parecchi immobili durante l'arco dell'anno.

Totale delle vendite nei vari mesi considerando le città

Calcolo il totale delle vendite per ogni mese dello stesso anno e città
Creo il grafico
Codice
library(RColorBrewer)
colori <- brewer.pal(6, "Set3")



sales_somma <- dati %>%
  group_by(month,city) %>%
  summarise(sales = sum(sales))



ggplot(sales_somma, aes(x = month, y = sales, fill = city)) +
  geom_bar(stat = "identity") +
 
  geom_text(aes(label = sales), size=4, vjust = 0.5,  hjust = 0.5,
            position = position_stack(vjust = 0.5),
            color = "black")+
  labs(title = "Vendite Mensili: Panoramica 2010-2014",
       x = "Mesi",
       y = "Sales") +
  scale_x_discrete(limits = c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")) +
  scale_y_continuous(breaks = seq(0,5000,200))+
  
  theme_classic()+
  
  scale_fill_manual(values=colori)+
 
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=9),
    axis.text.y = element_text(size=9),
    
    strip.background = element_blank(),
    
    legend.text = element_text(size = 10),
    legend.key.size = unit(1, "cm"),
    legend.position = "bottom"
  )+
  labs(  fill = toupper(""))

## La città di Wichita Falls è la città ad aver venduto meno immobili e nel corso dei mesi e degli anni e le sue vendite si sono mostrate pressocchè costanti. Le altre città hanno aumentato le vendite dall'inizio della primavera fino al mese di Agosto per poi diminuire agli inizi dell'autunno. Le città che vendono di più nei mesi estivi sono Tyler e Bryan-College Station
Calcolo il totale delle vendite per ogni mese
Calcolo la percentuale di vendite
Creo il grafico
Codice
sales_somma_per_month <- dati %>%
  group_by(month) %>%
  summarise(total_sales = sum(sales))



sales_somma_normalized <- sales_somma %>%
  left_join(sales_somma_per_month, by = "month") %>%
  mutate(sales_normalized = sales / total_sales * 100)



ggplot(sales_somma_normalized, aes(x = month, y = sales_normalized, fill = city)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = round(sales_normalized, 2)), size = 4, vjust = 0.5, hjust = 0.5,
            position = position_stack(vjust = 0.5), color = "black") +
  labs(title = "Vendite Mensili: Panoramica 2010-2014",
       x = "Mesi",
       y = "Vendite (%)") +
  scale_x_discrete(limits = c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")) +
  scale_y_continuous(labels = scales::percent_format(scale = 1), expand = expansion(mult = c(0, 0.05))) +
  theme_classic() +
  scale_fill_manual(values = colori) +
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size = 8),
    axis.text.y = element_text(size = 8),
    
    strip.background = element_blank(),
    
    legend.text = element_text(size = 10),
    legend.key.size = unit(1, "cm"),
    legend.position = "bottom"
  ) +
  labs(fill = toupper(""))

Totale delle vendite nei vari mesi e nei vari anni considerando le città

Calcolo il totale delle vendite per ogni mese e città
Calcolo la percentuale di vendite
Creo il grafico
Codice
sales_somma_per_month_city <- dati %>%
  group_by(month, city) %>%
  summarise(total_sales = sum(sales), .groups = "drop")



dati_somma_perc <- dati %>%
  group_by(year, city, month) %>%
  summarise(sales = sum(sales), .groups = "drop") %>%
  ungroup() %>%
  left_join(sales_somma_per_month_city, by = c("month", "city")) %>%
  mutate(sales_percent = sales / total_sales * 100)



ggplot(dati_somma_perc, aes(x = month, y = sales/total_sales, fill = as.factor(year))
) +
  geom_bar(position="fill", stat = "identity") +
  geom_text(aes(label = round(sales_percent, 2)), position = position_fill(vjust = 0.5), size = 4.5, color = "black")+
  facet_wrap(~city, ncol=1) +
  labs(title = "Percentuale delle Vendite Mensili",
       x = "Mesi",
       y = "Sales %",
       fill = ""
  ) +                        
  scale_x_discrete(limits = c("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
                              "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre")
  ) +
  scale_y_continuous(labels = scales::percent,
                     sec.axis = sec_axis(~. * 100, name = "Sales %", labels = function(x) paste0(x, "%"))) +
  scale_fill_manual(values=colori)+
  theme_classic()+
  theme(
    plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=10),
    axis.text.y = element_text(size=10),
    
    strip.background = element_blank(),
    strip.text = element_text(size = 17),
    
    legend.text = element_text(size = 10),
    legend.key.size = unit(1, "cm"),
    legend.position = "bottom"
  )

Line chart con la variabile sales per fare confronti fra città e periodi storici

Raggruppo le vendite per anno e città con il pacchetto dplyr e creo il grafico
Codice
sales_by_year_city <- dati %>%
 group_by(year, city) %>%
 summarise(sales = sum(sales))



ggplot(sales_by_year_city) +
 geom_line(aes(x=year, y=sales, col=city, group=city), lwd=1) +
 geom_text(aes(x=year, y=sales+70, label = sales), size = 3.8)+
 scale_x_continuous(breaks = seq(2010,2014,1)) +
 scale_y_continuous(breaks = seq(0,4000,200))+
 labs(x="Anni", y="Numero di vendite", color="", title = "Storico annuale delle vendite") +
 scale_fill_manual(values=colori)+
 theme_minimal() +
  theme(
     plot.title = element_text(size = 23, hjust = 0.5),
    axis.title.x = element_text(size = 17, vjust = 0),
    axis.title.y = element_text(size = 17),
    axis.text.x = element_text(size=10),
    axis.text.y = element_text(size=10),
    
    strip.background = element_blank(),
  
    legend.text = element_text(size = 12),
    legend.key.size = unit(1.5, "cm"),
    legend.position = "bottom"
  )

## Possiamo notare che c'è stata un'impennata nelle vendite a Beaumont, Brian College Station e Tyler a partire dal 2011. La città di Tyler ha iniziato ad incrementarle già nel 2010. Wichita Falls nel 2011 ha avuto un lieve aumento delle vendite fino al 2013 per poi avere un sensibile calo.