Giới thiệu dự án

Bối cảnh và vấn đề thực tiễn

Ngành công nghiệp phân tích dữ liệu thể thao toàn cầu (Sports Analytics) đang chứng kiến sự tăng trưởng vượt bậc với quy mô dự kiến vượt mốc 8.4 tỷ USD vào năm 2026. Trong bóng đá, dữ liệu không chỉ dừng lại ở tỷ số mà bao gồm hàng triệu điểm dữ liệu về thông số di chuyển, chỉ số phong độ, kiểm soát bóng, lịch sử đối đầu và thuộc tính chi tiết của cầu thủ.

Tại Việt Nam, nhu cầu tiếp cận dữ liệu phân tích chuyên sâu của người hâm mộ thể thao là rất lớn (tiêu biểu như các chuyên mục dự đoán trận đấu trên các trang báo lớn như VnExpress thu hút hàng trăm nghìn lượt tương tác mỗi vòng đấu). Tuy nhiên, hầu hết người dùng phổ thông và nhà phân tích bán chuyên chỉ tiếp cận các con số thống kê rời rạc mà thiếu một hệ thống tổng hợp, chuẩn hóa và đưa ra dự đoán định lượng dựa trên nền tảng khoa học dữ liệu hiện đại.

Tuyên bố bài toán (Problem Statement)

Các hệ thống phân tích và dự đoán bóng đá hiện nay đối mặt với các vấn đề kỹ thuật (pain points) lớn:

  • Dữ liệu phân mảnh và phi cấu trúc: Dữ liệu trận đấu, số liệu chuyên sâu và chỉ số cầu thủ nằm rải rác trên nhiều nền tảng trực tuyến khác nhau (FBref, Sofifa, Sportsgambler) với định dạng và cơ chế phân trang phức tạp.
  • Thiếu hụt kiến trúc kho dữ liệu chuyên dụng: Việc lưu trữ thô khiến các truy vấn thống kê phức tạp và phân tích đa chiều (OLAP) bị tắc nghẽn hiệu năng.
  • Hạn chế trong mô hình hóa dự đoán: Các dự đoán truyền thống thường dựa vào cảm tính hoặc mô hình xác suất tĩnh, chưa kết hợp giữa chỉ số xếp hạng động (ELO Rating) và các thuật toán học máy phân tán trên tập dữ liệu lớn.

Mục tiêu đề tài

  1. Thiết kế và triển khai quy trình ETL tự động: Thu thập dữ liệu đa nguồn quy mô lớn từ giải Ngoại hạng Anh (Premier League giai đoạn 2018–2024) bao gồm trận đấu, thông số chi tiết và chỉ số cầu thủ theo từng phiên bản cập nhật.
  2. Xây dựng Data Warehouse chuẩn kiến trúc Kimball: Thiết kế mô hình dữ liệu đa chiều (Dimensional Modeling) với Fact và Dimension tables tối ưu cho phân tích trên nền tảng Google BigQuery.
  3. Xây dựng hệ thống gợi ý và dự đoán kết quả: Ứng dụng Apache Spark MLlib kết hợp thuật toán tính điểm ELO động để xây dựng các mô hình phân loại (Classification) với độ chính xác cao.
  4. Trực quan hóa và triển khai ứng dụng người dùng: Xây dựng Dashboard BI trên Google Looker Studio và cổng tra cứu web thời gian thực với AngularJS trên nền tảng Firebase Hosting.

Phương pháp tiếp cận và kết quả kỳ vọng

Dự án áp dụng phương pháp tiếp cận kỹ thuật dữ liệu đầu-cuối (End-to-End Data Engineering Pipeline), chuyển đổi toàn bộ pipeline lên hạ tầng đám mây Google Cloud Platform (GCP). Hệ thống hướng tới xử lý và chuẩn hóa hơn 5 năm dữ liệu giải đấu Ngoại hạng Anh, rút ngắn thời gian xử lý ETL tổng thể xuống dưới 1 giờ trên cụm phân tán và đạt độ chính xác dự đoán vượt trội so với các mô hình baseline ngẫu nhiên.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí Giải pháp phân tích truyền thống (Web-based Statistics) Các mô hình học máy cục bộ (Local Python Scripts) Giải pháp Data Warehouse Cloud & Spark (Đề tài đề xuất)
Nguồn dữ liệu Đơn nguồn, hiển thị tĩnh Đơn nguồn, xử lý tệp CSV nhỏ Đa nguồn tự động (FBref, Sofifa, Sportsgambler)
Khả năng mở rộng Bị giới hạn bởi giao diện web cung cấp Hạn chế bởi RAM/CPU của máy cục bộ Mở rộng quy mô linh hoạt theo cụm tính toán Dataproc
Cấu trúc lưu trữ Cơ sở dữ liệu quan hệ truyền thống / RDBMS Tệp phẳng (Flat files) Data Warehouse đa chiều (Kimball Star/Snowflake Schema)
Hiệu năng truy vấn Chậm khi xử lý hàng triệu bản ghi Không hỗ trợ truy vấn đồng thời Truy vấn BigQuery phân tán tốc độ cao (dưới 2 giây/view)
Mô hình hóa dự đoán Không có hoặc thống kê phần trăm đơn giản Các mô hình Scikit-learn đơn luồng Spark MLlib song song kết hợp thuật toán ELO tối ưu

Yêu cầu hệ thống theo mô hình MoSCoW

  • Must have: Pipeline thu thập dữ liệu đa nguồn tự động; Kho dữ liệu BigQuery chuẩn Fact/Dim; Mô hình phân loại kết quả trận đấu (Thắng / Hòa / Thua) bằng Spark MLlib; Giao diện web tra cứu thông số.
  • Should have: Tích hợp thuật toán tính điểm ELO theo thời gian thực; Dashboard phân tích động với Google Looker Studio; Tự động hóa tối ưu siêu tham số mô hình qua Cross-Validation.
  • Could have: Dự đoán đội hình ra sân dự kiến thông qua Sportsgambler; Cơ chế tự động cảnh báo lỗi thu thập dữ liệu qua Log.
  • Won't have: Dự đoán tỷ số bàn thắng chính xác theo thời gian thực từng phút (in-game micro-events); Tích hợp cổng thanh toán cược thương mại.

Thiết kế hệ thống

Technology Stack và phiên bản chi tiết

  • Hệ điều hành máy chủ: Debian GNU/Linux 12 (bookworm) trên GCP Compute Engine.
  • Engine thu thập dữ liệu: Python 3.10+, Scrapy Framework 2.11+, Selenium WebDriver 4.x, R 4.3+ với thư viện worldfootballR.
  • Hạ tầng tính toán phân tán: Google Cloud Dataproc Cluster (1 Master node + 2 Worker nodes, Series E2-standard-2, 2 vCPUs, 8 GB RAM mỗi node).
  • Hệ thống xử lý dữ liệu lớn: Apache Spark 3.4+ (PySpark Engine), Pandas 2.x, NumPy 1.24+.
  • Lưu trữ & Kho dữ liệu: Google Cloud Storage (Bucket Staging), Google BigQuery (Serverless OLAP DW).
  • Trực quan hóa & Ứng dụng người dùng: Google Looker Studio, AngularJS 1.8+, HTML5/CSS3, Firebase Hosting.

Thiết kế mô hình kho dữ liệu (Data Warehouse Modeling)

Hệ thống triển khai 2 Business Process chính theo phương pháp luận Kimball: Phân tích thống kê trận đấu và Phân tích chỉ số cầu thủ.

-- Lược đồ thiết kế bảng Fact Match Statistics trong BigQuery
CREATE TABLE `football_dw.fact_match_statistics` (
    match_id STRING NOT NULL,
    date_id INT64,
    league_id STRING,
    home_team_id STRING,
    away_team_id STRING,
    home_score INT64,
    away_score INT64,
    home_possession FLOAT64,
    away_possession FLOAT64,
    home_shots INT64,
    away_shots INT64,
    home_shots_on_target INT64,
    away_shots_on_target INT64,
    home_elo_before FLOAT64,
    away_elo_before FLOAT64,
    match_result STRING -- 'HOME_WIN', 'AWAY_WIN', 'DRAW'
);

Hệ thống bao gồm các bảng Dimension cốt lõi:

  • dim_league: Lưu thông tin giải đấu, quốc gia, hạng đấu.
  • dim_team: Lưu mã đội bóng, tên đầy đủ, sân vận động, năm thành lập.
  • dim_date: Phân tách chi tiết ngày, tháng, năm, quý, ngày trong tuần.
  • dim_player: Thông tin định danh cầu thủ, quốc tịch, vị trí sở trường.
  • dim_player_version: Lưu biến thiên chỉ số cầu thủ (Overall, Potential, Pace, Shooting, Passing) theo từng bản cập nhật Sofifa (Slowly Changing Dimension Type 2).

Phương pháp phát triển và quản lý rủi ro

Dự án được tổ chức theo quy trình linh hoạt (Agile/Scrum rút gọn) với 18 tuần thực hiện từ tháng 01/2024 đến tháng 05/2024.

[Tuần 1-3: Nghiên cứu & Thiết lập] ➔ [Tuần 4-6: Web Scraping Pipeline] ➔ [Tuần 7-9: Thiết kế DW & GCP Setup] 
➔ [Tuần 10-13: Dataproc PySpark ETL & BigQuery] ➔ [Tuần 14-16: Spark ML & ELO Integration] ➔ [Tuần 17-18: BI & Web Deploy]

Chiến lược giảm thiểu rủi ro kỹ thuật:

  • Rủi ro chặn IP từ nguồn dữ liệu (Anti-scraping/Rate limit): Tích hợp ScrapydWeb điều phối tác vụ cào bất đồng bộ, cấu hình DOWNLOAD_DELAY = 2.5s, xoay vòng User-Agent và sử dụng R engine (worldfootballR) làm giải pháp dự phòng song song.
  • Rủi ro chi phí Cloud phát sinh: Cấu hình cụm Dataproc tự động tắt khi không có job (Auto-deletion/Idle shutdown), sử dụng dòng máy chia sẻ tài nguyên E2-standard-2 giúp tối ưu ngân sách vận hành thực tế chỉ ~170.000 VNĐ/tháng.

Implementation và kết quả

Quy trình phát triển và các thuật toán cốt lõi

1. Pipeline trích xuất dữ liệu đa luồng (Scrapy Engine)

Module Scrapy được đóng gói để trích xuất toàn bộ dữ liệu trận đấu và thông số kỹ thuật chuyên sâu theo mùa giải.

import scrapy
from scrapy.http import Request

class MatchStatsSpider(scrapy.Spider):
    name = "crawlMatches"
    allowed_domains = ["fbref.com"]
    start_urls = ["https://fbref.com/en/comps/9/history/Premier-League-Seasons"]

    custom_settings = {
        'FEED_FORMAT': 'csv',
        'FEED_URI': 'gs://football-data-etl/staging/fbref_matches_raw.csv',
        'CONCURRENT_REQUESTS': 8,
        'DOWNLOAD_DELAY': 1.5
    }

    def parse(self, response):
        season_links = response.xpath('//th[@data-stat="season"]/a/@href').extract()
        for link in season_links[:6]: # 6 mùa giải gần nhất
            yield response.follow(link, callback=self.parse_season_fixtures)

    def parse_season_fixtures(self, response):
        match_links = response.xpath('//td[@data-stat="match_report"]/a/@href').extract()
        for match in match_links:
            yield response.follow(match, callback=self.parse_match_details)

    def parse_match_details(self, response):
        # Trích xuất thông số xG, tỷ lệ kiểm soát, cú sút, thẻ phạt của 2 đội
        yield {
            'match_id': response.url.split('/')[4],
            'home_team': response.xpath('//div[@class="scorebox"]//strong/a/text()').extract()[0],
            'away_team': response.xpath('//div[@class="scorebox"]//strong/a/text()').extract()[1],
            'home_score': int(response.xpath('//div[@class="scorebox"]//div[@class="score"]/text()').extract()[0]),
            'away_score': int(response.xpath('//div[@class="scorebox"]//div[@class="score"]/text()').extract()[1]),
            'home_possession': response.xpath('//div[@id="team_stats"]//tr[3]/td[1]//text()').get(),
            'away_possession': response.xpath('//div[@id="team_stats"]//tr[3]/td[2]//text()').get(),
        }

2. Xây dựng thuật toán xếp hạng động ELO cho bóng đá

Hệ thống triển khai thuật toán tính điểm ELO cập nhật liên tục sau mỗi vòng đấu. Xác suất chiến thắng kỳ vọng $E_A$ của đội $A$ trước đội $B$ được tính theo công thức:

$$E_A = \frac{1}{1 + 10^{(R_B - R_A)/400}}$$

Điểm ELO cập nhật sau trận đấu:

$$R'_A = R_A + K \cdot (S_A - E_A)$$

Trong đó $S_A$ là kết quả thực tế (1: Thắng, 0.5: Hòa, 0: Thua), $K = 30$, hệ số điều chỉnh độ nhạy là $400$.

