[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

Table of Contents

[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:

  1. https://dothanhlong.org/p1-lap-ban-do-cac-dong-ho-viet-nam-phan-1/
  2. 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

image

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

image

Kết quả

image

Xử lý dữ liệu

Nhập liệu sai giữa mã tỉnh và họ

image

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

image

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

image

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;

image

Lỗi nhập liệu Họ bằng khoảng trắng

image

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

image

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

image

image

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

image

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;

image

image

Tham khảo thêm về các họ người Việt Nam

https://vi.wikipedia.org/wiki/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ê:

image

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 8.9%
4 Phạm 5.9%
5 Hoàng / Huỳnh 5.1%
6  /  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

  1. https://vi.wikipedia.org/wiki/H%E1%BB%8D_ng%C6%B0%E1%BB%9Di_Vi%E1%BB%87t_Nam
  2. 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.
  3. https://www.postgresqltutorial.com/postgresql-string-functions/postgresql-trim-function/
  4. https://dothanhlong.org/postgresql-function-to-remove-accents-in-string/

Leave a Reply

Your email address will not be published. Required fields are marked *