Những thông tin cơ bản liên quan đế bộ dữ liệu:

Đọc dữ liệu

library(readr)
Sales <- read_csv("C:/Users/nguye/Downloads/100000 Sales Records.csv")
## Rows: 100000 Columns: 14
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Region, Country, Item.Type, Sales.Channel, Order.Priority, Order.Da...
## dbl (7): Order.ID, Units.Sold, Unit.Price, Unit.Cost, Total.Revenue, Total.C...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Nhận xét: Kết quả in ra cho thấy bộ dữ liệu gồm 100.000 dòng và 14 cột, trong đó có 7 biến ký tự là Region, Country, Item.Type, Sales.Channel, Order.Priority, Order.Date, Ship.Date và 7 biến số là Units.Sold, Unit.Price, Unit.Cost, Total.Revenue, Total.Cost, Total.Profit. Đây là một bộ dữ liệu lớn, có cấu trúc rõ ràng và bao quát nhiều khía cạnh trong hoạt động bán hàng.

Kiểm tra NA

sapply(Sales,function(Sales) sum(is.na(Sales)))
##         Region        Country      Item.Type  Sales.Channel Order.Priority 
##              0              0              0              0              0 
##     Order.Date       Order.ID      Ship.Date     Units.Sold     Unit.Price 
##              0              0              0              0              0 
##      Unit.Cost  Total.Revenue     Total.Cost   Total.Profit 
##              0              0              0              0

Nhận xét:Kết quả kiểm tra trả về toàn bộ giá trị bằng 0, nghĩa là không có bất kỳ giá trị thiếu nào trong 14 cột dữ liệu.Đây là một kết quả tốt vì dữ liệu đầy đủ, không bị NA .Điều này có nghĩa là không cần áp dụng thêm bất kỳ phương pháp xử lý bổ sung khác.Nhờ đó, các phân tích tiếp theo như tính tổng doanh thu, lợi nhuận hay vẽ biểu đồ đều đảm bảo chính xác và đáng tin cậy, không bị ảnh hưởng bởi lỗi thiếu dữ liệu.

Xử lý các bản ghi trùng lặp

Sales[duplicated(Sales),]
## # A tibble: 0 × 14
## # ℹ 14 variables: Region <chr>, Country <chr>, Item.Type <chr>,
## #   Sales.Channel <chr>, Order.Priority <chr>, Order.Date <chr>,
## #   Order.ID <dbl>, Ship.Date <chr>, Units.Sold <dbl>, Unit.Price <dbl>,
## #   Unit.Cost <dbl>, Total.Revenue <dbl>, Total.Cost <dbl>, Total.Profit <dbl>

