getwd()
## [1] "/Users/tyler/Documents/R WORKING DIRECTORY/PROGETTO 1 PAI TEXAS"
dati <- read.csv("realestate_texas.csv", sep = ",")
dim(dati)
## [1] 240   8
head(dati)
##       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 contiene 240 osservazioni e 8 variabili:

str(dati)
## 'data.frame':    240 obs. of  8 variables:
##  $ city            : chr  "Beaumont" "Beaumont" "Beaumont" "Beaumont" ...
##  $ year            : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ month           : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ sales           : int  83 108 182 200 202 189 164 174 124 150 ...
##  $ volume          : num  14.2 17.7 28.7 26.8 28.8 ...
##  $ median_price    : num  163800 138200 122400 123200 123100 ...
##  $ listings        : int  1533 1586 1689 1708 1771 1803 1857 1830 1829 1779 ...
##  $ months_inventory: num  9.5 10 10.6 10.6 10.9 11.1 11.7 11.6 11.7 11.5 ...

Le variabili sono:

•   city: variabile di tipo character
•   year: variabile di tipo int
•   month: variabile di tipo int
•   sales: variabile di tipo int
•   volume: variabile di tipo num
•   median_price: variabile di tipo num
•   listings: variabile di tipo int
•   months_inventory: variabile di tipo num

Alcune variabili devono essere riclassificate:

dati$city <- as.factor(dati$city)
dati$year <- as.factor(dati$year)
dati$month <- as.factor(dati$month)
dati$sales <- as.numeric(dati$sales)
dati$listings <- as.numeric(dati$listings)
dati$months_inventory <- as.numeric(dati$months_inventory)

Eseguo un riassunto delle variabili

summary(dati)
##                     city      year        month         sales      
##  Beaumont             :60   2010:48   1      : 20   Min.   : 79.0  
##  Bryan-College Station:60   2011:48   2      : 20   1st Qu.:127.0  
##  Tyler                :60   2012:48   3      : 20   Median :175.5  
##  Wichita Falls        :60   2013:48   4      : 20   Mean   :192.3  
##                             2014:48   5      : 20   3rd Qu.:247.0  
##                                       6      : 20   Max.   :423.0  
##                                       (Other):120                  
##      volume        median_price       listings    months_inventory
##  Min.   : 8.166   Min.   : 73800   Min.   : 743   Min.   : 3.400  
##  1st Qu.:17.660   1st Qu.:117300   1st Qu.:1026   1st Qu.: 7.800  
##  Median :27.062   Median :134500   Median :1618   Median : 8.950  
##  Mean   :31.005   Mean   :132665   Mean   :1738   Mean   : 9.193  
##  3rd Qu.:40.893   3rd Qu.:150050   3rd Qu.:2056   3rd Qu.:10.950  
##  Max.   :83.547   Max.   :180000   Max.   :3296   Max.   :14.900  
## 

Il summary dei dati visualizzato in console riporta quanto segue: 1. La variabile city (variabile di tipo character, qualitativa): contiene 4 città del Texas per le quali sono state condotte le osservazioni, ogni città sembra avere una frequenza di 60.

  1. La variabile year (variabile di tipo character, qualitativa): rappresenta l’anno dell’osservazione. Sono state fatte osservazioni per 5 anni (dal 2010 al 2014). In particolare, ci sono 48 osservazioni per ogni anno .

  2. La variabile month (variabile di tipo character, qualitativa): rappresenta il mese dell’ossevazione. Ci sono in tutto 12 livelli che rappresentano i 12 mesi (probabilmente in ordine crescente) e per ciascun mese sono state condotte 20 osservazioni.

  3. La variabile sales (variabile di tipo character, quantitativa): rappresenta probabilmente il numero di vendite immobiliari. Ha un minimo di 79 ed un massimo di 423. il primo quartile è 127, la mediana 175 ed il terzo quartile di 247. La media è di 192.

  4. La variabile volume (variabile di tipo character, quantitativa): rappresenta probabilmente il volume. Ha un minimo di 8.166 ed un massimo di 83.547 il primo quartile è 17.660, la mediana 27.062 ed il terzo quartile di 40.893. La media è di 31.005.

  5. La variabile median_price (variabile di tipo character, quantitativa): rappresenta probabilmente il prezzo mediano degli immobili venduti. Ha un minimo di 73800 ed un massimo di 180000. il primo quartile è 117300, la mediana è 134500 ed il terzo quartile di 150050. La media è di 132665.

  6. La variabile listings (variabile di tipo character, quantitativa): rappresenta probabilmente il numero di immobili in vendita. Ha un minimo di 743 ed un massimo di 3296. il primo quartile è 1026, la mediana 1618 ed il terzo quartile di 2056. La media è di 1738.

  7. La variabile months_inventory: rappresenta probabilmente l’inventario. Ha un minimo di 1 ed un massimo di 80. il primo quartile è 26, la mediana 37.50 ed il terzo quartile di 56.25. La media è di 39.70.

Calcolo le distribuzioni di frequenza per le variabili qualitative (city, year, month):

dim(dati)
## [1] 240   8
N=dim(dati)[1]

Dato che la funzione dim() restituisce le dimensioni del dataset e che il numero di righe totali equivale al numero di osservazioni, assegno il risultato di dim() all’oggetto N che restituisce un vettore di 2 elementi di cui io prenderò solo la prima colonna cioè 240. Quindi calcolo le distribuzioni di city, year e month. Parto da queste per avere più chiara la composizione ed il razionale del dataset.

PER LA VARIABILE CITY

table (dati["city"])
## city
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60
freq_ass_city<-table(dati$city) #calcolo frequenze assolute
freq_rel_city<-table(dati$city)/N #calcolo relative
distr_freq_city<-cbind(freq_ass_city, freq_rel_city) #concatenare le 2 frequenze
distr_freq_city #visualizzare il tutto
##                       freq_ass_city freq_rel_city
## Beaumont                         60          0.25
## Bryan-College Station            60          0.25
## Tyler                            60          0.25
## Wichita Falls                    60          0.25
distr_freq_ass_cumulate_city<-cumsum(freq_ass_city) #calcolo frequenze assolute cumulate
distr_freq_rel_cumulate_city<-distr_freq_ass_cumulate_city/N #calcolo frequenze relative cumulate
freq_city<-cbind(freq_ass_city, freq_rel_city, distr_freq_ass_cumulate_city, distr_freq_rel_cumulate_city)
freq_city #visualizzare il tutto
##                       freq_ass_city freq_rel_city distr_freq_ass_cumulate_city
## Beaumont                         60          0.25                           60
## Bryan-College Station            60          0.25                          120
## Tyler                            60          0.25                          180
## Wichita Falls                    60          0.25                          240
##                       distr_freq_rel_cumulate_city
## Beaumont                                      0.25
## Bryan-College Station                         0.50
## Tyler                                         0.75
## Wichita Falls                                 1.00

PER LA VARIABILE YEAR

table (dati["year"])
## year
## 2010 2011 2012 2013 2014 
##   48   48   48   48   48
freq_ass_year<-table(dati$year) 
freq_rel_year<-table(dati$year)/N 
distr_freq_year<-cbind(freq_ass_year, freq_rel_year) 
distr_freq_year
##      freq_ass_year freq_rel_year
## 2010            48           0.2
## 2011            48           0.2
## 2012            48           0.2
## 2013            48           0.2
## 2014            48           0.2
distr_freq_ass_cumulate_year<-cumsum(freq_ass_year)
distr_freq_rel_cumulate_year<-distr_freq_ass_cumulate_year/N
freq_year<-cbind(freq_ass_year, freq_rel_year, distr_freq_ass_cumulate_year, distr_freq_rel_cumulate_year)
freq_year
##      freq_ass_year freq_rel_year distr_freq_ass_cumulate_year
## 2010            48           0.2                           48
## 2011            48           0.2                           96
## 2012            48           0.2                          144
## 2013            48           0.2                          192
## 2014            48           0.2                          240
##      distr_freq_rel_cumulate_year
## 2010                          0.2
## 2011                          0.4
## 2012                          0.6
## 2013                          0.8
## 2014                          1.0

PER LA VARIABILE MONTH

