



















Preview text:
  lOMoAR cPSD| 58728417
BỘ GIÁO DỤC VÀ ĐÀO TẠO 
 TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM 
 KHOA CÔNG NGHỆ THÔNG TIN    ĐỒ ÁN CUỐI KỲ 
MÔN HỌC: LẬP TRÌNH PYTHON 
CHƯƠNG TRÌNH QUẢN LÝ SINH VIÊN ĐẠI HỌC NEW YORK 
Mã lớp học phần: [UTE] IPPA233277_06 
Học kỳ 1 – Năm học 2024 – 2025 
Giảng viên hướng dẫn: ThS. Trần Quang Khải 
Danh sách sinh viên thực hiện:  MSSV  Họ tên  23110187  Phạm Hàn Minh Chương  23110266  Nguyễn Thanh Bình Minh  23110336  Nguyễn Thị Thanh Thùy 
Thành phố Hồ Chí Minh, tháng 11 năm 2024                lOMoAR cPSD| 58728417
Nhận xét của giảng viên 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
................................................................................................................................. 
TP. Hồ Chí Minh, ngày … tháng… năm 2024  Giảng viên ký tên              lOMoAR cPSD| 58728417 MỤC LỤC 
DANH MỤC HÌNH ẢNH...................................................................................1 
DANH MỤC BẢNG............................................................................................2 
PHẦN MỞ ĐẦU..................................................................................................3  1. Lý  do  chọn  đề 
tài..........................................................................................3  2. Mục  tiêu  đề 
tài..............................................................................................3  3. Đối  tượng  và  phạm  vi  nghiên 
cứu...............................................................3  PHẦN  NỘI 
DUNG..............................................................................................5 
CHƯƠNG 1: TÓM TẮT CƠ SỞ LÝ THUYẾT...............................................5 
1.1. Giới thiệu về Python..................................................................................5 
1.1.1 Lịch sử của Python...............................................................................5 
1.1.2 Đặc điểm của Python............................................................................5 
1.2. Giới thiệu về một số thư viện phổ biến của Python................................5 
1.3 Giới thiệu Version control system (Git)....................................................6 
CHƯƠNG 2: MÔ TẢ DỮ LIỆU........................................................................8 
2.1. Nguồn gốc dữ liệu......................................................................................8 
2.2. Mô tả trường dữ liệu.................................................................................8 
2.3. Ý nghĩa bộ dữ liệu.....................................................................................9 
CHƯƠNG 3: ỨNG DỤNG VÀO XỬ LÝ DỮ LIỆU......................................10 
3.1 Thao tác Thêm, Sửa, Xóa, Cập nhật Dữ liệu (CRUD)..........................10 
3.1.1. Giới thiệu về CRUD...........................................................................10 
3.1.2. Triển khai chức năng.........................................................................10 
3.2 Làm sạch dữ liệu......................................................................................13 
3.2.1 Xử lý giá trị còn thiếu.........................................................................13 
3.2.2 Xử lý giá trị bị trùng lặp.....................................................................16 
3.2.3 Chuẩn hóa dữ liệu..............................................................................16 
3.2.4 Lưu trữ dữ liệu đã được làm sạch......................................................17 
3.3. Trực quan hóa dữ liệu.............................................................................18 
3.3.1. Biểu đồ phân bố độ tuổi.....................................................................18 
3.3.2. Phân bố quốc tịch của sinh viên NYU..............................................18 
3.3.3. Phân tích tỷ lệ giới tính giữa các sinh viên NYU.............................20 
3.3.4. Phân tích điểm học tập của sinh viên...............................................21 
3.3.5. Phân tích điểm số trung bình dựa trên những tiêu chí đánh giá....22 
3.3.6. Tương quan giữa Điểm và Các tiêu chí đánh giá............................23 
3.3.7. Mối quan hệ giữa tuổi và điểm số.....................................................24      lOMoAR cPSD| 58728417
3.3.8. Phân tích sự phân bố điểm theo từng môn học................................25 
3.3.9. Sự tương quan giữa các môn học và độ tuổi (student_function)....27 
3.4 Xử lý dữ liệu trước thống kê...................................................................28 
3.4.1 Sắp xếp dữ liệu theo điểm số giảm dần..............................................28 
3.4.2 Sắp xếp dữ liệu theo độ tuổi tăng dần................................................29 
3.5. Xây dựng giao diện và Chức năng.........................................................29 
3.5.1 Giới thiệu về giao diện và chức năng:...............................................29 
3.5.2 Thiết kế và phát triển..........................................................................30 
3.5.3 Tích hợp các chức năng......................................................................31  KẾT 
LUẬN........................................................................................................44 
TÀI LIỆU THAM KHẢO................................................................................45      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang   DANH MỤC HÌNH ẢNH 
Hình 3.1 Đoạn code thêm dữ liệu mới vào file csv............................................10 
Hình 3.2 Đoạn code đọc dữ liệu từ file csv.........................................................11 
Hình 3.3 Đoạn code cập nhật thông tin sinh viên trong file csv.........................12 
Hình 3.4 Đoạn code xóa sinh viên khỏi dataFrame dựa trên ID........................12 
Hình 3.5 Đoạn code loại bỏ record khi không chứa id.......................................13 
Hình 3.6 Đoạn code xử lý giá trị bị thiếu ở trưởng có kiểu dữ liệu Float, Int...14 
Hình 3.7 Đoạn code xử lý xử lý giá trị bị thiếu ở trường age.............................14 
Hình 3.8 Đoạn code xử lý giá trị bị thiếu ở các trưởng có kiểu dữ liệu String. .15 
Hình 3.9 Đoạn code xử lý giá trị bị trùng lặp.....................................................16 
Hình 3.10 Đoạn code chuẩn hóa giá trị của trưởng age....................................16 
Hình 3.11 Đoạn code chuẩn hóa dữ liệu ở các trường liên quan đến rating.....17 
Hình 3.12 Đoạn code lưu trữ dữ liệu đã được làm sạch vào file chỉ định.........17 
Hình 3.13 Code tạo biểu đồ phân bố độ tuổi......................................................18 
Hình 3.14 Biểu đồ phân bố độ tuổi của sinh viên đại học New York..................18 
Hình 3.15 Code tạo biểu đồ phân bố quốc tịch..................................................19 
Hình 3.16 Biểu đồ thể hiện phân bố quốc tịch của sinh viên NYU.....................19 
Hình 3.17 Code tùy chỉnh hover.........................................................................20 
Hình 3.18 Code vẽ biểu đồ tỉ lệ giới tính............................................................20 
Hình 3.19 Biểu đồ biểu diễn tỉ lệ giới tính của nhóm sinh viên NYU.................21 
Hình 3.20 Code tạo biểu đồ điểm học tập sinh viên NYU..................................21 
Hình 3.21 Biểu đồ điểm trung bình học tập trên dữ liệu sinh viên NYU............22 
Hình 3.22 Code tạo biểu đồ Điểm đánh giá cá nhân trung bình........................22 
Hình 3.23 Biểu đồ Điểm Đánh giá cá nhân trung bình......................................23 
Hình 3.24 Code vẽ biểu đồ tương quan giữa Điểm và Đánh giá cá nhân..........23 
Hình 3.25 Biểu đồ tương quan giữa Điểm và Đánh giá cá nhân của nhóm sinh 
viên trên dữ liệu..................................................................................................24 
Hình 3.26 Code tạo biểu đồ cho thấy mối quan hệ giữa tuổi và điểm số...........24 
Hình 3.27 Biểu đồ thể hiện Mối quan hệ giữa Tuổi và Điểm số.........................25      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
Hình 3.28 Code tạo biểu đồ phân bố điểm theo từng môn học...........................25 
Hình 3.29 Biểu đồ phân bố theo từng môn học..................................................26 
Hình 3.30 Code tạo ma trận tương quan............................................................27 
Hình 3.31 Biểu đồ thể hiện sự tương quan giữa tuổi và điểm các môn học.......27 
Hình 3.32 Đoạn code sắp xếp dữ liệu theo điểm trung bình giảm dần..............28 
Hình 3.33 Đoạn code sắp xếp dữ liệu tăng dần theo độ tuổi..............................29 
Hình 3.34 Giao diện đăng nhập..........................................................................31 
Hình 3.35 Code logic xử lí đăng nhập................................................................33 
Hình 3.36 Giao diện đăng kí...............................................................................34 
Hình 3.37 Code logic xử lí đăng kí.....................................................................35 
Hình 3.38 Giao diện trang chủ...........................................................................36 
Hình 3.39 Giao diện trang quản lí......................................................................37 
Hình 3.40 Giao diện thêm sinh viên....................................................................38 
Hình 3.41 Giao diện cập nhật sinh viên.............................................................39 
Hình 3.42 Giao diện xóa sinh viên......................................................................39 
Hình 3.43 Giao diện trang trực quan.................................................................40 
Hình 3.44 Giao diện trang thống kê...................................................................42 
Hình 3.45 Giao diện lọc sinh viên......................................................................42 
Hình 3.46 Giao diện hiển thị sắp xếp sinh viên theo tuổi...................................43  DANH MỤC BẢNG 
Bảng 2.1 Tóm tắt các trường của bộ dữ liệu.........................................................8  PHẦN MỞ ĐẦU 
1. Lý do chọn đề tài 
Quản lý sinh viên trong các trường học ngày nay đòi hỏi một lượng lớn nỗ 
lực và tài nguyên, đặc biệt khi số lượng sinh viên không ngừng tăng cao, bên cạnh 
đó, phương pháp thủ công không những tiêu tốn thời gian mà còn dễ dẫn đến sai 
sót, làm ảnh hưởng đến hiệu quả hoạt động của nhà trường. Để khắc phục những 
hạn chế này, việc ứng dụng công nghệ thông tin vào quản lý sinh viên trở thành 
một nhu cầu cấp thiết nhằm nâng cao hiệu quả và độ chính xác. 
Sự phát triển mạnh mẽ của công nghệ đã mở ra nhiều cơ hội trong việc tối 
ưu hóa các quy trình quản lý. Các phần mềm ứng dụng không chỉ giúp tự động 
hóa các công việc thủ công mà còn cung cấp khả năng phân tích dữ liệu và ra 
quyết định nhanh chóng. Điều này không những giảm tải công việc cho cán bộ      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
quản lý mà còn nâng cao chất lượng phục vụ sinh viên. Việc phát triển một ứng 
dụng quản lý sinh viên do đó trở thành giải pháp thiết thực, có tính khả thi cao và 
tiềm năng mở rộng. Ngoài ra, xu hướng chuyển đổi số trong giáo dục đòi hỏi các 
trường học phải liên tục cải tiến và hiện đại hóa hệ thống quản lý. Một ứng dụng 
quản lý sinh viên tích hợp không chỉ đáp ứng nhu cầu hiện tại mà còn tạo điều 
kiện cho nhà trường tiến tới quản trị thông minh, đồng bộ hóa dữ liệu và hỗ trợ 
học tập hiệu quả hơn. Tóm lại, việc chọn đề tài này không chỉ mang ý nghĩa thực 
tiễn mà còn góp phần vào quá trình chuyển đổi số và đổi mới nền giáo dục. 
2. Mục tiêu đề tài 
Mục tiêu của đề tài là thiết kế và phát triển một ứng dụng phần mềm giúp 
quản lý thông tin sinh viên một cách hiệu quả, bao gồm các chức năng như: thêm, 
xóa, sửa thông tin sinh viên; tìm kiếm; trực quan hóa dữ liệu; và tạo giao diện 
tương tác với người dùng. 
Hơn nữa, ứng dụng sẽ cung cấp các công cụ phục vụ người quản lý như 
chức năng tự động tổng hợp số liệu, thống kê hiệu suất học tập của sinh viên, và 
tích hợp tính năng báo cáo linh hoạt. Mục tiêu cụ thể là tăng độ chính xác và hiệu 
suất trong việc quản lý, giúp người dùng có thể truy cập dữ liệu nhanh chóng và  dễ dàng. 
3. Đối tượng và phạm vi nghiên cứu 
Đối tượng nghiên cứu của đề tài này là: 
• Tập dữ liệu Academic and Personal Data from NYU Students: gồm những 
thông tin về id, name, country, city, litatude, longtitude, gender, ethenic group, 
age, math grade, scienes grade, language grade, portfolio rating, coverletter  rating, refletter rating. 
• Sinh viên và cán bộ quản lý: những người tham gia vào quá trình cho ra kết 
quả của tập dữ liệu và những người dùng ứng dụng để quản lý sinh viên trên cơ  sở dữ liệu nêu trên. 
Phạm vi nghiên cứu: 
• Dựa trên tập tin tiến hành phân tích dữ liệu. 
• Đưa ra những quy trình phù hợp: Dựa trên cơ sở môn Lập trình python để 
tạo ra những bước xử lí, trực quan dữ liệu và thiết kế giao diện phù hợp.        lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang   PHẦN NỘI DUNG 
CHƯƠNG 1: TÓM TẮT CƠ SỞ LÝ THUYẾT 
1.1. Giới thiệu về Python 
Python là một ngôn ngữ lập trình được sử dụng rộng rãi trong các ứng dụng 
web, phát triển phần mềm, khoa học dữ liệu và học máy (ML). Các nhà phát triển 
sử dụng Python vì nó hiệu quả, dễ học và có thể chạy trên nhiều nền tảng khác 
nhau. Phần mềm Python được tải xuống miễn phí, tích hợp tốt với tất cả các loại 
hệ thống và tăng tốc độ phát triển. 
1.1.1 Lịch sử của Python 
Guido Van Rossum, một lập trình viên máy tính ở Hà Lan, đã tạo ra Python. 
Ông bắt đầu phát triển ngôn ngữ này vào năm 1989 tại Centrum Wiskunde & 
Informatica (CWI) và tên gọi của ngôn ngữ này được lấy cảm hứng từ chương 
trình truyền hình Monty Python's Flying Circus của đài BBC vì Guido Van 
Rossum là một người hâm mộ của chương trình này. 
* Lịch sử các phiên bản Python  • 
Guido Van Rossum cho ra mắt phiên bản đầu tiên của ngôn ngữ Python 
(phiên bản 0.9.0) vào năm 1991.  • 
Python 1.0 đã được ra mắt vào năm 1994 với các hàm mới để dễ dàng xử 
lý danh sách dữ liệu, chẳng hạn như ánh xạ, lọc và lược bỏ.  • 
Python 2.0 đã được ra mắt vào ngày 16 tháng 10 năm 2000, với các tính 
năng hữu ích mới cho lập trình viên, chẳng hạn như hỗ trợ ký tự Unicode 
và cách xử lý chi tiết một danh sách nhanh chóng hơn.  • 
Python 3.0 đã được ra mắt vào ngày 3 tháng 12 năm 2008. Phiên bản này 
bao gồm các tính năng như hàm in và hỗ trợ nhiều hơn cho việc phân chia  số và xử lý lỗi. 
1.1.2 Đặc điểm của Python 
Python là một ngôn ngữ thông dịch và hỗ trợ nhiều mô hình lập trình: 
Python là một ngôn ngữ lập trình đa mô hình (multi-paradigm), có nghĩa là nó hỗ 
trợ nhiều mô hình lập trình khác nhau:  • 
Lập trình thủ tục (Procedural Programming): mô hình lập trình truyền 
thống, trong đó chương trình được cấu trúc thành các thủ tục hoặc hàm  • 
Lập trình hướng đối tượng (Object-Oriented Programming): mô hình 
lập trình dựa trên khái niệm "đối tượng", nơi dữ liệu và các hành vi liên 
quan được nhóm lại với nhau thành các đối tượng  • 
Lập trình hàm (Functional Programming): mô hình lập trình trong đó 
các hàm được coi là các đơn vị cơ bản của việc xây dựng chương trình 
1.2. Giới thiệu về một số thư viện phổ biến của Python      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang    Pandas 
Pandas ra đời vào năm 2008 và được phát triển bởi Wes McKinney. Cái tên 
“Pandas” xuất phát từ thuật ngữ trong kinh tế lượng “Panel Data” mô tả các tập 
dữ liệu gồm các quan sát trong nhiều khoảng thời gian. Pandas được thiết kế để 
làm việc dễ dàng và trực quan với dữ liệu có cấu trúc (dạng bảng, đa chiều, có 
tiềm năng không đồng nhất) và dữ liệu chuỗi thời gian. Mục tiêu của pandas là 
trở thành khối căn bản (building block) cấp cao cơ bản cho công việc thực tế, 
phân tích dữ liệu thế giới thực trong Python, và rộng hơn là trở thành công cụ thao 
tác/phân tích mã nguồn mở mạnh mẽ và linh hoạt nhất có sẵn trong bất kỳ loại 
ngôn ngữ lập trình nào.   Matpolib 
Matplotlib là một thư viện vẽ đồ thị trong Python rất phổ biến, được sử 
dụng để tạo ra các biểu đồ và đồ thị tĩnh, động, và tương tác. Thư viện này được 
phát triển bởi John D. Hunter vào năm 2003. Thư viện này cho phép người dùng 
vẽ rất nhiều loại biểu đồ khác nhau như biểu đồ đường, biểu đồ thanh, biểu đồ 
phân tán, biểu đồ hình bánh, biểu đồ hộp và râu, cũng như nhiều loại đồ thị khác. 
Matplotlib có cấu trúc API mô-đun, giúp cho người dùng có thể dễ dàng sử dụng 
các chức năng từ cơ bản đến nâng cao. Ngoài ra, Matplotlib còn tích hợp tốt với 
nhiều thư viện khác như NumPy, Pandas, và SciPy, giúp việc xử lý và trực quan 
hóa dữ liệu trở nên dễ dàng hơn. Bên cạnh đó, thư viên cũng hỗ trợ nhiều định 
dạng đầu ra, cho phép xuất đồ thị ở nhiều thể loại file như PNG, PDF, SVG, EPS,  và PGF.   Tkinter 
Tkinter là một thư viện trong ngôn ngữ lập trình Python được sử dụng để 
tạo giao diện đồ họa người dùng (GUI). "Tkinter" là viết tắt của "Tk interface", 
một toolkit đồ họa cung cấp các công cụ để phát triển giao diện người dùng. 
Tkinter là một phần của thư viện tiêu chuẩn của Python và đã được tích hợp sẵn 
trong hầu hết các cài đặt Python và một lựa chọn phổ biến cho việc phát triển ứng 
dụng với giao diện đồ họa đơn giản trong Python. 
Các đặc điểm của Tkinter bao gồm khả năng tạo các thành phần giao diện 
như cửa sổ, nút, ô văn bản, và các widget khác để tương tác với người dùng. Bên 
cạnh đó, Tkinter cung cấp cả các sự kiện và phương thức để xử lý tương tác người 
dùng và thay đổi trạng thái của ứng dụng. Chính vì vậy, Tkinter được xem như là 
một thư viện trong Python giúp tạo ra giao diện đồ họa người dùng (GUI), hỗ trợ 
người dùng tương tác với ứng dụng một cách trực quan và dễ sử dụng nhất. 
1.3 Giới thiệu Version control system (Git) 
Git là tên gọi là một hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay 
(Distributed Version Control System – DVCS). DVCS nghĩa là hệ thống giúp mỗi 
máy tính có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được nhân 
bản (clone) từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
trên máy tính sẽ có thể ủy thác (commit) rồi đưa lên máy chủ nơi đặt kho chứa 
chính, bên cạnh đó, các mã này cũng có thể được truy cập bởi những thiết bị khác 
khi được cấp quyền. Và trong Git, thư mục làm việc trên máy tính gọi là Working 
Tree. Chính vì vậy, Git đặc biệt hữu ích trong môi trường làm việc nhóm, nơi 
nhiều người có thể làm việc trên cùng một dự án mà hạn chế xung đột hoặc tổn 
thất dữ liệu. Bên cạnh đó, để làm việc từ xa và tích hợp liên tục (CI) với Git, hiện 
nay các nền tảng như GitHub, GitLab và Bitbucket đã được thiết kế và phát triển 
môi trường hỗ trợ Git, giúp lập trình quản lý dự án dễ dàng và hiệu quả hơn.        lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
CHƯƠNG 2: MÔ TẢ DỮ LIỆU 
2.1. Nguồn gốc dữ liệu 
Tập dữ liệu dùng để thực hiện đồ án được tải từ Kaggle, dataset của Kaggle 
là tính năng hữu ích nhất vì việc tìm nguồn dữ liệu tại thời gian thực là vấn đề 
quan trọng với hầu hết các nhà khoa học dữ liệu. Việc cung cấp nguồn dữ liệu đa 
dạng tạo nên nơi để các nhà nghiên cứu, lập trình viên và chuyên gia dữ liệu chia 
sẻ và học hỏi kinh nghiệm. Thêm vào đó, các bộ dữ liệu từ Kaggle thường kèm 
theo mô tả chi tiết, giúp người dùng nắm rõ cách thức thu thập và cấu trúc dữ liệu. 
Dữ liệu được tổng hợp từ một nhóm các sinh viên với thông tin chi tiết về 
lý lịch, học vấn và các kỹ năng mềm của họ. Mỗi hàng đại diện cho một sinh viên 
và chứa các thông tin bao gồm mã sinh viên, tên, quốc tịch, thành phố, tọa độ địa 
lý, giới tính, nhóm dân tộc, tuổi và các điểm số liên quan đến các môn học cùng 
với đánh giá về portfolio, thư xin việc và thư giới thiệu. 
Việc chọn Kaggle giúp các nhóm nghiên cứu tiếp cận nhiều công cụ hỗ trợ 
phân tích và học hỏi phương pháp mới từ cộng đồng, nâng cao chất lượng nghiên  cứu tổng thể. 
2.2. Mô tả trường dữ liệu 
Thông tin chi tiết về lý lịch, học vấn và các kỹ năng mềm của sinh viên Đại 
học New York từ bộ dữ liệu bao gồm: 
Bảng 2.1 Tóm tắt các trường của bộ dữ liệu  Tên trường  Chi tiết  id 
Mã số nhận dạng duy nhất của sinh viên (Khóa chính)  name  Tên sinh viên.  nationality 
Quốc tịch của sinh viên.  city 
Thành phố nơi sinh viên sinh sống. 
latitude và longitude Tọa độ địa lý của thành phố nơi sinh viên sinh sống.  gender 
Giới tính của sinh viên.  ethnic.group 
Nhóm dân tộc của sinh viên.  age  Tuổi của sinh viên.  english.grade  Điểm môn tiếng Anh.  math.grade  Điểm môn Toán.  sciences.grade  Điểm các môn khoa học.  language.grade 
Điểm các môn ngôn ngữ khác.  portfolio.rating 
Đánh giá về portfolio của sinh viên.  coverletter.rating 
Đánh giá về thư xin việc của sinh viên.  refletter.rating 
Đánh giá về thư giới thiệu của sinh viên. 
Chương 1: Tóm tắt cơ sở lý thuyết      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
2.3. Ý nghĩa bộ dữ liệu 
Dataset này cung cấp một cái nhìn toàn diện về hồ sơ học tập và các kỹ 
năng mềm của sinh viên. Các điểm số và đánh giá không chỉ phản ánh khả năng 
học tập mà còn là những chỉ số quan trọng để đánh giá khả năng thành công của 
sinh viên trong các môi trường học thuật và công việc. Việc phân tích dữ liệu này 
có thể giúp các trường học và nhà tuyển dụng hiểu rõ hơn về các ứng viên, từ đó 
đưa ra các quyết định tuyển sinh và tuyển dụng phù hợp. 
Chương 1: Tóm tắt cơ sở lý thuyết      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
Chương 2: Mô tả dữ liệu CHƯƠNG 3: ỨNG DỤNG VÀO XỬ LÝ DỮ LIỆU 
3.1 Thao tác Thêm, Sửa, Xóa, Cập nhật Dữ liệu (CRUD) 
3.1.1. Giới thiệu về CRUD 
CRUD (Create, Read, Update, Delete) là bốn thao tác cơ bản trong việc quản lý 
dữ liệu. Trong ứng dụng này, các thao tác CRUD được áp dụng trên dữ liệu sinh 
viên được lưu trữ dưới dạng file CSV (data_clean.csv). 
- Thêm dữ liệu (Create): Cho phép người dùng thêm mới thông tin sinh viên  vàofile dữ liệu. 
- Đọc dữ liệu (Read): Hiển thị dữ liệu hiện có từ file CSV để xem hoặc chỉnhsửa. 
- Cập nhật dữ liệu (Update): Cập nhật thông tin sinh viên theo ID. 
- Xóa dữ liệu (Delete): Xóa thông tin sinh viên dựa trên ID.3.1.2. Triển khai chức 
năng  Công Cụ Sử Dụng: 
- Ngôn ngữ chính: Python. 
- Thư viện xử lý dữ liệu: Pandas, NumPy. 
3.1.2.1 Thêm dữ liệu (Create) 
Hàm create_data(student_data, file_path) thêm dữ liệu sinh viên mới vào file  CSV   
Hình 3.1 Đoạn code thêm dữ liệu mới vào file csv 
Hàm create_data thêm dữ liệu sinh viên vào tệp CSV, đảm bảo tiêu đề cột 
luôn ở đầu. Đầu tiên, hàm đọc dữ liệu hiện có từ tệp bằng cách mở tệp ở chế độ 
đọc (mode='r') và sử dụng csv.reader để chuyển đổi nội dung tệp thành danh      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
sách các hàng. Nếu tệp không tồn tại(FileNotFoundError), một danh sách rỗng 
được khởi tạo. Tiếp theo, nếu tệp chưa có dữ liệu hoặc không chứa tiêu đề, tiêu 
đề cột được thêm vào danh sách current_data. Dữ liệu sinh viên mới 
(student_data) sau đó được chèn vào cuối danh sách. Cuối cùng, hàm mở lại tệp 
ở chế độ ghi (mode='w') và sử dụng csv.writer để ghi toàn bộ dữ liệu (bao gồm 
tiêu đề và dữ liệu mới) trở lại tệp CSV. 
3.1.2.2 Đọc dữ liệu (Read) 
Hàm read_data(file_path) hiển thị nội dung dữ liệu từ file CSV.   
Hình 3.2 Đoạn code đọc dữ liệu từ file csv 
Đoạn mã này đọc dữ liệu từ tệp CSV và trả về danh sách các hàng. Đầu tiên, tệp 
CSV được mở bằng phương thức with open, sử dụng mã hóa UTF-8 và cấu hình 
để tránh thêm dòng trống không cần thiết. Sau đó, csv.reader được dùng để đọc 
từng hàng trong tệp, và tất cả các hàng được lưu vào danh sách bằng list(reader). 
Nếu tệp không chứa dữ liệu, một thông báo sẽ được hiển thị để báo rằng không 
có dữ liệu để hiển thị. Nếu xảy ra lỗi, ví dụ như tệp không tồn tại hoặc lỗi khác, 
các thông báo lỗi cụ thể sẽ được hiển thị cho người dùng bằng messagebox. 
Trong cả hai trường hợp lỗi, hàm sẽ trả về None. 
3.1.2.3 Cập nhật dữ liệu (Update) 
Hàm update_data(student_id, new_info) cập nhật thông tin sinh viên theo ID.      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang    
Hình 3.3 Đoạn code cập nhật thông tin sinh viên trong file csv 
Đoạn mã trên thực hiện việc cập nhật thông tin sinh viên trong một tệp 
CSV. Đầu tiên, hàm update_data nhận vào hai tham số: student_id (ID sinh viên 
cần cập nhật) và new_info (danh sách thông tin mới). Bằng cách sử dụng 
csv.reader, dữ liệu từ tệp CSV data_clean.csv được đọc vào dưới dạng danh sách 
các dòng. Sau đó, hàm duyệt qua từng dòng trong tệp và kiểm tra xem ID sinh 
viên có khớp với student_id hay không. Nếu tìm thấy sinh viên có ID trùng khớp, 
thông tin sinh viên sẽ được cập nhật (giữ nguyên ID và thay thế các trường còn 
lại bằng new_info). Sau khi cập nhật, hàm sẽ ghi lại dữ liệu mới vào tệp CSV 
bằng csv.writer. Nếu việc cập nhật thành công, hàm trả về True, ngược lại trả về  False. 
3.1.2.4 Xóa dữ liệu (Delete) 
Hàm delete_data (df, student_id) xóa sinh viên dựa trên ID từ DataFrame.      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang    
Hình 3.4 Đoạn code xóa sinh viên khỏi dataFrame dựa trên ID 
Đoạn mã trên thực hiện chức năng xóa sinh viên khỏi DataFrame dựa trên 
ID sinh viên. Hàm delete_data nhận vào hai tham số: df (DataFrame chứa dữ liệu 
sinh viên) và student_id (ID của sinh viên cần xóa). Đầu tiên, hàm tìm vị trí 
(index) của sinh viên có id trùng khớp với student_id trong DataFrame, sau khi 
chuyển đổi id thành chuỗi để so sánh. Nếu tìm thấy sinh viên có ID khớp, hàm sẽ 
xóa dòng dữ liệu đó bằng cách sử dụng phương thức drop và trả lại 
DataFrame đã được cập nhật. Nếu không tìm thấy sinh viên, hàm trả về None 
3.2 Làm sạch dữ liệu 
3.2.1 Xử lý giá trị còn thiếu 
Dữ liệu thiếu (hay còn gọi là Missing Data hoặc NaN trong ngôn ngữ lập 
trình) là tình trạng xảy ra khi một số giá trị trong bộ dữ liệu không có sẵn hoặc 
không được ghi nhận. Chính vì vậy, những giá trị đó sẽ ảnh hưởng đến kết quả 
phân tích cuối cùng và để giải quyết vấn đề, ta có một số cách xử lý như sau: 
 Xóa bản ghi khi bị thiếu khóa chính      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang    
