RFM Analysis (ย่อมาจาก Recency, Frequency, Monetary) คือเทคนิคการวิเคราะห์ข้อมูลลูกค้า ที่นิยมใช้เพื่อ แบ่งกลุ่มลูกค้า (Customer Segmentation) ตามพฤติกรรมการซื้อที่แตกต่างกัน โดยชื่อ RFM มาจากตัวย่อของข้อมูลหลัก 3 อย่างที่นำมาวิเคราะห์ ได้แก่
1.R - Recency: ข้อมูลของลูกค้าที่มาซื้อสินค้าหรือใช้บริการครั้งล่าสุดเมื่อไหร่ หรือจำนวนวันนับจาก Transaction ล่าสุด7 ลูกค้าที่เพิ่งซื้อไปไม่นานมานี้จะมีแนวโน้มกลับมาซื้ออีกและได้รับ Score ที่สูงกว่า
2.F - Frequency: ความถี่ในการมาซื้อสินค้าหรือใช้บริการ หรือจำนวน Transaction ในช่วงเวลาหนึ่ง (เช่น 1 ปี) ลูกค้าที่ซื้อบ่อยคือลูกค้าขาประจำและได้รับ Score ที่สูงกว่า
3.M - Monetary: ปริมาณหรือมูลค่าการซื้อหรือใช้บริการของลูกค้า หรือมูลค่ารวมของ Transaction ในช่วงเวลาหนึ่ง (เช่น 1 ปี) ลูกค้าที่ใช้จ่ายมากคือลูกค้าที่มีมูลค่าสูงและได้รับ Score ที่สูงกว่า
ความสำคัญของการทำ RFM Analysis มาจากข้อจำกัดด้านทรัพยากร (เงิน เวลา กำลังคน) ในการทำการตลาดกับลูกค้าทุกกลุ่ม RFM Model ช่วยให้นักการตลาดมุ่งเน้นไปที่กลุ่มลูกค้าที่สำคัญ ซึ่งตามหลัก Pareto สามารถทำกำไรได้ถึง 80% ของลูกค้าทั้งหมด การแบ่งกลุ่มด้วย RFM ช่วยให้เข้าใจลูกค้าแต่ละคนใช้ทรัพยากรได้อย่างคุ้มค่า และสามารถออกแบบกลยุทธ์ทางการตลาดหรือโปรโมชั่นให้เหมาะสมกับกลุ่มเป้าหมายได้อย่างมีประสิทธิภาพซึ่งนำไปสู่การเพิ่มรายได้และการกลับมาซื้อซ้ำ ทำให้ธุรกิจยั่งยืน
ขั้นตอนการทำ RFM Analysis โดยทั่วไปต้องมีข้อมูลที่สามารถระบุตัวลูกค้าได้ (เช่น จากบัตรสะสมแต้ม) และมีการบันทึกข้อมูลการซื้อขาย (วันที่ซื้อ, มูลค่า) จากนั้นคำนวณค่า R, F, M สำหรับลูกค้าแต่ละคน14 และนำมา คำนวณคะแนน RFM ซึ่งมักจะให้ Score ตั้งแต่ 1 ถึง 5 ในแต่ละแกน (R, F, M) โดยวิธีที่นิยมคือ การหาค่าควินไทล์ (Quintile) หรือการกำหนดเกณฑ์ที่เหมาะสมกับธุรกิจ
เมื่อได้คะแนน R, F, M แล้ว จะนำมาแบ่งกลุ่มลูกค้าสามารถแบ่งออกได้เป็น 11 กลุ่มหลัก เช่น
• Champions: ลูกค้าที่ซื้อล่าสุด บ่อย และใช้จ่ายสูง ควรดูแลรักษาไว้เป็นอย่างดี
• Loyal Customers: ลูกค้าที่ซื้อบ่อยและใช้จ่ายสูง แม้ไม่ได้เพิ่งซื้อล่าสุด ควรทำความเข้าใจความชอบและมอบสิทธิประโยชน์
• New Customers: ลูกค้าที่เพิ่งซื้อครั้งแรกไม่นาน ควรสร้างความประทับใจ
• Can’t Lose: ลูกค้าที่เคยเป็น Champions แต่ไม่ได้ซื้อนานแล้ว ควรหาสาเหตุและพยายามดึงกลับมาด้วยโปรโมชั่นพิเศษ
• Lost: ลูกค้าที่ไม่ได้กลับมาซื้อนานมาก และมีประวัติการซื้อน้อยหรือมูลค่าต่ำ เป็นกลุ่มที่ยากจะดึงกลับมา
การแบ่งกลุ่มนี้ช่วยให้สามารถวางกลยุทธ์และการสื่อสารที่แตกต่างกันสำหรับแต่ละกลุ่ม
แหล่งข้อมูลระบุว่า RFM Analysis สามารถทำได้โดยใช้ Excel หรือเครื่องมือ BI อย่าง Google Data Studio
อย่างไรก็ตาม RFM Analysis ก็มี ข้อจำกัด เช่น ไม่ได้นำข้อมูล Demographic มาใช้ (อาจต้องใช้เทคนิค Clustering เช่น K-means), เป็นการวิเคราะห์จาก พฤติกรรมในอดีต (ไม่ใช่การพยากรณ์อนาคตโดยตรง ซึ่งอาจต้องใช้ Predictive Analytics), และไม่สามารถจำแนก ชนิดสินค้าที่ซื้อขาย ได้ (อาจต้องใช้เทคนิคอื่นเช่น Basket Analysis).
ตัวอย่างการนำไปใช้:
- ให้คะแนนลูกค้าแต่ละคนในแต่ละมิติ (เช่น 1–5)
- สร้างกลุ่มลูกค้า เช่น:
- Best Customers: R=5, F=5, M=5
- Lost High Value: R=1, F=5, M=5
- Potential Loyalists: R=4, F=4, M=3
- ส่งแคมเปญการตลาดเฉพาะกลุ่ม เช่น:
- กลุ่มที่หายไปนาน → ส่งโปรโมชั่นให้กลับมา
- กลุ่มที่ภักดี → มอบรางวัลหรือสิทธิพิเศษ
ประโยชน์:
- ช่วยวิเคราะห์มูลค่าของลูกค้าแต่ละราย
- ใช้ทรัพยากรการตลาดอย่างมีประสิทธิภาพ
- เพิ่มยอดขายจากกลุ่มลูกค้าที่มีศักยภาพสูง
ตัวอย่างโค้ด RFM Analysis ด้วย Python โดยใช้ข้อมูลจาก DataFrame ของการสั่งซื้อสินค้า:
1. เตรียมข้อมูลตัวอย่าง
import pandas as pd
from datetime import datetime
# ตัวอย่างข้อมูลคำสั่งซื้อ
data = {
'CustomerID': ['C001', 'C002', 'C001', 'C003', 'C002', 'C001', 'C003'],
'InvoiceDate': [
'2024-12-01', '2024-12-05', '2025-01-10',
'2025-02-01', '2025-02-20', '2025-03-01', '2025-03-05'
],
'Amount': [250, 300, 150, 400, 200, 100, 300]
}
df = pd.DataFrame(data)
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])
2. คำนวณค่า RFM
# วันที่อ้างอิง (วันที่ทำการวิเคราะห์)
snapshot_date = datetime(2025, 3, 31)
# คำนวณ RFM
rfm = df.groupby('CustomerID').agg({
'InvoiceDate': lambda x: (snapshot_date - x.max()).days, # Recency
'CustomerID': 'count', # Frequency
'Amount': 'sum' # Monetary
})
rfm.rename(columns={
'InvoiceDate': 'Recency',
'CustomerID': 'Frequency',
'Amount': 'Monetary'
}, inplace=True)
- ให้คะแนน (Scoring) RFM
# ให้คะแนน 1–5 โดยใช้ quintile (แบ่งตามเปอร์เซ็นต์)
rfm['R_Score'] = pd.qcut(rfm['Recency'], 5, labels=[5,4,3,2,1]).astype(int)
rfm['F_Score'] = pd.qcut(rfm['Frequency'].rank(method='first'), 5, labels=[1,2,3,4,5]).astype(int)
rfm['M_Score'] = pd.qcut(rfm['Monetary'], 5, labels=[1,2,3,4,5]).astype(int)
# รวม RFM Score
rfm['RFM_Segment'] = rfm['R_Score'].astype(str) + rfm['F_Score'].astype(str) + rfm['M_Score'].astype(str)
rfm['RFM_Score'] = rfm[['R_Score', 'F_Score', 'M_Score']].sum(axis=1)
4. แสดงผล
print(rfm.sort_values(by='RFM_Score', ascending=False))
ผลลัพธ์ (ตัวอย่าง)
CustomerID | Recency | Frequency | Monetary | R_Score | F_Score | M_Score | RFM_Segment | RFM_Score |
---|---|---|---|---|---|---|---|---|
C001 | 30 | 3 | 500 | 5 | 3 | 5 | 535 | 13 |
C003 | 26 | 2 | 700 | 5 | 2 | 5 | 525 | 12 |