table (dati["month"])
## month
##  1  2  3  4  5  6  7  8  9 10 11 12 
## 20 20 20 20 20 20 20 20 20 20 20 20
freq_ass_month<-table(dati$month) 
freq_rel_month<-table(dati$month)/N 
distr_freq_month<-cbind(freq_ass_month, freq_rel_month) 
distr_freq_month 
##    freq_ass_month freq_rel_month
## 1              20     0.08333333
## 2              20     0.08333333
## 3              20     0.08333333
## 4              20     0.08333333
## 5              20     0.08333333
## 6              20     0.08333333
## 7              20     0.08333333
## 8              20     0.08333333
## 9              20     0.08333333
## 10             20     0.08333333
## 11             20     0.08333333
## 12             20     0.08333333
distr_freq_ass_cumulate_month<-cumsum(freq_ass_month)
distr_freq_rel_cumulate_month<-distr_freq_ass_cumulate_month/N
freq_month<-cbind(freq_ass_month,freq_rel_month,distr_freq_ass_cumulate_month, distr_freq_rel_cumulate_month)
freq_month
##    freq_ass_month freq_rel_month distr_freq_ass_cumulate_month
## 1              20     0.08333333                            20
## 2              20     0.08333333                            40
## 3              20     0.08333333                            60
## 4              20     0.08333333                            80
## 5              20     0.08333333                           100
## 6              20     0.08333333                           120
## 7              20     0.08333333                           140
## 8              20     0.08333333                           160
## 9              20     0.08333333                           180
## 10             20     0.08333333                           200
## 11             20     0.08333333                           220
## 12             20     0.08333333                           240
##    distr_freq_rel_cumulate_month
## 1                     0.08333333
## 2                     0.16666667
## 3                     0.25000000
## 4                     0.33333333
## 5                     0.41666667
## 6                     0.50000000
## 7                     0.58333333
## 8                     0.66666667
## 9                     0.75000000
## 10                    0.83333333
## 11                    0.91666667
## 12                    1.00000000

Come passo successivo mi concentro sulle variabili numeriche sales, volume, median_price, listings, month inventory

min(dati$sales)
## [1] 79
max(dati$sales)
## [1] 423
mean(dati$sales)
## [1] 192.2917
median(dati$sales)
## [1] 175.5
quantile(dati$sales)
##    0%   25%   50%   75%  100% 
##  79.0 127.0 175.5 247.0 423.0

Tutto ciò per tutte le variabili è possibile farlo con un summary()

summary(dati$sales)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    79.0   127.0   175.5   192.3   247.0   423.0
summary(dati$volume)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   8.166  17.660  27.062  31.005  40.893  83.547
summary(dati$median_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   73800  117300  134500  132665  150050  180000
summary(dati$listings)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     743    1026    1618    1738    2056    3296
summary(dati$months_inventory)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.400   7.800   8.950   9.193  10.950  14.900

Indici di variabilità sales

range(dati$sales)
## [1]  79 423
IQR(dati$sales)
## [1] 120
var(dati$sales)
## [1] 6344.3
sd(dati$sales)
## [1] 79.65111
mean(dati$sales)
## [1] 192.2917
median(dati$sales)
## [1] 175.5
CV<-function(x){
  return (sd (x)/mean(x) *100)
}

CV(dati$sales)
## [1] 41.42203

Indici di variabilità volume

range(dati$volume)
## [1]  8.166 83.547
IQR(dati$volume)
## [1] 23.2335
var(dati$volume)
## [1] 277.2707
sd(dati$volume)
## [1] 16.65145
mean(dati$volume)
## [1] 31.00519
median(dati$volume)
## [1] 27.0625
CV<-function(x){
  return (sd (x)/mean(x) *100)
}

CV(dati$volume)
## [1] 53.70536

Indici di variabilità listings

range(dati$listings)
## [1]  743 3296
IQR(dati$listings)
## [1] 1029.5
var(dati$listings)
## [1] 566569
sd(dati$listings)
## [1] 752.7078
mean(dati$listings)
## [1] 1738.021
median(dati$listings)
## [1] 1618.5
CV<-function(x){
  return (sd (x)/mean(x) *100)
}

CV(dati$listings)
## [1] 43.30833

Indici di variabilità median_price

range(dati$median_price)
## [1]  73800 180000
IQR(dati$median_price)
## [1] 32750
var(dati$median_price)
## [1] 513572983
sd(dati$median_price)
## [1] 22662.15
mean(dati$median_price)
## [1] 132665.4
median(dati$median_price)
## [1] 134500
CV<-function(x){
  return (sd (x)/mean(x) *100)
}

CV(dati$median_price)
## [1] 17.08218

Indici di variabilità months_inventory

range(dati$months_inventory)
## [1]  3.4 14.9
IQR(dati$months_inventory)
## [1] 3.15
var(dati$months_inventory)
## [1] 5.306889
sd(dati$months_inventory)
## [1] 2.303669
mean(dati$months_inventory)
## [1] 9.1925
median(dati$months_inventory)
## [1] 8.95
CV<-function(x){
  return (sd (x)/mean(x) *100)
}

CV(dati$months_inventory)
## [1] 25.06031

provo a farlo con una funzione che calcola l’indice

indici_variabilita <- function(x) {
  data.frame(
    Range = range(x, na.rm = TRUE),
    IQR = IQR(x, na.rm = TRUE),
    Varianza = var(x, na.rm = TRUE),
    Deviazione_Std = sd(x, na.rm = TRUE),
    Media = mean(x, na.rm = TRUE),
    Mediana = median(x, na.rm = TRUE),
    CV = (sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE)) * 100
  )
}

indici_variabilita(dati$sales)
##   Range IQR Varianza Deviazione_Std    Media Mediana       CV
## 1    79 120   6344.3       79.65111 192.2917   175.5 41.42203
## 2   423 120   6344.3       79.65111 192.2917   175.5 41.42203
indici_variabilita(dati$volume)
##    Range     IQR Varianza Deviazione_Std    Media Mediana       CV
## 1  8.166 23.2335 277.2707       16.65145 31.00519 27.0625 53.70536
## 2 83.547 23.2335 277.2707       16.65145 31.00519 27.0625 53.70536
indici_variabilita(dati$months_inventory)
##   Range  IQR Varianza Deviazione_Std  Media Mediana       CV
## 1   3.4 3.15 5.306889       2.303669 9.1925    8.95 25.06031
## 2  14.9 3.15 5.306889       2.303669 9.1925    8.95 25.06031
indici_variabilita(dati$listings)
##   Range    IQR Varianza Deviazione_Std    Media Mediana       CV
## 1   743 1029.5   566569       752.7078 1738.021  1618.5 43.30833
## 2  3296 1029.5   566569       752.7078 1738.021  1618.5 43.30833
indici_variabilita(dati$median_price)
##    Range   IQR  Varianza Deviazione_Std    Media Mediana       CV
## 1  73800 32750 513572983       22662.15 132665.4  134500 17.08218
## 2 180000 32750 513572983       22662.15 132665.4  134500 17.08218

la variabile con indice di variabilità più elevato è “volume”.

Ho provato anche a fare una tabella generale utilizzando una funzione: è corretta come impostazione di codice?

varsum<-function(x){
  min = min (x)
  First_qu = quantile(x, 0.25, names=F)
  median = median(x)
  mean = round(mean(x),1)
  Third_qu=quantile(x, 0.75, names=F)
  max = max (x)
  IQR=IQR(x)
  var=var(x)
  sd=round(sd(dati$sales),1)
  cv=round(sd (x)/mean(x) *100 ,1)
  var=round(var(x))
  sd=round(sd(x))
  
  unito=cbind(min, First_qu, median, mean, Third_qu,
              max,IQR, sd, var, cv)
  return(t(unito))
}

varsum_sales<-varsum(dati$sales)
varsum_volume<-varsum(dati$volume)
varsum_median_price<-varsum(dati$median_price)
varsum_listings<-varsum(dati$listings)
varsum_months_inventory<-varsum(dati$months_inventory)


varsum_tot<- as.data.frame(cbind(varsum_sales, varsum_volume, varsum_median_price, 
                                 varsum_listings, varsum_months_inventory))

colnames(varsum_tot) <- c("Sales", "Volume", "Median_Price", "Listings", "Months_Inventory")

write.csv(varsum_tot, "summary di tutte le variabili.csv", row.names = T)

Creo anche il boxplot che metta in mostra le sue caratteristiche con una funzione

indici_variabilita_boxplot <- function(x) {
  boxplot(x)
  abline(h=quantile(x), col=3)
  abline(h=quantile(x,0.75)+1.5*IQR(x), col=3)
}
indici_variabilita_boxplot(dati$sales) #per la variabile sales

indici_variabilita_boxplot(dati$volume) #per la variabile volume 

indici_variabilita_boxplot(dati$months_inventory) #per la variabile months inventory

indici_variabilita_boxplot(dati$listings) #per la variabile listings

indici_variabilita_boxplot(dati$median_price) #per la variabile median price

Indici di forma delle VARIABILI QUANTITATIVE

#install.packages ("moments")
library (moments)
indici_forma <- function(x) {
  data.frame(skewness = skewness (x, na.rm=TRUE),
  kurtosis = kurtosis (x, na.rm=TRUE) -3)
}

indici_forma(dati$sales)
##   skewness   kurtosis
## 1 0.718104 -0.3131764
indici_forma(dati$volume)
##   skewness kurtosis
## 1 0.884742 0.176987
indici_forma(dati$months_inventory)
##     skewness   kurtosis
## 1 0.04097527 -0.1744475
indici_forma(dati$listings)
##    skewness kurtosis
## 1 0.6494982 -0.79179
indici_forma(dati$median_price)
##     skewness   kurtosis
## 1 -0.3645529 -0.6229618

la variabile più asimmetrica è volume con un valore di skewness di 0.88

plot(density(dati$volume))

Suddivisione di una variabile quantitativa in classi: 1. Valutare il range della variabile volume

min (dati$sales)
## [1] 79
max (dati$sales)
## [1] 423

Osservo il range in cui è compresa la variabile volume: [79-423]. Quindi potrebbe essere ragionevole costruire delle classi che spaziano da 79 a 200 e da 200 ad 423. Creo le classi:

dati$sales_class <- cut (dati$sales,
                        breaks=c(78, 200,423),
                        labels=c("low", "high"))
summary(dati$sales_class)
##  low high 
##  149   91

Ho così creato una nuova colonna che rappresenta una variabile qualitativa (di tipo factor). Costruisco adesso la distribuzione di frequenze come ho fatto per le variabili precedenti.

table (dati["sales_class"])
## sales_class
##  low high 
##  149   91
freq_ass_sales_class<-table(dati$sales_class) 
freq_rel_sales_class<-table(dati$sales_class)/N 
distr_freq_sales_class<-cbind(freq_ass_sales_class, freq_rel_sales_class) 
distr_freq_sales_class 
##      freq_ass_sales_class freq_rel_sales_class
## low                   149            0.6208333
## high                   91            0.3791667
distr_freq_ass_cumulate_sales_class<-cumsum(freq_ass_sales_class)
distr_freq_rel_cumulate_sales_class<-distr_freq_ass_cumulate_sales_class/N
freq_sales_class<-cbind(freq_ass_sales_class, freq_rel_sales_class, distr_freq_ass_cumulate_sales_class, distr_freq_rel_cumulate_sales_class)
freq_sales_class
##      freq_ass_sales_class freq_rel_sales_class
## low                   149            0.6208333
## high                   91            0.3791667
##      distr_freq_ass_cumulate_sales_class distr_freq_rel_cumulate_sales_class
## low                                  149                           0.6208333
## high                                 240                           1.0000000

Giusto per fare una tabella esportabile: fa schifo ma è solo per esercitarmi (ho trasposto però righe e colonne perchè avevano lunghezza variabile)

freq_city_t <- as.data.frame(t(freq_city))
freq_year_t <- as.data.frame(t(freq_year))
freq_month_t <- as.data.frame(t(freq_month))
freq_sales_class_t <- as.data.frame(t(freq_sales_class))

distribuzioni<- as.data.frame(cbind(freq_city_t, freq_year_t, freq_month_t, freq_sales_class_t))
write.csv(distribuzioni, "distribuzione di frequenza di tutte le variabili.csv")

Grafico a barre nuova variabile sales_class delle variabili assolute

barplot(freq_ass_sales_class,
        main = "frequenze assolute sales class",
        xlab = "classi",
        ylab = "frequenza assoluta",
        ylim = c(0,250),
        col = c(3,4))

barplot(freq_rel_sales_class,
        main = "frequenze relative sales class",
        xlab = "classi",
        ylab = "frequenza assoluta",
        ylim = c(0,1),
        col = c(2,7))

Calcolo indice di Gini nuova variabile sales_class

1.fatto con la formula

gini.index<-function(x){
  ni=table(x)
  fi=ni/length(x)
  fi2=fi^2
  J=length(table(x))
  
  gini=1-sum(fi2)
  gini.normalizzato1=gini/((J-1)/J)
  return(gini.normalizzato1)
}

gini.index(dati$sales_class)
## [1] 0.9415972

Fatto solo per la variabile di interesse

fi_2=freq_rel_sales_class^2
gini= 1-sum (fi_2)
gini.normalizzato=gini/((2-1)/2)
gini.normalizzato
## [1] 0.9415972
gini.index(dati$city)
## [1] 1

Indice di Gini della variabile city = 1


Qual è la probabilità che presa una riga a caso di questo dataset essa riporti la città “Beaumont”? E la probabilità che riporti il mese di Luglio? E la probabilità che riporti il mese di dicembre 2012?

Probabilità che presa una riga a caso dal dataset riporta la probabilità che riporti la città Beaumont: righe del dataset che hanno la dicitura Beaumont/Righe totali del dataset.

freq_ass_city
## 
##              Beaumont Bryan-College Station                 Tyler 
##                    60                    60                    60 
##         Wichita Falls 
##                    60
#per la città di Beaumont la probabilità è data dai casi favorevoli/casi totali

# Funzione per calcolare la probabilità di "Beaumont"
calcola_probabilita_beaumont <- function(dati) {
  numero_Beaumont <- sum(dati == "Beaumont")
  numero_totale <- nrow(dati)
  probabilita_Beaumont <- numero_Beaumont / numero_totale
  return(probabilita_Beaumont)
}

probabilita <- calcola_probabilita_beaumont(dati)
print(probabilita)
## [1] 0.25
60/240
## [1] 0.25

probabilità Mese di Luglio

calcola_probabilita_beaumont <- function(dati) {
  numero_Beaumont <- sum(dati[,3] == "7")
  numero_totale <- nrow(dati)
  probabilita_Beaumont <- numero_Beaumont / numero_totale
  return(probabilita_Beaumont)
}

probabilita <- calcola_probabilita_beaumont(dati)
print(probabilita)
## [1] 0.08333333
5*4
## [1] 20
20/240
## [1] 0.08333333

Probabilità dicembre 2012

calcola_probabilita_dic_2012 <- function(dati) {
  numero_dic_2012 <- sum(dati[,2] == "2012" & dati[,3] == "7")
  numero_totale <- nrow(dati)
  probabilita_dic_2012 <- numero_dic_2012 / numero_totale
  return(probabilita_dic_2012)
}

probabilita <- calcola_probabilita_dic_2012(dati)
print(probabilita)
## [1] 0.01666667
4/240
## [1] 0.01666667

Esiste una colonna col prezzo mediano, creane una che indica invece il prezzo medio, utilizzando le altre variabili che hai a disposizione.

Si può calcolare il prezzo medio di vendita per ogni mese dividendo volume/vendite: quindi la nuova colonna dovrà contenere questo rapporto:

dati$mean_price <- dati$volume/dati$sales

I valori sono piccoli perché probabilmente il volume andrebbe calcolato in 1000 dollari, quindi basterà aggiungere nella stringa precedente un *1000

