Punto 1: Analisi delle variabili

setwd("C:/Users/Marce/OneDrive/Desktop/Cartella_R/Statistica Descrittiva")
dati <- read.csv("realestate_texas.csv", sep=",")
head(dati,5)

Le variabili quantitative continue sono volume, median_price e months_inventory (essendo con la virgola), mentre le quantitative discrete sono sales e listing. I nome della citta è qualitativa su scala nominale. Month è qualitativa nominale, “ciclica” all’interno di anni. Year teoricamente è quantitativa continua, ma in questo caso meglio trattarla da qualitativa ordinale.

Le variabili che indentificano il tempo posso essere relazionate con le atre variabili, come le vendite, i valori mediani, ecc. in modo tale da poter generare gli andamenti nel corso del tempo e di conseguenza fornire degli insight. Possono essere compinate anche con la variabile citta in grafci a barre sovrapposte, in modo tale da avere una rappresentazione grafica semplice e efficace.

Avendo già parlato delle variabili temporali e di come esse sono relazionabili alle altre variabili; per le variabile vendite (sales) e volume si può ricavare l’andamento temporale delle numero di vendite e del volume in milioni di dollari riferito per città–> possibili analisi includono calcolo degli indici di posizione e varibilità, nonchè visualizzare la distribuzione con un grafico per vedere se segue una distribuzione normale o asimmetrica.

Dall’analisi del volume e del totale valore di vendità, si può vedere si discosta rispetto al valore mediano e fare confronti tra i prezzi mediani delle avrie città in diversi momenti temporali (mesi o anni). Per listing discorso simile a volume e sales. months_inventory fornisce informazisce su come varia il mercato nel tempo e quindi confronti con città e le altre varibili sono possibili, oltre che le distribuzioni.

Punto 2: Indici di posizione, variabilità e forma


install.packages("moments")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installazione pacchetto in ‘C:/Users/Marce/AppData/Local/R/win-library/4.4’
(perché ‘lib’ non è specificato)
apertura URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/moments_0.14.1.zip'
Content type 'application/zip' length 57241 bytes (55 KB)
downloaded 55 KB
pacchetto ‘moments’ aperto con successo con controllo somme MD5

I pacchetti binari scaricati sono in
    C:\Users\Marce\AppData\Local\Temp\RtmpoZQwKZ\downloaded_packages
library(moments)
attach(dati)

continuos_variable <- c("sales", "volume", "median_price", "listings")

CV<- function(x){
  return(sd(x)/mean(x)*100)
}

for (var_name in continuos_variable) {
  if (var_name %in% names(dati)) {
    cat(paste0("Summary per la variabile: ", var_name, " ---\n"))
    print(summary(dati[[var_name]])) 
    dev_std <- sd(dati[[var_name]], na.rm = TRUE)
    cat(paste0("Deviazione Standard (", var_name, "): ", round(dev_std, 2), "\n"))
    cv_val <- CV(dati[[var_name]])
    cat(paste0("Coefficiente di Variazione: ", round(cv_val, 2), "%\n"))
     iqr_val <- IQR(dati[[var_name]], na.rm = TRUE)
    cat(paste0("Interquartile Range (IQR): ", round(iqr_val, 2), "\n"))
    skew_val <- skewness(dati[[var_name]], na.rm = TRUE)
    cat(paste0("Asimmetria (Skewness): ", round(skew_val, 2), "\n"))
    kurt_val <- kurtosis(dati[[var_name]], na.rm = TRUE) - 3 
    cat(paste0("Curtosi (Kurtosis): ", round(kurt_val, 2), "\n"))

     cat("\n") 
  } else {
    cat(paste0("Attenzione: La variabile '", var_name, "' non esiste nel dataframe.\n\n"))
  }
}
Summary per la variabile: sales ---
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   79.0   127.0   175.5   192.3   247.0   423.0 
Deviazione Standard (sales): 79.65
Coefficiente di Variazione: 41.42%
Interquartile Range (IQR): 120
Asimmetria (Skewness): 0.72
Curtosi (Kurtosis): -0.31

Summary per la variabile: volume ---
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  8.166  17.660  27.062  31.005  40.893  83.547 
Deviazione Standard (volume): 16.65
Coefficiente di Variazione: 53.71%
Interquartile Range (IQR): 23.23
Asimmetria (Skewness): 0.88
Curtosi (Kurtosis): 0.18

Summary per la variabile: median_price ---
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  73800  117300  134500  132665  150050  180000 
Deviazione Standard (median_price): 22662.15
Coefficiente di Variazione: 17.08%
Interquartile Range (IQR): 32750
Asimmetria (Skewness): -0.36
Curtosi (Kurtosis): -0.62

Summary per la variabile: listings ---
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    743    1026    1618    1738    2056    3296 
Deviazione Standard (listings): 752.71
Coefficiente di Variazione: 43.31%
Interquartile Range (IQR): 1029.5
Asimmetria (Skewness): 0.65
Curtosi (Kurtosis): -0.79
N<- dim(dati)[1]

dati$sales_CL <- cut(dati$sales,
                         breaks= c(79,127, 175.5,247,423)) 

table(dati$city, dati$sales_CL)
                       
                        (79,127] (127,176] (176,247] (247,423]
  Beaumont                     8        21        27         4
  Bryan-College Station       12        15        15        18
  Tyler                        0         4        18        38
  Wichita Falls               39        19         0         0
table(dati$city, dati$sales_CL)/N
                       
                          (79,127]  (127,176]  (176,247]  (247,423]
  Beaumont              0.03333333 0.08750000 0.11250000 0.01666667
  Bryan-College Station 0.05000000 0.06250000 0.06250000 0.07500000
  Tyler                 0.00000000 0.01666667 0.07500000 0.15833333
  Wichita Falls         0.16250000 0.07916667 0.00000000 0.00000000
table(dati$year, dati$sales_CL)
      
       (79,127] (127,176] (176,247] (247,423]
  2010       14        14        13         7
  2011       17        13        10         7
  2012       13        13        10        12
  2013        7        11        14        15
  2014        8         8        13        19
table(dati$year, dati$sales_CL)/N
      
         (79,127]  (127,176]  (176,247]  (247,423]
  2010 0.05833333 0.05833333 0.05416667 0.02916667
  2011 0.07083333 0.05416667 0.04166667 0.02916667
  2012 0.05416667 0.05416667 0.04166667 0.05000000
  2013 0.02916667 0.04583333 0.05833333 0.06250000
  2014 0.03333333 0.03333333 0.05416667 0.07916667
table(dati$month, dati$sales_CL)
    
     (79,127] (127,176] (176,247] (247,423]
  1        10         7         2         0
  2        10         3         6         0
  3         3         7         5         5
  4         3         3         7         7
  5         1         5         5         9
  6         3         3         3        11
  7         2         5         5         8
  8         1         6         4         9
  9         6         4         6         4
  10        7         4         5         4
  11        8         6         4         2
  12        5         6         8         1
table(dati$month, dati$sales_CL)/N
    
        (79,127]   (127,176]   (176,247]   (247,423]
  1  0.041666667 0.029166667 0.008333333 0.000000000
  2  0.041666667 0.012500000 0.025000000 0.000000000
  3  0.012500000 0.029166667 0.020833333 0.020833333
  4  0.012500000 0.012500000 0.029166667 0.029166667
  5  0.004166667 0.020833333 0.020833333 0.037500000
  6  0.012500000 0.012500000 0.012500000 0.045833333
  7  0.008333333 0.020833333 0.020833333 0.033333333
  8  0.004166667 0.025000000 0.016666667 0.037500000
  9  0.025000000 0.016666667 0.025000000 0.016666667
  10 0.029166667 0.016666667 0.020833333 0.016666667
  11 0.033333333 0.025000000 0.016666667 0.008333333
  12 0.020833333 0.025000000 0.033333333 0.004166667