from pyspark.sql.functions import udf
from pyspark.sql.types import DoubleType

def calculate_expected_outcome(rating_a, rating_b):
    return 1.0 / (1.0 + 10.0 ** ((rating_b - rating_a) / 400.0))

def update_elo(rating_a, rating_b, actual_score, k_factor=30.0):
    expected_a = calculate_expected_outcome(rating_a, rating_b)
    new_rating_a = rating_a + k_factor * (actual_score - expected_a)
    return float(new_rating_a)

spark.udf.register("udf_update_elo", update_elo, DoubleType())

3. Huấn luyện mô hình học máy phân tán trên Spark MLlib

Pipeline học máy tích hợp VectorAssembler, chuẩn hóa dữ liệu qua StandardScaler và sử dụng bộ phân loại đa lớp với Regularization (L1/L2 ElasticNet):

from pyspark.ml.feature import VectorAssembler, StandardScaler
from pyspark.ml.classification import LogisticRegression, RandomForestClassifier
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# Feature Vector Assembly
feature_cols = ['home_elo', 'away_elo', 'elo_diff', 'home_avg_xg', 'away_avg_xg', 
                'home_overall_fifa', 'away_overall_fifa', 'home_form_last5', 'away_form_last5']
assembler = VectorAssembler(inputCols=feature_cols, outputCol="raw_features")
scaler = StandardScaler(inputCol="raw_features", outputCol="features", withStd=True, withMean=True)

# Khởi tạo thuật toán hồi quy Logistic đa lớp
lr = LogisticRegression(labelCol="label", featuresCol="features", family="multinomial")

# Xây dựng ma trận tham số (ParamGrid) cho điều chuẩn ElasticNet
paramGrid = ParamGridBuilder() \
    .addGrid(lr.regParam, [0.01, 0.1, 0.5]) \
    .addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0]) \
    .build()

evaluator = MulticlassClassificationEvaluator(labelCol="label", metricName="accuracy")
cv = CrossValidator(estimator=lr, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=5)

# Huấn luyện mô hình trên tập train
cvModel = cv.fit(training_data)

Kết quả kiểm nghiệm và đánh giá thực nghiệm

Quá trình đánh giá thực nghiệm được thực hiện trên 2,280 trận đấu giải Ngoại hạng Anh qua 30 lần kiểm chứng chéo lặp lại (Repeated 5-Fold Cross Validation):

Mô hình thuật toán Độ chính xác trung bình (Accuracy) F1-Score (Weighted) Thời gian huấn luyện (Cụm Dataproc 3 nodes) Thời gian suy luận (Inference Latency)
Baseline (Home Advantage only) 46.20% 0.391 - < 1 ms
Naïve Bayes 52.85% 0.512 2.1 phút 12 ms
Decision Tree 56.40% 0.558 3.4 phút 15 ms
Random Forest (100 trees) 61.75% 0.609 8.8 phút 38 ms
Multinomial Logistic Regression + ELO (Tối ưu) 65.30% 0.648 4.2 phút 8 ms
Độ chính xác mô hình qua các kịch bản thực nghiệm:
- Chỉ sử dụng số liệu thống kê truyền thống: 54.10%
- Kết hợp thuộc tính cầu thủ Sofifa (FIFA Overall/Pace/Passing): 58.60% (+4.50%)
- Tích hợp thêm chỉ số xếp hạng động ELO Rating: 65.30% (+6.70%)

Đổi mới và đóng góp

  1. Kiến trúc Data Warehouse hợp nhất giữa số liệu thực tế và game simulation: Lần đầu tiên dữ liệu diễn biến thực tế từ FBref được chuẩn hóa và ánh xạ thành công với biến thiên chỉ số cầu thủ chi tiết theo từng mốc thời gian từ cơ sở dữ liệu Sofifa (thay vì xem chỉ số cầu thủ là đại lượng cố định qua các mùa).
  2. Cải tiến thuật toán ELO kết hợp Vector năng lực đội bóng: Thay vì sử dụng ELO thuần túy cho kết quả đối đầu lịch sử, đề tài đề xuất trọng số ELO thích ứng dựa trên chênh lệch chất lượng đội hình xuất phát thu thập trước trận đấu từ Sportsgambler.
  3. Tối ưu hóa hiệu năng tính toán trên Cloud: Ứng dụng thành công mô hình tính toán phân tán của Spark Core trên Google Dataproc, giúp xử lý tập dữ liệu hàng trăm nghìn sự kiện trận đấu và trích xuất đặc trưng chỉ trong 17 phút (giảm 82% thời gian so với xử lý tuần tự trên máy đơn lẻ).