Nhận xét:Kết quả hiển thị là một bảng rỗng (# A tibble: 0 x 14), nghĩa là không có dòng dữ liệu nào bị trùng lặp. Kết quả này rất tốt vì đảm bảo các phép tính tổng hợp như doanh thu hoặc lợi nhuận không bị sai lệch do dữ liệu trùng. Dữ liệu có độ tin cậy cao và phản ánh đúng thực tế

Boxplot: thể hiện sự phân bố dữ liệu

Units.Sold – Số lượng sản phẩm bán ra

boxplot(Sales$Units.Sold)

>Nhận xét:Min = 1, Q1 = 2505, Q2 (Median) = 5007, Q3 = 7495, Max = 10000 Số lượng sản phẩm bán ra dao động từ 1 đến 10000 sản phẩm, thể hiện sự khác biệt lớn giữa các đơn hàng. Một nửa số đơn hàng (50%) có lượng bán nằm trong khoảng 2505 – 7495 sản phẩm, được giới hạn bởi hai tứ phân vị Q1 và Q3. Giá trị trung vị (Q2 = 5007) nằm gần giữa hộp, cho thấy dữ liệu phân bố khá cân đối quanh mức trung bình. Hầu hết các đơn hàng có quy mô trung bình, khoảng 5000 sản phẩm, trong khi một số đơn lớn đạt tới 10000 sản phẩm, có thể là đơn sỉ hoặc hợp đồng cung cấp số lượng lớn cho đại lý.

Unit.Price – Giá bán mỗi sản phẩm

boxplot(Sales$Unit.Price)

>Nhận xét:Min = 9,33, Q1 = 109,28, Q2 = 205,70, Q3 = 437,20, Max = 668,27 Giá bán mỗi sản phẩm có sự chênh lệch rõ rệt giữa các loại hàng. Một nửa số sản phẩm có giá nằm trong khoảng 109,28 – 437,20 đồng (Q1 – Q3). Giá trị trung vị (Q2 = 205,70) thể hiện mức giá phổ biến nhất rơi vào nhóm trung bình thấp, quanh 200 đồng. Giá thấp nhất là 9,33 đồng, trong khi cao nhất là 668,27 đồng, cho thấy doanh nghiệp kinh doanh đa dạng nhiều loại hàng hóa từ giá rẻ đến cao cấp. Biểu đồ có dạng lệch phải, nghĩa là phần lớn sản phẩm có giá thấp, chỉ một số ít có giá rất cao – thường là hàng cao cấp hoặc đặc biệt.

Unit.Cost – Chi phí sản xuất mỗi sản phẩm

boxplot(Sales$Unit.Cost)

>Nhận xét:Min = 6,92, Q1 = 56,67, Q2 = 117,11, Q3 = 364,69, Max = 524,96 Chi phí sản xuất dao động từ 6,92 đến 524,96 đồng, cho thấy mức độ khác biệt đáng kể giữa các mặt hàng. Khoảng giữa (Q1 – Q3) nằm trong khoảng 56,67 – 364,69 đồng, tức là 50% sản phẩm có chi phí ở mức trung bình. Giá trị trung vị (Q2 = 117,11) thấp hơn trung bình (188,02), phản ánh rằng đa số sản phẩm có chi phí thấp, chỉ một số ít sản phẩm đặc biệt có chi phí cao. So sánh với giá bán (trung bình 266,70 đồng), có thể thấy biên lợi nhuận dương, chứng tỏ doanh nghiệp đang hoạt động hiệu quả. Dữ liệu có dạng lệch phải nhẹ, do một vài sản phẩm có chi phí cao vượt trội so với phần còn lại.

Total.Revenue – Tổng doanh thu

boxplot(Sales$Total.Revenue)

>Nhận xét:Min = 18,7, Q1 = 279753,3, Q2 = 789891,6, Q3 = 1836489,6, Max = 6682700,0 Tổng doanh thu của các đơn hàng thay đổi rất mạnh, từ 18,7 đồng đến 6682700 đồng, phản ánh sự khác biệt lớn về quy mô giao dịch. Một nửa số đơn hàng có doanh thu trong khoảng 279753 – 1836489 đồng (Q1 – Q3). Giá trị trung vị (Q2 = 789891) cho thấy đa số đơn hàng mang lại doanh thu trung bình, dưới 1 triệu đồng. Biểu đồ có dạng lệch phải, nghĩa là phần lớn đơn hàng ở mức doanh thu vừa phải, nhưng có một số ít đơn hàng đặc biệt lớn làm tổng doanh thu tăng cao.

Total.Cost – Tổng chi phí

boxplot(Sales$Total.Cost)

>Nhận xét: Min = 13,8, Q1 = 162.928,3, Q2 = 467.937,4, Q3 = 1.209.474,7, Max = 5.249.075,0 Tổng chi phí của các đơn hàng phân bố từ 13,8 đến 5249075 . Phần lớn chi phí tập trung trong khoảng 162928 – 1209474, tương ứng với vùng giữa Q1 – Q3. Giá trị trung vị (Q2 = 467937) cho thấy đa số đơn hàng có chi phí trung bình khoảng 450000 đồng. Dữ liệu lệch phải, nghĩa là một vài đơn hàng có chi phí rất cao, thường đi kèm với doanh thu cao. Nhìn chung, chi phí tăng tỉ lệ thuận với doanh thu, và vì chi phí trung bình (941975) thấp hơn doanh thu trung bình (1336066 ), nên doanh nghiệp vẫn duy trì lợi nhuận dương và ổn định.

Total.Profit – Tổng lợi nhuận

boxplot(Sales$Total.Profit)

>Nhận xét:Min = 4,82, Q1 = 95900, Q2 = 283700, Q3 = 568400, Max = 1739000 Lợi nhuận của các đơn hàng dao động từ 4,82 đến 1739000, cho thấy hiệu quả bán hàng thay đổi tùy quy mô đơn hàng. Một nửa các đơn hàng có lợi nhuận trong khoảng 95900 – 568400 (Q1 – Q3). Giá trị trung vị (Q2 = 283700) thể hiện mức lợi nhuận phổ biến nhất mà doanh nghiệp thu được cho mỗi đơn hàng. Biểu đồ lệch phải, nghĩa là đa số đơn hàng có lợi nhuận trung bình hoặc thấp, nhưng vẫn có một số đơn hàng đặc biệt sinh lợi cao, kéo giá trị trung bình lên (394100). Điều này phản ánh tính hiệu quả và ổn định trong hoạt động kinh doanh, đồng thời thể hiện khả năng tạo ra lợi nhuận cao ở các giao dịch quy mô lớn.

Chuẩn hóa số liệu

scale <- function(vector){
  if(is.numeric(vector) != TRUE){
    print("No have num")
  }
  empty=c()
  minus <- vector - min(vector)
  scaling <- minus / (max(vector)-min(vector))
}
Units.Sold <- as.data.frame(scale(Sales$Units.Sold))
colnames(Units.Sold) <- c("scale.UNS")

Nhận xét:Việc chuẩn hóa giúp đưa các biến về cùng thang đo (0–1), thuận tiện khi so sánh hoặc vẽ biểu đồ. Đây là bước cần thiết trong các phân tích thống kê hoặc mô hình hóa vì nó giúp loại bỏ sự khác biệt về đơn vị đo lường giữa các biến (ví dụ doanh thu tính bằng triệu đồng trong khi giá đơn vị tính bằng nghìn đồng).

Coi min max của bộ dữ liệu

summary(Sales)
##     Region            Country           Item.Type         Sales.Channel     
##  Length:100000      Length:100000      Length:100000      Length:100000     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Order.Priority      Order.Date           Order.ID          Ship.Date        
##  Length:100000      Length:100000      Min.   :100008904   Length:100000     
##  Class :character   Class :character   1st Qu.:326046383   Class :character  
##  Mode  :character   Mode  :character   Median :547718512   Mode  :character  
##                                        Mean   :550395554                     
##                                        3rd Qu.:775078534                     
##                                        Max.   :999996459                     
##    Units.Sold      Unit.Price       Unit.Cost      Total.Revenue      
##  Min.   :    1   Min.   :  9.33   Min.   :  6.92   Min.   :     18.7  
##  1st Qu.: 2505   1st Qu.:109.28   1st Qu.: 56.67   1st Qu.: 279753.3  
##  Median : 5007   Median :205.70   Median :117.11   Median : 789891.6  
##  Mean   : 5001   Mean   :266.70   Mean   :188.02   Mean   :1336066.7  
##  3rd Qu.: 7495   3rd Qu.:437.20   3rd Qu.:364.69   3rd Qu.:1836489.6  
##  Max.   :10000   Max.   :668.27   Max.   :524.96   Max.   :6682700.0  
##    Total.Cost         Total.Profit      
##  Min.   :     13.8   Min.   :4.820e+00  
##  1st Qu.: 162928.3   1st Qu.:9.590e+04  
##  Median : 467937.4   Median :2.837e+05  
##  Mean   : 941975.5   Mean   :3.941e+05  
##  3rd Qu.:1209474.7   3rd Qu.:5.684e+05  
##  Max.   :5249075.0   Max.   :1.739e+06
class(Sales$Order.Date)
## [1] "character"

Nhận xét:Các biến đều có độ phân tán khá lớn, thể hiện sự khác biệt giữa các đơn hàng. Trung bình, mỗi đơn hàng bán ra khoảng 5000 sản phẩm, với giá trung bình 266,7 và chi phí 188,02. Giá trị trung bình của doanh thu (1.336.066) cao hơn chi phí (941.975), cho thấy lợi nhuận trung bình của mỗi đơn hàng đạt khoảng 394.100, phản ánh hiệu quả kinh doanh tích cực.

Phân tổ dữ liệu

Sales$Order.Date <- as.Date(Sales$Order.Date, format = "%m/%d/%Y") #chuyển định dạng về Date
Sales$Year <- format(as.Date(Sales$Order.Date), "%Y")

Nhận xét:Sau khi chuyển cột Order.Date sang định dạng thời gian (Date) và tách ra năm (Year), dữ liệu được phân tổ để phục vụ các phân tích theo thời gian và khu vực.

Phân tổ tổng lợi nhuận

Profit_Year <- aggregate(
  x=Sales$Total.Profit,
  by=list(Sales$Year),
  FUN = sum
)
colnames(Profit_Year) <-c("Year","SUM") 
Profit_Year[order(Profit_Year$SUM),] #sắp xếp thứ từ theo tổng DT từ nhỏ đến lớn
##   Year        SUM
## 8 2017 2983968206
## 7 2016 5166950338
## 3 2012 5171870649
## 2 2011 5181709653
## 1 2010 5196744930
## 5 2014 5222129309
## 6 2015 5226962291
## 4 2013 5258788354

Nhận xét:Ta thấy lợi nhuận ổn định quanh mức 5,1–5,2 tỷ trong giai đoạn 2010–2016.Tổng nhuận tăng dần qua các năm, đạt đỉnh vào năm 2013 (hơn 5,25 tỷ). Mặc dù năm 2017 có tổng lợi nhuận thấp nhất (2,98 tỷ), nhìn chung doanh nghiệp duy trì mức sinh lời cao và ổn định trong giai đoạn 2010–2016.

Đổi tên các đơn hàng ưu tiên đầy đủ

Sales$Order.Priority[Sales$Order.Priority == "C"] <- "Critical"
Sales$Order.Priority[Sales$Order.Priority == "H"] <- "High"
Sales$Order.Priority[Sales$Order.Priority == "M"] <- "Medium"
Sales$Order.Priority[Sales$Order.Priority == "L"] <- "Low"

Nhận xét:Các ký hiệu “C”, “H”, “M”, “L” được chuyển thành “Critical”, “High”, “Medium”, “Low”. Việc đổi tên này giúp dữ liệu dễ đọc hơn, thuận tiện cho việc phân tích và trực quan hóa sau này.

Phân tổ tổng doanh thu theo loại hàng và độ ưu tiên

Reve_Item_Priority <- aggregate(Sales$Total.Revenue,
          by = list(Item = Sales$Item.Type, Priority = Sales$Order.Priority),
          FUN = sum)

Nhận xét:Household và Office Supplies là hai loại hàng mang lại doanh thu lớn nhất ở tất cả các mức ưu tiên, cho thấy đây là những nhóm hàng chủ lực. Trong khi đó, Fruits và Beverages có doanh thu thấp ở mọi mức, thể hiện đây là các mặt hàng có quy mô nhỏ hoặc ít được chú trọng. Các đơn hàng Critical và High nhìn chung mang lại doanh thu cao nhất, chứng tỏ việc xử lý nhanh các đơn hàng ưu tiên cao giúp tăng đáng kể tổng doanh thu cho doanh nghiệp.

Phân tổ trung bình sản phẩm được bán theo Châu á và item

Asia = Sales[Sales$Region=="Asia",]

Nhận xét:Khi lọc dữ liệu cho khu vực Asia, ta có thể phân tích sâu hơn theo từng mặt hàng. Việc tính trung bình số sản phẩm bán và lợi nhuận theo từng quốc gia cho phép so sánh hiệu quả kinh doanh giữa các nước trong khu vực

Thêm cột doanh thu trung bình

Sold_asia <- aggregate(
  cbind(Units.Sold = Asia$Units.Sold,
        Total.Profit = Asia$Total.Profit),
  by = list(country = Asia$Country, Item = Asia$Item.Type),
  FUN = mean
)

Nhận xét:Biến mới giúp đánh giá hiệu quả kinh doanh tương đối giữa các quốc gia và sản phẩm. Những nước hoặc mặt hàng có doanh thu trung bình cao là những khu vực trọng điểm tiềm năng.

Tính tứ phân vị dựa trên bộ dữ liệu trên

q_unit <- quantile(Sold_asia$Units.Sold, probs = c(0.25, 0.75))
q_profit <- quantile(Sold_asia$Total.Profit, probs = c(0.25, 0.75))

Nhận xét:Giá trị tứ phân vị của Units.Sold là Q1=4701 và Q3=5319, có nghĩa là nhóm quốc gia có doanh số dưới 4701 được xem là thấp, nhóm từ 4701 đến 5319 là trung bình, và trên 5319 là cao.Còn của Total.Profit là Q1=215725 và Q3=525101, có nghĩa là quốc gia có lợi nhuận dưới 215725 được xếp vào nhóm thấp, từ 215725 đến 525101 là trung bình, và trên 525101 là cao.

Phân loại theo mức phát triển

Sold_asia$PhatTrien <- ifelse(
  Sold_asia$Units.Sold < q_unit[1] & Sold_asia$Total.Profit < q_profit[1], "Phát triển chậm",
  ifelse(
    Sold_asia$Units.Sold <= q_unit[2] & Sold_asia$Total.Profit <= q_profit[2], "Phát triển trung bình",
    "Phát triển tốt"
  )
)

Nhận xét:Dựa trên hai tiêu chí số lượng bán và lợi nhuận, các quốc gia được chia thành: Phát triển chậm: cả doanh số và lợi nhuận đều thấp (dưới Q1). Phát triển trung bình: nằm trong khoảng giữa Q1 và Q3. Phát triển tốt: cả hai chỉ tiêu đều vượt Q3. Phân loại này giúp doanh nghiệp nhận diện các thị trường tiềm năng và những khu vực cần cải thiện chiến lược bán hàng.

Kiểm tra các nước phát triển chậm

low_deve <- Sold_asia[Sold_asia$PhatTrien == "Phát triển chậm",]

Nhận xét:Danh sách các nước thuộc nhóm “phát triển chậm” được trích lọc để phân tích riêng, từ đó đề xuất giải pháp như tăng quảng cáo, thay đổi chính sách giá, hay mở rộng kênh phân phối để cải thiện hiệu quả kinh doanh.

R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.