messenger_logo
Liên hệ qua Messenger
SciEco

Cào dữ liệu bóng bầu dục mỹ vào stata bằng lệnh nfl2stata

I
IEFPA
Ngày viết: 23/03/2026

Mùa giải bóng bầu dục đang đến gần và sự cạnh tranh trong các giải đấu giả lập luôn cực kỳ khốc liệt. Để tìm kiếm lợi thế cạnh tranh, việc thu thập và phân tích dữ liệu là yếu tố mang tính quyết định. Để giải quyết bài toán này, lệnh nfl2stata đã được phát triển nhằm mục đích cào dữ liệu trực tiếp từ trang web chính thức của NFL vào môi trường Stata. Cần lưu ý rằng do những thay đổi liên tục về cấu trúc trang web từ phía NFL, lệnh này hiện tại có thể không còn hoạt động trơn tru như ban đầu, nhưng tư duy tiếp cận và cách thức xử lý dữ liệu kỹ thuật số vẫn mang lại rất nhiều giá trị thực tiễn.

Cài đặt và sử dụng cơ bản

Để bắt đầu làm việc với bộ dữ liệu này, bước đầu tiên là cài đặt công cụ vào hệ thống máy tính. Bạn có thể thực hiện việc này bằng cách chạy đoạn mã sau.

1net install http://www.stata.com/users/kcrow/nfl2stata, replace

Với công cụ mới này, bạn có thể dễ dàng tìm ra những cầu thủ chạy cánh có nhiều pha ghi bàn nhất trong mùa giải trước.

1. nfl2stata player "running back", season(2017) clear
2177 observation(s) loaded
3. gsort -touchdowns -yards
4. list name team touchdowns in 1/10
5+-------------------------------------+
6     |              name   team   touchd~s |
7     |-------------------------------------|
8  1. |       Todd Gurley     LA         13 |
9  2. |       Mark Ingram     NO         12 |
10  3. |      Le'Veon Bell    PIT          9 |
11  4. |     Jordan Howard    CHI          9 |
12  5. | Leonard Fournette    JAX          9 |
13     |-------------------------------------|
14  6. |       Kareem Hunt     KC          8 |
15  7. |     Melvin Gordon    LAC          8 |
16  8. |       Carlos Hyde     SF          8 |
17  9. |   Latavius Murray    MIN          8 |
18 10. |      Alvin Kamara     NO          8 |
19     +-------------------------------------+

Tương tự, bạn cũng có thể lọc ra danh sách năm cầu thủ đá phạt xuất sắc nhất dựa trên số lần thực hiện thành công.

1. nfl2stata player "field goal kicker", season(2017) clear
254 observation(s) loaded
3. list name team fieldgoalsmade in 1/5
4+--------------------------------------+
5     |               name   team   f~lsmade |
6     |--------------------------------------|
7  1. |       Robbie Gould     SF         39 |
8  2. |      Greg Zuerlein     LA         38 |
9  3. |    Harrison Butker     KC         38 |
10  4. | Stephen Gostkowski     NE         37 |
11  5. |        Ryan Succop    TEN         35 |
12     +--------------------------------------+

Bên cạnh việc trích xuất bảng số liệu, Stata còn hỗ trợ tạo biểu đồ trực quan để vinh danh những cầu thủ chuyền bóng hàng đầu trong mùa giải chính thức.

1. nfl2stata player quarterback, season(2017) seasontype(reg) clear
271 observation(s) loaded
3. graph bar (asis) yards if yards >= 4000, exclude0                        ///
4over(name, sort(yards) descending label(angle(forty_five) labsize(small))) ///
5blabel(bar) title(2017 Passing Yard Leaders)

