Table1

Tiếp tục bài viết về Mean lần trước mình có giới thiệu đến các bạn về chỉ số thống kê trung bình (mean), trung vị (median) của một tập dữ liệu trong phân tích thông kê mô tả. Nhắc đến thống kê mô tả (descriptive analysis) là nói đến việc mô tả dữ liệu thông qua các phép tính và chỉ số thống kê thông thường mà chúng ta đã làm quen trên giảng đường đại học, đây là bước cơ bản và quan trọng trong phân tích sau khi dữ liệu đã được làm sạch, giúp chúng ta có góc nhìn tổng thể về dữ liệu: phân bố, so sánh giữa các nhóm, bước đầu tiên cho các phân tích phức tạp và mô hình hóa dữ liệu về sau.

Trong bài viết này mình chỉ đề cập nhiều đến 2 chỉ số này, tuy nhiên ngoài các chỉ số này trong Statistics còn rất nhiều chỉ số khác rất cần thiết để tìm hiểu như phương sai (variance), độ lệch chuẩn (standard deviation), sai số chuẩn (standard error - SE), hệ số biến thiên (coefficient of variantion - CV), … việc ứng dụng các chỉ số trong thực tế phân tích cũng như đối với loại dữ liệu nào, phân bố dữ liệu ra sao thì nên dùng chỉ số gì để trình bày cũng là nội dung khá quan trọng.

Bài viết này mình tập trung giới thiệu đến các bạn về cách sử dụng package “table1”, “explore” trong R để phân tích mô tả về một tập dữ liệu, bản thân mình cảm nhận ngay từ lần đầu tiên sử dụng table1 hay explore cảm thấy rất tiện dụng, triển khai nhanh chóng trong việc phân tích mô tả dữ liệu, tuy nhiên riêng table1 cũng có các hạn chế như dữ liệu được phân chia thành nhiều nhóm khi đó bảng dữ liệu sẽ rất nhiều số liệu và vì vậy việc xem và đánh giá dữ liệu sẽ không được thuận tiện.

Nếu chưa cài đặt package có thể tham khảo về cách cài đặt và cách sử dụng chi tiết tại trang Github của tác giả. Hoặc tham khảo qua website: https://cran.r-project.org/web/packages/table1/vignettes/table1-examples.html. Nếu đang dùng RStudio có thể nhập trực tiếp tại màn hình console: install.packages(“table1”) là R có thể tự động cài đặt. Bản version mới nhất hiện tại 1.4.2.

Function chính của Table1: table1(~ var1 + var2 + var3 + … | group, data=…)

Để mô phỏng cách thực hiện, chúng ta dùng tập dữ liệu Resale Flat Prices in Singapore (Singapore Flat Prices based on approval date from 1990 - 1999) trên Kaggle để thực hiện nhé. Nguồn dữ liệu gốc lấy từ Singapore Housing and Development Board, December 8, 2016 (Singapore Open Data Licence)

Đầu tiên chúng ta cần import dữ liệu và khai báo thư viện table1. Chúng ta thực hiện đoạn code sau trên RStudio/ R và kết quả sau khi thực hiện câu lệnh head(df) tóm tắt nhanh 6 dòng đầu của tập dữ liệu chúng ta gồm có:

library(table1)
library(dplyr)

df <- read.csv("D:/R/Database/flat-prices.csv", header = TRUE, na.strings = '.')
head(df)
##     month       town flat_type block      street_name storey_range
## 1 1990-01 ANG MO KIO    1 ROOM   309 ANG MO KIO AVE 1     10 TO 12
## 2 1990-01 ANG MO KIO    1 ROOM   309 ANG MO KIO AVE 1     04 TO 06
## 3 1990-01 ANG MO KIO    1 ROOM   309 ANG MO KIO AVE 1     10 TO 12
## 4 1990-01 ANG MO KIO    1 ROOM   309 ANG MO KIO AVE 1     07 TO 09
## 5 1990-01 ANG MO KIO    3 ROOM   216 ANG MO KIO AVE 1     04 TO 06
## 6 1990-01 ANG MO KIO    3 ROOM   211 ANG MO KIO AVE 3     01 TO 03
##   floor_area_sqm     flat_model lease_commence_date resale_price
## 1             31       IMPROVED                1977         9000
## 2             31       IMPROVED                1977         6000
## 3             31       IMPROVED                1977         8000
## 4             31       IMPROVED                1977         6000
## 5             73 NEW GENERATION                1976        47200
## 6             67 NEW GENERATION                1977        46000

