Student
ESERCITAZIONE DI STATISTICA DESCRITTIVA v.1.1.1
“Scarica il dataset realestate_textas.csv da qui e importalo con R, questo contiene dei dati riguardanti le vendite di immobili in Texas.”
data = read.csv("realestate_texas.csv", sep=",")
# Visualizzo le prime righe del dataset
head(data)
# Panoramica satistica
summary(data)
## 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
# Visualizzo le dimensioni di data
dim(data)
## [1] 240 8
# Assegno a N il totale dei campioni registrati/osservati
N = dim(data)[1]
“Indica il tipo di variabili contenute nel dataset.”
str(data)
## 'data.frame': 240 obs. of 8 variables:
## $ city : chr "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
## $ year : int 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
## $ month : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sales : int 83 108 182 200 202 189 164 174 124 150 ...
## $ volume : num 14.2 17.7 28.7 26.8 28.8 ...
## $ median_price : num 163800 138200 122400 123200 123100 ...
## $ listings : int 1533 1586 1689 1708 1771 1803 1857 1830 1829 1779 ...
## $ months_inventory: num 9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...
city = Qualitativa Nominale
year = Quantitativa Continua Ordinale
month = Qualitativa Ordinale Codificata
sales = Quantitativa Discreta
volume = Quantitativa Continua (in milioni dollari)
median_price = Quantitativa Continua (in dollari)
listings = Quantitativa Discreta
months_inventory = Quantitativa Continua
“Calcola gli indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo, per le altre crea una distribuzione di frequenza. Commenta tutto brevemente.”
#Moda
table(data$city)
##
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
📍“City possiede una distribuzione uguale e quadrimodale sulle 4 città del Texas del dataset.”
# Trovo Min e Max
print(paste("Min", min(data$year)))
## [1] "Min 2010"
print(paste("Max", max(data$year)))
## [1] "Max 2014"
# Creo classi
data$year_cl = cut(data$year,
c(2009,2010,2011,2012,2013,2014))
# Calcolo le frequenze assolute dei mesi considerati ogni anno, per ogni città.
table(data$year_cl, data$city)
##
## Beaumont Bryan-College Station Tyler Wichita Falls
## (2009,2010] 12 12 12 12
## (2010,2011] 12 12 12 12
## (2011,2012] 12 12 12 12
## (2012,2013] 12 12 12 12
## (2013,2014] 12 12 12 12
📍“Per ogni città sono stati osservati 12 mesi, tra il 2010 e il 2014”
# Trovo il range dei mesi
range(data$month)
## [1] 1 12
📍“Le osservazioni sono riportate e ordinate su dodici mesi codificati da 1 a 12”
INDICI POSIZIONE:
Massimo/Minimo, Mediana, Quantili e Media (senza funzione “summary”):
#min e max
paste("Min", min(data$sales), " Max", max(data$sales))
## [1] "Min 79 Max 423"
#mediana
paste("La mediana è", median(data$sales))
## [1] "La mediana è 175.5"
#quantili
quantile(data$sales)
## 0% 25% 50% 75% 100%
## 79.0 127.0 175.5 247.0 423.0
#media
paste("La media è", mean(data$sales))
## [1] "La media è 192.291666666667"
INDICI VARIABILITA’:
#Coefficiente di variazione
CV = function(x){
return(sd(x)/mean(x)*100)
}
##
#Utilizzo la funzione ATTACH:
attach(data)
##
#Range interquartile
IQR(sales)
## [1] 120
#Varianza
var(sales)
## [1] 6344.3
#Deviazione Standard
sd(sales)
## [1] 79.65111
#Coefficiente di variazione
CV(sales)
## [1] 41.42203
INDICI DI FORMA:
#Installo il pacchetto MOMENTS
install.packages("moments")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
library(moments)
#disegno grafico
x_sales = rnorm(sales, mean(sales), sd(sales))
plot(density(x_sales))
#simmetria
skewness(x_sales)
## [1] -0.03472072
#curtosi
kurtosis(x_sales)-3
## [1] -0.2884216
#abline ROSSA
abline(v=mean(sales),col=2)

INDICI DI POSIZIONE e DI VARIABILITA’
summary(volume)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.166 17.660 27.062 31.005 40.893 83.547
#Range interquartile
IQR(volume)
## [1] 23.2335
#Varianza
var(volume)
## [1] 277.2707
#Deviazione Standard
sd(volume)
## [1] 16.65145
#Coefficiente di variazione
CV(volume)
## [1] 53.70536
INDICI DI FORMA
x_volume = rnorm(volume, mean(volume), sd(volume))
plot(density(x_volume))
#simmetria
skewness(x_volume)
## [1] -0.2627151
#curtosi
kurtosis(x_volume)-3
## [1] 0.3725952
#abline GIALLA
abline(v=mean(volume),col=7)

INDICI DI POSIZIONE e DI VARIABILITA’:
summary(median_price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 73800 117300 134500 132665 150050 180000
#Range interquartile
IQR(median_price)
## [1] 32750
#Varianza
var(median_price)
## [1] 513572983
#Deviazione Standard
sd(median_price)
## [1] 22662.15
#Coefficiente di variazione
CV(median_price)
## [1] 17.08218
INDICI DI FORMA:
x_median_price = rnorm(median_price, mean(median_price), sd(median_price))
plot(density(x_median_price))
#simmetria
skewness(x_median_price)
## [1] 0.03304545
#curtosi
kurtosis(x_median_price)-3
## [1] 0.3566203
#abline VERDE
abline(v=mean(median_price),col=3)

INDICI DI POSIZIONE e DI VARIABILITA’:
summary(listings)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 743 1026 1618 1738 2056 3296
#Range interquartile
IQR(listings)
## [1] 1029.5
#Varianza
var(listings)
## [1] 566569
#Deviazione Standard
sd(listings)
## [1] 752.7078
#Coefficiente di variazione
CV(listings)
## [1] 43.30833
INDICI DI FORMA:
x_listings = rnorm(listings, mean(listings), sd(listings))
plot(density(x_listings))
#simmetria
skewness(x_listings)
## [1] -0.009634482
#curtosi
kurtosis(x_listings)-3
## [1] -0.4641354
#abline AZZURRO
abline(v=mean(listings),col=4)

INDICI DI POSIZIONE e DI VARIABILITA’:
summary(months_inventory)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3.400 7.800 8.950 9.193 10.950 14.900
#Range interquartile
IQR(months_inventory)
## [1] 3.15
#Varianza
var(months_inventory)
## [1] 5.306889
#Deviazione Standard
sd(months_inventory)
## [1] 2.303669
#Coefficiente di variazione
CV(months_inventory)
## [1] 25.06031
INDICI DI FORMA:
x_moi = rnorm(months_inventory, mean(months_inventory), sd(months_inventory))
plot(density(x_listings))
#simmetria
skewness(x_moi)
## [1] -0.2361044
#curtosi
kurtosis(x_moi)-3
## [1] -0.1899515
#abline VIOLA
abline(v=mean(x_moi),col=6)

#Scollego il dataframe. RICORDA DI TOGLIERE COMMENTO
detach(data)
“Qual è la variabile con variabilità più elevata? Come ci sei arrivato? E quale quella più asimmetrica?”
📍 Per confrontare visualmente la variabile con Coefficiente di Variabilità maggiore confronto i CV in un grafico a barre.
attach(data)
#creo vettore
CV_confronto = c(CV(sales), CV(volume), CV(median_price), CV(listings), CV(months_inventory))
#Suggerimenti trovati qui https://r-graph-gallery.com/210-custom-barplot-layout.html
library(RColorBrewer)
coul <- brewer.pal(5, "Set2")
barplot(CV_confronto,
main = "VARIABILITA' MAGGIORE?",
xlab = "Variabili quantitative considerate",
ylab = "Coefficiente di variabilità",
names.arg = c("Sales","Volume","Median Price", "Listings", "MOI"),
col=coul)
Asimmetria
#creo vettore
skewness_confronto = c(skewness(sales),
skewness(volume),
skewness(median_price),
skewness(listings),
skewness(months_inventory))
library(RColorBrewer)
coul <- brewer.pal(8, "Set1")
barplot(CV_confronto,
main = "ASIMMETRIA MAGGIORE?",
xlab = "Variabili quantitative considerate",
ylab = "Indice di asimmetria Skewness",
names.arg = c("Sales","Volume","Median Price", "Listings", "MOI"),
col=coul)
📍 VOLUME è la variabile che presenta maggiore variabilità e asimmetria.
“Dividi una delle variabili quantitative in classi, scegli tu quale e come, costruisci la distribuzione di frequenze, il grafico a barre corrispondente e infine calcola l’indice di Gini.
📍 Scelgo la variabile MOI “Months Of Inventory”
#Cerco il range
range(months_inventory)
## [1] 3.4 14.9
# Creo classi
MOI_cl = cut(months_inventory, c(2,4,6,8,10,12,14,16))
# Calcolo le frequenze
MOI_Freq_ass = table(MOI_cl)
MOI_Freq_rel = table(MOI_cl)/N
cbind(MOI_Freq_ass, MOI_Freq_rel)
## MOI_Freq_ass MOI_Freq_rel
## (2,4] 5 0.02083333
## (4,6] 12 0.05000000
## (6,8] 62 0.25833333
## (8,10] 78 0.32500000
## (10,12] 58 0.24166667
## (12,14] 21 0.08750000
## (14,16] 4 0.01666667
barplot(MOI_Freq_ass, col = "#69b3a2" )
#funzione GINI
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)
}
table(MOI_cl)
## MOI_cl
## (2,4] (4,6] (6,8] (8,10] (10,12] (12,14] (14,16]
## 5 12 62 78 58 21 4
gini.index(MOI_cl)
## [1] 0.8847627
📍 “L’indice di GINI mostra un’eterogenità dell’88,4%
“Indovina l’indice di gini per la variabile city.Comment by Luca Naso: Non sarebbe meglio dire”trova” o ‘calcola’? “
print(table(city))
## city
## Beaumont Bryan-College Station Tyler
## 60 60 60
## Wichita Falls
## 60
gini.index(city)
## [1] 1
📍 “City ha massima ETEROGENEITA’ essendo il valore uguale a 1”
“Qual è la probabilità che presa una riga a caso di questo dataset essa riporti la città ‘Beaumont’?” E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?“
#Installo GGPLOT2
install.packages("ggplot2")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
library(ggplot2)
attach(data)
## The following objects are masked from data (pos = 5):
##
## city, listings, median_price, month, months_inventory, sales,
## volume, year, year_cl
# Probabilità città Beaumont
random_city = sample(city,100000, replace = TRUE)
ggplot()+
geom_histogram(aes(x=random_city,
y = after_stat(count/sum(count))),
stat = "count",
col = "black",
fill = "lightblue"
)
## Warning in geom_histogram(aes(x = random_city, y =
## after_stat(count/sum(count))), : Ignoring unknown parameters: `binwidth`,
## `bins`, and `pad`
print(60/240)
## [1] 0.25
📍 “Con un numero frequente di tentativi la probabiltà che esca BEAUMONT è del 25%.”
# Probabilità mese 7 (Luglio)
random_month = sample(month,1000000, replace = TRUE)
ggplot()+
geom_histogram(aes(x=random_month,
y = after_stat(count/sum(count))),
stat = "count",
col = "black",
fill = "yellow"
)+
scale_x_continuous(breaks = seq(1,12,1))+
labs(x="Months", y="Probabilità")
## Warning in geom_histogram(aes(x = random_month, y =
## after_stat(count/sum(count))), : Ignoring unknown parameters: `binwidth`,
## `bins`, and `pad`
# calcolo
print(1/12)
## [1] 0.08333333
install.packages("dplyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Filtro solo l'anno 2012
year_2012 = data %>%
filter(year==2012)
# Probabilità mese dicembre anno 2012 nel dataframe
dic_twelve = sample(month,1000000, replace = TRUE)
ggplot()+
geom_histogram(aes(x=dic_twelve,
y=after_stat(count/sum(count)),
fill=ifelse(dic_twelve==12, "blue", "gray")),
stat="count",
col="black") +
scale_x_continuous(breaks=seq(1,12,1))+
labs(x="Months", y="Probabilità")+
theme(legend.position = "none")+
ggtitle("YEAR = 2012")
## Warning in geom_histogram(aes(x = dic_twelve, y = after_stat(count/sum(count)),
## : Ignoring unknown parameters: `binwidth`, `bins`, and `pad`
Esiste una colonna col prezzo mediano, creane una che indica invece il prezzo medio, utilizzando le altre variabili che hai a disposizione.
# Prezzo medio in dollari
data$mean_price = (data$volume / data$sales)*1e6
“Prova a creare un’altra colonna che dia un’idea di”efficacia” degli annunci di vendita. Riesci a fare qualche considerazione?“
library(ggplot2)
# Calcolo il rapporto tra vendite e annunci
data$efficacy <- data$sales / data$listings
# Create a horizontal bar chart of efficacy by city
ggplot(data, aes(x = efficacy, y = city)) +
geom_bar(stat = "identity", fill = "steelblue") +
xlab("Efficacy (Sales per Listing)") +
ylab("City") +
ggtitle("Efficacia degli annunci per città")
📍 “Calcolando il rapporto tra annunci e vendite ripetto alle città si può vedere che Bryan-Collage Station ha annunci più EFFICACI, ovvero che si convertono in vendite.”
# Assuming your dataset is called 'data' and you have columns for sales and listings
ggplot(data, aes(x = listings, y = sales)) +
geom_point() +
xlab("Listings") +
ylab("Sales") +
ggtitle("Correlation between Sales and Listings")
“Prova a creare dei summary(), o semplicemente media e deviazione standard, di alcune variabili a tua scelta, condizionatamente alla città, agli anni e ai mesi. Puoi utilizzare il linguaggio R di base oppure essere un vero Pro con il pacchetto dplyr. Ti lascio un suggerimento in pseudocodice, oltre al cheatsheet nel materiale:”
/
dati %>%
group_by(una o più variabili di raggruppamento) %>%
summarise(nomecolonna1=funzione1(variabile da sintetizzare),
nomecolonna2=funzione2(variabile da sintetizzare))
Sfruttando questa notazione puoi creare anche dei grafici super! Da qui in poi utilizza ggplot2 per creare grafici fantastici! Ma non fermarti alla semplice soluzione del quesito, prova un po’ a personalizzare i grafici utilizzando temi, colori e annotazioni, e aggiustando i vari elementi come le etichette, gli assi e la legenda.
Consiglio: Fai attenzione quando specifichi le variabili month e year tra le estetiche, potrebbe essere necessario considerarle come fattori (#quindi codificate)
library(dplyr)
library(ggplot2)
#Raggruppo le vendite e gli incassi medi totali delle 4 città Texane per anno
data %>%
group_by(year) %>%
summarize(media = mean(sales), deviazioneS = sd(sales), incassi = mean(volume)) %>%
ggplot(aes(x=year, y=media, fill=year)) +
geom_bar(stat = "identity") +
geom_text(aes(label=round(media, 2)), vjust=-0.5) +
labs(title = "History Sales Texas", y="Avg_Sales") +
theme(legend.position = "none")
#Raggruppo le vendite per città
CITY_group = data %>%
group_by(city) %>%
summarize(min = min(sales), media = mean(sales), max = max(sales), deviazioneS = sd(sales), medianPRICE=median_price)
## Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
## dplyr 1.1.0.
## ℹ Please use `reframe()` instead.
## ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
## always returns an ungrouped data frame and adjust accordingly.
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
# DISEGNO GRAFICO A BARRE CON LE VENDITE MEDIE PER CITTA'
CITY_group %>%
ggplot(aes(x=city, y=media, fill=city)) +
geom_bar(stat = "identity") +
labs(title = "Texas Average Sales in Texas City Group") +
theme(legend.position = "none")
#Raggruppo per mesi per osservare i mesi più favorevoli di vendite e relativi incassi medi e provo il grafico circolare
CITY_group %>%
ggplot(aes(x=city, y=media, fill=city)) +
geom_bar(stat = "identity") +
coord_polar(theta = "x") +
scale_fill_brewer(palette = "Set1") +
labs(title = "Texas Average Sales in These Cities") +
theme_minimal()
1) Utilizza i boxplot per confrontare la distribuzione del prezzo mediano delle case tra le varie città. Commenta il risultato
ggplot(CITY_group, aes(x = city, y = data$median_price)) +
geom_boxplot(outlier.color = "red", outlier.shape = 16) +
labs(title = "Median Price by City")
📍 “Se rappresentiamo i dati rappresentativi dei prezzi in dollari delle case raggruppati per città notiamo che tutte tranne Tyler presentano dei valori definiti anomali (Outliers) che qui ho evidenziato in rosso.
2) 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?
library(ggplot2)
# Affianco le vendite delle città per anni
ggplot(data, aes(x = city, y = sales, fill = factor(year))) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9), width = 0.8) +
labs(x = "City", y = "Sales", fill = "Year") +
ggtitle("Vendite per città e anni")
📍 “Le città di ‘Bryan-Collage Station’ e ‘Tyler’ mostrano un incremento delle vendite significativo negli ultimi due anni di osservazione 2013-2014”
Se invece si intende il valore $ delle vendite
library(ggplot2)
# Affianco il valore in milioni di dollari per le case vendute nei 4 anni
ggplot(data, aes(x = city, y = volume, fill = factor(year))) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9), width = 0.8) +
labs(x = "City", y = "Volume $", fill = "Year") +
ggtitle("Milioni di $ per città e anni")+
scale_fill_brewer(palette = "Set4")
## Warning in pal_name(palette, type): Unknown palette Set4
📍 Le due città si confermano con la miglior crescita negli ultimi due anni seppur con qualche fattore discordante tra numero di vendite e volume economico, probabilmente sono state vendute tante case ma più “economiche”.
3) Usa un grafico a barre sovrapposte per ogni anno, per confrontare il totale delle vendite nei vari mesi, sempre considerando le città. Prova a commentare ciò che viene fuori.
Già che ci sei prova anche il grafico a barre normalizzato.
Consiglio: Stai attento alla differenza tra geom_bar() e geom_col().
# riporto le vendite per mese per i quattro anni, indicando le città per colori
library(ggplot2)
ggplot(data, aes(x = month, y = sales, fill = city)) +
geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
scale_x_continuous(breaks = seq(1, 12, 1)) +
labs(title = "Vendite per mese per 4 anni",
x = "Month",
y = "Total Sales",
fill = "City") +
theme_minimal() +
theme(legend.position = "bottom")+
facet_grid(year ~ .)
PRO LEVEL: cerca un modo intelligente per inserire ANCHE la variabile Year allo stesso blocco di codice, senza però creare accrocchi nel grafico.
📍 Ho trovato la modalità con faced_grid per far stare tutto il confronto in un grafico (anche non mi convince tantissimo, inoltre non sono riuscuti a fare la versione normalizzata.
4) Crea 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. Consigli: Prova inserendo una variabile per volta. Prova a usare variabili esterne al dataset, tipo vettori creati da te appositamente.
Se non riesci proprio a venirne a capo inizia lavorando su dataset ridotti, ad esempio prendendo in considerazione un solo anno o una sola città. Aiutati con il pacchetto dplyr:
dati2014 <- filter(dati, year==2014)
dati_Beaumont <- filter(dati, city==“Beaumont”
dati2014 <- filter(data, year==2014)
dati_Beaumont <- filter(data, city=="Beaumont")