Student

Paolo Artasensi

ESERCITAZIONE DI STATISTICA DESCRITTIVA v.1.1.1

TASK 01

“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]

TASK 02

“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 ...
  1. city = Qualitativa Nominale

  2. year = Quantitativa Continua Ordinale

  3. month = Qualitativa Ordinale Codificata

  4. sales = Quantitativa Discreta

  5. volume = Quantitativa Continua (in milioni dollari)

  6. median_price = Quantitativa Continua (in dollari)

  7. listings = Quantitativa Discreta

  8. months_inventory = Quantitativa Continua

TASK 03

“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.”

1.CITY 🏙️🇺🇸

#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.”

2.YEAR 📆

# 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”

3.MONTH 1️⃣ 2️⃣

# 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”

4.SALES 🏘️

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)

5.VOLUME 💰🏘️💰

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)

6.MEDIAN PRICE 💸

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)

7.LISTINGS 🎫

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)

8.MONTH INVENTORY 📈

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)

TASK 04

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

TASK 05

“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%

TASK 06

“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”

TASK 07

“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`

TASK 08

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

TASK 09

“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.”

EXTRA:

QUESTA CORRELAZIONE E’ STATA CERCATA INTERROGANDO CHAT GPT

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

TASK 10

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

TASK 10.1

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.

TASK 10.2

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

TASK 10.3

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.

TASK 10.4

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