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%) |
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.