ĐƯA DỮ LIỆU KHẢO SÁT GOOGLE FORMS VÀO SPSS/PSPP
Tải tệp CSV từ Google Forms, nhập bằng Import Wizard, đổi câu trả lời thành mã số và sửa lỗi phông tiếng Việt
Bài nên đọc trước
Phần lớn khảo sát hiện nay được thu bằng Google Forms, còn dữ liệu từ phiếu giấy thường được gõ vào Excel. Cả hai đều phải được đưa vào phần mềm thống kê trước khi phân tích và đây là chỗ nhiều người gặp lỗi đầu tiên: chữ tiếng Việt biến thành ký tự lạ, toàn bộ dữ liệu nằm trong một cột, hoặc câu trả lời vẫn là chữ "Đồng ý" thay vì con số 4.
Bài viết này hướng dẫn hai con đường nhập liệu vào PSPP: từ Google Forms (câu trả lời dạng chữ, cần chuyển thành mã số) và từ Excel (đã mã hóa sẵn bằng số). Mỗi lỗi được nêu trong bài đều được tái hiện thật trên PSPP 2.0 (Free Software Foundation, 2023) với file mẫu đi kèm, để bạn nhận ra ngay khi gặp. Ví dụ tiếp tục dùng khảo sát về ý định mua lại trên sàn X ở các bài trước, với 40 phiếu đầu tiên của bộ dữ liệu mẫu.
Dữ liệu mẫu. Dữ liệu và script dùng trong bài nằm ở thư mục
07-nhap-du-lieu-google-forms-vao-spsscủa kho dữ liệu mẫu trên GitHub. Muốn tải cả kho, bấm Code > Download ZIP rồi giải nén và giữ nguyên cấu trúc thư mục.
1. Chọn con đường nhập liệu
Con đường nhập liệu phụ thuộc vào dạng dữ liệu bạn đang có. Hình 1 so sánh hai con đường.

Hình 1. Google Forms cho câu trả lời dạng chữ nên cần thêm bước chuyển thành số; dữ liệu Excel đã mã hóa sẵn chỉ cần nhập đúng bảng mã và dấu phân cách.
PSPP không đọc trực tiếp file .xlsx. Lệnh GET DATA của PSPP chỉ nhận file văn bản (TXT, CSV), bảng tính ODS của LibreOffice, bảng tính Gnumeric và cơ sở dữ liệu PostgreSQL (GNU Project, n.d.). Vì vậy dữ liệu từ Excel phải được lưu sang CSV hoặc ODS trước. SPSS thì mở được file .xlsx trực tiếp (File > Open > Data), nhưng các vấn đề về tên biến, câu trả lời dạng chữ và bảng mã trong bài này vẫn xảy ra y hệt khi bạn đi qua CSV.
Trước khi nhập, hãy chắc rằng bạn đã có bảng mã hóa như hướng dẫn trong bài khai báo và mã hóa biến. Bảng mã hóa cho biết câu trả lời "Đồng ý" phải trở thành số mấy, biến tên là gì và giá trị thiếu được ghi thế nào.
2. Nhập dữ liệu từ Google Forms
Google Forms là công cụ khảo sát trực tuyến được học viên dùng nhiều nhất. Phần này đi từ việc tải tệp phản hồi đến bộ dữ liệu đã mã hóa thành số.
Tải phản hồi về dưới dạng CSV
Theo hướng dẫn của Google (n.d.), có hai cách lấy toàn bộ phản hồi:
- Tải trực tiếp: mở biểu mẫu, chọn thẻ Câu trả lời (Responses), bấm dấu ba chấm (More) rồi chọn Tải câu trả lời xuống (.csv). Google tải về một file nén chứa file CSV.
- Qua Google Sheets: ở thẻ Câu trả lời, bấm biểu tượng Liên kết với Trang tính (Link to Sheets). Trong trang tính vừa tạo, chọn Tệp > Tải xuống > Giá trị được phân tách bằng dấu phẩy (.csv).
Cả hai cách đều cho file CSV mã hóa UTF-8, nên chữ tiếng Việt không bị lỗi nếu bạn khai báo đúng bảng mã khi nhập. Cách thứ hai tiện hơn khi khảo sát còn đang chạy, vì trang tính tự cập nhật phản hồi mới.
Ba đặc điểm của file Google Forms cần xử lý
Mở file phan_hoi_google_forms.csv đi kèm bài viết, bạn sẽ thấy file này khác xa một file dữ liệu sẵn sàng phân tích (Bảng 1):
Bảng 1. Ba đặc điểm của tệp Google Forms và hệ quả khi nhập.
| Đặc điểm | Ví dụ trong file | Hệ quả khi nhập |
|---|---|---|
| Dòng tiêu đề là nguyên văn câu hỏi | "Trong 6 tháng qua, bạn đã mua hàng trên sàn X chưa?" | Tên biến tự sinh rất dài, khó dùng trong cú pháp |
| Câu hỏi dạng lưới ghép tên câu hỏi với phát biểu | "Mức độ đồng ý của bạn với các phát biểu sau [Tôi hài lòng với sàn X]" | 21 biến có phần đầu giống hệt nhau |
| Câu trả lời là chữ | "Hoàn toàn đồng ý", "Nữ", "Dưới 10 triệu" | Biến có kiểu String, không tính được trung bình hay tương quan |
Cột "Dấu thời gian" (thời điểm gửi phiếu) cũng có mặt ở cột đầu tiên. Nên giữ cột này: nó giúp phát hiện phiếu trả lời quá nhanh hoặc phiếu gửi trùng lặp ở bước làm sạch dữ liệu.
Nhập bằng Import Wizard
Import Wizard là cách trực quan nhất để xem file trông như thế nào trong PSPP. Chọn File > Import Data, rồi làm lần lượt năm bước:
Bước 1. Chọn file và bảng mã. Gõ hoặc chọn đường dẫn đến file CSV (1). Ở ô Character Encoding (2), để mặc định Automatically Detect thường đúng với file UTF-8 của Google. Nếu chữ có dấu bị lỗi ở bước sau, quay lại đây và chọn Unicode (UTF-8) (Hình 2).

Hình 2. Bước Select File to Import: đường dẫn file (1) và ô chọn bảng mã ký tự (2).
Bước 2. Chọn số phiếu cần nhập. PSPP báo file có 41 dòng văn bản (1 dòng tiêu đề và 40 phiếu). Giữ All cases để nhập toàn bộ (Hình 3).

Hình 3. Bước Select the Lines to Import: chọn All cases để nhập tất cả các phiếu.
Bước 3. Chọn dòng dữ liệu đầu tiên. Đánh dấu ô Line above selected line contains variable names (1), rồi bấm chọn dòng 2, tức dòng phiếu đầu tiên (dòng được tô màu). Nếu bạn chỉ đánh dấu ô mà không bấm chọn dòng, bảng xem trước ở bước sau sẽ trống (Hình 4).

Hình 4. Bước Select the First Line: dòng 1 chứa tên câu hỏi, dữ liệu bắt đầu từ dòng 2.
Bước 4. Chọn dấu phân cách. File Google Forms dùng dấu phẩy (Comma) để ngăn các cột và dấu ngoặc kép (Double quote) để bao các ô có chứa dấu phẩy, ví dụ câu hỏi "Trong 6 tháng qua, bạn đã mua...". Bảng Fields Preview bên dưới phải hiện mỗi câu hỏi ở một cột riêng (Hình 5).

Hình 5. Bước Choose Separators: dấu phẩy ngăn cột, dấu ngoặc kép bao nội dung có dấu phẩy.
Bước 5. Kiểm tra định dạng biến. PSPP đoán kiểu của từng biến (cột Type). Các câu trả lời chữ đều là String, tuổi và số lần mua là Numeric. Bấm Paste (2) thay vì Apply: PSPP sẽ đóng hộp thoại và mở cửa sổ Syntax chứa lệnh nhập dữ liệu tương ứng, để bạn lưu lại và chạy lại khi cần (Hình 6).

Hình 6. Bước Adjust Variable Formats: kiểu biến do PSPP tự đoán (khung đỏ) và nút Paste (2).
Lệnh mà wizard sinh ra cho thấy rõ vấn đề: tên biến được lấy nguyên từ câu hỏi và 21 câu Likert chỉ khác nhau ở hậu tố _A, _B, ... _T (Hình 7).

Hình 7. Tên biến tự sinh từ câu hỏi dạng lưới: không thể biết biến nào là HL1, biến nào là NT4.
Kết quả trong Data View là một bộ dữ liệu toàn chữ với tên biến dài (Hình 8). Với bộ dữ liệu này, bạn chưa chạy được Cronbach's Alpha, EFA hay hồi quy.

Hình 8. Dữ liệu nhập bằng wizard: tên biến dài, câu trả lời vẫn là chữ.
Có thể đổi tên và mã hóa từng biến bằng tay trong Variable View, nhưng với 28 biến thì vừa lâu vừa dễ sai. Cách tốt hơn là dùng cú pháp.
Nhập bằng cú pháp và chuyển chữ thành số
File nhap_google_forms.sps đi kèm làm cùng lúc ba việc: nhập file với tên biến ngắn do bạn tự đặt theo bảng mã hóa, chuyển câu trả lời chữ thành mã số và kiểm tra kết quả. Đoạn đầu tiên nhập dữ liệu:
GET DATA
/TYPE=TXT
/FILE='../du-lieu/phan_hoi_google_forms.csv'
/ENCODING='UTF-8'
/ARRANGEMENT=DELIMITED
/DELCASE=LINE
/FIRSTCASE=2
/DELIMITERS=','
/QUALIFIER='"'
/VARIABLES=
THOIGIAN A19 SL1_S A10 GIOITINH_S A10 TUOI F3.0 NGHE_S A30 THUNHAP_S A40 TANSUAT F3.0
XN1_S A30 XN2_S A30 XN3_S A30 XN4_S A30 HI1_S A30 HI2_S A30 HI3_S A30
HI4_S A30 HL1_S A30 HL2_S A30 AC1_S A30 HL3_S A30 HL4_S A30 NT1_S A30
NT2_S A30 NT3_S A30 NT4_S A30 YD1_S A30 YD2_S A30 YD3_S A30 YD4_S A30.
Ba điểm cần chú ý:
FIRSTCASE=2bỏ qua dòng tiêu đề. Tên biến lấy từ danh sách/VARIABLES, theo đúng thứ tự cột trong file. Vì vậy bạn phải đối chiếu thứ tự câu hỏi trong biểu mẫu với bảng mã hóa trước khi viết danh sách này.- Mỗi biến phải có định dạng:
A30là chuỗi tối đa 30 ký tự,F3.0là số có tối đa 3 chữ số. Các câu trả lời chữ được nhập tạm vào biến có hậu tố_S(string). - Cột thời gian được nhập dưới dạng chuỗi
A19. Cách này tránh việc phần mềm hiểu nhầm ngày/tháng thành tháng/ngày.
Tiếp theo, lệnh RECODE ... INTO chuyển từng câu trả lời chữ thành mã số theo bảng mã hóa. Vì 21 câu Likert dùng chung một quy tắc, cấu trúc DO REPEAT giúp bạn chỉ viết lệnh một lần:
RECODE GIOITINH_S ('Nam'=1) ('Nữ'=2) ('Khác'=3) INTO GIOITINH.
DO REPEAT CHU = XN1_S XN2_S XN3_S XN4_S HI1_S HI2_S HI3_S HI4_S HL1_S HL2_S AC1_S
HL3_S HL4_S NT1_S NT2_S NT3_S NT4_S YD1_S YD2_S YD3_S YD4_S
/SO = XN1 XN2 XN3 XN4 HI1 HI2 HI3 HI4 HL1 HL2 AC1
HL3 HL4 NT1 NT2 NT3 NT4 YD1 YD2 YD3 YD4.
RECODE CHU ('Hoàn toàn không đồng ý'=1) ('Không đồng ý'=2) ('Trung lập'=3)
('Đồng ý'=4) ('Hoàn toàn đồng ý'=5) INTO SO.
END REPEAT.
EXECUTE.
Chuỗi trong dấu nháy phải khớp từng ký tự với câu trả lời trong file, kể cả chữ hoa và dấu. Câu trả lời nào không khớp sẽ trở thành giá trị thiếu mà không có thông báo lỗi. Đó là lý do cần bước kiểm tra ngay sau đó:
COUNT CHUA_MA = XN1 TO YD4 (SYSMIS).
COUNT O_TRONG = XN1_S TO YD4_S ('').
COMPUTE LOI_MA = CHUA_MA - O_TRONG.
FREQUENCIES LOI_MA /STATISTICS=NONE.
CHUA_MA đếm số câu Likert bị thiếu sau khi mã hóa, O_TRONG đếm số ô người trả lời thực sự bỏ trống. Nếu hai con số bằng nhau (LOI_MA = 0 ở mọi phiếu) thì không có câu trả lời nào bị mất do sai chính tả. Với file mẫu, cả 40 phiếu đều có LOI_MA = 0.
Phần cuối file cú pháp giữ lại các biến số theo đúng thứ tự bảng hỏi bằng MATCH FILES /KEEP, gán nhãn giá trị, khai báo cấp độ đo lường và lưu thành file google_forms_da_ma_hoa.sav. Kết quả là bộ dữ liệu sẵn sàng phân tích, giống hệt bộ dữ liệu mẫu trong bài khai báo biến (Hình 9).

Hình 9. Sau khi chạy nhap_google_forms.sps: tên biến ngắn theo bảng mã hóa, câu trả lời đã thành mã số. Ô trống ở phiếu 13 là câu người trả lời bỏ qua.
Cảnh báo: không dùng AUTORECODE cho thang Likert
PSPP và SPSS có lệnh AUTORECODE (menu Transform > Automatic Recode) tự gán số cho các câu trả lời chữ. Lệnh này trông tiện nhưng gán số theo thứ tự bảng chữ cái, không theo mức độ đồng ý. Chạy thử trên câu XN1 của file mẫu cho kết quả (Bảng 2):
Bảng 2. Mã đúng theo thang đo so với mã do AUTORECODE gán.
| Câu trả lời | Mã đúng theo thang đo | Mã do AUTORECODE gán |
|---|---|---|
| (bỏ trống) | Giá trị thiếu | 1 |
| Hoàn toàn đồng ý | 5 | 2 |
| Không đồng ý | 2 | 3 |
| Trung lập | 3 | 4 |
| Đồng ý | 4 | 5 |
Thứ tự đã bị xáo trộn hoàn toàn: "Hoàn toàn đồng ý" nhận mã thấp hơn "Không đồng ý" và ô trống trở thành một mức trả lời. Mọi phân tích sau đó (trung bình, Cronbach's Alpha, tương quan) đều sai mà không có cảnh báo nào. Với thang thứ bậc, luôn dùng RECODE với quy tắc viết rõ như trên.
3. Nhập dữ liệu từ Excel
Phiếu giấy thường được nhập vào Excel theo bảng mã hóa, nên dữ liệu đã là số. Việc còn lại là lưu đúng định dạng để PSPP đọc được.
Chuẩn bị bảng Excel
Khi nhập phiếu giấy vào Excel, hãy nhập theo cấu trúc mà phần mềm thống kê đọc được ngay (Pallant, 2020):
- Một dòng là một phiếu, một cột là một biến. Dòng đầu tiên chứa tên biến theo bảng mã hóa (ID, SL1, GIOITINH, ..., YD4), không có tiêu đề hay dòng trống phía trên.
- Nhập mã số, không nhập chữ. Gõ 4 thay vì "Đồng ý", 2 thay vì "Nữ".
- Để trống ô khi người trả lời bỏ câu, hoặc dùng mã giá trị thiếu đã quy định trong bảng mã hóa.
- Không gộp ô, không tô màu để mang thông tin. Màu sắc và ô gộp đều mất khi lưu sang CSV.
- Chỉ một trang tính. Khi lưu thành CSV, Excel chỉ lưu trang tính đang mở (Microsoft, n.d.).
Lưu thành CSV UTF-8 (khuyến nghị)
Trong Excel, chọn File > Save As, ở mục kiểu file chọn CSV UTF-8 (Comma delimited) (*.csv). Lựa chọn này có trong Microsoft 365 và các bản Excel mới (Excel 2019 trở lên). Sau đó nhập vào PSPP bằng Import Wizard như mục 2, hoặc bằng cú pháp (tình huống 1 trong file nhap_excel.sps):
GET DATA /TYPE=TXT /FILE='../du-lieu/du_lieu_excel_utf8.csv' /ENCODING='UTF-8'
/ARRANGEMENT=DELIMITED /DELCASE=LINE /FIRSTCASE=2 /DELIMITERS=','
/VARIABLES=
ID F4.0 SL1 F1.0 GIOITINH F1.0 TUOI F3.0 NGHE F1.0 THUNHAP F1.0 TANSUAT F3.0
XN1 F1.0 XN2 F1.0 XN3 F1.0 XN4 F1.0 HI1 F1.0 HI2 F1.0 HI3 F1.0
HI4 F1.0 HL1 F1.0 HL2 F1.0 AC1 F1.0 HL3 F1.0 HL4 F1.0 NT1 F1.0
NT2 F1.0 NT3 F1.0 NT4 F1.0 YD1 F1.0 YD2 F1.0 YD3 F1.0 YD4 F1.0.
LIST /VARIABLES=ID SL1 GIOITINH TUOI XN1 YD4 /CASES=FROM 1 TO 3.
Danh sách /VARIABLES phải liệt kê đủ mọi cột trong file, theo đúng thứ tự. Nếu thiếu cột, PSPP in ra hàng loạt cảnh báo "Record ends in data not part of any field" và dừng xử lý khi số cảnh báo vượt quá 100.
Lỗi font tiếng Việt: file CSV thường dùng bảng mã Windows-1258
Nếu bạn chọn kiểu CSV (Comma delimited) thay vì CSV UTF-8, Excel trên Windows tiếng Việt sẽ lưu file bằng bảng mã Windows-1258. Số liệu không bị ảnh hưởng, nhưng mọi ô có chữ tiếng Việt (nhãn, ghi chú, câu trả lời mở) sẽ bị lỗi khi phần mềm đọc file theo UTF-8. File mẫu du_lieu_excel_ansi.csv có thêm cột GHICHU để bạn tự kiểm chứng (Bảng 3):
Bảng 3. Giá trị biến GHICHU theo bảng mã dùng để đọc tệp.
| Cách đọc file | Giá trị GHICHU hiển thị |
|---|---|
| Đọc theo UTF-8 | Kha?ch quen, Kha?ch m??i |
| Đọc theo windows-1258 | Khách quen, Khách mới |
Có hai cách sửa:
- Lưu lại file bằng kiểu CSV UTF-8 (cách nên làm).
- Khai báo đúng bảng mã khi nhập: chọn Character Encoding là Vietnamese (Windows-1258) trong wizard, hoặc dùng
/ENCODING='windows-1258'trong cú pháp (tình huống 2 trong filenhap_excel.sps).
Dữ liệu dồn vào một cột: dấu phân cách là dấu chấm phẩy
Excel lấy dấu phân cách cột từ thiết lập vùng (Region) của Windows. Nếu máy dùng định dạng số kiểu Việt Nam, tức dấu phẩy là dấu thập phân, Excel sẽ ngăn các cột bằng dấu chấm phẩy (Microsoft, n.d.). Đọc file này với dấu phẩy, PSPP coi cả dòng là một giá trị. Kết quả là thông báo "Data for variable ID is not valid as format F: Number followed by garbage", hơn 100 cảnh báo và mọi giá trị đều bị thiếu.
Cách nhận biết rất đơn giản: mở file CSV bằng Notepad. Nếu thấy ID;SL1;GIOITINH;... thì đó là file dùng dấu chấm phẩy. Cách sửa là chọn Semicolon ở bước Choose Separators của wizard, hoặc dùng /DELIMITERS=';' trong cú pháp (tình huống 3 trong file nhap_excel.sps).
Lưu thành ODS và nhập trực tiếp
Một cách tránh được cả hai lỗi trên là lưu bảng tính sang định dạng ODS: trong Excel chọn File > Save As > OpenDocument Spreadsheet (*.ods), hoặc mở file trong LibreOffice Calc rồi lưu. PSPP đọc file ODS trực tiếp, lấy dòng đầu làm tên biến:
GET DATA /TYPE=ODS /FILE='../../du-lieu-mau/du_lieu_mau_san_x.ods' /READNAMES=ON.
Cách này không cần khai báo từng biến, nhưng PSPP gán định dạng mặc định F8.2 cho mọi cột số, nên giá trị hiển thị là 1.00, 2.00. Bạn chỉnh lại bằng lệnh FORMATS và khai báo nhãn, giá trị thiếu như trong bài khai báo biến.
4. Kiểm tra dữ liệu ngay sau khi nhập
Dù nhập bằng cách nào, hãy kiểm tra bốn điểm trước khi lưu file .sav:
- Đối chiếu số phiếu. Số dòng trong Data View phải bằng số phản hồi trên Google Forms hoặc số phiếu đã nhập. File mẫu có 40 phiếu.
- Đối chiếu vài phiếu đầu. So 3 đến 5 phiếu đầu với file gốc. Lệnh
LIST /CASES=FROM 1 TO 5in nhanh các phiếu này. - Xem khoảng giá trị. Lệnh
DESCRIPTIVES XN1 TO YD4.cho biết giá trị nhỏ nhất và lớn nhất. Câu Likert 5 mức mà có giá trị 0 hoặc 55 là lỗi nhập liệu, sẽ được xử lý ở bước làm sạch dữ liệu. - Xem kiểu biến. Lệnh
DISPLAY DICTIONARY.liệt kê kiểu của từng biến. Biến Likert mà còn là String (A) thì chưa được mã hóa.
Năm lỗi thường gặp
Các lỗi dưới đây đều đã được tái hiện trên PSPP với tệp mẫu của bài.
- Mở file .xlsx trực tiếp trong PSPP. PSPP không hỗ trợ định dạng này. Hãy lưu sang CSV UTF-8 hoặc ODS.
- Lưu bằng kiểu CSV thường khiến chữ tiếng Việt bị lỗi. Hãy chọn CSV UTF-8, hoặc khai báo bảng mã windows-1258 khi nhập.
- Không để ý dấu phân cách trên máy dùng định dạng vùng Việt Nam, khiến toàn bộ dữ liệu dồn vào một cột.
- Dùng AUTORECODE cho thang Likert, làm thứ tự mã số đi theo bảng chữ cái thay vì mức độ đồng ý.
- Gõ sai chính tả trong RECODE ("Dong y", "đồng ý" viết thường), khiến câu trả lời bị chuyển thành giá trị thiếu mà không có thông báo nào. Luôn chạy bước kiểm tra
LOI_MA.
Tài liệu tham khảo
Free Software Foundation. (2023). GNU PSPP (Version 2.0.0) [Computer software]. https://www.gnu.org/software/pspp/
GNU Project. (n.d.). GNU PSPP manual. Retrieved October 29, 2026, from https://www.gnu.org/software/pspp/manual/
Google. (n.d.). View & manage form responses. Google Docs Editors Help. Retrieved October 29, 2026, from https://support.google.com/docs/answer/139706
Microsoft. (n.d.). Import or export text (.txt or .csv) files. Microsoft Support. Retrieved October 29, 2026, from https://support.microsoft.com/en-us/office/import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba
Pallant, J. (2020). SPSS survival manual: A step by step guide to data analysis using IBM SPSS (7th ed.). Routledge. https://doi.org/10.4324/9781003117452