Main Logo
  • Home
  • About
  • Kursus
    • Paket Kursus
    • Roadmap Profesi
    • Data & AI
      • Data Analyst
      • Data Scientist
      • AI Engineer
      • Data Engineer
      • Business Intelligence (BI) Specialist
    • Infrastruktur & Keamanan
      • Network Engineer
      • System Engineer
      • DevOps Engineer
      • Security Engineer
      • Cloud Engineer
    • Programming & Web Development
      • Web & App Developer
      • Web Developer
      • WordPress Developer
      • Mobile Developer
    • Spesialisasi
      • Blockchain Engineer
      • IOT Engineer
      • Digital Marketing Specialist
  • Elearning
  • Blog
  • Portfolio
Daftar
Main Logo
  • Home
  • About
  • Kursus
    • Paket Kursus
    • Roadmap Profesi
    • Data & AI
      • Data Analyst
      • Data Scientist
      • AI Engineer
      • Data Engineer
      • Business Intelligence (BI) Specialist
    • Infrastruktur & Keamanan
      • Network Engineer
      • System Engineer
      • DevOps Engineer
      • Security Engineer
      • Cloud Engineer
    • Programming & Web Development
      • Web & App Developer
      • Web Developer
      • WordPress Developer
      • Mobile Developer
    • Spesialisasi
      • Blockchain Engineer
      • IOT Engineer
      • Digital Marketing Specialist
  • Elearning
  • Blog
  • Portfolio

RFM Analysis: Segmentasi Pelanggan dengan SQL & Python

  • August 31, 2026
  • oleh Eduardus Defino Ananda Hutama

Setiap pelanggan tidak lahir setara. Sebagian membeli setiap minggu, sebagian baru sekali lalu hilang, dan sebagian lagi sudah lama tidak kembali padahal dulu rajin berbelanja. Jika semua diperlakukan sama, strategi marketing Anda membuang waktu dan budget. Di sinilah RFM analysis hadir — sebuah metode sederhana namun sangat ampuh untuk mengelompokkan pelanggan berdasarkan perilaku transaksinya.

Kabar baiknya, RFM tidak butuh machine learning yang rumit. Cukup memanfaatkan SQL untuk menghitung dan memberi skor, lalu Python untuk validasi dan analisis lanjutan. Artikel ini akan menuntun Anda selangkah demi selangkah, dari data mentah transaksi hingga segmen pelanggan yang siap dieksekusi tim marketing.

📌 TL;DR — RFM Analysis
  1. R (Recency): Seberapa baru pelanggan terakhir bertransaksi.
  2. F (Frequency): Seberapa sering pelanggan bertransaksi.
  3. M (Monetary): Seberapa besar total nilai transaksinya.
  4. Setiap komponen diskor 1–5 lalu digabung menjadi segmen seperti Champions, Loyal, hingga At Risk.

🎯 Apa Itu RFM Analysis?

RFM analysis adalah teknik segmentasi pelanggan berdasarkan tiga dimensi perilaku transaksi: Recency, Frequency, dan Monetary. Konsep ini sederhana: pelanggan yang baru belanja, sering belanja, dan menghabiskan banyak uang cenderung menjadi pelanggan terbaik dan paling loyal.

Kekuatan RFM terletak pada kesederhanaannya. Ia tidak memerlukan data demografis, survei kepuasan, atau fitur rumit — cukup data transaksi yang hampir semua bisnis sudah miliki. Anda bisa langsung menerapkan metode ini pada tabel orders/transaksi yang ada di database Anda.

Tiga Komponen Inti RFM

🕒
Recency (R)
Berapa hari sejak transaksi terakhir? Makin kecil nilainya (makin baru) makin baik.
🔁
Frequency (F)
Berapa kali pelanggan bertransaksi dalam periode tertentu? Makin sering makin loyal.
💰
Monetary (M)
Berapa total nilai transaksi? Pelanggan dengan nilai tinggi layak perlakuan istimewa.

Perhatikan satu hal penting: pada dimensi Recency, nilai yang lebih kecil justru lebih baik karena berarti pelanggan baru saja bertransaksi. Berbeda dengan Frequency dan Monetary yang nilainya lebih besar lebih baik. Perbedaan arah ini harus diperhitungkan saat memberi skor nanti.

⚙️ Alur Kerja RFM dalam 5 Langkah

  1. Hitung R, F, M per pelanggan — agregasi dari tabel transaksi menggunakan SQL.
  2. Bagi tiap komponen menjadi 5 kelas — gunakan kuartil atau fungsi NTILE agar setiap komponen memiliki skala 1–5.
  3. Beri skor 1–5 — pada Recency 5 berarti paling baru, pada Frequency dan Monetary 5 berarti paling tinggi.
  4. Gabung ketiga skor — kombinasi R, F, M membentuk “RFM cell” (misal 555, 511, 311).
  5. Petakan ke segmen — terjemahkan tiap cell menjadi segmen bernama seperti Champions, Loyal, atau At Risk.

🗄️ Langkah 1: Siapkan Data Transaksi (SQL)

Semua dimulai dari tabel transaksi. Untuk contoh, kita gunakan tabel transactions yang menyimpan setiap order. Berikut struktur DDL-nya:

🗄️ Membuat TabelSQL
CREATE TABLE transactions (
    transaction_id INT PRIMARY KEY,
    customer_id    INT,
    order_date     DATE,
    amount         DECIMAL(10,2)
);

Dan beberapa baris data contoh:

🗄️ Data ContohSQL
INSERT INTO transactions VALUES
(1001, 501, '2026-08-10', 250000),
(1002, 502, '2026-07-20', 120000),
(1003, 501, '2026-07-05', 300000),
(1004, 503, '2026-06-15', 50000),
(1005, 502, '2026-05-30', 180000),
(1006, 501, '2026-05-10', 90000),
(1007, 504, '2026-08-12', 500000),
(1008, 503, '2026-04-20', 75000);
✨ Catatan
Dalam proyek nyata, biasanya Anda juga menambahkan kolom order_status dan hanya menghitung transaksi yang berstatus completed. Untuk latihan, asumsikan semua baris di atas adalah transaksi berhasil.

🧮 Langkah 2–3: Hitung R, F, M dan Beri Skor (SQL)

Pertama, kita hitung Recency, Frequency, dan Monetary untuk setiap pelanggan. Recency dihitung sebagai selisih hari antara tanggal terakhir transaksi dan tanggal acuan (misal tanggal hari ini atau tanggal maksimum di data).

🧮 Hitung R, F, MSQL
WITH rfm_raw AS (
    SELECT
        customer_id,
        DATEDIFF(CURRENT_DATE, MAX(order_date)) AS recency,
        COUNT(*)                                AS frequency,
        SUM(amount)                             AS monetary
    FROM transactions
    GROUP BY customer_id
)
SELECT * FROM rfm_raw
ORDER BY customer_id;

Hasilnya terlihat seperti tabel di bawah ini (untuk memudahkan, kita gunakan tanggal acuan 2026-08-15):

customer_idrecency (hari)frequencymonetary
50153640000
502262300000
503612125000
50431500000

Selanjutnya, kita ubah masing-masing komponen menjadi skor 1–5. Cara paling populer adalah fungsi window NTILE(5) yang membagi data menjadi 5 kelompok sama besar berdasarkan urutan nilai.

Ingat arah skornya: untuk Recency, nilai terkecil (paling baru) mendapat skor 5, sehingga kita urutkan ORDER BY recency ASC — artinya kelompok terbaru mendapat skor 5. Untuk Frequency dan Monetary, nilai terbesar mendapat skor 5, sehingga urutannya ORDER BY frequency DESC dan ORDER BY monetary DESC.

🧮 Beri Skor 1–5 dengan NTILESQL
WITH rfm_raw AS (
    SELECT
        customer_id,
        DATEDIFF(CURRENT_DATE, MAX(order_date)) AS recency,
        COUNT(*)                                AS frequency,
        SUM(amount)                             AS monetary
    FROM transactions
    GROUP BY customer_id
),
rfm_score AS (
    SELECT
        customer_id,
        recency, frequency, monetary,
        NTILE(5) OVER (ORDER BY recency ASC)   AS r_score,
        NTILE(5) OVER (ORDER BY frequency DESC) AS f_score,
        NTILE(5) OVER (ORDER BY monetary DESC)  AS m_score
    FROM rfm_raw
)
SELECT * FROM rfm_score
ORDER BY r_score DESC, f_score DESC, m_score DESC;
⚠️ Catatan Penting: NTILE
NTILE bekerja dengan membagi data menjadi kelompok berukuran sama. Jika jumlah pelanggan tidak habis dibagi 5, beberapa kelompok akan memiliki 1 baris lebih banyak. Untuk data kecil contoh ini, NTILE tetap berfungsi tetapi hasilnya kasar. Dalam data ribuan pelanggan, NTILE justru sangat stabil dan menjadi pilihan utama.

🏷️ Langkah 4–5: Gabung Skor Menjadi Segmen (SQL)

Setelah setiap pelanggan memiliki skor R, F, dan M, kita bisa menggabungkannya menjadi “RFM cell” seperti 555, 533, atau 311. Selanjutnya, kita petakan kombinasi tersebut menjadi segmen yang mudah dimengerti tim marketing menggunakan pernyataan CASE WHEN.

🏷️ Petakan Skor Menjadi SegmenSQL
WITH rfm_raw AS (
    SELECT
        customer_id,
        DATEDIFF(CURRENT_DATE, MAX(order_date)) AS recency,
        COUNT(*)                                AS frequency,
        SUM(amount)                             AS monetary
    FROM transactions
    GROUP BY customer_id
),
rfm_score AS (
    SELECT
        customer_id,
        recency, frequency, monetary,
        NTILE(5) OVER (ORDER BY recency ASC)    AS r_score,
        NTILE(5) OVER (ORDER BY frequency DESC) AS f_score,
        NTILE(5) OVER (ORDER BY monetary DESC)  AS m_score
    FROM rfm_raw
)
SELECT
    customer_id,
    CONCAT(r_score, f_score, m_score) AS rfm_cell,
    CASE
        WHEN r_score = 5 AND f_score = 5 THEN 'Champions'
        WHEN r_score = 4 AND f_score = 5 THEN 'Loyal Customers'
        WHEN r_score >= 4 AND f_score >= 4 THEN 'Potential Loyalist'
        WHEN r_score = 5 AND f_score <= 2 THEN 'New Customers'
        WHEN r_score >= 3 AND f_score >= 3 THEN 'Need Attention'
        WHEN r_score <= 2 AND f_score >= 3 THEN 'At Risk'
        WHEN r_score <= 2 AND f_score = 1 THEN 'Hibernating'
        WHEN r_score = 1 THEN 'Lost'
        ELSE 'Promising'
    END AS segment
FROM rfm_score
ORDER BY r_score DESC, f_score DESC;

Perhatikan bahwa logika segmentasi di atas bersifat heuristik — bukan aturan baku. Anda bebas menyesuaikan ambang batas sesuai karakter bisnis. Skor r_score=5 dan f_score=5 jelas termasuk Champions, sedangkan r_score rendah menandakan pelanggan yang berisiko hilang.

🐍 Validasi & Analisis Lanjut dengan Python

SQL sudah menghasilkan segmen. Namun kadang Anda butuh analisis lebih dalam — distribusi skor, breakpoint kuartil yang jelas, hingga visualisasi. Di sinilah Python dengan pandas dan seaborn berperan, melanjutkan seri analisis SQL + Python kami.

Daripada menghitung agregasi di SQL lalu menyalin hasilnya manual, kita bisa menarik data mentah dari database, lalu menghitung RFM sepenuhnya di Python. Ini memberi kita kendali penuh atas cara menentukan breakpoint.

Mau Kuasai RFM Analysis: Segmentasi Pelanggan dengan SQL & Python Sampai Bisa Praktik Langsung?

Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.

Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →

🐼 Hitung RFM dengan PandasPYTHON
import pandas as pd

df = pd.read_sql_query(
    "SELECT customer_id, order_date, amount FROM transactions",
    conn
)

# Acuan: tanggal maksimum di data
ref_date = df['order_date'].max()

rfm = df.groupby('customer_id').agg(
    recency  = ('order_date', lambda d: (ref_date - d.max()).days),
    frequency= ('customer_id', 'count'),
    monetary = ('amount', 'sum')
).reset_index()

# Beri skor 1-5 berbasis kuartil
rfm['R'] = pd.qcut(rfm['recency'], 5, labels=[5,4,3,2,1])
rfm['F'] = pd.qcut(rfm['frequency'].rank(method='first'), 5, labels=[1,2,3,4,5])
rfm['M'] = pd.qcut(rfm['monetary'].rank(method='first'), 5, labels=[1,2,3,4,5])

print(rfm.sort_values('recency'))

Pada Recency, kita balik labelnya ([5,4,3,2,1]) karena nilai terbaru (recency kecil) harus mendapat skor tinggi. Sementara pada Frequency dan Monetary label berjalan normal karena nilai besar mendapat skor tinggi.

Setelah mendapatkan skor, Anda bisa memetakan kombinasi skor ke segmen menggunakan fungsi kecil, lalu memvisualisasikan distribusinya:

🐼 Petakan Segmen & VisualisasiPYTHON
import seaborn as sns

def map_segment(r):
    if r['R'] == 5 and r['F'] == 5: return 'Champions'
    if r['R'] == 4 and r['F'] == 5: return 'Loyal Customers'
    if r['R'] >= 3 and r['F'] >= 3: return 'Need Attention'
    if r['R'] <= 2 and r['F'] >= 3: return 'At Risk'
    if r['R'] == 1:                 return 'Lost'
    return 'Others'

rfm['segment'] = rfm.apply(map_segment, axis=1)
sns.countplot(data=rfm, x='segment', order=rfm['segment'].value_counts().index)
✨ Tips Praktis
Python lebih fleksibel ketika breakpoint skor Anda butuh kustomisasi (misal menggunakan persentil manual). Sebaliknya, SQL lebih unggul untuk produksi dan otomatisasi karena berjalan langsung di database. Kombinasikan keduanya: SQL untuk pipeline, Python untuk eksplorasi dan validasi.

📊 Ringkasan Segmen dan Aksi Bisnis

Segmen hanyalah kelompok — yang bermanfaat adalah aksi yang Anda ambil untuk tiap kelompok. Berikut ringkasan umum:

SegmenKarakteristikAksi Bisnis
ChampionsBeli baru, sering, nominal besar.Reward & program loyalitas, ajak jadi brand advocate/testimoni.
Loyal CustomersSangat sering, nilai besar, sedikit tidak sebaru Champions.Maintain engagement, upselling produk premium.
New CustomersBaru belanja pertama kali.Onboarding, dorong pembelian kedua dengan voucher.
At RiskDulu sering beli, tapi lama tidak kembali.Win-back campaign, diskon kejutan, email re-engagement.
LostTerakhir beli sudah sangat lama.Evaluasi ulang; kurangi budget, biarkan bila tidak prospek.

🎯 Kesimpulan

RFM analysis adalah alat segmentasi yang sederhana namun berdampak besar. Dengan tiga angka — Recency, Frequency, dan Monetary — Anda bisa membagi seluruh basis pelanggan menjadi kelompok yang bernilai berbeda, lalu memperlakukan masing-masing sesuai nilainya.

Kombinasi SQL dan Python menjadikan proses ini tangguh: SQL menangani komputasi dan pipelining langsung di database, sementara Python memberi fleksibilitas untuk eksplorasi dan validasi. Mulailah dari data transaksi yang sudah Anda miliki, dan Anda akan segera melihat pelanggan mana yang layak dipertahankan, dimanjakan, atau bahkan dilepas.

🚀 Rangkuman Praktis
  • Recency: makin baru makin baik (perhatikan arah skornya dibalik).
  • Frequency & Monetary: makin besar makin baik.
  • Skor 1–5 dengan NTILE di SQL atau qcut di Python.
  • Gabung skor menjadi RFM cell lalu petakan ke segmen bernama.
  • Tiap segmen butuh aksi bisnis yang berbeda agar segmentasi berdampak.

❓ FAQ: RFM Analysis

Apa arti singkatan RFM?

RFM adalah singkatan dari Recency (berapa baru pelanggan bertransaksi), Frequency (berapa sering bertransaksi), dan Monetary (berapa besar total nilai transaksinya). Ketiga dimensi ini menjadi dasar untuk mengelompokkan pelanggan.

Kapan sebaiknya RFM analysis digunakan?

RFM cocok untuk bisnis yang memiliki data transaksi berulang, seperti e-commerce, retail, dan layanan berlangganan. Metode ini kurang cocok untuk bisnis one-time purchase seperti menjual rumah atau kendaraan yang jarang dibeli ulang.

Apakah RFM butuh machine learning?

Tidak. RFM adalah metode berbasis aturan yang hanya butuh agregasi dan pengelompokan skor. Namun hasil segmen RFM sering digunakan sebagai fitur atau label untuk model machine learning lanjutan, misalnya prediksi churn.

Berapa banyak segmen yang ideal?

Tergantung kebutuhan. Dengan skor 1–5 ada hingga 125 kombinasi cell, tetapi kebanyakan bisnis memetakannya menjadi 5–11 segmen bernama agar mudah dieksekusi. Terlalu sedikit segmen terlalu kasar, terlalu banyak justru membingungkan tim marketing.

Apa bedanya RFM dengan clustering seperti K-Means?

RFM adalah metode berbasis aturan yang deterministik dan mudah dijelaskan, sedangkan clustering (misal K-Means) berbasis jarak yang otomatis mencari kelompok dalam data. RFM lebih transparan dan mudah diinterpretasikan, sementara clustering bisa menangkap pola yang lebih kompleks.

Dibuat oleh:

Eduardus Defino Ananda Hutama

Mau Kuasai RFM Analysis: Segmentasi Pelanggan dengan SQL & Python Sampai Bisa Praktik Langsung?

Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.

Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →

Tags: Customer Segmentationmarketingpandaspythonrecency frequency monetaryrfm analysissegmentasi pelanggansql
Previous Post
Next Post

Post comment

Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • Menghitung Korelasi Antar Kolom di Pandas untuk Menemukan Hubungan Data
  • RFM Analysis: Segmentasi Pelanggan dengan SQL & Python
  • Data Storytelling: Struktur SCQA untuk Presentasi Data
  • Prinsip Desain Dashboard: Layout, Warna, dan Tipografi
  • Mendeteksi Pola Aktivitas Mencurigakan dengan Data Analysis

Arsip

  • September 2026
  • August 2026
  • July 2026
  • June 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • September 2025
  • August 2025
  • July 2025
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • February 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • September 2017
  • August 2017
  • July 2017
  • June 2017
  • May 2017
  • April 2017
  • March 2017
  • February 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016
  • August 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016
  • February 2016
  • January 2016
  • December 2015
  • November 2015
  • October 2015
  • September 2015
  • August 2015
  • July 2015
  • June 2015
  • May 2015
  • April 2015
  • March 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • August 2014
  • July 2014
  • June 2014
  • May 2014
  • April 2014
  • March 2014
  • February 2014
  • January 2014
  • December 2013
  • November 2013
  • October 2013
  • September 2013
  • August 2013
  • July 2013
  • June 2013
  • May 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • December 2011
  • November 2011

Tags

apache web server dns server kursus android kursus database kursus dns dan web server kursus dns server kursus ethical hacking kursus hacking kursus jaringan kursus jaringan linux Kursus Komputer kursus komputer di solo kursus komputer di solo / surakarta kursus komputer di surakarta kursus linux Kursus Linux Forensics kursus linux networking kursus linux security kursus linux server kursus mikrotik kursus networking kursus network security kursus php Kursus PHP dan MySQL kursus php mysql kursus proxy kursus security kursus ubuntu kursus ubuntu server kursus web kursus web security kursus web server kursus wordpress kursus wordpress theme linux MySQL pelatihan komputer di solo PHP python security training komputer training komputer di solo tutorial php ubuntu wordpress

© Edusoft Center - Kursus Komputer di Solo | 2010 - 2026 | Privacy Policy | Site Map | Portfolio Magang | Butuh tim kami langsung yang mengerjakan? Lihat layanan implementasi →

All Right Reserved

WhatsApp us