# IMPORT DEL CSV
texas <- read.csv("C:/Users/ce168diedifi/Desktop/Profession.AI/Corso Statistica Descrittiva/Progetto/realestate_texas.csv", sep=",", header=TRUE, encoding="UTF-8")
head(texas)
##       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

1. ANALISI DELLE VARIABILI

Identifica e descrivi il tipo di variabili statistiche presenti nel dataset.

city
VARIABILE QUALITATIVA SU SCALA NOMINALE

year, month
VARIABILE QUALITATIVA SU SCALA ORDINALE

sales, median_price, listings
VARIABILE QUANTITATIVA DISCRETA

volume, month_inventory
VARIABILE QUANTITATIVA CONTINUA

Valuta come gestire le variabili che sottintendono una dimensione tempo e commenta sul tipo di analisi che può essere condotta su ciascuna variabile.

year
Le variabili temporali sono molto utili per rappresentare i dati con un grafico di tipo serie storica basata sul numero totale di venite (sales) o il volume

Con questa variabile si potrebbe calcolare la distribuzione di frequenza per capire l’andamento annuale del numero totale di vendite (sales) e il valore totale delle vendite (volume).

month
Anche qui un grafico di tipo serie storica è utile.

Penso che un altro tipo di analisi utile potrebbe essere una distribuzione di frequenza con suddivisione in classi ( a gruppi di 3 mesi ) per capire quali il trend delle vendite nei mesi/trimestri dell’anno.

2. Indici di posizione, variabilità e forma

a. Calcola Indici di posizione, variabilità e forma per tutte le variabili per le quali ha senso farlo

# FUNZIONI
geometric.mean <- function(dataset) {
  return(exp(mean(log(dataset))))
}

armonic.mean <- function(dataset){
  return(1/(sum(1/dataset)/length(dataset))) 
}

coefficient.of.variation <- function(dataset){
  return(sd(dataset)/mean(dataset)*100)
}

gini.index <- function(dataset){
  #
  ni = table(texas$sales)
  fi = ni/length(texas$sales)
  fi2 = fi^2
  J = length(ni)
  
  #
  gini = 1-sum(fi2)
  gini.norm = gini/((J-1)/J)
  return(gini.norm)
}

asimmetria.di.fisher <- function(dataset){
  mu <- mean(dataset)
  sigma <- sd(dataset)
  n <- length(dataset)
  m3 <- sum((dataset-mu)^3)/n
  return(m3/(sigma^3))
}

curtosi <- function(dataset){
  mu <- mean(dataset)
  sigma <- sd(dataset)
  n <- length(dataset)
  m4 <- sum((dataset-mu)^4)/n
  return(m4/(sigma^4)) -3
}

————————————————–

# INDICI DI POSIZIONE

INDICI.DI.POSIZIONE.SALES <- data.frame(
  "Media Aritmetica"  = mean(texas$sales)
, "Media Ponderata"   = weighted.mean(texas$volume,texas$sales)
, "Media Geometrica"  = geometric.mean(texas$sales)
, "Media Armonica"    = armonic.mean(texas$sales)
, "Mediana"           = median(texas$sales)
, "Moda"              = quantile(sort(texas$sales))[5]
, "Minimo"            = quantile(sort(texas$sales))[1]
, "Massimo"           = quantile(sort(texas$sales))[5]
, "Percentile (25%)"  = quantile(sort(texas$sales))[2]
, "Percentile (50%)"  = quantile(sort(texas$sales))[3]
, "Percentile (75%)"  = quantile(sort(texas$sales))[4]
, check.names = FALSE
)

INDICI.DI.POSIZIONE.SALES
##      Media Aritmetica Media Ponderata Media Geometrica Media Armonica Mediana
## 100%         192.2917        37.71024         176.8815       162.9476   175.5
##      Moda Minimo Massimo Percentile (25%) Percentile (50%) Percentile (75%)
## 100%  423     79     423              127            175.5              247
# INDICI DI VARIABILITA'

INDICI.DI.VARIABILITA.SALES <- data.frame(
    "Intervallo di variazione"     = max(texas$sales)-min(texas$sales)
  , "Differenza Interquartile"     = IQR(texas$sales)
  , "Varianza"                     = var(texas$sales)
  , "Deviaizone Standard"          = sd(texas$sales)
  , "Coefficiente di variazione"   = coefficient.of.variation(texas$sales)
  , "Gini"                         = gini.index(texas$sales)
  , check.names = FALSE
)

INDICI.DI.VARIABILITA.SALES
##   Intervallo di variazione Differenza Interquartile Varianza
## 1                      344                      120   6344.3
##   Deviaizone Standard Coefficiente di variazione     Gini
## 1            79.65111                   41.42203 0.998379
# INDICI DI FORMA

INDICI.DI.FORMA.SALES <- data.frame(
    "Asimmetria di Fisher"     = asimmetria.di.fisher(texas$sales)
  , "Curtosi"                  = curtosi(texas$sales)
  , check.names = FALSE
)

INDICI.DI.FORMA.SALES
##   Asimmetria di Fisher Curtosi
## 1            0.7136206 2.66448

————————————————–

# INDICI DI POSIZIONE

INDICI.DI.POSIZIONE.VOLUME <- data.frame(
  "Media Aritmetica"    = mean(texas$volume)
  , "Media Ponderata"   = weighted.mean(texas$volume,texas$volume)
  , "Media Geometrica"  = geometric.mean(texas$volume)
  , "Media Armonica"    = armonic.mean(texas$volume)
  , "Mediana"           = median(texas$volume)
  , "Moda"              = quantile(sort(texas$volume))[5]
  , "Minimo"            = quantile(sort(texas$volume))[1]
  , "Massimo"           = quantile(sort(texas$volume))[5]
  , "Percentile (25%)"  = quantile(sort(texas$volume))[2]
  , "Percentile (50%)"  = quantile(sort(texas$volume))[3]
  , "Percentile (75%)"  = quantile(sort(texas$volume))[4]
  , check.names = FALSE
)

INDICI.DI.POSIZIONE.VOLUME
##      Media Aritmetica Media Ponderata Media Geometrica Media Armonica Mediana
## 100%         31.00519        39.91065         26.86046       23.18959 27.0625
##        Moda Minimo Massimo Percentile (25%) Percentile (50%) Percentile (75%)
## 100% 83.547  8.166  83.547          17.6595          27.0625           40.893
# INDICI DI VARIABILITA'

INDICI.DI.VARIABILITA.VOLUME <- data.frame(
  "Intervallo di variazione"       = max(texas$volume)-min(texas$volume)
  , "Differenza Interquartile"     = IQR(texas$volume)
  , "Varianza"                     = var(texas$volume)
  , "Deviaizone Standard"          = sd(texas$volume)
  , "Coefficiente di variazione"   = coefficient.of.variation(texas$volume)
  , "Gini"                         = gini.index(texas$volume)
  , check.names = FALSE
)

INDICI.DI.VARIABILITA.VOLUME
##   Intervallo di variazione Differenza Interquartile Varianza
## 1                   75.381                  23.2335 277.2707
##   Deviaizone Standard Coefficiente di variazione     Gini
## 1            16.65145                   53.70536 0.998379
# INDICI DI FORMA

INDICI.DI.FORMA.VOLUME <- data.frame(
  "Asimmetria di Fisher"     = asimmetria.di.fisher(texas$volume)
  , "Curtosi"                  = curtosi(texas$volume)
  , check.names = FALSE
)

INDICI.DI.FORMA.VOLUME
##   Asimmetria di Fisher  Curtosi
## 1            0.8792182 3.150567

————————————————–

b. per le altre crea una distribuzione di frequenza.

