1 THÔNG TIN CƠ BẢN CỦA DỮ LIỆU

1.1 Đọc dữ liệu

data <- read.csv("transactions_data.csv", header = TRUE)

Ở dòng lệnh này, tụi em đã chọn file transactions_data.csv để thêm file csv vào RStudio. Sau đó tụi em đã gán data.frame này vào biến data để thuận lợi phân tích.

1.2 Xác định số quan sát, số biến của dữ liệu

dim(data)
## [1] 13305915       12

Từ đây cho thấy bộ dữ liệu có 13305915 dòng12 cột. Tương ứng với 13305915 quan sát12 biến

1.3 Phân loại dữ liệu

str(data)
## 'data.frame':    13305915 obs. of  12 variables:
##  $ id            : int  7475327 7475328 7475329 7475331 7475332 7475333 7475334 7475335 7475336 7475337 ...
##  $ date          : chr  "2010-01-01 00:01:00" "2010-01-01 00:02:00" "2010-01-01 00:02:00" "2010-01-01 00:05:00" ...
##  $ client_id     : int  1556 561 1129 430 848 1807 1556 1684 335 351 ...
##  $ card_id       : int  2972 4575 102 2860 3915 165 2972 2140 5131 1112 ...
##  $ amount        : chr  "$-77.00" "$14.57" "$80.00" "$200.00" ...
##  $ use_chip      : chr  "Swipe Transaction" "Swipe Transaction" "Swipe Transaction" "Swipe Transaction" ...
##  $ merchant_id   : int  59935 67570 27092 27092 13051 20519 59935 39021 50292 3864 ...
##  $ merchant_city : chr  "Beulah" "Bettendorf" "Vista" "Crown Point" ...
##  $ merchant_state: chr  "ND" "IA" "CA" "IN" ...
##  $ zip           : num  58523 52722 92084 46307 20776 ...
##  $ mcc           : int  5499 5311 4829 4829 5813 5942 5499 4784 7801 5813 ...
##  $ errors        : chr  "" "" "" "" ...

Từ câu lệnh cho thấy bộ dữ liệu có 6 biến định tính6 biến định lượng

1.4 Số quan sát bị thiếu

missing_col <- colSums(is.na(data))
missing_value <- sum(is.na(data))
print(missing_col)
##             id           date      client_id        card_id         amount 
##              0              0              0              0              0 
##       use_chip    merchant_id  merchant_city merchant_state            zip 
##              0              0              0              0        1652706 
##            mcc         errors 
##              0              0

Ở câu lệnh này chúng em đã xác định các giá trị bị thiếu theo cộttổng giá trị bị thiếu của bộ dữ liệu. Kết quả cho thấy có 1652706 giá trị bị thiếu và các giá trị này nằm ở cột zip

1.5 Số quan sát bị trùng lặp

1.5.1 Số hàng trùng hoàn toàn

library(data.table)
setDT(data)
dup_count <- data[, .N, by = names(data)][N > 1, .N]
print(dup_count)
## [1] 0

Ở dòng lệnh này, chúng em sử dụng gói data.table phù hợp xử lý dữ liệu có số quan sát lớn (hơn 13 triệu quan sát). Kết quả thu được: không có quan sát nào bị trùng

1.5.2 Trùng theo card_id

dup_id <- length(unique(data$card_id))
print(dup_id)
## [1] 4071

Kết quả phân tích cho thấy trong tổng số hơn 13 triệu giao dịch, chỉ có 4071 thẻ khác nhau được sử dụng.

1.6 Giải thích ý nghĩa các biến

Bộ dữ liệu bao gồm thông tin chi tiết về các giao dịch thanh toán bằng thẻ trong một khoảng thời gian nhất định. Mỗi dòng trong dữ liệu đại diện cho một giao dịch duy nhất, được mô tả thông qua 12 biến chính.Cụ thể:

  • Biến id là mã định danh duy nhất cho từng giao dịch, giúp phân biệt các giao dịch với nhau.

  • Biến date ghi nhận thời điểm giao dịch xảy ra, bao gồm ngày và giờ chính xác.

  • Biến client_id (mã khách hàng) cho biết thông tin lưu trữ về khách hàng.

  • Biến card_id (mã thẻ được sử dụng), cho phép theo dõi hành vi tiêu dùng theo từng cá nhân hoặc thiết bị thanh toán.

  • Biến amount thể hiện số tiền của giao dịch, trong đó giá trị dương tương ứng với chi tiêu thông thường, còn giá trị âm biểu thị các trường hợp hoàn tiền hoặc hủy giao dịch.

  • Biến use_chip thể hiện phương thức thanh toán giao dịch, bao gồm ba loại: Chip Transaction (giao dịch qua chip EMV), Online Transaction (thanh toán trực tuyến),Swipe Transaction (quẹt thẻ từ).

  • Biến merchant_id thể hiện mã nhà bán hàng

  • Biến merchant_city thể hiện thành phố/ nơi thực hiện giao dịch

  • Biến merchant_state thể hiện bang/ tiểu bang của nơi thực hiện giao dịch

  • Biến zip thể hiện mã bưu điện tương ứng với từng thành phố - nơi thực hiện giao dịch

  • Biến mcc (Merchant Category Code) phân loại ngành nghề kinh doanh của nhà bán hàng

    Ví dụ:

    • Cửa hàng tạp hóa, siêu thị: mcc = 5499
    • Cửa hàng thực phẩm khác: mcc = 5541
    • Cửa hàng xăng dầu: mcc = 5812
    • Nhà hàng, quán ăn: mcc = 5812
  • Biến errors ghi nhận mã lỗi (nếu có) trong quá trình xử lý giao dịch; giá trị bằng 0 cho thấy giao dịch thành công, trong khi các lỗi chi tiết sẽ được ghi chú ở mục này phản ánh sự cố kỹ thuật hoặc từ chối thanh toán.

2 PHÂN TỔ CÁC BIẾN

2.1 Số giao dịch theo nơi thực hiện giao dịch

library(DT)
counts <- sort(table(data$merchant_city), decreasing = TRUE)
counts <- as.data.frame(counts)
colnames(counts) <- c("Nơi thực hiện giao dịch","Số giao dịch")
datatable(head(counts,1000))

Kết quả cho thấy số lượng giao dịch trực tuyến (online) chiếm tỷ trọng cao nhất với 1563700 giao dịch

2.2 Phân tổ dữ liệu thành các khoảng tứ phân vị

library(DT)
data$amount <- as.numeric(gsub("\\$", "", data$amount))
q <- quantile(data$amount,probs = c(0,0.25,0.5,0.75,1),na.rm=TRUE)
data$amount2 <- cut(data$amount,breaks= q,include.lowest = TRUE,labels = c("Q1","Q2","Q3","Q4"))
datatable(head(data,1000))

Vì kiểu dữ liệu của cột amount là dạng character (ví dụ $80.00), nên chúng em đã chuyển định dạng cột này thành kiểu numberic (ví dụ 80.00) bằng cách bỏ đi ký tự $. Sau đó chúng em phân tổ dữ liệu thành các khoảng tứ phân vị.

3 PHÂN TÍCH CÁC BIẾN

Ở phần này, chúng em lựa chọn 2 biến chính để phân tích là use_chipamount

3.1 Biến use_chips

table(data$use_chip)
## 
##   Chip Transaction Online Transaction  Swipe Transaction 
##            4780818            1557912            6967185

Kết quả cho thấy số lượng giao dịch bằng Chip là 4780818, bằng Thẻ là 6967185 và giao dịch trực tuyến là 1557912 . Điều này chứng tỏ, việc giao dịch bằng Thẻ trở nên phổ biến và được ưa chuộng vì sự tiện lợi và nhanh chóng của phương thức này vượt trội hơn so với hai phương thức còn lại.

3.2 Biến amount

library(dplyr)
summary1 <- data %>%
  summarise(
    mean_amount = mean(amount),
    median_amount = median(amount),
    sd_amount = sd(amount),
    min_amount = min(amount),
    max_amount = max(amount),
  ) %>%
  mutate(across(where(is.numeric), ~ round(., 2)))
a1 <- as.matrix(summary1)
a1 <- t(a1)
a2 <- as.data.frame(a1)
colnames(a2) <- "amount"
print(a2)
##                amount
## mean_amount     42.98
## median_amount   28.99
## sd_amount       81.66
## min_amount    -500.00
## max_amount    6820.20

Từ kết quả trên, chúng em rút ra các nhận xét sau:

  • Số tiền trung bình cho mỗi giao dịch là 42.98 USD, phản ánh mức chi tiêu trung bình của khách hàng.
  • trung vị (28.99) nhỏ hơn trung bình (42.98), phân phối số tiền giao dịch có xu hướng lệch phải, tức là tồn tại một số ít giao dịch với số tiền lớn làm kéo trung bình lên.
  • Độ lệch chuẩn là 81.66 USD cho thấy sự biến động lớn về số tiền giao dịch giữa các quan sát.
  • Giá trị nhỏ nhất là -500.00 USD, thể hiện giao dịch hoàn tiền với số tiền tối đa được hoàn là 500.00 USD
  • Giá trị lớn nhất là 6820.20 USD, cho biết mức chi tiêu cao nhất trong dữ liệu là 6820.20 USD

3.3 Phân tích ý nghĩa hai biến

Vì phương thức thanh toán có ba loại chính là Chip Transaction, Online Transaction Swipe Transaction mà mỗi loại lại có số tiền giao dịch khác nhau, nên chúng em đã lập bảng thống kê mô tả cho từng loại, nhằm mục đích để so sánh hành vi chi tiêu giữa các phương thức thanh toán, từ đó rút ra những nhận định về xu hướng sử dụng, mức độ an toàn và đặc điểm khách hàng tiềm năng.

3.3.1 Phân tích số tiền giao dịch bằng Chip Transaction

library(dplyr)
data1 <- data%>% filter(use_chip == "Chip Transaction")
summary11 <- data1 %>%
  summarise(
    mean_amount = mean(amount),
    median_amount = median(amount),
    sd_amount = sd(amount),
    min_amount = min(amount),
    max_amount = max(amount),
  ) %>%
  mutate(across(where(is.numeric), ~ round(., 2)))
a11 <- as.matrix(summary11)
a11 <- t(a11)
a21 <- as.data.frame(a11)
colnames(a21) <- "amount"
print(a21)
##                amount
## mean_amount     40.89
## median_amount   27.04
## sd_amount       78.70
## min_amount    -500.00
## max_amount    5591.73

Từ kết quả trên, chúng em rút ra các nhận xét sau:

  • Số lượng tiền trung bình trong một lần giao dịch bằng chip là 40.89 USD
  • Trung vị (27.04) nhỏ hơn trung bình (40.89) cho thấy phân phối lệch phải, tức có một số giao dịch chip có giá trị lớn kéo trung bình lên.
  • Vì giá trị độ lệch chuẩn là 78.70 USD nên số tiền giao dịch giữa các quan sát có độ phân tán rất lớn
  • Giá trị nhỏ nhất -500.00 USD ứng với mức hoàn tiền tối đa qua chip
  • Giá trị lớn nhất là 5591.73 USD, mức chi tiêu cao nhất qua giao dịch chip

3.3.2 Phân tích số tiền giao dịch bằng Online Transaction

library(dplyr)
data2 <- data%>% filter(use_chip == "Online Transaction")
summary12 <- data2 %>%
  summarise(
    mean_amount = mean(amount),
    median_amount = median(amount),
    sd_amount = sd(amount),
    min_amount = min(amount),
    max_amount = max(amount),
  ) %>%
  mutate(across(where(is.numeric), ~ round(., 2)))
a12 <- as.matrix(summary12)
a12 <- t(a12)
a22 <- as.data.frame(a12)
colnames(a22) <- "amount"
print(a22)
##                amount
## mean_amount     57.26
## median_amount   35.17
## sd_amount       92.32
## min_amount    -500.00
## max_amount    6613.44

Từ kết quả trên, chúng em rút ra các nhận xét sau:

  • Số tiền trung bình mỗi giao dịch trực tuyến là 57.26 USD
  • Trung vị (35.17) nhỏ hơn trung bình (57.26), cho thấy phân phối lệch phải với các giao dịch lớn hơn kéo trung bình lên.
  • Độ lệch chuẩn 92.32 USD biểu thị sự biến động lớn về số tiền trong giao dịch trực tuyến.
  • Giá trị nhỏ nhất -500.00 USD thể hiện hoàn tiền tối đa qua giao dịch trực tuyến
  • Giá trị lớn nhất là 6613.44 USD, phản ánh các giao dịch có giá trị lớn nhất ở kênh trực tuyến

3.3.3 Phân tích số tiền giao dịch bằng Swipe Transaction

library(dplyr)
data3 <- data%>% filter(use_chip == "Swipe Transaction")
summary13 <- data3 %>%
  summarise(
    mean_amount = mean(amount),
    median_amount = median(amount),
    sd_amount = sd(amount),
    min_amount = min(amount),
    max_amount = max(amount),
  ) %>%
  mutate(across(where(is.numeric), ~ round(., 2)))
a13 <- as.matrix(summary13)
a13 <- t(a13)
a23 <- as.data.frame(a13)
colnames(a23) <- "amount"
print(a23)
##                amount
## mean_amount     41.21
## median_amount   27.08
## sd_amount       80.79
## min_amount    -500.00
## max_amount    6820.20

Từ kết quả trên, chúng em rút ra các nhận xét sau:

  • Số tiền trung bình trong giao dịch quẹt thẻ là 41.21 USD.
  • Trung vị (27.08) thấp hơn trung bình (41.21), cho thấy phân phối lệch phải tương tự các nhóm khác.
  • Độ lệch chuẩn 80.79 USD cho biết số tiền giao dịch có độ phân tán rộng trong thanh toán bằng thẻ.
  • Giá trị nhỏ nhất là -500.00 USD, mức hoàn tiền tối đa qua giao dịch quẹt thẻ.
  • Giá trị lớn nhất đạt 6820.20 USD, là mức chi tiêu cao nhất thông qua phương thức này