table(dati$months_inventory, dati$sales_CL)
      
       (79,127] (127,176] (176,247] (247,423]
  3.4         0         0         1         0
  3.8         0         1         0         0
  4           0         0         2         1
  4.1         0         0         0         1
  4.4         0         0         1         0
  4.5         0         0         0         1
  4.8         0         0         0         1
  4.9         0         1         0         0
  5           0         3         0         2
  5.2         0         0         1         0
  6           0         0         0         1
  6.1         2         0         0         1
  6.3         1         0         0         0
  6.4         2         0         0         0
  6.6         0         1         0         0
  6.7         0         0         0         1
  6.9         0         1         0         1
  7           1         1         1         0
  7.1         3         2         0         0
  7.2         1         1         2         0
  7.3         1         2         0         0
  7.4         0         0         0         2
  7.5         1         3         1         0
  7.6         2         3         1         1
  7.7         0         1         0         0
  7.8         4         0         1         1
  7.9         4         2         1         0
  8           3         1         2         1
  8.1         6         1         0         3
  8.2         1         0         0         0
  8.3         1         2         1         0
  8.4         1         2         0         2
  8.5         1         1         2         0
  8.6         1         1         1         1
  8.7         3         0         2         1
  8.8         4         0         0         0
  8.9         1         2         0         0
  9           2         1         4         0
  9.1         1         1         3         1
  9.2         1         1         0         1
  9.3         1         0         0         2
  9.4         1         2         0         3
  9.5         1         0         1         1
  9.6         1         0         0         0
  9.7         0         1         1         0
  9.9         0         0         1         1
  10          1         0         3         0
  10.1        0         0         0         1
  10.2        0         0         1         2
  10.3        0         0         1         0
  10.4        0         1         0         2
  10.5        0         1         2         0
  10.6        1         1         2         0
  10.7        1         0         0         2
  10.8        0         0         1         2
  10.9        0         0         2         0
  11.1        0         1         1         2
  11.2        0         2         0         0
  11.3        0         2         2         1
  11.4        1         1         2         0
  11.5        0         1         1         0
  11.6        0         3         2         2
  11.7        2         2         1         0
  11.8        0         1         0         0
  11.9        0         0         0         1
  12          0         0         1         3
  12.2        0         0         0         1
  12.3        1         1         0         1
  12.4        0         2         0         1
  12.6        0         1         1         0
  12.7        0         0         1         0
  13          0         0         2         1
  13.3        0         0         0         2
  13.4        0         1         1         0
  13.5        0         0         1         0
  13.8        0         0         2         0
  14          0         0         0         1
  14.5        0         0         0         2
  14.6        0         0         0         1
  14.9        0         0         0         1
table(dati$months_inventory, dati$sales_CL)/N
      
          (79,127]   (127,176]   (176,247]   (247,423]
  3.4  0.000000000 0.000000000 0.004166667 0.000000000
  3.8  0.000000000 0.004166667 0.000000000 0.000000000
  4    0.000000000 0.000000000 0.008333333 0.004166667
  4.1  0.000000000 0.000000000 0.000000000 0.004166667
  4.4  0.000000000 0.000000000 0.004166667 0.000000000
  4.5  0.000000000 0.000000000 0.000000000 0.004166667
  4.8  0.000000000 0.000000000 0.000000000 0.004166667
  4.9  0.000000000 0.004166667 0.000000000 0.000000000
  5    0.000000000 0.012500000 0.000000000 0.008333333
  5.2  0.000000000 0.000000000 0.004166667 0.000000000
  6    0.000000000 0.000000000 0.000000000 0.004166667
  6.1  0.008333333 0.000000000 0.000000000 0.004166667
  6.3  0.004166667 0.000000000 0.000000000 0.000000000
  6.4  0.008333333 0.000000000 0.000000000 0.000000000
  6.6  0.000000000 0.004166667 0.000000000 0.000000000
  6.7  0.000000000 0.000000000 0.000000000 0.004166667
  6.9  0.000000000 0.004166667 0.000000000 0.004166667
  7    0.004166667 0.004166667 0.004166667 0.000000000
  7.1  0.012500000 0.008333333 0.000000000 0.000000000
  7.2  0.004166667 0.004166667 0.008333333 0.000000000
  7.3  0.004166667 0.008333333 0.000000000 0.000000000
  7.4  0.000000000 0.000000000 0.000000000 0.008333333
  7.5  0.004166667 0.012500000 0.004166667 0.000000000
  7.6  0.008333333 0.012500000 0.004166667 0.004166667
  7.7  0.000000000 0.004166667 0.000000000 0.000000000
  7.8  0.016666667 0.000000000 0.004166667 0.004166667
  7.9  0.016666667 0.008333333 0.004166667 0.000000000
  8    0.012500000 0.004166667 0.008333333 0.004166667
  8.1  0.025000000 0.004166667 0.000000000 0.012500000
  8.2  0.004166667 0.000000000 0.000000000 0.000000000
  8.3  0.004166667 0.008333333 0.004166667 0.000000000
  8.4  0.004166667 0.008333333 0.000000000 0.008333333
  8.5  0.004166667 0.004166667 0.008333333 0.000000000
  8.6  0.004166667 0.004166667 0.004166667 0.004166667
  8.7  0.012500000 0.000000000 0.008333333 0.004166667
  8.8  0.016666667 0.000000000 0.000000000 0.000000000
  8.9  0.004166667 0.008333333 0.000000000 0.000000000
  9    0.008333333 0.004166667 0.016666667 0.000000000
  9.1  0.004166667 0.004166667 0.012500000 0.004166667
  9.2  0.004166667 0.004166667 0.000000000 0.004166667
  9.3  0.004166667 0.000000000 0.000000000 0.008333333
  9.4  0.004166667 0.008333333 0.000000000 0.012500000
  9.5  0.004166667 0.000000000 0.004166667 0.004166667
  9.6  0.004166667 0.000000000 0.000000000 0.000000000
  9.7  0.000000000 0.004166667 0.004166667 0.000000000
  9.9  0.000000000 0.000000000 0.004166667 0.004166667
  10   0.004166667 0.000000000 0.012500000 0.000000000
  10.1 0.000000000 0.000000000 0.000000000 0.004166667
  10.2 0.000000000 0.000000000 0.004166667 0.008333333
  10.3 0.000000000 0.000000000 0.004166667 0.000000000
  10.4 0.000000000 0.004166667 0.000000000 0.008333333
  10.5 0.000000000 0.004166667 0.008333333 0.000000000
  10.6 0.004166667 0.004166667 0.008333333 0.000000000
  10.7 0.004166667 0.000000000 0.000000000 0.008333333
  10.8 0.000000000 0.000000000 0.004166667 0.008333333
  10.9 0.000000000 0.000000000 0.008333333 0.000000000
  11.1 0.000000000 0.004166667 0.004166667 0.008333333
  11.2 0.000000000 0.008333333 0.000000000 0.000000000
  11.3 0.000000000 0.008333333 0.008333333 0.004166667
  11.4 0.004166667 0.004166667 0.008333333 0.000000000
  11.5 0.000000000 0.004166667 0.004166667 0.000000000
  11.6 0.000000000 0.012500000 0.008333333 0.008333333
  11.7 0.008333333 0.008333333 0.004166667 0.000000000
  11.8 0.000000000 0.004166667 0.000000000 0.000000000
  11.9 0.000000000 0.000000000 0.000000000 0.004166667
  12   0.000000000 0.000000000 0.004166667 0.012500000
  12.2 0.000000000 0.000000000 0.000000000 0.004166667
  12.3 0.004166667 0.004166667 0.000000000 0.004166667
  12.4 0.000000000 0.008333333 0.000000000 0.004166667
  12.6 0.000000000 0.004166667 0.004166667 0.000000000
  12.7 0.000000000 0.000000000 0.004166667 0.000000000
  13   0.000000000 0.000000000 0.008333333 0.004166667
  13.3 0.000000000 0.000000000 0.000000000 0.008333333
  13.4 0.000000000 0.004166667 0.004166667 0.000000000
  13.5 0.000000000 0.000000000 0.004166667 0.000000000
  13.8 0.000000000 0.000000000 0.008333333 0.000000000
  14   0.000000000 0.000000000 0.000000000 0.004166667
  14.5 0.000000000 0.000000000 0.000000000 0.008333333
  14.6 0.000000000 0.000000000 0.000000000 0.004166667
  14.9 0.000000000 0.000000000 0.000000000 0.004166667

Come primo step: ho importato moments come pacchetto, fatto l’attach Secondo passaggio: ho definito le variabili continue e la funzione CV per il coefficiente di variazione. Fatto un ciclo for dove si calcolano e si stampano summary, deviazione standard, coefficiente di variazione e range interquartile. Per indici di forma si sono calcolati asimmetria e kurtosi.

Infine distribuizione di frequenze assolute reltative sono state fatte su city, year, months and months_inventory. in questo caso su sales, si sarebbe pototuto fare anche per altre variabili. Con tutti questi step si ha un idea abbastanza chiara della situazione dei dati e della loro distribuizione.

Punto 3: Identificazione delle variabili con maggiore variabilità e asimmetria

Per individuare la variabile con piu variabilità si può utilizzare l’analisi del coefficiente di variabilità. si trova che il Cv piu alto è quello di volume che indica una variabilità maggiore rispetto la media

Per l’asimmetria si puo usare l’indici di asimmetria di fisher, che riporta la variabili volume come la piu asimmetrica, positiva in questo caso.

Sono uscite 3 asimmetrie positive(sales, volume, listings) una negativa (median_price). Per la kurtosi: 3 platicurtiche e una leptocurtica (volume).

Punto 4. Creazione di classi per una variabile quantitativa

sales_CL <- cut(dati$sales,
                     breaks= c(79,150, 220,290,380, 423)) 
N<- dim(dati)[1]
ni <- table(sales_CL)   
fi <- ni/N                
Ni <- cumsum(ni)            
Fi <- Ni/N 

distr_freq<- as.data.frame(cbind(ni,fi,Ni,Fi))

barplot(distr_freq$ni,
        main = "Distribuizione delle classi di vendite",
        xlab = "Classi di vendite",
        ylab = "Frequenze assolute",
        ylim = c(0,100),
        col = "green",
        names.arg = rownames(distr_freq))


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)
}

gini.index(sales_CL)
[1] 0.9021701

Ho creato la classe sales_CL divisa in quantili, fatto il boxplot delle frewueze assolute e calcolato l’indice di Gine che viene intorno a 0.90, valore vicino 1 che indica una disuguaglia nella distribuzione delle vendite nelle classi.

Punto 5. Calcolo delle probabilità

f_city <- table(dati$city)
probabilità1 <- f_city/N
p_Beaumont <- probabilità1["Beaumont"]
p_Beaumont
Beaumont 
    0.25 
f_month <-table(dati$month)
probabilità2 <- f_month/N
p_Luglio <- probabilità2["7"]
p_Luglio
         7 
0.08333333 
f_year <-table(dati$year)
probabilità3 <- f_year/N
p_2012 <- probabilità3["2012"]
P_dicembre2012 <- p_2012/12
P_dicembre2012
      2012 
0.01666667 

Prima richiesta, probabilità che una riga a casa abbia la scritta beaumont è del 0.25. Seconda domanda: probabilà di avere il mese di Luglio, è di 0.0833 Terza domanda: probabilita di avere Dicembre 20212 è di 0.0167

Punto6. Creazione di nuove variabili

dati$mean_price <- dati$volume/dati$sales

conversion_rate<- dati$sales/dati$listings
norm_time <- 1/dati$months_inventory
dati$efficacia_annunci <- conversion_rate*norm_time

Primo comando, ho aggiunto la colonna del prezzo mezzo, facendo valore totale vendite diviso numero vendite, cioè la media, risultato espresso in milioni di dollari, corenete con il prezzo mediano. Per il secondo punto ho ragionato creando due variabili, ovvero il rate di conversione definito come il rapporto delle vendite sugli annunci attivi e sul tempo normalizzato, calcolato come il reciproco del tempo (in mesi) degli annunci per vendere le inserzioni. Infine ho aggiunto la colonna dell’efficacia calcolata come il prodotto tra i due. valori alti indicano buona efficacia, in quanto si ha ato rate e alto il reciproco dei mesi, valori bassi indicno bassa efficacia.

Punto 7. Analisi condizionata

install.packages("dplyr")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installazione pacchetto in ‘C:/Users/Marce/AppData/Local/R/win-library/4.4’
(perché ‘lib’ non è specificato)
apertura URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/dplyr_1.1.4.zip'
Content type 'application/zip' length 1590561 bytes (1.5 MB)
downloaded 1.5 MB
pacchetto ‘dplyr’ aperto con successo con controllo somme MD5

I pacchetti binari scaricati sono in
    C:\Users\Marce\AppData\Local\Temp\RtmpoZQwKZ\downloaded_packages
install.packages("ggplot2")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installazione pacchetto in ‘C:/Users/Marce/AppData/Local/R/win-library/4.4’
(perché ‘lib’ non è specificato)
apertura URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/ggplot2_3.5.2.zip'
Content type 'application/zip' length 5018140 bytes (4.8 MB)
downloaded 4.8 MB
pacchetto ‘ggplot2’ aperto con successo con controllo somme MD5

I pacchetti binari scaricati sono in
    C:\Users\Marce\AppData\Local\Temp\RtmpoZQwKZ\downloaded_packages
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
library(ggplot2)
analisi_condizionata1<-dati %>%
  group_by(city,year) %>%
  summarise(
    media=mean(sales),
    dev.st=sd(sales)
    )
`summarise()` has grouped output by 'city'. You can override using the `.groups` argument.
ggplot(data=analisi_condizionata1)+
  (aes(x = year, y = media, color = city)) +
  geom_line() +
  geom_point() +
  facet_wrap(~city) + 
  labs(title = "Media delle Vendite per Anno e Città",
       x = "Anno",
       y = "Media Vendite",
       color = "Città") +
  theme_bw()

analisi_condizionata2<-dati %>%
  group_by(city,month) %>%
  summarise(
    media=mean(sales),
    dev.st=sd(sales)
  )
`summarise()` has grouped output by 'city'. You can override using the `.groups` argument.
ggplot(data=analisi_condizionata2)+
  (aes(x = month, y = media, color = city)) +
  geom_line() +
  geom_point() +
  facet_wrap(~city) + 
  labs(title = "Media delle Vendite per mese e Città",
       x = "Mese",
       y = "Media Vendite",
       color = "Città") +
  theme_bw()

Ho generato le due analisi condizionate con le variabili anno e città e mese e citta rispetto alle vendite usando il pacchetto dplyr. Non ho fatto un summary in quanto non ne capisco il senso a questo punto. con due ggplot ho creato deu grafici a linee punti , creando dei grafici ad hoc per città. Diverse prove per trovare le combinazioni he mi soddisfacevano,

Punto 8. Creazione di visualizzazioni con ggplot2

per i grafici personalizzati, basta vedere quelli sopra.

boxplot(median_price~city)

ggplot(data=dati)+
  geom_bar(aes(x=month,
               y=sales,
               fill=city),     
           position = "fill",  
           stat = "summary",
           fun="mean",
           col ="black")+      
  labs(title= "Distribuizione delle vendite per mese e città", 
       x = "Mesi",   
       y = "Vendite")+       
  scale_y_continuous(breaks = seq(0,450,5))+
  theme_classic() 

ggplot(data=dati, aes(x = month, y = sales, color = year)) +
  geom_line(linewidth = 2) +
  labs(
    title = "Confronto dell'andamento delle vendite tra periodi",
    x = "ANni",
    y = "Vendite",
    color = "Mesi"
  ) +
  scale_x_continuous(breaks = 1:12, labels = month.abb) + 
  theme_minimal()

ggplot(data=dati, aes(x = year, y = sales)) +
  geom_line(linewidth = 2) +
  labs(
    title = "Confronto dell'andamento delle vendite tra periodi",
    x = "ANni",
    y = "Vendite"
  ) +
  theme_minimal()

ggplot(data=dati, aes(x = month, y = sales)) +
  geom_line(linewidth = 2) +
  labs(
    title = "Confronto dell'andamento delle vendite tra periodi",
    x = "Mesi",
    y = "Vendite"
  ) +
  scale_x_continuous(breaks = 1:12, labels = month.abb) + 
  theme_minimal()

install.packages("lubridate")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installazione pacchetto in ‘C:/Users/Marce/AppData/Local/R/win-library/4.4’
(perché ‘lib’ non è specificato)
apertura URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/lubridate_1.9.4.zip'
Content type 'application/zip' length 989366 bytes (966 KB)
downloaded 966 KB
pacchetto ‘lubridate’ aperto con successo con controllo somme MD5

I pacchetti binari scaricati sono in
    C:\Users\Marce\AppData\Local\Temp\RtmpoZQwKZ\downloaded_packages
library(lubridate)

Caricamento pacchetto: ‘lubridate’

I seguenti oggetti sono mascherati da ‘package:base’:

    date, intersect, setdiff, union
my_years <- rep(2010:2014, each = 12) 
my_months <- rep(1:12, times = 5)
dati$date<- make_date(year = my_years, month = my_months)
analisi_condizionata3<-dati %>%
  group_by(city,date) %>%
  summarise(
    media=mean(sales),
    dev.st=sd(sales)
  )
`summarise()` has grouped output by 'city'. You can override using the `.groups` argument.
ggplot(data=analisi_condizionata3)+
  (aes(x = date, y = media, color = city)) +
  geom_line() +
  geom_point() +
  facet_wrap(~city) +
  labs(title = "Media delle Vendite per mese e anno e Città",
       x = "Mes e anni",
       y = "Media Vendite",
       color = "Città") +
  theme_bw()

Sicuramente si può dire che gli anni 2013 e 2014 sono stati anni con piu vendite e che i mesi igliori risultano essere Maggio, Giugno e Luglio. Per quanto riguarda le città, la cittadine yler risulta essere quella dove si vendono piu immobili, mentre Wichita Falls dove se ne endono meno Infine si è creata òa variabile date combinando months and year eaggiungendo al dataframe si è fatta la terza analisi condizionata su qyesta variabile .

Punto 9. Conclusioni

analisi_condizionata3<-dati %>%
  group_by(city,listings) %>%
  summarise(
    media=mean(sales),
    dev.st=sd(sales)
  )
`summarise()` has grouped output by 'city'. You can override using the `.groups` argument.
ggplot(data=analisi_condizionata3)+
  (aes(x = listings, y = media, color = city)) +
  geom_line() +
  geom_point() +
  facet_wrap(~city) + 
  labs(title = "Media delle Vendite per Città, basato sul numero delle inserzioni",
       x = "Numero Inserzioni",
       y = "Media Vendite",
       color = "Città") +
  theme_bw()

Con questa analisi condizionata, si vede come la media delle vendite delle città varia in ase al numero di annunci attivi, Per Tyler si hanno tanti annunci e tante vendite, per ichita Falls, pochi annunci e poche vendite, situazioni intermedie per Beaumont e Bryan College Station. Per quest’ ultima il numero di annunci è relatiamente basso, ma con un buon quantitativo di vendite, quindi il rapporto annunci/vendite è il migliore.

boxplot(median_price~city)

Dal boxplot del prezzo mediano si vede come Bryan College Station ha il prezzo mediano piu alto. DAll’altra parte Wichita Falls riporta il prezzo mediano piu basso. BCS riporta anche riquadro centrale piu ampio, il che significa che ha il IQR piu ampiorispetto alle altre città.Sono presenti degli outliers per Beaumont e Wichina Falls. Beaumont e Tyler hanno prezzi mediani simili. Tuttavia, il riquadro di Beaumont è più corto di quello di Tyler, indicando una minore variabilità nel 50% centrale dei prezzi di vendita delle case.

boxplot(volume~city)

Da questo boxplot si nota come il valore totale delle vendite per BCS Bryan-Colleil il più alto,mentre WF il piu basso.BCS rivela anche la maggiore variabilità di valore totale delle vendite. Si nota come il baffo superiore di BCS è considerevolmente più lungo di quello inferiore, il che indica un’asimmetria positiva. Ciò suggerisce che, sebbene la mediana sia più alta, ci sono anche periodi con volumi di vendita totali eccezionalmente elevati che spingono ulteriormente l’estremità superiore della distribuzione. Sono presenti delgi outliner in Tyler.