# DISTRIBUZIONE DI FREQUENZA

# ---
df_year <- cut(texas$year,seq(min(texas$year),max(texas$year),1))
table(df_year)
## df_year
## (2010,2011] (2011,2012] (2012,2013] (2013,2014] 
##          48          48          48          48
len <- length(df_year)

distr_freq_year <- as.data.frame(
  cbind(
    ni=table(df_year),
    fi=table(df_year)/len,
    Ni=cumsum(table(df_year)),
    Fi=cumsum(table(df_year))/len
  )
)

distr_freq_year
##             ni  fi  Ni  Fi
## (2010,2011] 48 0.2  48 0.2
## (2011,2012] 48 0.2  96 0.4
## (2012,2013] 48 0.2 144 0.6
## (2013,2014] 48 0.2 192 0.8
# ---
df_month <- cut(texas$month,seq(1,12,1))
table(df_month)
## df_month
##   (1,2]   (2,3]   (3,4]   (4,5]   (5,6]   (6,7]   (7,8]   (8,9]  (9,10] (10,11] 
##      20      20      20      20      20      20      20      20      20      20 
## (11,12] 
##      20
len <- length(df_month)

distr_freq_month <- as.data.frame(
  cbind(
    ni=table(df_month),
    fi=table(df_month)/len,
    Ni=cumsum(table(df_month)),
    Fi=cumsum(table(df_month))/len
  )
)

min(texas$month)
## [1] 1
max(texas$month)
## [1] 12
distr_freq_month
##         ni         fi  Ni         Fi
## (1,2]   20 0.08333333  20 0.08333333
## (2,3]   20 0.08333333  40 0.16666667
## (3,4]   20 0.08333333  60 0.25000000
## (4,5]   20 0.08333333  80 0.33333333
## (5,6]   20 0.08333333 100 0.41666667
## (6,7]   20 0.08333333 120 0.50000000
## (7,8]   20 0.08333333 140 0.58333333
## (8,9]   20 0.08333333 160 0.66666667
## (9,10]  20 0.08333333 180 0.75000000
## (10,11] 20 0.08333333 200 0.83333333
## (11,12] 20 0.08333333 220 0.91666667

c. Infine, commenta tutto brevemente.

gli indici di posizione dicono che:

la differenza tra media aritmetica e mediana suggerisce che la distribuzione dei dati potrebbe essere asimmetrica. La media ponderata molto più bassa rispetto alla media aritmetica potrebbe indicare che alcuni valori con pesi più bassi sono alti, e quelli con pesi più elevati sono piccoli. La presenza di un massimo elevato rispetto al minimo evidenzia una distribuzione con una significativa dispersione.

gli indici di variabilità dicono che:

L’intervallo di variazione e la differenza interquartile indicano che i tuoi dati sono piuttosto dispersi. La varianza e la deviazione standard confermano la presenza di una dispersione relativamente alta. Il coefficiente di variazione suggerisce che la variabilità rispetto alla media è significativa. L’indice di Gini evidenzia una fortissima concentrazione, indicando che pochi valori nel dataset sono responsabili di gran parte del volume totale, suggerendo una distribuzione altamente sbilanciata.

gli indici di forma:

Fisher misura la simmetria della distribuzione rispetto alla media. Qui abbiamo una asimmetria positiva, indica che i dati tendono a essere più concentrati verso i valori inferiori.

3. Identificazione delle variabili con maggiore variabilità e asimmetria

Determina:

- Qual è la variabile con la più alta variabilità

variabilità <- data.frame(
    "sales"            = coefficient.of.variation(texas$sales)
  , "volume"           = coefficient.of.variation(texas$volume)
  , "median_price"     = coefficient.of.variation(texas$median_price)
  , "listings"         = coefficient.of.variation(texas$listings)
  , "months_inventory" = coefficient.of.variation(texas$months_inventory)
  , check.names = FALSE
)

# la variabile con la variabilità + alta è il volume
variabilità
##      sales   volume median_price listings months_inventory
## 1 41.42203 53.70536     17.08218 43.30833         25.06031
max(variabilità)
## [1] 53.70536
# - Qual è la variabile con la distribuzione più asimmetrica

fisher <- data.frame(
    "sales"            = asimmetria.di.fisher(texas$sales)
  , "volume"           = asimmetria.di.fisher(texas$volume)
  , "median_price"     = asimmetria.di.fisher(texas$median_price)
  , "listings"         = asimmetria.di.fisher(texas$listings)
  , "months_inventory" = asimmetria.di.fisher(texas$months_inventory)
  , check.names = FALSE
)

# la variabile con la distribuzione più asimmetrica è il volume
fisher
##       sales    volume median_price  listings months_inventory
## 1 0.7136206 0.8792182   -0.3622768 0.6454431       0.04071944
max(fisher)
## [1] 0.8792182

Spiega come sei giunto a queste conclusioni e fornisci considerazioni statistiche.

PER LA VARIABILE CON LA PIÙ ALTA VARIABILITÀ: si usa il coefficiente di variazione che serve proprio a verificare la variabilità di una variabile. E’ espressa in % che è utile per confrontare unità di misura diverse.

PER LA VARIABILE CON LA DISTRIBUZIONE PIÙ ASIMMETRICA: si usa l’indice di asimmetria di fisher perché fornisce una misura standardizzata e comparabile della distribuzione dei dati

CONSIDERAZIONI STATISTICHE

sales volume median_price listings months_inventory 0.7136206 0.8792182 -0.3622768 0.6454431 0.04071944

l’indice di fisher sul numero totale di vendite è > 0 quindi buono le vendite stanno andando bene. guardando però l’indice di fisher per il prezzo medio di vendita questo è < 0 significa che mediamente i prezzi degli immobili sono troppo bassi

4. Creazione di classi per una variabile quantitativa

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.

# DISTRIBUZIONE DI FREQUENZA

serie <- cut(texas$volume,seq(1,100,10))

table(serie)
## serie
##  (1,11] (11,21] (21,31] (31,41] (41,51] (51,61] (61,71] (71,81] (81,91] 
##      12      71      56      43      24      17      12       4       1
len <- length(serie)

distr_freq <- as.data.frame(
  cbind(
    ni=table(serie),
    fi=table(serie)/len,
    Ni=cumsum(table(serie)),
    Fi=cumsum(table(serie))/len
  )
)

distr_freq
##         ni          fi  Ni        Fi
## (1,11]  12 0.050000000  12 0.0500000
## (11,21] 71 0.295833333  83 0.3458333
## (21,31] 56 0.233333333 139 0.5791667
## (31,41] 43 0.179166667 182 0.7583333
## (41,51] 24 0.100000000 206 0.8583333
## (51,61] 17 0.070833333 223 0.9291667
## (61,71] 12 0.050000000 235 0.9791667
## (71,81]  4 0.016666667 239 0.9958333
## (81,91]  1 0.004166667 240 1.0000000

grafico a barre

library(ggplot2)

distr_freq$serie <- levels(serie)

