[Bản đồ họ Việt P2] Lập bản đồ các dòng họ Việt Nam phần 2 - Xử lý dữ liệu
Danh sách các phần ở đây:
- https://dothanhlong.org/p1-lap-ban-do-cac-dong-ho-viet-nam-phan-1/
- https://dothanhlong.org/ban-do-ho-viet-p2-lap-ban-do-cac-dong-ho-viet-nam-phan-2-xu-ly-du-lieu/
Sau khi xem sơ dữ liệu, khối lượng khá lớn ~ 1.3 triệu dòng, trong đó có những dòng bị lỗi đánh máy khá nhiều.
Do vậy mình quyết định sẽ đẩy hết vào Database rồi xử lý bằng SQL, chứ Excel máy mình mở không nổi file này
Database mình sẽ dùng là PostgreSQL, hệ quản trị cơ sở dữ liệu này hỗ trợ dữ liệu về không gian rất tốt
Import dữ liệu vào Database
Dữ liệu chính là thống kê số lượng dòng họ theo đơn vị hành chính có hơn 1.3 triệu dòng
Số này là quá lớn để import trực tiếp vào Database, do vậy tôi quyết định cắt nhỏ file csv này để import làm nhiều phần
https://www.splitcsv.com/receipt.html#!/order/4a912f83-b13e-4a45-ae0e-ce43ce214750
Kết quả
Xử lý dữ liệu
Nhập liệu sai giữa mã tỉnh và họ
Cập nhật lại họ bằng mã tỉnh đối với những record nhập sai. Nhưng còn mã tỉnh thật sự của những record này là gì 🤣
Update ds_ho SET ho = matinh WHERE id = 1195000;
Update ds_ho SET ho = matinh WHERE id = 967349;
Update ds_ho SET ho = matinh WHERE id = 1016072;
Update ds_ho SET ho = matinh WHERE id = 542458;
Update ds_ho SET ho = matinh WHERE id = 732201;
Để ý thì những dữ liệu này cũng không có thông tin số người luôn, mã xã cũng thiếu
Tôi quyết định bỏ những dữ liệu này ra khỏi bộ dữ liệu
Số lượng bị null
Tôi quyết định update thành
0
vì không biết có dữ liệu hay không
Update ds_ho SET songuoi = 0 WHERE songuoi is null;
Lỗi nhập liệu Họ bằng khoảng trắng
Tôi quyết định cập nhật thành
chuaxacdinh
để dễ dàng phân loại, thống kê sau này
Update ds_ho SET ho = 'chuaxacdinh' WHERE ho = ' ';
Hơn 3000 dòng bị luôn
Cơ mà không chỉ bị nhập khoảng trắng, còn có rất nhiều họ bị nhập lỗi thành chữ số hoặc các ký tự không đúng tên họ, ví dụ tôi truy vấn lấy ra các họ có 2 ký tự trở xuống trong bảng này
SELECT DISTINCT(ho) FROM ds_ho WHERE length(ho) < 3
Có rất nhiều luôn, khoảng trên 2000 cái lỗi khác nhau, chưa tính là mỗi kiểu sai vậy có rất nhiều dòng bị 😿 , hơi chua đây
SELECT DISTINCT(ho) FROM ds_ho WHERE length(ho) < 3
Do vậy tôi nghĩ là sẽ xử lý trước 10 họ phổ biến nhất Việt Nam trước, các họ khác sẽ xử lý sau
https://vi.wikipedia.org/wiki/H%E1%BB%8D_ng%C6%B0%E1%BB%9Di_Vi%E1%BB%87t_Nam
Để xử lý, tôi nghĩ sẽ tạo thêm 1 trường họ không có dấu
để thuận tiện cho việc thống kê, group các lỗi đánh máy lại. Riêng những họ có thể trùng nhau khi bỏ dấu như Trịnh
với Trình
thì sẻ để ý lúc xử lý để tùy cơ ứng biến =))
Create table ds_ho_no_accent as
SELECT t1.id,
t1.matinh::integer,
t1.mahuyen::integer,
t1.maxa::integer,
t1.ho,
lower(unaccent(trim(t1.ho))) as ho_no_accent,
t1.songuoi::integer
FROM ds_ho t1;
Tham khảo thêm về các họ người Việt Nam
Danh sách 15 họ phổ biến của người Việt, trong cuốn sách "100 họ phổ biến ở Việt Nam" của Nhà xuất bản Khoa học Xã hội xuất bản năm 2022 đã thống kê:
Thống kê các họ người Việt Nam năm 2022
Thứ tự | Họ | Chữ Hán Nôm | Tỉ lệ dân số |
---|---|---|---|
1 | Nguyễn | 阮 | 31.5% |
2 | Trần | 陳 | 10.9% |
3 | Lê | 黎 | 8.9% |
4 | Phạm | 范 | 5.9% |
5 | Hoàng / Huỳnh | 黃 | 5.1% |
6 | Vũ / Võ | 武 | 4.9% |
7 | Phan | 潘 | 2.8% |
8 | Trương | 張 | 2.2% |
9 | Bùi | 裴 | 2.1% |
10 | Đặng | 鄧 | 1.9% |
11 | Đỗ | 杜 | 1.9% |
12 | Ngô | 吳 | 1.7% |
13 | Hồ | 胡 | 1.5% |
14 | Dương | 楊 | 1.4% |
15 | Đinh | 丁 | 1.0% |
Tham khảo
- https://vi.wikipedia.org/wiki/H%E1%BB%8D_ng%C6%B0%E1%BB%9Di_Vi%E1%BB%87t_Nam
- https://www.w3resource.com/PostgreSQL/length-function.php#:~:text=The%20PostgreSQL%20length()%20function,characters%20in%20the%20given%20string.&text=Example%3A%20PostgreSQL%20LENGTH()%20function,the%20given%20string%20%27w3resource%27.
- https://www.postgresqltutorial.com/postgresql-string-functions/postgresql-trim-function/
- https://dothanhlong.org/postgresql-function-to-remove-accents-in-string/