1. Mục tiêu học tập
Bài 2A bắt đầu phần thực hành với Stata. Mục tiêu không chỉ là tạo ra một file dữ liệu về sản xuất lúa của Việt Nam. Quan trọng hơn, sinh viên cần hiểu cách FAOSTAT tổ chức dữ liệu, cách lấy dữ liệu bằng Bulk Downloads và cách biến một file dữ liệu thô thành dataset có thể sử dụng cho nghiên cứu.
- Phân biệt Data Explorer, dataset code và Bulk Downloads.
- Biết cách lấy file All Data và tải trực tiếp bằng Stata.
- Biết đọc cấu trúc Area, Item, Element, Year, Unit và Value.
- Biết tìm Area Code, Item Code và Element Code từ dữ liệu thay vì học thuộc.
- Biết sử dụng reshape để chuyển dữ liệu về cấu trúc phù hợp.
- Biết kiểm tra dataset trước khi lưu và sử dụng cho phân tích.
- Có thể áp dụng cùng tư duy cho Trade, Prices, Inputs, Investments, Food Value Chain, Climate Change và các domain khác.
2. Dataset được sử dụng trong bài
Tình huống của bài này là sản xuất lúa tại Việt Nam giai đoạn 1990–2024. Đây là giai đoạn nghiên cứu được thống nhất cho khóa học khi dữ liệu cho phép. Dữ liệu được lấy từ FAOSTAT, domain Production, dataset Crops and livestock products, mã QCL. Ba chỉ tiêu được giữ lại là diện tích thu hoạch, sản lượng và năng suất.


3. Quy tắc chung khi khai thác FAOSTAT Bulk Downloads
Trước khi viết lệnh Stata, cần hiểu cách truy cập dữ liệu FAOSTAT. Đây là phần có tính tổng quát nhất của bài. Khi chuyển từ Production sang Trade, Prices, Pesticides Use, Investments hay Climate Change, nội dung của dataset sẽ thay đổi, nhưng logic tìm dataset, đọc metadata, lấy Bulk file và kiểm tra dữ liệu vẫn được giữ nguyên.
3.1. Phân biệt Data source, Data Explorer và Bulk Downloads
Data source là nguồn dữ liệu được sử dụng trong nghiên cứu. Trong bài này, nguồn dữ liệu là FAOSTAT – Production – Crops and livestock products (QCL). Data Explorer là giao diện web dành cho người sử dụng. Tại đó, chúng ta có thể chọn quốc gia, sản phẩm, chỉ tiêu và năm để xem dữ liệu, sau đó là tải về dưới dạng CSV hoặc XLS.


Bulk Downloads có chức năng khác. Đây là nơi cung cấp các file dữ liệu lớn dưới dạng ZIP để tải trực tiếp. Khi muốn Stata tự động tải dữ liệu, chúng ta cần direct URL của file trong Bulk Downloads, chứ không dùng URL của trang Data Explorer. Lưu ý rằng URL của Data Explorer là địa chỉ của một trang web. Direct URL của Bulk Download là địa chỉ của file dữ liệu.
Để biết Direct URL ta trỏ vào All Data và ở thanh trạng thái ở dưới cùng sẽ hiện Địa Chỉ:

