Bối cảnh và vấn đề nghiên cứu
Thị trường bất động sản đóng vai trò quan trọng trong sự phát triển kinh tế tại Việt Nam với tốc độ tăng trưởng nhanh nhằm đáp ứng nhu cầu nhà ở và đầu tư. Để đưa ra quyết định kinh doanh và tư vấn chính xác, các nhà môi giới cũng như doanh nghiệp bất động sản cần thu thập và phân tích khối lượng lớn thông tin về biến động giá cả, phân khúc thị trường và đặc điểm khu vực. Tuy nhiên, dữ liệu bất động sản hiện nay phân tán trên nhiều website khác nhau với cấu trúc không đồng nhất, gây khó khăn cho việc tổng hợp thủ công.
Khóa luận tốt nghiệp "Development of a Web application to monitor statistical data of real estate properties" (Phát triển ứng dụng web theo dõi dữ liệu thống kê bất động sản) của tác giả Phạm Minh Tuấn, dưới sự hướng dẫn của PGS. Quản Thành Thơ tại Trường Đại học Bách Khoa – ĐHQG TP.HCM, tập trung giải quyết bài toán tự động hóa quy trình thu thập dữ liệu bất động sản phân tán, chuẩn hóa lưu trữ, trực quan hóa thống kê và xây dựng mô hình dự báo giá nhà đất.
Theo văn bản nhiệm vụ luận án, các mục tiêu và nhiệm vụ nghiên cứu cụ thể bao gồm:
- Nghiên cứu công nghệ Front-end và Back-end để xây dựng ứng dụng web: ReactJS, Django web framework, hệ quản trị cơ sở dữ liệu PostgreSQL và kiến trúc REST API.
- Khảo sát các công nghệ thu thập dữ liệu bất động sản từ website: Scrapy framework và thư viện Python BeautifulSoup.
- Nghiên cứu công cụ Selenium WebDriver để thu thập dữ liệu trên các website có cơ chế chống cào dữ liệu (anti-crawling / anti-bot).
- Nghiên cứu và xây dựng mô hình dự báo giá bất động sản bằng phương pháp Hồi quy tuyến tính (Linear Regression) dựa trên dữ liệu thu thập được.
- Thiết lập quy trình tự động cào dữ liệu định kỳ hàng ngày và cập nhật dữ liệu mới vào hệ thống cơ sở dữ liệu.
- Nghiên cứu các thư viện Python chuyên dụng để triển khai và huấn luyện mô hình học máy trên tập dữ liệu đã làm sạch.
Đối tượng và phạm vi nghiên cứu:
- Đối tượng nghiên cứu: Các bài đăng bán bất động sản trực tuyến (loại hình bất động sản bán - selling real estate properties).
- Phạm vi không gian: Dữ liệu bất động sản thuộc địa bàn Thành phố Hồ Chí Minh (bao gồm các khu vực cụ thể như Củ Chi, Bình Thạnh...).
- Nguồn dữ liệu mục tiêu: Các trang tin bất động sản phổ biến tại Việt Nam, tiêu biểu là
batdongsan.com và propzy.
- Phạm vi ứng dụng: Hệ thống web được thiết kế chạy trên môi trường cục bộ (local environment), phục vụ nhóm người dùng thử nghiệm quy mô nhỏ (dưới 10 người dùng).
Cơ sở lý thuyết và phương pháp
Khóa luận áp dụng phương pháp nghiên cứu kỹ thuật thực nghiệm và xây dựng hệ thống phần mềm hoàn chỉnh, kết hợp giữa kỹ thuật thu thập dữ liệu lớn, xử lý tiền kỳ và học máy có giám sát (Supervised Machine Learning).
1. Khung lý thuyết và mô hình tính toán
- Kỹ thuật thu thập dữ liệu động (Web Scraping & Headless Browsing): Phân tích luồng dữ liệu của Scrapy kết hợp với Selenium WebDriver và công cụ chuyển đổi mã
js2xml để bóc tách dữ liệu tọa độ địa lý (latitude, longitude) ẩn trong mã nguồn JavaScript của thẻ <script>.
- Mô hình Hồi quy tuyến tính (Linear Regression): Sử dụng mô hình tuyến tính đơn biến (Simple Linear Regression) và đa biến (Multiple Linear Regression) nhằm thiết lập mối quan hệ hàm số giữa biến phụ thuộc (giá bất động sản $y$) và các biến độc lập (diện tích, đường, phường, quận $x_i$).
- Mở rộng đa thức (Polynomial Features): Chuyển đổi không gian đặc trưng một chiều thành đa chiều bậc cao nhằm ánh xạ mối quan hệ phi tuyến tính trong tập dữ liệu.
- Kỹ thuật điều chuẩn (Regularization):
- Ridge Regression (L2 Regularization): Bổ sung trọng số phạt bình phương hệ số $\alpha \sum \theta^2$ nhằm co các trọng số về gần 0, hạn chế hiện tượng quá khớp (overfitting).
- Lasso Regression (L1 Regularization): Áp dụng thành phần phạt giá trị tuyệt đối $\alpha \sum |\theta|$ giúp triệt tiêu các hệ số không quan trọng về đúng bằng 0, đóng vai trò chọn lọc đặc trưng.
2. Phương pháp đánh giá mô hình
- Độ đo đánh giá sai số: Sử dụng sai số toàn phương trung bình (Mean Squared Error - MSE) và căn bậc hai sai số toàn phương trung bình (Root Mean Squared Error - RMSE) để đo lường độ lệch giữa giá trị thực tế và giá trị dự báo.
- Hệ số xác định ($R^2$ Score / Coefficient of Determination): Đo lường tỷ lệ biến thiên của biến phụ thuộc được giải thích bởi các biến độc lập trong mô hình.
- Kiểm định chéo k-lần (K-Fold Cross-Validation): Áp dụng kỹ thuật chia tập dữ liệu thành 5 phần (5-folds cross-validation) luân phiên giữa tập huấn luyện và tập kiểm định để kiểm soát hiện tượng High Bias (Underfitting) và High Variance (Overfitting).
3. Phương pháp kỹ thuật đặc trưng và tiền xử lý dữ liệu (Feature Engineering)
- Xử lý dữ liệu khuyết thiếu (Missing Data): Kết hợp loại bỏ các bản ghi không hợp lệ hoặc gán giá trị trung bình (Imputation) cho các thuộc tính số nhằm bảo toàn kích thước tập mẫu.
- Khử trùng lặp (Handling Duplicated Data): Lọc bỏ các bài đăng trùng lặp trên cùng website hoặc giữa các nguồn khác nhau.
- Phát hiện và loại bỏ ngoại lai (Outliers Removal): Sử dụng biểu đồ hộp (Boxplot) dựa trên 5 chỉ số phân phối (Q1, Q3, Min, Max, Median) và phân chia dữ liệu theo từng phân vùng để loại bỏ các điểm dữ liệu bất thường.
- Biến đổi Logarit (Log Transformation): Chuẩn hóa phân phối lệch của biến mục tiêu và biến diện tích về dạng phân phối chuẩn để tối ưu hóa hiệu quả huấn luyện của mô hình hồi quy.
Thiết kế và triển khai hệ thống
Hệ thống được thiết kế theo kiến trúc phân tầng, tách biệt rõ ràng giữa tầng hiển thị máy khách (Front-end), tầng logic nghiệp vụ máy chủ (Back-end), tầng cơ sở dữ liệu và phân hệ thu thập dữ liệu (Crawler Engine).
[ Client Browser ]
(Axios / REST API)
[ PostgreSQL Database ]
(Normalized Structured Items)
[ Real Estate Websites ]
(batdongsan.com, propzy, etc.)
1. Kiến trúc Front-end (ReactJS)
Tầng Front-end được xây dựng theo mô hình Single-Page Application (SPA) nhằm mang lại trải nghiệm mượt mà, không cần tải lại toàn bộ trang web khi chuyển đổi trạng thái:
- Cấu trúc Component & Props: Chia giao diện thành các khối độc lập, tái sử dụng cao; phân định luồng truyền dữ liệu một chiều thông qua
props và quản lý trạng thái cục bộ thông qua state.
- Vòng đời Component (Lifecycle Methods): Điều khiển luồng khởi tạo và hủy tài nguyên thông qua
componentDidMount() và componentWillUnmount().
- Xử lý bất đồng bộ: Tích hợp thư viện
axios để thực hiện các yêu cầu AJAX gửi và nhận dữ liệu JSON bảo mật với máy chủ Django REST thay vì dùng API fetch() cơ bản hoặc jQuery AJAX.
- Tối ưu mã nguồn: Ứng dụng kỹ thuật chia nhỏ mã (Code Splitting) với cú pháp dynamic
import() và gom cụm phần tử DOM với React.Fragment.
2. Kiến trúc Back-end (Django & PostgreSQL)
- Mô hình MVC / MVT: Django đóng vai trò điều phối toàn bộ nghiệp vụ xử lý dữ liệu máy chủ:
- Model Layer: Định nghĩa cấu trúc các bảng thực thể bất động sản kế thừa từ
django.db.models.Model, tự động đồng bộ hóa lược đồ cơ sở dữ liệu thông qua các lệnh makemigrations và migrate. Tương tác dữ liệu hoàn toàn qua Django ORM (save(), filter(), get()).
- View Layer & URL Dispatcher: Định tuyến yêu cầu HTTP từ các endpoint URL sang hàm xử lý Controller tương ứng, trả về dữ liệu chuẩn JSON thông qua Django REST Framework.
- Cơ sở dữ liệu PostgreSQL: Đảm bảo tính toàn vẹn dữ liệu, khả năng mở rộng lưu trữ khối lượng lớn bài đăng và hỗ trợ các truy vấn phân tích thống kê phức tạp.
3. Phân hệ thu thập dữ liệu (Scrapy & Selenium Engine)
- Scrapy Architecture: Luồng vận hành tuân thủ quy trình kiểm soát của Execution Engine qua các khối Scheduler, Downloader Middleware, Spiders và Item Pipeline.
- Phân loại Spiders & Trích xuất: Tùy biến
scrapy.Spider với các bộ chọn CSS Selector (response.css) và XPath Selector (response.xpath). Quản lý cấu trúc dữ liệu thu thập thông qua lớp scrapy.Item và scrapy.Field.
- Item Pipeline: Tiếp nhận dữ liệu thô từ Spider, sử dụng
ItemAdapter để chuẩn hóa định dạng, làm sạch và kích hoạt ngoại lệ DropItem đối với các bản ghi thiếu trường dữ liệu cốt lõi trước khi ghi vào cơ sở dữ liệu.
- Xử lý nội dung động và cơ chế chống cào dữ liệu:
- Đối với mã JavaScript nhúng: Sử dụng thư viện
js2xml chuyển đổi mã kịch bản thành cây tài liệu XML để trích xuất thuộc tính tọa độ.
- Đối với các trang web chặn Bot (Anti-crawling) hoặc yêu cầu render JavaScript hoàn chỉnh: Khóa luận lựa chọn tích hợp Selenium WebDriver (chạy ChromeDriver ở chế độ headless) làm Downloader tùy biến, thay thế cho giải pháp Splash (chạy Docker/Lua script) do Splash không đáp ứng được yêu cầu vượt qua các lớp bảo vệ chống bot phức tạp.
| Tiêu chí |
Scrapy Thuần túy |
Splash Service |
Selenium WebDriver (Được chọn) |
| Cơ chế xử lý |
Tải mã nguồn HTML thô tĩnh |
Trình duyệt nhẹ chạy trên Docker (Lua script) |
Điều khiển trình duyệt thật (Headless Chrome) |
| Thực thi JavaScript |
Không hỗ trợ |
Có hỗ trợ qua HTTP API |
Hỗ trợ đầy đủ như người dùng thật |
| Vượt Anti-bot/Anti-crawling |
Kém, dễ bị chặn |
Trung bình |
Tốt, mô phỏng hoàn chỉnh trình duyệt máy khách |
| Tiêu tốn tài nguyên (CPU/RAM) |
Rất thấp, tốc độ tải cực nhanh |
Thấp - Trung bình |
Cao, tốc độ tải chậm hơn |
| Mục đích sử dụng trong đề tài |
Cào dữ liệu từ các trang cấu trúc chuẩn |
Thử nghiệm, không sử dụng chính thức |
Xử lý các trang web chặn bot và nội dung động |
Nội dung chính theo từng chương
Chương 1: Overview (Tổng quan)
- Giới thiệu bối cảnh thị trường bất động sản tại Việt Nam và nhu cầu cấp thiết về một công cụ thu thập, tổng hợp dữ liệu nhà đất tự động dành cho các nhà môi giới và nhà đầu tư.
- Xác định mục tiêu tổng quát của khóa luận: Xây dựng ứng dụng web hiển thị dữ liệu thu thập, phát triển bộ cào dữ liệu tùy biến từ
batdongsan.com và propzy, cung cấp bảng điều khiển thống kê (Dashboard) và xây dựng mô hình học máy ước tính giá trị bất động sản dựa trên diện tích, tên đường, phường, quận.
- Xác định phạm vi và giới hạn của đề tài: Tập trung vào dữ liệu tin rao bán tại TP.HCM, hệ thống vận hành nội bộ cục bộ cho nhóm thử nghiệm nhỏ dưới 10 người dùng.
Chương 2: Background Knowledge (Kiến thức nền tảng)
- Công nghệ Front-end: Phân tích chi tiết kiến trúc ứng dụng đơn trang (SPA); so sánh toàn diện giữa ReactJS, AngularJS và VueJS; giải thích cơ chế JSX, phân tách Component, luồng dữ liệu Props, vòng đời State, kỹ thuật chia nhỏ mã nguồn (Code Splitting), Fragment và cơ chế xử lý sự kiện trong ReactJS.
- Công nghệ Back-end & Cơ sở dữ liệu: Khảo sát kiến trúc MVC trong Django Framework; phân tích chi tiết tầng Model, tầng View (URL Dispatcher), cấu hình kết nối PostgreSQL và cơ chế giao tiếp bất đồng bộ qua Axios AJAX Request-Response.
- Kỹ thuật thu thập dữ liệu Web: Trình bày chi tiết luồng kiến trúc của Scrapy Engine; cơ chế hoạt động của Spider, Bộ chọn XPath/CSS, Item và Item Pipeline; kỹ thuật gỡ lỗi tương tác với Scrapy Shell; các phương pháp xử lý nội dung động bao gồm thư viện
js2xml, công cụ Splash và tích hợp Selenium WebDriver (với các cơ chế Explicit Wait, Implicit Wait, Fluent Wait).
- Học máy & Dự báo thống kê: Trình bày lý thuyết Hồi quy tuyến tính (đơn biến, đa biến), hàm mất mát MSE, phương pháp tối ưu Gradient Descent và Least Squares; mở rộng dữ liệu phi tuyến qua Polynomial Features; kỹ thuật điều chuẩn Ridge Regression ($L_2$) và Lasso Regression ($L_1$).
- Đánh giá mô hình & Tiền xử lý dữ liệu: Định nghĩa toán học của MSE, RMSE, hệ số xác định $R^2$, kiểm định chéo 5-Folds Cross-Validation; phân tích hiện tượng Underfitting và Overfitting; trình bày quy trình Feature Engineering gồm xử lý dữ liệu khuyết thiếu, khử trùng lặp dữ liệu, loại bỏ điểm ngoại lai bằng Boxplot và chuẩn hóa phân phối bằng Log Transformation.
Kết quả và đóng góp
1. Kết quả thực nghiệm và triển khai hệ thống
- Xây dựng thành công ứng dụng web: Hoàn thiện giao diện người dùng với ReactJS, cung cấp tính năng đăng ký/đăng nhập, lọc dữ liệu linh hoạt theo tiêu chí, hiển thị biểu đồ thống kê thị trường trên Dashboard và trang dự báo giá nhà đất dựa trên các thuộc tính nhập vào (diện tích, vị trí đường, phường, quận).
- Xây dựng hệ thống Crawler tự động: Kết hợp Scrapy và Selenium giải quyết thành công bài toán cào dữ liệu định kỳ từ các trang bất động sản lớn tại TP.HCM (
batdongsan.com, propzy), thu thập các trường thông tin chi tiết kèm tọa độ địa lý.
- Quy trình tiền xử lý dữ liệu chuẩn hóa: Triển khai thành công chuỗi xử lý dữ liệu thực tế tại các khu vực điển hình như đất bán Củ Chi (khu vực Ba Thiên, Nhuận Đức) và Bình Thạnh (đường Nguyễn Hữu Cảnh, Phường 22); áp dụng Log Transformation đưa phân phối dữ liệu về dạng chuẩn và loại bỏ triệt để các điểm dữ liệu dị biệt bằng phương pháp phân vùng Boxplot.
- Thực nghiệm mô hình dự báo giá: Đánh giá sai số RMSE và hệ số $R^2$ qua kiểm định chéo 5-folds trên tập huấn luyện và tập kiểm định, tìm ra bậc đa thức tối ưu (Polynomial Degree) cho bài toán hồi quy giá bất động sản.
+-----------------------------------------------------------------------------+
| KẾT QUẢ ĐÁNH GIÁ LUẬN ÁN |
+============================+===========================+====================+
| Cán bộ đánh giá | Nhận xét chuyên môn | Điểm đánh giá |
+----------------------------+---------------------------+--------------------+
| PGS. Quản Thành Thơ | Phát triển thành công hệ | 7.0 / 10 |
| (Giảng viên hướng dẫn) | thống theo yêu cầu gồm | (Được bảo vệ) |
| | 3 khối: (i) Crawling; | |
| | (ii) Chuẩn hóa & tiền xử | |
| | lý; (iii) Kỹ thuật AI dự | |
| | báo. | |
+----------------------------+---------------------------+--------------------+
| PGS. Bùi Hoài Thắng | Nắm vững kiến thức cào | 6.5 / 10 |
| (Giảng viên phản biện) | dữ liệu bất động sản; | (Được bảo vệ - |
| | hiểu kỹ thuật định giá; | Đánh giá: Khá) |
| | thiết kế hoàn chỉnh web | |
| | thống kê và thử nghiệm dự | |
| | báo giá. | |
+----------------------------+---------------------------+--------------------+
2. Đóng góp của đề tài
- Cung cấp giải pháp kỹ thuật tích hợp hoàn chỉnh từ khâu cào dữ liệu đa nguồn phức tạp, xử lý vượt tường rào anti-bot, chuẩn hóa dữ liệu thống kê cho đến trực quan hóa và ứng dụng học máy vào bài toán định giá nhà đất thực tế tại TP.HCM.
- Cung cấp tài liệu khảo sát, phân tích so sánh chi tiết giữa các công nghệ Front-end (ReactJS vs. AngularJS vs. VueJS), công cụ tải trang động (Scrapy vs. Splash vs. Selenium) và các mô hình hồi quy có điều chuẩn (Ridge vs. Lasso).
Hạn chế và hướng nghiên cứu tiếp
Dựa trên nội dung văn bản và nhận xét trong phiếu chấm bảo vệ của hội đồng chuyên môn:
- Hạn chế về phân tích nghiệp vụ: Giảng viên hướng dẫn chỉ ra thiếu sót của đề tài là cần tiến hành phân tích sâu hơn về các yêu cầu nghiệp vụ thực tế (business requirements) của ngành bất động sản nhằm tối ưu hóa tính ứng dụng thương mại của sản phẩm.
- Hạn chế về quy mô hệ thống: Hệ thống chỉ mới được triển khai thử nghiệm trên môi trường cục bộ (local) với quy mô dưới 10 người dùng; phạm vi dữ liệu thu thập chỉ giới hạn tại khu vực TP.HCM đối với loại hình tin đăng bán.
- Hiệu năng thu thập dữ liệu: Việc sử dụng Selenium WebDriver để xử lý các trang web chặn cào dữ liệu tiêu tốn nhiều tài nguyên CPU/RAM và làm giảm đáng kể tốc độ thu thập so với các yêu cầu HTTP thô của Scrapy.
- Hướng mở rộng: Mở rộng địa bàn thu thập dữ liệu ra toàn quốc, tích hợp thêm các loại hình bất động sản cho thuê, tối ưu hóa hiệu năng cào dữ liệu phân tán và nghiên cứu các mô hình học máy phi tuyến tính phức tạp hơn.
Giá trị tham khảo
Khóa luận là tài liệu tham khảo có giá trị kỹ thuật thực tiễn cao đối với:
- Sinh viên ngành Khoa học Máy tính và Kỹ thuật Phần mềm: Nắm bắt quy trình xây dựng một ứng dụng web full-stack hoàn chỉnh kết hợp giữa ReactJS SPA và Django REST Framework.
- Các nhà phát triển hệ thống dữ liệu (Data Engineers / Web Scrapers): Tham khảo giải pháp kết hợp giữa Scrapy và Headless Selenium để xử lý triệt để các website có cơ chế chống cào dữ liệu, cũng như kỹ thuật trích xuất dữ liệu ẩn trong mã JavaScript bằng thư viện
js2xml.
- Người nghiên cứu học máy ứng dụng: Tham khảo quy trình tiền xử lý dữ liệu bảng thực tế (xử lý missing value, kỹ thuật phân vùng boxplot khử ngoại lai, phép biến đổi Log Transformation) và quy trình đánh giá mô hình hồi quy đa thức thông qua 5-Fold Cross-Validation.
Câu hỏi thường gặp
1. Khóa luận sử dụng giải pháp nào để trích xuất tọa độ kinh độ và vĩ độ bị ẩn trong mã nguồn trang web?
Tác giả sử dụng thư viện Python js2xml để chuyển đổi đoạn mã JavaScript nằm trong thẻ <script> thành cấu trúc cây tài liệu XML, sau đó sử dụng bộ chọn XPath/CSS của Scrapy để bóc tách chính xác giá trị latitude và longitude.
2. Vì sao tác giả chọn Selenium WebDriver thay vì Splash để cào các trang web bất động sản phức tạp?
Mặc dù Splash (chạy trên Docker và thực thi mã Lua) tiêu tốn ít tài nguyên CPU hơn, nhưng Splash không thể vượt qua được cơ chế bảo vệ chống bot (anti-bot) của một số website bất động sản mục tiêu. Do đó, tác giả sử dụng ChromeDriver ở chế độ headless của Selenium để mô phỏng hoàn chỉnh tương tác trình duyệt của người dùng thực.
3. Khóa luận sử dụng những kỹ thuật nào trong bước kỹ thuật đặc trưng (Feature Engineering) để làm sạch dữ liệu giá đất?
Tác giả đã áp dụng 4 kỹ thuật chính: (1) Loại bỏ hoặc gán giá trị trung bình cho dữ liệu khuyết thiếu; (2) Lọc bỏ các bản ghi trùng lặp; (3) Vẽ biểu đồ hộp (Boxplot) chia theo từng phân vùng để loại bỏ các điểm dị biệt (outliers); (4) Sử dụng phép biến đổi Logarit (Log Transformation) để chuẩn hóa phân phối dữ liệu diện tích và giá bán.
4. Điểm khác biệt cơ bản giữa hai kỹ thuật điều chuẩn Ridge Regression và Lasso Regression được tác giả trình bày là gì?
Ridge Regression ($L_2$) áp dụng thành phần phạt bình phương trọng số $\alpha \sum \theta^2$, giúp co các hệ số về gần 0 nhưng không triệt tiêu hệ số nào; trong khi Lasso Regression ($L_1$) sử dụng giá trị tuyệt đối $\alpha \sum |\theta|$, có khả năng phạt triệt để các hệ số không cần thiết về đúng bằng 0, từ đó thực hiện việc chọn lọc biến tự động.
5. Kết quả đánh giá chung của hội đồng chấm khóa luận đối với sinh viên Phạm Minh Tuấn như thế nào?
Khóa luận được cả giảng viên hướng dẫn (PGS. Quản Thành Thơ - chấm 7.0 điểm) và giảng viên phản biện (PGS. Bùi Hoài Thắng - chấm 6.5 điểm, xếp loại Khá) đánh giá đạt yêu cầu và đồng ý cho phép bảo vệ trước hội đồng tốt nghiệp.
Kết luận
Khóa luận tốt nghiệp của sinh viên Phạm Minh Tuấn đã hoàn thành đầy đủ các nhiệm vụ kỹ thuật được giao trong việc phát triển một hệ thống web toàn diện phục vụ theo dõi và phân tích dữ liệu thống kê bất động sản tại TP.HCM. Bằng cách kết hợp linh hoạt hệ sinh thái công nghệ gồm ReactJS, Django REST Framework, PostgreSQL, Scrapy và Selenium, tác giả đã xây dựng thành công quy trình khép kín từ thu thập dữ liệu web đa nguồn, chuẩn hóa tiền xử lý cho đến dự báo giá bằng học máy. Công trình là tài liệu tham khảo có giá trị cao về mặt kỹ thuật phần mềm và kỹ thuật xử lý dữ liệu thực nghiệm.