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)
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)
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à
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
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")
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
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
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
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()
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
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
Alcune considerazioni:
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 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
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
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