dati$mean_price <- dati$volume/dati$sales*1000
summary(dati$mean_price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   97.01  132.94  156.59  154.32  173.92  213.23

Prova a creare un’altra colonna che dia un’idea di “efficacia” degli annunci di vendita.

L’efficacia degli annunci la si può valutare attraverso una nuova colonna che sia effettivamente rappresentativa degli annunci. Ho pensato che un raggruppamento degli annunci in classi di qualitative potrebbe dare l’idea dell’efficacia di questa variabile se relazionata ad altre variabili. Mi costruisco anche il barplot per capire la relazione tra le variabili di interesse.

dati$listings_class <- cut (dati$listings,
                            breaks=c(742, 1100, 2000, 3296),
                            labels=c("low", "medium", "high"))
library(ggplot2)
ggplot(dati,
       aes(y=sales,
           x=city))+
  geom_col()+
  facet_grid(.~listings_class)+
  theme_classic()

ggplot(dati,
       aes(y=sales,
           x=city,
           fill=year))+
  geom_col()+
  facet_grid(.~listings_class)+
  theme_classic()

Creando una nuova colonna raggruppando in un range la variabile “listings” cioè gli annunci attivi in 3 categorie di range “low”, “medium” e “high” quello che balza subito all’occhio osservando il rapporto di questa nuova categoria con la variabile “sales” e “city”, è che: - La città di Wichita Falls ha il numero di annunci attivi più basso (o meglio compreso tra i 700 e 1100) rispetto alle altre città e allo stesso tempo ha avuto un numero di vendite minore (tra le 500 e 1000). - Benché, Bryan College abbia anch’esso un certo numero di annunci attivi basso, la maggior parte degli annunci attivi ricade nel range “medium” (tra 1100 e 2000), assieme a Beaumont (che ha un numero di annunci attivi tra i 1100 e 2000) sono le città che hanno avuto un numero di vendite tra le 10000 e le 15000. - Infine, la l’unica città con più annunci attivi è Tyler che rientra nella fascia di annunci attivi “high” (tra 2000 e 3300) e allo stesso tempo è l’unica città ad aver avuto un numero di vendite maggiore che supera le 15000. Sulla base di queste osservazioni è possibile speculare che il numero di annunci attivi basso avere una relazione (positiva) con il numero di vendite.

Si può anche esplorare come mai Bryan College ha un numero di annunci attivi low. Se esploro per la variabile year, noto che in realtà Bryan College, per qualche motivo, ha avuto un numero di annunci attivi “low” quasi esclusivamente nel 2014.

ggplot(dati,
       aes(y=sales,
           x=city,
           fill=year))+
  geom_col()+
  facet_grid(.~listings_class)+
  theme_classic()

Prova a creare dei summary(), o semplicemente media e deviazione standard, di alcune variabili a tua scelta, condizionatamente alla città, agli anni e ai mesi.

A questo punto creo dei summary, di alcune variabili come sales e volume condizionatamente alla città, agli anni e ai mesi. Con il pacchetto dplyr unito alla creazione di una funzione.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
summary_city<-function(x) {dati %>%
  group_by(dati$city) %>%
  summarize(mean=mean(x),
            sd=sd(x),
            skewness=skewness(x))
}
summary_city(dati$sales)
## # A tibble: 4 × 4
##   `dati$city`            mean    sd skewness
##   <fct>                 <dbl> <dbl>    <dbl>
## 1 Beaumont               192.  79.7    0.718
## 2 Bryan-College Station  192.  79.7    0.718
## 3 Tyler                  192.  79.7    0.718
## 4 Wichita Falls          192.  79.7    0.718
#Per anno
summary_year<-function(x) {dati %>%
    group_by(dati$year) %>%
    summarize(mean=mean(x),
              sd=sd(x),
              skewness=skewness(x))
}
summary_year(dati$sales)
## # A tibble: 5 × 4
##   `dati$year`  mean    sd skewness
##   <fct>       <dbl> <dbl>    <dbl>
## 1 2010         192.  79.7    0.718
## 2 2011         192.  79.7    0.718
## 3 2012         192.  79.7    0.718
## 4 2013         192.  79.7    0.718
## 5 2014         192.  79.7    0.718
#Per mese
summary_month<-function(x) {dati %>%
    group_by(dati$year) %>%
    summarize(mean=mean(x),
              sd=sd(x),
              skewness=skewness(x))
}
summary_month(dati$sales)
## # A tibble: 5 × 4
##   `dati$year`  mean    sd skewness
##   <fct>       <dbl> <dbl>    <dbl>
## 1 2010         192.  79.7    0.718
## 2 2011         192.  79.7    0.718
## 3 2012         192.  79.7    0.718
## 4 2013         192.  79.7    0.718
## 5 2014         192.  79.7    0.718

Utilizza i boxplot per confrontare la distribuzione del prezzo mediano delle case tra le varie città. Commenta il risultato.

Utilizza i boxplot per confrontare la distribuzione del valore totale delle vendite tra le varie città ma anche tra i vari anni. Qualche considerazione da fare?

library(ggplot2)

Boxplot per confrontare la distribuzione del valore totale delle vendite tra le varie città ma anche tra i vari anni

ggplot(dati, aes(x = city, y = median_price)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(title = "Distribuzione del prezzo mediano delle Vendite per Città", x = "Città", y = "Prezzo mediano") +
  theme_minimal()

ggplot(dati, aes(x = city, y = sales)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(title = "Distribuzione del Valore Totale delle Vendite per Città", x = "Città", y = "Valore Totale delle Vendite") +
  theme_minimal()

ggplot(dati, aes(x = year, y = sales)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(title = "Distribuzione del Valore Totale delle Vendite per anno", x = "anno", y = "Valore Totale delle Vendite") +
  theme_minimal()

Per quanto riguarda il prezzo mediano tra le varie città, dal boxplot si può stimare che la città di Bryan-College Station ha un prezzo mediano più alto rispetto alle altre, mentre la città di Wichita Falls ha un prezzo mediano più basso. Le città di Beaumont e Tyler hanno un prezzo simile, più alto di Wichita Falls ma più basso di Bryan-College Station.

Dai boxplot per città e per anno si intuisce che le città di Beaumont e Wichita Falls sono quelle che hanno avuto una vendita mediana più bassa. Tuttavia è anche apprezzabile che la città di Bryan-College Station, nonostante abbia una mediana molto simile alla città di Beaumont, essa ha un range di vendite massimo molto più alto. Per quanto riguarda il periodo temporale che va dal 2010 al 2014, dal boxplot è possibile speculare che Il 2014 è stato complessivamente l’anno in cui si sono registrate più vendite seguito dal 2013, 2012 e 2010. L’anno 2011 è stato invece l’anno che ha registrato meno vendite complessivamente.

Usa un grafico a barre sovrapposte per confrontare il totale delle vendite nei vari mesi, sempre considerando le città.

ggplot(dati,
       aes(y=sales,
           x=month,
           fill=city))+
  geom_col()+
  theme_classic()

ggplot(dati,
       aes(y=sales,
           x=year,
           fill=month))+
  geom_col(col="grey")+
  facet_grid(.~city)+
  theme_classic()

ggplot(dati)+
  geom_bar(aes(x=year,
               fill=month),
           position="fill",
           stat="count",
           col="black")+
  scale_y_continuous(breaks = seq(0, 1, 0.1))+
  facet_grid(.~city)+
  theme_classic()

Con i barplot si intuisce che l’incremento di vendite nella città di Tyler e Bryan-College Station si è avuto maggiormente nel 2014. Inoltre se nelle prime 3 città si è avuto un incremento maggiore negli ultimi 2 anni, Wichita Falls non ha registrato incrementi con il passare degli anni. Nel grafico a barre sovrapposte si vede come Beaumont e Wichita Falls hanno avuto vendite costanti nei mesi mentre le altre 2 città hanno avuto maggiori vendite nei mesi centrali (Maggio-Settembre).

N.B. Non sono riuscito benissimo ad eseguire il grafico normalizzato. Non ho capito esattamente come eseguirlo e a cosa serve. Potresti aiutarmi a capirlo?

Prova a creare un line chart di una variabile a tua scelta per fare confronti commentati fra città e periodi storici.

beaumont_data <- dati[dati$city == "Beaumont", ]
beaumont_data$date <- seq.Date(from = as.Date("2010-01-01"), 
                               to = as.Date("2014-12-01"), 
                               by = "month")
beaumont_final <- beaumont_data[, c("city", "date", "sales")]


Bryan_data <- dati[dati$city == "Bryan-College Station", ]
Bryan_data$date <- seq.Date(from = as.Date("2010-01-01"), 
                               to = as.Date("2014-12-01"), 
                               by = "month")
Bryan_final <- Bryan_data[, c("city", "date", "sales")]


Tyler_data <- dati[dati$city == "Tyler", ]
Tyler_data$date <- seq.Date(from = as.Date("2010-01-01"), 
                               to = as.Date("2014-12-01"), 
                               by = "month")
Tyler_final <- Tyler_data[, c("city", "date", "sales")]

Wichita_data <- dati[dati$city == "Wichita Falls", ]
Wichita_data$date <- seq.Date(from = as.Date("2010-01-01"), 
                               to = as.Date("2014-12-01"), 
                               by = "month")
Wichita_final <- Wichita_data[, c("city", "date", "sales")]

Il passo successivo è quello di graficare le serie temporali di ciascuna città separatamente:

library(ggplot2)
ggplot(data = beaumont_final)+
  #geom_col (aes (x=date, y=sales))
  geom_line (aes (x=date, y=sales), col="red",lwd=1)

ggplot(data = Bryan_final)+
  #geom_col (aes (x=date, y=sales))
  geom_line (aes (x=date, y=sales), col="red",lwd=1)

ggplot(data = Tyler_final)+
  #geom_col (aes (x=date, y=sales))
  geom_line (aes (x=date, y=sales), col="red",lwd=1)

ggplot(data = Wichita_final)+
  #geom_col (aes (x=date, y=sales))
  geom_line (aes (x=date, y=sales), col="red",lwd=1)

Infine, per mettere insieme nello stesso grafico città e periodo storico mi sono ucciso letteralmente!!!

beaumont_final$city <- "Beaumont"
Bryan_final$city <- "Bryan"
Tyler_final$city <- "Tyler"
Wichita_final$city <- "Wichita"

Ho unito tutti i dataset per riga

combined_data <- rbind(beaumont_final, Bryan_final, Tyler_final, Wichita_final)
summary(combined_data)
##      city                date                sales      
##  Length:240         Min.   :2010-01-01   Min.   : 79.0  
##  Class :character   1st Qu.:2011-03-24   1st Qu.:127.0  
##  Mode  :character   Median :2012-06-16   Median :175.5  
##                     Mean   :2012-06-16   Mean   :192.3  
##                     3rd Qu.:2013-09-08   3rd Qu.:247.0  
##                     Max.   :2014-12-01   Max.   :423.0

Concludo con il grafico finale per confrontarli

ggplot(combined_data,
       aes(x=date, y=sales, col=city))+
  geom_line() + geom_point()

oppure con le rette di tendenza

ggplot(combined_data,
       aes(x=date, y=sales, col=city))+
  geom_line(lty=2) + geom_smooth(se=F)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Sulla base di quest’ultimo grafico posso dire che la città di tyler, oltre ad essere quella che ha venduto di più è stata anche quella, assieme a Beaumont ad avere una crescita di vendite nel tempo. Anche la città Bryan ha avuto una crescita analoga a quella di Braumont, tuttavia sembra che da fine 2013 sia andata in contro ad un plateau. La città di Wichita invece non solo non ha avuto in 5 anni una crescita nelle vendite, ma si assiste addirittura ad una riduzione generale, accentuata tra il 2011 e metà 2012 e a fine 2014. Ho preso questi ultimi codici da un libro di analisi grafica R “Data visualization in R.