Carico le librerie, le funzioni e il dataset
Installazione dei packages usati e verifica della versione
# library installatiion
library(ggplot2)
## Warning: il pacchetto 'ggplot2' è stato creato con R versione 4.4.1
# Packages verification installation
packageVersion("ggplot2")
## [1] '3.5.1'
########
# Load the moments package for skewness and kurtosis calculations
library(moments)
# Packages verification installation
packageVersion("moments")
## [1] '0.14.1'
########
# Load the moments package for skewness and kurtosis calculations
library(dplyr)
## Warning: il pacchetto 'dplyr' è stato creato con R versione 4.4.1
##
## 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
# Packages verification installation
packageVersion("dplyr")
## [1] '1.1.4'
########
# Load the moments package for skewness and kurtosis calculations
library(stringr)
## Warning: il pacchetto 'stringr' è stato creato con R versione 4.4.1
# Packages verification installation
packageVersion("stringr")
## [1] '1.5.1'
########
# Load the ineq package for Gini calculations
library(ineq)
# Packages verification installation
packageVersion("ineq")
## [1] '0.2.13'
########
# Load the tidyr package for line charts
library(tidyr)
## Warning: il pacchetto 'tidyr' è stato creato con R versione 4.4.2
# Packages verification installation
packageVersion("tidyr")
## [1] '1.3.1'
########
# Load the knitr package for line charts
library(knitr)
## Warning: il pacchetto 'knitr' è stato creato con R versione 4.4.1
# Packages verification installation
packageVersion("knitr")
## [1] '1.48'
############################################################################
# Function to calculate mean, median, min, max, first quantile and third quantile # for each numeric column in a dataframe
############################################################################
calculate_index_pos <- function(df) {
# Select only numeric columns
numeric_df <- df[sapply(df, is.numeric)]
# Calculate mean, median, min, and max for each column
stats <- data.frame(
Mean = sapply(numeric_df, mean, na.rm = TRUE),
Median = sapply(numeric_df, median, na.rm = TRUE),
Mode = sapply(numeric_df, getmode),
Min = sapply(numeric_df, min, na.rm = TRUE),
Max = sapply(numeric_df, max, na.rm = TRUE),
Qtl.25 = sapply(numeric_df, quantile, probs=0.25, na.rm = TRUE),
Qtl.75 = sapply(numeric_df, quantile, probs=0.75, na.rm = TRUE)
)
return(stats)
}
############################################################################
############################################################################
# Calculate variance index of dataframe
############################################################################
calculate_variance_index <- function(df) {
# Select only numeric columns
numeric_df <- df[sapply(df, is.numeric)]
# Calculate variance index
stats = data.frame(
Range =sapply(numeric_df, getrange),
IQR =sapply(numeric_df, IQR, na.rm = TRUE),
variance =sapply(numeric_df, var, na.rm = TRUE),
st.dev =sapply(numeric_df, sd, na.rm = TRUE),
CV =sapply(numeric_df, CV )
)
return(stats)
}
#
############################################################################
############################################################################
# Calculate the shape of a dataframe
############################################################################
calculate_shape = function(df) {
# Select only numeric columns
numeric_df = df[sapply(df, is.numeric)]
# Calculate variance index
stats = data.frame(
Asym_ind =sapply(numeric_df, skewness,na.rm = TRUE),
Kurtosis =sapply(numeric_df, kurtosis, na.rm = TRUE)
)
return(stats)
}
############################################################################
############################################################################
# Get mode of the vector
############################################################################
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
#
############################################################################
############################################################################
# Get the range of a vector
############################################################################
getrange <- function(v) {
range = max(v)-min(v)
return(range)
}
############################################################################
############################################################################
# Function Variance %
############################################################################
CV = function(x){
return = ( sd(x)/mean(x)*100 )
}
############################################################################
############################################################################
# GINI index
############################################################################
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)
}
#
############################################################################
############################################################################
# class and graph maker
############################################################################
freq_grap = function(x,
seq_start,
seq_end,
seq_steps,
title_desc,
x_desc,
y_desc,
y_start,
y_end,
y_steps) {
# Create the classes
x_cl = cut(x, seq(seq_start, seq_end, seq_steps))
x_n = length(x)
# Create the frequency distribution table
distr_freq = as.data.frame(
cbind(
ni = table(x_cl), # Absolute frequency
fi = table(x_cl) / x_n, # Relative frequency
Ni = cumsum(table(x_cl)), # Cumulative absolute frequency
Fi = cumsum(table(x_cl) / x_n) # Cumulative relative frequency
)
)
# Create the frequency distribution plot
plot = ggplot(data = as.data.frame(x_cl)) +
geom_bar(aes(x = x_cl),
position = "stack",
stat = "count",
col = "black",
fill = "lightblue") +
labs(title = title_desc,
x =x_desc,
y =y_desc) +
scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
theme_classic() +
theme(legend.position = "bottom")
print(plot) # Force the plot to display
return(distr_freq)
}
#
############################################################################
############################################################################
# word counter
############################################################################
count_word = function(word, text_vector) {
# Convert to lowercase for case-insensitive search
word = tolower(word)
text_vector = tolower(text_vector)
# Count occurrences of the specific word in each element of the vector
count = sum(sapply(text_vector, function(text) {
str_count(text, paste0("\\b", word, "\\b"))
}))
return(count)
}
#
############################################################################
############################################################################
# words counter in columns -
############################################################################
count_words_in_columns = function(df, column_A, word_A, column_B, word_B) {
# Convert words to lowercase for case-insensitive search
word_A = tolower(word_A)
word_B = tolower(word_B)
# Initialize counter
count = 0
# Loop through each row of the dataframe
for (i in seq_len(nrow(df))) {
# Convert values in specified columns to lowercase for case-insensitive comparison
text_A = tolower(as.character(df[i, column_A]))
text_B = tolower(as.character(df[i, column_B]))
# Check if word_A is in column_A and word_B is in column_B for the same row
if (grepl(word_A, text_A) & grepl(word_B, text_B)) {
count = count + 1
}
}
return(count)
}
#
############################################################################
############################################################################
# Function Line Chart by group
############################################################################
line_chart_group = function(dataframe,
data_col,
df_filter_1,
df_filter_2,
x_start,
x_end,
x_steps,
title_desc,
Y_desc,
X_desc,
group_desc,
y_start,
y_end,
y_steps
) {
# Using the {{ }} operator to refer to column names
df_A = NULL
df_A <- dataframe %>%
group_by({{ df_filter_1 }},{{ df_filter_2 }}) %>%
summarise(tot_sum = sum({{data_col}}, na.rm = TRUE)) %>%
ungroup()
# Print the new dataframe created
print(df_A)
ggplot(data = df_A,
aes(x = {{ df_filter_1 }},
y = tot_sum,
color = {{ df_filter_2 }},
group = {{ df_filter_2 }}
))+
geom_line(size = 1)+
theme_minimal() +
# Definisce i nomi degli assi
labs (title = title_desc,
x = X_desc,
y = Y_desc,
fill = group_desc
)+
scale_y_continuous(breaks=seq(y_start,y_end,y_steps))+
if (x_start >0) {
scale_x_continuous(breaks = seq(x_start, x_end, x_steps))
}
}
############################################################################
############################################################################
# Function Line Chart by group + Colored
############################################################################
line_chart_group_col = function(dataframe,
data_col,
df_filter_1,
df_filter_2,
x_start,
x_end,
x_steps,
title_desc,
Y_desc,
X_desc,
group_desc,
y_start,
y_end,
y_steps
) {
# Using the {{ }} operator to refer to column names
df_A = NULL
df_A = dataframe %>%
group_by({{ df_filter_1 }}, {{ df_filter_2 }}) %>%
summarise(tot_sum = sum({{data_col}}, na.rm = TRUE), .groups = "drop") %>%
ungroup()
# Convert {{ df_filter_2 }} to a factor
df_A = df_A %>%
mutate({{ df_filter_2 }} := as.factor({{ df_filter_2 }}))
# Print the new dataframe created
print(df_A)
ggplot(data = df_A,
aes(x = {{ df_filter_1 }},
y = tot_sum,
color = {{ df_filter_2 }},
group = {{ df_filter_2 }}
))+
geom_line(size = 1)+
theme_minimal() +
# Definisce i nomi degli assi
labs (title = title_desc,
x = X_desc,
y = Y_desc,
color = group_desc
)+
scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
scale_color_discrete() + # Use discrete color scale
if (x_start > 0) {
scale_x_continuous(breaks = seq(x_start, x_end, x_steps))
}
}
############################################################################
dati_re_texas <- read.csv("realestate_texas.csv", header = TRUE, sep = ",", fileEncoding = "ISO-8859-1")
n <- dim(dati_re_texas)[1] # Define dataset elements
head(dati_re_texas) # Controllo che il dataframe sia stato caricato
## 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
Il dataset rappresenta le seguenti variabili, dopo il simbolo “///” descrivo il tipo di variabile:
Città dove viene venduta la casa /// Qualitativa nominale
Anno di vendita - /// Quantitativa continua da trattare come qualitativa ordinale
Mese di vendita - /// Qualitativa nominale ( ciclica ) ma codificata in numeri
Numero delle vendite - // Quantitativa discreta
Volume di affari delle vendite - /// Quantitativa continua
Prezzo medio di vendita - /// Quantitativa continua
Listings , numero totale di annunci /// Quantitativa discreta
Months inventory , mesi necessari per vendere la casa /// Quantitativa continua
Le variabili quantitative continue sono tutte su scale di rapporti.
Le variabili che sottointendono una dimensione tempo sono :
year - anno di vendita
month - mese di vendita
# Define range
min_month=min(dati_re_texas$month)
max_month=max(dati_re_texas$month)
ggplot(data = dati_re_texas)+
# Select bar type
geom_bar(aes(x=month
),
col = "black",
fill = "lightblue"
)+
# Define axis names
labs (title = "Visualizzazione del numero delle osservazioni per mese",
x="Anno",
y ="Numero di osservazioni"
)+
# Define x scales numbers
scale_x_continuous(breaks=seq(min_month,max_month,1))+
# Define theme type
theme_classic()
====================================================================
# Define range
min_year=min(dati_re_texas$year)
max_year=max(dati_re_texas$year)
ggplot(data = dati_re_texas)+
# Select bar type
geom_bar(aes(x=year
),
# dodge barre affiancata stack sovrapposte
col = "black",
fill = "lightblue"
)+
# Define axis names
labs (title = "Visualizzazione del numero delle osservazioni per anno",
x="Anno",
y ="Numero di osservazioni"
)+
# Definisce sull'asse Y la precisione
scale_x_continuous(breaks=seq(min_year,max_year,1))+
# Definisco il tipo di tema
theme_classic()
Le variabili “year” e “month” ci dicono che le rilevazioni sono costanti e che quindi andranno valutate in combinazione ad altre variabili come ” sales” , “volume” , “city” o sales inventory.
Il campionamento è uniforme, sia per anno che per mese , questo indica che i dati sono bilanciati nel tempo e tutte le osservazioni che andremo a fare potranno essere più affidabili, senza distorsioni sul numero di osservazioni.
Grazie ad un campionamento cosi uniforme , si potranno fare anche delle valutazioni sul trend di crescita in maniera più precisa e affidabile.
====================================================================
All’interno del mio dataframe ho il nome delle città quindi per calcolare gli indici di posizione questa colonna verrà eliminata.
Costruisco un nuovo dataframe senza la colonna “city”
GLi indici di posizione che ho scelto sono: media, mediana, moda, minimo e massimo e percentili
dati_re_texas_no_city = dati_re_texas[, -1] # Remove first colomun
Rimuoviamo anche le variabili “year” e “month” per i motivi visti sopra.
dati_re_texas_no_city <- dati_re_texas_no_city[, !colnames(dati_re_texas_no_city) %in% "year"]
dati_re_texas_no_city <- dati_re_texas_no_city[, !colnames(dati_re_texas_no_city) %in% "month"]
kable(head(dati_re_texas_no_city),format = "simple", caption = "Database senza città")
| sales | volume | median_price | listings | months_inventory |
|---|---|---|---|---|
| 83 | 14.162 | 163800 | 1533 | 9.5 |
| 108 | 17.690 | 138200 | 1586 | 10.0 |
| 182 | 28.701 | 122400 | 1689 | 10.6 |
| 200 | 26.819 | 123200 | 1708 | 10.6 |
| 202 | 28.833 | 123100 | 1771 | 10.9 |
| 189 | 27.219 | 122800 | 1803 | 11.1 |
Abbiamo creato un dataframe con le variabili che abbiamo deciso di analizzare
====================================================================
df_temp = NULL
df_temp = calculate_index_pos(dati_re_texas_no_city)
df_temp$Mean = round(df_temp$Mean,2)
#df_temp["median_price", ] = round(as.numeric(df_temp["median_price", ]),0)
df_temp["median_price", ] = as.integer(df_temp["median_price", ])
print(df_temp)
## Mean Median Mode Min Max
## sales 192.29 175.5000 124.000 79.000 423.000
## volume 31.01 27.0625 35.335 8.166 83.547
## median_price 132665.00 134500.0000 130000.000 73800.000 180000.000
## listings 1738.02 1618.5000 1581.000 743.000 3296.000
## months_inventory 9.19 8.9500 8.100 3.400 14.900
## Qtl.25 Qtl.75
## sales 127.0000 247.000
## volume 17.6595 40.893
## median_price 117300.0000 150050.000
## listings 1026.5000 2056.000
## months_inventory 7.8000 10.950
kable(df_temp, vline="|",format = "simple", caption = "Indici di posizione per le variabili richieste")
| Mean | Median | Mode | Min | Max | Qtl.25 | Qtl.75 | |
|---|---|---|---|---|---|---|---|
| sales | 192.29 | 175.5000 | 124.000 | 79.000 | 423.000 | 127.0000 | 247.000 |
| volume | 31.01 | 27.0625 | 35.335 | 8.166 | 83.547 | 17.6595 | 40.893 |
| median_price | 132665.00 | 134500.0000 | 130000.000 | 73800.000 | 180000.000 | 117300.0000 | 150050.000 |
| listings | 1738.02 | 1618.5000 | 1581.000 | 743.000 | 3296.000 | 1026.5000 | 2056.000 |
| months_inventory | 9.19 | 8.9500 | 8.100 | 3.400 | 14.900 | 7.8000 | 10.950 |
Sales (Vendite):
Media (Mean): 192,29
Mediana (Median): 175,5
Moda (Mode): 124
Min: 79
Max: 423
Quartile 1 (Q1): 127
Quartile 3 (Q3): 247
L’intervallo tra il minimo e il massimo (79-423) indica una significativa variabilità nel numero di vendite.
La mediana è inferiore alla media, suggerendo una leggera asimmetria a destra. La maggior parte delle vendite si trova sotto la media, ma ci sono valori elevati che fanno salire la media.
Volume (Valore totale delle vendite in milioni di dollari):
Media: 31,01 milioni
Mediana: 27,06 milioni
Moda: 35,34 milioni
Min: 8,166 milioni
Max: 83,547 milioni
Q1: 17,659 milioni
Q3: 40,893 milioni
Anche qui c’è una grande variabilità. La media è più alta della mediana, indicando la presenza di alcuni volumi di vendita elevati che spostano la media verso l’alto.
Median Price (Prezzo mediano di vendita in dollari):
Media: 132.665,42
Mediana: 134.500
Moda: 130.000
Min: 73.800
Max: 180.000
Q1: 117.300
Q3: 150.050
Il prezzo mediano ha un intervallo di valori più ristretto rispetto alle altre variabili, il che suggerisce una minore variabilità e un mercato relativamente stabile in termini di prezzi. La media e la mediana sono molto vicine, indicando una distribuzione simmetrica dei prezzi.
Listings (Numero di annunci attivi):
Media: 1.738
Mediana: 1.618,5
Moda: 1.581
Min: 743
Max: 3.296
Q1: 1.026,5
Q3: 2.056
Questa variabile mostra una notevole variabilità, con un minimo di 743 e un massimo di 3.296. La distribuzione sembra essere simmetrica, con una mediana vicina alla media.
Months Inventory (Tempo in mesi necessario per vendere tutte le inserzioni correnti):
Media: 9,19 mesi
Mediana: 8,95 mesi
Moda: 8,1 mesi
Min: 3,4 mesi
Max: 14,9 mesi
Q1: 7,8 mesi
Q3: 10,95 mesi
Questa variabile rappresenta la quantità di tempo necessaria per vendere tutte le inserzioni. La media e la mediana sono simili, il che suggerisce una distribuzione simmetrica. Tuttavia, l’intervallo (da 3,4 a 14,9 mesi) mostra che in alcuni casi il tempo di vendita è molto più lungo rispetto alla media.
Variabilità: Alcune variabili, come il numero di vendite e il volume, mostrano una forte variabilità, suggerendo che il mercato ha un comportamento piuttosto dinamico.
Prezzi Stabili: Il prezzo mediano sembra essere abbastanza stabile, con una distribuzione simmetrica e un intervallo ristretto tra Q1 e Q3.
Inventory Months: Il tempo medio necessario per vendere tutte le inserzioni è di circa 9 mesi, ma con un minimo di 3,4 mesi e un massimo di 14,9 mesi. Questo può indicare che in alcuni periodi o aree, il mercato è molto più lento.
====================================================================
variabili: sales,volume,median_price,listings,month_inventory
df_temp= NULL
df_temp=calculate_variance_index(dati_re_texas_no_city)
kable(df_temp, format = "simple", caption = "Variabilità del dataset")
| Range | IQR | variance | st.dev | CV | |
|---|---|---|---|---|---|
| sales | 344.000 | 120.0000 | 6.344300e+03 | 79.651111 | 41.42203 |
| volume | 75.381 | 23.2335 | 2.772707e+02 | 16.651447 | 53.70536 |
| median_price | 106200.000 | 32750.0000 | 5.135730e+08 | 22662.148687 | 17.08218 |
| listings | 2553.000 | 1029.5000 | 5.665690e+05 | 752.707756 | 43.30833 |
| months_inventory | 11.500 | 3.1500 | 5.306889e+00 | 2.303669 | 25.06031 |
Sales (Vendite):
Range: 344, indica la differenza tra il valore massimo e il minimo delle vendite, mostrando una significativa variabilità.
IQR: 120, suggerisce una distribuzione piuttosto ampia tra il 25° e il 75° percentile, con una dispersione moderata.
Varianza: 6344,3, un valore elevato che conferma la grande variabilità nei dati delle vendite.
Deviazione Standard (St. Dev): 79,65, è alta e indica che i valori delle vendite tendono ad essere molto dispersi intorno alla media.
Volume (Valore totale delle vendite in milioni di dollari):
Range: 75,381, un ampio intervallo che evidenzia grande variabilità nel volume delle vendite.
IQR: 23,23, che rappresenta la dispersione interquartile e conferma una distribuzione relativamente ampia.
Varianza: 2772,7, suggerisce una variabilità significativa nei dati del volume.
Deviazione Standard: 16,65, anch’essa elevata, indicando una grande dispersione dei dati rispetto alla media.
Median Price (Prezzo mediano di vendita in dollari):
Range: 106200, un intervallo molto ampio che riflette la variazione nei prezzi mediani.
IQR: 32750, una dispersione interquartile significativa, che indica variazione nei prezzi medi per il 50% centrale dei dati.
Varianza: 5,13 x 10^8, un valore molto alto, riflettendo una grande variabilità nel prezzo mediano.
Deviazione Standard: 22662, conferma l’ampia dispersione nei prezzi mediani.
Listings (Numero di annunci attivi):
Range: 2553, che indica una notevole differenza tra il numero minimo e massimo di annunci attivi.
IQR: 1029,5, mostra che la metà centrale dei dati ha una distribuzione ampia, con differenze significative tra i quartili.
Varianza: 566569, una varianza elevata che suggerisce grande variabilità negli annunci attivi.
Deviazione Standard: 752,7, anch’essa elevata, confermando che i valori tendono ad essere dispersi intorno alla media.
Months Inventory (Tempo in mesi necessario per vendere tutte le inserzioni correnti):
Range: 11,5, mostra una variazione ampia nel tempo per vendere tutte le inserzioni.
IQR: 3,15, suggerisce una distribuzione più concentrata della metà centrale dei dati.
Varianza: 5,31, indica una variabilità relativamente bassa rispetto alle altre variabili.
Deviazione Standard: 2,3, una dispersione minore rispetto alle altre variabili, riflettendo stabilità nel tempo di vendita delle inserzioni.
Elevata Variabilità: Le variabili sales, volume, median_price, e listings mostrano elevata variabilità e dispersione, come evidenziato dai valori di varianza e deviazione standard elevati.
La variabile months_inventory ha una varianza e deviazione standard più basse, suggerendo che il tempo necessario per vendere le inserzioni tende ad essere più stabile rispetto alle altre variabili. un’analisi in frequenza e magari correlata alla città oppure anno/mese di vendita sarebbe utile
Range e IQR: La differenza tra il range e l’IQR indica che esistono valori estremi in tutte le variabili, ma in alcuni casi come il median_price e listings, questa differenza è più marcata, suggerendo la presenza di outlier, che si potrebbero verificare con dei Boxplot
====================================================================
Calcola la forma per le seguenti variabili: sales,volume,median_price,listings,month_inventory-
df_temp= NULL
df_temp=calculate_shape(dati_re_texas_no_city)
kable(df_temp,format = "simple", caption = "Indici di assimetria e curtosi")
| Asym_ind | Kurtosis | |
|---|---|---|
| sales | 0.7181040 | 2.686824 |
| volume | 0.8847420 | 3.176987 |
| median_price | -0.3645529 | 2.377038 |
| listings | 0.6494982 | 2.208210 |
| months_inventory | 0.0409753 | 2.825553 |
Sales: Asimmetria di 0,718
Volume: Asimmetria di 0,885
Median Price: Asimmetria di -0,365
Listings: Asimmetria di 0,649
Months Inventory: Asimmetria di 0,041
Sales: Curtosi di 2,687
Volume: Curtosi di 3,177
Median Price: Curtosi di 2,377
Listings: Curtosi di 2,208
Months Inventory: Curtosi di 2,826
# Using the function with the defined parameters
distr_freq = freq_grap(x = dati_re_texas_no_city$months_inventory,
seq_start = 0,
seq_end = 20,
seq_steps = 2,
title_desc= "Tempo per vendere un immobile [mesi] ",
y_desc ="Frequenza assoluta",
x_desc ="Divisione in classi della variabile tempo per concludere la vendita[mesi] ",
y_start = 0,
y_end = 300,
y_steps = 10)
Analisi della distribuzione dei dati:
La frequenza più alta si osserva nella classe 8-10 mesi, con circa 80 osservazioni, suggerendo che la maggior parte delle vendite di immobili si conclude in questo intervallo di tempo.
Le classi 6-8 mesi e 10-12 mesi mostrano frequenze significative, rispettivamente attorno a 60 e 50, indicando che anche questi periodi sono relativamente comuni per la vendita di immobili.
Le classi 12-14 mesi e 4-6 mesi hanno frequenze inferiori, rispettivamente attorno a 20-30, mentre le classi 2-4 mesi e 14-16 mesi hanno frequenze molto basse, sotto le 10 osservazioni, suggerendo che vendite molto rapide o molto lunghe sono meno comuni.
Forma della Distribuzione:
La distribuzione ha una forma a campana (gaussiana), indicando che i tempi di vendita tendono a concentrarsi attorno a una media, con un calo graduale di frequenza sia per tempi più brevi che per tempi più lunghi.
Questo suggerisce una distribuzione normale centrata attorno ai 8-10 mesi.
Interpretazione Pratica:
Il tempo medio per concludere la vendita di un immobile sembra aggirarsi attorno agli 8-10 mesi.
La distribuzione simmetrica indica che la maggior parte degli immobili non si vende né troppo velocemente né troppo lentamente rispetto a questa media, suggerendo un equilibrio nel mercato.
Gli agenti immobiliari o i venditori potrebbero aspettarsi che, in media, la vendita richieda circa 8-10 mesi, con una piccola probabilità di vendita estremamente rapida o ritardata.
====================================================================
La variabile con maggiore asimmetria è “volume” da punto 2.calcolo forma. Asym_ind
La variabile con maggiore variabilità è: “volume” da punto 2.calcolo variabilità indice CV
====================================================================
Distribuzione di frequenza in classi per la variabile “sales” ( vendite )
# Using the function with the defined parameters
###
distr_freq = freq_grap(x = dati_re_texas_no_city$sales,
seq_start = 50,
seq_end = 450,
seq_steps = 50,
title_desc = "Distribuzione in classi del numero di vendite / mese",
y_desc ="Frequenza assoluta",
x_desc ="Numero di vendite/mese divise in classi ",
y_start = 0,
y_end = 100,
y_steps = 5
)
Il grafico mostra la distribuzione del numero di vendite mensili diviso in classi, con la frequenza assoluta di ciascuna classe. Ecco l’analisi dettagliata:
Asse orizzontale: Rappresenta il numero di vendite al mese, diviso in classi che vanno da (50,100] fino a (400,450].
Asse verticale: Indica la frequenza assoluta, ossia il numero di volte in cui il numero di vendite mensili rientra in ciascuna classe.
Classe con Frequenza Massima:
La classe (100,150] ha la frequenza più alta, con circa 75 osservazioni. Ciò significa che, nel maggior numero di mesi, il numero di vendite si attesta in questo intervallo.
Segue la classe (150,200] con una frequenza attorno alle 60 osservazioni, indicativo di un secondo picco nella distribuzione.
Distribuzione Decrescente:
Dopo le prime due classi (100-150 e 150-200), la frequenza diminuisce gradualmente per le classi successive:
Le classi (200,250] e (250,300] hanno circa 30-40 osservazioni ciascuna.
Le classi superiori a 300 vendite al mese hanno frequenze ancora più basse, con meno di 20 osservazioni ciascuna.
Forma della Distribuzione:
La distribuzione è asimmetrica a destra, con una coda lunga verso destra. Questo suggerisce che la maggior parte delle vendite/mese si attesta sulla gamma 100-200 mentre è molto difficile fare grossi numeri
La concentrazione dei valori nelle classi inferiori indica che è più comune avere un numero moderato di vendite mensili rispetto a un numero molto elevato.
Andamento delle Vendite Mensili: La maggior parte dei mesi rientra nelle classi di vendite tra 100 e 200, suggerendo che questo è un intervallo tipico per il numero di vendite al mese.
Vendite Estremamente Alte: Le classi oltre 300 hanno frequenze molto basse, indicando che mesi con vendite estremamente elevate sono molto rari.
La distribuzione mostra che il numero di vendite mensili tende a concentrarsi tra 100 e 200, con una diminuzione progressiva verso classi più elevate.
La coda lunga a destra indica che, sebbene ci siano mesi con un numero molto elevato di vendite, questi sono eventi rari.
Questo grafico suggerisce che, per la maggior parte del tempo, il mercato delle vendite si mantiene in una fascia moderata, con picchi elevati che sono occasionali.
In sintesi, la maggior parte delle vendite mensili rientra in un intervallo prevedibile e moderato, mentre mesi con un numero eccezionalmente alto di vendite sono meno comuni. Questa distribuzione può aiutare a pianificare strategie di vendita e risorse, sapendo che le vendite mensili di solito si concentrano in una fascia specifica.
===================================================================
Calcolo l’indice di etereogeneità di Gini per quanto vale la variabile “sales” divisa in classi che ne lmio caso vale 0.4125
Gini_tmp_df=t(distr_freq[,1]) # clean dataframe and invert rows with columns
Gini(Gini_tmp_df)
## [1] 0.4125
Analisi del valore :
Un Gini di 0,4125 suggerisce che alcuni immobili si vendono molto più rapidamente rispetto ad altri, con una distribuzione dei tempi di vendita che è piuttosto diseguale.
Questo potrebbe significare che, in alcune aree o per alcuni tipi di immobili, le vendite si concludono molto rapidamente, mentre in altre richiedono tempi più lunghi.
Possibili Cause di Disuguaglianza:
Venditore: i venditori delle varie città utilizzano tecniche di marketing differente per riuscire ad effetturare la vendita.
Prezzi e accessibilità: Prezzi più alti possono allungare i tempi di vendita rispetto a immobili più accessibili.
Condizioni economiche e dinamiche locali: Alcune aree potrebbero avere un mercato più attivo rispetto ad altre, influenzando i tempi di vendita.
Implicazioni:
Per i venditori: Un mercato con questa disuguaglianza nei tempi di vendita potrebbe richiedere strategie di vendita diverse a seconda della città
Per gli operatori del mercato immobiliare: Potrebbe essere utile comprendere quali fattori determinano le differenze nei tempi di vendita per poter capire quali sono le cause.
Conclusioni:
Un indice di Gini di 0,4125 indica una certa disparità nel tempo per concludere una vendita, segnalando che il tempo di permanenza sul mercato non è uniforme.
Comprendere meglio i fattori che portano a questa disuguaglianza potrebbe aiutare a migliorare le strategie di vendita e ad adattarsi alle caratteristiche specifiche del mercato immobiliare locale.
====================================================================
col_count=count_word ("Beaumont",dati_re_texas$city)
col_length=length(dati_re_texas$city)
prob_city = col_count/col_length
prob_city
## [1] 0.25
col_count=count_word ("7",dati_re_texas$month) #7 means July
col_length=length(dati_re_texas$month)
prob_month = col_count/col_length
prob_month
## [1] 0.08333333
count_res_columns = count_words_in_columns(df=dati_re_texas,
column_A = "year",
word_A = "2012",
column_B = "month",
word_B = "12"
)
count_length=length(dati_re_texas$year)
print(count_res_columns/count_length)
## [1] 0.01666667
CONSEGNA: 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.
Creo una nuova variabile prezzo medio di vendita
# Made a copy of dataframe
dati_re_texas_sales = NULL
dati_re_texas_sales = dati_re_texas
# Add new column for average sale
dati_re_texas_sales$avg_sale=(dati_re_texas$volume*1000000)/dati_re_texas$sales
# Add new column for
dati_re_texas_sales$gain_force_1=(dati_re_texas$sales/dati_re_texas$listings)
distr_freq = freq_grap(x = dati_re_texas_sales$gain_force_1,
seq_start = 0.0,
seq_end = 0.5,
seq_steps = 0.05,
title_desc = "Distribuzione in classi della variabile rapporto tra vendite e annunci",
y_desc ="Frequenza assoluta",
x_desc ="Variabile rapporto: vendita su annnunci pubblicati ",
y_start = 0,
y_end = 130,
y_steps = 10
)
Interpretazione della Distribuzione:
La distribuzione mostra una forte concentrazione nelle classi più basse (0,05-0,15), indicando che, in media, il rapporto vendite/annunci è molto basso.
La distribuzione è asimmetrica e decresce rapidamente per i valori più alti, indicando che è raro avere un alto rapporto vendite/annunci pubblicati.
Interpretazione Pratica:
La maggior parte degli immobili pubblicizzati non viene venduta in modo rapido o in grandi proporzioni, come indicato dal basso rapporto vendite/annunci.
Un rapporto basso può indicare un mercato con un’elevata disponibilità di immobili rispetto alla domanda, o una maggiore difficoltà nel concludere le vendite rispetto al numero di annunci attivi.
Gli operatori del mercato immobiliare potrebbero usare questi dati per ottimizzare la loro strategia pubblicitaria, sapendo che solo una piccola frazione degli annunci si trasforma in vendite.
Conclusioni:
Il rapporto tra vendite e annunci pubblicati è generalmente basso, con la maggior parte delle vendite concentrate nelle classi più basse (0,05-0,15).
Il mercato sembra avere più immobili pubblicizzati di quanti vengano venduti, suggerendo che esiste una discrepanza tra offerta e domanda.
Per fare una verifica supplementare uso un grafico a barre affiancate dove ogni classe avrà anche le 4 città
#################################################
# class and graph maker with dodge function
freq_grap_dodge = function(x,
df_class,
group_tbl,
seq_start,
seq_end,
seq_steps,
title_desc,
y_start,
y_end,
y_steps
) {
# Create the classes
x_cl = cut(df_class, seq(seq_start, seq_end, seq_steps))
x_n = length(df_class)
# Create the frequency distribution table
distr_freq = as.data.frame(
cbind(
ni = table(x_cl), # Absolute frequency
fi = table(x_cl) / x_n, # Relative frequency
Ni = cumsum(table(x_cl)), # Cumulative absolute frequency
Fi = cumsum(table(x_cl) / x_n) # Cumulative relative frequency
)
)
# Create the frequency distribution plot
plot = ggplot(data =x) +
geom_bar(aes(x=x_cl,
fill =group_tbl),
# dodge barre affiancata stack sovrapposte
position = "dodge",
stat = "count",
col = "black"
)+
# Definisce i nomi degli assi
labs (title = title_desc,
x="classi ",
y ="Frequenza assolute"
)+
# Definisce sull'asse Y la precisione
scale_y_continuous(breaks=seq(y_start,y_end,y_steps))+
# Definisco il tipo di tema
theme_classic()+
theme(legend.position = "bottom")
print(plot) # Force the plot to display
return(distr_freq)
}
gain_df = freq_grap_dodge (x=dati_re_texas_sales,
df_class=dati_re_texas_sales$gain_force_1,
group_tbl=dati_re_texas_sales$city,
seq_start =0,
seq_end =0.5,
seq_steps =0.05,
title_desc= "Distribuzione in classi della variabile vendite su annunci, divisi per città",
y_start=0,
y_end =130,
y_steps=10
)
Il grafico rappresenta un istogramma della frequenza assoluta del rapporto tra vendite e annunci pubblicati, suddiviso per diverse città: Beaumont, Bryan-College Station, Tyler, e Wichita Falls. Vediamo l’analisi dettagliata:
Distribuzione per Città e Classi:
Il rapporto vendite/annunci è suddiviso in classi di intervalli (da 0,05-0,1 fino a 0,35-0,4), e ogni città è rappresentata con un colore diverso.
Le frequenze assolute sono visivamente rappresentate per ciascuna città all’interno di ciascuna classe.
Andamento Generale:
Nella classe 0,05-0,1, la città Bryan-College Station ha la frequenza più alta con circa 40 osservazioni, seguita da Beaumont con circa 30 osservazioni e Tyler con circa 20.
Nella classe 0,1-0,15, la città con il maggior numero di osservazioni è Tyler con più di 40 osservazioni, seguita da Bryan-College Station e Beaumont con frequenze simili.
Nelle classi più alte (da 0,15-0,2 in poi), la frequenza diminuisce drasticamente per tutte le città, con Bryan-College Station che mantiene qualche osservazione fino alla classe 0,3-0,35, mentre le altre città hanno frequenze molto basse o nulle.
Interpretazione per Città:
Bryan-College Station mostra una distribuzione concentrata nelle classi 0,05-0,1 e 0,15-0,2, ma si distingue anche nelle classi più alte (0,2 e oltre), suggerendo una certa variabilità nel rapporto vendite/annunci, con la possibilità di vendite più elevate rispetto agli annunci pubblicati rispetto alle altre città.
Tyler ha una forte presenza nella classe 0,1-0,15, indicando che qui il rapporto vendite/annunci tende ad essere un po’ più alto rispetto alle altre città, ma è quasi assente nelle classi superiori.
Beaumont ha una distribuzione simile a quella di Bryan-College Station nelle classi più basse, ma senza presenza significativa nelle classi oltre 0,2.
Wichita Falls è rappresentata meno frequentemente e principalmente nelle classi 0,05-0,1 e 0,1-0,15, con una distribuzione simile a Beaumont ma con frequenze minori.
Considerazioni Pratiche:
Bryan-College Station sembra avere un rapporto vendite/annunci più variabile, con alcuni valori anche in classi più alte, il che potrebbe indicare un mercato più dinamico oppure una strategia del venditore molto redditizia
Tyler presenta un elevato rapporto vendite/annunci nella classe 0,1-0,15, suggerendo una buona conversione degli annunci in vendite rispetto ad altre città, ma il rapporto tende a restare basso evidenziando forse qualche perplessità nella strategia di vendita utilizzata
Beaumont e Wichita Falls mostrano una distribuzione che indica una bassa conversione, con la maggior parte degli annunci concentrati in classi basse, probabilmente per entrambe le città le richieste del mercato sono basse
Conclusioni:
Gli agenti immobiliari o i venditori potrebbero usare queste informazioni per adattare le strategie di marketing in base alla città, sapendo che Bryan-College Station potrebbe tollerare una maggiore pubblicazione di annunci, mentre Tyler sembra avere una migliore conversione nelle classi intermedie.
====================================================================
CONSEGNA: 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
sales_year_df = freq_grap_dodge (x=dati_re_texas,
df_class =dati_re_texas$sales,
group_tbl =dati_re_texas$city,
seq_start =50,
seq_end =500,
seq_steps =50,
title_desc= "Distribuzione in classi della variabile vendite ottimizzata per le varie città",
y_start=0,
y_end =100,
y_steps=10
)
Beaumont (rosso): Le vendite di Beaumont sono distribuite principalmente nella classe (100,150] e in misura minore nelle classi (150,200] e (250,300]. La presenza nelle altre classi è minima.
Bryan-College Station (verde): Ha una distribuzione più uniforme rispetto a Beaumont, con vendite distribuite in diverse classi fino a (350,400], indicando una maggiore variabilità nei volumi di vendita.
Tyler (azzurro): Mostra una concentrazione di vendite nelle classi superiori, come (250,300] e (300,350], suggerendo che a Tyler il numero di vendite è più elevate rispetto alle altre città.
Wichita Falls (viola): La maggior parte delle vendite si trova nella classe (100,150], con poche osservazioni nelle altre classi. Significa che in questa città è molto più difficile vendere.
Wichita Falls e Beaumont sembrano avere una concentrazione maggiore di vendite nelle fasce più basse, mentre Tyler ha una concentrazione maggiore nelle fasce più alte.
Bryan-College Station presenta una distribuzione più ampia delle vendite, che copre una gamma maggiore di classi, il che potrebbe indicare una maggiore eterogeneità nel mercato di quella città.
===================================================================
#################################################
# Function to sum a column based on a filter
#################################################
sum_column_flt_graph = function(dataframe,
filter_col,
data_col,
title_desc,
y_desc,
x_desc,
y_start,
y_end,
y_steps,
x_start,
x_end,
x_steps
) {
# Using the {{ }} operator to refer to column names
result = dataframe %>%
group_by({{ filter_col }}) %>%
summarise(
total_sum = sum({{ data_col }}, na.rm = TRUE),
mean_value = mean({{ data_col }}, na.rm = TRUE),
sd_value = sd({{ data_col }}, na.rm = TRUE)
)
print(result)
# Create the frequency distribution plot
plot= ggplot(data=result)+
geom_col(aes(x= {{ filter_col }},
y=total_sum),
col = "black",
fill = "lightblue"
)+
# Titles and labels
labs(title = title_desc,
x = x_desc,
y = y_desc)+
#
#scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
theme_classic() +
scale_y_continuous(breaks = seq(y_start, y_end, y_steps))+
if (x_start >0) {
scale_x_continuous(breaks = seq(x_start, x_end, x_steps))
}
print(plot) # Force the plot to display
return(result)
}
#
#################################################
#
sales_by_year = NULL
sales_by_year = sum_column_flt_graph(dati_re_texas,
city,
sales,
" Vendite divise per città",
" Totale vendite ",
" Città osservata",
0,
20000,
2000,
0,
0,
0
)
## # A tibble: 4 × 4
## city total_sum mean_value sd_value
## <chr> <int> <dbl> <dbl>
## 1 Beaumont 10643 177. 41.5
## 2 Bryan-College Station 12358 206. 85.0
## 3 Tyler 16185 270. 62.0
## 4 Wichita Falls 6964 116. 22.2
Il grafico mostra il totale delle vendite per ciascuna città osservata. Ecco un’analisi dettagliata:
Tyler: Questa città ha il numero totale di vendite più alto tra le città analizzate, con un valore superiore a 16.000 vendite. Questo potrebbe indicare un mercato immobiliare molto attivo, una maggiore domanda o un maggior numero di immobili disponibili.
Bryan-College Station: Ha il secondo totale di vendite più alto, con poco più di 12.000 vendite. Anche qui il mercato sembra essere attivo, anche se non tanto quanto a Tyler.
Beaumont: Si posiziona poco sotto Bryan-College Station, con un totale di vendite intorno ai 10.000. Beaumont ha un mercato inferiore rispetto alle prime due città, ma comunque con un volume significativo di vendite.
Wichita Falls: Questa città ha il numero totale di vendite più basso, con meno di 8.000 vendite. Questo può indicare un mercato meno attivo o una minore domanda rispetto alle altre città analizzate.
Differenze nel mercato immobiliare: Tyler sembra avere il mercato più dinamico in termini di volume di vendite, seguito da Bryan-College Station e Beaumont. Wichita Falls, al contrario, ha un mercato significativamente meno attivo.
Possibili Implicazioni: Le differenze nei totali di vendita possono riflettere vari fattori, come la popolazione, il reddito medio, il numero di immobili disponibili e la domanda locale.
=================================================================
#
sales_by_month = NULL
sales_by_month = sum_column_flt_graph(dati_re_texas,
month,
sales,
" Vendite divise per mese",
" Totale vendite ",
" Mese osservato",
0,
20000,
2000,
1,
12,
1
)
## # A tibble: 12 × 4
## month total_sum mean_value sd_value
## <int> <int> <dbl> <dbl>
## 1 1 2548 127. 43.4
## 2 2 2817 141. 51.1
## 3 3 3789 189. 59.2
## 4 4 4234 212. 65.4
## 5 5 4777 239. 83.1
## 6 6 4871 244. 95.0
## 7 7 4715 236. 96.3
## 8 8 4629 231. 79.2
## 9 9 3647 182. 72.5
## 10 10 3598 180. 75.0
## 11 11 3137 157. 55.5
## 12 12 3388 169. 60.7
Trend Stagionale:
Il grafico mostra un andamento stagionale delle vendite, con un incremento nei mesi primaverili e una diminuzione nei mesi autunnali e invernali.
I mesi con le vendite più alte sono maggio e giugno, con oltre 4.000 vendite. Questo picco potrebbe riflettere un aumento della domanda immobiliare tipico dei mesi caldi, quando molte persone tendono a comprare case.
Mesi di Bassa Vendita:
Stabilità nei Mesi Estivi:
Declino nel Periodo Autunnale:
Stagionalità del Mercato: Il mercato immobiliare sembra seguire un ciclo stagionale, con una maggiore attività in primavera e estate, mentre l’inverno vede un calo delle vendite.
Implicazioni per Venditori e Compratori: I venditori potrebbero ottenere prezzi migliori e tempi di vendita più rapidi durante i mesi primaverili ed estivi, mentre gli acquirenti potrebbero trovare più opportunità o sconti durante i mesi invernali.
Questa distribuzione mensile suggerisce che l’analisi dei dati dovrebbe tenere conto della stagionalità per valutare meglio i trend e le performance del mercato immobiliare.
===================================================================
sales_by_year = NULL
sales_by_year = sum_column_flt_graph(dati_re_texas,
year,
sales,
" Totali vendita per anno",
" Totale vendite ",
" Città osservata",
0,
20000,
2000,
2010,
2014,
1
)
## # A tibble: 5 × 4
## year total_sum mean_value sd_value
## <int> <int> <dbl> <dbl>
## 1 2010 8096 169. 60.5
## 2 2011 7878 164. 63.9
## 3 2012 8935 186. 70.9
## 4 2013 10172 212. 84.0
## 5 2014 11069 231. 95.5
Trend Crescente:
Si osserva un trend in crescita nelle vendite annuali dal 2010 al 2014. Ogni anno, il totale delle vendite è aumentato rispetto all’anno precedente.
Questo potrebbe indicare una crescita nel mercato immobiliare, con un aumento della domanda o della disponibilità di proprietà nel periodo considerato.
Andamento delle Vendite:
Nel 2010 e nel 2011, il totale delle vendite si aggira intorno agli 8.000. Successivamente, dal 2012, si nota un aumento significativo, con un incremento costante fino al 2014.
L’anno 2014 registra il totale di vendite più alto, superando le 10.000 unità.
Possibili Fattori:
L’incremento delle vendite potrebbe riflettere una ripresa economica o un miglioramento delle condizioni del mercato immobiliare in questo periodo.
Potrebbe anche essere influenzato da fattori come la crescita della popolazione, una maggiore disponibilità di credito o un aumento della fiducia dei consumatori.
Tendenza Positiva: Il mercato immobiliare sembra essere in espansione, con un aumento costante delle vendite annuali.
Implicazioni per il Mercato: Questo trend può essere un segnale positivo per investitori e professionisti del settore immobiliare, indicando un periodo di crescita.
Questo grafico fornisce un’indicazione generale della tendenza del mercato immobiliare in questi anni, suggerendo che il periodo 2010-2014 è stato caratterizzato da un rafforzamento delle vendite.
====================================================================
ggplot(data=dati_re_texas)+
geom_boxplot(aes(x=city,
y=median_price),
fill="lightblue"
)+
labs(title =" Box plot del prezzo mediano per città di osservazione ",
x = " Città",
y = " Prezzo mediano")+
scale_y_continuous(breaks=seq(75000,190000,5000))
Il grafico rappresenta un box plot del prezzo mediano di vendita per diverse città: Beaumont, Bryan-College Station, Tyler e Wichita Falls. Ogni box plot mostra la distribuzione dei prezzi mediani per queste città, consentendo di confrontare i livelli e la variabilità dei prezzi.
Analisi dei Box Plot per Città
Beaumont:
Prezzo Mediano: Attorno ai 130.000 dollari.
Intervallo Interquartile (IQR): La maggior parte dei valori si trova tra circa 125.000 e 135.000 dollari.
Outlier: C’è un outlier sopra i 165.000 dollari, che indica la presenza di una vendita a un prezzo significativamente più alto rispetto alla media locale.
Distribuzione: La distribuzione è abbastanza simmetrica, con una estensione verso il basso.
Bryan-College Station:
Prezzo Mediano: È la città con il prezzo mediano più alto, attorno ai 155.000 dollari.
IQR: I prezzi variano principalmente tra 145.000 e 165.000 dollari.
Outlier: Si osserva un outlier sopra i 180.000 dollari.
Distribuzione: La città presenta una distribuzione piuttosto concentrata attorno alla mediana, con una certa variabilità verso l’alto.
Tyler:
Prezzo Mediano: Si colloca attorno ai 140.000 dollari.
IQR: La maggior parte dei valori è compresa tra 130.000 e 150.000 dollari.
Distribuzione: Non ci sono outlier evidenti, suggerendo una distribuzione omogenea dei prezzi senza valori estremi.
Wichita Falls:
Prezzo Mediano: È la città con il prezzo mediano più basso, attorno ai 105.000 dollari.
IQR: La distribuzione principale dei prezzi è tra 95.000 e 105.000 dollari.
Outlier: Si nota un outlier sopra i 135.000 dollari.
Distribuzione: Presenta una certa variabilità verso il basso, indicando una gamma più ampia di prezzi inferiori rispetto alle altre città.
Confronto tra le Città
Prezzi Mediani: Bryan-College Station ha il prezzo mediano più alto, seguita da Tyler e Beaumont, mentre Wichita Falls ha il prezzo mediano più basso.
Variabilità dei Prezzi: Tutte le città mostrano un intervallo interquartile stretto, indicando che la maggior parte dei prezzi è concentrata attorno alla mediana, con Bryan-College Station leggermente più costosa.
Outlier: Le città di Beaumont, Bryan-College Station e Wichita Falls presentano alcuni outlier, che indicano la presenza di vendite a prezzi significativamente più alti rispetto alla media della città.
Mercato Immobiliare più costoso: Bryan-College Station e Tyler hanno prezzi mediani più elevati, il che potrebbe indicare una domanda più alta e/o proprietà di valore maggiore.
Mercato più accessibile: Wichita Falls ha i prezzi più bassi, suggerendo un mercato più accessibile.
Omogeneità dei prezzi: La maggior parte dei prezzi si concentra attorno alla mediana in ogni città, con una certa stabilità nella distribuzione.
In sintesi, il grafico mostra differenze chiare nei prezzi mediani tra le città, con Bryan-College Station e Tyler che tendono ad avere prezzi più elevati e Wichita Falls che offre opzioni più economiche. Gli outlier presenti in 3 su 4 delle città osservate suggeriscono la presenza di immobili di valore superiore rispetto alla media del mercato locale.
====================================================================
# Creazione delle classi per 'sales' con cut, se gli intervalli sono appropriati
dati_re_texas$sales_cl = NULL
dati_re_texas$sales_cl <- cut(dati_re_texas$sales, breaks = seq(70, 490, 70), include.lowest = TRUE)
# Grafico con ggplot
ggplot(data = dati_re_texas) +
geom_boxplot(aes(x = city,
y = median_price,
fill = sales_cl)) +
labs(title = "Box plot del prezzo mediano diviso in classi per città di osservazione",
x = "Città",
y = "Prezzo mediano",
fill ="Classe di prezzo"
) +
scale_y_continuous(breaks=seq(75000,190000,10000))+
scale_fill_brewer(palette = "Set3")
Questa analisi si riferisce solamente alle varie classi di distribuzione del prezzo mediano. Le classi rappresentano la quantità di unità vendite.
Beaumont:
Bryan-College Station:
Tyler:
Wichita Falls:
====================================================================
# Boxplot with ggplot
ggplot(data = dati_re_texas) +
geom_boxplot(aes(x = city,
y = volume,
fill = as.factor(year))) + # Convert year to a factor for distinct colors
labs(title = "Box Plot del volume di vendite per città e anno di osservazione", x = "Città",
y = "Volume di vendita in milioni di dollari",
fill="anni") +
scale_fill_brewer(palette = "Set3") + # Optional color palette for distinct colors
theme_minimal()+ # Optional for a cleaner look
scale_y_continuous(breaks = seq(0, 100, 5))
L’analisi del grafico a box plot del volume di vendite per città e anno di osservazione rivela diverse tendenze e variazioni nei dati delle città analizzate (Beaumont, Bryan-College Station, Tyler, e Wichita Falls) per gli anni dal 2010 al 2014. Ecco una descrizione dettagliata:
Beaumont:
Il volume delle vendite rimane relativamente stabile nel periodo 2010-2014, con valori compresi principalmente tra i 15 e i 35 milioni di dollari.
Gli anni 2010,2011,2013,2014 presentano una maggiore concentrazione dei dati, mentre l’anno 2012 mostra una contrazione dei volumi di vendita dovute probabilmente a qualche evento esterno
Alcuni outlier sono visibili sotto il boxplot del 2012, indicando vendite significativamente inferiori rispetto alla mediana.
Bryan-College Station:
Questa città mostra un forte incremento nel volume delle vendite negli anni, specialmente tra il 2012 e il 2014.
L’anno 2013 presenta la più alta dispersione dei valori, con un range ampio che si estende fino a circa 70 milioni di dollari.
Il volume sembra aumentare progressivamente di anno in anno, segnalando una crescita del mercato.
Tyler:
Anche Tyler mostra una tendenza crescente nel volume delle vendite, seppur meno marcata rispetto a Bryan-College Station.
Gli anni dal 2012 al 2014 hanno valori di volume di vendita più elevati rispetto agli anni precedenti, con un range tra i 30 e i 70 milioni di dollari.
Wichita Falls:
Wichita Falls ha volumi di vendita notevolmente inferiori rispetto alle altre città, con valori che variano tra i 10 e i 25 milioni di dollari.
La distribuzione dei volumi di vendita è abbastanza stabile nel tempo, con una variazione minima tra i vari anni e una dispersione ridotta.
Questo potrebbe indicare un mercato più maturo o meno dinamico rispetto alle altre città.
Tendenze Crescenti: Le città di Bryan-College Station e Tyler mostrano una chiara tendenza alla crescita nei volumi di vendita.
Stabilità di Beaumont e Wichita Falls: Queste città mostrano meno variazioni anno per anno, con Wichita Falls che presenta volumi di vendita costantemente più bassi rispetto alle altre.
Dispersione dei Dati: Gli anni 2013 e 2014 in particolare mostrano una maggiore dispersione dei volumi di vendita nelle città più dinamiche (Bryan-College Station e Tyler), suggerendo una possibile espansione del mercato .
In generale, il grafico evidenzia la dinamicità del mercato immobiliare in città come Bryan-College Station e Tyler, mentre le altre città mantengono un andamento più stabile e contenuto
====================================================================
# Boxplot with ggplot
ggplot(data = dati_re_texas) +
geom_boxplot(aes(x = city,
y = sales,
fill = as.factor(year))) + # Convert year to a factor for distinct colors
labs(title = "Box plot delle vendite per città e anno di osservazione", x = "Città",
y = " Numero di vendite",
fill="Anni") +
scale_fill_brewer(palette = "Set3") + # Optional color palette for distinct colors
theme_minimal()+ # Optional for a cleaner look
scale_y_continuous(breaks = seq(0, 500,25))
Il box plot rappresenta il numero di vendite per città e anno di osservazione. Vediamo come varia il numero di vendite nel tempo e tra le città.
Beaumont:
Il numero di vendite è piuttosto stabile e si concentra tra i 120 e i 250 circa.
Le variazioni tra i diversi anni sono limitate, con un valore mediano che rimane abbastanza costante.
C’è un outlier verso il basso, che potrebbe indicare un anno particolarmente basso per le vendite ( 2012 )
Dal 2013 in poi vediamo un costante miglioramento delle vendite
Bryan-College Station:
La città mostra una maggiore variabilità rispetto a Beaumont, con il numero di vendite che si colloca tra le 100 e le 325 vendite.
Si nota un incremento nelle vendite nel corso degli anni, in particolare nel 2013 e sopratutto nel 2014, che presentano valori mediani più elevati.
La variabilità è maggiore nei due anni finali, suggerendo un aumento dell’attività di mercato.
Tyler:
Anche Tyler mostra un aumento delle vendite nel tempo, con i valori che oscillano tra 170 e 375 circa.
I box plot evidenziano un incremento costante nelle vendite, con valori mediani in crescita nel 2013 e 2014.
Wichita Falls:
Questa città presenta il numero di vendite più basso tra le quattro città osservate, con un intervallo che va da circa 75 a 160.
La variabilità tra gli anni è contenuta, con una stabilità nei valori mediani nel periodo osservato.
Non si notano incrementi significativi nel numero di vendite, indicando un mercato più stabile e meno soggetto a variazioni.
Analisi per anno di osservazione
Le città come Bryan-College Station in primis e Tyler mostrano un trend crescente nelle vendite, in particolare nel 2013 e 2014. Questo potrebbe indicare un’espansione del mercato immobiliare in questi luoghi, con un aumento dell’attività di compravendita.
Beaumont e Wichita Falls, invece, mostrano una crescita più limitata, suggerendo un mercato più stabile e meno soggetto a variazioni significative.
In sintesi, questo grafico evidenzia come alcune città, come Bryan-College Station e Tyler, abbiano visto un aumento delle vendite nel periodo considerato, in particolare negli ultimi due anni. Beaumont e Wichita Falls, al contrario, presentano mercati più stabili con variazioni minime tra gli anni. Questo potrebbe riflettere dinamiche locali, come cambiamenti economici o demografici, che hanno influenzato il mercato immobiliare in modo differente tra le città.
====================================================================
# Define the function
divide_sales_by_month_city = function(data) {
# Group data by city and month, then summarize the total sales
summarized_data <- data %>%
group_by(city, month) %>%
summarise(total_sales = sum(sales, na.rm = TRUE)) %>%
ungroup()
return(summarized_data)
}
# Suppose dati_re_texas is your input dataframe
result <- divide_sales_by_month_city(dati_re_texas)
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
#print(result)
# Bar graph with absolut values
ggplot(data = result)+
# selezione tipo grafico
geom_col(aes(x=month,
y=total_sales,
fill =city),
# dodge barre affiancata stack sovrapposte
position = "stack",
stat = "count",
col = "black"
)+
labs(x = "Mese",
y = "Totali vendite ",
title = "Totale delle vendite mensili per città ",
fill="Città")+
scale_x_continuous(breaks=seq(1,12,1))+
scale_y_continuous(breaks=seq(0,5000,250))+
theme_minimal()
## Warning in geom_col(aes(x = month, y = total_sales, fill = city), position =
## "stack", : Ignoring unknown parameters: `stat`
Analisi del grafico
Il grafico mostra la percentuale di vendite totali per città e mese in forma di grafico a barre normalizzato. Ogni barra rappresenta la distribuzione del numero di vendite tra le città per ciascun mese.
Distribuzione mensile per città:
Le città rappresentate sono Beaumont, Bryan-College Station, Tyler e Wichita Falls, ognuna con un colore distinto.
L’asse Y rappresenta il numero di vendite, mostrando il numero di vendite mensili per ciascuna città rispetto al totale delle vendite di quel mese.
Beaumont (rosso):
Bryan-College Station (verde):
Le vendite sono elevate tra maggio e agosto, ma diminuiscono in modo più marcato nei mesi invernali.
Ha un contributo significativo al totale delle vendite .
Tyler (azzurro):
Presenta una forte presenza nei mesi estivi, con un picco tra giugno e agosto.
Anche questa città segue l’andamento stagionale delle vendite, con numeri più bassi nei mesi freddi, anche se in maniera minore rispetto a Bryan-college
Ha un contributo molto significativo al totale delle vendite
Wichita Falls (viola):
È la città con il minor numero di vendite complessive, rappresentata dalla parte inferiore delle barre.
Anche qui c’è una certa stagionalità, con un lieve aumento tra maggio e agosto, ma con un volume di vendite complessivo molto più basso rispetto alle altre città.
Stagionalità: Il grafico evidenzia una chiara stagionalità nelle vendite immobiliari, con i mesi estivi che registrano il maggior numero di transazioni.
Distribuzione per città: Tyler e Bryan-College Station dominano le vendite totali, mentre Beaumont ha un contributo intermedio e Wichita Falls rappresenta una quota minore.
Tendenze generali: Questo modello di vendita potrebbe indicare una maggiore attività del mercato immobiliare durante l’estate, quando è più probabile che le persone siano disponibili a comprare o vendere case.
Questo tipo di grafico è utile per comprendere i periodi di alta e bassa attività nel mercato immobiliare e per pianificare le strategie di vendita in base ai picchi stagionali.
====================================================================
# Bar graph normalized using GGplot
ggplot(data = result) +
geom_bar(aes(x = month,
y = total_sales,
fill = city),
position = "fill",
stat = "identity",
col = "black") +
labs(x = "Mese",
y = "Percentuale vendite (%)",
title = "Percentuale di vendite totali per città e mese",
fill="Città") +
# Show percentage on Y axe
scale_y_continuous(labels = scales::percent_format(scale = 100)) +
# Show index month from 1 to 12 by 1
scale_x_continuous(breaks=seq(1,12,1))+
theme_minimal()
Il grafico mostra la percentuale di vendite totali per città e mese in forma di grafico a barre normalizzato. Ogni barra rappresenta la distribuzione percentuale delle vendite tra le città per ciascun mese.
Distribuzione mensile per città:
Le città rappresentate sono Beaumont, Bryan-College Station, Tyler e Wichita Falls, ognuna con un colore distinto.
L’asse Y rappresenta la percentuale di vendite (da 0% a 100%), mostrando la quota di mercato mensile per ciascuna città rispetto al totale delle vendite di quel mese.
Tendenze osservabili:
Beaumont (rosso): Ha una quota consistente delle vendite per la maggior parte dei mesi, solitamente attorno al 25-30%.
Bryan-College Station (verde): Rappresenta una quota simile a Beaumont, ma durante i mesi estivi la percentuale sale considerevolmente fino al 40%
Tyler (blu): Tende a dominare in molti mesi, spesso rappresentando la quota maggiore delle vendite, attorno al 35-40%.
Wichita Falls (viola): Ha la quota più piccola tra le città per quasi tutti i mesi, con un contributo che oscilla tra il 10% e il 20%.
Variazioni stagionali:
La quota di ciascuna città rimane relativamente costante nel corso dei mesi, con variazioni minime tra i mesi. Tuttavia, ci sono fluttuazioni, come nei mesi 5, 6 e 8, dove si notano cambiamenti nelle proporzioni di vendita di alcune città (ad esempio, un aumento della quota del Bryan College).
Questo potrebbe indicare che il mercato immobiliare ha una struttura stabile per città come Whichita Falls , Beaumont e Tyler che mantengono una proporzione simile di vendite nel tempo, senza forti variazioni stagionali, ad eccetto Bryan-College che nei mesi estivi incrementa la vendita
Concentrazione di Mercato:
Tyler emerge come la città con la quota di mercato più consistente nei vari mesi, il che potrebbe riflettere una domanda più elevata o un numero maggiore di immobili disponibili rispetto alle altre città.
Wichita Falls ha la quota di mercato più bassa, il che potrebbe indicare una minore attività di vendita o una minore disponibilità di immobili in quella zona.
Dominanza di Tyler: Tyler tende ad avere la quota di mercato più alta, seguita da Bryan-College Station. Wichita Falls ha la quota più bassa.
Possibile Intervento Strategico: Se l’obiettivo è incrementare la quota di mercato di città con percentuali inferiori, come Wichita Falls, potrebbe essere utile studiare azioni specifiche per attrarre maggiore domanda.
====================================================================
bar_graph_group_time = function(dataframe,
data_col,
df_filter,
df_year,
df_month,
x_start,
x_end,
x_steps,
title_desc = "Andamento vendite suddiviso per anni mesi",
Y_desc = "Vendite totali",
X_desc = "Mese/anno",
group_desc = "Anno",
y_start = 0,
y_end = 1200,
y_steps = 50) {
# Step 1: Prepare data by grouping and summarizing
df =dataframe %>%
group_by({{ df_filter }}, {{ df_year }}, {{ df_month }}) %>%
summarise(total_sum = sum({{ data_col }},
na.rm = TRUE),
.groups = "drop") %>%
# Create a year_month column in "YYYY-MM-DD" format
mutate(year_month = as.Date(
paste({{ df_year }},
sprintf("%02d",
{{ df_month }}),
"01",
sep = "-"),
format = "%Y-%m-%d"
))
x_min = as.Date(x_start)
x_max = as.Date(x_end)
# Step 3: Create the bar plot
bar_graph=ggplot(data = df, aes(x = year_month,
y = total_sum,
fill = {{ df_filter }})) +
geom_col(position = position_stack()) +
theme_minimal() +
# Define axis labels and title
labs(
title = title_desc,
x = X_desc,
y = Y_desc,
fill = group_desc)+
# Customize y-axis breaks
scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
# Customize x-axis breaks and labels
scale_x_date(
#limits = c(x_min, x_max),
limits = c(x_min, x_max),
date_breaks = x_steps,
date_labels = "%Y-%m"
) +
# Rotate x-axis labels by 45 degrees for readability
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(bar_graph)
return(df)
}
test_df=bar_graph_group_time(
dataframe = dati_re_texas,
data_col = sales,
df_filter = city,
df_year = year,
df_month = month,
x_start = "2010-01-01", # Optional x start ( if 0 auto )
x_end = "2014-12-01", # Optional x end ( if 0 auto )
x_steps = "3 months", # Axe X steps
title_desc = "Vendite mensili per città dal 2010 al 2014",
Y_desc = "Totale vendite",
X_desc = "Anno/Mese",
group_desc = "Città",
y_start = 0,
y_end = 5000,
y_steps = 75
)
## Warning: Removed 8 rows containing missing values or values outside the scale range
## (`geom_col()`).
Si notano picchi stagionali con fluttuazioni delle vendite nei vari mesi. Gli andamenti sembrano essere ciclici, con periodi di alta e bassa attività.
Distribuzione per città:
Tyler (colore azzurro) sembra dominare rispetto alle altre città, contribuendo in modo significativo al totale delle vendite.
Bryan-College Station (verde) è il secondo contributore principale, seguito da Beaumont
Cicli stagionali:
Whcita Falls ha un andamento regolare praticamente tutto l’anno , sembrerebbe sottoperformare e quindi avere più possibilità di crescita, Beuamont è spinta dalla forte stagionalità anche se le il numero di vendite non è come quello di Bryan-College e sopratutto Tyler che detiene il numero di vendite maggiore.
====================================================================
line_chart_group_col (dataframe =dati_re_texas,
data_col =sales,
df_filter_1 =month,
df_filter_2 =year,
x_start = 1,
x_end = 12,
x_steps = 1,
title_desc = "Andamento vendite suddiviso per anni mesi ",
Y_desc = "Vendite totali",
X_desc = "Mese/anno",
group_desc = "Anno",
y_start = 0,
y_end = 1200,
y_steps = 50
)
## # A tibble: 60 × 3
## month year tot_sum
## <int> <fct> <int>
## 1 1 2010 421
## 2 1 2011 425
## 3 1 2012 499
## 4 1 2013 576
## 5 1 2014 627
## 6 2 2010 487
## 7 2 2011 469
## 8 2 2012 574
## 9 2 2013 593
## 10 2 2014 694
## # ℹ 50 more rows
## 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.
Trend stagionale:
Si nota un picco delle vendite tra maggio e luglio per quasi tutti gli anni, indicando una forte stagionalità. Questo potrebbe suggerire che in questi mesi si verifica un aumento delle vendite, forse dovuto a fattori stagionali come vacanze o promozioni.
A partire da agosto, le vendite iniziano a calare costantemente fino a raggiungere il punto minimo in dicembre per molti degli anni analizzati.
Differenze tra gli anni:
2014 (linea viola): Ha registrato il picco di vendite più alto rispetto agli altri anni, superando quota 1100 nel mese di giugno. Questo potrebbe indicare una crescita complessiva delle vendite o un evento specifico in quell’anno che ha incrementato la domanda.
2013 (linea azzurra): Anch’esso ha un picco simile a quello del 2014, ma leggermente inferiore. Tuttavia, rispetto agli anni precedenti, anche il 2013 ha avuto delle vendite più elevate durante i mesi di maggior afflusso.
2010 e 2011 (linee rossa e verde): Questi anni hanno registrato i livelli di vendita più bassi, con un picco che non supera quota 950. Interessante sarebbe capire come mai nel 2010 il picco è partito in anticipo , gia dal mese di aprile per affievolirsi già a luglio.
Confronto generale:
Sembra esserci un trend di crescita delle vendite nel corso degli anni, con valori più alti per il 2013 e il 2014 rispetto al 2010 e al 2011. Questo può suggerire una tendenza di crescita nelle vendite nel tempo, che potrebbe essere dovuta a una maggiore domanda, espansione del mercato o altre variabili economiche.
Dicembre per alcuni anni ha visto un piccolo recupero probabilmente dominato da budget più consistenti di fine anno, anche le festività natalizie potrebbero aver influito .
=================================================================
library(ggplot2)
library(dplyr)
line_chart_group_time = function(dataframe,
data_col,
df_filter,
df_year,
df_month,
x_start,
x_end,
x_steps = "1 month",
title_desc = "Andamento vendite suddiviso per anni mesi",
Y_desc = "Vendite totali",
X_desc = "Mese/anno",
group_desc = "Anno",
y_start = 0,
y_end = 1200,
y_steps = 50) {
# Step 1: Prepare data by grouping and summarizing
df <- dataframe %>%
group_by({{ df_filter }}, {{ df_year }}, {{ df_month }}) %>%
summarise(total_sum = sum({{ data_col }},
na.rm = TRUE),
.groups = "drop") %>%
# Create a year_month column in "YYYY-MM-DD" format
mutate(year_month = as.Date(
paste({{ df_year }},
sprintf("%02d",
{{ df_month }}),
"01",
sep = "-"),
format = "%Y-%m-%d"
))
# Step 2: Dynamically calculate x-axis range
x_min = if (x_start==0)
as.Date(paste(x_start, "01", "01", sep = "-"),
"%Y-%m-%d")
else
min(df$year_month, na.rm = TRUE)
x_max <- if (x_end==0)
as.Date(paste(x_end, "12", "01", sep = "-"), "%Y-%m-%d") else
max(df$year_month, na.rm = TRUE)
# Step 3: Create the plot
ggplot(data = df, aes(x = year_month, y = total_sum, color = {{ df_filter }},
group = {{ df_filter }})) +
# Line chart width
geom_line(size = 1) +
theme_minimal() +
# Define axis labels and title
labs(
title = title_desc,
x = X_desc,
y = Y_desc,
color = group_desc
) +
# Customize y-axis breaks
scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
# Customize x-axis breaks and labels
scale_x_date(
limits = c(x_min, x_max),
date_breaks = x_steps,
date_labels = "%Y-%m"
) +
# Rotate x-axis labels by 45 degrees
theme(axis.text.x = element_text(angle = 45, hjust = 1))
}
line_chart_group_time(
dataframe = dati_re_texas,
data_col = sales,
df_filter = city,
df_year = year,
df_month = month,
x_start = 2010, # Optional x start ( if 0 auto )
x_end = 2014, # Optional x end ( if 0 auto )
x_steps = "4 months", # Axe X steps
title_desc = "Vendite mensili per città dal 2010 al 2014",
Y_desc = "Totale vendite",
X_desc = "Anno/Mese",
group_desc = "Città",
y_start = 0,
y_end = 450,
y_steps = 25
)
Questo grafico mostra le vendite mensili per città dal 2010 al 2014 in un formato a linee che facilita l’identificazione di trend e variazioni specifiche. Ecco un’analisi approfondita:
Tyler (linea azzurra):
Ha i picchi di vendite più alti rispetto alle altre città, specialmente nel 2013 e nel 2014.
Mostra una forte stagionalità con vendite che fluttuano regolarmente, anche se durante i mesi invernali non è cosi accentuato come Bryan
Bryan-College Station (linea verde):
È la seconda città con vendite elevate.
Anche qui si notano pattern stagionali simili a Tyler, ma con un’intensità leggermente inferiore.
Beaumont (linea rossa):
Wichita Falls (linea viola):
Ha vendite significativamente più basse rispetto alle altre città.
Non presenta picchi rilevanti, indicando probabilmente una domanda costante e bassa.
Le città di Tyler e Bryan-College Station mostrano una chiara stagionalità con vendite che aumentano significativamente in determinati periodi dell’anno, probabilmente legati a eventi stagionali , Beaumont presenta un pattern stagionale ma molto meno significativo e sopratutto con numeri minori
Wichita Falls non mostra lo stesso grado di stagionalità, indicando un mercato più stabile, ma con numero di vendite molto minore
====================================================================