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.
meaning_variable <- data.frame(
Tên_biến = c( "Region","Country", "Item.Type", "Sales.Channel","Order.Priority" ,"Order.Date","Order.ID" ,"Ship.Date","Units.Sold","Unit.Price", "Unit.Cost", "Total.Revenue", "Total.Cost", "Total.Profit"),
Ý_nghĩa = c("Châu lục","Đất nước","Loại hàng hóa","Kênh bán hàng","Mức độ ưu tiên cho đơn hàng","Ngày đặt hàng","Mã vận đơn","Ngày giao hàng","Số lượng hàng hóa bán ra","Giá của một đơn vị hàng hóa","Giá để sản xuất một đơn vị hàng hóa","Tổng doanh thu","Tổng chi phí","Tổng lợi nhuận")
)
print(meaning_variable)
## Tên_biến Ý_nghĩa
## 1 Region Châu lục
## 2 Country Đất nước
## 3 Item.Type Loại hàng hóa
## 4 Sales.Channel Kênh bán hàng
## 5 Order.Priority Mức độ ưu tiên cho đơn hàng
## 6 Order.Date Ngày đặt hàng
## 7 Order.ID Mã vận đơn
## 8 Ship.Date Ngày giao hàng
## 9 Units.Sold Số lượng hàng hóa bán ra
## 10 Unit.Price Giá của một đơn vị hàng hóa
## 11 Unit.Cost Giá để sản xuất một đơn vị hàng hóa
## 12 Total.Revenue Tổng doanh thu
## 13 Total.Cost Tổng chi phí
## 14 Total.Profit Tổng lợi nhuận
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
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.
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.
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ế
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, 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).
Vì định dạng đang ở character, nên sẽ có thêm bước chuyển về dữ liệu về đúng định dạng.
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")
Sales_Year_2014 <- Sales[Sales$Year == "2014",]
print(head(Sales_Year_2014))
## # A tibble: 6 × 15
## Region Country Item.Type Sales.Channel Order.Priority Order.Date Order.ID
## <chr> <chr> <chr> <chr> <chr> <date> <dbl>
## 1 Middle Eas… Azerba… Snacks Online C 2014-10-08 5.35e8
## 2 Sub-Sahara… Sao To… Personal… Online M 2014-09-17 8.93e8
## 3 Middle Eas… Jordan Household Offline L 2014-07-09 2.23e8
## 4 Sub-Sahara… Comoros Beverages Offline L 2014-08-10 5.81e8
## 5 Sub-Sahara… Zambia Cosmetics Offline M 2014-07-26 9.93e8
## 6 Middle Eas… Egypt Cereal Online C 2014-07-14 8.88e8
## # ℹ 8 more variables: Ship.Date <chr>, Units.Sold <dbl>, Unit.Price <dbl>,
## # Unit.Cost <dbl>, Total.Revenue <dbl>, Total.Cost <dbl>, Total.Profit <dbl>,
## # Year <chr>
Nhận Xét: Thực hiện phân tổ theo năm giúp ta dễ kiểm soát được năm đó có bao nhiêu đơn hàng được đặt
Sales$Ship.Date <- as.Date(Sales$Ship.Date, format = "%m/%d/%Y")
Sales$delivery_Date <- as.data.frame(Sales$Ship.Date-Sales$Order.Date)
summary(Sales$delivery_Date )
## Sales$Ship.Date - Sales$Order.Date
## Min. : 0.00 days
## 1st Qu.:12.00 days
## Median :25.00 days
## Mean :25.04 days
## 3rd Qu.:38.00 days
## Max. :50.00 days
Dựa vào thống kê ngày giao hàng, sẽ phân ra làm ba mức ngày giao hàng theo tứ phân vị: - Khoảng 1 nếu nhỏ hơn tứ phân vị 1 thì có tốc độ giao hàng nhanh. - Khoảng 2 nếu nhỏ hơn tứ phân vị 3 thì có tốc độ giao hàng trung bình. - Khoảng 3 nếu lớn hơn tứ phân vị 3 thì có tốc độ giao hàng nhanh.
Sales$Sort_Date <- ifelse(
Sales$delivery_Date < 12, "Tốc độ nhanh",
ifelse(
Sales$delivery_Date < 38, "Tốc độ trung bình",
"Tốc độ chậm"))
table(Sales$Sort_Date)
##
## Tốc độ chậm Tốc độ nhanh Tốc độ trung bình
## 25709 23553 50738
Nhận xét:Kết quả thống kê cho thấy thời gian giao hàng trung bình là khoảng 25,04 ngày, với giá trị nhỏ nhất là 0 ngày và lớn nhất là 50 ngày. Các tứ phân vị lần lượt là Q1 = 12 ngày, Q2 = 25 ngày và Q3 = 38 ngày, cho thấy phần lớn các đơn hàng được giao trong khoảng từ 12 đến 38 ngày. Dựa trên kết quả này, dữ liệu được phân loại thành ba nhóm: “Tốc độ nhanh” (dưới 12 ngày) với 23.553 đơn hàng, “Tốc độ trung bình” (từ 12 đến 38 ngày) với 50.738 đơn hàng, và “Tốc độ chậm” (trên 38 ngày) với 25.709 đơn hàng
Tốc_độ_chậm <- Sales[Sales$Sort_Date == "Tốc độ chậm",]
head(Tốc_độ_chậm)
## # A tibble: 6 × 17
## Region Country Item.Type Sales.Channel Order.Priority Order.Date Order.ID
## <chr> <chr> <chr> <chr> <chr> <date> <dbl>
## 1 Sub-Sahara… Sao To… Fruits Offline M 2015-12-09 8.54e8
## 2 Europe Malta Household Offline L 2015-03-10 2.44e8
## 3 Sub-Sahara… Camero… Fruits Online H 2015-12-18 3.70e8
## 4 Middle Eas… Morocco Vegetabl… Offline L 2014-05-15 2.29e8
## 5 Europe Switze… Baby Food Offline M 2011-03-26 5.40e8
## 6 North Amer… Greenl… Fruits Online L 2011-07-30 1.21e8
## # ℹ 10 more variables: Ship.Date <date>, Units.Sold <dbl>, Unit.Price <dbl>,
## # Unit.Cost <dbl>, Total.Revenue <dbl>, Total.Cost <dbl>, Total.Profit <dbl>,
## # Year <chr>, delivery_Date <df[,1]>, Sort_Date <chr[,1]>
Đầu tiên, các ký hiệu “C”, “H”, “M”, “L” trong cột Order.Priority được thay thế lần lượt bằng “Critical”, “High”, “Medium” và “Low” để dữ liệu dễ hiểu và thuận tiện cho phân tích. Sau đó, dữ liệu được phân tổ theo loại hàng (Item.Type) và độ ưu tiên (Order.Priority) để xem xét mức doanh thu tương ứng.
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"
Reve_Item_Priority <- aggregate(Sales$Total.Revenue,
by = list(Item = Sales$Item.Type, Priority = Sales$Order.Priority),
FUN = sum)
print(head(Reve_Item_Priority[order(Reve_Item_Priority$x, decreasing = TRUE),], 5)) # Doanh thu cao nhất
## Item Priority x
## 45 Office Supplies Medium 7092747489
## 31 Household Low 7075645433
## 43 Household Medium 6963174924
## 21 Office Supplies High 6934264465
## 7 Household Critical 6892145842
print(tail(Reve_Item_Priority[order(Reve_Item_Priority$x, decreasing = TRUE),], 5)) # Doanh thu thấp nhất
## Item Priority x
## 2 Beverages Critical 489781794
## 18 Fruits High 97379757
## 6 Fruits Critical 96050857
## 30 Fruits Low 93937323
## 42 Fruits Medium 93270648
Nhận xét:Office Supplies và Household là hai nhóm hàng có doanh thu cao nhất, cho thấy đây là nhóm hàng được tiêu thụ ổn định, có đơn hàng lớn và thường xuyên. Ngược lại, Fruits và Beverages nằm trong nhóm doanh thu thấp nhất, dù có các đơn hàng mang độ ưu tiên “Critical”, cho thấy đây là nhóm sản phẩm ít được đặt hoặc có giá trị đơn hàng thấp hơn.
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ố 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
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Sold_asia <- Asia %>%
group_by(Country, Item.Type) %>%
summarise(
Mean_Profit = mean(Total.Profit, na.rm = TRUE),
Min_Profit = min(Total.Profit, na.rm = TRUE),
Max_Profit = max(Total.Profit, na.rm = TRUE),
Var_Profit = var(Total.Profit, na.rm = TRUE)
)
## `summarise()` has grouped output by 'Country'. You can override using the
## `.groups` argument.
print(head(Sold_asia))
## # A tibble: 6 × 6
## # Groups: Country [1]
## Country Item.Type Mean_Profit Min_Profit Max_Profit Var_Profit
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Bangladesh Baby Food 473907. 8340. 957258. 78307809458.
## 2 Bangladesh Beverages 87226. 2192. 155848. 1599797611.
## 3 Bangladesh Cereal 526303. 48104. 881116. 66811960815.
## 4 Bangladesh Clothes 354344. 4260. 726909. 43067476230.
## 5 Bangladesh Cosmetics 838125. 50075. 1697493. 195751227673.
## 6 Bangladesh Fruits 11835. 67.5 23216. 43933791.
Nhận xét: Lợi nhuận trung bình của mặt hàng Baby Food ở đất nước Bangladesh là 473907.44. Biến mới giúp đánh giá hiệu quả kinh doanh giữa các quốc gia và sản phẩm.