Có rất nhiều dữ liệu thú vị để nghiên cứu, đặc biệt nếu bạn đam mê việc phân tích chỉ số thể thao. Mặc dù cấu trúc lệnh trông có vẻ đơn giản, nhưng quá trình hoạt động bên dưới lại khá phức tạp do tốn nhiều thời gian để tìm nạp, phân tích cú pháp và tải dữ liệu từ trang web thông qua kỹ thuật cào dữ liệu.

Bản chất của việc cào dữ liệu

Cào dữ liệu web về cơ bản là quá trình trích xuất thông tin tự động từ các trang web. Phần lớn các trang web có quy định bản quyền ngăn cấm việc phân phối lại dữ liệu thu thập được, nhưng bạn thường được phép lưu trữ một bản sao trên máy tính cá nhân để phục vụ mục đích nghiên cứu độc lập. Đây cũng chính là quy định của NFL. Do đó, người dùng phải tự chạy lệnh cào dữ liệu trên máy tính của mình.

1nfl2stata scrape, season(_all)

Lệnh trên sẽ quét toàn bộ dữ liệu từ năm 2009 cho đến năm hiện tại và lưu chúng dưới dạng các tập dữ liệu Stata vào thư mục nội bộ. Quá trình này tiêu tốn rất nhiều tài nguyên và thời gian. Tùy thuộc vào tốc độ xử lý của vi xử lý, dung lượng bộ nhớ và kết nối mạng, việc cào dữ liệu ban đầu có thể mất hàng giờ đồng hồ. Lời khuyên là bạn nên cắm máy chạy lệnh này qua đêm. Sau khi đã có cơ sở dữ liệu lịch sử, những lần cập nhật tiếp theo sẽ diễn ra nhanh hơn rất nhiều.

1nfl2stata scrape

Một điểm yếu cố hữu của phương pháp cào dữ liệu là tính thiếu ổn định. Nếu tổ chức chủ quản thay đổi định dạng trang HTML, đoạn mã lập trình sẽ lập tức báo lỗi. Ngoài ra, dữ liệu trên trang web có thể liên tục được ban tổ chức điều chỉnh lại, dẫn đến tình trạng số liệu tải về hôm nay có thể không khớp với số liệu thực tế được hiển thị trên ESPN vài tuần sau đó. Để giải quyết, bạn có thể xóa bộ nhớ đệm và cào lại dữ liệu từ đầu để đảm bảo tính đồng nhất.

Hệ thống lệnh tải dữ liệu chuyên sâu

Công cụ phân tích này tạo ra nhiều tập dữ liệu khác nhau bao gồm thông tin trận đấu, tóm tắt trận đấu, diễn biến từng pha bóng, hồ sơ cầu thủ và danh sách đội hình. Dưới đây là các cú pháp cơ bản để tải từng loại dữ liệu cụ thể vào Stata.

Để tải dữ liệu từng trận đấu:

1nfl2stata game "position" [, game_options]

Để tải tóm tắt trận đấu:

1nfl2stata gamesummary [, game_summary_options]

Để tải dữ liệu diễn biến chi tiết:

1nfl2stata playbyplay [, playbyplay_options]

Để tải dữ liệu riêng của từng cầu thủ:

1nfl2stata player "position" [, player_options]

Để tải hồ sơ cá nhân của cầu thủ:

1nfl2stata profile [, profile_options]

Để tải danh sách đội hình:

1nfl2stata roster [, roster_options]

Để tải dữ liệu chung của toàn đội:

1nfl2stata team [, team_options]

Xử lý dữ liệu nâng cao với Stata

Trong quá trình thao tác, bạn sẽ thường xuyên sử dụng các lệnh tích hợp sẵn của Stata như sắp xếp dữ liệu theo thứ tự, tạo tập dữ liệu thống kê tóm tắt và hợp nhất nhiều tập dữ liệu lại với nhau để đưa ra kết luận tổng thể.

Ví dụ, để tìm xem cầu thủ nào dẫn đầu giải đấu về tổng số yard nhận bóng trong năm ngoái, bạn sẽ cần gộp số liệu của nhiều trận đấu lại với nhau.

