0. Importazione dataset e caricamento pachetti

data <- read.csv("C:\\Users\\devel\\Documents\\realestate_texas.csv",sep=",")
attach(data)
N=dim(data)[1]
library(dplyr)
## 
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
## 
##     filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)

1. Analisi delle variabili

Dimensione del dataset:

N=dim(data)[1]
N
## [1] 240

Prime righe del datataset:

head(data)
##       city year month sales volume median_price listings months_inventory
## 1 Beaumont 2010     1    83 14.162       163800     1533              9.5
## 2 Beaumont 2010     2   108 17.690       138200     1586             10.0
## 3 Beaumont 2010     3   182 28.701       122400     1689             10.6
## 4 Beaumont 2010     4   200 26.819       123200     1708             10.6
## 5 Beaumont 2010     5   202 28.833       123100     1771             10.9
## 6 Beaumont 2010     6   189 27.219       122800     1803             11.1

Dai dati visualizzati possimo definire che le varibili contenute nel dataset sono:

È possibile calcolare:

2. Indici di posizione,variabilità e forma

Calcoliamo la distribuzione di fequenze per le variabili month, city, e year in quanto presentano poche modalità ripetute. Grazie a questi calcoli stabiliremo con che frequenza sono stati raccolti i dati nelle varie località.

Calcoliamo gli indici di posizione per tutte la variabili eccetto city per verificare la distribuzione dei dati

Calcoliamo gli indici di variabilità e forma arrotondando alla terza cifra decimale per tutte le variabili eccetto month, city, e year così da poter avere delle indicazioni sulle tendenze delle variabili ad assumere deteminati valori.

Distribuzione di frequenze

city

freq_abs <- table(city)
freq_rel <- table(city)/N
distr_freq_CITY<-cbind(freq_abs,freq_rel)
distr_freq_CITY  
##                       freq_abs freq_rel
## Beaumont                    60     0.25
## Bryan-College Station       60     0.25
## Tyler                       60     0.25
## Wichita Falls               60     0.25

month

freq_ass <- table(month)
freq_rel <- table(month)/N
distr_freq_month<-cbind(freq_abs,freq_rel)
distr_freq_month
##    freq_abs   freq_rel
## 1        60 0.08333333
## 2        60 0.08333333
## 3        60 0.08333333
## 4        60 0.08333333
## 5        60 0.08333333
## 6        60 0.08333333
## 7        60 0.08333333
## 8        60 0.08333333
## 9        60 0.08333333
## 10       60 0.08333333
## 11       60 0.08333333
## 12       60 0.08333333

year

freq_ass <- table(year)
freq_rel <- table(year)/N
distr_freq_year<-cbind(freq_ass,freq_rel)
distr_freq_year
##      freq_ass freq_rel
## 2010       48      0.2
## 2011       48      0.2
## 2012       48      0.2
## 2013       48      0.2
## 2014       48      0.2

Indici di posizione

t = subset(data, select = -city)
position_indices = cbind(summary(t))
position_indices
##       year            month             sales             volume        
##  "Min.   :2010  " "Min.   : 1.00  " "Min.   : 79.0  " "Min.   : 8.166  "
##  "1st Qu.:2011  " "1st Qu.: 3.75  " "1st Qu.:127.0  " "1st Qu.:17.660  "
##  "Median :2012  " "Median : 6.50  " "Median :175.5  " "Median :27.062  "
##  "Mean   :2012  " "Mean   : 6.50  " "Mean   :192.3  " "Mean   :31.005  "
##  "3rd Qu.:2013  " "3rd Qu.: 9.25  " "3rd Qu.:247.0  " "3rd Qu.:40.893  "
##  "Max.   :2014  " "Max.   :12.00  " "Max.   :423.0  " "Max.   :83.547  "
##   median_price         listings      months_inventory  
##  "Min.   : 73800  " "Min.   : 743  " "Min.   : 3.400  "
##  "1st Qu.:117300  " "1st Qu.:1026  " "1st Qu.: 7.800  "
##  "Median :134500  " "Median :1618  " "Median : 8.950  "
##  "Mean   :132665  " "Mean   :1738  " "Mean   : 9.193  "
##  "3rd Qu.:150050  " "3rd Qu.:2056  " "3rd Qu.:10.950  "
##  "Max.   :180000  " "Max.   :3296  " "Max.   :14.900  "