LS0tDQp0aXRsZTogIlByb2dldHRvX1JOb3RlYm9vayINCmF1dGhvcjogIk1hcmNlbGxvIERpIEdpYW1tYXJjbyINCmRhdGU6ICIyMDI1LTA2LTEzIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQojIFB1bnRvIDE6IEFuYWxpc2kgZGVsbGUgdmFyaWFiaWxpDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L1VzZXJzL01hcmNlL09uZURyaXZlL0Rlc2t0b3AvQ2FydGVsbGFfUi9TdGF0aXN0aWNhIERlc2NyaXR0aXZhIikNCmRhdGkgPC0gcmVhZC5jc3YoInJlYWxlc3RhdGVfdGV4YXMuY3N2Iiwgc2VwPSIsIikNCmhlYWQoZGF0aSw1KQ0KYGBgDQpMZSB2YXJpYWJpbGkgcXVhbnRpdGF0aXZlIGNvbnRpbnVlIHNvbm8gdm9sdW1lLCBtZWRpYW5fcHJpY2UgZSBtb250aHNfaW52ZW50b3J5DQooZXNzZW5kbyBjb24gbGEgdmlyZ29sYSksIG1lbnRyZSBsZSBxdWFudGl0YXRpdmUgZGlzY3JldGUgc29ubyBzYWxlcyBlIGxpc3RpbmcuDQpJIG5vbWUgZGVsbGEgY2l0dGEgw6ggcXVhbGl0YXRpdmEgc3Ugc2NhbGEgbm9taW5hbGUuIE1vbnRoIMOoIHF1YWxpdGF0aXZhIG5vbWluYWxlLCANCiJjaWNsaWNhIiBhbGwnaW50ZXJubyBkaSBhbm5pLiBZZWFyIHRlb3JpY2FtZW50ZSDDqCBxdWFudGl0YXRpdmEgDQpjb250aW51YSwgbWEgaW4gcXVlc3RvIGNhc28gbWVnbGlvIHRyYXR0YXJsYSBkYSBxdWFsaXRhdGl2YSBvcmRpbmFsZS4NCg0KTGUgdmFyaWFiaWxpIGNoZSBpbmRlbnRpZmljYW5vIGlsIHRlbXBvIHBvc3NvIGVzc2VyZSByZWxhemlvbmF0ZSBjb24gbGUgYXRyZSB2YXJpYWJpbGksDQpjb21lIGxlIHZlbmRpdGUsIGkgdmFsb3JpIG1lZGlhbmksIGVjYy4gaW4gbW9kbyB0YWxlIGRhIHBvdGVyIGdlbmVyYXJlIGdsaSBhbmRhbWVudGkgbmVsIGNvcnNvIGRlbCB0ZW1wbyBlIGRpIGNvbnNlZ3VlbnphIGZvcm5pcmUgZGVnbGkgaW5zaWdodC4gUG9zc29ubyBlc3NlcmUgY29tcGluYXRlIGFuY2hlIGNvbiBsYSB2YXJpYWJpbGUgY2l0dGEgaW4gZ3JhZmNpIGEgYmFycmUgc292cmFwcG9zdGUsIGluIG1vZG8gdGFsZSBkYSBhdmVyZSB1bmEgcmFwcHJlc2VudGF6aW9uZSBncmFmaWNhIHNlbXBsaWNlIGUgZWZmaWNhY2UuDQoNCkF2ZW5kbyBnacOgIHBhcmxhdG8gZGVsbGUgdmFyaWFiaWxpIHRlbXBvcmFsaSBlIGRpIGNvbWUgZXNzZSBzb25vIHJlbGF6aW9uYWJpbGkgYWxsZSBhbHRyZSB2YXJpYWJpbGk7IHBlciBsZSB2YXJpYWJpbGUgdmVuZGl0ZSAoc2FsZXMpIGUgdm9sdW1lIHNpIHB1w7IgcmljYXZhcmUgbCdhbmRhbWVudG8gdGVtcG9yYWxlIGRlbGxlIG51bWVybyBkaSB2ZW5kaXRlIGUgZGVsIHZvbHVtZSBpbiBtaWxpb25pIGRpIGRvbGxhcmkgcmlmZXJpdG8gcGVyIGNpdHTDoC0tPiBwb3NzaWJpbGkgYW5hbGlzaSBpbmNsdWRvbm8gY2FsY29sbyBkZWdsaSBpbmRpY2kgZGkgcG9zaXppb25lIGUgdmFyaWJpbGl0w6AsIG5vbmNow6ggdmlzdWFsaXp6YXJlIGxhIGRpc3RyaWJ1emlvbmUgY29uIHVuIGdyYWZpY28gcGVyIHZlZGVyZSBzZSBzZWd1ZSB1bmEgZGlzdHJpYnV6aW9uZSBub3JtYWxlIG8gYXNpbW1ldHJpY2EuDQoNCkRhbGwnYW5hbGlzaSBkZWwgdm9sdW1lIGUgZGVsIHRvdGFsZSB2YWxvcmUgZGkgdmVuZGl0w6AsIHNpIHB1w7IgdmVkZXJlIHNpIGRpc2Nvc3RhIHJpc3BldHRvIGFsIHZhbG9yZSBtZWRpYW5vIGUgZmFyZSBjb25mcm9udGkgdHJhIGkgcHJlenppIG1lZGlhbmkgZGVsbGUgYXZyaWUgY2l0dMOgIGluIGRpdmVyc2kgbW9tZW50aSB0ZW1wb3JhbGkgKG1lc2kgbyBhbm5pKS4NClBlciBsaXN0aW5nIGRpc2NvcnNvIHNpbWlsZSBhIHZvbHVtZSBlIHNhbGVzLg0KbW9udGhzX2ludmVudG9yeSBmb3JuaXNjZSBpbmZvcm1hemlzY2Ugc3UgY29tZSB2YXJpYSBpbCBtZXJjYXRvIG5lbCB0ZW1wbyBlIHF1aW5kaSBjb25mcm9udGkgY29uIGNpdHTDoCBlIGxlIGFsdHJlIHZhcmliaWxpIHNvbm8gcG9zc2liaWxpLCBvbHRyZSBjaGUgbGUgZGlzdHJpYnV6aW9uaS4NCg0KIyBQdW50byAyOiBJbmRpY2kgZGkgcG9zaXppb25lLCB2YXJpYWJpbGl0w6AgZSBmb3JtYQ0KDQpgYGB7cn0NCg0KaW5zdGFsbC5wYWNrYWdlcygibW9tZW50cyIpDQpsaWJyYXJ5KG1vbWVudHMpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KYXR0YWNoKGRhdGkpDQoNCmNvbnRpbnVvc192YXJpYWJsZSA8LSBjKCJzYWxlcyIsICJ2b2x1bWUiLCAibWVkaWFuX3ByaWNlIiwgImxpc3RpbmdzIikNCg0KQ1Y8LSBmdW5jdGlvbih4KXsNCiAgcmV0dXJuKHNkKHgpL21lYW4oeCkqMTAwKQ0KfQ0KDQpmb3IgKHZhcl9uYW1lIGluIGNvbnRpbnVvc192YXJpYWJsZSkgew0KICBpZiAodmFyX25hbWUgJWluJSBuYW1lcyhkYXRpKSkgew0KICAgIGNhdChwYXN0ZTAoIlN1bW1hcnkgcGVyIGxhIHZhcmlhYmlsZTogIiwgdmFyX25hbWUsICIgLS0tXG4iKSkNCiAgICBwcmludChzdW1tYXJ5KGRhdGlbW3Zhcl9uYW1lXV0pKSANCiAgICBkZXZfc3RkIDwtIHNkKGRhdGlbW3Zhcl9uYW1lXV0sIG5hLnJtID0gVFJVRSkNCiAgICBjYXQocGFzdGUwKCJEZXZpYXppb25lIFN0YW5kYXJkICgiLCB2YXJfbmFtZSwgIik6ICIsIHJvdW5kKGRldl9zdGQsIDIpLCAiXG4iKSkNCiAgICBjdl92YWwgPC0gQ1YoZGF0aVtbdmFyX25hbWVdXSkNCiAgICBjYXQocGFzdGUwKCJDb2VmZmljaWVudGUgZGkgVmFyaWF6aW9uZTogIiwgcm91bmQoY3ZfdmFsLCAyKSwgIiVcbiIpKQ0KICAgICBpcXJfdmFsIDwtIElRUihkYXRpW1t2YXJfbmFtZV1dLCBuYS5ybSA9IFRSVUUpDQogICAgY2F0KHBhc3RlMCgiSW50ZXJxdWFydGlsZSBSYW5nZSAoSVFSKTogIiwgcm91bmQoaXFyX3ZhbCwgMiksICJcbiIpKQ0KICAgIHNrZXdfdmFsIDwtIHNrZXduZXNzKGRhdGlbW3Zhcl9uYW1lXV0sIG5hLnJtID0gVFJVRSkNCiAgICBjYXQocGFzdGUwKCJBc2ltbWV0cmlhIChTa2V3bmVzcyk6ICIsIHJvdW5kKHNrZXdfdmFsLCAyKSwgIlxuIikpDQogICAga3VydF92YWwgPC0ga3VydG9zaXMoZGF0aVtbdmFyX25hbWVdXSwgbmEucm0gPSBUUlVFKSAtIDMgDQogICAgY2F0KHBhc3RlMCgiQ3VydG9zaSAoS3VydG9zaXMpOiAiLCByb3VuZChrdXJ0X3ZhbCwgMiksICJcbiIpKQ0KDQogICAgIGNhdCgiXG4iKSANCiAgfSBlbHNlIHsNCiAgICBjYXQocGFzdGUwKCJBdHRlbnppb25lOiBMYSB2YXJpYWJpbGUgJyIsIHZhcl9uYW1lLCAiJyBub24gZXNpc3RlIG5lbCBkYXRhZnJhbWUuXG5cbiIpKQ0KICB9DQp9DQpgYGANCmBgYHtyfQ0KTjwtIGRpbShkYXRpKVsxXQ0KDQpkYXRpJHNhbGVzX0NMIDwtIGN1dChkYXRpJHNhbGVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz0gYyg3OSwxMjcsIDE3NS41LDI0Nyw0MjMpKSANCg0KdGFibGUoZGF0aSRjaXR5LCBkYXRpJHNhbGVzX0NMKQ0KdGFibGUoZGF0aSRjaXR5LCBkYXRpJHNhbGVzX0NMKS9ODQp0YWJsZShkYXRpJHllYXIsIGRhdGkkc2FsZXNfQ0wpDQp0YWJsZShkYXRpJHllYXIsIGRhdGkkc2FsZXNfQ0wpL04NCnRhYmxlKGRhdGkkbW9udGgsIGRhdGkkc2FsZXNfQ0wpDQp0YWJsZShkYXRpJG1vbnRoLCBkYXRpJHNhbGVzX0NMKS9ODQp0YWJsZShkYXRpJG1vbnRoc19pbnZlbnRvcnksIGRhdGkkc2FsZXNfQ0wpDQp0YWJsZShkYXRpJG1vbnRoc19pbnZlbnRvcnksIGRhdGkkc2FsZXNfQ0wpL04NCmBgYA0KQ29tZSBwcmltbyBzdGVwOiBobyBpbXBvcnRhdG8gbW9tZW50cyBjb21lIHBhY2NoZXR0bywgZmF0dG8gbCdhdHRhY2gNClNlY29uZG8gcGFzc2FnZ2lvOiBobyBkZWZpbml0byBsZSB2YXJpYWJpbGkgY29udGludWUgZSBsYSBmdW56aW9uZSBDViBwZXIgaWwgY29lZmZpY2llbnRlIGRpIHZhcmlhemlvbmUuDQpGYXR0byB1biBjaWNsbyBmb3IgZG92ZSBzaSBjYWxjb2xhbm8gZSBzaSBzdGFtcGFubyBzdW1tYXJ5LCBkZXZpYXppb25lIHN0YW5kYXJkLA0KY29lZmZpY2llbnRlIGRpIHZhcmlhemlvbmUgZSByYW5nZSBpbnRlcnF1YXJ0aWxlLiBQZXIgaW5kaWNpIGRpIGZvcm1hIHNpIHNvbm8gDQpjYWxjb2xhdGkgYXNpbW1ldHJpYSBlIGt1cnRvc2kuDQoNCkluZmluZSBkaXN0cmlidWl6aW9uZSBkaSBmcmVxdWVuemUgYXNzb2x1dGUgcmVsdGF0aXZlIHNvbm8gc3RhdGUgZmF0dGUgc3UgY2l0eSwgeWVhciwgbW9udGhzIGFuZCBtb250aHNfaW52ZW50b3J5Lg0KaW4gcXVlc3RvIGNhc28gc3Ugc2FsZXMsIHNpIHNhcmViYmUgcG90b3R1dG8gZmFyZSBhbmNoZSBwZXIgYWx0cmUgdmFyaWFiaWxpLiBDb24gdHV0dGkgcXVlc3RpIHN0ZXAgc2kgaGEgdW4gaWRlYSBhYmJhc3RhbnphIGNoaWFyYSBkZWxsYSBzaXR1YXppb25lIGRlaSBkYXRpIGUgZGVsbGEgbG9ybyBkaXN0cmlidWl6aW9uZS4NCg0KDQojIFB1bnRvIDM6IElkZW50aWZpY2F6aW9uZSBkZWxsZSB2YXJpYWJpbGkgY29uIG1hZ2dpb3JlIHZhcmlhYmlsaXTDoCBlIGFzaW1tZXRyaWENCg0KDQpQZXIgaW5kaXZpZHVhcmUgbGEgdmFyaWFiaWxlIGNvbiBwaXUgdmFyaWFiaWxpdMOgIHNpIHB1w7IgdXRpbGl6emFyZSBsJ2FuYWxpc2kgZGVsIGNvZWZmaWNpZW50ZSBkaSB2YXJpYWJpbGl0w6AuIHNpIHRyb3ZhIGNoZSBpbCBDdiBwaXUgYWx0byDDqCBxdWVsbG8gZGkgdm9sdW1lIGNoZSBpbmRpY2EgdW5hIHZhcmlhYmlsaXTDoCBtYWdnaW9yZSByaXNwZXR0byBsYSBtZWRpYQ0KDQpQZXIgbCdhc2ltbWV0cmlhIHNpIHB1byB1c2FyZSBsJ2luZGljaSBkaSBhc2ltbWV0cmlhIGRpIGZpc2hlciwgY2hlIHJpcG9ydGEgbGEgdmFyaWFiaWxpIHZvbHVtZSBjb21lIGxhIHBpdSBhc2ltbWV0cmljYSwgcG9zaXRpdmEgaW4gcXVlc3RvIGNhc28uDQoNClNvbm8gdXNjaXRlIDMgYXNpbW1ldHJpZSBwb3NpdGl2ZShzYWxlcywgdm9sdW1lLCBsaXN0aW5ncykNCnVuYSBuZWdhdGl2YSAobWVkaWFuX3ByaWNlKS4gUGVyIGxhIGt1cnRvc2k6IDMgcGxhdGljdXJ0aWNoZSBlIHVuYSBsZXB0b2N1cnRpY2EgKHZvbHVtZSkuDQoNCiMgUHVudG8gNC4gQ3JlYXppb25lIGRpIGNsYXNzaSBwZXIgdW5hIHZhcmlhYmlsZSBxdWFudGl0YXRpdmENCg0KYGBge3J9DQpzYWxlc19DTCA8LSBjdXQoZGF0aSRzYWxlcywNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz0gYyg3OSwxNTAsIDIyMCwyOTAsMzgwLCA0MjMpKSANCk48LSBkaW0oZGF0aSlbMV0NCm5pIDwtIHRhYmxlKHNhbGVzX0NMKSAgIA0KZmkgPC0gbmkvTiAgICAgICAgICAgICAgICANCk5pIDwtIGN1bXN1bShuaSkgICAgICAgICAgICANCkZpIDwtIE5pL04gDQoNCmRpc3RyX2ZyZXE8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKG5pLGZpLE5pLEZpKSkNCg0KYmFycGxvdChkaXN0cl9mcmVxJG5pLA0KICAgICAgICBtYWluID0gIkRpc3RyaWJ1aXppb25lIGRlbGxlIGNsYXNzaSBkaSB2ZW5kaXRlIiwNCiAgICAgICAgeGxhYiA9ICJDbGFzc2kgZGkgdmVuZGl0ZSIsDQogICAgICAgIHlsYWIgPSAiRnJlcXVlbnplIGFzc29sdXRlIiwNCiAgICAgICAgeWxpbSA9IGMoMCwxMDApLA0KICAgICAgICBjb2wgPSAiZ3JlZW4iLA0KICAgICAgICBuYW1lcy5hcmcgPSByb3duYW1lcyhkaXN0cl9mcmVxKSkNCg0KZ2luaS5pbmRleDwtZnVuY3Rpb24oeCl7DQogIG5pPXRhYmxlKHgpDQogIGZpPW5pL2xlbmd0aCh4KQ0KICBmaTI9ZmleMg0KICBqPWxlbmd0aCh0YWJsZSh4KSkNCiAgDQogIGdpbmk9MS1zdW0oZmkyKQ0KICBnaW5pLm5vcm1hbGl6emF0bz0gZ2luaS8oKGotMSkvaikNCiAgDQogIHJldHVybihnaW5pLm5vcm1hbGl6emF0bykNCn0NCg0KZ2luaS5pbmRleChzYWxlc19DTCkNCmBgYA0KSG8gY3JlYXRvIGxhIGNsYXNzZSBzYWxlc19DTCBkaXZpc2EgaW4gcXVhbnRpbGksIGZhdHRvIGlsIGJveHBsb3QgZGVsbGUgZnJld3VlemUgYXNzb2x1dGUgZSBjYWxjb2xhdG8gbCdpbmRpY2UgZGkgR2luZSBjaGUgdmllbmUgaW50b3JubyBhIDAuOTAsIHZhbG9yZSB2aWNpbm8gMSBjaGUgaW5kaWNhIHVuYSBkaXN1Z3VhZ2xpYSBuZWxsYSBkaXN0cmlidXppb25lIGRlbGxlIHZlbmRpdGUgbmVsbGUgY2xhc3NpLg0KDQojIFB1bnRvIDUuIENhbGNvbG8gZGVsbGUgcHJvYmFiaWxpdMOgDQoNCmBgYHtyfQ0KZl9jaXR5IDwtIHRhYmxlKGRhdGkkY2l0eSkNCnByb2JhYmlsaXTDoDEgPC0gZl9jaXR5L04NCnBfQmVhdW1vbnQgPC0gcHJvYmFiaWxpdMOgMVsiQmVhdW1vbnQiXQ0KcF9CZWF1bW9udA0KDQpmX21vbnRoIDwtdGFibGUoZGF0aSRtb250aCkNCnByb2JhYmlsaXTDoDIgPC0gZl9tb250aC9ODQpwX0x1Z2xpbyA8LSBwcm9iYWJpbGl0w6AyWyI3Il0NCnBfTHVnbGlvDQoNCmZfeWVhciA8LXRhYmxlKGRhdGkkeWVhcikNCnByb2JhYmlsaXTDoDMgPC0gZl95ZWFyL04NCnBfMjAxMiA8LSBwcm9iYWJpbGl0w6AzWyIyMDEyIl0NClBfZGljZW1icmUyMDEyIDwtIHBfMjAxMi8xMg0KUF9kaWNlbWJyZTIwMTINCmBgYA0KUHJpbWEgcmljaGllc3RhLCBwcm9iYWJpbGl0w6AgY2hlIHVuYSByaWdhIGEgY2FzYSBhYmJpYSBsYSBzY3JpdHRhIGJlYXVtb250IMOoIGRlbCAwLjI1Lg0KU2Vjb25kYSBkb21hbmRhOiBwcm9iYWJpbMOgIGRpIGF2ZXJlIGlsIG1lc2UgZGkgTHVnbGlvLCDDqCBkaSAwLjA4MzMNClRlcnphIGRvbWFuZGE6IHByb2JhYmlsaXRhIGRpIGF2ZXJlIERpY2VtYnJlIDIwMjEyIMOoIGRpIDAuMDE2Nw0KDQojIFB1bnRvNi4gQ3JlYXppb25lIGRpIG51b3ZlIHZhcmlhYmlsaQ0KDQpgYGB7cn0NCmRhdGkkbWVhbl9wcmljZSA8LSBkYXRpJHZvbHVtZS9kYXRpJHNhbGVzDQoNCmNvbnZlcnNpb25fcmF0ZTwtIGRhdGkkc2FsZXMvZGF0aSRsaXN0aW5ncw0Kbm9ybV90aW1lIDwtIDEvZGF0aSRtb250aHNfaW52ZW50b3J5DQpkYXRpJGVmZmljYWNpYV9hbm51bmNpIDwtIGNvbnZlcnNpb25fcmF0ZSpub3JtX3RpbWUNCmBgYA0KDQpQcmltbyBjb21hbmRvLCBobyBhZ2dpdW50byBsYSBjb2xvbm5hIGRlbCBwcmV6em8gbWV6em8sIGZhY2VuZG8gdmFsb3JlIHRvdGFsZSB2ZW5kaXRlIGRpdmlzbyBudW1lcm8gdmVuZGl0ZSwgY2lvw6ggbGEgbWVkaWEsIHJpc3VsdGF0byBlc3ByZXNzbyBpbiBtaWxpb25pIGRpIGRvbGxhcmksIGNvcmVuZXRlIGNvbiBpbCBwcmV6em8gbWVkaWFuby4gDQpQZXIgaWwgc2Vjb25kbyBwdW50byBobyByYWdpb25hdG8gY3JlYW5kbyBkdWUgdmFyaWFiaWxpLCBvdnZlcm8gaWwgcmF0ZSBkaSBjb252ZXJzaW9uZQ0KZGVmaW5pdG8gY29tZSBpbCByYXBwb3J0byBkZWxsZSB2ZW5kaXRlIHN1Z2xpIGFubnVuY2kgYXR0aXZpIGUgc3VsIHRlbXBvIG5vcm1hbGl6emF0bywgY2FsY29sYXRvIGNvbWUgaWwgcmVjaXByb2NvIGRlbCB0ZW1wbyAoaW4gbWVzaSkgZGVnbGkgYW5udW5jaSBwZXIgdmVuZGVyZSBsZSBpbnNlcnppb25pLiANCkluZmluZSBobyBhZ2dpdW50byBsYSBjb2xvbm5hIGRlbGwnZWZmaWNhY2lhIGNhbGNvbGF0YSBjb21lIGlsIHByb2RvdHRvIHRyYSBpIGR1ZS4gdmFsb3JpIGFsdGkgaW5kaWNhbm8gYnVvbmEgIGVmZmljYWNpYSwgaW4gcXVhbnRvIHNpIGhhIGF0byByYXRlIGUgYWx0byBpbCByZWNpcHJvY28gZGVpIG1lc2ksIHZhbG9yaSBiYXNzaSBpbmRpY25vIGJhc3NhIGVmZmljYWNpYS4NCg0KIyBQdW50byA3LiBBbmFsaXNpIGNvbmRpemlvbmF0YQ0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQpgYGB7cn0NCmFuYWxpc2lfY29uZGl6aW9uYXRhMTwtZGF0aSAlPiUNCiAgZ3JvdXBfYnkoY2l0eSx5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG1lZGlhPW1lYW4oc2FsZXMpLA0KICAgIGRldi5zdD1zZChzYWxlcykNCiAgICApDQoNCg0KZ2dwbG90KGRhdGE9YW5hbGlzaV9jb25kaXppb25hdGExKSsNCiAgKGFlcyh4ID0geWVhciwgeSA9IG1lZGlhLCBjb2xvciA9IGNpdHkpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZmFjZXRfd3JhcCh+Y2l0eSkgKyANCiAgbGFicyh0aXRsZSA9ICJNZWRpYSBkZWxsZSBWZW5kaXRlIHBlciBBbm5vIGUgQ2l0dMOgIiwNCiAgICAgICB4ID0gIkFubm8iLA0KICAgICAgIHkgPSAiTWVkaWEgVmVuZGl0ZSIsDQogICAgICAgY29sb3IgPSAiQ2l0dMOgIikgKw0KICB0aGVtZV9idygpDQoNCmBgYA0KYGBge3J9DQphbmFsaXNpX2NvbmRpemlvbmF0YTI8LWRhdGkgJT4lDQogIGdyb3VwX2J5KGNpdHksbW9udGgpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWE9bWVhbihzYWxlcyksDQogICAgZGV2LnN0PXNkKHNhbGVzKQ0KICApDQoNCmdncGxvdChkYXRhPWFuYWxpc2lfY29uZGl6aW9uYXRhMikrDQogIChhZXMoeCA9IG1vbnRoLCB5ID0gbWVkaWEsIGNvbG9yID0gY2l0eSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBmYWNldF93cmFwKH5jaXR5KSArIA0KICBsYWJzKHRpdGxlID0gIk1lZGlhIGRlbGxlIFZlbmRpdGUgcGVyIG1lc2UgZSBDaXR0w6AiLA0KICAgICAgIHggPSAiTWVzZSIsDQogICAgICAgeSA9ICJNZWRpYSBWZW5kaXRlIiwNCiAgICAgICBjb2xvciA9ICJDaXR0w6AiKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KSG8gZ2VuZXJhdG8gbGUgZHVlIGFuYWxpc2kgY29uZGl6aW9uYXRlIGNvbiBsZSB2YXJpYWJpbGkgYW5ubyBlIGNpdHTDoCBlIG1lc2UgZSBjaXR0YQ0KcmlzcGV0dG8gYWxsZSB2ZW5kaXRlIHVzYW5kbyBpbCBwYWNjaGV0dG8gZHBseXIuIE5vbiBobyBmYXR0byB1biBzdW1tYXJ5IGluIHF1YW50byANCm5vbiBuZSBjYXBpc2NvIGlsIHNlbnNvIGEgcXVlc3RvIHB1bnRvLiBjb24gZHVlIGdncGxvdCBobyBjcmVhdG8gZGV1IGdyYWZpY2kgYSBsaW5lZSANCnB1bnRpICwgY3JlYW5kbyBkZWkgZ3JhZmljaSBhZCBob2MgcGVyIGNpdHTDoC4gRGl2ZXJzZSBwcm92ZSBwZXIgdHJvdmFyZSBsZSBjb21iaW5hemlvbmkgaGUgbWkgc29kZGlzZmFjZXZhbm8sDQoNCiMgUHVudG8gOC4gQ3JlYXppb25lIGRpIHZpc3VhbGl6emF6aW9uaSBjb24gZ2dwbG90Mg0KDQpwZXIgaSBncmFmaWNpIHBlcnNvbmFsaXp6YXRpLCBiYXN0YSB2ZWRlcmUgcXVlbGxpIHNvcHJhLg0KDQoNCmBgYHtyfQ0KYm94cGxvdChtZWRpYW5fcHJpY2V+Y2l0eSkNCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1kYXRpKSsNCiAgZ2VvbV9iYXIoYWVzKHg9bW9udGgsDQogICAgICAgICAgICAgICB5PXNhbGVzLA0KICAgICAgICAgICAgICAgZmlsbD1jaXR5KSwgICAgIA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJmaWxsIiwgIA0KICAgICAgICAgICBzdGF0ID0gInN1bW1hcnkiLA0KICAgICAgICAgICBmdW49Im1lYW4iLA0KICAgICAgICAgICBjb2wgPSJibGFjayIpKyAgICAgIA0KICBsYWJzKHRpdGxlPSAiRGlzdHJpYnVpemlvbmUgZGVsbGUgdmVuZGl0ZSBwZXIgbWVzZSBlIGNpdHTDoCIsIA0KICAgICAgIHggPSAiTWVzaSIsICAgDQogICAgICAgeSA9ICJWZW5kaXRlIikrICAgICAgIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsNDUwLDUpKSsNCiAgdGhlbWVfY2xhc3NpYygpIA0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9ZGF0aSwgYWVzKHggPSBtb250aCwgeSA9IHNhbGVzLCBjb2xvciA9IHllYXIpKSArDQogIGdlb21fbGluZShsaW5ld2lkdGggPSAyKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29uZnJvbnRvIGRlbGwnYW5kYW1lbnRvIGRlbGxlIHZlbmRpdGUgdHJhIHBlcmlvZGkiLA0KICAgIHggPSAiQU5uaSIsDQogICAgeSA9ICJWZW5kaXRlIiwNCiAgICBjb2xvciA9ICJNZXNpIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYikgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhPWRhdGksIGFlcyh4ID0geWVhciwgeSA9IHNhbGVzKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoID0gMikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmZyb250byBkZWxsJ2FuZGFtZW50byBkZWxsZSB2ZW5kaXRlIHRyYSBwZXJpb2RpIiwNCiAgICB4ID0gIkFObmkiLA0KICAgIHkgPSAiVmVuZGl0ZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9ZGF0aSwgYWVzKHggPSBtb250aCwgeSA9IHNhbGVzKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoID0gMikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmZyb250byBkZWxsJ2FuZGFtZW50byBkZWxsZSB2ZW5kaXRlIHRyYSBwZXJpb2RpIiwNCiAgICB4ID0gIk1lc2kiLA0KICAgIHkgPSAiVmVuZGl0ZSINCiAgKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEyLCBsYWJlbHMgPSBtb250aC5hYmIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShsdWJyaWRhdGUpDQpteV95ZWFycyA8LSByZXAoMjAxMDoyMDE0LCBlYWNoID0gMTIpIA0KbXlfbW9udGhzIDwtIHJlcCgxOjEyLCB0aW1lcyA9IDUpDQpgYGANCg0KDQpgYGB7cn0NCmRhdGkkZGF0ZTwtIG1ha2VfZGF0ZSh5ZWFyID0gbXlfeWVhcnMsIG1vbnRoID0gbXlfbW9udGhzKQ0KYGBgDQoNCmBgYHtyfQ0KYW5hbGlzaV9jb25kaXppb25hdGEzPC1kYXRpICU+JQ0KICBncm91cF9ieShjaXR5LGRhdGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWE9bWVhbihzYWxlcyksDQogICAgZGV2LnN0PXNkKHNhbGVzKQ0KICApDQoNCmdncGxvdChkYXRhPWFuYWxpc2lfY29uZGl6aW9uYXRhMykrDQogIChhZXMoeCA9IGRhdGUsIHkgPSBtZWRpYSwgY29sb3IgPSBjaXR5KSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGdlb21fcG9pbnQoKSArDQogIGZhY2V0X3dyYXAofmNpdHkpICsNCiAgbGFicyh0aXRsZSA9ICJNZWRpYSBkZWxsZSBWZW5kaXRlIHBlciBtZXNlIGUgYW5ubyBlIENpdHTDoCIsDQogICAgICAgeCA9ICJNZXMgZSBhbm5pIiwNCiAgICAgICB5ID0gIk1lZGlhIFZlbmRpdGUiLA0KICAgICAgIGNvbG9yID0gIkNpdHTDoCIpICsNCiAgdGhlbWVfYncoKQ0KYGBgDQogU2ljdXJhbWVudGUgc2kgcHXDsiBkaXJlIGNoZSBnbGkgYW5uaSAyMDEzIGUgMjAxNCBzb25vIHN0YXRpIGFubmkgY29uIHBpdSB2ZW5kaXRlIGUgY2hlIGkgbWVzaSBpZ2xpb3JpIHJpc3VsdGFubyBlc3NlcmUgTWFnZ2lvLCBHaXVnbm8gZSBMdWdsaW8uIFBlciBxdWFudG8gcmlndWFyZGEgbGUgY2l0dMOgLCBsYSBjaXR0YWRpbmUgIHlsZXIgcmlzdWx0YSBlc3NlcmUgcXVlbGxhIGRvdmUgc2kgdmVuZG9ubyBwaXUgaW1tb2JpbGksIG1lbnRyZSBXaWNoaXRhIEZhbGxzIGRvdmUgc2UgbmUgIGVuZG9ubyBtZW5vDQpJbmZpbmUgc2kgw6ggY3JlYXRhIMOyYSB2YXJpYWJpbGUgZGF0ZSBjb21iaW5hbmRvIG1vbnRocyBhbmQgeWVhciAgZWFnZ2l1bmdlbmRvIGFsIGRhdGFmcmFtZSAgc2kgw6ggZmF0dGEgbGEgdGVyemEgYW5hbGlzaSBjb25kaXppb25hdGEgc3UgcXllc3RhIHZhcmlhYmlsZSAuDQoNCiMgUHVudG8gOS4gQ29uY2x1c2lvbmkNCg0KYGBge3J9DQphbmFsaXNpX2NvbmRpemlvbmF0YTM8LWRhdGkgJT4lDQogIGdyb3VwX2J5KGNpdHksbGlzdGluZ3MpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWE9bWVhbihzYWxlcyksDQogICAgZGV2LnN0PXNkKHNhbGVzKQ0KICApDQoNCmdncGxvdChkYXRhPWFuYWxpc2lfY29uZGl6aW9uYXRhMykrDQogIChhZXMoeCA9IGxpc3RpbmdzLCB5ID0gbWVkaWEsIGNvbG9yID0gY2l0eSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBmYWNldF93cmFwKH5jaXR5KSArIA0KICBsYWJzKHRpdGxlID0gIk1lZGlhIGRlbGxlIFZlbmRpdGUgcGVyIENpdHTDoCwgYmFzYXRvIHN1bCBudW1lcm8gZGVsbGUgaW5zZXJ6aW9uaSIsDQogICAgICAgeCA9ICJOdW1lcm8gSW5zZXJ6aW9uaSIsDQogICAgICAgeSA9ICJNZWRpYSBWZW5kaXRlIiwNCiAgICAgICBjb2xvciA9ICJDaXR0w6AiKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQpDb24gcXVlc3RhIGFuYWxpc2kgY29uZGl6aW9uYXRhLCBzaSB2ZWRlIGNvbWUgbGEgbWVkaWEgZGVsbGUgdmVuZGl0ZSBkZWxsZSBjaXR0w6AgdmFyaWEgaW4gYXNlIGFsIG51bWVybyBkaSBhbm51bmNpIGF0dGl2aSwgUGVyIFR5bGVyIHNpIGhhbm5vIHRhbnRpIGFubnVuY2kgZSB0YW50ZSB2ZW5kaXRlLCBwZXIgaWNoaXRhIEZhbGxzLCBwb2NoaSBhbm51bmNpIGUgcG9jaGUgdmVuZGl0ZSwgc2l0dWF6aW9uaSBpbnRlcm1lZGllIHBlciBCZWF1bW9udCBlIA0KQnJ5YW4gQ29sbGVnZSBTdGF0aW9uLiBQZXIgcXVlc3QnIHVsdGltYSBpbCBudW1lcm8gZGkgYW5udW5jaSDDqCByZWxhdGlhbWVudGUgYmFzc28sIG1hICBjb24gdW4gYnVvbiBxdWFudGl0YXRpdm8gZGkgdmVuZGl0ZSwgcXVpbmRpIGlsIHJhcHBvcnRvIGFubnVuY2kvdmVuZGl0ZSDDqCBpbCBtaWdsaW9yZS4NCg0KDQpgYGB7cn0NCmJveHBsb3QobWVkaWFuX3ByaWNlfmNpdHkpDQpgYGANCiBEYWwgYm94cGxvdCBkZWwgcHJlenpvIG1lZGlhbm8gc2kgdmVkZSBjb21lIEJyeWFuIENvbGxlZ2UgU3RhdGlvbiBoYSBpbCBwcmV6em8gbWVkaWFubyBwaXUgYWx0by4gREFsbCdhbHRyYSBwYXJ0ZSBXaWNoaXRhIEZhbGxzIHJpcG9ydGEgaWwgcHJlenpvIG1lZGlhbm8gcGl1IGJhc3NvLg0KQkNTIHJpcG9ydGEgYW5jaGUgcmlxdWFkcm8gY2VudHJhbGUgcGl1IGFtcGlvLCBpbCBjaGUgc2lnbmlmaWNhIGNoZSBoYSBpbCBJUVIgcGl1IGFtcGlvcmlzcGV0dG8gYWxsZSBhbHRyZSBjaXR0w6AuU29ubyBwcmVzZW50aSBkZWdsaSBvdXRsaWVycyBwZXIgQmVhdW1vbnQgZSBXaWNoaW5hIEZhbGxzLg0KQmVhdW1vbnQgZSBUeWxlciBoYW5ubyBwcmV6emkgbWVkaWFuaSBzaW1pbGkuIFR1dHRhdmlhLCBpbCByaXF1YWRybyBkaSBCZWF1bW9udCDDqCBwacO5IGNvcnRvIGRpIHF1ZWxsbyBkaSBUeWxlciwgaW5kaWNhbmRvIHVuYSBtaW5vcmUgdmFyaWFiaWxpdMOgIG5lbCA1MCUgY2VudHJhbGUgZGVpIHByZXp6aSBkaSB2ZW5kaXRhIGRlbGxlIGNhc2UuDQoNCg0KYGBge3J9DQpib3hwbG90KHZvbHVtZX5jaXR5KQ0KYGBgDQoNCkRhIHF1ZXN0byBib3hwbG90IHNpIG5vdGEgY29tZSBpbCB2YWxvcmUgdG90YWxlIGRlbGxlIHZlbmRpdGUgcGVyIEJDUyBCcnlhbi1Db2xsZWlsIGlsIHBpw7kgYWx0byxtZW50cmUgV0YgaWwgcGl1IGJhc3NvLkJDUyByaXZlbGEgYW5jaGUgbGEgbWFnZ2lvcmUgdmFyaWFiaWxpdMOgIGRpIHZhbG9yZSB0b3RhbGUgZGVsbGUgdmVuZGl0ZS4NClNpIG5vdGEgY29tZSBpbCBiYWZmbyBzdXBlcmlvcmUgZGkgQkNTIMOoIGNvbnNpZGVyZXZvbG1lbnRlIHBpw7kgbHVuZ28gZGkgcXVlbGxvIGluZmVyaW9yZSwgaWwgY2hlIGluZGljYSB1bidhc2ltbWV0cmlhIHBvc2l0aXZhLiBDacOyIHN1Z2dlcmlzY2UgY2hlLCBzZWJiZW5lIGxhIG1lZGlhbmEgc2lhIHBpw7kgYWx0YSwgY2kgc29ubyBhbmNoZSBwZXJpb2RpIGNvbiB2b2x1bWkgZGkgdmVuZGl0YSB0b3RhbGkgZWNjZXppb25hbG1lbnRlIGVsZXZhdGkgY2hlIHNwaW5nb25vIHVsdGVyaW9ybWVudGUgbCdlc3RyZW1pdMOgIHN1cGVyaW9yZSBkZWxsYSBkaXN0cmlidXppb25lLiBTb25vIHByZXNlbnRpIGRlbGdpIG91dGxpbmVyIGluIFR5bGVyLg0KDQoNCg==