Dataset

Il dataset contiene le seguenti variabili:
# install.packages("ggplot2")
# install.packages("moments")
# install.packages("dplyr")
dati <- read.csv("datasets/realestate_texas.csv",sep = ",")
attach(dati)
N<-dim(dati)[1] #salvo il numero totale di osservazioni per utilizzarlo in seguito
dim(dati)
## [1] 240   8

1. Analisi delle variabili

Identifica e descrivi il tipo di variabili statistiche presenti nel dataset. Valuta come gestire le variabili che sottintendono una dimensione tempo e commenta sul tipo di analisi che può essere condotta su ciascuna variabile.

str(dati) #mostra la struttura del dataset
## '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 ...
Nel dataset sono presenti 8 variabili:

2. Indici di posizione, variabilità e forma

Calcola Indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo, per le altre crea una distribuzione di frequenza. Infine, commenta tutto brevemente.

Creo una distribuzione di frequenza per la variabile qualitativa city e per le variabili temporali year e month. Successivamente calcolo gli indici di posizione, variabilità e forma sia per le variabili quantitative discrete (sales e listings) che per quelle quantitative continue (volume, median_price, months_inventory).

Variabile qualitativa (city)

  • Distribuzioni di frequenza
  • #distribuzione di frequenza assoluta
    freq_ass_city<-table(city)
    
    #distribuzione di frequenza relativa
    freq_rel_city<-table(city)/N
    
    #distribuzione di frequenza 
    distr_freq_city<-cbind(freq_ass_city,freq_rel_city)
    distr_freq_city
    ##                       freq_ass_city freq_rel_city
    ## Beaumont                         60          0.25
    ## Bryan-College Station            60          0.25
    ## Tyler                            60          0.25
    ## Wichita Falls                    60          0.25

variabili temporali (year, month)

year
  • distribuzioni di frequenza
  • #distribuzione di frequenza assoluta
    freq_ass_year<-table(year)
    
    #distribuzione di frequenza relativa
    freq_rel_year<-table(year)/N
    
    #distribuzione di frequenza 
    distr_freq_year<-cbind(freq_ass_year,freq_rel_year)
    distr_freq_year
    ##      freq_ass_year freq_rel_year
    ## 2010            48           0.2
    ## 2011            48           0.2
    ## 2012            48           0.2
    ## 2013            48           0.2
    ## 2014            48           0.2
  • min e max
  • min(year);max(year)
    ## [1] 2010
    ## [1] 2014
month
  • distribuzioni di frequenza
  • #distribuzione di frequenza assoluta
    freq_ass_month<-table(month)
    
    #distribuzione di frequenza relativa
    freq_rel_month<-table(month)/N
    
    #distribuzione di frequenza 
    distr_freq_month<-cbind(freq_ass_month,freq_rel_month)
    distr_freq_month
    ##    freq_ass_month freq_rel_month
    ## 1              20     0.08333333
    ## 2              20     0.08333333
    ## 3              20     0.08333333
    ## 4              20     0.08333333
    ## 5              20     0.08333333
    ## 6              20     0.08333333
    ## 7              20     0.08333333
    ## 8              20     0.08333333
    ## 9              20     0.08333333
    ## 10             20     0.08333333
    ## 11             20     0.08333333
    ## 12             20     0.08333333

Variabili quantitative discrete (sales, listings)

sales
  • indici di posizione
  • summary(sales)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##    79.0   127.0   175.5   192.3   247.0   423.0
    min(sales);max(sales)
    ## [1] 79
    ## [1] 423
    mean(sales)
    ## [1] 192.2917
    median(sales)
    ## [1] 175.5
    quantile(sales)
    ##    0%   25%   50%   75%  100% 
    ##  79.0 127.0 175.5 247.0 423.0
    boxplot(sales,main="Boxplot di sales")
  • indici di variabilità
#intervallo di variazione
max(sales)-min(sales)
## [1] 344
#differenza interquartile
IQR(sales) #Q3 - Q1
## [1] 120
#varianza
var(sales)
## [1] 6344.3
#deviazione standard
sd(sales)
## [1] 79.65111
#coefficiente di variazione
sd(sales) / mean(sales)
## [1] 0.4142203
  • indici di forma
  • skewness(sales)
    ## [1] 0.718104
    kurtosis(sales)-3
    ## [1] -0.3131764
    # asimmetria
    mu<-mean(sales)
    sigma <- sd(sales)
    m3 <- sum( (sales-mu)^3 ) / length(sales)
    asim.fisher <- m3 / sigma^3
    asim.fisher
    ## [1] 0.7136206
    # curtosi
    m4 <- sum( (sales-mu)^4 ) / length(sales)
    curtosi <- m4 / sigma^4 -3
    curtosi
    ## [1] -0.33552
    # grafico
    ggplot()+
      geom_density(aes(x=sales),
                   col="lightblue",
                   fill="lightblue")+
      xlab("sales")+
        ggtitle("Density plot di sales")

    listings
    • indici di posizione
    • summary(listings)
      ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      ##     743    1026    1618    1738    2056    3296
      min(listings);max(listings)
      ## [1] 743
      ## [1] 3296
      mean(listings)
      ## [1] 1738.021
      median(listings)
      ## [1] 1618.5
      quantile(listings)
      ##     0%    25%    50%    75%   100% 
      ##  743.0 1026.5 1618.5 2056.0 3296.0
      boxplot(listings,main="Boxplot di listings")
    • indici di variabilità
    • #intervallo di variazione
      max(listings)-min(listings)
      ## [1] 2553
      range(listings)
      ## [1]  743 3296
      #differenza interquartile
      IQR(listings)
      ## [1] 1029.5
      #varianza 
      var(listings)
      ## [1] 566569
      #deviazione standard
      sd(listings)
      ## [1] 752.7078
      #coefficiente di variazione
      sd(listings) / mean(listings)
      ## [1] 0.4330833
    • indici di forma
    • skewness(listings)
      ## [1] 0.6494982
      kurtosis(listings)-3
      ## [1] -0.79179
      # asimmetria
      mu<-mean(listings)
      sigma <- sd(listings)
      m3 <- sum( (listings-mu)^3 ) / length(listings)
      asim.fisher <- m3 / sigma^3
      asim.fisher
      ## [1] 0.6454431
      # curtosi
      m4 <- sum( (listings-mu)^4 ) / length(listings)
      curtosi <- m4 / sigma^4 -3
      curtosi
      ## [1] -0.8101534
      # grafico
      ggplot()+
        geom_density(aes(x=listings),
                       col="lightblue",
                       fill="lightblue")+
        xlab("listings")+
        ggtitle("Density plot di listings")

    variabili quantitative continue (volume, median_price, months_inventory)

    volume
    • indici di posizione
    • summary(volume)
      ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      ##   8.166  17.660  27.062  31.005  40.893  83.547
      min(volume);max(volume)
      ## [1] 8.166
      ## [1] 83.547
      mean(volume)
      ## [1] 31.00519
      median(volume)
      ## [1] 27.0625
      quantile(volume)
      ##      0%     25%     50%     75%    100% 
      ##  8.1660 17.6595 27.0625 40.8930 83.5470
      boxplot(volume,main="Boxplot di volume")
    • indici di variabilità
    • #intervallo di variazione
      max(volume)-min(volume)
      ## [1] 75.381
      range(volume)
      ## [1]  8.166 83.547
      #differenza interquartile
      IQR(volume) #terzo q - primo q
      ## [1] 23.2335
      #varianza 
      var(volume)
      ## [1] 277.2707
      #deviazione standard
      sd(volume)
      ## [1] 16.65145
      #coefficiente di variazione
      sd(volume)/mean(volume)
      ## [1] 0.5370536
    • indici di forma
    • skewness(volume)
      ## [1] 0.884742
      kurtosis(volume)-3
      ## [1] 0.176987
      # asimmetria
      mu<-mean(volume)
      sigma <- sd(volume)
      m3 <- sum( (volume-mu)^3 ) / length(volume)
      asim.fisher <- m3 / sigma^3
      asim.fisher
      ## [1] 0.8792182
      # curtosi
      m4 <- sum( (volume-mu)^4 ) / length(volume)
      curtosi <- m4 / sigma^4 -3
      curtosi
      ## [1] 0.1505673
      # grafico
      ggplot()+
        geom_density(aes(x=volume),
                     col="lightblue",
                     fill="lightblue")+
        labs(x="volume")+
          ggtitle("Density plot di volume")
    median price
    • indici di posizione
    • summary(median_price)
      ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      ##   73800  117300  134500  132665  150050  180000
      min(median_price);max(median_price)
      ## [1] 73800
      ## [1] 180000
      mean(median_price)
      ## [1] 132665.4
      median(median_price)
      ## [1] 134500
      quantile(median_price)
      ##     0%    25%    50%    75%   100% 
      ##  73800 117300 134500 150050 180000
      boxplot(median_price,main="Boxplot di median_price")
    • indici di variabilità
    • #intervallo di variazione
      max(median_price)-min(median_price)
      ## [1] 106200
      range(median_price)
      ## [1]  73800 180000
      #differenza interquartile
      IQR(median_price)
      ## [1] 32750
      #varianza 
      var(median_price)
      ## [1] 513572983
      #deviazione standard
      sd(median_price)
      ## [1] 22662.15
      #coefficiente di variazione
      sd(median_price) / mean(median_price)
      ## [1] 0.1708218
    • indici di forma
    • skewness(median_price)
      ## [1] -0.3645529
      kurtosis(median_price)-3
      ## [1] -0.6229618
      # asimmetria
      mu<-mean(median_price)
      sigma <- sd(median_price)
      m3 <- sum( (median_price-mu)^3 ) / length(median_price)
      asim.fisher <- m3 / sigma^3
      asim.fisher
      ## [1] -0.3622768
      # curtosi
      m4 <- sum( (median_price-mu)^4 ) / length(median_price)
      curtosi <- m4 / sigma^4 -3
      curtosi
      ## [1] -0.6427292
      # grafico
      ggplot()+
        geom_density(aes(x=median_price),
                       col="lightblue",
                       fill="lightblue")+
        xlab("median_price")+
        ggtitle("Density plot di median_price")
    months_inventory
    • indici di posizione
    • summary(months_inventory)
      ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      ##   3.400   7.800   8.950   9.193  10.950  14.900
      min(months_inventory);max(months_inventory)
      ## [1] 3.4
      ## [1] 14.9
      mean(months_inventory)
      ## [1] 9.1925
      median(months_inventory)
      ## [1] 8.95
      quantile(months_inventory)
      ##    0%   25%   50%   75%  100% 
      ##  3.40  7.80  8.95 10.95 14.90
      boxplot(months_inventory,main="Boxplot di months_inventory")
    • indici di variabilità
    • #intervallo di variazione
      max(months_inventory)-min(months_inventory)
      ## [1] 11.5
      range(months_inventory)
      ## [1]  3.4 14.9
      #differenza interquartile
      IQR(months_inventory)
      ## [1] 3.15
      #varianza 
      var(months_inventory)
      ## [1] 5.306889
      #deviazione standard
      sd(months_inventory)
      ## [1] 2.303669
      #coefficiente di variazione
      sd(months_inventory) / mean(months_inventory)
      ## [1] 0.2506031
    • indici di forma
    • skewness(months_inventory)
      ## [1] 0.04097527
      kurtosis(months_inventory)-3
      ## [1] -0.1744475
      # asimmetria
      mu<-mean(months_inventory)
      sigma <- sd(months_inventory)
      m3 <- sum( (months_inventory-mu)^3 ) / length(months_inventory)
      asim.fisher <- m3 / sigma^3
      asim.fisher
      ## [1] 0.04071944
      # curtosi
      m4 <- sum( (months_inventory-mu)^4 ) / length(months_inventory)
      curtosi <- m4 / sigma^4 -3
      curtosi
      ## [1] -0.1979448
      # grafico
      ggplot()+
        geom_density(aes(x=months_inventory),
                     col="lightblue",
                     fill="lightblue")+
        labs(x="months_inventory")+
          ggtitle("Density plot di months_inventory")

    Per la variabile qualitativa city ho calcolato la distribuzione di frequenza.
    Per le variabili quantitative discrete e per quelle continue (sales, listings, volume, median_price, months_inventory) ho calcolato:
    • Indici di posizione: Utilizzando la funzione summary per avere una visione generale. Successivaemente li ricalcolo singolarmente per utilizzare le funzioni dedicate di R. Dopo aver calcolato i valori e verificato che corrispondano a quelli espressi dalla funzione summary li visualizzo attraverso un boxplot, grafico che permette di visualizzare tutti i quantili della variabile. Gli estremi del rettangolo sono il primo e il terzo quartile, la riga nel mezzo è la mediana.
    • Indici di variabilità:
      • intervallo di variazione, cioè la differenza tra il valore massimo e il valore minimo registrati.
      • differenza interquartile, cioè la differenza tra il terzo e il primo quartile, è utile perchè non risente della presenza di outliers.
      • varianza, che indica quanto i valori registrati si discostano dalla media.
      • deviazione standard, ovvero la radice quadrata della varianza, è un indice di variabilità espresso nella stessa unità di misura della variabile considerata.
      • coefficiente di variazione, che rappresenta il rapporto tra la deviazione standard e la media, utile per confrontare la variabilità tra variabili con unità di misura diverse.
    • Indici di forma: Calcolo della simmetria e della curtosi della distribuzione della variabile. Prima calcolo i due indici utilizzando le funzioni fornite dalla libreria moments e successivamente li ricavo utilizzando le formule.
    Considerazioni statistiche:
    • Le variabili city, year e month presentano una distribuzione di frequenza uniforme, e dunque non si individua nessuna moda.
    • La variabile sales mostra una distribuzione asimmetrica positiva e platicurtica (k=-0,3). La variabilità è elevata, con un coefficiente di variazione di 0,41 che indica una dispersione significativa dei dati durante i diversi periodi.
    • La variabile listings presenta una distribuzione asimmetrica positiva. Il coefficiente di variazione è di 0,43. Questo indica che il numero di annunci attivi varia considerevolmente.
    • La variabile volume mostra una distribuzione asimmetrica positiva e leggermente leptocurtica (k=0,1). La variabilità è elevata, con un coefficiente di variazione di 0,53.
    • La variabile median_price presenta una distribuzione leggermente asimmetrica negativa e platicurtica (k=-0,6). La variabilità è moderata, con un coefficiente di variazione di 0,17.
    • La variabile months_inventory mostra una distribuzione abbastanza simmetrica e normocurtica (k=-0,1), come si vede anche dal grafico. La variabilità è moderata, con un coefficiente di variazione di 0,25.

    3. Identificazione delle variabili con maggiore variabilità e asimmetria

    Determina: - Qual è la variabile con la più alta variabilità - Qual è la variabile con la distribuzione più asimmetrica Spiega come sei giunto a queste conclusioni e fornisci considerazioni statistiche.

    Variabilità

    Per determinare quale variabile presenta la maggiore variabilità bisogna confrontare i coefficienti di variazione. Dunque, di seguito, creo una tabella per raggrupparli e facilitare il confronto.
    Da questo confronto si osserva che la variabile con coefficiente di variazione più alto è volume. Questo indica che i suoi valori sono più dispersi rispetto alla media e che le vendite totali variano considerevolmente in base al periodo o alla città di riferimento.

    cv<-data.frame()
    cv <- rbind(cv,c("sales",sd(sales) / mean(sales)))
    cv <- rbind(cv,c("listings",sd(listings) / mean(listings)))
    cv <- rbind(cv,c("volume",sd(volume) / mean(volume)))
    cv <- rbind(cv,c("median_price",sd(median_price) / mean(median_price)))
    cv <- rbind(cv,c("months_inventory",sd(months_inventory) / mean(months_inventory)))
    colnames(cv) <- c("variabile", "coefficiente di variazione")
    cv
    ##          variabile coefficiente di variazione
    ## 1            sales          0.414220296482492
    ## 2         listings          0.433083275909432
    ## 3           volume          0.537053586805415
    ## 4     median_price          0.170821825732064
    ## 5 months_inventory          0.250603059264982

    Asimmetria

    Per individuare la variabile con maggiore asimmetria, eseguo lo stsesso procedimento.
    Dalla tabella risulta che la variabile con maggiore asimmetria è volume, questo indica la presenza di valori estremi che allungano la coda destra della distribuzione.

    asimmetria <-data.frame()
    asimmetria <- rbind(asimmetria,c("sales",skewness(sales)))
    asimmetria <- rbind(asimmetria,c("listings",skewness(listings)))
    asimmetria <- rbind(asimmetria,c("volume",skewness(volume)))
    asimmetria <- rbind(asimmetria,c("median_price",skewness(median_price)))
    asimmetria <- rbind(asimmetria,c("months_inventory",skewness(months_inventory)))
    colnames(asimmetria) <- c("variabile", "asimmetria")
    asimmetria
    ##          variabile         asimmetria
    ## 1            sales  0.718104024884959
    ## 2         listings  0.649498226273971
    ## 3           volume  0.884742026325995
    ## 4     median_price -0.364552878177372
    ## 5 months_inventory  0.040975265871081

    Il fatto che volume presenti sia la maggiore variabilità sia la maggiore asimmetria suggerisce che in alcuni periodi o città si registrano vendite eccezionalmente elevate.

    4. Creazione di classi per una variabile quantitativa

    Seleziona una variabile quantitativa (es. sales o median_price) e suddividila in classi. Crea una distribuzione di frequenze e rappresenta i dati con un grafico a barre. Calcola l’indice di eterogeneità Gini e discuti i risultati.

    Suddivisione in classi

    Scelgo la variabile sales e creo classi di ampiezza 50.

    #min e max
    min(sales);max(sales)
    ## [1] 79
    ## [1] 423
    #suddivisione in classi
    sales_classi<-cut(sales,
                      breaks = seq(50,max(sales)+50,by=50),
                      right = FALSE)
    
    #distribuzione di frequenze
    ni<-table(sales_classi)
    fi<-table(sales_classi)/N
    Ni<-cumsum(ni)
    Fi<-Ni/N
    
    distr_freq_sales_cl<-as.data.frame(cbind(ni,fi,Ni,Fi))
    distr_freq_sales_cl
    ##           ni         fi  Ni         Fi
    ## [50,100)  20 0.08333333  20 0.08333333
    ## [100,150) 69 0.28750000  89 0.37083333
    ## [150,200) 58 0.24166667 147 0.61250000
    ## [200,250) 33 0.13750000 180 0.75000000
    ## [250,300) 34 0.14166667 214 0.89166667
    ## [300,350) 14 0.05833333 228 0.95000000
    ## [350,400)  9 0.03750000 237 0.98750000
    ## [400,450)  3 0.01250000 240 1.00000000
    #distribuzione di frequenza doppia
    table(city,sales_classi)
    ##                        sales_classi
    ## city                    [50,100) [100,150) [150,200) [200,250) [250,300)
    ##   Beaumont                     1        13        29        13         4
    ##   Bryan-College Station        2        17        17         6        10
    ##   Tyler                        0         1         7        14        20
    ##   Wichita Falls               17        38         5         0         0
    ##                        sales_classi
    ## city                    [300,350) [350,400) [400,450)
    ##   Beaumont                      0         0         0
    ##   Bryan-College Station         3         3         2
    ##   Tyler                        11         6         1
    ##   Wichita Falls                 0         0         0

    La maggior parte delle osservazioni si concentra nelle classi [100,150) e [150,200), indicando che i valori di sales sono prevalentemente distribuiti in questo intervallo.

    Grafico a barre

    max_y <- max(distr_freq_sales_cl$ni) + 20
    
    bp<-barplot(distr_freq_sales_cl$ni,
            main = "Distribuzione classi di sales",
            xlab = "",
            ylab = "Frequenze assolute",
            ylim=c(0,max_y),
            col="darkgreen",
            names.arg = (rownames(distr_freq_sales_cl)),
            cex.names = 0.7
    )
    title(xlab = "Classi di sales", line = 4)
    text(bp, distr_freq_sales_cl$ni, labels = paste(round(distr_freq_sales_cl$fi*100,1),"%"), pos = 3, font = 2, col = "black")

    Indice di eterogeneità di Gini

    G in [0,1], con 0 eterogeneità nulla e 1 massima. L’indice di Gini è circa 0.9 dunque indica un’alta eterogeneità della variabile sales.

    gini.index <- function(x){
      ni = table(x)
      fi = ni/length(x)
      fi2 = fi^2
      J = length(table(x))
      
      gini = 1-sum(fi2)
      gini.norm = gini/((J-1)/J)
      
      return(gini.norm)
    }
    
    gini.index(sales_classi)
    ## [1] 0.9234921

    5. Calcolo della probabilità

    Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”? E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?

    P(city==‘Beaumont’)

    La probabilità che presa una riga a caso dal dataset questa riporti la città “Beaumont” è uguale al numero di casi favorevoli (city=“Beaumont”) diviso il numero totale di osservazioni, ovvero:
    P(city==‘Beaumont’) = distribuzione di frequenza assoluta/N

    v=nrow(subset(dati,city=="Beaumont"))
    p1=v/N
    sprintf("P(city=='Beaumont') = %.0f / %.0f = %.4f",v,N,p1)
    ## [1] "P(city=='Beaumont') = 60 / 240 = 0.2500"

    P(month==‘Luglio’)

    Seguo lo stesso procedimento.

    v=nrow(subset(dati,month==7))
    p2=v/N
    sprintf("P(month=='Luglio') = %.0f / %.0f = %.4f",v,N,p2)
    ## [1] "P(month=='Luglio') = 20 / 240 = 0.0833"

    P(month==‘Dicembre’& year==2012)

    v=nrow(subset(dati,month==12&year==2012))
    p3=v/N
    sprintf("P(month=='Dicembre'& year==2012) = %.0f / %.0f = %.4f",v,N,p3)
    ## [1] "P(month=='Dicembre'& year==2012) = 4 / 240 = 0.0167"

    6. Creazione di nuove variabili

    Crea una nuova colonna che calcoli il prezzo medio degli immobili utilizzando le variabili disponibili. Prova a creare una colonna che misuri l’efficacia degli annunci di vendita. Commenta e discuti i risultati.

    Prezzo medio

    il prezzo medio si ottiene calcolando le vendite totali (volume) (in milioni di dollari) diviso il numero di vendite (sales) e moltiplicando per 1.000.000 per ottenere il prezzo in dollari. Questa variabile fornisce una stima del prezzo medio per immobile, ma può essere influenzata da valori estremi.

    avg_price=c((volume/sales)*1000000)
    dati$avg_price<-avg_price

    Efficacia degli annunci di vendita

    si può calcolare dividendo le vendite totali (sales) per il numero totale di annunci attivi (listings). Valori più elevati indicano maggiore efficacia degli annunci.

    efficacia_annunci=c(sales/listings)
    dati$efficacia_annunci<-efficacia_annunci

    Ecco il dataset con le nuove colonne

    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
    ##   avg_price efficacia_annunci
    ## 1  170626.5        0.05414220
    ## 2  163796.3        0.06809584
    ## 3  157697.8        0.10775607
    ## 4  134095.0        0.11709602
    ## 5  142737.6        0.11405985
    ## 6  144015.9        0.10482529

    7. Analisi condizionata

    Usa il pacchetto dplyr o il linguaggio base di R per effettuare analisi statistiche condizionate per città, anno e mese. Genera dei summary (media, deviazione standard) e rappresenta graficamente i risultati.

    Città

    city_summary <-
      dati %>%
      group_by(city) %>%
      summarise(
        media_sales = mean(sales), devst_sales = sd(sales), #media e sd del numero di vendite per città
        media_volume = mean(volume), devst_volume = sd(volume), #media e sd del prezzo totale di vendite per città
        media_avg_price = mean(avg_price), devst_avg_price = sd(avg_price), #media e sd del prezzo medio di un immobile
        media_eff_ann = mean(efficacia_annunci), devst_eff_ann = sd(efficacia_annunci) #media e sd dell'efficacia degli annunci per città
      )
    city_summary%>%print(width=Inf)
    ## # A tibble: 4 × 9
    ##   city                  media_sales devst_sales media_volume devst_volume
    ##   <chr>                       <dbl>       <dbl>        <dbl>        <dbl>
    ## 1 Beaumont                     177.        41.5         26.1         6.97
    ## 2 Bryan-College Station        206.        85.0         38.2        17.2 
    ## 3 Tyler                        270.        62.0         45.8        13.1 
    ## 4 Wichita Falls                116.        22.2         13.9         3.24
    ##   media_avg_price devst_avg_price media_eff_ann devst_eff_ann
    ##             <dbl>           <dbl>         <dbl>         <dbl>
    ## 1         146640.          11232.        0.106         0.0267
    ## 2         183534.          15149.        0.147         0.0729
    ## 3         167677.          12351.        0.0935        0.0235
    ## 4         119430.          11398.        0.128         0.0247
    # Vendite medie per città
    ggplot(city_summary) +
      geom_col(aes(x=city, y=media_sales), fill="cadetblue1") +
      geom_errorbar(aes(x=city,
                        ymin=media_sales - devst_sales,
                        ymax=media_sales + devst_sales), col="black") +
      labs(x="Città", y="Vendite medie", title="Vendite medie per città")

    # Volume di vendite per città
    ggplot(city_summary) +
      geom_col(aes(x=city, y=media_volume), fill="cadetblue2") +
      geom_errorbar(aes(x=city,
                        ymin=media_volume - devst_volume,
                        ymax=media_volume + devst_volume), col="black") +
      labs(x="Città", y="Volume di vendite medie", title="Volume di vendite medie per città")

    # Prezzo medio per città
    ggplot(city_summary) +
      geom_col(aes(x=city, y=media_avg_price), fill="cadetblue3") +
      geom_errorbar(aes(x=city,
                        ymin=media_avg_price - devst_avg_price,
                        ymax=media_avg_price + devst_avg_price), col="black") +
      labs(x="Città", y="Prezzo medio ($)", title="Prezzo medio per città")

    # Efficacia degli annunci per città
    ggplot(city_summary) +
      geom_col(aes(x=city, y=media_eff_ann), fill="cadetblue4") +
      geom_errorbar(aes(x=city,
                        ymin=media_eff_ann - devst_eff_ann,
                        ymax=media_eff_ann + devst_eff_ann), col="black") +
      labs(x="Città", y="Efficacia media degli annunci", title="Efficacia media degli annunci per città")

    L’analisi per città mostra differenze significative sia nel prezzo medio che nelle vendite. Alcune città presentano valori medi più elevati. La deviazione standard indica il grado di variabilità all’interno di ciascuna città: valori più alti segnalano una maggiore eterogeneità.

    Anno

    year_summary <- 
      dati %>% 
      group_by(year) %>% 
      summarise(
        media_sales=mean(sales),devst_sales=sd(sales),
        media_volume=mean(volume),devst_volume=sd(volume),
        media_avg_price=mean(avg_price), devst_avg_price=sd(avg_price),
        media_eff_ann=mean(efficacia_annunci), devst_eff_ann=sd(efficacia_annunci)
      )
    year_summary%>%print(width=Inf)
    ## # A tibble: 5 × 9
    ##    year media_sales devst_sales media_volume devst_volume media_avg_price
    ##   <int>       <dbl>       <dbl>        <dbl>        <dbl>           <dbl>
    ## 1  2010        169.        60.5         25.7         10.8         150189.
    ## 2  2011        164.        63.9         25.2         12.2         148251.
    ## 3  2012        186.        70.9         29.3         14.5         150899.
    ## 4  2013        212.        84.0         35.2         17.9         158705.
    ## 5  2014        231.        95.5         39.8         21.2         163559.
    ##   devst_avg_price media_eff_ann devst_eff_ann
    ##             <dbl>         <dbl>         <dbl>
    ## 1          23280.        0.0997        0.0337
    ## 2          24938.        0.0927        0.0232
    ## 3          26438.        0.110         0.0281
    ## 4          26524.        0.135         0.0448
    ## 5          31741.        0.157         0.0618
    # Vendite medie per anno
    ggplot(year_summary) + 
      geom_col(aes(x=year, y=media_sales), fill="darkseagreen1") +
      geom_errorbar(aes(x=year,
                        ymin=media_sales - devst_sales,
                        ymax=media_sales + devst_sales), col="black") +
      labs(x="Anno", y="Vendite medie", title="Vendite medie per anno")

    # Volume di vendite per anno
    ggplot(year_summary) + 
      geom_col(aes(x=year, y=media_volume), fill="darkseagreen2") +
      geom_errorbar(aes(x=year,
                        ymin=media_volume - devst_volume,
                        ymax=media_volume + devst_volume), col="black") +
      labs(x="Anno", y="Volume di vendite medie", title="Volume di vendite medie per anno")

    # Prezzo medio per anno
    ggplot(year_summary) + 
      geom_col(aes(x=year, y=media_avg_price), fill="darkseagreen3") +
      geom_errorbar(aes(x=year,
                        ymin=media_avg_price - devst_avg_price,
                        ymax=media_avg_price + devst_avg_price), col="black") +
      labs(x="Anno", y="Prezzo medio ($)", title="Prezzo medio per anno")

    # Efficacia degli annunci per anno
    ggplot(year_summary) + 
      geom_col(aes(x=year, y=media_eff_ann), fill="darkseagreen4") +
      geom_errorbar(aes(x=year,
                        ymin=media_eff_ann - devst_eff_ann,
                        ymax=media_eff_ann + devst_eff_ann), col="black") +
      labs(x="Anno", y="Efficacia media degli annunci", title="Efficacia media degli annunci per anno")

    L’analisi per anno consente di osservare eventuali trend temporali. Si osserva una leggera crescita del prezzo medio e delle vendite nel corso degli anni.

    Mese

    month_summary <- 
      dati %>% 
      group_by(month) %>% 
      summarise(
        media_sales=mean(sales),       devst_sales=sd(sales),
        media_volume=mean(volume),     devst_volume=sd(volume),
        media_avg_price=mean(avg_price), devst_avg_price=sd(avg_price),
        media_eff_ann=mean(efficacia_annunci), devst_eff_ann=sd(efficacia_annunci)
      )
    month_summary%>%print(width=Inf)
    ## # A tibble: 12 × 9
    ##    month media_sales devst_sales media_volume devst_volume media_avg_price
    ##    <int>       <dbl>       <dbl>        <dbl>        <dbl>           <dbl>
    ##  1     1        127.        43.4         19.0         8.37         145640.
    ##  2     2        141.        51.1         21.7        10.1          148840.
    ##  3     3        189.        59.2         29.4        12.0          151137.
    ##  4     4        212.        65.4         33.3        14.5          151461.
    ##  5     5        239.        83.1         39.7        19.0          158235.
    ##  6     6        244.        95.0         41.3        21.1          161546.
    ##  7     7        236.        96.3         39.1        21.4          156881.
    ##  8     8        231.        79.2         38.0        18.0          156456.
    ##  9     9        182.        72.5         29.6        15.2          156522.
    ## 10    10        180.        75.0         29.1        15.1          155897.
    ## 11    11        157.        55.5         24.8        11.2          154233.
    ## 12    12        169.        60.7         27.1        12.6          154996.
    ##    devst_avg_price media_eff_ann devst_eff_ann
    ##              <dbl>         <dbl>         <dbl>
    ##  1          29819.        0.0831        0.0230
    ##  2          25120.        0.0878        0.0219
    ##  3          23238.        0.116         0.0346
    ##  4          26174.        0.125         0.0380
    ##  5          25787.        0.141         0.0503
    ##  6          23470.        0.142         0.0576
    ##  7          27220.        0.143         0.0740
    ##  8          28253.        0.142         0.0526
    ##  9          29669.        0.112         0.0348
    ## 10          32527.        0.112         0.0360
    ## 11          29685.        0.102         0.0293
    ## 12          27009.        0.117         0.0379
    # Vendite medie per mese
    ggplot(month_summary)+
      geom_col(aes(x=factor(month), y=media_sales), fill="plum1") +
      geom_errorbar(aes(x=factor(month),
                        ymin=media_sales - devst_sales,
                        ymax=media_sales + devst_sales), col="black") +
      labs(x="Mese", y="Vendite medie", title="Vendite medie per mese")

    # Volume di vendite per mese
    ggplot(month_summary)+
      geom_col(aes(x=factor(month), y=media_volume), fill="plum2") +
      geom_errorbar(aes(x=factor(month),
                        ymin=media_volume - devst_volume,
                        ymax=media_volume + devst_volume), col="black") +
      labs(x="Mese", y="Volume di vendite medie", title="Volume di vendite medie per mese")

    # Prezzo medio per mese
    ggplot(month_summary)+
      geom_col(aes(x=factor(month), y=media_avg_price), fill="plum3") +
      geom_errorbar(aes(x=factor(month),
                        ymin=media_avg_price - devst_avg_price,
                        ymax=media_avg_price + devst_avg_price), col="black") +
      labs(x="Mese", y="Prezzo medio ($)", title="Prezzo medio per mese")

    # Efficacia degli annunci per mese
    ggplot(month_summary)+
      geom_col(aes(x=factor(month), y=media_eff_ann), fill="plum4") +
      geom_errorbar(aes(x=factor(month),
                        ymin=media_eff_ann - devst_eff_ann,
                        ymax=media_eff_ann + devst_eff_ann), col="black") +
      labs(x="Mese", y="Efficacia media degli annunci", title="Efficacia media degli annunci per mese")

    L’analisi mensile permette di individuare possibili effetti stagionali. Si osserva che il prezzo medio è più elevato nel mese di giugno, mentre la variabilità più elevata è nel mese di ottobre. Le vendite mostrano un andamento stagionale con un picco nei mesi estivi.

    8. Creazione di visualizzazioni con ggplot2

    Utilizza ggplot2 per creare grafici personalizzati. Assicurati di esplorare: - Boxplot per confrontare la distribuzione del prezzo mediano tra le città. - Grafici a barre per confrontare il totale delle vendite per mese e città. - Line charts per confrontare l’andamento delle vendite in periodi storici differenti.

    Boxplot per confrontare la distribuzione del prezzo mediano tra le città

    ggplot(dati, aes(x = city, y = median_price)) +
      geom_boxplot(outlier.colour = "red", outlier.shape = 8) +
      labs(x = "Città", y = "Prezzo mediano",
           title = "Distribuzione del prezzo mediano per città") +
      theme(legend.position = "none")

    Grafici a barre per confrontare il totale delle vendite per mese e città

    # Totale vendite per mese
    ggplot(dati, aes(x = factor(month), y = sales)) +
      geom_col(fill = "salmon1") +
      labs(x = "Mese", y = "Totale vendite (sales)",
           title = "Totale delle vendite per mese")

    # Totale vendite per città
    ggplot(dati, aes(x = city, y = sales)) +
      geom_col(fill = "salmon3") +
      labs(x = "Città", y = "Totale vendite (sales)",
           title = "Totale delle vendite per città") 

    # Totale vendite per mese e città
    ggplot(dati, aes(x = factor(month), y = sales, fill = city)) +
      geom_col(position = "dodge") +
      labs(x = "Mese", y = "Totale vendite (sales)", fill = "Città",
           title = "Totale delle vendite per mese e città") 

    Line charts per confrontare l’andamento delle vendite in periodi storici differenti

    # Andamento del volume di vendite raggruppato per città
    ggplot(dati, aes(x = month, y = volume, color = factor(year))) +
      geom_line(linewidth = 0.8, alpha=0.7) +
      geom_point(size = 2, alpha=0.7) +
      facet_wrap(~ city, axes = "all",scales = "free_y") +
      scale_x_continuous(breaks = 1:12) +
      labs(x = "Mese", y = "Vendite (volume)", color = "Anno",
           title = "Andamento del volume di vendite raggruppato per città") 

    # Andamento del volume di vendite raggruppato per anno
    ggplot(dati, aes(x = month, y = volume, color = factor(city))) +
      geom_line(linewidth = 0.8, alpha=0.7) +
      geom_point(size = 2, alpha=0.7) +
      facet_grid(rows =vars(year), scales = "free_y") +
      scale_x_continuous(breaks = 1:12) +
      labs(x = "Mese", y = "Vendite (volume)", color = "Città",
           title = "Andamento del volume di vendite raggruppato per anno") 

    # Andamento dell'efficacia degli annunci raggruppata per città
    ggplot(dati, aes(x = month, y = efficacia_annunci, color = factor(year))) +
      geom_line(linewidth = 0.8, alpha=0.7) +
      geom_point(size = 2, alpha=0.7) +
      facet_wrap(~ city, axes = "all",scales = "free_y") +
      scale_x_continuous(breaks = 1:12) +
      labs(x = "Mese", y = "Efficacia degli annunci", color = "Anno",
           title = "Andamento dell'efficacia degli annunci raggruppata per città") 

    # Andamento dell'efficacia degli annunci raggruppata per anno
    ggplot(dati, aes(x = month, y = efficacia_annunci, color = factor(city))) +
      geom_line(linewidth = 0.8, alpha=0.7) +
      geom_point(size = 2, alpha=0.7) +
      facet_grid(rows =vars(year), scales = "free_y") +
      scale_x_continuous(breaks = 1:12) +
      labs(x = "Mese", y = "Efficacia degli annunci", color = "Città",
           title = "Andamento dell'efficacia degli annunci raggruppata per anno") 

    9. Conclusioni

    Fornisci una sintesi dei risultati ottenuti, facendo riferimento alle principali tendenze emerse e fornendo raccomandazioni basate sull’analisi. Questo non è un progetto di programmazione, ma di statistica, e ci si aspetta di leggere commenti e considerazioni statistiche per i vari passaggi e risultati.

    Dai punti 2 e 3 emerge che la variabile con maggiore variabilità e asimmetria è volume, questo indica che le vendite non sono distribuite in modo uniforme, ma presentano variazioni significative per diverse città o per diversi periodi temporali. Questo può essere approfondito tramite le analisi condizionate fatte nel punto 7 e le visualizzazioni grafiche create nel punto 8.
    In particolare, dal grafico “Totale delle vendite per città”, creato nel punto 8, si osserva che nella città “Tyler” si registrano volumi di vendite più elevati. Come evidenziato anche dalle analisi per città, è dovuto principalmente al numero maggiore di vendite (sales) rispetto alle altre città, sebbene il prezzo medio per immobile (avg_price) non sia il più alto.

    Osservando ulteriormente i grafici e i summary creati nel punto 7 si possono fare altre considerazioni.
    Dall’analisi per anno si osserva una leggera crescita del prezzo medio e del numero di vendite nel corso degli anni. Tuttavia, l’anno 2010 presenta valori medi di tutte le variabili più elevati rispetto all’anno successivo. Questo andamento, apparentemente anomalo, è spiegabile osservando i dati in modo più disaggregato. Infatti, dal grafico “Andamento del volume di vendite raggruppato per città”, creato nel punto 8, si osserva che nella città di “Wichita Falls” sono stati registrati dei picchi nel volume di vendite nei mesi di marzo, aprile, maggio e giugno del 2010. Questo può spiegare i valori più alti della media di sales e avg_price e volume registrati nel 2010 che sono stati evidenziati in precedenza. La variabilità, invece, segue un andamento sempre crescente.

    Dall’analisi mensile si osserva che il prezzo medio è rimasto stabile durante tutto l’anno, con un lieve aumento nel mese di giugno e una maggiore variabilità nel mese di ottobre. Il numero medio di vendite segue invece un andamento crescente raggiungendo il massimo nel mese di giugno per poi decrescere nei mesi successivi, fino a raggiungere il minimo nel mese di novembre. Il volume di vendite mostra un andamento analogo a quello delle vendite, con lo stesso picco nei mesi estivi.
    Questo andamento potrebbe suggerire la presenza di un possibile effetto stagionale, con un’intensificazione delle vendite nel periodo estivo e un massimo nel mese di giugno. Tuttavia, osservando i coefficienti di variazione si nota che i mesi di maggio, giugno e luglio sono caratterizzati da una maggiore variabilità, sia per il numero di vendite che per il volume.
    Dunque, per approfondire la presenza di un possibile effetto stagionale per tutte le città è necessario considerare i dati disaggregando per città. I grafici al punto 8, in particolare il grafico “Totale delle vendite per mese e città” mostra che il picco osservato nei mesi estivi è influenzato in modo significativo dalla città “Tyler”, che registra un maggior numero di vendite nel mese di giugno. Al contrario, le altre città, mostrano massimi distribuiti in mesi diversi.
    Pertanto, l’apparente stagionalità osservata a livello aggregato non riflette la realtà di tutte le città. L’andamento mensile è fortemente influenzato dalla città per cui sono state registrate più vendite.

    Dai line charts creati nel punto 8 emerge che per tutte le città il volume di vendite è più elevato per gli anni 2013 e 2014, questo è coerente con l’andamento crescente osservato nel punto 7 e con le osservazioni fatte per l’anno 2010.
    Osservando l’andamento del volume di vendite nelle diverse città, si osservano andamenti coerenti durante tutti gli anni presi in considerazione, le città di “Bryan-College Station” e “Tyler” sono quelle per cui sono stati registrati volumi di vendite maggiori, questo si può riscontrare nei risultati ottenuti dall’analisi per città.

    Analizziamo anche l’efficacia degli annunci di vendita.
    Dall’analisi per città si osserva che la città di “Bryan-College Station” presenta un’efficacia media degli annunci più elevata rispetto alle altre città, ma anche la variabilità maggiore. Osservando i grafici creati nel punto 8, si nota che questa efficacia è influenzata principalmente dal mese di luglio del 2013 e del 2014, per i quali sono stati registrati dei picchi, questo indica la presenza di eventi specifici che hanno aumentato temporaneamente l’efficacia degli annunci in quei periodi.
    Dall’analisi per anno si osserva che l’efficacia media degli annunci è più elevata nel 2013 e 2014, questo si riscontra anche nei line charts creati nel punto 8 che mostrano, per tutte le città, un’efficacia degli annunci maggiore in questi due anni. Fanno eccezione valori particolarmente elevati registrati nella città di “Wichita Falls” durante i mesi di marzo, aprile e maggio del 2010, probabilmente dovuti alla presenza di eventi particolari.