Trong mục này, chúng ta sẽ nạp các thư viện R cần thiết và tải dữ liệu vào môi trường làm việ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
library(ggplot2)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(stringr)
# Chúng ta nạp bộ dữ liệu
Amazon.Sale.Report <- read.csv("C:/Users/HONG GAM/Desktop/FILE/Amazon Sale Report.csv", header=TRUE)
View(Amazon.Sale.Report)
head(Amazon.Sale.Report)
dim(Amazon.Sale.Report) # Xem số quan sát và số biến
## [1] 128975 24
str(Amazon.Sale.Report) # Xem kiểu dữ liệu
## 'data.frame': 128975 obs. of 24 variables:
## $ index : int 0 1 2 3 4 5 6 7 8 9 ...
## $ Order.ID : chr "405-8078784-5731545" "171-9198151-1101146" "404-0687676-7273146" "403-9615377-8133951" ...
## $ Date : chr "04-30-22" "04-30-22" "04-30-22" "04-30-22" ...
## $ Status : chr "Cancelled" "Shipped - Delivered to Buyer" "Shipped" "Cancelled" ...
## $ Fulfilment : chr "Merchant" "Merchant" "Amazon" "Merchant" ...
## $ Sales.Channel : chr "Amazon.in" "Amazon.in" "Amazon.in" "Amazon.in" ...
## $ ship.service.level: chr "Standard" "Standard" "Expedited" "Standard" ...
## $ Style : chr "SET389" "JNE3781" "JNE3371" "J0341" ...
## $ SKU : chr "SET389-KR-NP-S" "JNE3781-KR-XXXL" "JNE3371-KR-XL" "J0341-DR-L" ...
## $ Category : chr "Set" "kurta" "kurta" "Western Dress" ...
## $ Size : chr "S" "3XL" "XL" "L" ...
## $ ASIN : chr "B09KXVBD7Z" "B09K3WFS32" "B07WV4JV4D" "B099NRCT7B" ...
## $ Courier.Status : chr "" "Shipped" "Shipped" "" ...
## $ Qty : int 0 1 1 0 1 1 1 1 0 1 ...
## $ currency : chr "INR" "INR" "INR" "INR" ...
## $ Amount : num 648 406 329 753 574 ...
## $ ship.city : chr "MUMBAI" "BENGALURU" "NAVI MUMBAI" "PUDUCHERRY" ...
## $ ship.state : chr "MAHARASHTRA" "KARNATAKA" "MAHARASHTRA" "PUDUCHERRY" ...
## $ ship.postal.code : num 400081 560085 410210 605008 600073 ...
## $ ship.country : chr "IN" "IN" "IN" "IN" ...
## $ promotion.ids : chr "" "Amazon PLCC Free-Financing Universal Merchant AAT-WNKTBO3K27EJC,Amazon PLCC Free-Financing Universal Merchant A"| __truncated__ "IN Core Free Shipping 2015/04/08 23-48-5-108" "" ...
## $ B2B : chr "False" "False" "True" "False" ...
## $ fulfilled.by : chr "Easy Ship" "Easy Ship" "" "Easy Ship" ...
## $ Unnamed..22 : chr "" "" "" "" ...
Amazon.Sale.Report$`Unnamed: 22` <- NULL
variable_description <- data.frame(
Variable = c(
"index", "Order ID", "Date", "Status", "Fulfilment", "Sales Channel",
"ship-service-level", "Courier Status", "ship-city", "ship-state", "ship-postal-code",
"ship-country", "Style", "SKU", "Category", "Size", "ASIN", "Qty", "currency",
"Amount", "promotion-ids", "B2B", "fulfilled-by"
),
Description = c(
"Số thứ tự của dòng, chỉ mang tính định danh cho mỗi hàng trong tệp dữ liệu.",
"Mã duy nhất để xác định mỗi đơn hàng.",
"Ngày diễn ra giao dịch hoặc cập nhật trạng thái đơn hàng.",
"Tình trạng hiện tại của đơn hàng (Shipped, Cancelled, Returned, Delivered...).",
"Bên chịu trách nhiệm xử lý và hoàn thành đơn hàng (Amazon hoặc Merchant).",
"Kênh bán hàng, ví dụ: Amazon.in (Amazon Ấn Độ).",
"Cấp độ dịch vụ vận chuyển được sử dụng (Standard, Expedited).",
"Trạng thái từ phía đơn vị vận chuyển (Shipped, Unshipped, Cancelled).",
"Thành phố giao hàng.",
"Bang hoặc Tỉnh giao hàng.",
"Mã bưu điện của địa chỉ giao hàng.",
"Quốc gia của địa chỉ giao hàng (ví dụ: IN là Ấn Độ).",
"Mã kiểu dáng hoặc phong cách của sản phẩm.",
"Mã định danh sản phẩm trong kho (Stock Keeping Unit).",
"Danh mục sản phẩm (ví dụ: Set, kurta, Western Dress).",
"Kích cỡ của sản phẩm (S, M, L, XL...).",
"Mã định danh sản phẩm duy nhất trên hệ thống Amazon (ASIN).",
"Số lượng sản phẩm trong đơn hàng.",
"Đơn vị tiền tệ được sử dụng (INR – Rupee Ấn Độ).",
"Tổng số tiền của giao dịch.",
"Mã khuyến mãi áp dụng (nếu có).",
"Cho biết đây có phải giao dịch B2B (doanh nghiệp – doanh nghiệp) hay không.",
"Bên thực hiện việc giao hàng cuối cùng (ví dụ: Easy Ship của Amazon)."
)
)
# Hiển thị bảng
knitr::kable(variable_description, caption = "Bảng mô tả ý nghĩa các biến trong bộ dữ liệu Amazon Sales Report")
Variable | Description |
---|---|
index | Số thứ tự của dòng, chỉ mang tính định danh cho mỗi hàng trong tệp dữ liệu. |
Order ID | Mã duy nhất để xác định mỗi đơn hàng. |
Date | Ngày diễn ra giao dịch hoặc cập nhật trạng thái đơn hàng. |
Status | Tình trạng hiện tại của đơn hàng (Shipped, Cancelled, Returned, Delivered…). |
Fulfilment | Bên chịu trách nhiệm xử lý và hoàn thành đơn hàng (Amazon hoặc Merchant). |
Sales Channel | Kênh bán hàng, ví dụ: Amazon.in (Amazon Ấn Độ). |
ship-service-level | Cấp độ dịch vụ vận chuyển được sử dụng (Standard, Expedited). |
Courier Status | Trạng thái từ phía đơn vị vận chuyển (Shipped, Unshipped, Cancelled). |
ship-city | Thành phố giao hàng. |
ship-state | Bang hoặc Tỉnh giao hàng. |
ship-postal-code | Mã bưu điện của địa chỉ giao hàng. |
ship-country | Quốc gia của địa chỉ giao hàng (ví dụ: IN là Ấn Độ). |
Style | Mã kiểu dáng hoặc phong cách của sản phẩm. |
SKU | Mã định danh sản phẩm trong kho (Stock Keeping Unit). |
Category | Danh mục sản phẩm (ví dụ: Set, kurta, Western Dress). |
Size | Kích cỡ của sản phẩm (S, M, L, XL…). |
ASIN | Mã định danh sản phẩm duy nhất trên hệ thống Amazon (ASIN). |
Qty | Số lượng sản phẩm trong đơn hàng. |
currency | Đơn vị tiền tệ được sử dụng (INR – Rupee Ấn Độ). |
Amount | Tổng số tiền của giao dịch. |
promotion-ids | Mã khuyến mãi áp dụng (nếu có). |
B2B | Cho biết đây có phải giao dịch B2B (doanh nghiệp – doanh nghiệp) hay không. |
fulfilled-by | Bên thực hiện việc giao hàng cuối cùng (ví dụ: Easy Ship của Amazon). |
Đoạn mã này chuẩn hóa dữ liệu chữ, biến các ô trống (““) thành NA để thống nhất biểu diễn giá trị thiếu.Hàm colSums(is.na()) dùng để đếm số lượng giá trị NA trong từng biến, hỗ trợ cho bước đánh giá chất lượng dữ liệu.
Amazon.Sale.Report <- Amazon.Sale.Report %>% mutate(across(where(is.character), ~na_if(., "")))
colSums(is.na(Amazon.Sale.Report))
## index Order.ID Date Status
## 0 0 0 0
## Fulfilment Sales.Channel ship.service.level Style
## 0 0 0 0
## SKU Category Size ASIN
## 0 0 0 0
## Courier.Status Qty currency Amount
## 6872 0 7795 7795
## ship.city ship.state ship.postal.code ship.country
## 33 33 33 33
## promotion.ids B2B fulfilled.by Unnamed..22
## 49153 0 89698 49050
mean_amount <- mean(Amazon.Sale.Report$Amount, na.rm = TRUE)
Amazon.Sale.Report$Amount[is.na(Amazon.Sale.Report$Amount)] <- mean_amount
Sau khi kiểm tra NA thay thế tất cả các giá trị NA trong cột ‘Amount’ bằng giá trị trung bình vừa tính
sum(duplicated(Amazon.Sale.Report))
## [1] 0
#Phân tổ theo tháng
amazon_sales_processed <- Amazon.Sale.Report %>% mutate(Date = mdy(Date), Month = month(Date))
monthly_revenue <- amazon_sales_processed %>% group_by(Month) %>%
summarise(Total_Revenue = sum(Amount, na.rm = TRUE), N_Orders = n(),
Avg_Amount = mean(Amount, na.rm = TRUE),.groups = 'drop' ) %>% arrange(Month)
print(monthly_revenue)
## # A tibble: 4 × 4
## Month Total_Revenue N_Orders Avg_Amount
## <dbl> <dbl> <int> <dbl>
## 1 3 107521. 171 629.
## 2 4 30783744. 49067 627.
## 3 5 27850475. 42040 662.
## 4 6 24906475. 37697 661.
#Phân tổ theo danh mục và kích cỡ
product_performance <- Amazon.Sale.Report %>%group_by(Category, Size) %>%
summarise( TotalQuantitySold = sum(Qty, na.rm = TRUE),
TotalRevenue = sum(Amount, na.rm = TRUE)) %>%
arrange(desc(TotalQuantitySold))
## `summarise()` has grouped output by 'Category'. You can override using the
## `.groups` argument.
print(head(product_performance, 10))
## # A tibble: 10 × 4
## # Groups: Category [2]
## Category Size TotalQuantitySold TotalRevenue
## <chr> <chr> <int> <dbl>
## 1 Set M 8357 7697186.
## 2 kurta L 8043 4106038.
## 3 kurta XL 7838 3964306.
## 4 kurta M 7713 3935559.
## 5 Set L 7399 6680292.
## 6 kurta XXL 6952 3526534.
## 7 Set XL 6873 6204830.
## 8 Set S 6708 6200377.
## 9 Set XXL 5608 5017806.
## 10 Set 3XL 5287 4725477.
#Phân tổ theo bang và theo doanh thu
state_sales <- Amazon.Sale.Report %>%group_by(ship.state) %>%
summarise(TotalRevenue = sum(Amount, na.rm = TRUE), TotalQuantity = sum(Qty, na.rm = TRUE),
OrderCount = n()) %>% arrange(desc(TotalRevenue))
print(head(state_sales, 10))
## # A tibble: 10 × 4
## ship.state TotalRevenue TotalQuantity OrderCount
## <chr> <dbl> <int> <int>
## 1 MAHARASHTRA 14105377. 20328 22260
## 2 KARNATAKA 11085574. 15901 17326
## 3 TELANGANA 7366069. 10253 11330
## 4 UTTAR PRADESH 7264798. 9499 10638
## 5 TAMIL NADU 6952781. 10412 11483
## 6 DELHI 4487506. 6156 6782
## 7 KERALA 4111703. 5813 6585
## 8 WEST BENGAL 3777682. 5318 5963
## 9 ANDHRA PRADESH 3463042. 4819 5430
## 10 HARYANA 3029316. 4066 4415
#Phân tổ theo trạng thái và doanh thu.
summary_by_status <- Amazon.Sale.Report %>% group_by(Status) %>%
summarise(Total_Amount = sum(Amount, na.rm = TRUE), N_Orders = n(),
Avg_Amount = mean(Amount, na.rm = TRUE),.groups = 'drop' ) %>%
arrange(desc(N_Orders))
print(summary_by_status)
## # A tibble: 13 × 4
## Status Total_Amount N_Orders Avg_Amount
## <chr> <dbl> <int> <dbl>
## 1 Shipped 50459156. 77804 649.
## 2 Shipped - Delivered to Buyer 18656003. 28769 648.
## 3 Cancelled 11826300. 18332 645.
## 4 Shipped - Returned to Seller 1271590. 1953 651.
## 5 Shipped - Picked Up 661252 973 680.
## 6 Pending 431568. 658 656.
## 7 Pending - Waiting for Pick Up 192138 281 684.
## 8 Shipped - Returning to Seller 107620 145 742.
## 9 Shipped - Out for Delivery 26971 35 771.
## 10 Shipped - Rejected by Buyer 7295 11 663.
## 11 Shipping 5188. 8 649.
## 12 Shipped - Lost in Transit 1997 5 399.
## 13 Shipped - Damaged 1136 1 1136
#Phân tổ theo trạng thái và theo tháng
amazon_sales_processed <- Amazon.Sale.Report %>%mutate(Date = mdy(Date),
Month = month(Date))
summary_status_by_month <- amazon_sales_processed %>% group_by(Month, Status) %>%
summarise(N_Orders = n(), Total_Amount = sum(Amount, na.rm = TRUE),
.groups = 'drop' ) %>% arrange(Month, desc(N_Orders))
print(summary_status_by_month)
## # A tibble: 35 × 4
## Month Status N_Orders Total_Amount
## <dbl> <chr> <int> <dbl>
## 1 3 Shipped 136 84662.
## 2 3 Cancelled 18 12062.
## 3 3 Shipped - Delivered to Buyer 16 10170
## 4 3 Shipped - Returned to Seller 1 627
## 5 4 Shipped 28941 18267282.
## 6 4 Shipped - Delivered to Buyer 12080 7456672.
## 7 4 Cancelled 7137 4490205.
## 8 4 Shipped - Returned to Seller 893 559636
## 9 4 Shipped - Rejected by Buyer 6 3396
## 10 4 Shipped - Picked Up 4 2798
## # ℹ 25 more rows
summary(Amazon.Sale.Report$Amount)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 459.0 635.0 648.6 771.0 5584.0
mean(Amazon.Sale.Report$Amount, na.rm = TRUE)
## [1] 648.5615
median(Amazon.Sale.Report$Amount, na.rm = TRUE)
## [1] 635
sd(Amazon.Sale.Report$Amount, na.rm = TRUE)
## [1] 272.5812
min(Amazon.Sale.Report$Amount)
## [1] 0
max(Amazon.Sale.Report$Amount)
## [1] 5584
#Kiểm tra tổng số giá trị NA trong biến
sum(is.na(Amazon.Sale.Report$Amount))
## [1] 0
#Lọc các đơn hàng có giá trị (Amount) LỚN HƠN giá trị trung bình vừa tính
avg_amount_overall <- mean(Amazon.Sale.Report$Amount, na.rm = TRUE)
high_value_orders <- Amazon.Sale.Report %>% filter(Amount > avg_amount_overall) %>% group_by(Status) %>% summarise(N_HighValue = n()) %>% arrange(desc(N_HighValue))
print(high_value_orders)
## # A tibble: 12 × 2
## Status N_HighValue
## <chr> <int>
## 1 Shipped 33394
## 2 Shipped - Delivered to Buyer 13638
## 3 Cancelled 4729
## 4 Shipped - Returned to Seller 927
## 5 Shipped - Picked Up 540
## 6 Pending 309
## 7 Pending - Waiting for Pick Up 167
## 8 Shipped - Returning to Seller 94
## 9 Shipped - Out for Delivery 25
## 10 Shipped - Rejected by Buyer 6
## 11 Shipped - Damaged 1
## 12 Shipped - Lost in Transit 1
# Kiểm tra kiểu dữ liệu
str(Amazon.Sale.Report$Status)
## chr [1:128975] "Cancelled" "Shipped - Delivered to Buyer" "Shipped" ...
# Kiểm tra giá trị khác nhau trong biến
unique(Amazon.Sale.Report$Status)
## [1] "Cancelled" "Shipped - Delivered to Buyer"
## [3] "Shipped" "Shipped - Returned to Seller"
## [5] "Shipped - Rejected by Buyer" "Shipped - Lost in Transit"
## [7] "Shipped - Out for Delivery" "Shipped - Returning to Seller"
## [9] "Shipped - Picked Up" "Pending"
## [11] "Pending - Waiting for Pick Up" "Shipped - Damaged"
## [13] "Shipping"
length(unique(Amazon.Sale.Report$Status))
## [1] 13
table(Amazon.Sale.Report$Status)
##
## Cancelled Pending
## 18332 658
## Pending - Waiting for Pick Up Shipped
## 281 77804
## Shipped - Damaged Shipped - Delivered to Buyer
## 1 28769
## Shipped - Lost in Transit Shipped - Out for Delivery
## 5 35
## Shipped - Picked Up Shipped - Rejected by Buyer
## 973 11
## Shipped - Returned to Seller Shipped - Returning to Seller
## 1953 145
## Shipping
## 8
# Chuẩn hóa lại viết hoa chữ cái đầu cho đẹp
Amazon.Sale.Report <- Amazon.Sale.Report %>%
mutate(Status = tools::toTitleCase(Status))
# Kiểm tra lại các giá trị khác nhau
unique(Amazon.Sale.Report$Status)
## [1] "Cancelled" "Shipped - Delivered to Buyer"
## [3] "Shipped" "Shipped - Returned to Seller"
## [5] "Shipped - Rejected by Buyer" "Shipped - Lost in Transit"
## [7] "Shipped - Out for Delivery" "Shipped - Returning to Seller"
## [9] "Shipped - Picked Up" "Pending"
## [11] "Pending - Waiting for Pick Up" "Shipped - Damaged"
## [13] "Shipping"
sum(is.na(Amazon.Sale.Report$Status) | Amazon.Sale.Report$Status == "")
## [1] 0
Amazon.Sale.Report$Status[is.na(Amazon.Sale.Report$Status) | Amazon.Sale.Report$Status == ""] <- "Unknown"
str(Amazon.Sale.Report$Fulfilment)
## chr [1:128975] "Merchant" "Merchant" "Amazon" "Merchant" "Amazon" "Amazon" ...
unique(Amazon.Sale.Report$Fulfilment)
## [1] "Merchant" "Amazon"
length(unique(Amazon.Sale.Report$Fulfilment))
## [1] 2
table(Amazon.Sale.Report$Fulfilment)
##
## Amazon Merchant
## 89698 39277
sum(is.na(Amazon.Sale.Report$Fulfilment) | Amazon.Sale.Report$Fulfilment == "")
## [1] 0
orders <- Amazon.Sale.Report %>% filter(Fulfilment == "Amazon")
print(head(orders, 10))
## index Order.ID Date Status Fulfilment Sales.Channel
## 1 2 404-0687676-7273146 04-30-22 Shipped Amazon Amazon.in
## 2 4 407-1069790-7240320 04-30-22 Shipped Amazon Amazon.in
## 3 5 404-1490984-4578765 04-30-22 Shipped Amazon Amazon.in
## 4 6 408-5748499-6859555 04-30-22 Shipped Amazon Amazon.in
## 5 8 407-5443024-5233168 04-30-22 Cancelled Amazon Amazon.in
## 6 9 402-4393761-0311520 04-30-22 Shipped Amazon Amazon.in
## 7 10 407-5633625-6970741 04-30-22 Shipped Amazon Amazon.in
## 8 11 171-4638481-6326716 04-30-22 Shipped Amazon Amazon.in
## 9 13 408-7955685-3083534 04-30-22 Shipped Amazon Amazon.in
## 10 16 406-9379318-6555504 04-30-22 Shipped Amazon Amazon.in
## ship.service.level Style SKU Category Size ASIN
## 1 Expedited JNE3371 JNE3371-KR-XL kurta XL B07WV4JV4D
## 2 Expedited JNE3671 JNE3671-TU-XXXL Top 3XL B098714BZP
## 3 Expedited SET264 SET264-KR-NP-XL Set XL B08YN7XDSG
## 4 Expedited J0095 J0095-SET-L Set L B08CMHNWBN
## 5 Expedited SET200 SET200-KR-NP-A-XXXL Set 3XL B08L91ZZXN
## 6 Expedited JNE3461 JNE3461-KR-XXL kurta XXL B08B3XF5MH
## 7 Expedited JNE3160 JNE3160-KR-G-S kurta S B07K3YQLF1
## 8 Expedited JNE3500 JNE3500-KR-XS kurta XS B098117DJ3
## 9 Expedited SET182 SET182-KR-DH-XS Set XS B085HS947T
## 10 Expedited JNE3721 JNE3721-KR-XXL kurta XXL B099FCT65D
## Courier.Status Qty currency Amount ship.city ship.state
## 1 Shipped 1 INR 329.0000 NAVI MUMBAI MAHARASHTRA
## 2 Shipped 1 INR 574.0000 CHENNAI TAMIL NADU
## 3 Shipped 1 INR 824.0000 GHAZIABAD UTTAR PRADESH
## 4 Shipped 1 INR 653.0000 CHANDIGARH CHANDIGARH
## 5 Cancelled 0 <NA> 648.5615 HYDERABAD TELANGANA
## 6 Shipped 1 INR 363.0000 Chennai TAMIL NADU
## 7 Shipped 1 INR 685.0000 CHENNAI TAMIL NADU
## 8 Shipped 1 INR 364.0000 NOIDA UTTAR PRADESH
## 9 Shipped 1 INR 657.0000 MUMBAI MAHARASHTRA
## 10 Shipped 1 INR 329.0000 JAIPUR RAJASTHAN
## ship.postal.code ship.country promotion.ids
## 1 410210 IN IN Core Free Shipping 2015/04/08 23-48-5-108
## 2 600073 IN <NA>
## 3 201102 IN IN Core Free Shipping 2015/04/08 23-48-5-108
## 4 160036 IN IN Core Free Shipping 2015/04/08 23-48-5-108
## 5 500008 IN IN Core Free Shipping 2015/04/08 23-48-5-108
## 6 600041 IN <NA>
## 7 600073 IN <NA>
## 8 201303 IN <NA>
## 9 400053 IN <NA>
## 10 302020 IN IN Core Free Shipping 2015/04/08 23-48-5-108
## B2B fulfilled.by Unnamed..22
## 1 True <NA> <NA>
## 2 False <NA> <NA>
## 3 False <NA> <NA>
## 4 False <NA> <NA>
## 5 False <NA> <NA>
## 6 False <NA> <NA>
## 7 False <NA> <NA>
## 8 False <NA> <NA>
## 9 False <NA> <NA>
## 10 False <NA> <NA>
#Thống kê tần suất và tỷ lệ phần trăm
fulfilment_summary <- Amazon.Sale.Report %>%
count(Fulfilment, sort = TRUE) %>%
mutate(Percent = round(100 * n / sum(n), 2))
library(dplyr)