1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO cáo bài tập lớn môn học phân tích nghiệp vụ thông minh đề tài dự đoán khả năng nghỉ việc của nhân viên trong công ty

22 11 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 22
Dung lượng 1,23 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

1 Trường Đại Học Bách Khoa Hà Nội Viện Công nghệ thông tin và truyền thông =======o0o======= BÁO CÁO BÀI TẬP LỚN MÔN HỌC Phân tích nghiệp vụ thông minh Giáo viên hướng dẫn TS Nguyễn Bình Minh Đề tài Dự đoán khả năng nghỉ việc của nhân viên trong công ty Sinh viên thực hiện Nguyễn Hoàng Thuận 20173393 Nguyễn Đức Thắng 20194170 Phạm Văn Nam 20183598 Chu Thành Đô 20194018 Hà Nội, ngày 24 tháng 06 năm 2022 2 MỤC LỤC 1 Tóm tắt 3 2 Giới thiệu 3 3 Các nghiên cứu liên quan 3 3 1 Mô hình hồi quy tuyến tí.

Trang 1

Trường Đại Học Bách Khoa Hà Nội

Viện Công nghệ thông tin và truyền thông

=======o0o=======

BÁO CÁO BÀI TẬP LỚN MÔN HỌC

Phân tích nghiệp vụ thông minh

Giáo viên hướng dẫn: TS Nguyễn Bình Minh

Đề tài: Dự đoán khả năng nghỉ việc của nhân viên trong công ty

Sinh viên thực hiện

Nguyễn Hoàng Thuận 20173393 Nguyễn Đức Thắng 20194170 Phạm Văn Nam 20183598 Chu Thành Đô 20194018

Hà Nội, ngày 24 tháng 06 năm 2022

Trang 2

MỤC LỤC

1 Tóm tắt 3

2 Giới thiệu 3

3 Các nghiên cứu liên quan 3

3.1 Mô hình hồi quy tuyến tính 3

3.2 Support Vector Machine – SVM 4

3.3 Mô hình Gradient Boosting 6

3.4 Rừng ngẫu nhiên 8

3.4.1 Cây quyết định 8

3.4.2 Rừng ngẫu nhiên 10

4 Mô hình đề xuất 10

5 Kết quả thực nghiệm 11

5.1 Giới thiệu về bộ dữ liệu 11

5.2 Phân tích bộ dữ liệu 11

5.3 Tiền xử lý dữ liệu 19

5.4 Kết quả 21

6 Tổng kết 21

7 Tài liệu tham khảo 22

Trang 3

1 Tóm tắt

Trong những năm trở lại đây, các bài toán về dự đoán ngày càng được chú ý đến do khả năng ứng dụng của nó trong thực thế Bài toán dự đoán khả năng nhân viên nghỉ việc là một trong các bài toán tiêu biểu Tuy nhiên đây là một bài toán tương đối phức tạp, kết quả thu được có thể bị ảnh hưởng bởi nhiều yếu tố khác nhau Trong khuôn khổ môn học này, chúng

em sẽ tập trung vào bài toán dự đoán khả năng nhân viên nghỉ việc dựa trên các yếu tố khác nhau trên một tập dữ liệu có sẵn Chúng em sẽ sử dụng bốn mô hình chính đó là mô hình hồi quy tuyến tính [1], mô hình Gradient Boosting [2], mô hình dựa trên Support Vector Machine [3] và mô hình rừng ngẫu nhiên [4]

2 Giới thiệu

Trong những năm trở lại đây, các bài toán về dự đoán (forecasting) ngày càng được chú ý đến do khả năng ứng dụng của nó trong thực thế Các lĩnh vực như tài chính, bán hàng, thời tiết, … đều là những lĩnh vực có nhu cầu dự đoán lớn Tuy nhiên, vấn đề dự đoán này có rất nhiều thách thức như thiếu thông tin về dữ liệu do vấn đề bảo mật, độ chính xác của các phương pháp hiện tại còn chưa đủ tốt so với yêu cầu thực tế, xu hướng thay đổi theo thời gian, …