Kiểm tra missing value (NA) trong tập dữ liệu

sum(is.na(df))
## [1] 0
cbind(lapply(
  lapply(df, is.na),sum
  )
)
##                     [,1]
## month               0   
## town                0   
## flat_type           0   
## block               0   
## street_name         0   
## storey_range        0   
## floor_area_sqm      0   
## flat_model          0   
## lease_commence_date 0   
## resale_price        0

Không phát hiện giá trị NA.

Tiếp theo mình sử dụng hàm table1 để thực hiện tính toán các chỉ số thống kê mô tả cơ bản. Chúng ta thực hiện lệnh như sau:

table1(~ flat_type 
       + floor_area_sqm 
       + resale_price, 
       data= df)
Overall
(N=287196)
flat_type
1 ROOM 827 (0.3%)
2 ROOM 4140 (1.4%)
3 ROOM 113102 (39.4%)
4 ROOM 98521 (34.3%)
5 ROOM 48206 (16.8%)
EXECUTIVE 22121 (7.7%)
MULTI GENERATION 279 (0.1%)
floor_area_sqm
Mean (SD) 93.4 (27.4)
Median [Min, Max] 91.0 [28.0, 307]
resale_price
Mean (SD) 220000 (128000)
Median [Min, Max] 195000 [5000, 900000]

Nhìn bảng trên ta sẽ thấy được biến flat_type là dạng biến phân nhóm (categorical variable), table1 tự động tính được có bao nhiêu loại 1 ROOM, 2 ROOM, … trong tổng số N=287196 và tự động tính tỷ lệ (proportion) tương ứng.

Đối với biến resale_price (tạm dịch là giá giao dịch mua đi bán lại giữa người mua và người bán) là biến liên tục, table1 cung cấp cho chúng ta giá trung bình (Mean) trong tập dữ liệu là 220,000 SGD. Chỉ số trong ngoặc tròn “(SD)” chính là độ lệch chuẩn và độ lệch chuẩn đối với resale_price trong tập dữ liệu là 128,000 SGD. Table1 còn cung cấp cho chúng ta chỉ số trung vị (Median) đối với giá mua đi bán lại trong tập dữ liệu là 195,000 SGD và 2 giá trị [Min, Max] lần lượt là 5000 SGD và 900,000 SGD.

Bây giờ chúng ta muốn xem xét giá trung bình giao dịch mua đi bán lại của các bất động sản tại một số khu đô thị lớn tại Singapore và diện tích trung bình tươngcủa các bất động sản theo các khu đô thị này. Đầu tiên ta xem thử trong tập dữ liệu có nhiêu khu đô thị (town)

table(df$town)
## 
##      ANG MO KIO           BEDOK          BISHAN     BUKIT BATOK     BUKIT MERAH 
##           20477           27164            8332           16365           10610 
##   BUKIT PANJANG     BUKIT TIMAH    CENTRAL AREA   CHOA CHU KANG        CLEMENTI 
##            5615             938            2492            8655           11337 
##         GEYLANG         HOUGANG     JURONG EAST     JURONG WEST KALLANG/WHAMPOA 
##           10476           15921            9049           19203            8712 
##    LIM CHU KANG   MARINE PARADE       PASIR RIS      QUEENSTOWN       SEMBAWANG 
##              64            3332           10911            9774              24 
##        SENGKANG       SERANGOON        TAMPINES       TOA PAYOH       WOODLANDS 
##             125            8527           30682           10942            9680 
##          YISHUN 
##           27789

Ví dụ ta quan tâm và muốn tính giá trung bình của các bất động sản tại 4 khu vực đô thị như Central Area, Jurong West, Pasir Ris và Woodlands. Chúng ta có thể thực hiện như sau. Đầu tiên mình sẽ tạo một dataset mới có tên “df_t” dựa trên dataset “df”. Kết quả R tạo ra một dataset mới df_t và check lại qua hàm table(df_t$town) và kết quả ta được như sau

library(dplyr)

df_t <- df %>% 
  filter(town %in% 
           c("CENTRAL AREA", 
             "JURONG WEST", 
             "PASIR RIS", 
             "WOODLANDS"))

table(df_t$town)
## 
## CENTRAL AREA  JURONG WEST    PASIR RIS    WOODLANDS 
##         2492        19203        10911         9680

Dựa trên dataset mới df_t ta dùng table1 để tìm ra giá giao dịch trung bình (resale_price) và diện tích trung bình theo 4 khu đô thị vừa kể trên.

table1(~ floor_area_sqm 
       + resale_price 
       + flat_model 
       + flat_type | town, 
       data=df_t, 
       topclass="Rtable1-zebra", 
       overall="Total")
CENTRAL AREA
(N=2492)
JURONG WEST
(N=19203)
PASIR RIS
(N=10911)
WOODLANDS
(N=9680)
Total
(N=42286)
floor_area_sqm
Mean (SD) 67.5 (19.2) 97.6 (27.4) 125 (17.9) 100 (31.7) 103 (29.8)
Median [Min, Max] 65.0 [38.0, 141] 103 [57.0, 159] 123 [55.0, 190] 91.0 [45.0, 221] 104 [38.0, 221]
resale_price
Mean (SD) 154000 (92900) 199000 (109000) 373000 (100000) 211000 (117000) 244000 (133000)
Median [Min, Max] 145000 [18500, 581000] 193000 [16800, 615000] 363000 [79700, 715000] 188000 [20400, 700000] 235000 [16800, 715000]
flat_model
IMPROVED 1372 (55.1%) 6639 (34.6%) 2939 (26.9%) 2182 (22.5%) 13132 (31.1%)
MODEL A 368 (14.8%) 8197 (42.7%) 4459 (40.9%) 2158 (22.3%) 15182 (35.9%)
NEW GENERATION 182 (7.3%) 1793 (9.3%) 45 (0.4%) 3093 (32.0%) 5113 (12.1%)
STANDARD 570 (22.9%) 299 (1.6%) 0 (0%) 330 (3.4%) 1199 (2.8%)
APARTMENT 0 (0%) 513 (2.7%) 2607 (23.9%) 908 (9.4%) 4028 (9.5%)
MAISONETTE 0 (0%) 1097 (5.7%) 746 (6.8%) 154 (1.6%) 1997 (4.7%)
MODEL A-MAISONETTE 0 (0%) 193 (1.0%) 0 (0%) 0 (0%) 193 (0.5%)
SIMPLIFIED 0 (0%) 472 (2.5%) 109 (1.0%) 855 (8.8%) 1436 (3.4%)
2-ROOM 0 (0%) 0 (0%) 6 (0.1%) 0 (0%) 6 (0.0%)
flat_type
2 ROOM 502 (20.1%) 3 (0.0%) 6 (0.1%) 4 (0.0%) 515 (1.2%)
3 ROOM 1394 (55.9%) 7263 (37.8%) 0 (0%) 3269 (33.8%) 11926 (28.2%)
4 ROOM 558 (22.4%) 6819 (35.5%) 4202 (38.5%) 3573 (36.9%) 15152 (35.8%)
5 ROOM 38 (1.5%) 3508 (18.3%) 3350 (30.7%) 1772 (18.3%) 8668 (20.5%)
EXECUTIVE 0 (0%) 1610 (8.4%) 3353 (30.7%) 1062 (11.0%) 6025 (14.2%)

Phân chia nhóm theo flat_type (2 ROOM, 3 ROOM, 4 ROOM, …)

table1(~ floor_area_sqm 
       + resale_price 
       + flat_model 
       + town 
       + storey_range | flat_type, 
       data=df_t, 
       topclass="Rtable1-zebra", 
       overall="Total")
2 ROOM
(N=515)
3 ROOM
(N=11926)
4 ROOM
(N=15152)
5 ROOM
(N=8668)
EXECUTIVE
(N=6025)
Total
(N=42286)
floor_area_sqm
Mean (SD) 44.7 (6.48) 68.3 (5.82) 101 (8.31) 126 (6.02) 152 (10.6) 103 (29.8)
Median [Min, Max] 43.0 [38.0, 63.0] 67.0 [50.0, 137] 104 [75.0, 125] 124 [109, 152] 148 [138, 221] 104 [38.0, 221]
resale_price
Mean (SD) 65300 (32000) 109000 (50900) 230000 (67700) 323000 (78300) 447000 (90800) 244000 (133000)
Median [Min, Max] 63000 [16800, 151000] 110000 [20400, 292000] 235000 [35000, 460000] 333000 [60000, 581000] 449000 [110000, 715000] 235000 [16800, 715000]
flat_model
2-ROOM 6 (1.2%) 0 (0%) 0 (0%) 0 (0%) 0 (0%) 6 (0.0%)
IMPROVED 131 (25.4%) 6039 (50.6%) 964 (6.4%) 5998 (69.2%) 0 (0%) 13132 (31.1%)
STANDARD 378 (73.4%) 175 (1.5%) 17 (0.1%) 629 (7.3%) 0 (0%) 1199 (2.8%)
MODEL A 0 (0%) 2779 (23.3%) 10555 (69.7%) 1848 (21.3%) 0 (0%) 15182 (35.9%)
NEW GENERATION 0 (0%) 2701 (22.6%) 2412 (15.9%) 0 (0%) 0 (0%) 5113 (12.1%)
SIMPLIFIED 0 (0%) 232 (1.9%) 1204 (7.9%) 0 (0%) 0 (0%) 1436 (3.4%)
MODEL A-MAISONETTE 0 (0%) 0 (0%) 0 (0%) 193 (2.2%) 0 (0%) 193 (0.5%)
APARTMENT 0 (0%) 0 (0%) 0 (0%) 0 (0%) 4028 (66.9%) 4028 (9.5%)
MAISONETTE 0 (0%) 0 (0%) 0 (0%) 0 (0%) 1997 (33.1%) 1997 (4.7%)
town
CENTRAL AREA 502 (97.5%) 1394 (11.7%) 558 (3.7%) 38 (0.4%) 0 (0%) 2492 (5.9%)
JURONG WEST 3 (0.6%) 7263 (60.9%) 6819 (45.0%) 3508 (40.5%) 1610 (26.7%) 19203 (45.4%)
PASIR RIS 6 (1.2%) 0 (0%) 4202 (27.7%) 3350 (38.6%) 3353 (55.7%) 10911 (25.8%)
WOODLANDS 4 (0.8%) 3269 (27.4%) 3573 (23.6%) 1772 (20.4%) 1062 (17.6%) 9680 (22.9%)
storey_range
01 TO 03 63 (12.2%) 2208 (18.5%) 3409 (22.5%) 1801 (20.8%) 1435 (23.8%) 8916 (21.1%)
04 TO 06 136 (26.4%) 2891 (24.2%) 4217 (27.8%) 2195 (25.3%) 1749 (29.0%) 11188 (26.5%)
07 TO 09 184 (35.7%) 2758 (23.1%) 3604 (23.8%) 2124 (24.5%) 1353 (22.5%) 10023 (23.7%)
10 TO 12 70 (13.6%) 2319 (19.4%) 3056 (20.2%) 1664 (19.2%) 1197 (19.9%) 8306 (19.6%)
13 TO 15 47 (9.1%) 804 (6.7%) 636 (4.2%) 482 (5.6%) 274 (4.5%) 2243 (5.3%)
16 TO 18 15 (2.9%) 501 (4.2%) 111 (0.7%) 135 (1.6%) 17 (0.3%) 779 (1.8%)
19 TO 21 0 (0%) 344 (2.9%) 64 (0.4%) 117 (1.3%) 0 (0%) 525 (1.2%)
22 TO 24 0 (0%) 101 (0.8%) 31 (0.2%) 101 (1.2%) 0 (0%) 233 (0.6%)
25 TO 27 0 (0%) 0 (0%) 24 (0.2%) 49 (0.6%) 0 (0%) 73 (0.2%)

Phân chia nhóm theo flat_model (MODEL A, MAISONETTE, STANDARD, …)

table1(~ floor_area_sqm 
       + resale_price 
       + flat_type 
       + town 
       + storey_range | flat_model, 
       data=df_t, 
       topclass="Rtable1-zebra", 
       overall="Total")
2-ROOM
(N=6)
APARTMENT
(N=4028)
IMPROVED
(N=13132)
MAISONETTE
(N=1997)
MODEL A
(N=15182)
MODEL A-MAISONETTE
(N=193)
NEW GENERATION
(N=5113)
SIMPLIFIED
(N=1436)
STANDARD
(N=1199)
Total
(N=42286)
floor_area_sqm
Mean (SD) 55.5 (1.22) 153 (12.5) 93.4 (28.5) 149 (4.14) 103 (17.0) 139 (1.88) 80.9 (12.6) 81.4 (7.77) 85.8 (37.1) 103 (29.8)
Median [Min, Max] 55.0 [55.0, 58.0] 148 [138, 221] 87.0 [45.0, 137] 149 [143, 190] 104 [72.0, 141] 139 [137, 152] 82.0 [67.0, 114] 84.0 [64.0, 92.0] 109 [38.0, 128] 104 [38.0, 221]
resale_price
Mean (SD) 128000 (12500) 463000 (65100) 208000 (131000) 415000 (122000) 238000 (81100) 303000 (99700) 150000 (66900) 176000 (51300) 157000 (102000) 244000 (133000)
Median [Min, Max] 126000 [115000, 151000] 455000 [160000, 715000] 174000 [16800, 572000] 420000 [110000, 700000] 243000 [37300, 581000] 320000 [90700, 520000] 150000 [27300, 398000] 179000 [30000, 310000] 126000 [18500, 440000] 235000 [16800, 715000]
flat_type
2 ROOM 6 (100%) 0 (0%) 131 (1.0%) 0 (0%) 0 (0%) 0 (0%) 0 (0%) 0 (0%) 378 (31.5%) 515 (1.2%)
EXECUTIVE 0 (0%) 4028 (100%) 0 (0%) 1997 (100%) 0 (0%) 0 (0%) 0 (0%) 0 (0%) 0 (0%) 6025 (14.2%)
3 ROOM 0 (0%) 0 (0%) 6039 (46.0%) 0 (0%) 2779 (18.3%) 0 (0%) 2701 (52.8%) 232 (16.2%) 175 (14.6%) 11926 (28.2%)
4 ROOM 0 (0%) 0 (0%) 964 (7.3%) 0 (0%) 10555 (69.5%) 0 (0%) 2412 (47.2%) 1204 (83.8%) 17 (1.4%) 15152 (35.8%)
5 ROOM 0 (0%) 0 (0%) 5998 (45.7%) 0 (0%) 1848 (12.2%) 193 (100%) 0 (0%) 0 (0%) 629 (52.5%) 8668 (20.5%)
town
PASIR RIS 6 (100%) 2607 (64.7%) 2939 (22.4%) 746 (37.4%) 4459 (29.4%) 0 (0%) 45 (0.9%) 109 (7.6%) 0 (0%) 10911 (25.8%)
JURONG WEST 0 (0%) 513 (12.7%) 6639 (50.6%) 1097 (54.9%) 8197 (54.0%) 193 (100%) 1793 (35.1%) 472 (32.9%) 299 (24.9%) 19203 (45.4%)
WOODLANDS 0 (0%) 908 (22.5%) 2182 (16.6%) 154 (7.7%) 2158 (14.2%) 0 (0%) 3093 (60.5%) 855 (59.5%) 330 (27.5%) 9680 (22.9%)
CENTRAL AREA 0 (0%) 0 (0%) 1372 (10.4%) 0 (0%) 368 (2.4%) 0 (0%) 182 (3.6%) 0 (0%) 570 (47.5%) 2492 (5.9%)
storey_range
01 TO 03 6 (100%) 822 (20.4%) 2286 (17.4%) 613 (30.7%) 3512 (23.1%) 40 (20.7%) 1020 (19.9%) 414 (28.8%) 203 (16.9%) 8916 (21.1%)
04 TO 06 0 (0%) 1139 (28.3%) 3056 (23.3%) 610 (30.5%) 4283 (28.2%) 76 (39.4%) 1345 (26.3%) 446 (31.1%) 233 (19.4%) 11188 (26.5%)
07 TO 09 0 (0%) 1038 (25.8%) 3068 (23.4%) 315 (15.8%) 3697 (24.4%) 56 (29.0%) 1249 (24.4%) 319 (22.2%) 281 (23.4%) 10023 (23.7%)
10 TO 12 0 (0%) 787 (19.5%) 2459 (18.7%) 410 (20.5%) 3052 (20.1%) 21 (10.9%) 1165 (22.8%) 250 (17.4%) 162 (13.5%) 8306 (19.6%)
13 TO 15 0 (0%) 225 (5.6%) 986 (7.5%) 49 (2.5%) 531 (3.5%) 0 (0%) 303 (5.9%) 7 (0.5%) 142 (11.8%) 2243 (5.3%)
16 TO 18 0 (0%) 17 (0.4%) 620 (4.7%) 0 (0%) 49 (0.3%) 0 (0%) 25 (0.5%) 0 (0%) 68 (5.7%) 779 (1.8%)
19 TO 21 0 (0%) 0 (0%) 437 (3.3%) 0 (0%) 18 (0.1%) 0 (0%) 5 (0.1%) 0 (0%) 65 (5.4%) 525 (1.2%)
22 TO 24 0 (0%) 0 (0%) 179 (1.4%) 0 (0%) 22 (0.1%) 0 (0%) 1 (0.0%) 0 (0%) 31 (2.6%) 233 (0.6%)
25 TO 27 0 (0%) 0 (0%) 41 (0.3%) 0 (0%) 18 (0.1%) 0 (0%) 0 (0%) 0 (0%) 14 (1.2%) 73 (0.2%)