Hình 3.5 Đoạn code loại bỏ record khi không chứa id 
Đoạn mã Python trên dùng để loại bỏ các bản ghi (record) trong DataFrame 
df mà không có giá trị trong cột id. Điều này được thực hiện bằng phương thức 
dropna(), với tham số subset được đặt là ['id']. Cụ thể, khi chạy dòng lệnh df = 
df.dropna(subset=['id']), DataFrame df sẽ loại bỏ tất cả các hàng mà giá trị trong  cột id là NaN. 
Nguyên nhân cần loại bỏ các bản ghi không chứa giá trị id là vì trường này 
được sử dụng như là khóa chính (primary key) trong cơ sở dữ liệu. Khóa chính là 
một thuộc tính hoặc tập hợp các thuộc tính đảm bảo mỗi bản ghi trong bảng là 
duy nhất. Nó rất quan trọng trong việc quản lý và truy xuất dữ liệu, giúp tránh 
việc có các bản ghi trùng lặp và duy trì tính toàn vẹn của dữ liệu. Vì thế, nếu có 
bất kỳ bản ghi nào không có giá trị id, tức là thiếu khóa chính, điều này có thể gây 
ra nhiều vấn đề trong quá trình quản lý dữ liệu và phân tích. Ví dụ, các bản ghi 
không có khóa chính có thể dẫn đến lỗi khi thực hiện các thao tác tìm kiếm, liên 
kết dữ liệu hoặc áp dụng các ràng buộc dữ liệu. Do đó, việc loại bỏ các bản ghi 
thiếu id là cần thiết để đảm bảo rằng mỗi bản ghi trong DataFrame đều có một 
định danh duy nhất và dữ liệu được duy trì một cách chính xác và nhất quán. 
• Thay thế giá trị còn thiếu ở dạng số bằng giá trị 0.0   
Hình 3.6 Đoạn code xử lý giá trị bị thiếu ở trưởng có kiểu dữ liệu Float, Int 
Đoạn mã Python trên xử lý giá trị thiếu trong hai loại cột khác nhau trong 
DataFrame df là các cột có giá trị dạng số thực (float) và các cột có giá trị dạng 
số nguyên (int). Đầu tiên, đoạn mã xác định một danh sách các cột số thực 
columns_float gồm latitude, longitude, english.grade, math.grade, sciences.grade, 
và language.grade. Vòng lặp for duyệt qua từng cột trong danh sách này, và nếu      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
cột đó tồn tại trong DataFrame, phương thức fillna(0.0) được sử dụng để điền tất 
cả các giá trị thiếu trong cột đó bằng giá trị 0.0. Tương tự, đoạn mã xác định một  danh  sách  các  cột  số  nguyên  columns_int  gồm 
portfolio.rating,coverletter.rating,và refletter.rating. Vòng lặp for tiếp tục kiểm tra 
sự tồn tại của từng cột trong DataFrame và sử dụng phương thức fillna(0) để điền 
các giá trị thiếu bằng giá trị 0. 
Nguyên nhân của việc điền các giá trị thiếu bằng 0.0 hoặc 0 là nhằm tránh 
ảnh hưởng tiêu cực của dữ liệu thiếu đến các phân tích thống kê và mô hình hóa 
sau này và hạn chế bị sai lệch bởi sự thiếu hụt dữ liệu. 
• Thay thế giá trị còn thiếu ở dạng số bằng giá trị trung bình hoặc trung vị   
Hình 3.7 Đoạn code xử lý xử lý giá trị bị thiếu ở trường age 
Đoạn mã Python trên được sử dụng để xử lý giá trị thiếu (NaN) trong cột 
age của DataFrame df bằng cách điền giá trị tuổi trung bình và làm tròn lên số 
nguyên gần nhất lớn hơn hoặc bằng giá trị hiện tại. Việc này giúp đảm bảo tính 
nhất quán và toàn vẹn dữ liệu, đặc biệt là khi các phân tích thống kê yêu cầu dữ 
liệu không có giá trị thiếu. 
Trước tiên, đoạn mã kiểm tra xem cột age có tồn tại trong DataFrame hay 
không thông qua câu lệnh if 'age' in df.columns. Nếu cột age tồn tại, đoạn mã sẽ 
tính giá trị tuổi trung bình của cột này bằng phương thức mean(). Tuy nhiên, đại 
lượng tuổi phải là một số nguyên và để đảm bảo rằng giá trị điền vào mang giá trị 
nguyên, hàm ceil()từ thư viện math được sử dụng, từ đó giá trị tuổi trung bình đã 
được làm tròn này sẽ được lưu trữ trong biến ave_age. 
Sau đó, đoạn mã sử dụng phương thức fillna() của DataFrame để điền giá 
trị thiếu trong cột age bằng giá trị tuổi trung bình đã tính được. Điều này đảm bảo 
rằng không còn giá trị thiếu nào trong cột age, giúp dữ liệu trở nên nhất quán và 
dễ dàng hơn cho các phân tích sau này. Bên cạnh đó, Nguyên nhân của việc điền 
giá trị thiếu bằng tuổi trung bình là để giảm thiểu tác động của dữ liệu thiếu đến 
các phân tích thống kê và mô hình hóa. Giá trị trung bình được sử dụng vì nó đại      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
diện cho xu hướng trung tâm của dữ liệu, giúp các phân tích sau này không bị  lệch. 
 Thay thế giá trị còn thiếu ở dạng duỗi thành “No infor”   
Hình 3.8 Đoạn code xử lý giá trị bị thiếu ở các trưởng có kiểu dữ liệu String 
Đoạn mã Python trên được sử dụng để điền các giá trị thiếu trong các cột 
dữ liệu chuỗi (string columns) bằng giá trị 'No infor'. Cụ thể, danh sách các cột 
cần kiểm tra và điền giá trị gồm: name, nationality, city, và gender. 
Để thực hiện nhiệm vụ này, trước tiên ta cần viết mã định nghĩa một danh 
sách các cột chuỗi columns_str chứa tên của các cột cần kiểm tra. Sau đó, mã sử 
dụng vòng lặp for để duyệt qua từng cột trong danh sách columns_str. Trong mỗi 
lần lặp, đoạn mã kiểm tra xem cột hiện tại có tồn tại trong DataFrame df hay 
không bằng và thay thế tất cả các giá trị thiếu (NaN) trong cột đó bằng giá trị 'No 
infor' bằng phương thức fillna() của DataFrame. Việc điền các giá trị thiếu giúp 
giảm thiểu lỗi trong quá trình phân tích và mô hình hóa dữ liệu sau này. Tóm lại, 
bằng cách sử dụng giá trị 'No infor', người dùng cuối có thể dễ dàng nhận diện 
các trường hợp thiếu dữ liệu mà không gây ảnh hưởng đến phân tích khác trong  bộ dữ liệu sẵn có. 
3.2.2 Xử lý giá trị bị trùng lặp   
Hình 3.9 Đoạn code xử lý giá trị bị trùng lặp 
Đoạn mã Python trên loại bỏ các hàng trùng lặp trong DataFrame df dựa 
trên cột id. Hàm remove_duplicates(df) nhận vào một DataFrame và sử dụng 
phương thức drop.duplicates() của Pandas với tham số subset=['id'].      lOMoAR cPSD| 58728417 Báo cáo cuối kỳ  Trang  
Việc chỉ loại bỏ các hàng dựa trên cột id vì nó được quy ước là khóa chính 
của bảng dữ liệu (đã đề cập ở mục 2.2.1). Do đó, nếu một bản ghi có giá trị id 
trùng lặp, nghĩa là có sự không nhất quán hoặc sai sót trong dữ liệu, và cần phải 
loại bỏ bớt các hàng trùng này để đảm bảo mỗi id là duy nhất trong DataFrame. 
Ngoài ra, việc tìm kiếm và loại bỏ các hàng trùng lặp dựa trên toàn bộ các cột sẽ 
mất nhiều thời gian và tài nguyên tính toán hơn. Chính vì vậy. quá trình làm sạch 
dữ liệu sẽ trở nên nhanh chóng và hiệu quả hơn, đồng thời vẫn đảm bảo tính toàn 
vẹn của dữ liệu khi tính toán dựa vào khóa chính, cụ thể ở đây là trường id. 
3.2.3 Chuẩn hóa dữ liệu   
Hình 3.10 Đoạn code chuẩn hóa giá trị của trưởng age 
Đoạn mã Python trên giúp chuyển đổi cột age trong DataFrame df thành số 
nguyên dương, đảm bảo tính nhất quán và chính xác cho dữ liệu. Trước tiên, mã 
kiểm tra xem cột age có tồn tại hay không bằng câu lệnh if 'age' in df.columns. 
Nếu cột này tồn tại, mã sẽ chuyển đổi các giá trị trong cột thành kiểu số bằng cách 
sử dụng pd.to_numeric(df['age'], errors='coerce'), câu lệnh này cho phép chương 
trình thay thế các giá trị không thể chuyển đổi được sang dạng số nguyên thành 
NaN. Sau đó, các giá trị NaN được điền bằng 0 qua hàm fillna(0), và chuyển đổi 
thành số nguyên với astype(int). Cuối cùng, mã sử dụng abs(df['age']) để lấy giá 
trị tuyệt đối của tất cả các phần tử trong cột age nhằm đảm bảo rằng tất cả các giá 
trị này là số nguyên dương bởi lẽ cột age đại diện cho tuổi của con người.   
Hình 3.11 Đoạn code chuẩn hóa dữ liệu ở các trường liên quan đến rating 
Tương tự như đoạn lệnh trước đó, đoạn mã này đảm bảo các cột đánh giá 
chỉ chứa các số nguyên không âm từ 0 đến 5. Đầu tiên, đoạn mã xác định một