data <- read.csv("realestate_texas.csv", stringsAsFactors = FALSE)
head(data)
## city year month sales volume median_price listings months_inventory
## 1 Beaumont 2010 1 83 14.162 163800 1533 9.5
## 2 Beaumont 2010 2 108 17.690 138200 1586 10.0
## 3 Beaumont 2010 3 182 28.701 122400 1689 10.6
## 4 Beaumont 2010 4 200 26.819 123200 1708 10.6
## 5 Beaumont 2010 5 202 28.833 123100 1771 10.9
## 6 Beaumont 2010 6 189 27.219 122800 1803 11.1
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 ...
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
Nel dataset fornito, le variabili sono suddivise in quantitative e qualitative, come di seguito descritto:
Le variabili quantitative e continue, come sales, volume, median_price, listings e months_inventory, sono tutte adatte per analisi numeriche e statistiche, mentre le variabili city, year e month saranno utilizzate per segmentare e fare analisi temporali o geografiche.
library(moments)
library(knitr)
## Warning: il pacchetto 'knitr' è stato creato con R versione 4.4.2
indici_posizione_variabilita_forma <- data.frame(
Variabile = c("sales", "volume", "median_price", "listings", "months_inventory"),
Media = c(mean(data$sales), mean(data$volume), mean(data$median_price), mean(data$listings), mean(data$months_inventory)),
Mediana = c(median(data$sales), median(data$volume), median(data$median_price), median(data$listings), median(data$months_inventory)),
Q1 = c(quantile(data$sales, 0.25), quantile(data$volume, 0.25), quantile(data$median_price, 0.25), quantile(data$listings, 0.25), quantile(data$months_inventory, 0.25)),
Q3 = c(quantile(data$sales, 0.75), quantile(data$volume, 0.75), quantile(data$median_price, 0.75), quantile(data$listings, 0.75), quantile(data$months_inventory, 0.75)),
Deviazione_Standard = c(sd(data$sales), sd(data$volume), sd(data$median_price), sd(data$listings), sd(data$months_inventory)),
Asimmetria = c(skewness(data$sales), skewness(data$volume), skewness(data$median_price), skewness(data$listings), skewness(data$months_inventory)),
Curtosi = c(kurtosis(data$sales), kurtosis(data$volume), kurtosis(data$median_price), kurtosis(data$listings), kurtosis(data$months_inventory))
)
kable(indici_posizione_variabilita_forma,
caption = "Indici di Posizione, Variabilità e Forma per le Variabili Quantitative",
align = c('l', 'r', 'r', 'r', 'r', 'r', 'r', 'r'))
| Variabile | Media | Mediana | Q1 | Q3 | Deviazione_Standard | Asimmetria | Curtosi |
|---|---|---|---|---|---|---|---|
| sales | 192.29167 | 175.5000 | 127.0000 | 247.000 | 79.651111 | 0.7181040 | 2.686824 |
| volume | 31.00519 | 27.0625 | 17.6595 | 40.893 | 16.651447 | 0.8847420 | 3.176987 |
| median_price | 132665.41667 | 134500.0000 | 117300.0000 | 150050.000 | 22662.148687 | -0.3645529 | 2.377038 |
| listings | 1738.02083 | 1618.5000 | 1026.5000 | 2056.000 | 752.707756 | 0.6494982 | 2.208210 |
| months_inventory | 9.19250 | 8.9500 | 7.8000 | 10.950 | 2.303669 | 0.0409753 | 2.825553 |
La media rappresenta il valore centrale per ogni variabile, mentre la mediana offre una misura robusta, meno influenzata dai valori estremi. Ad esempio, la variabile sales ha una media di 192.29, ma la mediana è più bassa (175.50), suggerendo che i dati siano leggermente inclinati verso valori più alti.
I quartili (Q1 e Q3) mostrano la distribuzione dei dati: per sales, il primo quartile è 127, mentre il terzo quartile è 247, indicando una distribuzione piuttosto ampia.
La deviazione standard misura la variabilità dei dati. Ad esempio, per sales, la deviazione standard è 79.65, indicando una certa variabilità attorno alla media.
L’asimmetria misura la simmetria della distribuzione dei dati. Un valore positivo indica una distribuzione inclinata verso destra. Ad esempio, la variabile volume ha un’asimmetria di 0.88, suggerendo una leggera inclinazione verso valori più alti.
La curtosi indica la “pesantezza” delle code della distribuzione. Un valore maggiore di 3 indica una distribuzione con code più pesanti rispetto a una normale. Ad esempio, volume ha una curtosi di 3.18, il che indica code più pesanti.
frequenza_city <- table(data$city)
kable(frequenza_city,
caption = "Distribuzione di Frequenza per la Variabile 'City'",
col.names = c("Città", "Frequenza"),
align = c('l', 'r'))
| Città | Frequenza |
|---|---|
| Beaumont | 60 |
| Bryan-College Station | 60 |
| Tyler | 60 |
| Wichita Falls | 60 |
Per quanto riguarda la variabile city, che è qualitativa, abbiamo calcolato la distribuzione delle frequenze e possiamo notare come le osservazioni siano equamente distribuite con 60 a testa per ogni città.
cv_sales <- sd(data$sales) / mean(data$sales) * 100
cv_volume <- sd(data$volume) / mean(data$volume) * 100
cv_median_price <- sd(data$median_price) / mean(data$median_price) * 100
cv_listings <- sd(data$listings) / mean(data$listings) * 100
cv_months_inventory <- sd(data$months_inventory) / mean(data$months_inventory) * 100
asimmetria <- indici_posizione_variabilita_forma$Asimmetria
analisi_variabilita_asimmetria <- data.frame(
Variabile = c("sales", "volume", "median_price", "listings", "months_inventory"),
Coefficiente_Variazione = c(cv_sales, cv_volume, cv_median_price, cv_listings, cv_months_inventory),
Asimmetria = asimmetria
)
variabili_ord_cv <- analisi_variabilita_asimmetria[order(-analisi_variabilita_asimmetria$Coefficiente_Variazione), ]
variabili_ord_asimmetria <- analisi_variabilita_asimmetria[order(-analisi_variabilita_asimmetria$Asimmetria), ]
variabili_ord_cv
## Variabile Coefficiente_Variazione Asimmetria
## 2 volume 53.70536 0.88474203
## 4 listings 43.30833 0.64949823
## 1 sales 41.42203 0.71810402
## 5 months_inventory 25.06031 0.04097527
## 3 median_price 17.08218 -0.36455288
variabili_ord_asimmetria
## Variabile Coefficiente_Variazione Asimmetria
## 2 volume 53.70536 0.88474203
## 1 sales 41.42203 0.71810402
## 4 listings 43.30833 0.64949823
## 5 months_inventory 25.06031 0.04097527
## 3 median_price 17.08218 -0.36455288
La variabile volume è quella che presenta sia il coefficiente di variazione più alto sia il valore di assimetria maggiore. Questo significa che la variabile ha una grande dispersione rispetto alla media e che i valori più alti tendono ad essere meno frequenti, ma con un influenza significativa sulla distribuzione allungadola verso destra.
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(ineq)
classi_sales <- cut(data$sales,
breaks = quantile(data$sales, probs = 0:20 / 20, na.rm = TRUE),
include.lowest = TRUE,
labels = paste("Class", 1:20))
frequenza_sales <- table(classi_sales)
frequenza_sales
## classi_sales
## Class 1 Class 2 Class 3 Class 4 Class 5 Class 6 Class 7 Class 8
## 13 11 13 11 13 13 10 13
## Class 9 Class 10 Class 11 Class 12 Class 13 Class 14 Class 15 Class 16
## 12 11 14 11 11 12 12 13
## Class 17 Class 18 Class 19 Class 20
## 11 12 12 12
df_frequenza_sales <- as.data.frame(frequenza_sales)
colnames(df_frequenza_sales) <- c("Classi", "Frequenza")
ggplot(df_frequenza_sales, aes(x = Classi, y = Frequenza)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Distribuzione di Frequenza per 'sales'",
x = "Classi di 'sales'", y = "Frequenza")
gini_sales <- Gini(data$sales)
gini_sales
## [1] 0.2310975
L’indice di Gini per la variabile ‘sales’ è pari a 0.2311. Questo valore indica una distribuzione relativamente equa dei dati, ma con una certa disuguaglianza.
prob_beaumont <- sum(data$city == "Beaumont") / nrow(data)
cat(sprintf("La probabilità che, estratta una riga a caso, esca la città Beaumont è di %.2f%%\n", prob_beaumont * 100))
## La probabilità che, estratta una riga a caso, esca la città Beaumont è di 25.00%
prob_luglio <- sum(data$month == 7) / nrow(data)
cat(sprintf("La probabilità che, estratta una riga a caso, esca il mese di Luglio è di %.2f%%\n", prob_luglio * 100))
## La probabilità che, estratta una riga a caso, esca il mese di Luglio è di 8.33%
prob_dicembre_2012 <- sum(data$year == 2012 & data$month == 12) / nrow(data)
cat(sprintf("La probabilità che, estratta una riga a caso, esca il mese di Dicembre 2012 è di %.2f%%\n", prob_dicembre_2012 * 100))
## La probabilità che, estratta una riga a caso, esca il mese di Dicembre 2012 è di 1.67%
data$avg_price <- data$volume / data$sales
data$efficacy <- data$listings / data$sales
options(width = 1000)
head(data)
## city year month sales volume median_price listings months_inventory avg_price efficacy
## 1 Beaumont 2010 1 83 14.162 163800 1533 9.5 0.1706265 18.469880
## 2 Beaumont 2010 2 108 17.690 138200 1586 10.0 0.1637963 14.685185
## 3 Beaumont 2010 3 182 28.701 122400 1689 10.6 0.1576978 9.280220
## 4 Beaumont 2010 4 200 26.819 123200 1708 10.6 0.1340950 8.540000
## 5 Beaumont 2010 5 202 28.833 123100 1771 10.9 0.1427376 8.767327
## 6 Beaumont 2010 6 189 27.219 122800 1803 11.1 0.1440159 9.539683
max(data$avg_price)
## [1] 0.2132339
min(data$avg_price)
## [1] 0.0970102
max(data$efficacy)
## [1] 19.94406
min(data$efficacy)
## [1] 2.583127
Ho aggiunto 2 nuove colonne al dataset: Avg_price: calcoalta come il rapporto tra volume e sales. Indica il prezzo medio ponderato degli immobili in ciascun mese. Osservando il valore massimo (0.21) e il valore minimo (0.09) possiamo notare una variazione significativa. Grazie al prezzo medio possiamo ottenere varie informazioni, ad esempio: se il prezzo medio è più alto in mesi con un numero ridotto di vendite, potrebbe significare che sono state vendute delle case ad un prezzo molto alto; Efficacy: calcolata come il rapporto tra listenings e sales. Indica l’efficenza degli annunci di vendita. Valori alti di questa colonna indicano una bassa efficacia degli annunci, poiché indica un numero alto di annunci rispetto alle vendite effettuate. Anche questa colonna presenta una variazione significativa tra il valore massimo (19.9) e il valore minimo (2.58).
summary_by_year <- data %>%
group_by(year) %>%
summarise(
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm = TRUE),
mean_median_price = mean(median_price, na.rm = TRUE),
sd_median_price = sd(median_price, na.rm = TRUE),
.groups = "drop"
)
summary_by_city <- data %>%
group_by(city) %>%
summarise(
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm = TRUE),
mean_median_price = mean(median_price, na.rm = TRUE),
sd_median_price = sd(median_price, na.rm = TRUE),
.groups = "drop"
)
summary_by_month <- data %>%
group_by(year, month) %>%
summarise(
mean_sales = mean(sales, na.rm = TRUE),
sd_sales = sd(sales, na.rm = TRUE),
mean_volume = mean(volume, na.rm = TRUE),
sd_volume = sd(volume, na.rm = TRUE),
mean_median_price = mean(median_price, na.rm = TRUE),
sd_median_price = sd(median_price, na.rm = TRUE),
.groups = "drop"
)
summary_by_city
## # A tibble: 4 × 7
## city mean_sales sd_sales mean_volume sd_volume mean_median_price sd_median_price
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Beaumont 177. 41.5 26.1 6.97 129988. 10105.
## 2 Bryan-College Station 206. 85.0 38.2 17.2 157488. 8852.
## 3 Tyler 270. 62.0 45.8 13.1 141442. 9337.
## 4 Wichita Falls 116. 22.2 13.9 3.24 101743. 11320.
summary_by_year
## # A tibble: 5 × 7
## year mean_sales sd_sales mean_volume sd_volume mean_median_price sd_median_price
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2010 169. 60.5 25.7 10.8 130192. 21822.
## 2 2011 164. 63.9 25.2 12.2 127854. 21318.
## 3 2012 186. 70.9 29.3 14.5 130077. 21432.
## 4 2013 212. 84.0 35.2 17.9 135723. 21708.
## 5 2014 231. 95.5 39.8 21.2 139481. 25625.
summary_by_month
## # A tibble: 60 × 8
## year month mean_sales sd_sales mean_volume sd_volume mean_median_price sd_median_price
## <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2010 1 105. 36.6 15.9 6.92 135450 33736.
## 2 2010 2 122. 40.3 19.2 8.54 131100 31406.
## 3 2010 3 189. 43.6 28.0 7.30 122325 24973.
## 4 2010 4 229 64.0 33.8 13.3 128300 18899.
## 5 2010 5 233. 58.8 35.9 13.2 130125 20122.
## 6 2010 6 216. 71.4 34.5 13.6 133275 15109.
## 7 2010 7 178 62.5 26.7 12.1 127225 23352.
## 8 2010 8 184. 45 28.6 10.7 131100 23883.
## 9 2010 9 150. 47.2 22.2 7.23 125825 20740.
## 10 2010 10 141. 45.7 21.8 8.07 134150 25059.
## # ℹ 50 more rows
ggplot(data, aes(x = city, y = median_price)) +
geom_boxplot(fill = "lightblue", color = "blue") +
labs(title = "Distribuzione del prezzo mediano tra le città",
x = "Città", y = "Prezzo mediano") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplot(data, aes(x = factor(month), y = sales, fill = city)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Totale delle vendite per mese e città",
x = "Mese", y = "Totale vendite") +
scale_x_discrete(labels = c("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic")) +
theme_minimal()
data$date <- as.Date(paste(data$year, data$month, "01", sep = "-"))
ggplot(data, aes(x = date, y = volume, color = city, group = city)) +
geom_line(size = 1) +
labs(title = "Andamento del volume delle vendite per città (2010-2014)",
x = "Data", y = "Volume delle vendite") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_x_date(date_labels = "%Y", date_breaks = "12 months") +
scale_color_discrete(name = "Città")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.