Ứng dụng thực tế và triển khai

Triển khai hệ thống Cloud hoàn chỉnh

Hệ thống được đóng gói và vận hành hoàn chỉnh trên hệ sinh thái Google Cloud:

  • Tầng lưu trữ & Kho dữ liệu: Google Cloud Storage (football-data-etl bucket) đóng vai trò Staging Area kết nối trực tiếp với Google BigQuery để phục vụ các truy vấn phân tích đa chiều.
  • Tầng trình diễn người dùng: Web Application phát triển bằng AngularJS được tự động hóa CI/CD và triển khai qua Firebase Hosting, đảm bảo khả năng phản hồi tức thì và tương thích hoàn toàn trên cả thiết bị PC và Mobile.
+-------------------------------------------------------------------------+
|                  AngularJS Single Page Application                      |
|            (Deployed on Firebase: UI Dashboard & Prediction)            |
+------------------------------------+------------------------------------+
                                     |
               +---------------------+---------------------+
               | REST Views API Query                      | Data Studio Sync
+--------------v---------------+             +-------------v--------------+
|   Google BigQuery Warehouse  |             | Google Looker Studio (BI)  |
|  (Fact & Dim Models, Views)  |             |   (Match Stats Dashboard)  |
+--------------^---------------+             +----------------------------+
               |
+--------------+---------------+
| Apache Spark on GCP Dataproc |
|   (ETL, PySpark ML & ELO)    |
+--------------^---------------+
               |
+--------------+---------------+
|  Google Cloud Storage Bucket | <=== [Scrapy / R Compute Engine Worker]
+------------------------------+

Phân tích chi phí và hiệu quả đầu tư (Cost-Benefit Analysis)

  • Chi phí hạ tầng: Nhờ cơ chế On-Demand và máy ảo E2 chia sẻ tài nguyên, tổng chi phí duy trì vận hành toàn bộ hệ thống (Compute Engine, Dataproc, Cloud Storage, BigQuery) chỉ dao động ở mức ~170.000 VNĐ đến 250.000 VNĐ/tháng.
  • Khả năng mở rộng: Kiến trúc Serverless của BigQuery và khả năng tăng/giảm số lượng worker nodes trên Dataproc cho phép hệ thống dễ dàng mở rộng để tiếp nhận thêm các giải đấu hàng đầu khác (La Liga, Serie A, Champions League) mà không cần tái cấu trúc mã nguồn.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Tỷ lệ cào dữ liệu phụ thuộc vào cấu trúc DOM của các website nguồn; khi các trang như FBref hoặc Sofifa thay đổi giao diện, bộ bóc tách XPath cần được cập nhật thủ công.
  • Chưa tính đến các biến số ngẫu nhiên phát sinh trong trận đấu thực tế (thẻ đỏ sớm, chấn thương bất ngờ của cầu thủ trụ cột ngay trong lúc khởi động, điều kiện thời tiết khắc nghiệt).

Hướng phát triển trong tương lai

  • Xây dựng cơ chế phát hiện trôi dạt dữ liệu (Data Drift / Model Drift) và tự động kích hoạt pipeline huấn luyện lại (Continuous Training - CT) khi có kết quả các vòng đấu mới.
  • Tích hợp thêm các mô hình học sâu (Deep Learning) chuỗi thời gian như LSTM hoặc Transformer để nắm bắt phong độ dài hạn của từng cầu thủ.
  • Mở rộng phạm vi phân tích sang toàn bộ 5 giải vô địch quốc gia hàng đầu châu Âu và cúp châu lục (UEFA Champions League).

Đối tượng hưởng lợi

  • Sinh viên chuyên ngành Kỹ thuật Dữ liệu & CNTT: Tiếp cận tài liệu tham khảo thực tế về quy trình xây dựng Data Warehouse hoàn chỉnh từ trích xuất Scrapy đến mô hình hóa Kimball trên nền tảng GCP.
  • Kỹ sư dữ liệu (Data Engineers / ML Engineers): Nhận được mẫu mã nguồn chuẩn hóa về tích hợp Apache Spark với Google Cloud Storage và BigQuery, kết hợp triển khai mô hình học máy phân tán trên Spark MLlib.
  • Nhà phân tích thể thao và người hâm mộ: Sở hữu công cụ trực quan hóa thông số chuyên sâu và tham khảo kết quả dự đoán với căn cứ toán học và dữ liệu rõ ràng.
  • Doanh nghiệp truyền thông thể thao: Ứng dụng giải pháp kiến trúc chi phí thấp (chỉ ~170.000 VNĐ/tháng) để xây dựng các widget thống kê tương tác tự động cho độc giả.

Câu hỏi thường gặp (FAQ)

1. Yêu cầu phần cứng và tài nguyên đám mây tối thiểu để triển khai hệ thống là gì?

Hệ thống yêu cầu tài khoản Google Cloud Platform được kích hoạt Billing. Cấu hình cụm Dataproc đề xuất gồm 1 Master Node và tối thiểu 2 Worker Nodes sử dụng dòng máy e2-standard-2 (2 vCPUs, 8 GB RAM, ổ cứng 100 GB Standard Persistent Disk mỗi node).

2. Hệ thống xử lý thế nào khi website nguồn (FBref/Sofifa) áp dụng cơ chế chặn cào dữ liệu?

Hệ thống tích hợp middleware Scrapy tùy chỉnh: đặt độ trễ ngẫu nhiên (DOWNLOAD_DELAY), giới hạn số lượng kết nối đồng thời (CONCURRENT_REQUESTS = 8), giả lập trình duyệt bằng User-Agent xoay vòng và triển khai thêm module R (worldfootballR) thông qua API backend để truy xuất dữ liệu thay thế khi gặp Captcha.

3. Tại sao mô hình Hồi quy Logistic kết hợp ELO lại đạt độ chính xác cao hơn Cây quyết định?

Bản chất kết quả bóng đá chịu ảnh hưởng bởi nhiều biến số liên tục (numeric features) có tương quan tuyến tính với xác suất thắng cuộc (như chênh lệch ELO, tỷ lệ kiểm soát bóng, chỉ số xG). Hồi quy Logistic với hàm kích hoạt Sigmoid/Softmax và điều chuẩn ElasticNet phân tách biên quyết định xác suất mượt mà hơn cấu trúc phân nhánh rời rạc của Cây quyết định đơn lẻ.

4. Chi phí duy trì hệ thống trên Google Cloud Platform được tối ưu ra sao?

Bằng cách tách rời lớp tính toán và lớp lưu trữ: Cụm Dataproc chỉ được khởi chạy theo lịch trình (Scheduled Job) trong thời gian thực hiện tác vụ ETL và huấn luyện ML (~30 phút/tuần), sau đó tự động hủy. Dữ liệu tĩnh được lưu trên Google Cloud Storage và BigQuery (áp dụng chính sách lưu trữ theo dung lượng thực tế), giúp giảm hơn 90% chi phí so với việc duy trì máy chủ ảo 24/7.

5. Làm thế nào để tích hợp thêm một giải đấu mới vào kho dữ liệu hiện tại?

Quy trình thêm giải đấu mới rất linh hoạt: Lập trình viên chỉ cần thêm URL giải đấu mới vào mảng start_urls trong file crawlMatches.py, cập nhật bản ghi tương ứng vào bảng dim_league và chạy lại DAG ETL trên Dataproc. Toàn bộ schema Fact/Dim hiện tại hoàn toàn tương thích và tự động tổng hợp dữ liệu mới.


Kết luận

Đồ án tốt nghiệp "Xây dựng kho dữ liệu phục vụ hệ thống gợi ý kết quả các trận đấu bóng đá" đã giải quyết trọn vẹn bài toán xây dựng một nền tảng dữ liệu thể thao hiện đại, khép kín từ khâu thu thập dữ liệu web phân tán, thiết kế mô hình kho dữ liệu đa chiều chuẩn Kimball trên BigQuery, đến việc ứng dụng Spark MLlib và hệ thống xếp hạng ELO động để đưa ra dự đoán kết quả với độ chính xác đạt 65.30%.

Công trình không chỉ mang giá trị học thuật cao trong việc kết hợp giữa Kỹ thuật dữ liệu (Data Engineering) và Khoa học dữ liệu (Data Science) trên nền tảng Cloud Computing mà còn chứng minh tính khả thi ứng dụng thực tiễn với chi phí vận hành tối ưu. Các bạn sinh viên, kỹ sư dữ liệu và nhà nghiên cứu có thể tham khảo toàn bộ kiến trúc pipeline và mã nguồn để phát triển các hệ thống phân tích dữ liệu quy mô lớn trong tương lai.