Indici di variabilita

CV <-function(x){
  return( sd(x)/mean(x) * 100 )
}

VARIABILITY_INDICES <- function (x){
  
  mu=mean(x)
  n=length(x)
  dif = max(x) - min(x)
  iqr = round(IQR(x), digits = 3)
  var = round((var(x) * (n-1)) /n , digits = 3)
  dv =  round( sqrt(var), digits = 3)
  cv = round( CV(x), digits = 3)
  
  return( c(dif,iqr,var,dv,cv))
}

variability_indices <- data.frame(misura = c("DIF","IQR","VAR","DV", "CV"),
                                    sales = VARIABILITY_INDICES(sales),
                                    volume = VARIABILITY_INDICES(volume),
                                    median_price  =VARIABILITY_INDICES(median_price ),
                                    listings  = VARIABILITY_INDICES(listings ),
                                    months_inventory = VARIABILITY_INDICES(months_inventory))
variability_indices
##   misura    sales  volume median_price   listings months_inventory
## 1    DIF  344.000  75.381 1.062000e+05   2553.000           11.500
## 2    IQR  120.000  23.233 3.275000e+04   1029.500            3.150
## 3    VAR 6317.865 276.115 5.114331e+08 564208.262            5.285
## 4     DV   79.485  16.617 2.261489e+04    751.138            2.299
## 5     CV   41.422  53.705 1.708200e+01     43.308           25.060

Indici di forma

SHAPE_INDEXES <- function (x){
  
  #asimmetria
  mu<-mean(x)
  sigma <- sd(x)
  
  m3 <- sum( (x-mu)^3 ) / length(x)
  
  asim.fisher <-  round( m3 / sigma^3, digits = 3)
  
  
  #curtosi
  m4 <- sum( (x-mu)^4 ) / length(x)
  curtosi <-  round( m4 / sigma^4 - 3, digits = 3)

  
  return( c(  asim.fisher, curtosi))
  
}


shape_indices <- data.frame(misura = c("Fisher","curtosi"),
                 sales = SHAPE_INDEXES(sales),
                 volume = SHAPE_INDEXES(volume),
                 median_price  = SHAPE_INDEXES(median_price ),
                 listings  = SHAPE_INDEXES(listings ),
                 months_inventory = SHAPE_INDEXES(months_inventory))
shape_indices
##    misura  sales volume median_price listings months_inventory
## 1  Fisher  0.714  0.879       -0.362    0.645            0.041
## 2 curtosi -0.336  0.151       -0.643   -0.810           -0.198

Considerazioni

Dall’ analisi della distribuzione di frequenze delle variabili city, year, e month possiamo affermare che le misurazioni sono state effettuate con una frequenza omogenea (una al mese dal 2014 al 2014) perchè le frequenze relative e assolute sono uguali per ogni anno, mese e anno

Dagli indici di forma possiamo riscontrre che le variabili sales, volume e listngs hanno una maggiore frequenza di modalità alte (distribuzione asimetrica positiva) mentre la variabile media_price ha una maggiore frequenza di modalità basse (distribuzione asimetrica negativa)

3. Identificazione delle variabili con maggiore variabilità e asimmetria

la variabile con variabilità più alta è il volume in quanto presenta il coefficiente di variazione maggiore. La variabile più asimmetrica è sempre il volume perchè presenta il valore assoluto dell’ indice di asimmetria di Fisher più elevato

4. Creazione di classi per una variabile quantitativa

Si è deciso di suddividere in classi la variabile sales. Il valore massimo e minimo riscontrati per la variabile sono rispettivamente 423 e 79 per cui è stato deciso di dividere la variabile nelle seguenti classi : (70,120], (120,170], (170,220], (220,270], (270,320], (320,370], (370,420], (420,470]

Distribuzione delle frequenze per classe:

min(sales)
## [1] 79
max(sales)
## [1] 423
#suddivisione in classi variabile sales
sales_cl <- cut(sales,
                    breaks = c(70,120,170,220,270,320,370,420,470))

#calcolo distribuzioni di frequenze 
ni<-table(sales_cl)
fi<-ni/N
Ni<-cumsum(ni)
Fi<-Ni/N

distr_freq_sales_cl<-as.data.frame(cbind(ni,fi,Ni,Fi))

distr_freq_sales_cl
##           ni          fi  Ni        Fi
## (70,120]  48 0.200000000  48 0.2000000
## (120,170] 68 0.283333333 116 0.4833333
## (170,220] 48 0.200000000 164 0.6833333
## (220,270] 27 0.112500000 191 0.7958333
## (270,320] 29 0.120833333 220 0.9166667
## (320,370] 14 0.058333333 234 0.9750000
## (370,420]  5 0.020833333 239 0.9958333
## (420,470]  1 0.004166667 240 1.0000000

Rappresentazione dei risultati ottenuti tramite grafico a barre

data$sales_cl<-sales_cl

ggplot(data = data)+
  geom_bar(
    aes(x= sales_cl),
    stat = "count",
    col="black")+
  labs(x="Classi",
       y="Frequenze assoluta",
       title="Frequenza assoluta per ogni classe di sales ")+
  theme_bw()+
  scale_y_continuous(breaks = seq(0,70,5))

Calcolo indice di Gini

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

gini.index(data$sales_cl)
## [1] 0.924127

L’indice di Gini per la classe è 0.924127 questo indica che l’ eterogeneità è quasi massima

5. Calcolo della probabilità

La probabilità che, presa una riga a caso di questo dataset essa riporti la città “Beaumont” è la sua frequenza relativa ovvero 0,25 ( numero di volte in cui compare / numero totale elementi) . La probabilità che riporti il mese di Luglio è la sua frequenza relativa ovvero 0,083 ( numero di volte in cui compare / numero totale elementi). E la probabilità che riporti il mese di dicembre 2012 è data dalla somma della probabilità che venga riportato il mese dicembre (0,083) con la probabilità che sia riportato l’anno 2012 ( 0,2) che corrisponde a 0,283

6. Creazione di nuove variabili

Creazione di una nuova colonna che indica il prezzo medio

data$mean_price <- volume/sales

ggplot(data)+
  geom_bar( aes(x = city , y = mean_price ),
            stat = "identity")+
 
  labs(x="città",
       y="Prezzo medio",
       title="Prezzo medio degli annunci di vendita in milioni di dollari ")

Creazione di una colonna che misura l’efficacia degli annunci di vendita

# il numero totale di vendite fratto annunci attivi  
data$efficacy  <- sales/listings


ggplot(data)+
  geom_bar( aes(x = city , y = efficacy ),
            stat = "identity")+
 
  labs(x="città",
       y="Efficacia",
       title="Efficacia degli annunci di vendita")

Considerazioni

Considerando efficacia di vendita come il rapporto tra le vendite il numero totale di annunci attivi la città che presenta maggiore efficacia è Bryan-Collage e quella che presenta una minore efficacia è Tyler

7. Analisi condizionata

Analisi condizioneta per citta

dataForCity = data %>% group_by(city)%>%
  summarise(mean_Sales = mean(sales), sd_sales = sd(sales), 
            mean_volume = mean(volume), sd_volume = sd(volume))

#Media vendite per città
ggplot(dataForCity, aes(x = city , y = mean_Sales , fill = city))+
  geom_bar(  stat = "identity")+
  geom_text(aes(label=round(mean_Sales, 2)), vjust=-0.5)+
 
  labs(x="città",
       y="media vendite ",
       title="Media vendite per città")+
   theme(legend.position = "none")

Analisi condizioneta per mese

dataForMonth = data %>% group_by(month)%>%
  summarise(mean_Sales = mean(sales), sd_sales = sd(sales), mean_volume = mean(volume), sd_volume = sd(volume))


#Media vendite per mese
ggplot(dataForMonth, aes(x = month , y = mean_Sales , fill = month))+
  geom_bar(  stat = "identity")+
  geom_text(aes(label=round(mean_Sales, 2)), vjust=-0.5)+
 scale_x_continuous(breaks = seq(1, 12, 1)) +
  labs(x="mese",
       y="media vendite ",
       title="Media vendite per mese")+
   theme(legend.position = "none")

Analisi condizioneta per anno

dataForYear = data %>% group_by(year)%>%
  summarise(mean_Sales = mean(sales), sd_sales = sd(sales), mean_volume = mean(volume), sd_volume = sd(volume))

#Media vendite per città
ggplot(dataForYear, aes(x = year , y = mean_Sales , fill = year))+
  geom_bar(  stat = "identity")+
  geom_text(aes(label=round(mean_Sales, 2)), vjust=-0.5)+
 
  labs(x="Anno",
       y="media vendite ",
       title="Media vendite per anno")+
   theme(legend.position = "none")

8. Creazione di visualizzazioni con ggplot2

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

ggplot(data)+
  geom_boxplot(aes(
    x=city,
    y= median_price),
    col="red",
    fill="darkblue")+
  labs(x="cità ",
       y="Prezzo medio",
       title="Distribuzione prezzo medio")+
  theme_bw()+
  scale_y_continuous(breaks = seq(75000,175000,3000))

ggplot(data)+
  geom_boxplot(aes(
    x=city,
    y= median_price,
    fill= factor(year)))+
  labs(x="città",
       y="Prezzo medio",
       title="Distribuzione prezzo medio per anno ")+
  theme_bw()+
  scale_y_continuous(breaks = seq(75000,175000,3000))+
  scale_fill_discrete(name = "Legenda")

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

ggplot(data)+
  geom_bar( aes(x = month, y = sales, fill = city),
            stat = "identity", position = "dodge", width = 0.8)+
  scale_x_continuous(breaks = seq(1, 12, 1)) +
   scale_y_continuous(breaks = seq(100,5000,50))+
  labs(title = "Vendite totali mensili per ogni città",
       x = "Month",
       y = "Total Sales",
       fill = "City") 

ggplot(data)+
  geom_bar( aes(x = month, y = sales, fill = city),
            stat = "identity")+
  scale_x_continuous(breaks = seq(1, 12, 1)) +
   scale_y_continuous(breaks = seq(100,5000,250))+
  labs(title = "Vendite totali mensili per ogni città",
       x = "Month",
       y = "Total Sales",
       fill = "City") 

ggplot(data)+
  geom_bar( aes(x = month, y = sales),
            stat = "identity")+
  scale_x_continuous(breaks = seq(1, 12, 1)) +
   scale_y_continuous(breaks = seq(100,5000,250))+
  labs(title = "Vendite totali per ogni mese",
       x = "Month",
       y = "Total Sales",
       fill = "City") 

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

dataForCityYear = data %>% group_by(city, year)%>%
  summarise(sales = mean(sales))
## `summarise()` has grouped output by 'city'. You can override using the
## `.groups` argument.
ggplot(dataForCityYear, aes(x = year, y = sales,fill = city, color =  city , group = city)) +
  geom_line() +              
   geom_point() +  
   
  labs(title = "Evoluzione andamendo delle vendite  ",
       x = "cità",
       y = "numero vendite") +
  theme_minimal() 

dataForCityYear = data %>% group_by(year,city)%>%
  summarise(median_price = mean(median_price))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
ggplot(dataForCityYear, aes(x = year, y = median_price,fill = city, color =  city , group = city)) +
  geom_line() +               # Aggiungi la linea
   geom_point() +  
  labs(title = "Evoluzione andamendo prezzi medi   ",
       x = "cità",
       y = "Prezzo medio in dollari ") +
  theme_minimal()

Grafici a barre per confrontare il numero di annunci attivi per mese e città.

ggplot(data)+
  geom_bar( aes(x = month, y = listings , fill = city),
            stat = "identity", position = "dodge", width = 0.8)+
  scale_x_continuous(breaks = seq(1, 12, 1)) +
  labs(title = "numero annunci attivi per ogni città e mese",
       x = "Month",
       y = "Annunci attivi",
       fill = "City") 

9. Conclusioni

Dai boxplot del prezzo medio per città è anno possiamo riscontrare (questo grafico ci da valori più attendibili rispetto al line charts per confrontare l’andamento delle vendite in periodi storici differenti in quanto evidenzia gli Outlier):

Dal grafici a barre per confrontare la distribuzione delle vendite tra le varie città possiamo riscontrare:

Dai grafici a barre per confrontare il numero di annunci attivi per mese e città possiamo riscontrare: