Tag: R Programming

  • 10 Topics of Data analysis of the UCI Machine Learning Repository’s Online Retail dataset using R

    10 Topics of Data analysis of the UCI Machine Learning Repository’s Online Retail dataset using R

    เป็นบทความสำหรับการวิเคราะห์ข้อมูลโดยโปรแกรม R เพื่อที่จะหากลุ่มลูกค้าที่จะเก็บข้อมูลมาว่าลูกค้ากลุ่มไหน ควรออกแบบ Campaign อะไรที่จะสามารถตอบโจทย์และบอกได้ว่าลูกค้ากลุ่มไหนควรแนะนำให้เพิ่มบริการหรือลดบริการ

    เนื่องจากปัจจุบันการสูญเสียลูกค้ากันเยอะขึ้น ในหลายๆ รูปแบบจึงอยากหาสาเหตุว่าลูกค้ากลุ่มไหนควรที่จะทำ Campaign อะไรให้เพื่อฟื้นฟูความสัมพันธ์กับลูกค้าเหล่านั้น โดยการสร้าง RFM Feature Engineering ขึ้นมาจากข้อมูลที่มี

    RFM Feature Engineering คือมันคือการแปลงประวัติการซื้อของลูกค้า (ที่เป็นข้อมูลดิบ) ให้กลายเป็น 3 คำดังนี้ Recency, Frequency and Monetary เพื่อนำไปใช้สำหรับการวิเคราะห์การตลาด จากข้อมูลดิบของการซื้อขายครับ คือ การเปลี่ยนข้อมูล Transaction ที่เข้าใจยาก ให้กลายเป็น 3 คอลัมน์ใหม่ที่เข้าใจง่าย เพื่อใช้วิเคราะห์พฤติกรรมลูกค้าครับ

    โดย 3 Features ที่เราสร้างขึ้นมานั้นย่อมาจาก:

    1. R = Recency (ความสดใหม่): ลูกค้าซื้อครั้งล่าสุดเมื่อไหร่? (เช่น 10 วันที่แล้ว)
    2. F = Frequency (ความถี่): ลูกค้าซื้อบ่อยแค่ไหน? (เช่น 5 ครั้ง)
    3. M = Monetary (มูลค่าการใช้จ่าย): ลูกค้าใช้เงินไปทั้งหมดเท่าไหร่? (เช่น 8,000 บาท)

    Data Analyst with R

    1. Install Library
      1. Install readxl
      2. Install tidyverse
    2. Read data
      1. Read excel
      2. Head data
      3. Glimpse
    3. Definition of Column
      1. InvoiceNo
      2. StockCode
      3. Description
      4. Quantity
      5. InvoiceDate
      6. UnitPrice
      7. CustomerID
      8. Country
    4. Data Cleaning
      1. Clean missing CustomerID value
      2. Cancel transaction that have C before Invoice NO.
      3. Manage Quantity and UnitPrice
      4. Create Column TotalPrice
      5. Change InvoiceDate into Date/time
      6. Summary Data
    5. Create RFM Feature Engineering
      1. Snapshot Date
      2. calculate RFM
    6. K-Means (Customer Segmentation)
      1. K-Means
      2. Prepare Data for K-Means (choose specific column R, F, M)
      3. Manage with Outlier
      4. Standardize
      5. Elbow method
        1. WSS
      6. Create dataframe for plot graph and plot graph with ggplot
      7. K-Means clustering
    7. Segment Profiling
      1. Calculate average of R, F, M with Cluster
    8. Storytelling and Visualization
      1. Analyst from four cluster
        1. Cluster 1
        2. Cluster 2
        3. Cluster 3
        4. Cluster 4
    9. Recommended Campaign
    10. Export Data for search cluster in excel

    Install Library

    ก่อนที่จะเริ่มต้นวิเคราะห์ข้อมูล ก็เริ่มต้นด้วยการ Download Library เพื่อที่จะสามารถใช้ Function ต่างๆได้หลากหลายขึ้น เช่น tidyverse และ readxl ก่อน


    Install readxl

    • install.packages(“readxl”) download มาเพื่อสามารถอ่านข้อมูลจากไฟล์ Excel ได้
    • library(readxl)
    install.packages("readxl")
    library(readxl)
    

    Install tidyverse

    • install.packages(“tidyverse”) Download มาเพื่อสามารถวิเคราะห์ข้อมูลทั้งหมดได้ ไม่ว่าจะ dplyr และ ggplot
    • library(tidyverse)
    install.packages("tidyverse")
    library(tidyverse)
    
    • หลังจาก run code จะสามารถดึงอุปกรณ์ในการช่วยวิเคราะห์ข้อมูลได้ตามรูปด้านล่าง
    install (tidyverse)

    Read data

    Read excel

    • สามารถอ่าน File Excel ชื่อ Online Retail.xlsx แล้วเลือก Sheet ที่ต้องการวิเคราะห์ข้อมูล ซึ่งก็คือ Sheet ที่ 1 ของไฟล์นี้
    ## read file from excel
    retail_data <- read_excel("Online Retail.xlsx", sheet = 1)
    View(retail_data)
    
    image.png
    read file from excel

    Head data

    • เลือก head มาเพื่อที่จะดูข้อมูล Column ของมีข้อมูลแถวบนเป็นยังไงบ้าง
    ## show head data
    print("Example:")
    print(head(retail_data))
    
    head data

    Glimpse

    glimpse จะแสดงโครงสร้างข้อมูลของ data frame จะสามารถรู้ได้ว่ามีคอลัมน์อะไรบ้าง, แต่ละคอลัมน์มีชนิดข้อมูล (Data Type) อะไร, และมีข้อมูลตัวอย่างหน้าตาเป็นอย่างไร ดังรูป

    ## show data structure
    print("data structure:")
    glimpse(retail_data)
    
    Glimpse

    Definition of Column

    เราเริ่มจากการดูข้อมูลเบื้องต้นก่อนว่า แต่ละ Column คืออะไรบ้าง


    InvoiceNo

    • InvoiceNo คือ (เลขที่ใบแจ้งหนี้)
    • เป็นรหัสที่ใช้ “จัดกลุ่ม” สินค้าที่ถูกซื้อในธุรกรรม (Transaction) เดียวกัน
    • จากตัวอย่าง InvoiceNo “536365” มีหลายแถว หมายความว่า ลูกค้าคนนี้สั่งสินค้าหลายอย่างในใบเสร็จใบเดียวกัน

    StockCode

    • StockCode คือ รหัสสินค้า
    • รหัสเฉพาะของสินค้าแต่ละชิ้น (คล้ายกับ SKU)

    Description

    • Description คือ รายละเอียดสินค้า
    • ชื่อหรือคำอธิบายของสินค้า (เช่น “WHITE HANGING HEART T-LIGHT HOLDER”)

    Quantity

    • Quantity คือ จำนวนสินค้า
    • จำนวนสินค้า ชิ้นนั้น ที่ถูกสั่งซื้อในใบเสร็จนี้
    • ข้อควรระวัง: ในข้อมูลชุดนี้ บางครั้งค่า Quantity อาจ ติดลบ ซึ่งหมายถึงการยกเลิก (Cancellation) หรือการคืนสินค้า (Return)

    InvoiceDate

    • InvoiceDate คือ วันที่สั่งซื้อ
    • วันที่และเวลาที่ธุรกรรมนั้นเกิดขึ้น (เช่น 2010-12-01 08:26:00)

    UnitPrice

    • UnitPrice คือ ราคาต่อหน่วย
    • ราคาของสินค้าชิ้นนั้น 1 หน่วย (เช่น 2.55)

    CustomerID

    • CustomerID คือ รหัสลูกค้า
    • รหัสประจำตัวของลูกค้าที่ทำการสั่งซื้อ (เช่น 17850)
    • ข้อควรระวัง: ในข้อมูลชุดนี้ บางแถวอาจไม่มี CustomerID (เป็นค่าว่าง หรือ NA) ซึ่งหมายถึงการซื้อแบบที่ไม่ได้ล็อกอิน (Guest)

    Country

    • Country คือ ประเทศ
    • ประเทศที่ลูกค้าคนนั้นอาศัยอยู่

    Data Cleaning

    Clean missing CustomerID value

    • หลังจากสำรวจข้อมูลแล้วเห็นว่าข้อมูล CustomerID บาง Column ข้อมูลไม่ครบ จึงทำลบแถวที่ข้อมูลไม่ครบของ CustomerID จาก Rows 541,909 เหลือ 406,829 = 133,820 Rows
    • ใช้ Code นี้เพื่อที่จะสามารถข้อมูลที่ยังไม่สมบูรณ์ เช่น ที่ Column Customer ID ออกโดยใช้ filter(!is.na(CustomerID)) คือ ใช้ column CustomerID ‘ไม่’ ( ! ) ‘เป็นค่าว่าง’ ( is.na )”
    ## Clean missing data
    retail_data_cleaned <- retail_data %>%
      filter(!is.na(CustomerID))
    glimpse(retail_data_cleaned)
    
    Clean missing data

    Cancel transaction that have C before Invoice NO.

    • หลังจากสำรวจข้อมูลใน Column Invoice NO. แล้วพบว่า Column ที่ Invoice NO. ถูก Cancel จะมีตัว C อยู่ข้างหน้า Invoice เหล่านั้น
    • เราจึงต้องกรอง Invoice ที่ขึ้นต้นด้วย C และ c ออกไปเพื่อเหลือแค่ลูกค้าที่สั่ง Order กับเราจริงๆ โดยไม่ยกเลิก Order
    ## Cancel transaction that have C before Invoice NO.
    retail_data_cleaned <- retail_data_cleaned %>%
      filter(!startsWith(as.character(InvoiceNo), "C") & !startsWith(as.character(InvoiceNo), "c"))
    glimpse(retail_data_cleaned)
    
    Cancel transaction that have C before Invoice NO.

    Manage Quantity and UnitPrice

    • กรองค่าที่ Quantity และ UnitPrice ที่น้อยกว่า 0 ออกเพื่อให้ข้อมูลถูกต้อง
    ## manage Quantity and UnitPrice
    retail_data_cleaned <- retail_data_cleaned %>%
      filter(Quantity > 0 & UnitPrice > 0)
    glimpse(retail_data_cleaned)
    
    Manage Quantity and UnitPrice

    Create Column TotalPrice

    • เพิ่ม Column TotalPrice เพื่อคำนวณราคาของ Quantity * Unitprice จะได้รู้ปริมาณ * ราคาของสินค้าทั้งแถว
    • แล้วจะมี Column ชื่อ Total Price ตามรูปด้านล่าง
    ## Create Column Totalprice
    retail_data_cleaned <- retail_data_cleaned %>%
      mutate(TotalPrice = Quantity * UnitPrice)
    retail_data_cleaned
    glimpse(retail_data_cleaned)
    
    Create Column TotalPrice

    Change InvoiceDate into Date/time

    • เปลี่ยนวันที่ในข้อมูลให้กลายเป็นวันที่สามารถบอกเวลาได้ ให้เป็นรูปแบบเดียวกัน
    ## Change InvoiceDate into Date/time
    retail_data_cleaned <- retail_data_cleaned %>%
      mutate(InvoiceDate = ymd_hms(InvoiceDate))
    glimpse(retail_data_cleaned)
    
    Change InvoiceDate into Date/time

    Summary Data

    • สรุปข้อมูลออกมาได้ดังนี้
    • Summary ได้เฉพาะ Column ที่เป็นปริมาณ
    Summary Data

    Create RFM Feature Engineering

    Snapshot Date

    • หาวันที่ max ที่สุดของ data นี้ด้วยตัวแปร Snapshot
    ## snapshot Date
    ## use next date for last day from data
    snapshot_date <- max(retail_data_cleaned$InvoiceDate) + days(1)
    snapshot_date
    
    Snapshot Date

    calculate RFM

    • สร้างแถว Recency, Frequency and Monetary

    เพื่อจะได้รับตัวแปรช่วยให้รู้ได้ว่าลูกค้ากลุ่มไหนซื้อสินค้าเรา วันล่าสุดเท่าไร ความถี่เท่าไร และค่าใช้จ่ายเท่าไร

    1. Monetary (M): ยอดใช้จ่ายทั้งหมด
    2. Recency (R): จำนวนวันที่ผ่านไปนับจากการซื้อครั้งล่าสุด
    3. Frequency (F): จำนวนธุรกรรมทั้งหมด
    ## create new rfm_data with Recency, Frequency and Monetary
    rfm_data <- retail_data_cleaned %>%
      group_by(CustomerID) %>%
      summarise(
        Recency = as.numeric(difftime(snapshot_date, max(InvoiceDate), units = "days")),
        Frequency = n_distinct(InvoiceNo),
        Monetary = sum(TotalPrice)
      )
    print("Example RFM:")
    print(head(rfm_data))
    View(rfm_data)
    
    calculate RFM

    K-Means (Customer Segmentation)

    K-Means

    K-Means คือการแบ่งฐานลูกค้าทั้งหมดของคุณออกเป็นกลุ่มย่อยๆ (Segments) โดยที่คนในกลุ่มเดียวกันจะมีพฤติกรรมหรือคุณลักษณะที่คล้ายกัน แต่จะแตกต่างจากคนในกลุ่มอื่นอย่างชัดเจน

    ตัวอย่างผลลัพธ์ที่คาดว่าจะได้รับมีดังนี้

    เมื่อใช้อัลกอริทึม K-Means (สมมติว่าเราตั้งค่า $K=4$) เราอาจจะได้กลุ่มลูกค้า 4 กลุ่ม เช่น:

    1. กลุ่มลูกค้าชั้นดี (High-Value): ซื้อบ่อย (F สูง), ยอดซื้อสูง (M สูง), และเพิ่งซื้อไปไม่นาน (R ต่ำ)
    2. กลุ่มลูกค้าที่กำลังจะหาย (At-Risk): เคยซื้อเยอะและบ่อย (F, M สูง) แต่ไม่กลับมาซื้อนานแล้ว (R สูง)
    3. กลุ่มลูกใหม่ (New Customers): เพิ่งซื้อครั้งแรก (F, M ต่ำ) และซื้อล่าสุด (R ต่ำ)
    4. กลุ่มลูกค้าทั่วไป (Standard): ซื้อประปราย ยอดซื้อปานกลาง

    Prepare Data for K-Means (choose specific column R, F, M)

    • เลือกเฉพาะ Column R, F และ M จาก ตัวแปร rfm_data มาอยู่ในตัวแปร rfm_for_clustering เพื่อที่จะสามารถศึกษาข้อมูลต่อได้
    ## Prepare data for K-Means (Choose specially R, F, M )
    rfm_for_clustering <- rfm_data %>%
      select(Recency, Frequency, Monetary)
    rfm_for_clustering
    View(rfm_for_clustering)
    
    choose specific column R, F, M

    Manage with Outlier

    • เนื่องจาก Frequency and Monetary มีการเบ้ขวาของข้อมูล จึงใส่ค่า log เพื่อลดการคลาดเคลื่อนของข้อมูล (Outlier)
    • การเบ้ขวาของข้อมูล คือ ข้อมูลส่วนใหญ่กระจุกตัวอยู่ที่ฝั่งค่าน้อยกว่า
    ## manage with Outliers 
    ## column Frequency and Monetary have right skewed
    ## Log Transformation to reduce Outlier
    rfm_log <- rfm_for_clustering %>%
      mutate(
        Recency_log = log(Recency + 1), # +1 เพื่อหลีกเลี่ยง log(0)
        Frequency_log = log(Frequency + 1),
        Monetary_log = log(Monetary + 1)
      ) %>%
      select(Recency_log, Frequency_log, Monetary_log)
    glimpse(rfm_log)
    
    Manage with Outlier

    Standardize

    • Scale( ) ใน R เป็นเครื่องมือที่สำคัญมากสำหรับการ “Standardization” หรือ “การปรับสเกลข้อมูล” ครับ
    1. Centering (การปรับศูนย์): มันจะนำค่าในคอลัมน์นั้นไป ลบด้วยค่าเฉลี่ย (Mean) ของคอลัมน์ ผลลัพธ์คือ คอลัมน์ใหม่นี้จะมี ค่าเฉลี่ย = 0
    2. Scaling (การปรับสเกล): จากนั้น มันจะนำค่าที่ถูก Centered แล้ว ไป หารด้วยส่วนเบี่ยงเบนมาตรฐาน (Standard Deviation – SD) ของคอลัมน์นั้น ผลลัพธ์คือ คอลัมน์ใหม่นี้จะมี Standard Deviation = 1
    ## Standardize
    ## make average to be 0 and S.e. to be 1
    rfm_scaled <- scale(rfm_log)
    print("Adapt with propotion:")
    print(head(rfm_scaled))
    
    View(rfm_scaled)
    
    Standardize

    Elbow method

    • Elbow Method คือเทคนิคที่นิยมใช้เพื่อช่วยตัดสินใจว่า “จำนวนกลุ่ม (K) ที่เหมาะสมที่สุด” ควรจะเป็นเท่าไหร่ สำหรับการทำ Clustering, โดยเฉพาะกับ K-Means
    ## Elbow method to find K that fit to data
    wss <- (nrow(rfm_scaled)-1) * sum(apply(rfm_scaled, 2, var))
    for (i in 2:10) { # ทดสอบ k ตั้งแต่ 2 ถึง 10
      wss[i] <- sum(kmeans(rfm_scaled, centers = i)$withinss)
    }
    wss
    

    WSS

    wss คือ มันคือการคำนวณว่าข้อมูลทั้งหมดในกลุ่มนั้นๆ อยู่ “กระจัดกระจาย” หรือ “เกาะกันแน่น” แค่ไหน โดยวัดจากจุดศูนย์กลาง (Centroid) ของกลุ่ม

    ค่า WSS ต่ำ = ดีมาก

    1. หมายความว่า จุดข้อมูลต่างๆ อยู่ “ใกล้” กับจุดศูนย์กลางของกลุ่มมันมาก
    2. แปลว่ากลุ่มนั้น “เกาะกันแน่น” (Dense) และมีความแปรปรวนภายในกลุ่มต่ำ

    ค่า WSS สูง = ไม่ดี

    1. หมายความว่า จุดข้อมูลต่างๆ อยู่ “ไกล” จากจุดศูนย์กลางกลุ่ม
    2. แปลว่ากลุ่มนั้น “กระจัดกระจาย” (Sparse) และมีความแปรปรวนภายในกลุ่มสูง
    ## Calculate Within-Cluster Sum of Squares (WSS)
    wss <- (nrow(rfm_scaled)-1) * sum(apply(rfm_scaled, 2, var))
    for (i in 2:10) { # ทดสอบ k ตั้งแต่ 2 ถึง 10
      wss[i] <- sum(kmeans(rfm_scaled, centers = i)$withinss)
    }
    wss
    
    WSS

    วิธีดู “Elbow method” คือการดูว่า WSS “ลดลง” ไปเท่าไหร่ในแต่ละก้าว และมองหาจุดที่ “อัตราการลดลง” มันเริ่มน้อยลง (กราฟเริ่มแบน)

    1. K=1 -> 2: ลดลง 13011.0 – 6472.9 = 6538.1 (ลดลงเยอะมาก)
    2. K=2 -> 3: ลดลง 6472.9 – 4855.5 = 1617.4 (ยังลดลงเยอะ)
    3. K=3 -> 4: ลดลง 4855.5 – 3923.4 = 932.1 (เริ่มลดน้อยลง อย่างชัดเจน)
    4. K=4 -> 5: ลดลง 3923.4 – 3267.4 = 656.0
    5. K=5 -> 6: ลดลง 3267.4 – 2840.2 = 427.2
    6. K=6 -> 7: ลดลง 2840.2 – 2533.5 = 306.7 (หลังจากนี้คือลดลงน้อยมาก)
    7. K=7 -> 8: ลดลง 2533.5 – 2330.2 = 203.3
    8. K=8 -> 9: ลดลง 2330.2 – 2162.1 = 168.1
    9. K=9 -> 10: ลดลง 2162.1 – 1997.5 = 164.6

    จึงใช้ k = 4

    K=3 -> 4: ลดลง 4855.5 – 3923.4 = 932.1 (เริ่มลดน้อยลง อย่างชัดเจน)


    Create dataframe for plot graph and plot graph with ggplot

    • สร้างกราฟเพื่อดูว่าข้อมูลไหนห่างกันน้อยที่เมื่อเทียบกับด้านคือ K = 4
    ## create dataframe for plot graph
    elbow_data <- data.frame(k = 1:10, wss = wss)
    
    ## plot graph with ggplot
    print(
      ggplot(elbow_data, aes(x = 4, y = wss)) +
        geom_line() +
        geom_point() +
        scale_x_continuous(breaks = 1:10) +
        labs(title = "Elbow Method for Optimal 4",
             x = "Amount (4)",
             y = "Within-Cluster Sum of Squares (WSS)")
    )
    
    graph with ggplot

    K-Means clustering

    ## K-Means clustering
    set.seed(42) # make result same
    k_optimal <- 4 
    kmeans_result <- kmeans(rfm_scaled, centers = k_optimal, nstart = 25)
    
    1. set.seed(42) เพื่อให้ข้อมูลคงค่าเดิมเสมอทุกครั้งที่ Run model
    2. centers = k_optimal: บอก K-Means ว่า “ให้แบ่งกลุ่มข้อมูลนี้ออกเป็น 4 กลุ่มนะ” (โดยอ้างอิงค่าจากตัวแปร k_optimal ที่เราตั้งไว้)
    3. nstart = 25: บอก K-Means ว่า “ให้ลองสุ่มจุดเริ่มต้น 25 ครั้ง แล้วเลือกเอาครั้งที่ได้ผลลัพธ์ดีที่สุด (คือได้ค่า WSS ต่ำที่สุด)” มาเป็นคำตอบสุดท้าย (ช่วยให้ได้ผลลัพธ์ที่ดีและเสถียรขึ้น)

    Segment Profiling

    Calculate average of R, F, M with Cluster

    • คำนวณค่าเฉลี่ยตามกลุ่ม Cluster เรียงตามค่าใช้จ่ายจากน้อยไปมาก
    ## Calculate average of R, F, M with Cluster
    segment_profile <- rfm_data %>%
      group_by(Cluster) %>%
      summarise(
        Avg_Recency = mean(Recency),
        Avg_Frequency = mean(Frequency),
        Avg_Monetary = mean(Monetary),
        Count = n() # Number of Customers
      ) %>%
      arrange(Avg_Monetary) # arrange with expense
    
    print("Profie seperate of group R, F, M:")
    print(segment_profile)
    

    Storytelling and Visualization

    1. Bar charts to compare average R, F, M of each segment
    ## Bar charts to compare average R, F, M of each segment
    
    segment_profile_long <- segment_profile %>%
      select(Cluster, Avg_Recency, Avg_Frequency, Avg_Monetary) %>%
      gather(key = "Metric", value = "Value", -Cluster)
    
    print(
      ggplot(segment_profile_long, aes(x = Cluster, y = Value, fill = Metric)) +
        geom_bar(stat = "identity", position = "dodge") +
        facet_wrap(~ Metric, scales = "free_y") +
        labs(title = "Segment Profiles (Average RFM Values)",
             x = "Cluster",
             y = "Average Value") +
        theme_minimal()
    )
    
    R, F, M of each segment

    Analyst from four cluster

    Cluster 1

    Cluster 1: ลูกค้าทั่วไป (กำลังจะห่าง)

    1. Frequency (ความถี่): ปานกลาง (Avg. ~4)
    2. Monetary (ยอดใช้จ่าย): ปานกลาง (Avg. ~1900)
    3. Recency (ซื้อล่าสุด): ค่อนข้างนาน (Avg. ~70 วัน)
    4. สรุป: กลุ่มนี้เคยซื้อค่อนข้างดี แต่เริ่มหายไปนานแล้ว (70 วัน) อาจต้องการการกระตุ้นเตือนให้กลับมา

    Cluster 2

    Cluster 2: 🏆 ลูกค้าชั้นดี (Best Customers / VIP)

    1. Frequency (ความถี่): สูงที่สุด (Avg. ~14)
    2. Monetary (ยอดใช้จ่าย): สูงที่สุด (Avg. ~8000)
    3. Recency (ซื้อล่าสุด): ต่ำที่สุด (Avg. ~10 วัน)
    4. สรุป: นี่คือกลุ่มที่ดีที่สุดของคุณ ซื้อบ่อย, จ่ายหนัก, และเพิ่งซื้อไปไม่นาน กลุ่มนี้คือกลุ่มที่ต้องรักษาไว้ให้ดีที่สุด (Loyalty Program, สิทธิพิเศษ)

    Cluster 3

    Cluster 3: 😥 ลูกค้าที่หายไปแล้ว (Lost Customers)

    1. Frequency (ความถี่): ต่ำ (Avg. ~1.5)
    2. Monetary (ยอดใช้จ่าย): ต่ำที่สุด (Avg. ~300)
    3. Recency (ซื้อล่าสุด): สูงที่สุด (Avg. ~180 วัน)
    4. สรุป: กลุ่มนี้ซื้อน้อย จ่ายน้อย และที่สำคัญคือ ไม่กลับมาซื้อนานมากแล้ว (เกือบ 180 วัน) การดึงลูกค้ากลุ่มนี้กลับมาอาจต้องใช้โปรโมชั่นที่แรงมาก (Win-back campaign)

    Cluster 4

    Cluster 4: ✨ ลูกค้าใหม่ (New Customers)

    1. Frequency (ความถี่): ต่ำ (Avg. ~2)
    2. Monetary (ยอดใช้จ่าย): ต่ำ (Avg. ~600)
    3. Recency (ซื้อล่าสุด): ต่ำ (Avg. ~20 วัน)
    4. สรุป: กลุ่มนี้เพิ่งเข้ามาซื้อได้ไม่นาน (Recency ต่ำ) แต่ยังซื้อไม่บ่อยและยังจ่ายไม่เยอะ (F, M ต่ำ) เป้าหมายคือต้องกระตุ้น (Nurture) ให้พวกเขากลายเป็น Cluster 2 ในอนาคต

    Recommended Campaign

    ClusterSegmentจำนวนลูกค้ากลยุทธ์ที่แนะนำ
    1At-Risk1158ดึงกลับ ส่งแคปเปญ We miss you
    2Champions723รักษา มอบรางวัล loyalty ให้สิทธิ์ VIP
    3Lost1579ไม่ต้องโฟกัส
    4Potential878พัฒนา กระตุ้นการซื้อถัดไป

    Export Data for search cluster in excel

    install.packages("writexl")
    library(writexl)
    write_xlsx(rfm_data, "rfm_data_export.xlsx")
    
    • install package write excel เพื่อที่จะสามารถนำไปดูต่อใน Excel ได้ว่า Customer ID ควรสร้าง Campaign อะไร
    • Loyalty for VIP, We miss you สำหรับลูกค้าที่จะหายไป, Potential ที่พัฒนาการกระตุ้นซื้อครั้งถัดไป, Lost ไม่ต้องโฟกัสเยอะ แล้วให้ไปโฟกัสลูกค้ากลุ่มอื่นๆ

    Github :

    ดูตัวอย่าง code ทั้งหมดได้ที่ https://github.com/Chayanonboo/code-for-articles/blob/main/code_R/Online_Retail_Data_Set_from_UCI_ML_repo30_10_2025.ipynb

    Reference :

    https://www.kaggle.com/datasets/jihyeseo/online-retail-data-set-from-uci-ml-repo