3.2. Dataset code không phải là quy tắc đặt tên Bulk file
FAOSTAT sử dụng các mã như QCL, TCL, PP, RP, IG, IC, FDI, GFDI và GT để nhận diện dataset. Các mã này rất hữu ích khi tìm dataset trên Data Explorer, nhưng không nên dùng chúng để tự suy đoán tên file ZIP hoặc đường dẫn Bulk Download.
Quy trình an toàn là: trước hết xác định đúng dataset trên Data Explorer; tiếp theo đọc metadata để hiểu nội dung; sau đó vào Bulk Downloads và lấy đúng file All Data. Direct URL lấy được từ bước này mới được đưa vào lệnh copy của Stata.
Nhắc lại: Trong trang Bulk Downloads của FAOSTAT, khi đưa con trỏ chuột lên liên kết All Data, trình duyệt sẽ hiển thị địa chỉ đích của liên kết ở thanh trạng thái phía dưới. Địa chỉ đó chính là Direct URL mà ta có thể dùng cho lệnh copy trong Stata.
3.3. Vì sao ưu tiên All Data?
Một số dataset FAOSTAT cung cấp cả All Data và All Data Normalized. Trong hướng dẫn này, khi phù hợp, chúng ta ưu tiên All Data vì bạn có thể quan sát cấu trúc dữ liệu gốc và trực tiếp thực hành quá trình reshape trong Stata.
Với QCL All Data, các năm được trải thành nhiều cột như Y1990, Y1991, …, Y2024; các cột Flag và Note có thể nằm xen kẽ. Sau khi import, sinh viên sẽ tự chuyển cấu trúc wide này sang long. Bản Normalized có thể được giới thiệu sau như một lựa chọn khi muốn lấy dữ liệu đã được tổ chức gần với dạng long.
3.4. Cách đọc một dataset FAOSTAT
Khi mở một dataset FAOSTAT mới, không nên bắt đầu bằng câu hỏi ‘lệnh Stata nào phải chạy?’. Trước hết cần hiểu đơn vị quan sát và các dimensions của dataset. Một khung tư duy rất hữu ích là Area – Item – Element – Year – Unit – Value.

Khung trên là cách tư duy chung, không có nghĩa mọi dataset FAOSTAT có cấu trúc vật lý hoàn toàn giống nhau. Ví dụ Item trong QCL có thể là Rice, trong khi Item của Pesticides Use có thể là một nhóm thuốc bảo vệ thực vật. Vì vậy, metadata và cấu trúc thực tế của từng dataset luôn phải được kiểm tra.
4. Hiểu cấu trúc file QCL All Data
Bây giờ áp dụng quy tắc chung vào QCL. Trong file All Data của QCL, một dòng về cơ bản đại diện cho một tổ hợp Area × Item × Element. Thông tin nhận diện như Area, Item, Element và Unit nằm ở đầu dòng; các giá trị theo năm được trải ngang thành nhiều cột.

Cấu trúc này được gọi là wide theo năm. Để phân tích chuỗi thời gian thuận tiện hơn, sau này chúng ta sẽ chuyển các cột năm thành một biến year và một biến value.
5. Tải và import dữ liệu vào Stata
Sau khi xác định đúng dataset Crops and livestock products (QCL), bước tiếp theo là lấy Direct URL của file All Data để Stata có thể tải dữ liệu trực tiếp từ máy chủ FAOSTAT.
5.1. Xác định Direct URL
Trên trang Bulk Downloads của FAOSTAT, tìm dataset cần sử dụng và đưa con trỏ chuột vào liên kết All Data. Địa chỉ đích của file sẽ xuất hiện trên thanh trạng thái ở phía dưới trình duyệt. Có thể nhấp chuột phải vào All Data và chọn Copy link address để sao chép Direct URL.
Cách này giúp xác định chính xác địa chỉ file cần tải. Không nên suy đoán Direct URL từ Dataset Code vì mã dataset, chẳng hạn QCL, không nhất thiết trùng với tên file trong hệ thống Bulk Downloads.
Đối với dataset QCL, Direct URL của All Data như sau:
https://bulks-faostat.fao.org/production/Production_Crops_Livestock_E_All_Data.zip
5.2. Tạo thư mục tạm để chứa dữ liệu tải về
Thay vì tải và giải nén tất cả các files trực tiếp vào thư mục làm việc chính, bài thực hành tạo một thư mục tạm có tên QCL. Thư mục này chỉ dùng để chứa file ZIP và các files được giải nén từ FAOSTAT.
clear all
set more off
cd “D:\Stata\FAOSTAT”
capture mkdir “QCL”
Lệnh mkdir tạo thư mục mới. Tiền tố capture giúp do-file tiếp tục chạy nếu thư mục QCL đã tồn tại.
5.3. Tải file ZIP từ FAOSTAT
Sau khi xác định Direct URL, sử dụng lệnh copy để tải file từ máy chủ FAOSTAT:
local url “https://bulks-faostat.fao.org/production/Production_Crops_Livestock_E_All_Data.zip”
copy “`url'” “QCL\QCL.zip”, replace
Trong lệnh trên, “`url'” gọi địa chỉ được lưu trong local macro url; “QCL\QCL.zip” yêu cầu Stata lưu file tải về với tên QCL.zip trong thư mục tạm QCL; còn replace cho phép ghi đè nếu file cùng tên đã tồn tại.
File tải từ FAOSTAT được lưu tạm tại:
D:\Stata\FAOSTAT\QCL\QCL.zip
5.4. Giải nén file
Để các file được giải nén nằm trong chính thư mục QCL, trước hết chuyển working directory vào thư mục này:
cd “QCL”
unzipfile “QCL.zip”, replace
dir
Lệnh unzipfile giải nén QCL.zip trong working directory hiện hành. Lệnh dir cho phép kiểm tra các file vừa được giải nén.

5.5. Import file CSV vào Stata
Trong các file được giải nén, bài thực hành sử dụng file:
Production_Crops_Livestock_E_All_Data.csv
Nhớ rằng Stata phân biệt chữ thường và chữ hoa!
Import file này vào bộ nhớ của Stata bằng:
import delimited ///
“Production_Crops_Livestock_E_All_Data.csv”, ///
clear varnames(1) encoding(“UTF-8”)
Tùy chọn clear cho phép thay thế dữ liệu đang có trong bộ nhớ; varnames(1) yêu cầu Stata sử dụng dòng đầu tiên của file CSV làm tên biến; và encoding(“UTF-8”) giúp Stata đọc đúng các ký tự văn bản được mã hóa theo UTF-8.
Sau khi import thành công, toàn bộ dữ liệu QCL All Data đã được đưa vào bộ nhớ của Stata. Ở bước này chưa thực hiện lọc quốc gia, sản phẩm, chỉ tiêu hay giai đoạn nghiên cứu.
Cuối cùng, quay trở lại thư mục làm việc chính:
cd ..
Việc thay đổi working directory không ảnh hưởng đến dataset đã được import vì dữ liệu hiện đang nằm trong memory của Stata.
Thư mục QCL chỉ đóng vai trò là thư mục tạm. Sau khi hoàn tất quá trình xử lý và lưu dataset cuối cùng dưới định dạng .dta, toàn bộ thư mục này có thể được xóa để giữ thư mục làm việc chính gọn gàng.
6. Kiểm tra cấu trúc ngay sau khi import
Không nên lọc Viet Nam hoặc Rice ngay lập tức. Trước hết cần biết Stata đã đọc file như thế nào. Lệnh describe cho biết số quan sát, số biến, tên biến và kiểu dữ liệu. Lệnh list in 1/10 giúp quan sát trực tiếp mười dòng đầu.
describe
list in 1/10
Ở bước này, hãy tìm các biến areacode, area, itemcode, item, elementcode, element, unit và các biến năm như y1990. Việc kiểm tra này cũng giúp phát hiện sự khác biệt nếu FAOSTAT thay đổi cấu trúc file trong tương lai.
Hoặc
edit

7. Tìm Area Code, Item Code và Element Code
FAOSTAT sử dụng mã số để nhận diện quốc gia, sản phẩm và chỉ tiêu. Mã rất hữu ích khi filter vì thường ổn định và tránh sai khác do cách viết tên. Tuy nhiên, mục tiêu của hướng dẫn không phải là học thuộc mã. Sinh viên nên biết cách tìm mã từ chính dataset.
Với dataset lớn, không nên dùng một bảng chéo areacode với area cho toàn bộ dữ liệu vì số lượng giá trị có thể quá lớn. Cách dưới đây giữ lại từng cặp mã–tên, loại bản ghi trùng và tìm đúng đối tượng cần thiết.
** AREA CODE
- preserve
- keep areacode area
- duplicates drop
- sort areacode
- list in 1/20, noobs
- list areacode area if inrange(areacode, 230, 240), noobs
- list areacode area if area == “Viet Nam”, noobs
- restore

** ITEM CODE
- preserve
- keep itemcode item
- duplicates drop
- sort itemcode
- list if 1/20, noobs sep(0)
- restore

** ELEMENT CODE
- preserve
- keep elementcode element
- duplicates drop
- sort elementcode
- list if inlist(element, “Area harvested”, “Production”, “Yield”), noobs
- restore

Lệnh preserve tạm thời lưu trạng thái dataset hiện tại; restore đưa dataset trở về trạng thái trước preserve. Nhờ vậy, chúng ta có thể tạo bảng mã để kiểm tra mà không làm mất dữ liệu gốc đang nằm trong bộ nhớ.
Trong file sử dụng cho bài này, Viet Nam có Area Code 237 và Rice có Item Code 27.
8. Lọc đúng đối tượng nghiên cứu
Sau khi đã xác định mã, chúng ta mới lọc dataset. Trước hết giữ Viet Nam, sau đó giữ Rice. Tiếp theo, tab element cho biết QCL có những chỉ tiêu nào đối với Rice của Việt Nam. Bài này chỉ giữ Area harvested, Production và Yield.
- keep if areacode == 237
- keep if itemcode == 27
- preserve
- keep elementcode element unit
- duplicates drop
- sort elementcode
- list, noobs
Hoặc
- edit

9. Kiểm tra Flag và Note trước khi loại bỏ
Bên cạnh giá trị, FAOSTAT có thể cung cấp Flag và Note. Các trường này giúp người sử dụng hiểu thêm trạng thái, nguồn hoặc cách hình thành quan sát. Trong dataset nghiên cứu cuối cùng có thể không cần giữ toàn bộ Flag/Note, nhưng không nên xóa chúng trước khi biết chúng chứa thông tin gì.
Ở đây chúng ta kiểm tra năm 1990 như một ví dụ, đồng thời xác nhận dữ liệu đầu kỳ trước khi loại Flag và Note khỏi dataset cuối. Với một nghiên cứu yêu cầu đánh giá chất lượng dữ liệu sâu hơn, có thể cần kiểm tra flags cho toàn bộ giai đoạn.
10. Chọn các năm 1990–2024
Một điểm kỹ thuật cần chú ý là các biến y1990, y1991, … không nhất thiết nằm liền nhau trong file, vì giữa chúng có thể có các cột Flag và Note. Do đó, dùng cú pháp y1990-y2024 có thể vô tình giữ thêm những biến không mong muốn.
Cách an toàn hơn là tạo một local macro chứa chính xác danh sách biến năm cần giữ. Vòng lặp forvalues dưới đây lần lượt bổ sung y1990 đến y2024 vào macro years.
local years
forvalues y = 1990/2024 {
local years `years' y`y’
}
keep areacode area itemcode item elementcode element unit `years’
Sau lệnh keep, dataset chỉ còn các biến nhận diện cần thiết và 35 cột giá trị năm từ 2000 đến 2024. Các cột Flag và Note không còn được giữ trong dataset dùng cho bước reshape.
11. Reshape lần 1: chuyển các năm từ wide sang long
Hiện tại mỗi năm là một biến riêng. Cấu trúc này không thuận tiện cho phân tích chuỗi thời gian vì year chưa phải là một biến. Mục tiêu của reshape long là gom y1990, y1991, …, y2024 thành hai thành phần: một biến year và một biến chứa giá trị.
reshape long y, ///
i(areacode itemcode elementcode) ///
j(year)
rename y value
Sau reshape, mỗi dòng đại diện cho một tổ hợp Area × Item × Element × Year. Ví dụ Production của Rice năm 1990 và Production của Rice năm 1991 trở thành hai dòng khác nhau. Biến y do reshape tạo ra được đổi tên thành value để phản ánh đúng ý nghĩa.
sort year elementcode
list area item year ///
elementcode element unit value ///
in 1/15, noobs sep(0)

12. Chuẩn hóa tên Element và xử lý strL
Ở bước tiếp theo, chúng ta muốn biến ba Element thành ba biến riêng: area_harvested, production và yield. Trước khi reshape lần hai, tên Element được chuẩn hóa để trở thành tên biến Stata dễ đọc.
- replace element = “area_harvested” if element == “Area harvested”
- replace element = “production” if element == “Production”
- replace element = “yield” if element == “Yield”
- describe area item
- recast str30 area
- recast str50 item

Sau import delimited, Stata có thể lưu area hoặc item dưới dạng strL. Đây là kiểu chuỗi dài và không được phép làm key variable trong reshape wide. Vì tên quốc gia và tên commodity trong case này ngắn hơn nhiều so với giới hạn đã chọn, recast sang str30 và str50 giúp reshape hoạt động bình thường.
13. Reshape lần 2: chuyển Element thành các biến nghiên cứu
Sau reshape lần một, Area harvested, Production và Yield vẫn nằm trong cùng một biến element, còn số liệu nằm trong value. Để tạo dataset nghiên cứu thuận tiện, chúng ta muốn mỗi năm có một dòng và ba chỉ tiêu nằm ở ba cột riêng.
drop unit elementcode
reshape wide value, ///
i(areacode area itemcode item year) j(element) string
rename valuearea_harvested area_harvested
rename valueproduction production
rename valueyield yield
Kết quả là mỗi năm của Viet Nam – Rice chỉ còn một dòng, với các biến area_harvested, production và yield. Đây là cấu trúc phù hợp để lưu thành dataset time-series cho Bài 3A.

14. Đổi tên, gắn nhãn và sắp xếp biến
Tên biến nên ngắn, nhất quán và dễ hiểu. Các biến nhận diện được đổi từ tên FAOSTAT sau import sang tên phù hợp hơn với dataset nghiên cứu. Variable labels được thêm để người sử dụng vẫn nhìn thấy ý nghĩa và đơn vị khi dùng describe hoặc giao diện Data Editor.
- rename areacode country_code
- rename area country
- rename itemcode item_code
- label variable country_code “FAOSTAT Area Code”
- label variable country “Country”
- label variable item_code “FAOSTAT Item Code”
- label variable item “Item”
- label variable year “Year”
- label variable area_harvested “Rice area harvested (ha)”
- label variable production “Rice production (tonnes)”
- label variable yield “Rice yield (hg/ha)”
order country_code country item_code item year area_harvested production yield
sort year
15. Kiểm tra dataset trước khi lưu
Một dataset không nên được lưu ngay sau khi reshape. Cần thực hiện một số kiểm tra tối thiểu để chắc rằng số dòng, khoảng thời gian, tính duy nhất và missing values phù hợp với thiết kế nghiên cứu.
des

Với giai đoạn 1990–2024, ta kỳ vọng 35 quan sát năm. Trong case Rice – Viet Nam, ba chỉ tiêu Area harvested, Production và Yield có dữ liệu trong toàn bộ giai đoạn này. Lệnh isid year kiểm tra mỗi năm có xuất hiện đúng một lần hay không. Nếu lệnh báo lỗi, cần quay lại kiểm tra filter hoặc reshape thay vì tiếp tục phân tích. misstable summarize giúp xác nhận các chỉ tiêu có bị thiếu dữ liệu hay không.
16. Đồ thị kiểm tra trực quan
Ba đồ thị dưới đây chỉ nhằm kiểm tra trực quan sau quá trình chuẩn bị dữ liệu. Chúng giúp phát hiện nhanh các điểm bất thường, khoảng trống hoặc xu hướng không hợp lý. Đây chưa phải phần phân tích time series; các phép biến đổi như growth rate, index, CAGR hoặc chuyển năng suất sang tonnes/ha sẽ được thực hiện ở Bài 3A.
Diện tích và sản lượng được tạm chuyển sang million ha và million tonnes để trục tung dễ đọc hơn. Các biến chuyển đổi chỉ tồn tại bên trong preserve/restore, nên file dữ liệu cuối vẫn giữ đơn vị gốc của FAOSTAT. Xem do-file để biết các lệnh.



17. Lưu dataset hoàn chỉnh
Sau khi kiểm tra dữ liệu, compress được dùng để giảm dung lượng lưu trữ bằng cách tối ưu kiểu dữ liệu mà không làm thay đổi giá trị. Dataset sau đó được lưu theo quy tắc tên Domain_Item_Geography_Period để dễ nhận diện và thuận tiện khi xây dựng nhiều file cho Bài 4.
compress
save “Production_Rice_Vietnam_1990_2024.dta”, replace