1. nfl2stata game "wide receiver", season(2017) seasontype(reg) clear
22764 observation(s) loaded
3. collapse (sum) receivingyards, by(name)
4. gsort -receivingyards
5. list in 1/5
6+----------------------------+
7     |            name   receiv~s |
8     |----------------------------|
9  1. |   Antonio Brown       1533 |
10  2. |     Julio Jones       1444 |
11  3. |    Keenan Allen       1393 |
12  4. | DeAndre Hopkins       1378 |
13  5. |    Adam Thielen       1276 |
14     +----------------------------+

Đôi khi, câu hỏi nghiên cứu đòi hỏi bạn phải hợp nhất hai tập dữ liệu riêng biệt. Chẳng hạn, để tính cân nặng trung bình của một cầu thủ chạy cánh trong chín năm qua, bạn phải ghép dữ liệu đội hình với dữ liệu hồ sơ cá nhân để đối chiếu biến số vị trí thi đấu và biến số cân nặng.

1. nfl2stata roster, clear
218299 observation(s) loaded
3. duplicates drop playerid, force
4Duplicates in terms of playerid
5(13,964 observations deleted)
6. drop team teamname seasontype
7. save temp_roster.dta, replace
8file temp_roster.dta saved
9. nfl2stata profile, clear
104335 observation(s) loaded
11. merge 1:1 playerid using temp_roster.dta
12Result                           # of obs.
13    -----------------------------------------
14    not matched                             0
15    matched                             4,335  (_merge==3)
16    -----------------------------------------
17. sum weight if position == "RB"
18Variable |        Obs        Mean    Std. Dev.       Min        Max
19-------------+---------------------------------------------------------
20      weight |        384    215.9036    14.20637        173        269

Để có cái nhìn toàn cảnh về những người dẫn đầu thống kê nhận bóng toàn giải đấu, bạn cần nối tất cả các dữ liệu tấn công vào cùng một nơi bằng cách sử dụng tập tin tạm thời.

1. nfl2stata game "quarterback", season(2017) seasontype(reg) clear
21042 observation(s) loaded
3. tempfile tmp 
4. qui save "`tmp'", replace
5. nfl2stata game "running back", season(2017) seasontype(reg) clear
62018 observation(s) loaded
7. qui append using "`tmp'"
8. qui save "`tmp'", replace
9. nfl2stata game "wide receiver", season(2017) seasontype(reg) clear
102764 observation(s) loaded
11. qui append using "`tmp'"
12. qui save "`tmp'", replace
13. nfl2stata game "tight end", season(2017) seasontype(reg) clear
141554 observation(s) loaded
15. qui append using "`tmp'"
16. collapse (sum) receivingyards, by(name position)
17. gsort -receivingyards
18. list name position receivingyards in 1/30
19+-------------------------------------------+
20     |                name   position   receiv~s |
21     |-------------------------------------------|
22  1. |       Antonio Brown         WR       1533 |
23  2. |         Julio Jones         WR       1444 |
24  3. |        Keenan Allen         WR       1393 |
25  4. |     DeAndre Hopkins         WR       1378 |
26  5. |        Adam Thielen         WR       1276 |
27     |-------------------------------------------|
28  6. |      Michael Thomas         WR       1245 |
29  7. |         Tyreek Hill         WR       1183 |
30  8. |    Larry Fitzgerald         WR       1156 |
31  9. |        Marvin Jones         WR       1101 |
32 10. |      Rob Gronkowski         TE       1084 |
33     +-------------------------------------------+

Nền tảng công nghệ

Phần cốt lõi của công cụ này được xây dựng dựa trên các plugin Java tích hợp sẵn trong Stata. Để xử lý khối lượng lớn văn bản và cấu trúc dữ liệu web, nhóm phát triển đã sử dụng kết hợp các thư viện lập trình như Gson, Jsoup và Minify. Việc áp dụng các thư viện mạnh mẽ này giúp tối ưu hóa quá trình bóc tách chuỗi ký tự và phân tích cấu trúc trang hiệu quả hơn so với việc viết mã thủ công từ đầu.

✨ Giá trị đắt giá: Kỹ năng xử lý dữ liệu thô từ internet là một trong những vũ khí mạnh mẽ nhất của nhà phân tích dữ liệu. Việc hiểu rõ bản chất của quá trình hợp nhất biến số và gom nhóm quan sát sẽ giúp bạn tự tin tái cấu trúc bất kỳ tập dữ liệu phức tạp nào.

Nếu cấu trúc trang web gốc thay đổi làm gián đoạn việc tự động lấy dữ liệu bằng Java, bạn sẽ sử dụng phương pháp thay thế nào trong Stata để tiếp tục duy trì luồng công việc cập nhật báo cáo thống kê hàng tuần của mình?


Bài viết khác
Dữ liệu hiện diện ở khắp mọi nơi. Các cơ quan chính phủ, tổ chức tài chính, trường đại học và nền tảng mạng xã hội thường cung cấp quyền truy cập dữ liệu của họ thông qua API. Hệ thống này đóng vai trò như một cầu nối, thường trả về khối dữ liệu được yêu cầu dưới định dạng tệp JSON. Việc nắm vững cách sử dụng Python để gửi các truy vấn API và xử lý dữ liệu JSON thu được ngay bên trong môi trường Stata là một kỹ năng cực kỳ hữu ích cho quá trình phân tích dữ liệu hiện đại. Khái quát về cấu trúc API và định dạng JSON API là một phần mềm trung gian cho phép hệ thống của bạn yêu cầu dữ liệu từ một hệ thống máy tính khác. Cú pháp truy vấn thường mang tính đặc thù tùy thuộc vào từng hệ thống cung cấp, nhưng một cấu trúc điển hình luôn bắt đầu bằng một URL theo sau là các tùy chọn tham số. Bài viết này sẽ lấy ví dụ về việc sử dụng hệ thống openFDA để truy xuất dữ liệu về các biến cố bất lợi của thuốc từ Cục Quản lý Thực phẩm và Dược phẩm Hoa Kỳ. Chúng ta hoàn toàn có thể thêm các điều kiện lọc vào lời gọi API để thu hẹp phạm vi dữ liệu trả về. Dữ liệu này hiển thị dưới dạng JSON, một định dạng lưu trữ phổ biến được cấu trúc bởi tập hợp các cặp khóa và giá trị. Khóa hoạt động tương tự như một biến số trong tập dữ liệu Stata, còn giá trị chính là dữ liệu thực tế được ghi nhận.
Trong bài phân tích trước, chúng ta đã làm quen với mô hình tuyến tính tổng quát thông qua một tập dữ liệu khá đặc biệt: số ca tử vong do ngựa đá trong quân đội Phổ. Tập dữ liệu này đếm số lượng tử vong của các quân đoàn qua từng năm. Vì đây là dữ liệu đếm, chúng ta đã điều chỉnh mô hình tuyến tính để sử dụng phân phối Poisson, đồng thời áp dụng hàm liên kết log. Tuy nhiên, có một khía cạnh mà chúng ta chưa xem xét: liệu tất cả các quân đoàn có tỷ lệ tử vong giống hệt nhau không? Khám phá dữ liệu theo từng nhóm Trước tiên, chúng ta cần thiết lập môi trường trong R.
SciEco
Science for Economics
Định hướng đào tạo phân tích dữ liệu, xây dựng chính sách, tối ưu hoá danh mục tài chính cá nhân và dự báo thị trường.
Liên hệ
Địa chỉ: Số 60, ngõ 41, Phố Thái Hà, Trung Liệt, Đống Đa, Hà Nội (Google Map)
Email: science.for.economics@gmail.com
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội