Assignment 2

Assignment 2: Tính toán và phân tích điểm thi (Test Grade Calculator)

Tổng quan dự án

Môn họcGiới thiệu về Khoa học Dữ liệu
Assignment số02
Tên dự ánTính toán và phân tích điểm thi (Test Grade Calculator)

Bạn đã hoàn thành Phần 4 – Python cho Khoa học Dữ liệu. Trong bài tập lớn này, bạn cần viết một chương trình để tính toán điểm thi cho nhiều lớp với sĩ số hàng nghìn học sinh. Mục đích của chương trình là giúp giảm thời gian chấm điểm. Bạn sẽ áp dụng các hàm (function) khác nhau trong Python để viết chương trình với các tác vụ sau:

  • Mở các tập tin văn bản bên ngoài được yêu cầu với exception handling.

  • Quét từng dòng của câu trả lời bài thi để tìm dữ liệu hợp lệ và cung cấp báo cáo tương ứng.

  • Chấm điểm từng bài thi dựa trên tiêu chí đánh giá (rubric) được cung cấp và báo cáo.

  • Tạo tập tin kết quả được đặt tên thích hợp.

Tại sao cần làm dự án này?

Bài tập này cung cấp cho học viên một nguồn dữ liệu thực tế. Các bạn sẽ thực hành sử dụng các hàm khác nhau trong Python để giải quyết một bài toán cụ thể.

Học viên học được gì?

Bạn sẽ học cách viết một chương trình Python tập trung vào lập trình cơ bản, sử dụng list, function và xử lý chuỗi. Hơn nữa, bạn sẽ biết cách truy cập file để đọc dữ liệu và ghi kết quả thống kê được.

Dự án này giúp ích gì cho nghề nghiệp?

Bài tập này giúp bạn phát triển các kỹ năng lập trình Python, từ đó có thể áp dụng trên các bộ dữ liệu khác nhau.

Làm thế nào để hoàn thành bài tập?

  • Tải file dữ liệu và lưu trong một folder trên máy tính của bạn.

  • Thực hiện theo các bước trong mục Hướng dẫn hoàn thành dự án để hoàn thành các yêu cầu (task) của dự án.

Lưu ý: Đọc kỹ phần miêu tả dữ liệu tương ứng với từng yêu cầu trong mục hướng dẫn.

Tài nguyên tham khảo

  • Version Control: nên sử dụng Git ngay từ đầu và tuân theo các yêu cầu về format trong Git Style Guide.

  • Hướng dẫn Python Style: nên viết code và markup đáp ứng các thông số kỹ thuật trong Python Style Guide.

Hướng dẫn hoàn thành dự án

Học viên thiết lập phiên bản 3.9 cho Python và hoàn thành các task dưới đây.

Task 1

  1. Tạo một chương trình Python mới có tên lastname_firstname_grade_the_exams.py (đảm bảo tệp mã nguồn nằm trong cùng thư mục với tệp dữ liệu vừa tải xuống).

  2. Viết một chương trình cho phép người dùng nhập tên của một tệp và truy cập đọc.

  3. Nếu tệp tồn tại, in ra một thông báo xác nhận. Nếu tệp không tồn tại, thông báo cho người dùng biết không thể tìm thấy tệp và nhắc nhập lại.

  4. Sử dụng try/except để thực hiện việc này (đừng chỉ dùng một loạt câu lệnh “if”, chương trình cần càng “chung chung” càng tốt).

Bạn sẽ không nhận được điểm cho phần này nếu xác định các tệp dữ liệu hợp lệ theo kiểu như sau:

filename = input("Enter a filename: ")
if filename == "class1":
     # open class1.txt
elif filename == "class2":
     # open class2.txt
else:
     print ("Sorry, I can't find this filename")

Đây là một mẫu kết quả sau khi chạy chương trình:

Enter a class file to grade (i.e. class1 for class1.txt): foobar
File cannot be found.
Enter a class file to grade (i.e. class1 for class1.txt): class1
Successfully opened class1.txt

Task 2

Tiếp theo, bạn cần phân tích dữ liệu trong tệp vừa mở để đảm bảo nó đúng định dạng. Mỗi tệp dữ liệu chứa một loạt câu trả lời của học sinh ở định dạng sau:

N12345678,B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D

hoặc

N12345678,B,,D,,C,B,,A,C,C,,B,A,B,A,,,,A,C,A,A,B,D,

Giá trị đầu tiên là số ID của sinh viên. 25 chữ cái sau là câu trả lời của học sinh cho kỳ thi. Tất cả các giá trị được phân tách bằng dấu phẩy. Nếu không có chữ cái nào sau dấu phẩy, nghĩa là học sinh đã bỏ qua câu hỏi đó.

Lưu ý rằng một số dòng dữ liệu có thể bị hỏng! Ví dụ, dòng này không có đủ câu trả lời:

N12345678,B,A,D,D,C,B

Và dòng này có quá nhiều câu trả lời:

N12345678,B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D,A,B,C,D,E

Nhiệm vụ cho phần này của chương trình:

  1. Báo cáo tổng số dòng dữ liệu được lưu trữ trong tệp.

  2. Báo cáo tổng số dòng dữ liệu không hợp lệ trong tệp. Một dòng hợp lệ chứa danh sách 26 giá trị được phân tách bằng dấu phẩy. N# của học sinh là mục đầu tiên trên dòng, phải chứa ký tự “N” theo sau là 8 ký tự số.

  3. Nếu một dòng dữ liệu không hợp lệ, báo cho người dùng bằng một thông báo lỗi.

Gợi ý: Sử dụng phương thức split để tách dữ liệu ra khỏi tệp. Bạn có thể cần dùng phương thức này vài lần cùng với một hoặc hai vòng lặp. Hãy suy nghĩ về thứ tự cần chia các mục. Ví dụ, hồ sơ của một học sinh chiếm toàn bộ một dòng trong tệp, nên tách theo dòng trước sẽ tách biệt dữ liệu của từng học sinh, sau đó chia nhỏ từng dòng theo ký tự phân tách để lấy câu trả lời.

Đây là một mẫu chạy chương trình cho hai tệp dữ liệu đầu tiên. Danh sách đầy đủ đầu ra dự kiến cho tất cả các tệp có trong gói tải xuống của bài tập này.

Enter a class to grade (i.e. class1 for class1.txt): class1
Successfully opened class1.txt
**** ANALYZING ****
No errors found!
**** REPORT ****
Total valid lines of data: 20
Total invalid lines of data: 0

Enter a class to grade (i.e. class1 for class1.txt): class2
Successfully opened class2.txt
**** ANALYZING ****
Invalid line of data: does not contain exactly 26 values:
N00000023,,A,D,D,C,B,D,A,C,C,,C,,B,A,C,B,D,A,C,A,A
Invalid line of data: N# is invalid
N0000002,B,A,D,D,C,B,D,A,C,D,D,D,A,,A,C,D,,A,C,A,A,B,D,D
Invalid line of data: N# is invalid
NA0000027,B,A,D,D,,B,,A,C,B,D,B,A,,A,C,B,D,A,,A,A,B,D,D
Invalid line of data: does not contain exactly 26 values:
N00000035,B,A,D,D,B,B,,A,C,,D,B,A,B,A,A,B,D,A,C,A,C,B,D,D,A,A
**** REPORT ****
Total valid lines of data: 21
Total invalid lines of data: 4

Task 3

Tiếp theo, bạn viết chương trình chấm điểm các bài thi cho một lớp. Kỳ thi gồm 25 câu hỏi trắc nghiệm. Đây là chuỗi đại diện cho đáp án đúng:

answer_key = "B,A,D,D,C,B,D,A,C,C,D,B,A,B,A,C,B,D,A,C,A,A,B,D,D"

Chương trình sử dụng đáp án này để tính điểm cho mỗi dòng dữ liệu hợp lệ như sau:

  • +4 điểm cho mỗi câu trả lời đúng.

  • 0 điểm cho mỗi câu bị bỏ qua.

  • -1 điểm cho mỗi câu trả lời sai.

