R Packages

Di seguito la lista dei pacchetti necessari per lo sviluppo del compito

library(moments)
library(ggplot2)
library(dplyr)
## 
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
## 
##     filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     intersect, setdiff, setequal, union
library(knitr)

Dataset

Il dataset è composto dalle seguenti colonne:

texas <- read.csv("realestate_texas.csv", sep=",")
summary(texas)
##      city                year          month           sales      
##  Length:240         Min.   :2010   Min.   : 1.00   Min.   : 79.0  
##  Class :character   1st Qu.:2011   1st Qu.: 3.75   1st Qu.:127.0  
##  Mode  :character   Median :2012   Median : 6.50   Median :175.5  
##                     Mean   :2012   Mean   : 6.50   Mean   :192.3  
##                     3rd Qu.:2013   3rd Qu.: 9.25   3rd Qu.:247.0  
##                     Max.   :2014   Max.   :12.00   Max.   :423.0  
##      volume        median_price       listings    months_inventory
##  Min.   : 8.166   Min.   : 73800   Min.   : 743   Min.   : 3.400  
##  1st Qu.:17.660   1st Qu.:117300   1st Qu.:1026   1st Qu.: 7.800  
##  Median :27.062   Median :134500   Median :1618   Median : 8.950  
##  Mean   :31.005   Mean   :132665   Mean   :1738   Mean   : 9.193  
##  3rd Qu.:40.893   3rd Qu.:150050   3rd Qu.:2056   3rd Qu.:10.950  
##  Max.   :83.547   Max.   :180000   Max.   :3296   Max.   :14.900
attach(texas)

1. Identifica e descrivi il tipo di variabili statistiche presenti nel dataset.

Valuta come gestire le variabili che sottintendono una dimensione tempo. commenta sul tipo di analisi che può essere condotta su ciascuna variabile.

names(texas)
## [1] "city"             "year"             "month"            "sales"           
## [5] "volume"           "median_price"     "listings"         "months_inventory"

Le variabili identificate

le variabili che sottoindendono una dimensione tempo sono year e month per poterle considerare senza andare a manipolare i dati andrebbero unite in una nuova colonna composta da entrambe la nuova colonna sarà di tipo Date e su questa potremo andare a fare plot o statistiche senza elaborare le altre colonne

tipologie di analisi trend temporale di: sales, volume, listings confronti tra città

2. 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.

per il calcolo dei vari indici consideriamo solamente le variabili quantitative andremo a creare una funzione che mi calcola gli indici selezionati e mi restituisce un vettore

index.for.col <- function(x){
  return (c(mean(x),median(x),max(x) - min(x),var(x),sd(x),sd(x)/mean(x),skewness(x),kurtosis(x) -3))
}

index.names <- c("mean","media","range","varianza","deviazione standard","CV","simmetria","curtosi")
index.sales <- index.for.col(sales)
index.volume <- index.for.col(volume)
index.median_price <- index.for.col(median_price)
index.listings <- index.for.col(listings)
index.months_inventory <- index.for.col(months_inventory)

con i vari indici andiamo a crearci una tabella per averli tutti in un unico dataframe

mat <- rbind(index.sales,
             index.volume,
             index.median_price,
             index.listings,
             index.months_inventory)

index_table <- as.data.frame(mat)
colnames(index_table) <- index.names
index_table
##                                mean       media      range     varianza
## index.sales               192.29167    175.5000    344.000 6.344300e+03
## index.volume               31.00519     27.0625     75.381 2.772707e+02
## index.median_price     132665.41667 134500.0000 106200.000 5.135730e+08
## index.listings           1738.02083   1618.5000   2553.000 5.665690e+05
## index.months_inventory      9.19250      8.9500     11.500 5.306889e+00
##                        deviazione standard        CV   simmetria    curtosi
## index.sales                      79.651111 0.4142203  0.71810402 -0.3131764
## index.volume                     16.651447 0.5370536  0.88474203  0.1769870
## index.median_price            22662.148687 0.1708218 -0.36455288 -0.6229618
## index.listings                  752.707756 0.4330833  0.64949823 -0.7917900
## index.months_inventory            2.303669 0.2506031  0.04097527 -0.1744475

le variabili qualitative restanti verranno utilizzare per calcolare distribuzione di frequenza anche in questo caso andremo a crearci una funzione che restituisca una tabella per ogni variabile interessata

freq.table <- function(x){
  N <- length(x)
  ni <- table(x)
  fi <- table(x)/N
  Ni <- cumsum(ni)
  Fi <- Ni/N
  return (cbind(ni,fi,Ni,Fi))
}