Explore

Tiếp theo chúng ta muốn trực quan hóa phân bố của giá giao dịch (resale_price) đối với 4 khu đô thị lớn nêu trên ta có thể dùng thông qua thư viện “explore” (Simplifies Exploratory Data Analysis) và thư viện khá quen thuộc với những ai sử dụng R mang tên “tidyverse” (R packages for data science - https://www.tidyverse.org/)


Để cài đặt và sử dụng explore các bạn có thể xem qua trang Github hoặc cran.r-project.org của tác giả Roland Krasser. Tidyverse của giáo sư Hadley Wickham (Chief Scientist at [@rstudio](https://github.com/rstudio)) qua trang https://www.tidyverse.org/ hoặc Github.


Đầu tiên chúng ta import các thư viện

library(explore)
library(tidyverse)

Tiếp theo có thể bớt các con số 0 phía sau giá bán để làm gọn, đơn vị tính lúc này 1000 SGD (việc này để khi thực hiện explore mình không muốn xuất hiện dạng ký tự trong biểu đồ dưới dạng hàm số mũ E)

attach(df_t)
df_t <- mutate(df_t, 
               resale_price=(resale_price/1000) %>% 
                 round(0))
head(df_t)
##     month         town flat_type block  street_name storey_range floor_area_sqm
## 1 1990-01 CENTRAL AREA    2 ROOM     8    JLN KUKOH     10 TO 12             53
## 2 1990-01 CENTRAL AREA    2 ROOM    22    OUTRAM PK     04 TO 06             43
## 3 1990-01 CENTRAL AREA    2 ROOM    12     SHORT ST     04 TO 06             38
## 4 1990-01 CENTRAL AREA    2 ROOM    13     SHORT ST     04 TO 06             38
## 5 1990-01 CENTRAL AREA    2 ROOM     8   SELEGIE RD     01 TO 03             41
## 6 1990-01 CENTRAL AREA    3 ROOM   538 UPP CROSS ST     16 TO 18             60
##   flat_model lease_commence_date resale_price
## 1   IMPROVED                1971           30
## 2   STANDARD                1983           28
## 3   STANDARD                1974           22
## 4   STANDARD                1974           23
## 5   STANDARD                1974           19
## 6   IMPROVED                1978           60

Bến dưới là kết quả biểu đồ tần suất phân bố của dữ liệu giá giao dịch của 4 khu đô thị lớn Central Area, Jurong West, Pasir Ris và Woodlands, đường biểu diễn density càng lên cao thì mức độ tập trung dữ liệu càng lớn.

df_t %>% explore(resale_price)

Mình muốn xem tần suất phân bố giá giao dịch với từng khu đô thị lớn có thể thực hiện như sau

df_t %>% explore(resale_price, 
                 target = town)

Tần suất phân bố giá giao dịch với từng dạng bất động sản có 2 ROOM, 3 ROOM, … (flat_type)

df_t %>% explore(resale_price, 
                 target = flat_type)

Tần suất phân bố giá giao dịch với từng loại hình bất động sản MODEL A, MAISONETTE, STANDARD, … (flat_model)

df_t %>% explore(resale_price, 
                 target = flat_model)

Chúng ta có thể tìm hiểu so sánh giá giao dịch giữa các khu đô thị lớn. Explore sẽ cung cấp cho chúng ta biểu đồ dạng boxplot.

df_t %>% explore(resale_price,
                 town)

Thêm tiêu đề và tô màu biểu đồ phân biệt giữa các khu đô thị.

df_t %>% explore(resale_price,
                 town, 
                 title = 'Resale Price vs Town', 
                 auto_scale = TRUE,
                 color=c("red", "green", "gray", "pink")
                 )

Nhìn chung Pasir Ris (gần sân bay Changi) có mức giá giao dịch (qua chỉ số median) là cao hơn so với các khu vực còn lại, kể cả khu Central Area. Tuy nhiên để xem xét kỹ, ta nên quy về mức giá trên m2 có nghĩa là ta tạo ra biến mới và lấy resale_price/ floor_area_sqm và xem xét theo loại căn hộ (flat_type) và thử kết hợp giữa table1 và explore nhé.

Lưu ý lúc này đơn vị của resale_price là 1000 SGD, còn resale_price_sqm là SGD.

df_t <- mutate(df_t, 
               resale_price_sqm=((resale_price*1000)/floor_area_sqm) 
               %>% round(0))
head(df_t)
##     month         town flat_type block  street_name storey_range floor_area_sqm
## 1 1990-01 CENTRAL AREA    2 ROOM     8    JLN KUKOH     10 TO 12             53
## 2 1990-01 CENTRAL AREA    2 ROOM    22    OUTRAM PK     04 TO 06             43
## 3 1990-01 CENTRAL AREA    2 ROOM    12     SHORT ST     04 TO 06             38
## 4 1990-01 CENTRAL AREA    2 ROOM    13     SHORT ST     04 TO 06             38
## 5 1990-01 CENTRAL AREA    2 ROOM     8   SELEGIE RD     01 TO 03             41
## 6 1990-01 CENTRAL AREA    3 ROOM   538 UPP CROSS ST     16 TO 18             60
##   flat_model lease_commence_date resale_price resale_price_sqm
## 1   IMPROVED                1971           30              566
## 2   STANDARD                1983           28              651
## 3   STANDARD                1974           22              579
## 4   STANDARD                1974           23              605
## 5   STANDARD                1974           19              463
## 6   IMPROVED                1978           60             1000
table1(~ resale_price_sqm + 
         flat_type | town, 
        data = df_t, 
       topclass="Rtable1-zebra", 
       overall="Total")
CENTRAL AREA
(N=2492)
JURONG WEST
(N=19203)
PASIR RIS
(N=10911)
WOODLANDS
(N=9680)
Total
(N=42286)
resale_price_sqm
Mean (SD) 2190 (1010) 1930 (725) 2960 (509) 2000 (690) 2230 (815)
Median [Min, Max] 2240 [411, 5540] 2070 [298, 4160] 2920 [753, 5040] 2150 [308, 4160] 2310 [298, 5540]
flat_type
2 ROOM 502 (20.1%) 3 (0.0%) 6 (0.1%) 4 (0.0%) 515 (1.2%)
3 ROOM 1394 (55.9%) 7263 (37.8%) 0 (0%) 3269 (33.8%) 11926 (28.2%)
4 ROOM 558 (22.4%) 6819 (35.5%) 4202 (38.5%) 3573 (36.9%) 15152 (35.8%)
5 ROOM 38 (1.5%) 3508 (18.3%) 3350 (30.7%) 1772 (18.3%) 8668 (20.5%)
EXECUTIVE 0 (0%) 1610 (8.4%) 3353 (30.7%) 1062 (11.0%) 6025 (14.2%)
df_t %>% explore(resale_price_sqm, 
                 target = town)

df_t %>% explore(resale_price_sqm,
                 town, 
                 title = 'Resale Price Sqm vs Town', 
                 auto_scale = TRUE,
                 color=c("red", "green", "gray", "pink")
                 )

Từ bảng số liệu table1 và biểu đồ ta vừa thực hiện, ta có thể thấy giá giao dịch 1m2 tại Pasir Ris (median = 2920 SGD/m2) vẫn cao hơn so với Central Area (median = 2240 SGD/m2), tuy nhiên tổng số liệu quan sát tại khu Central Area (N=2492) (so với Pasir Ris có N=10911) điều này đặt dấu chấm hỏi về tính đại diện của dữ liệu Central Area và số liệu quan sát 2 biến chênh lệch khá lớn và 1 lý do khác ta có thể thấy qua dữ liệu quan sát cơ cấu loại bất động sản của Pasir Ris tập trung vào nhóm 4, 5 ROOM và Executive, trong khi Central Area tập trung vào loại 2,3,4 ROOM.

Nếu có thời gian chúng ta sẽ tìm hiểu, phân tích thật kỹ và đặt ra các giả thiết cần phân tích và tìm ra câu trả lời. Giới hạn bài này mình chỉ giới thiệu kỹ thuật phân tích table1 và explore là chính.