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, replaceVớ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 scrapeMộ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?


