R Packages

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

library(moments, warn.conflicts = FALSE)
library(ggplot2, warn.conflicts = FALSE)
library(dplyr, warn.conflicts = FALSE)
library(knitr, warn.conflicts = FALSE)
options(dplyr.summarise.inform = FALSE)

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
kable(head(index_table, 10),  digits = 2,  caption = "index_table")
index_table
mean media range varianza deviazione standard CV simmetria curtosi
index.sales 192.29 175.50 344.00 6.34430e+03 79.65 0.41 0.72 -0.31
index.volume 31.01 27.06 75.38 2.77270e+02 16.65 0.54 0.88 0.18
index.median_price 132665.42 134500.00 106200.00 5.13573e+08 22662.15 0.17 -0.36 -0.62
index.listings 1738.02 1618.50 2553.00 5.66569e+05 752.71 0.43 0.65 -0.79
index.months_inventory 9.19 8.95 11.50 5.31000e+00 2.30 0.25 0.04 -0.17

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.year <- freq.table(year)
kable(head(freq.year, 10),  digits = 2, caption = "freq.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

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(listings)), col="red")
lines(density(scale(sales)), col="blue")
lines(density(scale(median_price)), col="lightblue")
lines(density(scale(volume)), col="black")
lines(density(scale(months_inventory)), col="yellow")
grid(col="gray80", lty="dotted")
legend("topright", 
       legend = c("Listings", "Sales", "Median Price", "Volume", "Months Inventory"),
       col    = c("red", "blue", "lightblue", "black", "yellow"),
       lwd    = 2,
       bty    = "n")  

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 = 100)
)

freq.salesCL <- freq.table(texas$salesCL)
kable(head(freq.salesCL, 10),  digits = 2, caption="freq.salesCL")
freq.salesCL
ni fi Ni Fi
(50,150] 93 0.39 93 0.39
(150,250] 88 0.37 181 0.75
(250,350] 47 0.20 228 0.95
(350,450] 12 0.05 240 1.00

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,150] (150,250] (250,350] (350,450] 
##        93        88        47        12
indexgini.sales <- index.gini(texas$salesCL)
kable(head(indexgini.sales, 10),  digits = 2, caption="indexgini.sales")
indexgini.sales
x
0.9

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

5. Calcolo della probabilità

Per calcolare le probabilità devo andare a lavorare con le frequenze relative delle variabili, devo quindi per prima cosa crearmi le tabelle delle frequenze

freq.city <- freq.table(texas$city)
kable(head(freq.city, 10),  digits = 2, caption="freq.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
pBea <- freq.city["Beaumont",2]*100
pBea
## [1] 25

La probabilità che presa una riga a caso essa riporti città Beaumont è il 25%.

freq.month <- freq.table(texas$month)
kable(head(freq.month, 10),  digits = 2, caption="freq.month")
freq.month
ni fi Ni Fi
20 0.08 20 0.08
20 0.08 40 0.17
20 0.08 60 0.25
20 0.08 80 0.33
20 0.08 100 0.42
20 0.08 120 0.50
20 0.08 140 0.58
20 0.08 160 0.67
20 0.08 180 0.75
20 0.08 200 0.83
pJul <- freq.month[7,2]*100
pJul
## [1] 8.333333

La probabilità che presa una riga a caso essa riporti mese di Luglio è il 8.3%.

texas$month_year <- paste(month, year, sep = " ")
kable(head(texas$month_year, 10),  digits = 2, caption="month_year")
month_year
x
1 2010
2 2010
3 2010
4 2010
5 2010
6 2010
7 2010
8 2010
9 2010
10 2010
freq.month_year <- freq.table(texas$month_year)
kable(head(freq.month_year, 10),  digits = 2, caption="freq.month_year")
freq.month_year
ni fi Ni Fi
1 2010 4 0.02 4 0.02
1 2011 4 0.02 8 0.03
1 2012 4 0.02 12 0.05
1 2013 4 0.02 16 0.07
1 2014 4 0.02 20 0.08
10 2010 4 0.02 24 0.10
10 2011 4 0.02 28 0.12
10 2012 4 0.02 32 0.13
10 2013 4 0.02 36 0.15
10 2014 4 0.02 40 0.17
pDec12 <- freq.month_year["12 2012",2]*100
pDec12
## [1] 1.666667

La probabilità che presa una riga a caso essa riporti mese di Dicembre 2012 è il 1.6%.

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 (150,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,150]    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 (350,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 (50,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,250]    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,350]     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 che rappresenteranno le varie staristiche condizionate per città, mese ed anno. Creerò con i risultati una tabella unica in cui andrò 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)

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)

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


kable(head(groupsummary, 10),  digits = 2, caption="groupsummary")
groupsummary
Stat ByCity ByYear ByCityYear ByMonth ByCityMonth
sdavgprice 0.0284141105434226 0.00870323469586068 0.0257028973127548 0.00590071468042182 0.0258141856868446
meanavgprice 0.155606955810223 0.160218113585296 0.154694747158543 0.160279029870983 0.155170840804305
sdefficiency 0.0217013950438492 0.0248353142947629 0.0362705521425967 0.0186631126610666 0.0310912066200325
meanefficiency 0.116835424506986 0.112001370007344 0.118962203584701 0.110024892535334 0.116245258897858
sdconversion 0.000346579288777345 0.000424660809629038 0.00283452239973583 0.000306926061608381 0.00406948714989309
meanconversion 0.00186295669583692 0.00232341860592824 0.0096679727393639 0.00545431592002222 0.022464167032173

vado a graficare un bar graph con avgprice raggruppato per città. Questo mi permette di identificare la città con avgprice maggiore.

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

vado a graficare un bar graph con avgprice raggruppato per città, questa volta però vado a differenziare per anni. Questo mi permette di identificare la città con avgprice maggiore e mi permette anche di verificare il trend durante gli anni.

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

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

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

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

se vado a suddividere i vari boxplot in funzione 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

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à

Vado a normalizzare il grafico.

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

Provo ad aggiungere informazione dell’anno nel grafico non normalizzato

ggplot(texas) +
    geom_bar(aes(x = month, y = sales, fill = factor(city)), stat = "identity", position = "stack") +
    scale_x_continuous(breaks = 1:12) +
  facet_wrap(~year, ncol = 2) + 
  theme_minimal()  

Per maggior chiarezza vado a differenziare affiancando i contributi delle singole città

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

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

rifaccio una trenline con un altra variabile inserendo i grafici di tutte le città in un unico

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)

usando i facetwrap riesco ad unire tuttp all’interno dello stesso

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)

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.

  1. L’analisi del dataset immobiliare texano ha evidenziato differenze tra le città e nel tempo.
  1. 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.

  2. Analizzando le vendite esista una stagionalità, picci in estate e cali drastici a gennaio e febbraio.

  3. La variabile volume è risultata la più variabile e la più asimmetrica, segno di grandi differenze nei valori totali di vendita tra osservazioni.

  4. L’indice di Gini applicato alle classi di sales ha evidenziato un’alta eterogeneità nella distribuzione delle vendite.

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