Trong bài phân tích này, một bộ dữ liệu thứ cấp được sử dụng có tên gọi “Supply Chain Data”. Bộ dữ liệu ghi nhận thông tin của 100 dòng sản phẩm makeup cùng với 24 thuộc tính liên quan đến toàn bộ quá trình chuỗi cung ứng, từ đặc điểm sản phẩm, nhà cung cấp, vận chuyển, đến dữ liệu kiểm tra chất lượng và thông tin khách hàng. Điều đáng chú ý là bộ dữ liệu có chứa ít nhất 6 biến định tính, cho phép thực hiện phân tích dữ liệu định tính đa chiều.
Mục tiêu của nghiên cứu không chỉ dừng lại ở việc mô tả các đặc điểm chuỗi cung ứng, mà còn nhằm làm rõ các xu hướng, mô hình thường gặp và mối liên hệ giữa một số biến định tính trong quá trình vận hành chuỗi cung ứng. Thông qua đó, nghiên cứu kỳ vọng có thể đưa ra một số nhận định về vai trò của từng yếu tố định tính trong hiệu quả tổng thể của chuỗi cung ứng, đặc biệt là từ góc nhìn vận hành của một doanh nghiệp khởi nghiệp trong lĩnh vực làm đẹp.
Trong bước đầu tiên của quá trình phân tích, dữ liệu được đọc từ tệp Excel định dạng .xlsx bằng hàm read.xlsx() trong R.
library(xlsx)
nv <- read.xlsx("C:/Users/Admin/OneDrive/Desktop/TÀI LIỆU HỌC TẬP/PTDLDT/supplychain_data.xlsx", sheetIndex= 1, header= T)
Bên cạnh đó, việc hiển thị 5 dòng đầu tiên và 5 dòng cuối của bộ dữ liệu giúp người phân tích có cái nhìn trực quan về nội dung, phạm vi và định dạng dữ liệu.
library(DT)
datatable(head(nv, n= 5 ), caption = "Bảng hiển thị 5 dòng đầu dữ liệu")
datatable(tail(nv, n= 5 ), caption = "Bảng hiển thị 5 dòng cuối dữ liệu")
str (nv)
## 'data.frame': 100 obs. of 24 variables:
## $ Product.type : chr "haircare" "skincare" "haircare" "skincare" ...
## $ SKU : chr "SKU0" "SKU1" "SKU2" "SKU3" ...
## $ Price : num 69.8 14.8 11.3 61.2 4.8 ...
## $ Availability : num 55 95 34 68 26 87 48 59 78 35 ...
## $ Number.of.products.sold: num 802 736 8 83 871 147 65 426 150 980 ...
## $ Revenue.generated : num 8662 7461 9578 7767 2687 ...
## $ Customer.demographics : chr "Non-binary" "Female" "Unknown" "Non-binary" ...
## $ Stock.levels : num 58 53 1 23 5 90 11 93 5 14 ...
## $ Lead.times : num 7 30 10 13 3 27 15 17 10 27 ...
## $ Order.quantities : num 96 37 88 59 56 66 58 11 15 83 ...
## $ Shipping.times : num 4 2 2 6 8 3 8 1 7 1 ...
## $ Shipping.carriers : chr "Carrier B" "Carrier A" "Carrier B" "Carrier C" ...
## $ Shipping.costs : num 2.96 9.72 8.05 1.73 3.89 ...
## $ Supplier.name : chr "Supplier 3" "Supplier 3" "Supplier 1" "Supplier 5" ...
## $ Location : chr "Mumbai" "Mumbai" "Mumbai" "Kolkata" ...
## $ Lead.time : num 29 23 12 24 5 10 14 22 13 29 ...
## $ Production.volumes : num 215 517 971 937 414 104 314 564 769 963 ...
## $ Manufacturing.lead.time: num 29 30 27 18 3 17 24 1 8 23 ...
## $ Manufacturing.costs : num 46.3 33.6 30.7 35.6 92.1 ...
## $ Inspection.results : chr "Pending" "Pending" "Pending" "Fail" ...
## $ Defect.rates : num 0.226 4.854 4.581 4.747 3.146 ...
## $ Transportation.modes : chr "Road" "Road" "Air" "Rail" ...
## $ Routes : chr "Route B" "Route B" "Route C" "Route A" ...
## $ Costs : num 188 503 142 255 923 ...
Hàm str() trong R là một công cụ quan trọng giúp ta hiểu nhanh và tổng quan về cấu trúc của bộ dữ liệu ngay sau khi đọc dữ liệu vào môi trường làm việc. Cụ thể, str() cung cấp những thông tin cơ bản nhưng thiết yếu như:
Bộ dữ liệu được sử dụng trong nghiên cứu này có tên là “Supply Chain Data”, bao gồm 100 quan sát với 24 biến, phản ánh toàn diện các khía cạnh trong chuỗi cung ứng của một doanh nghiệp hoạt động trong ngành hàng tiêu dùng nhanh, cụ thể là các sản phẩm thuộc lĩnh vực Thời trang và Làm đẹp. Dữ liệu được tổ chức ở cấp độ sản phẩm, với mỗi dòng dữ liệu tương ứng với một mặt hàng cụ thể, được nhận diện qua mã sản phẩm (SKU).
Product.type là một biến định tính phản ánh loại sản phẩm, ví dụ như haircare, skincare,…
SKU là mã sản phẩm duy nhất dùng để định danh từng sản phẩm riêng biệt, giữ vai trò như một biến nhận diện.
Price là biến định lượng cho biết giá bán của sản phẩm trên thị trường
Availability phản ánh mức độ sẵn có của sản phẩm tại thời điểm ghi nhận
Number.of.products.sold là số lượng sản phẩm đã bán được
Customer.demographics mô tả đặc điểm giới tính của khách hàng như Male, Female, Non-binary hoặc Unknown
Stock.levels cho biết lượng hàng tồn kho
Lead.times biểu thị thời gian trung bình từ lúc đặt hàng đến khi hàng hóa đến tay khách hàng trong kênh phân phối
Order.quantities ghi nhận số lượng sản phẩm được đặt trong mỗi lần nhập hàng
Shipping.times thể hiện thời gian vận chuyển thực tế, tính theo số ngày
Shipping.carriers là tên đơn vị vận chuyển như Carrier A, Carrier B,…
Shipping.costs phản ánh chi phí vận chuyển cho mỗi SKU.
Supplier.name cho biết tên của nhà cung cấp
Location là địa điểm của nhà cung cấp, ví dụ như Mumbai, Kolkata,…
Lead.time ở đây là thời gian giao hàng từ nhà cung cấp đến nhà máy sản xuất
Production.volumes phản ánh số lượng sản phẩm được sản xuất cho mỗi SKU
Manufacturing.lead.time cho biết thời gian cần thiết để hoàn thành quá trình sản xuất
Manufacturing.costs là chi phí sản xuất một đơn vị sản phẩm
Inspection.results là kết quả kiểm định chất lượng sản phẩm với các giá trị như Pass, Fail, hoặc Pending
Defect.rates là tỷ lệ sản phẩm bị lỗi hoặc hư hỏng, thường được thể hiện bằng phần trăm
Transportation.modes là phương thức vận chuyển như Road, Rail, Air,…
Routes mô tả tuyến đường vận chuyển như Route A, Route B,…
Costs là chi phí tổng hợp cho từng sản phẩm, có thể bao gồm chi phí sản xuất, vận chuyển và các chi phí liên quan khác
Tác giả tiến hành chọn ra các biến định tính cần phân tích và kiểm tra sự tồn tại của các giá trị bị thiếu (NA) trong các biến định tính gồm: SKU, Product.type, Customer.demographics, Shipping.carriers, Supplier.name, Location, Inspection.results, Transportation.modes, và Routes
nv_cate <- c("SKU","Product.type", "Customer.demographics", "Shipping.carriers", "Supplier.name", "Location", "Inspection.results", "Transportation.modes", "Routes")
colSums(is.na(nv[nv_cate]))
## SKU Product.type Customer.demographics
## 0 0 0
## Shipping.carriers Supplier.name Location
## 0 0 0
## Inspection.results Transportation.modes Routes
## 0 0 0
Kết quả cho thấy tất cả các biến định tính này không có giá trị bị thiếu. Điều này chứng tỏ chất lượng dữ liệu định tính của bộ dữ liệu hiện tại là đảm bảo, không cần thực hiện các biện pháp xử lý dữ liệu thiếu như loại bỏ hoặc điền giá trị thay thế.
Việc kiểm tra dữ liệu bị thiếu là bước quan trọng trong quá trình tiền xử lý dữ liệu, nhằm đảm bảo tính đầy đủ và độ tin cậy của các phân tích thống kê. Dữ liệu bị thiếu nếu không được xử lý có thể dẫn đến sai lệch trong kết quả ước lượng, ảnh hưởng đến độ chính xác của mô hình và các kết luận nghiên cứu. Do đó, việc xác nhận không có giá trị bị thiếu trong các biến định tính giúp tăng độ tin cậy cho các phân tích định tính tiếp theo như kiểm định tỷ lệ, phân nhóm, hay mô hình phân loại.
Tác giả tiếp tục tiến hành kiểm tra kiểu dữ liệu của các biến định tính thông qua hàm sapply(nv[nv_cate], is.factor).
sapply(nv[nv_cate], is.factor) #Kiểm tra biến có phải là factor không
## SKU Product.type Customer.demographics
## FALSE FALSE FALSE
## Shipping.carriers Supplier.name Location
## FALSE FALSE FALSE
## Inspection.results Transportation.modes Routes
## FALSE FALSE FALSE
Kết quả cho thấy rằng không có biến nào trong số các biến định tính thuộc kiểu factor — vốn là kiểu dữ liệu đặc trưng dùng để biểu diễn các biến phân loại trong phân tích thống kê.
Nhận thấy điều này, tác giả đã thực hiện bước chuyển đổi tất cả các biến định tính sang kiểu factor bằng hàm lapply(nv[nv_cate], as.factor). Việc chuyển đổi này là cần thiết và quan trọng để đảm bảo rằng các phương pháp phân tích thống kê định tính như kiểm định tỷ lệ, thống kê tần suất, hay mô hình phân loại có thể được áp dụng chính xác và hiệu quả.
nv[nv_cate] <- lapply(nv[nv_cate], as.factor)
Kiểu dữ liệu factor trong R không chỉ giúp lưu trữ dữ liệu phân loại một cách tối ưu mà còn cho phép các hàm thống kê hiểu đúng bản chất định tính của biến, từ đó thực hiện các kiểm định hoặc mô hình hoá phù hợp. Nếu không chuyển đổi, việc phân tích có thể đưa ra kết quả sai lệch do R mặc định xử lý dữ liệu dưới dạng chuỗi ký tự (character) hoặc các kiểu không phù hợp.
Trong bộ dữ liệu Supplychain_data, biến định tính Product.type đại diện cho loại sản phẩm được phân phối trong chuỗi cung ứng, bao gồm ba nhóm chính: cosmetics, haircare, và skincare. Biến này có vai trò quan trọng trong việc phân loại sản phẩm theo danh mục, từ đó hỗ trợ đánh giá hiệu quả vận hành và phân phối của từng nhóm sản phẩm trong toàn bộ chuỗi cung ứng.
Kết quả thống kê cho thấy nhóm skincare chiếm tỷ trọng cao nhất với 40%, tiếp theo là haircare chiếm 34%, và thấp nhất là cosmetics với 26%. Sự phân bổ này cho thấy nhóm skincare có sự hiện diện nổi bật hơn trong bộ dữ liệu, có thể do nhu cầu tiêu thụ cao hơn hoặc phạm vi phân phối rộng hơn. Dù tỷ lệ giữa ba nhóm không hoàn toàn đồng đều, nhưng khoảng cách không quá lớn, phản ánh mức độ đa dạng sản phẩm tương đối cân đối trong hệ thống cung ứng. Điều này góp phần đảm bảo tính đại diện khi phân tích đặc trưng hoạt động giữa các loại sản phẩm. Việc có đầy đủ ba nhóm sản phẩm với tỷ lệ tương đối hợp lý giúp dữ liệu không bị thiên lệch quá nhiều về một loại nhất định, từ đó tạo tiền đề tốt cho các phân tích thống kê tiếp theo nếu được thực hiện.
Biến định tính: Product.type
Hạng mục quan tâm: “Skincare” Ngành hàng chăm sóc da
Với mức ý nghĩa 95%, khoảng ước lượng cho ngành chăm sóc da được xác định như sau:
prop.test(x = nrow(subset(nv , Product.type == "skincare")), n = nrow(nv[nv_cate]) , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Product.type == "skincare")) out of nrow(nv[nv_cate]), null probability 0.5
## X-squared = 3.61, df = 1, p-value = 0.05743
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3047801 0.5029964
## sample estimates:
## p
## 0.4
Kết quả ước lượng khoảng tin cậy 95% cho tỷ lệ khách hàng thuộc ngành hàng skincare là từ 30.48% đến 50.30% (\([0.3048,\ 0.5030]\)), với tỷ lệ mẫu \(\hat{p} = 0.4\) (tức 40%). Khoảng tin cậy này cho thấy, với độ tin cậy 95%, tỷ lệ thực sự của khách hàng ngành hàng skincare trong tổng thể có khả năng nằm trong khoảng trên. Khoảng tin cậy khá rộng (gần 20%), phản ánh mức độ không chắc chắn cao hơn trong ước lượng, có thể do kích thước mẫu chưa đủ lớn, hoặc sự phân bổ không đồng đều giữa các ngành hàng. Đáng chú ý, khoảng tin cậy có chứa giá trị 50% (\(p = 0.5\)), điều này cho thấy chúng ta chưa thể loại trừ khả năng tỷ lệ thực tế là 50%. Mặc dù tỷ lệ mẫu là 40%, nhưng độ rộng khoảng tin cậy cảnh báo rằng việc đưa ra kết luận chắc chắn về tỷ lệ thực tế cần thận trọng hơn. Kết quả này cung cấp cơ sở ban đầu để kiểm định giả thuyết về tỷ lệ ngành hàng skincare.
Giả thuyết kiểm định:
H0: Tỷ lệ ngành hàng chăm sóc da trong tổng thể là 50%
H1: Tỷ lệ ngành hàng chăm sóc da trong tổng thể khác 50%
Kết quả kiểm định:
prop.test(x = nrow(subset(nv , Product.type == "skincare")), n = nrow(nv[nv_cate]), alternative = "two.sided", p = 0.5 , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Product.type == "skincare")) out of nrow(nv[nv_cate]), null probability 0.5
## X-squared = 3.61, df = 1, p-value = 0.05743
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3047801 0.5029964
## sample estimates:
## p
## 0.4
Kết quả kiểm định giả thuyết với \(\chi^2 = 3.61\) và p-value = 0.05743 cho thấy rằng, tại mức ý nghĩa \(\alpha = 0.05\), không đủ bằng chứng thống kê để bác bỏ giả thuyết H0. Điều này có nghĩa là tỷ lệ khách hàng thuộc ngành hàng skincare không khác biệt có ý nghĩa thống kê so với 50%. Tuy nhiên, vì p-value rất gần ngưỡng 0.05 (chỉ cao hơn một chút), điều này cho thấy có thể có xu hướng sai lệch, và nếu tăng kích thước mẫu hoặc kiểm định ở mức ý nghĩa cao hơn (chẳng hạn \(\alpha = 0.1\)), có thể sẽ tìm thấy bằng chứng rõ ràng hơn để bác bỏ H0. Tỷ lệ mẫu \(\hat{p} = 0.4\) cho thấy chỉ 40% khách hàng thuộc ngành hàng skincare – thấp hơn 10 điểm phần trăm so với giả thuyết. Tuy nhiên, do độ lệch này chưa đủ lớn (xét theo thống kê), nên chúng ta không thể kết luận rằng tỷ lệ thực tế trong tổng thể là khác 50%.
Tóm lại, kiểm định giả thuyết và khoảng tin cậy đều thống nhất rằng: không có bằng chứng đủ mạnh để cho rằng tỷ lệ ngành hàng skincare khác 50%, nhưng kết quả gợi mở khả năng có sự khác biệt tiềm ẩn, cần được kiểm tra thêm bằng dữ liệu lớn hơn hoặc phương pháp khác.
Biến Customer.demographics trong bộ dữ liệu là một biến định tính thể hiện đặc điểm phân loại khách hàng theo giới tính và danh tính, gồm bốn nhóm giá trị: Female (nữ), Male (nam), Unknown (không xác định), và Non-binary (không theo nhị phân giới tính). Biến này cung cấp thông tin quan trọng về sự đa dạng của khách hàng sử dụng sản phẩm, từ đó giúp hiểu rõ hơn về đối tượng mục tiêu trong chuỗi cung ứng và chiến lược marketing. Việc phân loại khách hàng theo nhóm giới tính không chỉ giúp đánh giá hành vi tiêu dùng mà còn hỗ trợ doanh nghiệp điều chỉnh các chiến dịch bán hàng phù hợp với từng nhóm. Trong đó, nhóm Unknown phản ánh trường hợp dữ liệu thiếu hoặc chưa được xác định rõ ràng, còn nhóm Non-binary thể hiện sự quan tâm đến khách hàng có danh tính giới tính đa dạng, phù hợp với xu hướng hiện đại và tăng cường tính bao trùm trong phân tích khách hàng. Do đó, biến này đóng vai trò quan trọng trong việc cung cấp cái nhìn sâu sắc về đặc điểm khách hàng và khả năng thích ứng của hệ thống cung ứng với sự đa dạng xã hội.
Dựa trên kết quả thống kê mô tả, biến Customer.demographics thể hiện sự phân bố của nhóm giới tính khách hàng trong bộ dữ liệu với bốn giá trị: Female, Male, Non-binary, và Unknown. Trong đó, nhóm giới tính không xác định (Unknown) chiếm tỷ lệ cao nhất với 31%, tương ứng 31 quan sát, cho thấy một phần đáng kể thông tin về giới tính khách hàng chưa được thu thập hoặc khai báo rõ ràng. Nhóm Female chiếm 25%, Male là 21% và Non-binary là 23%, phản ánh sự hiện diện tương đối đồng đều giữa các nhóm, đặc biệt là sự xuất hiện đáng kể của nhóm Non-binary, chiếm gần một phần tư tổng số quan sát. Điều này có thể cho thấy doanh nghiệp đang phục vụ một tập khách hàng đa dạng về giới tính, trong đó có cả những người không xác định mình theo giới tính truyền thống. Tuy nhiên, tỷ lệ “Unknown” cao cũng đặt ra vấn đề về chất lượng hoặc độ đầy đủ của dữ liệu nhân khẩu học, có thể ảnh hưởng đến tính chính xác khi phân tích sâu hơn về hành vi theo nhóm giới tính. Nhìn chung, biến này cung cấp thông tin quan trọng về đặc điểm khách hàng, giúp hình dung bức tranh toàn cảnh về sự đa dạng giới trong tập dữ liệu.
Biến định tính: Customer.demographics
Hạng mục quan tâm: “Non-binary” Không thuộc nhóm giới tính nam hay nữ
Với mức ý nghĩa 95%, khoảng ước lượng cho nhóm giới tính không thuộc nhóm giới tính nam / nữ được xác định như sau:
prop.test(x = nrow(subset(nv , Customer.demographics == "Non-binary")), n = nrow(nv[nv_cate]) , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Customer.demographics == "Non-binary")) out of nrow(nv[nv_cate]), null probability 0.5
## X-squared = 28.09, df = 1, p-value = 1.158e-07
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.154215 0.326941
## sample estimates:
## p
## 0.23
Kết quả ước lượng khoảng tin cậy 95% cho tỷ lệ khách hàng Non-binary là từ 15.42% đến 32.69% (\([0.1542,\ 0.3269]\)), với tỷ lệ mẫu \(\hat{p} = 0.23\) (tức 23%). Khoảng tin cậy này không bao gồm giá trị 50%, cho thấy tỷ lệ khách hàng Non-binary khác biệt có ý nghĩa thống kê so với 50% – điều phù hợp với kết quả kiểm định tương ứng ở phần trên. Tuy nhiên, độ rộng khoảng vẫn tương đối lớn (gần 17%), phản ánh sự không chắc chắn nhất định, có thể do số lượng mẫu nhóm Non-binary còn hạn chế.
Giả thuyết kiểm định:
H0: Tỷ lệ nhóm Non-binary trong tổng thể khách hàng là 25%
H1: Tỷ lệ nhóm Non-binary trong tổng thể khách hàng dưới 25%
Kết quả kiểm định:
prop.test(x = nrow(subset(nv , Customer.demographics == "Non-binary")), n = nrow(nv[nv_cate]), alternative = "less", p = 0.25 , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Customer.demographics == "Non-binary")) out of nrow(nv[nv_cate]), null probability 0.25
## X-squared = 0.12, df = 1, p-value = 0.3645
## alternative hypothesis: true p is less than 0.25
## 95 percent confidence interval:
## 0.0000000 0.3111509
## sample estimates:
## p
## 0.23
Kết quả kiểm định với \(p\)-value = 0.3645, cho thấy rằng không đủ bằng chứng thống kê để bác bỏ giả thuyết \(H_0\) tại mức ý nghĩa \(\alpha = 0.05\). Điều này có nghĩa là tỷ lệ khách hàng Non-binary không thấp hơn có ý nghĩa thống kê so với 25%. Mặc dù tỷ lệ mẫu là 23%, thấp hơn một chút so với giả thuyết 25%, nhưng sự chênh lệch này không đủ lớn để được xem là có ý nghĩa thống kê. Đồng thời, khoảng tin cậy phía dưới của kiểm định một phía là từ 0 đến 31.12%, cho thấy giá trị 25% hoàn toàn nằm trong khoảng tin cậy, củng cố kết luận trên.
Kết quả thống kê cho thấy phần lớn sản phẩm nằm trong trạng thái Pending (chiếm 41%), tức vẫn đang chờ hoàn tất quá trình kiểm định. Điều này cho thấy một tỉ lệ không nhỏ sản phẩm chưa có kết luận cuối cùng về chất lượng, có thể ảnh hưởng đến tiến độ cung ứng hoặc quá trình ra quyết định. Bên cạnh đó, tỷ lệ sản phẩm bị Fail khá cao, lên đến 36%, vượt trội so với tỷ lệ sản phẩm Pass chỉ ở mức 23%. Điều này cho thấy một dấu hiệu đáng lưu ý về vấn đề chất lượng, khi số lượng sản phẩm không đạt yêu cầu kiểm định gần như gấp rưỡi số sản phẩm đạt chuẩn. Việc phân bố này đặt ra nghi vấn về hiệu quả kiểm soát chất lượng trong chuỗi cung ứng và quy trình sản xuất hiện tại. Nhìn chung, dữ liệu thể hiện sự phân tán rõ rệt giữa ba kết quả, trong đó đáng chú ý là mức độ sản phẩm chưa được đánh giá chính thức và tỷ lệ sản phẩm không đạt chuẩn chiếm ưu thế so với sản phẩm đạt chuẩn.
Biến định tính: Inspection.resul
Hạng mục quan tâm: “Pending” Hoạt động kiểm tra chất lượng đang trong quá trình kiểm định
Với mức ý nghĩa 95%, khoảng ước lượng cho hoạt động kiểm tra chất lượng đang trong quá trình kiểm định được xác định như sau:
prop.test(x = nrow(subset(nv , Inspection.results == "Pending")), n = nrow(nv[nv_cate]) , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Inspection.results == "Pending")) out of nrow(nv[nv_cate]), null probability 0.5
## X-squared = 2.89, df = 1, p-value = 0.08913
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3140323 0.5129652
## sample estimates:
## p
## 0.41
Với mức ý nghĩa 95%, khoảng ước lượng cho tỷ lệ sản phẩm có kết quả kiểm định đang “Pending” (chưa hoàn tất) được xác định là: [31.40%; 51.30%] hay \([0.314;\ 0.513]\), với tỷ lệ mẫu \(\hat{p} = 0.41\) (tức 41%). Khoảng tin cậy này bao phủ tỷ lệ 50%, do đó khi so sánh với mức 50% thì chưa đủ bằng chứng thống kê để khẳng định rằng tỷ lệ sản phẩm Pending khác biệt có ý nghĩa so với mức này. Kết quả kiểm định 2 phía với \(p\)-value = 0.089 cũng khẳng định điều đó. Tuy nhiên, tỷ lệ này vẫn đang nằm trên mức trung bình (hơn 40% sản phẩm đang trong trạng thái chờ kiểm định), là một tỷ lệ đáng lưu ý trong thực tế vận hành.
Giả thuyết kiểm định:
H0: Tỷ lệ Pending trong tổng thể sản phẩm là 25%
H1: Tỷ lệ Pending trong tổng thể sản phẩm là trên 25%
Kết quả kiểm định:
prop.test(x = nrow(subset(nv , Inspection.results == "Pending")), n = nrow(nv[nv_cate]), alternative = "greater", p = 0.25 , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Inspection.results == "Pending")) out of nrow(nv[nv_cate]), null probability 0.25
## X-squared = 12.813, df = 1, p-value = 0.0001721
## alternative hypothesis: true p is greater than 0.25
## 95 percent confidence interval:
## 0.3277893 1.0000000
## sample estimates:
## p
## 0.41
Kết quả kiểm định thu được với p-value = 0.00017, nhỏ hơn mức ý nghĩa 5%, cho phép bác bỏ giả thuyết H0. Do đó, có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sản phẩm đang trong quá trình kiểm định cao hơn 25%. Kết quả này gợi ý rằng quá trình kiểm định có thể đang gặp tắc nghẽn hoặc tồn đọng, từ đó đặt ra yêu cầu cải thiện hiệu quả hoạt động kiểm tra chất lượng.
Biến Transportation.modes trong bộ dữ liệu thể hiện phương thức vận chuyển được sử dụng để giao hàng hóa từ nhà cung cấp đến điểm đến cuối cùng. Đây là một biến định tính danh mục (categorical variable) và có vai trò quan trọng trong việc hiểu rõ đặc điểm vận chuyển của chuỗi cung ứng, chẳng hạn như ảnh hưởng đến thời gian giao hàng, chi phí vận chuyển và mức độ linh hoạt. Các giá trị của biến này thường bao gồm những phương thức phổ biến như Road (đường bộ), Rail (đường sắt), Air (đường hàng không), và Sea (đường biển). Mỗi loại phương thức có đặc trưng riêng về tốc độ, chi phí và độ tin cậy: vận chuyển bằng đường hàng không có thể nhanh nhưng chi phí cao, trong khi đường biển thường tiết kiệm chi phí hơn nhưng thời gian giao hàng dài. Phân tích biến này sẽ giúp hiểu rõ xu hướng vận chuyển chính trong dữ liệu, mức độ phụ thuộc vào từng phương thức cũng như khả năng tối ưu hóa vận hành logistics.
Kết quả thống kê mô tả cho biến “Loại hình vận chuyển hàng hóa” cho thấy sự phân bổ tương đối đồng đều giữa ba phương thức chính là đường bộ (29%), đường sắt (28%) và đường hàng không (26%), trong khi đường biển chiếm tỷ trọng thấp nhất với 17%. Điều này phản ánh rằng doanh nghiệp có xu hướng đa dạng hóa lựa chọn vận chuyển, không phụ thuộc quá mức vào một hình thức duy nhất, từ đó có thể giúp tối ưu chi phí và thời gian giao hàng theo từng hoàn cảnh cụ thể. Mặc dù vậy, tỷ lệ sử dụng đường biển thấp hơn đáng kể có thể xuất phát từ đặc thù sản phẩm (mỹ phẩm, chăm sóc cá nhân) thường yêu cầu thời gian giao hàng nhanh, khó phù hợp với vận chuyển bằng đường biển vốn có tốc độ chậm hơn. Bên cạnh đó, tỷ lệ sử dụng đường bộ và đường sắt cao hơn cũng cho thấy khả năng doanh nghiệp đang hoạt động mạnh tại thị trường nội địa hoặc các khu vực gần kề, nơi các phương thức này có thể phát huy hiệu quả về chi phí và khả năng tiếp cận. Việc phân bố tương đối cân bằng giữa các loại hình vận chuyển thể hiện sự linh hoạt trong chiến lược logistics của doanh nghiệp.
Biến định tính: Transportation.modes
Hạng mục quan tâm: “Air” Vận chuyển bằng đường hàng không
Với mức ý nghĩa 95%, khoảng ước lượng cho loại hình vận chuyển bằng đường hàng không được xác định như sau:
prop.test(x = nrow(subset(nv , Transportation.modes == "Air")), n = nrow(nv[nv_cate]) , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Transportation.modes == "Air")) out of nrow(nv[nv_cate]), null probability 0.5
## X-squared = 22.09, df = 1, p-value = 2.602e-06
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1797427 0.3590222
## sample estimates:
## p
## 0.26
Với mức ý nghĩa 95%, khoảng ước lượng cho tỷ lệ hàng hóa được vận chuyển bằng đường hàng không nằm trong khoảng từ 17,97% đến 35,90%. Tỷ lệ ước lượng từ mẫu là 26%, cho thấy vận chuyển hàng không chiếm một phần tương đối nhỏ trong tổng thể các phương thức vận chuyển. Điều này có thể phản ánh rằng doanh nghiệp chỉ lựa chọn đường hàng không trong một số trường hợp đặc biệt như hàng hóa có giá trị cao hoặc yêu cầu giao hàng nhanh.
Giả thuyết kiểm định:
H0: Tỷ lệ hàng hóa được vận chuyển bằng đường hàng không là 25%
H1: Tỷ lệ hàng hóa được vận chuyển bằng đường hàng không khác 25%
Kết quả kiểm định:
prop.test(x = nrow(subset(nv , Transportation.modes == "Air")), n = nrow(nv[nv_cate]), alternative = "two.sided", p = 0.25 , conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: nrow(subset(nv, Transportation.modes == "Air")) out of nrow(nv[nv_cate]), null probability 0.25
## X-squared = 0.013333, df = 1, p-value = 0.9081
## alternative hypothesis: true p is not equal to 0.25
## 95 percent confidence interval:
## 0.1797427 0.3590222
## sample estimates:
## p
## 0.26
Kết quả kiểm định cho thấy p-value = 0.9081, lớn hơn mức ý nghĩa 5%, do đó không có đủ bằng chứng để bác bỏ giả thuyết H0. Nói cách khác, dữ liệu hiện tại không cho thấy sự khác biệt đáng kể về tỷ lệ vận chuyển bằng đường hàng không so với tỷ lệ giả định 25%. Điều này hàm ý rằng tỷ lệ sử dụng đường hàng không của doanh nghiệp khá ổn định và phù hợp với giả định ban đầu.
prod_tran <- as.data.frame(table(nv$Product.type, nv$Transportation.modes))
colnames (prod_tran) <- c("Product.type", "Transportation.modes", "Frequency")
total_prod_tran <- sum(prod_tran$Frequency)
prod_tran$Percentage <- paste(round( prod_tran$Frequency/total_prod_tran*100, 2), "%")
datatable(prod_tran)
library(ggplot2)
ggplot(prod_tran, aes(x = Transportation.modes, y = Percentage, fill = Product.type)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = Percentage),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(
title = "Tỷ lệ nhóm sản phẩm sử dụng các phương thức vận chuyển khác nhau ",
x = "Phương thức vận chuyển ",
y = "Tỷ lệ (%)",
fill = "Nhóm sản phẩm" ) +
theme_minimal()+
scale_fill_manual(values = c("cosmetics" = "lightsalmon", "haircare" = "darkred", "skincare" = "indianred"))
Kết quả bảng tần suất cho thấy nhóm sản phẩm skincare có tỷ lệ sử dụng phương thức vận chuyển Air cao nhất (13%), tiếp theo là Road (11%) và Rail (9%), trong khi tỷ lệ sử dụng Sea là 7%. Nhóm haircare cũng có xu hướng ưu tiên vận chuyển bằng Road (12%) và Air (8%), nhưng lại có tỷ lệ tương đối thấp với Sea (4%). Ngược lại, nhóm cosmetics không có sự chênh lệch lớn giữa các phương thức, với tỷ lệ khá đồng đều: Rail (9%), Sea (6%), Road (6%), và thấp nhất là Air (5%).
Biểu đồ minh họa rất rõ sự khác biệt trong lựa chọn phương thức vận chuyển giữa các nhóm sản phẩm. Ví dụ, nhóm haircare và skincare đều ưu tiên Air và Road, phản ánh đặc điểm có thể liên quan đến nhu cầu giao hàng nhanh hoặc độ nhạy cảm của sản phẩm với điều kiện vận chuyển. Trong khi đó, cosmetics có phân bố đều hơn, có thể do nhóm này linh hoạt hơn trong khâu vận chuyển hoặc đặc điểm hàng hóa ít bị ảnh hưởng bởi thời gian giao hàng.
Từ đó, có thể nhận thấy rằng từng nhóm sản phẩm có xu hướng lựa chọn phương thức vận chuyển khác nhau, phù hợp với đặc tính hoặc chiến lược logistics riêng biệt.
Giả thuyết kiểm định:
H0: Hai biến độc lập
H1: Hai biến có mối quan hệ
Kết quả kiểm định:
prod_tran_chi <- table(nv$Product.type, nv$Transportation.modes)
chisq.test(prod_tran_chi)
##
## Pearson's Chi-squared test
##
## data: prod_tran_chi
## X-squared = 3.9796, df = 6, p-value = 0.6794
Kết quả kiểm định Chi-bình phương cho thấy giá trị p = 0.6794 (X-squared = 3.98, df = 6), lớn hơn mức ý nghĩa thông thường 0.05. Điều này đồng nghĩa với việc không có đủ bằng chứng thống kê để kết luận rằng có mối quan hệ giữa nhóm sản phẩm và phương thức vận chuyển – tức là, hai biến có thể độc lập với nhau trong mẫu khảo sát này. Tuy nhiên, cần lưu ý rằng cảnh báo từ kiểm định chỉ ra việc một số ô có tần suất nhỏ, chẳng hạn như haircare với Sea chỉ chiếm 4%, hoặc cosmetics với Air là 5%, điều này khiến việc áp dụng kiểm định Chi-squared có thể kém chính xác.
Dù kết quả kiểm định không cho thấy sự khác biệt có ý nghĩa thống kê, nhưng sự khác biệt trong tỷ lệ phân bố vẫn có thể mang giá trị mô tả đáng quan tâm trong bối cảnh nghiên cứu logistics hoặc hành vi tiêu dùng.
prod_ins <- as.data.frame(table(nv$Product.type, nv$Inspection.results))
colnames (prod_ins) <- c("Product.type", "Inspection.results", "Frequency")
total_prod_ins <- sum(prod_ins$Frequency)
prod_ins$Percentage <- paste(round( prod_ins$Frequency/total_prod_ins*100, 2), "%")
datatable(prod_ins)
library(ggplot2)
ggplot(prod_ins, aes(x = Inspection.results, y = Percentage, fill = Product.type)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = Percentage),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(
title = "Tỷ lệ từng nhóm sản phẩm theo kết quả kiểm tra ",
x = "Kết quả kiểm tra",
y = "Tỷ lệ (%)",
fill = "Nhóm sản phẩm" ) +
theme_minimal()+
scale_fill_manual(values = c("cosmetics" = "darkcyan", "haircare" = "cadetblue", "skincare" = "darkturquoise"))
Bảng tần suất cho thấy sự phân bố khá đồng đều giữa ba nhóm sản phẩm về các kết quả kiểm tra chất lượng, tuy nhiên một vài điểm đáng chú ý nổi bật. Nhóm sản phẩm skincare chiếm tỷ lệ cao nhất trong cả ba kết quả: 13% đối với “Fail”, 11% với “Pass” và 16% với “Pending”. Điều này phản ánh rằng sản phẩm skincare là nhóm có số lượng sản phẩm được kiểm định nhiều nhất. Đối với nhóm haircare, tỷ lệ “Fail” khá cao (13%) trong khi “Pass” chỉ chiếm 6%, cho thấy khả năng không đạt kiểm định ở nhóm này có thể đang là một vấn đề. Nhóm cosmetics có sự phân bổ khá cân bằng giữa các kết quả (10% “Fail”, 6% “Pass” và 10% “Pending”), cho thấy tính ổn định hơn trong chất lượng so với haircare. Biểu đồ trực quan đã hỗ trợ tốt việc nhận diện các chênh lệch này giữa các nhóm sản phẩm, đặc biệt khi so sánh giữa “Fail” và “Pass”.
Giả thuyết kiểm định:
H0: Hai biến độc lập
H1: Hai biến có mối quan hệ
Kết quả kiểm định:
prod_ins_chi <- table(nv$Product.type, nv$Inspection.results)
chisq.test(prod_ins_chi)
##
## Pearson's Chi-squared test
##
## data: prod_ins_chi
## X-squared = 1.1341, df = 4, p-value = 0.8888
Kết quả kiểm định Chi-bình phương cho thấy p-value = 0.8888, cao hơn nhiều so với mức ý nghĩa thông thường (0.05), đồng nghĩa với việc không có bằng chứng thống kê để bác bỏ giả thuyết H0. Nói cách khác, không có mối quan hệ có ý nghĩa thống kê giữa nhóm sản phẩm và kết quả kiểm định chất lượng. Dù bảng tần suất gợi ý một vài khác biệt nhẹ, kiểm định này cho thấy các khác biệt đó có thể chỉ là do ngẫu nhiên. Kết luận này đồng nhất với nhận định từ biểu đồ, rằng các nhóm có sự phân bố tương đối đồng đều và không có xu hướng nào thực sự nổi bật giữa nhóm sản phẩm và kết quả kiểm định.
Hạng mục quan tâm:
“Haircare”, “Skincare” trong Product.type
“Pass”, “Fail” trong Inspection.results
Tạo bảng tần suất chéo 2x2
pro_ins_df <- nv %>%
dplyr::filter(Product.type %in% c("haircare", "skincare"),
Inspection.results %in% c("Pass", "Fail"))
pro_ins_df <- droplevels(pro_ins_df)
pro_ins_2x2 <- table(pro_ins_df$Product.type, pro_ins_df$Inspection.results)
pro_ins_2x2
##
## Fail Pass
## haircare 13 6
## skincare 13 11
Tính Relative Risk
library(epitools)
riskratio(pro_ins_2x2)
## $data
##
## Fail Pass Total
## haircare 13 6 19
## skincare 13 11 24
## Total 26 17 43
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## haircare 1.000000 NA NA
## skincare 1.451389 0.6574059 3.204306
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## haircare NA NA NA
## skincare 0.3662166 0.3694047 0.3424119
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Phân tích Relative Risk và Odds Ratio cung cấp thêm góc nhìn định lượng cụ thể về xác suất “Pass” giữa hai nhóm sản phẩm haircare và skincare. Kết quả cho thấy tỷ lệ đạt kiểm định (Pass) ở skincare cao hơn haircare (RR = 1.45), nghĩa là khả năng đạt Pass của skincare cao hơn 45% so với haircare. Tuy nhiên, khoảng tin cậy rộng (0.66–3.20) và p-value > 0.36 cho thấy kết quả này không có ý nghĩa thống kê, đồng nghĩa rằng sự khác biệt chưa đủ mạnh để kết luận có sự khác biệt thực sự.
Tính Odds Ratio
oddsratio(pro_ins_2x2)
## $data
##
## Fail Pass Total
## haircare 13 6 19
## skincare 13 11 24
## Total 26 17 43
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## haircare 1.000000 NA NA
## skincare 1.794831 0.5095036 6.771615
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## haircare NA NA NA
## skincare 0.3662166 0.3694047 0.3424119
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Phân tích Odds Ratio cho kết quả tương tự (OR = 1.79), củng cố quan sát rằng skincare có xu hướng tốt hơn, nhưng vẫn trong giới hạn không có ý nghĩa thống kê. Do đó, dù có một số dấu hiệu nghiêng về skincare, bằng chứng chưa đủ để kết luận chắc chắn rằng nhóm này có chất lượng vượt trội hơn haircare.
prod_cus <- as.data.frame(table(nv$Product.type, nv$Customer.demographics))
colnames (prod_cus) <- c("Product.type", "Customer.demographics", "Frequency")
total_prod_cus <- sum(prod_cus$Frequency)
prod_cus$Percentage <- paste(round( prod_cus$Frequency/total_prod_cus*100, 2), "%")
datatable(prod_cus)
Kết quả cho thấy, ở nhóm khách hàng nữ (Female), sản phẩm được lựa chọn nhiều nhất là skincare với 13 lượt, tiếp theo là cosmetics với 10 lượt, trong khi haircare chỉ có 2 lượt. Ngược lại, nhóm khách hàng nam (Male) lại có xu hướng ưu tiên haircare (10 lượt), sau đó là skincare (7 lượt) và cosmetics (4 lượt). Với nhóm phi nhị nguyên giới (Non-binary), sản phẩm phổ biến nhất vẫn là skincare (11 lượt), trong khi haircare và cosmetics lần lượt có 7 và 5 lượt. Nhóm khách hàng không rõ giới tính (Unknown) ghi nhận lựa chọn nhiều nhất thuộc về haircare với 15 lượt. Sự phân bố này được trực quan hóa bằng biểu đồ cột, giúp thể hiện rõ sự khác biệt về tỷ lệ lựa chọn sản phẩm giữa các nhóm giới tính.
library(ggplot2)
ggplot(prod_cus, aes(x = Customer.demographics, y = Percentage, fill = Product.type)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = Percentage),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(
title = "Tỷ lệ lựa chọn sản phẩm theo giới tính của nhóm khách hàng ",
x = "Giới tính ",
y = "Tỷ lệ (%)",
fill = "Nhóm sản phẩm" ) +
theme_minimal()+
scale_fill_manual(values = c("cosmetics" = "deeppink", "haircare" = "palevioletred", "skincare" = "pink"))
Giả thuyết kiểm định:
H0: Hai biến độc lập
H1: Hai biến có mối quan hệ
Kết quả kiểm định:
prod_cus_chi <- table(nv$Product.type, nv$Customer.demographics)
chisq.test(prod_cus_chi)
##
## Pearson's Chi-squared test
##
## data: prod_cus_chi
## X-squared = 13.082, df = 6, p-value = 0.04175
Kết quả kiểm định cho thấy giá trị Chi-squared là 13.082 với 6 bậc tự do và giá trị p là 0.04175. Vì p-value nhỏ hơn ngưỡng ý nghĩa 0.05, ta bác bỏ giả thuyết H0, tức là tồn tại mối liên hệ có ý nghĩa thống kê giữa giới tính khách hàng và loại sản phẩm họ lựa chọn. Nói cách khác, lựa chọn sản phẩm không phân bố ngẫu nhiên theo giới tính mà có sự khác biệt rõ rệt giữa các nhóm.
Nhằm hiểu rõ hơn bản chất mối liên hệ giữa hai biến, phân tích sâu hơn được thực hiện thông qua hai chỉ số: Relative Risk (RR) và Odds Ratio (OR), trong đó giới hạn lại phạm vi phân tích cho hai nhóm sản phẩm là haircare và skincare, và hai nhóm giới tính là Male và Female.
Hạng mục quan tâm:
“Haircare”, “Skincare” trong Product.type
“Male”, “Female” trong ICustomer.demographics
Tạo bảng tần suất chéo 2x2
pro_cus_df <- nv %>%
dplyr::filter(Product.type %in% c("haircare", "skincare") &
Customer.demographics %in% c("Male", "Female"))
pro_cus_df <- droplevels(pro_cus_df)
pro_cus_2x2 <- table(pro_cus_df$Product.type, pro_cus_df$Customer.demographics)
pro_cus_2x2
##
## Female Male
## haircare 2 10
## skincare 13 7
Tính Relative Risk
riskratio(pro_cus_2x2)
## $data
##
## Female Male Total
## haircare 2 10 12
## skincare 13 7 20
## Total 15 17 32
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## haircare 1.00 NA NA
## skincare 0.42 0.2195581 0.8034321
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## haircare NA NA NA
## skincare 0.01074302 0.011807 0.007989542
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Kết quả cho thấy, xác suất lựa chọn skincare ở nhóm nữ cao hơn đáng kể so với nhóm nam, với RR = 0.42 và khoảng tin cậy 95% là từ 0.22 đến 0.80. Điều này cho thấy nhóm nam có khả năng chọn skincare thấp hơn khoảng 58% so với nhóm nữ.
Tính Odds Ratio
oddsratio(pro_cus_2x2)
## $data
##
## Female Male Total
## haircare 2 10 12
## skincare 13 7 20
## Total 15 17 32
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## haircare 1.0000000 NA NA
## skincare 0.1213554 0.01395547 0.6354087
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## haircare NA NA NA
## skincare 0.01074302 0.011807 0.007989542
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Đồng thời, chỉ số Odds Ratio cũng phản ánh xu hướng tương tự, khi OR = 0.12 (CI: 0.014 – 0.635), cho thấy rằng tỷ lệ odds chọn skincare ở nam thấp hơn rất nhiều so với nữ. Các kiểm định đi kèm đều cho kết quả có ý nghĩa thống kê với p-value nhỏ hơn 0.05.
Tổng kết lại, các phân tích định tính và định lượng đều khẳng định rằng tồn tại sự khác biệt đáng kể giữa các nhóm khách hàng trong việc lựa chọn loại sản phẩm. Đặc biệt, nhóm nữ có xu hướng lựa chọn sản phẩm skincare cao hơn, trong khi nhóm nam thiên về sản phẩm haircare. Điều này có thể được lý giải bởi sự khác biệt trong nhu cầu chăm sóc cá nhân giữa các giới tính, đồng thời cũng là gợi ý hữu ích cho các chiến lược marketing và phân khúc khách hàng mục tiêu trong tương lai.