# plot
ggplot(distr_freq, aes(x = serie, y = ni)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  labs(
    title = "Distribuzione di Frequenza",
    x = "Intervalli di Volume",
    y = "Frequenza Assoluta"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Calcola l’indice di eterogeneità Gini

gini <- gini.index(serie)

gini

e discuti i risultati.

Un indice di Gini pari a 0.998379 indica una quasi totale disuguaglianza nella distribuzione. Questo valore è molto vicino a 1, significa che il numero totale di vendite immobiliari in Texas tendono di più vs uno o + range.

Infatti osservando il grafico a barre vediamo che le vendite maggiori avvengono con immobili del valore tra i 10 e i 40 milioni di dollari.

anche nei punti precedenti è emerso che nei dati c’è un asimmetria e la variabile con la pià alta variabilità e asimmetria è proprio il volume.

5. Calcolo della probabilità

Qual è la probabilità che, presa una riga a caso di questo dataset, essa riporti la città “Beaumont”?

probabilità <- function(dataset, val) {
  nr.casi.favorevoli <- length(dataset[dataset == val])
  nr.casi.possibili <- length(dataset)
  return(nr.casi.favorevoli / nr.casi.possibili)
}

probabilità(texas$city,"Beaumont")
## [1] 0.25

La probabilità è pati allo 0.25 quindi 1/4 del dataset. Infatti leggendo il dataset su excel e producendo una pivot il risultato è corretto, ogni valore distinto di city compare 60 volte

E la probabilità che riporti il mese di Luglio?

probabilità(texas$month,7)
## [1] 0.08333333

La probabilità è pati allo 0.83 quindi 1/12 del dataset. Infatti leggendo il dataset su excel e producendo una pivot il risultato è corretto, ogni valore distinto di month compare 20 volte

E la probabilità che riporti il mese di dicembre 2012?

nr.casi.favorevoli <- length(texas$year[texas$year == 2012 & texas$month == 12])
nr.casi.possibili <- length(texas$year)
probabilita.doppia <- nr.casi.favorevoli / nr.casi.possibili
probabilita.doppia
## [1] 0.01666667

La probabilità è pati allo 0.01666667 Infatti leggendo il dataset su excel e producendo una pivot il risultato è corretto. La combinazione 2012 e 12 compare 4 volte su 240 valori totali.

6. Creazione di nuove variabili

Crea una nuova colonna che calcoli il prezzo medio degli immobili utilizzando le variabili disponibili.

texas$average_price <- round((texas$volume/texas$sales)*1000,3)

head(texas)
##       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
##   average_price
## 1       170.627
## 2       163.796
## 3       157.698
## 4       134.095
## 5       142.738
## 6       144.016

Prova a creare una colonna che misuri l’efficacia degli annunci di vendita.

# % di efficacia delle vendite sul numero totale di annunci attivi
texas$effectiveness <- (texas$sales / texas$listings) * 100

min(texas$effectiveness) # 5%
## [1] 5.014025
max(texas$effectiveness) # 38%
## [1] 38.71278
head(texas)
##       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
##   average_price effectiveness
## 1       170.627      5.414220
## 2       163.796      6.809584
## 3       157.698     10.775607
## 4       134.095     11.709602
## 5       142.738     11.405985
## 6       144.016     10.482529

Commenta e discuti i risultati.

# DISTRIBUZIONE DI FREQUENZA

serie <- cut(texas$effectiveness,seq(1,100,10))

table(serie)
## serie
##  (1,11] (11,21] (21,31] (31,41] (41,51] (51,61] (61,71] (71,81] (81,91] 
##     120     108      10       2       0       0       0       0       0
len <- length(serie)

distr_freq <- as.data.frame(
  cbind(
    ni=table(serie),
    fi=table(serie)/len,
    Ni=cumsum(table(serie)),
    Fi=cumsum(table(serie))/len
  )
)

distr_freq
##          ni          fi  Ni        Fi
## (1,11]  120 0.500000000 120 0.5000000
## (11,21] 108 0.450000000 228 0.9500000
## (21,31]  10 0.041666667 238 0.9916667
## (31,41]   2 0.008333333 240 1.0000000
## (41,51]   0 0.000000000 240 1.0000000
## (51,61]   0 0.000000000 240 1.0000000
## (61,71]   0 0.000000000 240 1.0000000
## (71,81]   0 0.000000000 240 1.0000000
## (81,91]   0 0.000000000 240 1.0000000

Osservando una distribuzione di frequenza sulla colonna “effectiveness” si nota come l’efficacia delle vendite supera a fatica il 20%. L’efficiacia sulle vendite è sicuramente un punto da migliorare.

7. Analisi condizionata

Usa il pacchetto dplyr o il linguaggio base di R per effettuare analisi statistiche condizionate per città, anno e mese.

#install.packages("dplyr")

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
# città
texas %>%
  group_by(city) %>%
  summarise(mean_volume = mean(volume, na.rm = TRUE)) %>%
  arrange(desc(mean_volume))
## # A tibble: 4 × 2
##   city                  mean_volume
##   <chr>                       <dbl>
## 1 Tyler                        45.8
## 2 Bryan-College Station        38.2
## 3 Beaumont                     26.1
## 4 Wichita Falls                13.9
# città / anno
texas %>%
  group_by(city, year) %>%
  summarise(mean_volume = mean(volume, na.rm = TRUE)) %>%
  arrange(city, desc(year))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
## # A tibble: 20 × 3
## # Groups:   city [4]
##    city                   year mean_volume
##    <chr>                 <int>       <dbl>
##  1 Beaumont               2014        32.1
##  2 Beaumont               2013        30.3
##  3 Beaumont               2012        24.5
##  4 Beaumont               2011        21.1
##  5 Beaumont               2010        22.7
##  6 Bryan-College Station  2014        52.8
##  7 Bryan-College Station  2013        45.1
##  8 Bryan-College Station  2012        35.4
##  9 Bryan-College Station  2011        28.9
## 10 Bryan-College Station  2010        28.7
## 11 Tyler                  2014        59.6
## 12 Tyler                  2013        50.3
## 13 Tyler                  2012        44.0
## 14 Tyler                  2011        38.6
## 15 Tyler                  2010        36.3
## 16 Wichita Falls          2014        14.5
## 17 Wichita Falls          2013        14.9
## 18 Wichita Falls          2012        13.2
## 19 Wichita Falls          2011        12.1
## 20 Wichita Falls          2010        15.0
# città / anno / mese
texas %>%
  group_by(city, year, month) %>%
  summarise(mean_volume = mean(volume, na.rm = TRUE)) %>%
  arrange(city, desc(year), desc(month))
## `summarise()` has grouped output by 'city', 'year'. You can override using the
## `.groups` argument.
## # A tibble: 240 × 4
## # Groups:   city, year [20]
##    city      year month mean_volume
##    <chr>    <int> <int>       <dbl>
##  1 Beaumont  2014    12        31.7
##  2 Beaumont  2014    11        24.9
##  3 Beaumont  2014    10        40.9
##  4 Beaumont  2014     9        35.3
##  5 Beaumont  2014     8        41.2
##  6 Beaumont  2014     7        34.9
##  7 Beaumont  2014     6        38.2
##  8 Beaumont  2014     5        36.7
##  9 Beaumont  2014     4        30.2
## 10 Beaumont  2014     3        26.3
## # ℹ 230 more rows

Genera dei summary (media, deviazione standard)

texas %>%
  group_by(city) %>%
  summarise(
    mean_volume = mean(volume, na.rm = TRUE),
    sd_volume = sd(volume, na.rm = TRUE)
  ) %>%
  arrange(desc(mean_volume))
## # A tibble: 4 × 3
##   city                  mean_volume sd_volume
##   <chr>                       <dbl>     <dbl>
## 1 Tyler                        45.8     13.1 
## 2 Bryan-College Station        38.2     17.2 
## 3 Beaumont                     26.1      6.97
## 4 Wichita Falls                13.9      3.24
texas %>%
  group_by(city, year) %>%
  summarise(
    mean_volume = mean(volume, na.rm = TRUE),
    sd_volume = sd(volume, na.rm = TRUE)
  ) %>%
  arrange(city, desc(year), desc(mean_volume))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
## # A tibble: 20 × 4
## # Groups:   city [4]
##    city                   year mean_volume sd_volume
##    <chr>                 <int>       <dbl>     <dbl>
##  1 Beaumont               2014        32.1      7.05
##  2 Beaumont               2013        30.3      6.44
##  3 Beaumont               2012        24.5      4.92
##  4 Beaumont               2011        21.1      4.30
##  5 Beaumont               2010        22.7      4.95
##  6 Bryan-College Station  2014        52.8     18.0 
##  7 Bryan-College Station  2013        45.1     19.5 
##  8 Bryan-College Station  2012        35.4     13.5 
##  9 Bryan-College Station  2011        28.9     10.3 
## 10 Bryan-College Station  2010        28.7     10.8 
## 11 Tyler                  2014        59.6     12.8 
## 12 Tyler                  2013        50.3     10.3 
## 13 Tyler                  2012        44.0     10.2 
## 14 Tyler                  2011        38.6      9.41
## 15 Tyler                  2010        36.3      8.39
## 16 Wichita Falls          2014        14.5      3.13
## 17 Wichita Falls          2013        14.9      3.11
## 18 Wichita Falls          2012        13.2      2.66
## 19 Wichita Falls          2011        12.1      2.52
## 20 Wichita Falls          2010        15.0      4.07

e rappresenta graficamente i risultati.

#install.packages("tidyr")

library(ggplot2)
library(tidyr)
library(dplyr)

summary_city <- texas %>%
  group_by(city) %>%
  summarise(
    mean_volume = mean(volume, na.rm = TRUE),
    sd_volume = sd(volume, na.rm = TRUE)
  )

summary_city_long <- summary_city %>%
  pivot_longer(cols = c(mean_volume, sd_volume), 
               names_to = "stat_type", 
               values_to = "value")

ggplot(summary_city_long, aes(x = city, y = value, fill = stat_type)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Media e Deviazione Standard del Volume per Città", x = "Città", y = "Valore") +
  scale_fill_manual(values = c("mean_volume" = "skyblue", "sd_volume" = "orange"), labels = c("Media", "Deviazione Standard")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

8. Creazione di visualizzazioni con ggplot2

Utilizza ggplot2 per creare grafici personalizzati.

Assicurati di esplorare:

- Boxplot per confrontare la distribuzione del prezzo mediano tra le città.

library(ggplot2)

ggplot(texas, aes(x = city, y = median_price)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(title = "Distribuzione del Prezzo Mediano per Città", x = "Città", y = "Prezzo Mediano") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

- Grafici a barre per confrontare il totale delle vendite per mese e città.

library(ggplot2)
library(dplyr)

summary_sales <- texas %>%
  group_by(city, month) %>%
  summarise(total_sales = sum(sales, na.rm = TRUE))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
ggplot(summary_sales, aes(x = factor(month), y = total_sales, fill = city)) +
  geom_bar(stat = "identity", position = "dodge") + labs(title = "Totale delle Vendite per Mese e Città", x = "Mese", y = "Totale Vendite") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))

- Line charts per confrontare l’andamento delle vendite in periodi storici differenti.

library(ggplot2)
library(dplyr)

texas <- texas %>%
  mutate(date = as.Date(paste(year, month, "01", sep = "-")))

ggplot(texas, aes(x = date, y = volume, color = city, group = city)) +
  geom_line(size = 1.2) +
  geom_point(size = 2) +
  labs(title = "Andamento delle Vendite per Città", x = "Data", y = "Volume delle Vendite") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 0, hjust = 1))
## 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.

9. Conclusioni

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.

la tendenza emersa da questa analisi è che il numero delle vendite e il valore delle vendite tende a sbilanciarsi vs una paricolare tipologia di immobili.

La città di Wichila Falls è quella col numero di vendite nel corso degli anni più o meno stabile, mentre tutte le altre hanno avuto un buon incremento dal 2010 al 2014.

La raccomandazioni sono: 1. verificare meglio i prezzi degli immobili 2. migliorare la % di efficacia delle vendite 3. La città col margine più alto di crescita è “Wichita Falls”