messenger_logo
Liên hệ qua Messenger
SciEco

Trích xuất dữ liệu nba bằng lệnh nba2stata trong stata

I
IEFPA
Ngày viết: 08/07/2026

Việc tiếp cận và phân tích dữ liệu thể thao chuyên nghiệp đã trở nên dễ dàng hơn bao giờ hết nhờ vào các công cụ web scraping mạnh mẽ. Trong lĩnh vực khoa học dữ liệu, Stata nổi bật là một phần mềm thống kê mạnh mẽ, và khi kết hợp với các lệnh tùy chỉnh như `nba2stata`, nó cho phép các nhà phân tích nhanh chóng thu thập và khám phá các bộ dữ liệu phức tạp. Lệnh `nba2stata` được thiết kế để trích xuất dữ liệu từ https://stats.nba.com, cung cấp một cầu nối trực tiếp để nghiên cứu các khía cạnh khác nhau của bóng rổ chuyên nghiệp. Tuy nhiên, điều quan trọng cần lưu ý là kể từ tháng 11 năm 2019, lệnh này không còn hoạt động do các hạn chế từ https://stats.nba.com.

Khái Quát Về nba2stata

Lệnh `nba2stata` được phát triển bởi Chris Hassell, người trước đó đã hoàn thành lệnh `nfl2stata`. Đây là một công cụ hữu ích cho những ai muốn phân tích dữ liệu bóng rổ chuyên nghiệp trực tiếp trong môi trường Stata. Để cài đặt lệnh này, người dùng cần chạy dòng lệnh sau trong Stata:

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

Khai Thác Dữ Liệu Cầu Thủ NBA

Với `nba2stata`, việc khám phá các xu hướng trong bóng rổ trở nên đơn giản. Một ví dụ điển hình là phân tích cách cú ném ba điểm đã thay đổi cục diện trận đấu. Chúng ta có thể dễ dàng tìm ra những cầu thủ ném ba điểm tốt nhất trong một mùa giải cụ thể hoặc theo dõi hiệu suất của một cầu thủ qua nhiều năm.

Để tìm danh sách các cầu thủ ném ba điểm hiệu quả nhất từ mùa giải 2017:

1nba2stata playerstats _all, season(2017) seasontype(reg) stat(season) clear
2Processing x/543 requests
3.........x.........x.........x.........x.........50
4...
5660 observation(s) loaded
6. gsort -threepointfieldgoalsmade
7. list playername teamname threepointfieldgoalsmade in 1/10
8+----------------------------------------------------+
9     |      playername                teamname   three~de |
10     |----------------------------------------------------|
11  1. |    James Harden         Houston Rockets        265 |
12  2. |     Paul George   Oklahoma City Thunder        244 |
13  3. |      Kyle Lowry         Toronto Raptors        238 |
14  4. |    Kemba Walker       Charlotte Hornets        231 |
15  5. |   Klay Thompson   Golden State Warriors        229 |
16     |----------------------------------------------------|
17  6. | Wayne Ellington              Miami Heat        227 |
18  7. |  Damian Lillard   Portland Trailblazers        227 |
19  8. |     Eric Gordon         Houston Rockets        218 |
20  9. |   Stephen Curry   Golden State Warriors        212 |
21 10. |      Joe Ingles               Utah Jazz        204 |
22     +----------------------------------------------------+

Hoặc, để xem tỷ lệ ba điểm của một cầu thủ như Dirk Nowitzki trong năm mùa giải gần nhất:

1nba2stata playerstat "Dirk", stat(season) seasontype(reg) clear
227 observation(s) loaded
3. gsort -playerage
4. list playername playerage threepointfieldgoalpercentage in 1/5
5+-------------------------------------+
6     |    playername   playe~ge   three~ge |
7     |-------------------------------------|
8  1. | Dirk Nowitzki         40       .409 |
9  2. | Dirk Nowitzki         39       .378 |
10  3. | Dirk Nowitzki         38       .368 |
11  4. | Dirk Nowitzki         37        .38 |
12  5. | Dirk Nowitzki         36       .398 |
13     +-------------------------------------+

Phân Tích Dữ Liệu Đội Tuyển

Lệnh `nba2stata` cũng cho phép phân tích dữ liệu ở cấp độ đội tuyển, chẳng hạn như kiểm tra ảnh hưởng của tỷ lệ ba điểm đến cơ hội chiến thắng. Ví dụ dưới đây cho thấy tỷ lệ thắng của Houston Rockets trong mùa giải 2017 khi tỷ lệ ba điểm của họ cao hơn 35%.