Nhân viên nghỉ việc là một vấn đề gây nhiều hao tổn cho các công ty Chi phí thực tế cho việc thay thế một nhân viên thường khá cao Một nghiên cứu của CAP (tổ chức nghiên cứu và vận động chính sách công tại Mỹ) chỉ ra rằng các công ty thường phải chi trả khoảng 1/5 số tiền lương của một nhân viên để thay thế họ, và chi phí có thể tăng đáng kể nếu những vị trí có chức vụ cao hoặc những nhân viên được trả lương cao cần tìm người thay thế Điều này do lượng thời gian dành cho các cuộc phỏng vấn, tiền thưởng và hiệu suất, chất lượng công việc

bị giảm sút trong vài tháng khi nhân viên mới làm quen với công việc Nắm bắt được tại sao

và khi nào nhân viên có khả năng nghỉ việc cao có thể giúp nhà quản lý đưa ra các phương án hành động để giữ chân nhân viên lâu hơn cũng như lập kế hoạch tuyển dụng phù hợp

Xuất phát từ những thực tế nói trên, chúng em xin chọn đề tài “Dự đoán khả năng nghỉ việc của nhân viên trong công ty” để thực hiện trong môn học này Chúng em sử dụng bốn cách tiếp cận chính là mô hình hồi quy tuyến tính [1], mô hình Gradient Boosting [2], mô hình SVM [3] và mô hình rừng ngẫu nhiên [4]

3 Các nghiên cứu liên quan

3.1 Mô hình hồi quy tuyến tính

Mục tiêu của mô hình hồi quy tuyến tính (Linear Regression) [1] nói riêng cũng như mọi

mô hình học máy nói chung là tìm một ánh xạ từ không gian dữ liệu đầu vào sang không gian

dữ liệu nhãn đầu ra:

𝑓: 𝑥 → 𝑦 hay là 𝑦 ≈ 𝑓(𝑥) = 𝑦^

Trang 4

Với hồi quy tuyến tính [1] thì hàm 𝑓 là một hàm tuyến tính

Giả sử ta có: 𝑥 = [𝑥0, 𝑥1, 𝑥2, … , 𝑥𝑛] là vector hàng của dữ liệu đầu vào

L1 - Least absolute deviations:

𝑖 = 1

=1

2 (𝑦 − 𝑋𝑤)

𝑇(𝑦 − 𝑋𝑤)

Cần phải chọn tham số 𝑊để tối thiểu hàm mục tiêu Có nhiều phương pháp để tìm hàm tối

ưu Một trong những cách đơn giản nhất là giải phương trình đạo hàm (gradient) bằng 0 Giả

3.2 Support Vector Machine – SVM

Support Vector Machine (SVM) [3] là một thuật toán thuộc nhóm Supervised Learning (Học có giám sát) dùng để phân chia dữ liệu (Classification) thành các nhóm riêng biệt

Trang 5

Giả sử rằng các cặp dữ liệu của training set là (𝑥1, 𝑦1), (𝑥2, 𝑦2), … , (𝑥𝑁, 𝑦𝑁) với vector

𝑥𝑖 ∈ 𝑅𝑑 thể hiện đầu vào của một điểm dữ liệu và 𝑦𝑖 là nhãn của điểm dữ liệu đó 𝑑 là số chiều của dữ liệu và 𝑁 là số điểm dữ liệu Giả sử rằng nhãn của mỗi điểm dữ liệu được xác định bởi 𝑦𝑖 = 1 (class 1) và 𝑦𝑖 = −1 (class 2) Để phân chia hai class ta cần tìm một siêu phẳng có phương trình là 𝑤𝑇𝑥 + 𝑏 = 0

Hình 1: Phân tích bài toán SVM trên không gian 2 chiều

(Nguồn: https://machinelearningcoban.com/assets/19_svm/svm6.png) Với cặp dữ liệu (𝑥𝑛, 𝑦𝑛) bất kỳ, khoảng cách từ điểm đó tới mặt phân chia là:

Trang 6

Thông thường việc giải trực tiếp bài toán này là tương đối khó khi số chiều 𝑑 là lớn Bài toán tối ưu này là một bài toán lồi, do đó nếu nó thỏa mãn tiêu chuẩn Slater thì strong duality thoả mãn Và nếu strong duality thoả mãn thì nghiệm của bài toán chính là nghiệm của hệ điều kiện KKT

3.3 Mô hình Gradient Boosting

Mô hình Gradient Boosting là một mô hình tạo ra một loạt các mô hình phân loại yếu, các

mô hình này có thể học hỏi được từ nhau để tránh lặp lại sai lầm của nhau Hay nói cách khác, các mô hình được sinh ra sau sẽ được học để hạn chế các lỗi lầm được sinh ra trước Vậy làm thể nào để hạn chế được sai lầm từ các model trước ? Boosting tiến hành đánh trọng số cho các mô hình mới được thêm vào dựa trên các cách tối ưu khác nhau Tùy theo cách đánh trọng

số (cách để các model được fit một cách tuần tự) và cách tổng hợp lại các model, từ đó hình thành nên 2 loại Boosting:

- Adaptive Boosting (AdaBoost)

- Gradient Boosting

Các mô hình Boosting có một số đặc điểm như sau:

- Boosting là một quá trình tuần tự, không thể xử lí song song, do đó, thời gian train mô hình có thể tương đối lâu

- Sau mỗi vòng lặp, Boosting có khả năng làm giảm error theo cấp số nhân

- Boosting sẽ hoạt động tốt nếu base learner của nó không quá phức tạp cũng như error không thay đổi quá nhanh

- Boosting giúp làm giảm giá trị bias cho các model base learner

Mô hình Boosting được phát biểu bằng bài toán tối ưu sau:

Trang 7

Thay vì cố gắng quét tìm tất cả các giá trị 𝑐𝑛,𝑤𝑛để tìm nghiệm tối ưu toàn cục - một công việc tốn nhiều thời gian và tài nguyên, chúng ta sẽ cố gắng tìm các giá trị nghiệm cục bộ sau khi thêm mỗi một mô hình mới vào chuỗi mô hình với mong muốn dần đi đến nghiệm toàn cục

Ta có:

Công thức cập nhật tham số theo hướng giảm của đạo hàm:

Đối với phương pháp Gradient Boosting, ta áp dụng tương tự:

Ta có mã giả của thuật toán như sau:

- Khởi tạo giá trị pseudo-residuals là bằng nhau cho từng điểm dữ liệu

- Tại vòng lặp thứ i:

o Train model mới được thêm vào để fit vào giá trị của pseudo-residuals đã có

o Tính toán giá trị confidence score của model vừa train

o Cập nhật model chính

o Cuối cùng, tính toán giá trị pseudo-residuals để làm label cho model tiếp theo

- Sau đó lặp lại với vòng lặp i + 1

Trang 8

Hình3.3: Mô tả thuật toán Gradient Boosting

3.4 Rừng ngẫu nhiên

3.4.1 Cây quyết định

Cây quyết định (Decision Tree) [8] là một cây phân cấp có cấu trúc được dùng để phân lớp các đối tượng dựa vào dãy các luật Các thuộc tính của đối tượng có thể thuộc các kiểu dữ liệu khác nhau như Nhị phân (Binary), Định danh (Nominal), Thứ tự (Ordinal), Số lượng (Quantitative) trong khi đó thuộc tính phân lớp phải có kiểu dữ liệu là Binary hoặc Ordinal

Một ví dụ cơ bản về cây quyết định: giả sử dựa theo thời tiết mà các bạn nam sẽ quyết định

đi đá bóng hay khôn Những đặc điểm ban đầu là: thời tiết, độ ẩm, gió Dựa vào những thông tin trên có thể xây dựng được mô hình như sau:

Trang 9

Hình3.4: Mô hình cây quyết định (Nguồn: https://i1.wp.com/trituenhantao.io/wp-content/uploads/2020/04/dt_res-1.png?w=810&ssl=1)

Dựa theo mô hình trên, ta thấy: nếu trời nắng, độ ẩm bình thường thì khả năng các bạn nam

đi chơi bóng sẽ cao Còn nếu trời nắng, độ ẩm cao thì khả năng các bạn nam sẽ không đi chơi bóng

Thuật toán đơn giản nhất để xây dựng cây quyết định đó là thuật toán ID3 và C4.5 ID3 [9]

sử dụng phương pháp tham lam tìm kiếm từ trên xuống thông qua không gian của các nhánh

có thể không có backtracking ID3 [9] sử dụng Entropy và Information Gain để xây dựng một cây quyết định Thuật toán C4.5 [9] là thuật toán cải tiến của ID3[9] Trong thuật toán C4.5 [9], thay vì sử dụng Information Gain, Gain Ratio được sử dụng để chuẩn hoá Information Gain với số lượng bản ghi, từ đó tránh việc ưu tiên những thuộc tính có số lượng lớn các giá trị mà ít xét tới những thuộc tính có giá trị hơn Ngoài ra còn có một số thuật toán khác như:

- Thuật toán CHAID: Tạo cây quyết định bằng cách sử dụng thống kê chi-square để

xác định các phân tách tối ưu Các biến mục tiêu đầu vào có thể là số (liên tục) hoặc phân loại

- Thuật toán C&R: sử dụng phân vùng đệ quy để chia cây Tham biến mục tiêu có thể

dạng số hoặc phân loại

- MARS

- Conditional Inference Trees

Trang 10

Chú ý rằng nếu cứ phát triển cây quyết định để phân chia được tất cả các điểm dữ liệu, cây

đó có thể sẽ quá lớn và phức tạp, mặc dù độ chính xác trên tập kiểm tra lại không cao do dữ liệu huấn luyện tiềm ẩn nhiễu Do đó cần có một tiêu chuẩn dừng để tránh trường hợp này Tiêu chuẩn đó có thể là độ sâu tối đa của cây, tổng số nút là tối đa, hay việc phân chia them node không làm giảm entropy quá nhiều,… Ngoài ra còn có phương pháp cắt tỉa cây: xây dựng cây quyết định hoàn chỉnh sau đó tiến hành cắt tỉa một số nút, nhánh không quan trọng nhằm giảm kích thước cũng như độ phức tạp của cây

3.4.2 Rừng ngẫu nhiên

Rừng ngẫu nhiên [4] là một thuật toán học có giám sát Như tên gọi của nó, rừng ngẫu nhiên sử dụng các cây quyết định để làm nền tảng Ưu điểm của rừng ngẫu nhiên là có thể sử dụng cho cả bài toán phân loại và hồi quy, tránh overfitting, làm việc được với dữ liệu bị thiếu giá trị,…

Rừng ngẫu nhiên hoạt động bằng cách đánh giá nhiều cây quyết định ngẫu nhiên, và lấy ra kết quả được đánh giá tốt nhất (được vote nhiều nhất) trong số kết quả trả về

Hình 4 Rừng ngẫu nhiên

(Nguồn: https://upload.wikimedia.org/wikipedia/commons/7/76/Random_forest_diagram_complete.png )

4 Mô hình đề xuất

Bốn mô hình được thử nghiệm ở đây là mô hình hồi quy logistic, mô hình gradient boosting,

mô hình SVM và mô hình cây quyết định Các cách lựa chọn và điều chỉnh tham số sẽ được nhóm em trình bày chi tiết ở phần sau

Trang 11

5 Kết quả thực nghiệm

5.1 Giới thiệu về bộ dữ liệu

Bộ dữ liệu nhóm em sử dụng là một file csv gồm 1470 điểm dữ liệu, được công bố trên cuộc thi Kaggle: https://www.kaggle.com/datasets/pavansubhasht/ibm-hr-analytics-attrition-dataset Bộ dữ liệu chứa các thông tin về những nhân viên làm việc cho các công ty bao gồm: bằng cấp, mức độ hài lòng với môi trường làm việc, mức độ hài long công việc, mức lương đãi ngộ, … Mục tiêu của cuộc thi yêu cầu cần phải dự đoán chính xác một nhân viên của công ty

có quyết định nghỉ việc hay không

5.2 Phân tích bộ dữ liệu

Bộ dữ liệu gồm có 1470 dòng tương đương với 1470 điểm dữ liệu Có 35 cột trong đó có

1 cột là nhãn biểu diễn nhân viên đó có nghỉ việc hay không, 34 cột còn lại là các đặc trưng liên quan đến nhân viên đó Chi tiết các cột còn lại như sau:

- Age: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- Attrition: 1470 giá trị khác rỗng, kiểu dữ liệu object

- BusinessTravel: 1470 giá trị khác rỗng, kiểu dữ liệu object

- DailyRate: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- Department: 1470 giá trị khác rỗng, kiểu dữ liệu object

- DistanceFromHome: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- Education: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- EducationField: 1470 giá trị khác rỗng, kiểu dữ liệu object

- EmployeeCount: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- EmployeeNumber: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- EnvironmentSatisfaction: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- Gender: 1470 giá trị khác rỗng, kiểu dữ liệu object

- HourlyRate: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- JobInvolvement: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- JobLevel: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- JobRole: 1470 giá trị khác rỗng, kiểu dữ liệu object

- JobSatisfaction: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- MaritalStatus: 1470 giá trị khác rỗng, kiểu dữ liệu object

- MonthlyIncome: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- MonthlyRate: 1470 giá trị khác rỗng int64

- NumCompaniesWorked: 1470 giá trị khác rỗng int64

- Over18: 1470 giá trị khác rỗng, kiểu dữ liệu object

- OverTime: 1470 giá trị khác rỗng, kiểu dữ liệu object

- PercentSalaryHike: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- PerformanceRating: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- RelationshipSatisfaction: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- StandardHours: 1470 giá trị khác rỗng, kiểu dữ liệu int64

Trang 12

- StockOptionLevel: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- TotalWorkingYears: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- TrainingTimesLastYear: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- WorkLifeBalance: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- YearsAtCompany: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- YearsInCurrentRole: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- YearsSinceLastPromotion: 1470 giá trị khác rỗng, kiểu dữ liệu int64

- YearsWithCurrManager: 1470 giá trị khác rỗng, kiểu dữ liệu int64

Bên cạnh đó ta có một số thống kê về dữ liệu:

• Thống kê về số giá trị duy nhất của từng cột:

Trang 13

- DailyRate: 886

- MonthlyIncome: 1349

- MonthlyRate: 1427

- EmployeeNumber: 1470

 Ta nhận thấy các trường Over18, StandardHours, EmployeeCount chỉ có 1 giá trị duy

nhất cho tất cả các bản ghi nên những trường này không có ý nghĩa trong việc phân loại,

ta có thể bỏ qua trong quá trình thực nghiệm Tương tự các trường EmployeeNumber, MonthlyRate có quá nhiều giá trị khác nhau và số lượng giá trị khác nhau gần tương

đương với tổng số bản ghi nên ý nghĩa khi dùng để phân loại cũng rất thấp

• Biểu đồ phân phối số tuổi của nhân viên:

Từ biểu đồ có thể thấy phân phối tuổi của nhân viên trong tập dữ liệu là phân phối chuẩn,

có trung bình là khoảng 35 tuổi, giá trị nhỏ nhất được quan sát là 18 tuổi, giá trị cao nhất được quan sát là 60 tuổi

Trang 14

• Một số biểu đồ phân phối khác để hiểu hơn về dữ liệu:

 Từ các biểu đồ trên có thể thấy:

- Hầu hết các nhân viên làm việc ở một công ty nhỏ hơn 20 năm, tổng số năm làm việc

của 1 nhân viên phần lớn cũng nhỏ hơn 20 năm

- Hầu hết các nhân viên đều làm việc gần nhà, biểu đồ khoảng cách đến công ty có sự

phân hóa rõ rệt giữa khoảng cách gần và xa

- Hầu hết nhân viên đều mới được lên chức trong vòng 1 vài năm gần đây Và phần trăm

lương tăng cũng nằm phần lớn trong khoảng 10-15%

Trang 15

• Biểu đồ thống kê số nhân viên nghỉ việc và không nghỉ việc phân theo giới tính:

Dựa vào biểu đồ có thể thấy tỷ lệ nghỉ việc ở các nhân sự là nam cao hơn là nữ một chút (16.7% so với 15%)

• Biểu đồ thống kê số nhân viên nghỉ việc và không nghỉ việc theo tình trạng hôn nhân:

Có thể thấy tỷ lệ nghỉ việc ở nhóm nhân viên còn độc thân là cao nhất (25%) so với đang trong hôn nhân (13%) và đã li hôn (9.1%)

Ngày đăng: 09/07/2022, 21:26

HÌNH ẢNH LIÊN QUAN

Hình 1: Phân tích bài tốn SVM trên khơng gian 2 chiều. (Nguồn:  https://machinelearningcoban.com/assets/19_svm/svm6.png )  - BÁO cáo bài tập lớn môn học phân tích nghiệp vụ thông minh đề tài dự đoán khả năng nghỉ việc của nhân viên trong công ty
Hình 1 Phân tích bài tốn SVM trên khơng gian 2 chiều. (Nguồn: https://machinelearningcoban.com/assets/19_svm/svm6.png ) (Trang 5)
Hình3.3: Mơ tả thuật tốn Gradient Boosting - BÁO cáo bài tập lớn môn học phân tích nghiệp vụ thông minh đề tài dự đoán khả năng nghỉ việc của nhân viên trong công ty
Hình 3.3 Mơ tả thuật tốn Gradient Boosting (Trang 8)
Hình3.4: Mơ hình cây quyết định - BÁO cáo bài tập lớn môn học phân tích nghiệp vụ thông minh đề tài dự đoán khả năng nghỉ việc của nhân viên trong công ty
Hình 3.4 Mơ hình cây quyết định (Trang 9)
Hình 4. Rừng ngẫu nhiên - BÁO cáo bài tập lớn môn học phân tích nghiệp vụ thông minh đề tài dự đoán khả năng nghỉ việc của nhân viên trong công ty
Hình 4. Rừng ngẫu nhiên (Trang 10)
Trong nghiên cứu này, chúng em đã thử nghiệm bốn cách tiếp cận chính là mơ hình hồi quy logistic, mơ hình gradient bootsing, mơ hình SVM và mơ hình rừng ngẫu nhiên cho bài  toán “ dự đoán khả năng nghỉ việc của nhân viên” - BÁO cáo bài tập lớn môn học phân tích nghiệp vụ thông minh đề tài dự đoán khả năng nghỉ việc của nhân viên trong công ty
rong nghiên cứu này, chúng em đã thử nghiệm bốn cách tiếp cận chính là mơ hình hồi quy logistic, mơ hình gradient bootsing, mơ hình SVM và mơ hình rừng ngẫu nhiên cho bài toán “ dự đoán khả năng nghỉ việc của nhân viên” (Trang 21)
Trong tương lai, nhóm sẽ tiếp tục cải thiện mơ hình bằng cách thử nghiệm mơ hình hồi quy dựa trên XGBoost [11]  để đạt kết quả tốt hơn - BÁO cáo bài tập lớn môn học phân tích nghiệp vụ thông minh đề tài dự đoán khả năng nghỉ việc của nhân viên trong công ty
rong tương lai, nhóm sẽ tiếp tục cải thiện mơ hình bằng cách thử nghiệm mơ hình hồi quy dựa trên XGBoost [11] để đạt kết quả tốt hơn (Trang 21)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w