Bạn cũng cần tính các thống kê sau cho từng lớp:

  1. Đếm số lượng học sinh đạt điểm cao (> 80).

  2. Điểm trung bình.

  3. Điểm cao nhất.

  4. Điểm thấp nhất.

  5. Miền giá trị của điểm (cao nhất trừ thấp nhất).

  6. Giá trị trung vị: sắp xếp các điểm theo thứ tự tăng dần. Nếu số học sinh là số lẻ, lấy giá trị nằm giữa (ví dụ [0, 50, 100] có trung vị là 50). Nếu số học sinh là số chẵn, lấy trung bình của hai giá trị ở giữa (ví dụ [0, 50, 60, 100] có trung vị là 55).

  7. Các câu hỏi bị học sinh bỏ qua nhiều nhất, theo định dạng: số thứ tự câu hỏi – số lượng học sinh bỏ qua – tỉ lệ bị bỏ qua. Nếu nhiều câu có cùng số lượng bị bỏ qua thì liệt kê đầy đủ.

  8. Các câu hỏi bị học sinh trả lời sai nhiều nhất, theo định dạng: số thứ tự câu hỏi – số lượng học sinh trả lời sai – tỉ lệ bị sai. Nếu nhiều câu có cùng số lượng bị sai thì liệt kê đầy đủ.

Lưu ý: các giá trị số thực làm tròn 3 chữ số thập phân.

Gợi ý: Khi đã chấm điểm các học sinh, nên dùng một list để lưu điểm số của từng học sinh, sau đó tính các số liệu thống kê khi đã kiểm tra xong mọi học sinh trong tệp.

Đây là một mẫu chạy chương trình cho hai tệp dữ liệu đầu tiên:

Enter a class to grade (i.e. class1 for class1.txt): class1
Successfully opened class1.txt
**** ANALYZING ****
No errors found!
**** REPORT ****
Total valid lines of data: 20
Total invalid lines of data: 0
Total student of high scores: 6
Mean (average) score: 75.60
Highest score: 91
Lowest score: 59
Range of scores: 32
Median score: 73
Question that most people skip: 3 - 4 - 0.2 , 5 - 4 - 0.2 , 23 - 4 - 0.2
Question that most people answer incorrectly: 10 - 4 - 0.20, 14 - 4 - 0.20, 16 - 4 - 0.20, 19 - 4 - 0.20, 22 - 4 - 0.20

Enter a class to grade (i.e. class1 for class1.txt): class2
Successfully opened class2.txt
**** ANALYZING ****
Invalid line of data: does not contain exactly 26 values:
N00000023,,A,D,D,C,B,D,A,C,C,,C,,B,A,C,B,D,A,C,A,A
Invalid line of data: N# is invalid
N0000002,B,A,D,D,C,B,D,A,C,D,D,D,A,,A,C,D,,A,C,A,A,B,D,D
Invalid line of data: N# is invalid
NA0000027,B,A,D,D,,B,,A,C,B,D,B,A,,A,C,B,D,A,,A,A,B,D,D
Invalid line of data: does not contain exactly 26 values:
N00000035,B,A,D,D,B,B,,A,C,,D,B,A,B,A,A,B,D,A,C,A,C,B,D,D,A,A
**** REPORT ****
Total valid lines of data: 21
Total invalid lines of data: 4
Total student of high scores: 7
Mean (average) score: 78.00
Highest score: 100
Lowest score: 66
Range of scores: 34
Median score: 76
Question that most people skip: 22 - 6 - 0.29
Question that most people answer incorrectly: 18 - 5 - 0.24

Task 4

Cuối cùng, chương trình cần tạo một tệp “kết quả” chứa kết quả chi tiết cho từng học sinh trong lớp. Mỗi dòng của tệp chứa số ID của học sinh, dấu phẩy và điểm của học sinh đó. Đặt tên tệp này dựa trên tên tệp gốc, ví dụ nếu người dùng muốn phân tích class1.txt thì lưu kết quả vào tệp class1_grades.txt.

Đây là nội dung mong đợi của hai tệp kết quả đầu tiên:

# class1_grades.txt
N00000001,59
N00000002,70
N00000003,84
N00000004,73
N00000005,83
N00000006,66
N00000007,88
N00000008,67
N00000009,86
N00000010,73
N00000011,86
N00000012,73
N00000013,73
N00000014,78
N00000015,72
N00000016,91
N00000017,66
N00000018,78
N00000019,78
N00000020,68
# class2_grades.txt
N00000021,68
N00000022,76
N00000024,73
N00000026,72
N00000028,73
N00000029,87
N00000030,82
N00000031,76
N00000032,87
N00000033,77
N00000034,69
N00000036,77
N00000037,75
N00000038,73
N00000039,66
N00000040,73
N00000041,91
N00000042,100
N00000043,86
N00000044,90
N00000045,67

Task 5

Chỉ sử dụng pandas và numpy khi triển khai Task 1 đến Task 4.

Hướng dẫn nộp bài

Lưu ý về nộp bài

  • Lưu chương trình Python với tên lastname_firstname_grade_the_exams.py.

  • Viết phần hướng dẫn cho dự án và đưa vào README.md. Bạn có thể tham khảo thêm khóa Writing READMEs.

  • Nhánh chính (master branch) là nhánh lưu trữ GitHub mặc định. Nếu muốn nộp một nhánh khác, bạn cần đặt nó làm nhánh mặc định mới bên trong kho lưu trữ GitHub của bạn.

Hướng dẫn nộp bài

  • Đặt tên folder theo mẫu DSPXXX_asm2 và đặt file .py vào folder.

  • Thư mục chứa project bài làm và các file tài nguyên cần thiết phải được nén thành 1 file .zip.

  • Xem hướng dẫn và nộp bài tại mục Assessment Submission.

Tiêu chí đánh giá

#Tiêu chí (Criteria)Map to LOĐặc tả (Specification)Trọng sốĐiểmBắt buộcThang chấm
1Mở các tệp dữ liệu bên ngoài được yêu cầuDSPXXX
  • Có thể đọc tất cả các file được tải về
  • Sử dụng exception nếu tên của tệp input không tồn tại trong folder dữ liệu (đừng chỉ dùng một loạt các câu lệnh “if”)
21,54CóScale (0-5)
2Scan file và phân tích—
  • Scan từng dòng trong tệp và đảm bảo format hợp lệ
  • Báo cáo dữ liệu “không hợp lệ” kèm theo lý do
  • Báo cáo tổng số dòng hợp lệ và số dòng không hợp lệ của dữ liệu lưu trong tệp
21,54CóScale (0-5)
3Tính toán điểm thi—
  • Chấm điểm bài thi dựa vào tiêu chí đánh giá (rubrics) đã cho
  • Báo điểm trung bình, điểm cao nhất, thấp nhất, miền giá trị của điểm và giá trị trung vị
21,54CóScale (0-5)
4Tạo tệp kết quả—
  • Viết kết quả vào tệp (số lượng file xuất ra phải bằng số lượng file nhập vào)
  • Mỗi dòng chứa số ID của học viên, dấu phẩy, và điểm của họ
21,54CóScale (0-5)

Yêu cầu phi chức năng

#Tiêu chí (Criteria)Map to LOĐặc tả (Specification)Trọng sốĐiểmBắt buộcThang chấm
1README—File README cần có đủ các bước hướng dẫn chi tiết để chạy ứng dụng thành công10,77KhôngScale (0-5)
2Chú thích—Yêu cầu có chú thích (comment line) cho các đoạn code quan trọng hoặc để giải thích các đoạn code dài10,77KhôngScale (0-5)
3Chất lượng code—Code cần tuân thủ các yêu cầu về format (nhất quán, logic và dễ hiểu) theo chuẩn Python Style Guide10,77KhôngScale (0-5)

Yêu cầu nâng cao

#Tiêu chí (Criteria)Map to LOĐặc tả (Specification)Trọng sốĐiểmBắt buộcThang chấm
1Sử dụng Pandas—Sử dụng pandas khi thực thi các task21,54KhôngScale (0-5)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Lên đầu trang