1nba2stata teamstats "HOU", season(2017) stat(game) seasontype(reg) clear
282 observation(s) loaded
3. keep if threepointfieldgoalpercentage > .35
4(35 observations deleted)
5. tab winloss
6Win / loss |      Freq.     Percent        Cum.
7------------+-----------------------------------
8          L |          4        8.51        8.51
9          W |         43       91.49      100.00
10------------+-----------------------------------
11      Total |         47      100.00

Cơ Chế Web Scraping JSON

Không giống như việc web scraping dữ liệu NFL từ các trang HTML, dữ liệu NBA được truy cập thông qua các JSON object từ https://stats.nba.com. JSON là một định dạng dữ liệu gọn nhẹ, dễ dàng phân tích. Do đó, `nba2stata` không cần một lệnh web scrape riêng biệt mà trực tiếp trích xuất và tải dữ liệu trong quá trình hoạt động.

Quy định về bản quyền của NBA tương tự như NFL; người dùng có thể sử dụng bản sao cá nhân của dữ liệu trên máy tính cá nhân. Nếu bất kỳ nội dung nào được "sử dụng, hiển thị hoặc xuất bản" từ dữ liệu này, người dùng phải ghi công rõ ràng tới "http://www.nba.com". Một điểm khác biệt nữa là dữ liệu NBA được lưu trữ trên http://stats.nba.com có thể có từ những năm 1960, tùy thuộc vào từng đội.

Các Lệnh Con Của nba2stata

`nba2stata` có bốn lệnh con chính, cho phép người dùng truy cập các loại dữ liệu khác nhau:

* Để trích xuất dữ liệu thống kê cầu thủ:

1nba2stata playerstats name_pattern [ , playerstats_options ]

* Để trích xuất dữ liệu hồ sơ cầu thủ:

1nba2stata playerprofile name_pattern [ , playerprofile_options ]

* Để trích xuất dữ liệu thống kê đội tuyển:

1nba2stata teamstats team_adv [ , teamstats_options ]

* Để trích xuất dữ liệu danh sách đội tuyển:

1nba2stata teamroster team_adv [ , teamroster_options ]

Tương tự như `nfl2stata`, người dùng sẽ cần sử dụng các lệnh Stata khác như `collapse`, `gsort`, và `merge` để tạo thống kê, sắp xếp dữ liệu và kết hợp hai hoặc nhiều bộ dữ liệu NBA để phân tích sâu hơn.

Các Ví Dụ Nâng Cao

Một câu hỏi thú vị là trường đại học nào đã sản sinh ra nhiều cầu thủ NBA nhất. Điều này có thể dễ dàng được tìm ra bằng cách sử dụng `nba2stata` kết hợp với `collapse` và `gsort`.

1nba2stata playerprofile "_all", clear
2Processing x/4308 requests
3.........x.........x.........x.........x.........50
4...
5.........x.........x.........x.........x.........4300
6........
74308 observation(s) loaded
8. save playerprofile, replace
9file playerprofile.dta saved
10. drop if school == ""
11(114 observations deleted)
12. gen ct = 1
13. collapse (count) ct, by(school)
14. gsort -ct
15. list in 1/10
16+---------------------+
17     |         school   ct |
18     |---------------------|
19  1. |       Kentucky   97 |
20  2. |           UCLA   86 |
21  3. | North Carolina   80 |
22  4. |           Duke   70 |
23  5. |         Kansas   69 |
24     |---------------------|
25  6. |        Indiana   57 |
26  7. |     Notre Dame   55 |
27  8. |     Louisville   53 |
28  9. |        Arizona   51 |
29 10. |       Syracuse   50 |
30     +---------------------+

Do lượng dữ liệu khổng lồ, việc tải tất cả dữ liệu hồ sơ cầu thủ có thể mất khá nhiều thời gian (ví dụ, khoảng một giờ trên một số máy). Do đó, nên lưu lại dữ liệu hồ sơ cầu thủ sau khi đã trích xuất.

Một ví dụ khác là tìm đội trẻ nhất và già nhất trong NBA. Có thể sử dụng dữ liệu danh sách đội tuyển để thực hiện việc này.

1nba2stata teamroster _all, season(2017) clear
2Processing x/30 requests
3.........x.........x.........x
4502 observation(s) loaded
5. collapse (mean) age, by(teamname)
6. sort age
7. list teamname age in 1/5
8+---------------------------------+
9     |              teamname       age |
10     |---------------------------------|
11  1. |          Phoenix Suns   24.4706 |
12  2. | Portland Trailblazers   24.8125 |
13  3. |         Chicago Bulls   24.8889 |
14  4. |         Atlanta Hawks   25.2222 |
15  5. |         Brooklyn Nets   25.3529 |
16     +---------------------------------+
17. list teamname age in -5/l
18+---------------------------------+
19     |              teamname       age |
20     |---------------------------------|
21 26. |    Washington Wizards     27.75 |
22 27. |     San Antonio Spurs   28.3529 |
23 28. | Golden State Warriors   28.6667 |
24 29. |   Cleveland Cavaliers        29 |
25 30. |       Houston Rockets   29.1765 |
26     +---------------------------------+

Việc triển khai lệnh `nba2stata` chủ yếu dựa trên các Java plugin của Stata và thư viện Gson.

✨ **Giá trị đắt giá** ✨

`nba2stata` đã từng là một công cụ mạnh mẽ, giúp các nhà phân tích dữ liệu truy cập trực tiếp vào dữ liệu NBA phức tạp qua JSON, cho phép nghiên cứu chuyên sâu về hiệu suất cầu thủ, chiến lược đội tuyển và xu hướng lịch sử một cách hiệu quả trong Stata.

Câu hỏi tư duy hoặc bài tập ứng dụng

Giả sử lệnh `nba2stata` vẫn hoạt động, bạn sẽ sử dụng nó như thế nào để phân tích mối tương quan giữa tuổi trung bình của một đội và số trận thắng của họ trong một mùa giải cụ thể? Hãy phác thảo các bước Stata cần thiết.


Bài viết khác
Trong hành trình phát triển các lệnh ước lượng chuyên sâu trong Stata, việc tích hợp mã nguồn từ ngôn ngữ khác như C, C++ hay Java mở ra một thế giới mới về hiệu suất và khả năng tùy biến. Một trong những kỹ thuật mạnh mẽ nhất là viết plugin — hay còn gọi là thư viện liên kết động (DLL) — để tận dụng sức mạnh của C trong môi trường Stata. Bài viết này là phần thứ hai trong chuỗi chuyên đề “Viết một lệnh ước lượng trong Stata”, tiếp nối bài trước về việc chuẩn bị viết plugin. Ở đây, chúng ta sẽ xây dựng một plugin C thực hiện chính xác các phép tính mà hàm mymean_work() trong tệp mymean11.ado đã làm. Mục tiêu không chỉ là minh họa cách giao tiếp giữa C và Stata, mà còn cung cấp một nền tảng vững chắc cho các tính toán hiệu suất cao trong các mô hình kinh tế lượng phức tạp. Viết một plugin C đơn giản: “Hello, C!” Trước khi tiến vào tính toán thực tế, hãy bắt đầu bằng một ví dụ đơn giản: một plugin C hiển thị thông điệp “Hello from C” trong cửa sổ Stata. Mã nguồn cho myhello.ado được trình bày như sau:
Trong bài viết trước, chúng ta đã xây dựng một đường ống phân tích văn bản sử dụng quanteda. Quy trình đó tạo ra ma trận đặc trưng văn bản (DFM), áp dụng trọng số TF-IDF và đo lường sự tương đồng qua cosine similarity. Tuy nhiên, phương pháp này bộc lộ một hạn chế căn bản: cosine similarity tính trên các vector TF-IDF thưa chỉ phản ánh sự trùng lặp từ vựng, chứ không nắm bắt được ý nghĩa ngữ nghĩa. Xét ví dụ hai câu: "Người vay nợ không thực hiện nghĩa vụ trả nợ" và "Khách hàng không đáp ứng được cam kết trả nợ". Sau khi loại từ dừng, chúng không chia sẻ từ vựng nào, dẫn đến độ tương đồng TF-IDF gần như bằng 0. Dù vậy, bất kỳ аналитик nào cũng nhận ra chúng mang ý nghĩa như nhau. Giải pháp nằm ở vector nhúng dày đặc (dense embeddings) — biểu diễn thần kinh nơi các văn bản mang ý nghĩa gần nhau được ánh xạ đến các vị trí lân cận trong không gian vectơ. Nhờ đó, chúng ta có thể đo lường sự tương đồng ngữ nghĩa ngay cả khi không có từ chung. Bài viết này sẽ hướng dẫn xây dựng một đường ống Tạo sinh tăng cường truy xuất (RAG) trong R, sử dụng ragnar cho kho truy xuất và ellmer cho tương tác mô hình ngôn ngữ lớn (LLM), minh họa sức mạnh của nhúng dày đặc trong truy xuất và sinh câu trả lời. Toàn bộ quy trình chạy cục bộ nhờ Ollama.
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: [email protected]
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội