故事是這樣的

*房價可能已是我們無法改變的事實,但你怎麼決定你會買什麼樣的房子?

[問題是]:充斥一堆房價資訊,但每個家庭也都有各自的喜好條件

Data Description

1.simple model: 可以指定理想房屋型態、條件,可以提供你參考的房價 2.Data source:不動產實價登錄資料 ( ~ 2014年5月16日) 3.Predictor variables : 建物面積、所屬縣市、屋齡、行政區域、建物型態 4.建物型態: 華廈(10層含以下有電梯)、套房(1房1廳1衛)、公寓(5樓含以下無電梯)、大樓(11層含以上有電梯)

我們的問題是:你怎麼決定你會買什麼樣的房子?

1.設定所需的函式庫(libraries)以及載入資料

#install.packages("dplyr") ;
#install.packages("ggplot2"); 
#install.packages("rpart"); 
#install.packages("rpart.plot");

library(dplyr)#dplyr是對資料做整理的套件
library(ggplot2)#ggplot2 是劃圖套件
library(rpart)# rpart 是決策樹套件
library(rpart.plot)# rpart.plot是決策樹的繪圖套件

dat2 <- read.csv("D:/Rdata Practice/Five city01.csv",header=TRUE, sep=",",  encoding="utf-8")
nrow(dat2)
## [1] 5431
head(dat2) #抓前6筆資料
##         行政區   縣市 型態     房價   面積 屋齡   車位   管理
## 1 臺北市文山區 臺北市 大樓 47500000 80.495    6 有車位 有管理
## 2 臺北市文山區 臺北市 華廈  8450000 21.804   21 無車位 有管理
## 3 臺北市中正區 臺北市 華廈 14600000 20.936   38 無車位 無管理
## 4 臺北市文山區 臺北市 公寓  8120000 26.236   31 無車位 有管理
## 5 臺北市文山區 臺北市 公寓 13900000 30.347   40 無車位 無管理
## 6 臺北市文山區 臺北市 公寓 13500000 25.471   34 無車位 有管理
dat2[sample(1:nrow(dat2),18),]#隨機抓18筆出來看
##            行政區   縣市 型態     房價    面積 屋齡   車位   管理
## 2923 新北市新店區 新北市 大樓 12400000  23.807   15 無車位 有管理
## 4801 苗栗縣公館鄉 苗栗縣 透天  3900000  44.504   15 無車位 無管理
## 5007 彰化縣埔心鄉 彰化縣 透天  8700000 106.825   20 無車位 無管理
## 2104 高雄市鳳山區 高雄市 透天  5600000  44.976   42 無車位 無管理
## 1752   臺南市東區 臺南市 套房   421000   9.725   24 無車位 無管理
## 4503 嘉義市嘉義市 嘉義市 透天  3480000  31.911   40 無車位 無管理
## 229  臺北市文山區 臺北市 大樓 36800000  64.257    0 有車位 有管理
## 1807 高雄市鳳山區 高雄市 透天  2000000  27.440   41 無車位 無管理
## 4287 桃園縣楊梅市 桃園縣 華廈  3900000  30.689   15 無車位 有管理
## 82   臺北市南港區 臺北市 華廈  6600000  12.641   19 無車位 有管理
## 2047 高雄市左營區 高雄市 華廈  3500000  24.152   17 無車位 有管理
## 1721 臺南市安南區 臺南市 透天  6800000  43.690   29 無車位 無管理
## 3617 桃園縣八德市 桃園縣 大樓  9800000  50.390    1 有車位 有管理
## 846  臺中市大里區 臺中市 透天  3000000  29.990   38 無車位 無管理
## 258  臺北市南港區 臺北市 華廈 15700000  20.688   14 有車位 有管理
## 2443 新北市永和區 新北市 透天 14300000  22.951   42 無車位 無管理
## 4839 苗栗縣苗栗市 苗栗縣 透天  6280000  63.038   20 無車位 無管理
## 5252 屏東縣長治鄉 屏東縣 透天  9800000  56.831    0 無車位 無管理

2.敘述性統計基本資料

summary(dat2)#敘述性統計基本資料
##           行政區          縣市        型態           房價          
##  桃園縣桃園市: 344   新北市 :1056   大樓:2167   Min.   :    50300  
##  新北市淡水區: 219   桃園縣 : 978   公寓: 814   1st Qu.:  3550000  
##  臺中市西屯區: 160   高雄市 : 602   套房: 280   Median :  6300000  
##  桃園縣楊梅市: 146   臺南市 : 569   透天:1185   Mean   :  9217429  
##  臺北市文山區: 144   臺北市 : 551   華廈: 985   3rd Qu.: 10300000  
##  桃園縣中壢市: 137   臺中市 : 474               Max.   :155000000  
##  (Other)     :4281   (Other):1201                                  
##       面積              屋齡           車位          管理     
##  Min.   :  0.324   Min.   : 0.00   有車位:2020   有管理:3140  
##  1st Qu.: 26.154   1st Qu.: 4.00   無車位:3411   無管理:2291  
##  Median : 35.740   Median :18.00                              
##  Mean   : 39.691   Mean   :16.88                              
##  3rd Qu.: 48.806   3rd Qu.:25.00                              
##  Max.   :232.756   Max.   :74.00                              
## 
summarize(group_by(dat2, 型態), 平均=mean(房價))
## Source: local data frame [5 x 2]
## 
##   型態     平均
## 1 大樓 12241661
## 2 公寓  7007017
## 3 套房  3564414
## 4 透天  7863983
## 5 華廈  7625996

3.Graphic is more intutive

barplot(sort(table(dat2$縣市),decreasing=TRUE)[1:10])

pie(sort(table(dat2$型態),decreasing=TRUE))

hist(dat2$房價/10^6,breaks=100,col="lightpink",prob=TRUE,xlab="房價(百萬)",main="Historgram")

boxplot(面積~型態,data=subset(dat2,縣市=="臺北市"),ylab="面積(坪)",main="面積")

4.只取五都出來看

dat2a <- dat2[dat2$縣市 %in% c("臺北市","臺中市","新北市","臺南市","高雄市") ,]
nrow(dat2a)
## [1] 3252
head(dat2a)
##         行政區   縣市 型態     房價   面積 屋齡   車位   管理
## 1 臺北市文山區 臺北市 大樓 47500000 80.495    6 有車位 有管理
## 2 臺北市文山區 臺北市 華廈  8450000 21.804   21 無車位 有管理
## 3 臺北市中正區 臺北市 華廈 14600000 20.936   38 無車位 無管理
## 4 臺北市文山區 臺北市 公寓  8120000 26.236   31 無車位 有管理
## 5 臺北市文山區 臺北市 公寓 13900000 30.347   40 無車位 無管理
## 6 臺北市文山區 臺北市 公寓 13500000 25.471   34 無車位 有管理
summary(dat2a)
##           行政區          縣市        型態           房價          
##  新北市淡水區: 219   新北市 :1056   大樓:1340   Min.   :   300000  
##  臺中市西屯區: 160   高雄市 : 602   公寓: 575   1st Qu.:  4100000  
##  臺北市文山區: 144   臺南市 : 569   套房: 203   Median :  7355000  
##  臺南市永康區: 137   臺北市 : 551   透天: 600   Mean   : 10924566  
##  高雄市鳳山區: 108   臺中市 : 474   華廈: 534   3rd Qu.: 12800000  
##  新北市中和區: 103   宜蘭縣 :   0               Max.   :155000000  
##  (Other)     :2381   (Other):   0                                  
##       面積              屋齡           車位          管理     
##  Min.   :  3.312   Min.   : 0.00   有車位:1147   有管理:1943  
##  1st Qu.: 25.215   1st Qu.: 6.00   無車位:2105   無管理:1309  
##  Median : 34.305   Median :18.00                              
##  Mean   : 38.580   Mean   :17.79                              
##  3rd Qu.: 48.052   3rd Qu.:27.00                              
##  Max.   :232.756   Max.   :61.00                              
## 

我們的問題是: 縣市~型態+面積+屋齡+房價百萬

#五都順序為: 台北市 台中市 新北市 台南市 高雄市

#dat2a$縣市 <- factor(dat2a$縣市,levels=c("臺北市","臺中市","新北市","臺南市","高雄市"))
dat2a$房價百萬 <- dat2a$房價/10^6 
#head(dat2a)

fit2 <- rpart(縣市~型態+面積+屋齡+房價百萬,data=dat2a)
prp(fit2,col=2,box.col="lightgray",shadow.col="gray")

5.看預測正確率

result = rpart(縣市~ 型態+面積+屋齡+房價百萬, data=dat2a)
Y = dat2a$縣市
Ypred = predict(result, type="class")

t = table(Y, Ypred)   # 同時顯示 t 的內容
cat("預測正確率 = ", sum(diag(t))/sum(t), "\n" )
## 預測正確率 =  0.5522755

6.混淆矩陣(Confusion Matrix)

confmatrix = function(Y,Ypred)
{
  
  tab = table(Y,Ypredict=Ypred)  
  print(tab)
  p = sum(diag(t))/sum(t)*100
  cat("\n\n預測正確率 = ",p,"% \n")
}

confmatrix(dat2a$縣市, Ypred)
##         Ypredict
## Y        宜蘭縣 花蓮縣 金門縣 南投縣 屏東縣 苗栗縣 桃園縣 高雄市 基隆市
##   宜蘭縣      0      0      0      0      0      0      0      0      0
##   花蓮縣      0      0      0      0      0      0      0      0      0
##   金門縣      0      0      0      0      0      0      0      0      0
##   南投縣      0      0      0      0      0      0      0      0      0
##   屏東縣      0      0      0      0      0      0      0      0      0
##   苗栗縣      0      0      0      0      0      0      0      0      0
##   桃園縣      0      0      0      0      0      0      0      0      0
##   高雄市      0      0      0      0      0      0      0    127      0
##   基隆市      0      0      0      0      0      0      0      0      0
##   雲林縣      0      0      0      0      0      0      0      0      0
##   新北市      0      0      0      0      0      0      0     17      0
##   新竹市      0      0      0      0      0      0      0      0      0
##   新竹縣      0      0      0      0      0      0      0      0      0
##   嘉義市      0      0      0      0      0      0      0      0      0
##   嘉義縣      0      0      0      0      0      0      0      0      0
##   彰化縣      0      0      0      0      0      0      0      0      0
##   臺中市      0      0      0      0      0      0      0     88      0
##   臺北市      0      0      0      0      0      0      0      3      0
##   臺東縣      0      0      0      0      0      0      0      0      0
##   臺南市      0      0      0      0      0      0      0     93      0
##   澎湖縣      0      0      0      0      0      0      0      0      0
##         Ypredict
## Y        雲林縣 新北市 新竹市 新竹縣 嘉義市 嘉義縣 彰化縣 臺中市 臺北市
##   宜蘭縣      0      0      0      0      0      0      0      0      0
##   花蓮縣      0      0      0      0      0      0      0      0      0
##   金門縣      0      0      0      0      0      0      0      0      0
##   南投縣      0      0      0      0      0      0      0      0      0
##   屏東縣      0      0      0      0      0      0      0      0      0
##   苗栗縣      0      0      0      0      0      0      0      0      0
##   桃園縣      0      0      0      0      0      0      0      0      0
##   高雄市      0    143      0      0      0      0      0     29     40
##   基隆市      0      0      0      0      0      0      0      0      0
##   雲林縣      0      0      0      0      0      0      0      0      0
##   新北市      0    852      0      0      0      0      0     12    131
##   新竹市      0      0      0      0      0      0      0      0      0
##   新竹縣      0      0      0      0      0      0      0      0      0
##   嘉義市      0      0      0      0      0      0      0      0      0
##   嘉義縣      0      0      0      0      0      0      0      0      0
##   彰化縣      0      0      0      0      0      0      0      0      0
##   臺中市      0    178      0      0      0      0      0     68     26
##   臺北市      0    187      0      0      0      0      0      0    350
##   臺東縣      0      0      0      0      0      0      0      0      0
##   臺南市      0     29      0      0      0      0      0     48      0
##   澎湖縣      0      0      0      0      0      0      0      0      0
##         Ypredict
## Y        臺東縣 臺南市 澎湖縣
##   宜蘭縣      0      0      0
##   花蓮縣      0      0      0
##   金門縣      0      0      0
##   南投縣      0      0      0
##   屏東縣      0      0      0
##   苗栗縣      0      0      0
##   桃園縣      0      0      0
##   高雄市      0    263      0
##   基隆市      0      0      0
##   雲林縣      0      0      0
##   新北市      0     44      0
##   新竹市      0      0      0
##   新竹縣      0      0      0
##   嘉義市      0      0      0
##   嘉義縣      0      0      0
##   彰化縣      0      0      0
##   臺中市      0    114      0
##   臺北市      0     11      0
##   臺東縣      0      0      0
##   臺南市      0    399      0
##   澎湖縣      0      0      0
## 
## 
## 預測正確率 =  55.22755 %

[補充]Boxplot (五都)

par(mfrow=c(2,3)) #建立一個2*3的圖框

boxplot(房價~縣市,data=subset(dat2a,型態=="透天"),ylab="房價",main="透天")
boxplot(房價~縣市,data=subset(dat2a,型態=="套房"),ylab="房價",main="套房")
boxplot(房價~縣市,data=subset(dat2a,型態=="大樓"),ylab="房價",main="大樓")
boxplot(房價~縣市,data=subset(dat2a,型態=="公寓"),ylab="房價",main="公寓")
boxplot(房價~縣市,data=subset(dat2a,型態=="華廈"),ylab="房價",main="華廈")

dev.off()#把圖型清除
## null device 
##           1

[補充]各縣市在不同型態的房屋數量

data.frame(縣市=summarise(group_by(dat2, 縣市), 公寓=sum(型態=="公寓"))[,1],
           公寓=summarise(group_by(dat2, 縣市), 公寓=sum(型態=="公寓"))[,2],
           大樓=summarise(group_by(dat2, 縣市), 大樓=sum(型態=="大樓"))[,2],
           套房=summarise(group_by(dat2, 縣市), 大樓=sum(型態=="套房"))[,2],
           華廈=summarise(group_by(dat2, 縣市), 大樓=sum(型態=="華廈"))[,2],
           透天=summarise(group_by(dat2, 縣市), 大樓=sum(型態=="透天"))[,2])
##      縣市 公寓 大樓 大樓.1 大樓.2 大樓.3
## 1  宜蘭縣   11    8     16     34     35
## 2  花蓮縣   12    5      5     28     55
## 3  金門縣    0    0      0      0      1
## 4  南投縣    2    3      1      5     29
## 5  屏東縣    9    4      5     12     77
## 6  苗栗縣    9    8      0     49     43
## 7  桃園縣   73  596     29    181     99
## 8  高雄市   57  293     14     67    171
## 9  基隆市   84   33     10     27      7
## 10 雲林縣    0    4      0     12     46
## 11 新北市  288  493     75    166     34
## 12 新竹市   12   18      4     21      4
## 13 新竹縣    4  109      0     38     35
## 14 嘉義市    9   33      5     24     47
## 15 嘉義縣    3    1      0      2     22
## 16 彰化縣    8    5      1     15     64
## 17 臺中市   41  216     51     79     87
## 18 臺北市  146  234     47    114     10
## 19 臺東縣    3    0      1      3     20
## 20 臺南市   43  104     16    108    298
## 21 澎湖縣    0    0      0      0      1