freq.city <- freq.table(city)
freq.city
##                       ni   fi  Ni   Fi
## Beaumont              60 0.25  60 0.25
## Bryan-College Station 60 0.25 120 0.50
## Tyler                 60 0.25 180 0.75
## Wichita Falls         60 0.25 240 1.00
freq.year <- freq.table(year)
freq.year
##      ni  fi  Ni  Fi
## 2010 48 0.2  48 0.2
## 2011 48 0.2  96 0.4
## 2012 48 0.2 144 0.6
## 2013 48 0.2 192 0.8
## 2014 48 0.2 240 1.0
freq.month <- freq.table(month)
freq.month
##    ni         fi  Ni         Fi
## 1  20 0.08333333  20 0.08333333
## 2  20 0.08333333  40 0.16666667
## 3  20 0.08333333  60 0.25000000
## 4  20 0.08333333  80 0.33333333
## 5  20 0.08333333 100 0.41666667
## 6  20 0.08333333 120 0.50000000
## 7  20 0.08333333 140 0.58333333
## 8  20 0.08333333 160 0.66666667
## 9  20 0.08333333 180 0.75000000
## 10 20 0.08333333 200 0.83333333
## 11 20 0.08333333 220 0.91666667
## 12 20 0.08333333 240 1.00000000

3. Identificazione delle variabili con maggiore variabilità e asimmetria

Determina:

maxvariabilità <- max(index_table$CV, na.rm = TRUE)   
maxvariabilità
## [1] 0.5370536
maxvasimmetrica <- max(abs(index_table$simmetria), na.rm = TRUE)
maxvasimmetrica
## [1] 0.884742

andando a calcolare il MAX CV-coefficientà di variazione andiamo a verificare la variabile con più variabilità andando a calcolare il MAX simmetria andiamo a calcolare la variabile più asimmetrica, in questo caso vado a considerare il valore assoluto poichè può esser anche un valore negativo in entrambi i casi la variabile è volume quindi vado a graficarla

plot(density(scale(volume)), col="red")
lines(density(scale(sales)), col="blue")
lines(density(scale(median_price)), col="lightblue")
lines(density(scale(listings)), col="black")
lines(density(scale(months_inventory)), col="yellow")

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.

grafico la distribuzione di sales per capire in quanti classi dividere

plot(density(sales), col="red")

creo una nuova colonna andando a dividere per classi

texas$salesCL <- cut(
  sales, 
  breaks = seq(50, 500, by = 50)
)

freq.salesCL <- freq.table(texas$salesCL)
freq.salesCL
##           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
## (450,500]  0 0.00000000 240 1.0000000

grafico la colonna appena creata in un grafico a barre

ggplot(texas)+
  geom_bar(
    aes(x=salesCL), 
    stat="count", 
    col="black",
    fill = "blue"
  )+ 
  theme_classic()

andiamo a calcolare l’indice di Gini

index.gini <- 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(texas$salesCL)
## 
##  (50,100] (100,150] (150,200] (200,250] (250,300] (300,350] (350,400] (400,450] 
##        21        72        56        32        34        13         9         3 
## (450,500] 
##         0
indexgini.sales <- index.gini(texas$salesCL)
indexgini.sales
## [1] 0.90625

il risultato dell’inidice di Gini è 0.90 quindi di fatto ho una distribuzione molto eterogenea con le classi identificate

5. Calcolo della probabilità

per andare a calcolarmi le probabilità devo andare a lavorare con le frequenze relative delle variabili occorre andare a crearmi la colonna mese anno per poter andare a gestire tutte alla stessa maniera

texas$month_year <- paste(month, year, sep = " ")
texas$month_year
##   [1] "1 2010"  "2 2010"  "3 2010"  "4 2010"  "5 2010"  "6 2010"  "7 2010" 
##   [8] "8 2010"  "9 2010"  "10 2010" "11 2010" "12 2010" "1 2011"  "2 2011" 
##  [15] "3 2011"  "4 2011"  "5 2011"  "6 2011"  "7 2011"  "8 2011"  "9 2011" 
##  [22] "10 2011" "11 2011" "12 2011" "1 2012"  "2 2012"  "3 2012"  "4 2012" 
##  [29] "5 2012"  "6 2012"  "7 2012"  "8 2012"  "9 2012"  "10 2012" "11 2012"
##  [36] "12 2012" "1 2013"  "2 2013"  "3 2013"  "4 2013"  "5 2013"  "6 2013" 
##  [43] "7 2013"  "8 2013"  "9 2013"  "10 2013" "11 2013" "12 2013" "1 2014" 
##  [50] "2 2014"  "3 2014"  "4 2014"  "5 2014"  "6 2014"  "7 2014"  "8 2014" 
##  [57] "9 2014"  "10 2014" "11 2014" "12 2014" "1 2010"  "2 2010"  "3 2010" 
##  [64] "4 2010"  "5 2010"  "6 2010"  "7 2010"  "8 2010"  "9 2010"  "10 2010"
##  [71] "11 2010" "12 2010" "1 2011"  "2 2011"  "3 2011"  "4 2011"  "5 2011" 
##  [78] "6 2011"  "7 2011"  "8 2011"  "9 2011"  "10 2011" "11 2011" "12 2011"
##  [85] "1 2012"  "2 2012"  "3 2012"  "4 2012"  "5 2012"  "6 2012"  "7 2012" 
##  [92] "8 2012"  "9 2012"  "10 2012" "11 2012" "12 2012" "1 2013"  "2 2013" 
##  [99] "3 2013"  "4 2013"  "5 2013"  "6 2013"  "7 2013"  "8 2013"  "9 2013" 
## [106] "10 2013" "11 2013" "12 2013" "1 2014"  "2 2014"  "3 2014"  "4 2014" 
## [113] "5 2014"  "6 2014"  "7 2014"  "8 2014"  "9 2014"  "10 2014" "11 2014"
## [120] "12 2014" "1 2010"  "2 2010"  "3 2010"  "4 2010"  "5 2010"  "6 2010" 
## [127] "7 2010"  "8 2010"  "9 2010"  "10 2010" "11 2010" "12 2010" "1 2011" 
## [134] "2 2011"  "3 2011"  "4 2011"  "5 2011"  "6 2011"  "7 2011"  "8 2011" 
## [141] "9 2011"  "10 2011" "11 2011" "12 2011" "1 2012"  "2 2012"  "3 2012" 
## [148] "4 2012"  "5 2012"  "6 2012"  "7 2012"  "8 2012"  "9 2012"  "10 2012"
## [155] "11 2012" "12 2012" "1 2013"  "2 2013"  "3 2013"  "4 2013"  "5 2013" 
## [162] "6 2013"  "7 2013"  "8 2013"  "9 2013"  "10 2013" "11 2013" "12 2013"
## [169] "1 2014"  "2 2014"  "3 2014"  "4 2014"  "5 2014"  "6 2014"  "7 2014" 
## [176] "8 2014"  "9 2014"  "10 2014" "11 2014" "12 2014" "1 2010"  "2 2010" 
## [183] "3 2010"  "4 2010"  "5 2010"  "6 2010"  "7 2010"  "8 2010"  "9 2010" 
## [190] "10 2010" "11 2010" "12 2010" "1 2011"  "2 2011"  "3 2011"  "4 2011" 
## [197] "5 2011"  "6 2011"  "7 2011"  "8 2011"  "9 2011"  "10 2011" "11 2011"
## [204] "12 2011" "1 2012"  "2 2012"  "3 2012"  "4 2012"  "5 2012"  "6 2012" 
## [211] "7 2012"  "8 2012"  "9 2012"  "10 2012" "11 2012" "12 2012" "1 2013" 
## [218] "2 2013"  "3 2013"  "4 2013"  "5 2013"  "6 2013"  "7 2013"  "8 2013" 
## [225] "9 2013"  "10 2013" "11 2013" "12 2013" "1 2014"  "2 2014"  "3 2014" 
## [232] "4 2014"  "5 2014"  "6 2014"  "7 2014"  "8 2014"  "9 2014"  "10 2014"
## [239] "11 2014" "12 2014"
freq.month_year <- freq.table(texas$month_year)
freq.month_year
##         ni         fi  Ni         Fi
## 1 2010   4 0.01666667   4 0.01666667
## 1 2011   4 0.01666667   8 0.03333333
## 1 2012   4 0.01666667  12 0.05000000
## 1 2013   4 0.01666667  16 0.06666667
## 1 2014   4 0.01666667  20 0.08333333
## 10 2010  4 0.01666667  24 0.10000000
## 10 2011  4 0.01666667  28 0.11666667
## 10 2012  4 0.01666667  32 0.13333333
## 10 2013  4 0.01666667  36 0.15000000
## 10 2014  4 0.01666667  40 0.16666667
## 11 2010  4 0.01666667  44 0.18333333
## 11 2011  4 0.01666667  48 0.20000000
## 11 2012  4 0.01666667  52 0.21666667
## 11 2013  4 0.01666667  56 0.23333333
## 11 2014  4 0.01666667  60 0.25000000
## 12 2010  4 0.01666667  64 0.26666667
## 12 2011  4 0.01666667  68 0.28333333
## 12 2012  4 0.01666667  72 0.30000000
## 12 2013  4 0.01666667  76 0.31666667
## 12 2014  4 0.01666667  80 0.33333333
## 2 2010   4 0.01666667  84 0.35000000
## 2 2011   4 0.01666667  88 0.36666667
## 2 2012   4 0.01666667  92 0.38333333
## 2 2013   4 0.01666667  96 0.40000000
## 2 2014   4 0.01666667 100 0.41666667
## 3 2010   4 0.01666667 104 0.43333333
## 3 2011   4 0.01666667 108 0.45000000
## 3 2012   4 0.01666667 112 0.46666667
## 3 2013   4 0.01666667 116 0.48333333
## 3 2014   4 0.01666667 120 0.50000000
## 4 2010   4 0.01666667 124 0.51666667
## 4 2011   4 0.01666667 128 0.53333333
## 4 2012   4 0.01666667 132 0.55000000
## 4 2013   4 0.01666667 136 0.56666667
## 4 2014   4 0.01666667 140 0.58333333
## 5 2010   4 0.01666667 144 0.60000000
## 5 2011   4 0.01666667 148 0.61666667
## 5 2012   4 0.01666667 152 0.63333333
## 5 2013   4 0.01666667 156 0.65000000
## 5 2014   4 0.01666667 160 0.66666667
## 6 2010   4 0.01666667 164 0.68333333
## 6 2011   4 0.01666667 168 0.70000000
## 6 2012   4 0.01666667 172 0.71666667
## 6 2013   4 0.01666667 176 0.73333333
## 6 2014   4 0.01666667 180 0.75000000
## 7 2010   4 0.01666667 184 0.76666667
## 7 2011   4 0.01666667 188 0.78333333
## 7 2012   4 0.01666667 192 0.80000000
## 7 2013   4 0.01666667 196 0.81666667
## 7 2014   4 0.01666667 200 0.83333333
## 8 2010   4 0.01666667 204 0.85000000
## 8 2011   4 0.01666667 208 0.86666667
## 8 2012   4 0.01666667 212 0.88333333
## 8 2013   4 0.01666667 216 0.90000000
## 8 2014   4 0.01666667 220 0.91666667
## 9 2010   4 0.01666667 224 0.93333333
## 9 2011   4 0.01666667 228 0.95000000
## 9 2012   4 0.01666667 232 0.96666667
## 9 2013   4 0.01666667 236 0.98333333
## 9 2014   4 0.01666667 240 1.00000000
pBea <- freq.city["Beaumont",2]*100
pBea
## [1] 25

il risultato è un 25%, al volo per verificare vado a graficare istogrammi delle città

ggplot(texas)+
  geom_bar(
    aes(x=city), 
    stat="count", 
    col="black",
    fill = "blue"
  )+ 
  theme_classic()

pJul <- freq.month[7,2]*100
pJul
## [1] 8.333333
pDec12 <- freq.month_year["12 2012",2]*100
pDec12
## [1] 1.666667

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.

per calcolare il prezzo medio degli immobili posso considerare due variabili, il volume delle vendite ed il numero di vendite - sales

texas$midprice <- volume/sales
texas[which.max(texas$midprice),]
##                      city year month sales volume median_price listings
## 118 Bryan-College Station 2014    10   218 46.485       176100     1031
##     months_inventory   salesCL month_year  midprice
## 118                4 (200,250]    10 2014 0.2132339
texas[which.min(texas$midprice),]
##              city year month sales volume median_price listings
## 202 Wichita Falls 2011    10    98  9.507        73800      963
##     months_inventory  salesCL month_year  midprice
## 202              8.8 (50,100]    10 2011 0.0970102

per calcolare l’efficacia degli annunci posso considerare due variabili, il numero di vendite - sales ed il numero di annunci attivi - listings

texas$efficiency <- sales/listings
texas[which.max(texas$efficiency),]
##                      city year month sales volume median_price listings
## 115 Bryan-College Station 2014     7   403 83.547       172600     1041
##     months_inventory   salesCL month_year  midprice efficiency
## 115              4.1 (400,450]     7 2014 0.2073127  0.3871278
texas[which.min(texas$efficiency),]
##      city year month sales volume median_price listings months_inventory
## 133 Tyler 2011     1   143  21.05       120600     2852             12.6
##       salesCL month_year  midprice efficiency
## 133 (100,150]     1 2011 0.1472028 0.05014025

per calcolare l’efficacia degli annunci posso anche considerare quanti mesi sono necessari a smaltire l’inventario, più è basso più sono efficacie

texas$conversion <- 1/months_inventory
texas[which.max(texas$conversion),]
##                      city year month sales volume median_price listings
## 120 Bryan-College Station 2014    12   200 42.553       177300      882
##     months_inventory   salesCL month_year midprice efficiency conversion
## 120              3.4 (150,200]    12 2014 0.212765  0.2267574  0.2941176
texas[which.min(texas$conversion),]
##      city year month sales volume median_price listings months_inventory
## 137 Tyler 2011     5   271 46.763       136100     3266             14.9
##       salesCL month_year  midprice efficiency conversion
## 137 (250,300]     5 2011 0.1725572 0.08297612 0.06711409

con le nuove colonne posso di fatto andare a valutare i KPI raggruppati per città, anno, mese posso andare a controllare i dati all’interno della tabella

possiamo ad esempio ad andare a calcolarci la distribuzione dei prezzi medi

ggplot(texas, aes(x = midprice)) +
  geom_density() +
  labs(title = "Distribuzione del Prezzo Medio (log10)",
       x = "Prezzo Medio (log10)",
       y = "Densità") +
  theme_minimal()

piuttosto che metter in relazione i due indici di efficienza in un grafico a dispersione

ggplot(texas, aes(x = efficiency, y = conversion)) +
  geom_point(alpha = 0.4, col="red") +
  labs(title = "Efficienza annunci vs Velocità di assorbimento",
       x = "Efficiency (sales/listings)",
       y = "Conversion (1 / months_inventory)") +
  theme_minimal()

in realtà calcolato come sopra il dettaglio è un pò troppo granulare occorrerebbe raggruppare in maniera custom

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.

mi creo i vari groupby e poi mi andrò a creare una tabella unica in cui vado ad indicare media e deviazione standard di tutti

gbycity <- texas %>%
  group_by(city)%>%
  summarise(volume = sum(volume), 
            sales=sum(sales),
            avgprice = volume/sales,
            listings = sum(listings),
            efficiency = sales/listings,
            months_inventory = sum(months_inventory),
            conversion=1/months_inventory)

gbyyear <- texas %>%
  group_by(year)%>%
  summarise(volume = sum(volume), 
            sales=sum(sales),
            avgprice = volume/sales,
            listings = sum(listings),
            efficiency = sales/listings,
            months_inventory = sum(months_inventory),
            conversion=1/months_inventory)

gbycityyear <- texas %>%
  group_by(city,year)%>%
  summarise(volume = sum(volume), 
            sales=sum(sales),
            avgprice = volume/sales,
            listings = sum(listings),
            efficiency = sales/listings,
            months_inventory = sum(months_inventory),
            conversion=1/months_inventory)
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
gbymonth <- texas %>%
  group_by(month)%>%
  summarise(volume = sum(volume), 
            sales=sum(sales),
            avgprice = volume/sales,
            listings = sum(listings),
            efficiency = sales/listings,
            months_inventory = sum(months_inventory),
            conversion=1/months_inventory)

gbycitymonth <- texas %>%
  group_by(city,month)%>%
  summarise(volume = sum(volume), 
            sales=sum(sales),
            avgprice = volume/sales,
            listings = sum(listings),
            efficiency = sales/listings,
            months_inventory = sum(months_inventory),
            conversion=1/months_inventory)
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
summary(gbycity)
##      city               volume           sales          avgprice     
##  Length:4           Min.   : 835.8   Min.   : 6964   Min.   :0.1200  
##  Class :character   1st Qu.:1384.9   1st Qu.: 9723   1st Qu.:0.1405  
##  Mode  :character   Median :1929.7   Median :11500   Median :0.1585  
##                     Mean   :1860.3   Mean   :11538   Mean   :0.1556  
##                     3rd Qu.:2405.1   3rd Qu.:13315   3rd Qu.:0.1736  
##                     Max.   :2746.0   Max.   :16185   Max.   :0.1854  
##     listings        efficiency      months_inventory   conversion      
##  Min.   : 54575   Min.   :0.09286   Min.   :459.5    Min.   :0.001472  
##  1st Qu.: 79260   1st Qu.:0.10244   1st Qu.:466.6    1st Qu.:0.001622  
##  Median : 94124   Median :0.11662   Median :533.6    Median :0.001902  
##  Mean   :104281   Mean   :0.11684   Mean   :551.5    Mean   :0.001863  
##  3rd Qu.:119145   3rd Qu.:0.13102   3rd Qu.:618.5    3rd Qu.:0.002143  
##  Max.   :174303   Max.   :0.14125   Max.   :679.5    Max.   :0.002176
summary(gbyyear)
##       year          volume         sales          avgprice         listings    
##  Min.   :2010   Min.   :1208   Min.   : 7878   Min.   :0.1522   Min.   :74882  
##  1st Qu.:2011   1st Qu.:1232   1st Qu.: 8096   1st Qu.:0.1533   1st Qu.:80525  
##  Median :2012   Median :1405   Median : 8935   Median :0.1572   Median :85287  
##  Mean   :2012   Mean   :1488   Mean   : 9230   Mean   :0.1602   Mean   :83425  
##  3rd Qu.:2013   3rd Qu.:1687   3rd Qu.:10172   3rd Qu.:0.1659   3rd Qu.:87648  
##  Max.   :2014   Max.   :1909   Max.   :11069   Max.   :0.1725   Max.   :88783  
##    efficiency      months_inventory   conversion      
##  Min.   :0.08873   Min.   :338.7    Min.   :0.001911  
##  1st Qu.:0.09237   1st Qu.:391.2    1st Qu.:0.002089  
##  Median :0.10476   Median :474.2    Median :0.002109  
##  Mean   :0.11200   Mean   :441.2    Mean   :0.002323  
##  3rd Qu.:0.12632   3rd Qu.:478.7    3rd Qu.:0.002556  
##  Max.   :0.14782   Max.   :523.4    Max.   :0.002952
summary(gbycityyear)
##      city                year          volume          sales     
##  Length:20          Min.   :2010   Min.   :144.6   Min.   :1275  
##  Class :character   1st Qu.:2011   1st Qu.:234.8   1st Qu.:1666  
##  Mode  :character   Median :2012   Median :355.4   Median :2212  
##                     Mean   :2012   Mean   :372.1   Mean   :2308  
##                     3rd Qu.:2013   3rd Qu.:479.0   3rd Qu.:2857  
##                     Max.   :2014   Max.   :715.2   Max.   :3978  
##     avgprice         listings       efficiency      months_inventory
##  Min.   :0.1134   Min.   :10092   Min.   :0.07456   Min.   : 52.60  
##  1st Qu.:0.1378   1st Qu.:12883   1st Qu.:0.09887   1st Qu.: 92.08  
##  Median :0.1552   Median :19294   Median :0.11562   Median :105.25  
##  Mean   :0.1547   Mean   :20856   Mean   :0.11896   Mean   :110.31  
##  3rd Qu.:0.1734   3rd Qu.:23742   3rd Qu.:0.12984   3rd Qu.:129.78  
##  Max.   :0.2029   Max.   :36836   Max.   :0.23520   Max.   :161.60  
##    conversion      
##  Min.   :0.006188  
##  1st Qu.:0.007706  
##  Median :0.009501  
##  Mean   :0.009668  
##  3rd Qu.:0.010861  
##  Max.   :0.019011
summary(gbymonth)
##      month           volume          sales         avgprice     
##  Min.   : 1.00   Min.   :380.0   Min.   :2548   Min.   :0.1491  
##  1st Qu.: 3.75   1st Qu.:530.5   1st Qu.:3325   1st Qu.:0.1568  
##  Median : 6.50   Median :589.8   Median :3718   Median :0.1608  
##  Mean   : 6.50   Mean   :620.1   Mean   :3846   Mean   :0.1603  
##  3rd Qu.: 9.25   3rd Qu.:765.8   3rd Qu.:4650   3rd Qu.:0.1647  
##  Max.   :12.00   Max.   :826.1   Max.   :4871   Max.   :0.1696  
##     listings       efficiency      months_inventory   conversion      
##  Min.   :31155   Min.   :0.07735   Min.   :162.3    Min.   :0.005144  
##  1st Qu.:33651   1st Qu.:0.10193   1st Qu.:178.3    1st Qu.:0.005192  
##  Median :35056   Median :0.10830   Median :185.8    Median :0.005384  
##  Mean   :34760   Mean   :0.11002   Mean   :183.8    Mean   :0.005454  
##  3rd Qu.:36437   3rd Qu.:0.12948   3rd Qu.:192.6    3rd Qu.:0.005609  
##  Max.   :36665   Max.   :0.13285   Max.   :194.4    Max.   :0.006161
summary(gbycitymonth)
##      city               month           volume           sales       
##  Length:48          Min.   : 1.00   Min.   : 46.68   Min.   : 442.0  
##  Class :character   1st Qu.: 3.75   1st Qu.: 85.37   1st Qu.: 668.2  
##  Mode  :character   Median : 6.50   Median :141.88   Median : 890.0  
##                     Mean   : 6.50   Mean   :155.03   Mean   : 961.5  
##                     3rd Qu.: 9.25   3rd Qu.:217.28   3rd Qu.:1237.5  
##                     Max.   :12.00   Max.   :296.22   Max.   :1635.0  
##     avgprice         listings       efficiency      months_inventory
##  Min.   :0.1056   Min.   : 4147   Min.   :0.06641   Min.   :31.60   
##  1st Qu.:0.1364   1st Qu.: 5824   1st Qu.:0.09647   1st Qu.:38.88   
##  Median :0.1547   Median : 8078   Median :0.11133   Median :45.50   
##  Mean   :0.1552   Mean   : 8690   Mean   :0.11625   Mean   :45.96   
##  3rd Qu.:0.1767   3rd Qu.: 9846   3rd Qu.:0.12671   3rd Qu.:52.02   
##  Max.   :0.1972   Max.   :15480   Max.   :0.20756   Max.   :60.10   
##    conversion     
##  Min.   :0.01664  
##  1st Qu.:0.01922  
##  Median :0.02198  
##  Mean   :0.02246  
##  3rd Qu.:0.02572  
##  Max.   :0.03165
summary.group.names <- function(x)
{
  return (c(
    "sdavgprice",
    "meanavgprice",
    "sdefficiency",
    "meanefficiency",
    "sdconversion",
    "meanconversion"
  ))
}

summary.group <- function(x)
{
  return (c(
    sd(x$avgprice),
    mean(x$avgprice),
    sd(x$efficiency),
    mean(x$efficiency),
    sd(x$conversion),
    mean(x$conversion)
  ))  
}

groupsummary <- cbind(
  summary.group.names(),
  summary.group(gbycity), 
  summary.group(gbyyear), 
  summary.group(gbycityyear), 
  summary.group(gbymonth), 
  summary.group(gbycitymonth)
)

colnames(groupsummary) <- c(
  "Stat",
  "ByCity",
  "ByYear",
  "ByCityYear",
  "ByMonth",
  "ByCityMonth"
)

groupsummary
##      Stat             ByCity                 ByYear                
## [1,] "sdavgprice"     "0.0284141105434226"   "0.00870323469586068" 
## [2,] "meanavgprice"   "0.155606955810223"    "0.160218113585296"   
## [3,] "sdefficiency"   "0.0217013950438492"   "0.0248353142947629"  
## [4,] "meanefficiency" "0.116835424506986"    "0.112001370007344"   
## [5,] "sdconversion"   "0.000346579288777345" "0.000424660809629038"
## [6,] "meanconversion" "0.00186295669583692"  "0.00232341860592824" 
##      ByCityYear            ByMonth                ByCityMonth          
## [1,] "0.0257028973127548"  "0.00590071468042182"  "0.0258141856868446" 
## [2,] "0.154694747158543"   "0.160279029870983"    "0.155170840804305"  
## [3,] "0.0362705521425967"  "0.0186631126610666"   "0.0310912066200325" 
## [4,] "0.118962203584701"   "0.110024892535334"    "0.116245258897858"  
## [5,] "0.00283452239973583" "0.000306926061608381" "0.00406948714989309"
## [6,] "0.0096679727393639"  "0.00545431592002222"  "0.022464167032173"

faccio alcuni grafici che possono fare un idea di come è possibile raffiguarare i risultati

ggplot(gbycity) +
  geom_bar(
    aes(x = city, y = avgprice), 
    stat = "identity", 
    col = "black",
    fill = "blue"
  ) +
  theme_classic()

ggplot(gbycityyear) +
  geom_bar(
    aes(x = city, y = avgprice, fill = factor(year)), 
    position = position_dodge(width = 0.8),
    stat = "identity", 
    col = "black"
  ) +
  labs(fill = "Anno") +
  theme_classic()

ggplot(gbycityyear) +
  geom_bar(
    aes(x = city, y = avgprice, fill = year), 
    stat = "identity", 
    col = "black"
  ) +
  theme_classic()

8. Creazione di visualizzazioni con ggplot2

Utilizza ggplot2 per creare grafici personalizzati. Assicurati di esplorare:

ggplot(data= texas)+
  geom_boxplot(aes(y=median_price,x=city))

ggplot(data= texas)+
  geom_bar(aes(x=month, y=sales, fill=factor(city)), stat = "identity", position = "stack")+
  scale_x_continuous(breaks = sort(unique(month)))

ggplot(data= texas)+
  geom_bar(aes(x=month, y=sales, fill=factor(city)), stat = "identity", position = "dodge")+
  scale_x_continuous(breaks = sort(unique(month)))

in questo caso lo faccio in due modi, prima con le città sulla stessa barra così da capire l’andamento delle vendite rispetto ai mesi, poi con le città affiancate così da verificare chi è la città che vende di più

ggplot(data= texas)+
  geom_bar(aes(x=month, y=sales, fill=factor(year)), stat = "identity", position = "dodge")+
  scale_x_continuous(breaks = sort(unique(month)))

aggiungo il grafico che tiene anche in considerazione il raggruppamento per anno, in questo modo in ogni mese so qual’è l’anno migliore

graph.hist <- function(x, incity)
{
  return(
    x %>%
      filter(city == incity) %>%
        ggplot(aes(x = month, y = sales, color = factor(year), group = year)) +
        geom_line(linewidth = 1) +
        scale_x_continuous(breaks = 1:12) +
        scale_color_viridis_d(
          name = "Anno",     # legenda con anni
          option = "plasma"  # gradazione colori
        ) +
        labs(
          title = paste("Andamento mensile delle vendite:",incity),
          x = "Mese",
          y = "Vendite"
        ) +
        theme_minimal()
  )
}

cities <- unique(city)
graph.hist(texas, cities[1])

graph.hist(texas, cities[2])

graph.hist(texas, cities[3])

graph.hist(texas, cities[4])

in questo caso ho creato una funzione che restituisca un grafico con i trend delle vendite per anno, poi ho passato i valori univoci della colonna city come input

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.

L’analisi del dataset immobiliare texano ha evidenziato differenze tra le città e nel tempo. Bryan–College Station è il mercato più costoso, con prezzi mediani alti ed un mercato in crescita nel periodo considerato. Wichita Falls presenta i prezzi più bassi ed un mercato più stagnante. Tyler ha valori intermedi, anch’essi in crescita costante. Beaumont dopo un calo iniziale è in ripresa Analizzando i boxplot si ha una maggiore dispersione dei prezzi in alcune città come Wichita Falls in certi anni e una minore in altre come in Bryan–College Station. Analizzando le vendite esista una stagionalità, picci in estate e cali drastici a gennaio e febbraio. La variabile volume è risultata la più variabile e la più asimmetrica, segno di grandi differenze nei valori totali di vendita tra osservazioni. L’indice di Gini applicato alle classi di sales ha evidenziato un’alta eterogeneità nella distribuzione delle vendite. Nei grafici normalizzati, Bryan–College Station mantiene una quota importante delle vendite in quasi tutti i mesi, Wichita Falls al contrario contribuisce poco alle vendite complessive, senza variazioni significative

Osservazioni operative

Alcune considerazioni:

  1. Utilizza i boxplot per confrontare la distribuzione del prezzo mediano delle case tra le varie città. Commenta il risultato.
ggplot(data= texas)+
  geom_boxplot(aes(y=median_price,x=city))

dall’analisi dei boxplot si evince ce la città con i prezzi più bassi è wichita falls, quella con i prezzi più alti bryan-college. in tutte le città a meno di Tyler ci sono outlayer ne o male in tutte le città la distribuzione non è perfettamente simmetrica

  1. Utilizza i boxplot o qualche variante per confrontare la distribuzione del valore totale delle vendite tra le varie città ma anche tra i vari anni. Qualche considerazione da fare?
ggplot(data= texas)+
  geom_boxplot(aes(y=median_price,x=city, fill=factor(year)))

se vado a suddividere i vari boxplot in ufunzione dellìanno ci possiamo render conto che il mercato è cresciuto negli anni a Bryan-college e tyler, ha subito una perdita ma sta crescendo in beamont, è cresciuto molto meno a wichita falls a wichita falls il range dei prezzi è anche più variabile durante l’anno rispetto ad altre città, bryan college è quello che ha i prezzi con meno dispersione gli outlaier sono presenti solamente alcuni anni, non sempre

  1. Usa un grafico a barre sovrapposte per confrontare il totale delle vendite nei vari mesi, sempre considerando le città. Prova a commentare ciò che viene fuori.
ggplot(texas) +
    geom_bar(aes(x = month, y = sales, fill = factor(city)), stat = "identity", position = "stack") +
    scale_x_continuous(breaks = 1:12) 

di fatto si evidenzia che le vendite hanno un incremento da Marzo fino a Maggio, rimangono stabili fino a ad Agosto e poi decrementano. i mesi peggiori sono gennaio e febbraio faccio fatica a fare valutazioni dul contributo sulle singole città

3a. Già che ci sei prova anche il grafico a barre normalizzato.

ggplot(texas) +
  geom_bar(aes(x = month, y = sales, fill = factor(city)), stat = "identity", position = "fill") +
  scale_x_continuous(breaks = 1:12) 

con questo grafico perdo l’informazione sul mese che ha vendite maggiori ma guadagno informazione su quali città contribuiscono di più nel mese rispetto ad altre

Consiglio: Stai attento alla differenza tra geombar() e geomcol().

3b. PRO LEVEL: cerca un modo intelligente per inserire ANCHE la variabile Year allo stesso blocco di codice, senza però creare accrocchi nel grafico.

ggplot(texas) +
  geom_bar(aes(x = factor(month), 
               y = sales, 
               fill = factor(city), 
               group = interaction(year, city)), 
           stat = "identity", 
           position = position_dodge()) +
  labs(x = "Mese", y = "Vendite totali", fill = "Città") +
  scale_x_discrete(breaks = 1:12)

vado a separare per gli anni, avrebbe più senso un grafico con una barra per mese.anno e li la separazione per città ma non sono riuscito ad ottenerlo senza aggiungere colonne

  1. Prova a creare un line chart di una variabile a tua scelta per fare confronti commentati fra città e periodi storici. Ti avviso che probabilmente all’inizio ti verranno fuori linee storte e poco chiare, ma non demordere.
ggplot(subset(texas, city == "Tyler")) +
  geom_line(aes(x = month, y = listings, color = factor(year), group = year), linewidth = 1) +
  scale_x_continuous(breaks = 1:12) +
  scale_color_viridis_d(
    name = "Anno",     # legenda con anni
    option = "plasma"  # gradazione colori
  ) +
  theme_minimal()

ho usato listings ed ho filtrato per una specifica città

ggplot(texas) +
  geom_line(aes(x = month, y = listings, color = factor(year), group = year), linewidth = 1) +
  scale_x_continuous(breaks = 1:12) +
  scale_color_viridis_d(
    name = "Anno",     # legenda con anni
    option = "plasma"  # gradazione colori
  ) +
  facet_wrap(~ city)

ho usato i facetwrap per metter tutte le città all’interno dello stesso grafico

ggplot(texas) +
  geom_line(aes(x = month, 
                y = sales, 
                color = factor(year), 
                linetype = city, 
                group = interaction(city, year)), 
            linewidth = 1) +
  scale_x_continuous(breaks = 1:12)

ho messo tutto all’interno dello stesso grafico è poco leggibile ma permette di fare confronti diretti