options(repos = c(CRAN = "https://cran.rstudio.com/"))

Progetto finale di statistica descrittiva

1. Analisi delle variabili

getwd()
## [1] "C:/Users/Gianpiero/Dati Salvati/Desktop/master data science/1 - Statistica descrittiva"
dati<- read.csv("realestate_texas.csv")
dim(dati)
## [1] 240   8
N<-dim(dati)[1]

freq_ass_city<- table(dati$city)

Il dataframe contiene 240 osservazioni per 8 variabili.

Le 8 variabili sono così definite:

  1. city: qualitativa nominale
  2. year: quantitativa continua, trattata come qualitativa ordinale
  3. month: qualitativa nominale (ciclica), codificata in numeri
  4. sales: quantitativa discreta
  5. volume: quantitativa continua
  6. median_price: quantitativa continua
  7. listings: quantitativa discreta
  8. months_inventory: quantitativa continua

Le variabili quantitative continue sono su scala di rapporti.

La frequenza assoluta delle osservazioni è uguale per la variabile qualitativa analizzata “city”.

Le analisi possono essere condotte su serie temporali concatenando mese e anno per utilizzarle nei grafici e nelle analisi statistiche.

2. Indici di posizione, variabilità e forma

getwd()
## [1] "C:/Users/Gianpiero/Dati Salvati/Desktop/master data science/1 - Statistica descrittiva"
dati <- read.csv("realestate_texas.csv")

attach(dati)
installed.packages("knitr")
##      Package LibPath Version Priority Depends Imports LinkingTo Suggests
##      Enhances License License_is_FOSS License_restricts_use OS_type Archs
##      MD5sum NeedsCompilation Built
library(knitr)
kable(table(city))
city Freq
Beaumont 60
Bryan-College Station 60
Tyler 60
Wichita Falls 60

La variabile qualitativa city è definibile quadrimodale.

summary(dati)
##      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

Le variabili “sales”, “listings” e “months_inventory” mostrano una mediana maggiore della media, che indica un’asimmetria positiva ovvero la presenza di alcuni valori molto alti che spostano la media verso l’alto, mentre la maggior parte dei dati si concentra su valori più bassi. Tale deduzione è confermata dalla distribuzione di frequenza della variabile “sales”.

La variabile “median_price”, al contrario, mostra un’asimmetria negativa.

dati <- read.csv("realestate_texas.csv")

attach(dati)
## I seguenti oggetti sono mascherati da dati (pos = 4):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
IQR(median_price)
## [1] 32750
IQR(sales)
## [1] 120

L’IQR indica la distanza fra il terzo quartile e il primo quartile della variabile in esame

n<-length(sales)
mu<-mean(sales)

sd(sales)
## [1] 79.65111
sd(median_price)
## [1] 22662.15
CV<-function(x){
    return(sd(x)/mean(x)*100)
}


CV(sales)
## [1] 41.42203
CV(median_price)
## [1] 17.08218

Il Coefficiente di Variazone permette di confrontare la variabilità fra più variabili in quanto espirme la stessa in maniera relativa rispetto alla media. Per le variabili prese in esame possiamo concludere che la variabile “median_price” ha una variabilità del 17% rispetto alla propria media che risulta più bassa rispetto alla variabilità della variabile “sales” uguale al 41% della propria media.

3. Identificazione delle variabili con maggiore variabilità e asimmetria

install.packages("moments")
## Installazione pacchetto in 'C:/Users/Gianpiero/AppData/Local/R/win-library/4.5'
## (perché 'lib' non è specificato)
## pacchetto 'moments' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\Gianpiero\AppData\Local\Temp\Rtmpa2nFPO\downloaded_packages
library(moments)

variabili <- c("sales", "median_price","volume", "months_inventory")

for (var in variabili) {
  norm_values <- rnorm(length(get(var)), mean(get(var)), sd(get(var)))
  
  plot(density(norm_values), main = paste("Densità di", var))
  abline(v = mean(get(var)), col = 3)
  cat("CV di", var, ":", CV(get(var)), "\n")
  cat("L'asimmetria per la variabile", var, "è:", skewness(get(var)), "\n")
  cat("La curtosi della variabile ", var, "è:", kurtosis(get(var)) - 3, "\n")
}

## CV di sales : 41.42203 
## L'asimmetria per la variabile sales è: 0.718104 
## La curtosi della variabile  sales è: -0.3131764

## CV di median_price : 17.08218 
## L'asimmetria per la variabile median_price è: -0.3645529 
## La curtosi della variabile  median_price è: -0.6229618

## CV di volume : 53.70536 
## L'asimmetria per la variabile volume è: 0.884742 
## La curtosi della variabile  volume è: 0.176987

## CV di months_inventory : 25.06031 
## L'asimmetria per la variabile months_inventory è: 0.04097527 
## La curtosi della variabile  months_inventory è: -0.1744475

La variabile con maggiore variabilità risulta essere “volume” che presenta un coefficiente di variazione del 54% rispetto alla propria media.

L’asimmetria maggiore si riscontra per la variabile “volume” che ha una leggera asimmetria positiva, come confermato anche dal grafico.

Calcolando asimmetria e curtosi si può concludere che in linea generale tutte le variabili mostrano una distribuzione molto vicino ad una normale. Entrambi i valori per tutte le variabili sono infatti molto vicini a 0.

4. Creazione di classi per una variabile quantitativa

attach(dati)
## I seguenti oggetti sono mascherati da dati (pos = 4):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
## I seguenti oggetti sono mascherati da dati (pos = 6):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
dati$sales_cl<- cut(sales, seq(70,430,40))

ni<-table(dati$sales_cl)
fi<-ni/n
Ni<- cumsum(ni)
Fi<- Ni/n
distr_freq_cl_sales<-as.data.frame(cbind(ni, fi, Ni, Fi))
kable(distr_freq_cl_sales)
ni fi Ni Fi
(70,110] 35 0.1458333 35 0.1458333
(110,150] 58 0.2416667 93 0.3875000
(150,190] 46 0.1916667 139 0.5791667
(190,230] 29 0.1208333 168 0.7000000
(230,270] 23 0.0958333 191 0.7958333
(270,310] 26 0.1083333 217 0.9041667
(310,350] 11 0.0458333 228 0.9500000
(350,390] 9 0.0375000 237 0.9875000
(390,430] 3 0.0125000 240 1.0000000
kable(table(dati$city, dati$sales_cl))
(70,110] (110,150] (150,190] (190,230] (230,270] (270,310] (310,350] (350,390] (390,430]
Beaumont 5 11 24 13 6 1 0 0 0
Bryan-College Station 6 13 14 6 4 10 2 3 2
Tyler 0 1 5 10 13 15 9 6 1
Wichita Falls 24 33 3 0 0 0 0 0 0
kable(table(dati$city, dati$sales_cl)/n)
(70,110] (110,150] (150,190] (190,230] (230,270] (270,310] (310,350] (350,390] (390,430]
Beaumont 0.0208333 0.0458333 0.1000000 0.0541667 0.0250000 0.0041667 0.0000000 0.0000 0.0000000
Bryan-College Station 0.0250000 0.0541667 0.0583333 0.0250000 0.0166667 0.0416667 0.0083333 0.0125 0.0083333
Tyler 0.0000000 0.0041667 0.0208333 0.0416667 0.0541667 0.0625000 0.0375000 0.0250 0.0041667
Wichita Falls 0.1000000 0.1375000 0.0125000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000 0.0000000
barplot(distr_freq_cl_sales$ni,
         main = "distribuzione di frequenza delle classi di vendita",
         xlab = "classi di vendita",
         ylab= "frequenze assolute",
         ylim =  c(0, 60),
         col = "blue",
         names.arg = rownames(distr_freq_cl_sales),
         cex.names = 0.7)

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

gini.index(dati$sales_cl)
## [1] 0.9499609
kable(table(city))
city Freq
Beaumont 60
Bryan-College Station 60
Tyler 60
Wichita Falls 60
gini.index(city)
## [1] 1

Dopo avere creeato delle classi di frequenza per la variabile sales è stato possibile analizzare la distribuzione di frequenza della stessa. La distribuzione di frequenza risulta altamente eterogenea in quanto l’indice di Gini normalizzato risulta esssere molto vicino ad 1 che è il valore massimo previsto dall’indicatore.

A conferma di quanto indicato, provando a calcolare l’indice di Gini per la variabile qualitativa “city”, che come descritto in precedenza risulta essere quadrimodale, otteniamo il valore massimo di eterogeneità 1.

5. Calcolo della probabilità

length(month)/12
## [1] 20
kable(table(month))
month Freq
1 20
2 20
3 20
4 20
5 20
6 20
7 20
8 20
9 20
10 20
11 20
12 20
prob.luglio<-20/240*100
prob.meseanno<-1/240*100
prob.Beaumont<-60/240*100
prob.luglio
## [1] 8.333333
prob.meseanno
## [1] 0.4166667
prob.Beaumont
## [1] 25
  1. Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”? La probabilità che presa una riga a caso essa riporti la città di “Beaumont” è del 25% (prob.Beaumont). La probabilità viene calcolata come il rapporto fra casi favorevoli e il numero di casi possibili.

  2. E la probabilità che riporti il mese di Luglio? La probabilità che sia riportato il mese di luglio, prendendo un’osservazione a caso, è data dal rapporto fra il numero di osservazioni totali afferenti al mese di luglio e il numero totale delle osservazioni e risulta essere di 8,3%.

  3. E la probabilità che riporti il mese di dicembre 2012? La probabilità che riporti il mese di dicembre dello 0,4%.

6. Creazione di nuove variabili.

dati$month_year <- paste(dati$month, dati$year, sep = "/")
dati$medium_price<- (dati$volume)/(dati$sales)*1000000
dati$ad_effectiveness<- (dati$listings)/(dati$sales)

Il rapporto fra i volumi di vendita mensili e le vendite restituisce il prezzo medio di vendita mentre il rapporto fra il numero totale di annunci e le vendite effettivamente conseguite indica quanto siano efficai gli annunci.

7. Analisi condizionata

install.packages("dplyr") 
## Installazione pacchetto in 'C:/Users/Gianpiero/AppData/Local/R/win-library/4.5'
## (perché 'lib' non è specificato)
## pacchetto 'dplyr' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\Gianpiero\AppData\Local\Temp\Rtmpa2nFPO\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
dati<- read.csv("realestate_texas.csv")
kable(dati %>%
    group_by(city) %>%
   summarise(across(c(sales, median_price), 
                     list(media = mean, dev.st = sd))))
city sales_media sales_dev.st median_price_media median_price_dev.st
Beaumont 177.3833 41.48395 129988.3 10104.993
Bryan-College Station 205.9667 84.98374 157488.3 8852.235
Tyler 269.7500 61.96380 141441.7 9336.538
Wichita Falls 116.0667 22.15192 101743.3 11320.034
install.packages("ggplot2")
## Installazione pacchetto in 'C:/Users/Gianpiero/AppData/Local/R/win-library/4.5'
## (perché 'lib' non è specificato)
## pacchetto 'ggplot2' aperto con successo con controllo somme MD5
## 
## I pacchetti binari scaricati sono in
##  C:\Users\Gianpiero\AppData\Local\Temp\Rtmpa2nFPO\downloaded_packages
library(ggplot2)

boxplot1 <- ggplot(data=dati)+
  geom_boxplot(aes(x=city,
                   y=median_price),
                   col="black",
                   fill="blue")
print(boxplot1)

boxplot2 <- ggplot(data=dati)+
   geom_boxplot(aes(x=city,
                   y=sales),
                   col="red",
                   fill="lightblue") 
print(boxplot2)

In base ai valori di media e varianza calcolati rispetto alla variabile qualitativa CITY, si possono desumere le seguenti indicazioni: 1. le vendite medie più alte si riscontrano per la città di Tyler mentre il prezzo medio più alto si registra per la città di Bryan-College Station. 2. il calcolo delle deviazioni standard della variabile SALES mostra come la varianza più alta si registri per la città Bryan-College Station mentre la minima varianza si riscontra per la città Wichita Falls. 3. il calcolo delle deviazioni standard della variabile SAMEDIAN_PRICE mostra una maggiore varianza per la città di Wichita Falls e la minore varianza per la città Bryan-College Station.

8. Creazione di visualizzazioni con ggplot2

Sommare le vendite per anno

library(dplyr)
sales.year.city <- dati %>%
  group_by(year, city) %>%
  summarise(year_sales = sum(sales))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
df<- data.frame(sales.year.city)
library(ggplot2)
ggplot(data=df)+
   geom_bar(aes(x=year,y=year_sales,fill=city),
            stat ="identity")+
            labs(title = "Vendite per città per anno",x = "Anno", y = "Vendite", fill = "Città")

Le vendite generali per anno segnano un trend di crescita se si esclude il 2011 in cui c’è stata una leggera flessione. A livello di città Wicihta Falls mostra una vendita con livelli costanti durante gli anni mentre le altre città in esame un aumento di vendite negli anni.

Sommare le vendite per mese

library(dplyr)
sales.month.city <- dati %>%
  group_by(month, city) %>%
  summarise(month_sales = sum(sales))
## `summarise()` has grouped output by 'month'. You can override using the
## `.groups` argument.
df2<- data.frame(sales.month.city)
library(ggplot2)
ggplot(data=df2)+
   geom_bar(aes(x=month,y=month_sales,fill=city),
            stat ="sum")+
            scale_x_continuous(breaks=seq(0,12,1))+
            labs(title = "Vendite per città per mese",x = "Mese", y = "Vendite", fill = "Città")

Il grafico prodotto mostra che i mesi in cui le vendite sono più alte sono i mesi da maggio ad agosto. Per la città Wichita Falls il trend Il grafico prodotto mostra che i mesi in cui le vendite sono più alte sono i mesi da maggio ad agosto. Per la città Wichita Falls il trend non sembra confermato ma le vendite si ditribuiscono in maniera costante fra durante l’anno.

attach(dati)
## I seguenti oggetti sono mascherati da dati (pos = 5):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
## I seguenti oggetti sono mascherati da dati (pos = 7):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
## I seguenti oggetti sono mascherati da dati (pos = 9):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
boxplot(dati$median_price~dati$city, col="blue")

install.packages("ggplot2")
## Warning: il pacchetto 'ggplot2' è in uso e non sarà installato
library(ggplot2)

attach(dati)
## I seguenti oggetti sono mascherati da dati (pos = 3):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
## I seguenti oggetti sono mascherati da dati (pos = 6):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
## I seguenti oggetti sono mascherati da dati (pos = 8):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
## I seguenti oggetti sono mascherati da dati (pos = 10):
## 
##     city, listings, median_price, month, months_inventory, sales,
##     volume, year
dati$month_year <- paste(dati$month, dati$year, sep = "/")
dati$dates <- as.Date(paste0("1/", dati$month_year), format = "%d/%m/%Y")

ggplot(data=dati)+
    geom_line(aes(x = dates , y = sales, group = city, color = city))+
    labs(title="Numero di unità abitative vendute per città negli anni", x="Periodo di osservazione",y="Numero di Vendite", color = "Città")+
    scale_x_date(date_breaks = "12 month", date_labels = "%m/%Y", expand = c(0, 0))

ggplot(dati)+
        geom_line(aes(x = dates, y = median_price, group = city, color = city))+
        labs(title="Prezzo medio di vendita negli anni per città in dollari", x="Periodo di osservazione",y ="Prezzo medio di vendita ($)", color = "Città")+
  scale_x_date(date_breaks = "12 month", date_labels = "%m/%Y",expand = c(0, 0))+
              theme(panel.background = element_rect(fill = "white", color = NA))

Il primo grafico a linee mostra come la città con il più basso livello di vendite negli anni è Wichita Falls mentre quella che registra il più alto volume di vendite, confermato nel tempo, è la città di Tyler. Si nota come la città di BC Station, abbia subito dal 06/2014 un decremento importante nelle vendite.

Il secondo grafico mostra come il livello dei prezzi medi per città sia stato quasi costante nel tempo e che risulta più alto per la città di BC-Station e più basso per la città di Wichita Falls. Dal grafico si nota come nel periodo iniziale di osservazione fosse la città di Beaumont quella con il prezzo medio più alto. Infatti dall’inizio delle osservazioni all’ultimo campione a disposizione si evince come Beaumont sia l’unica città ad aver un prezzo medio di vendita più basso rispetto all’osservazione iniziale.

9. Conclusioni

In base all’analisi condotta sulle osservazioni delle variabili a disposizione, si possono dedurre le seguenti conclusioni: