SQL PostgreSQL & SQL
Python Python (Pandas/Scikit-Learn)
Tableau Tableau Dashboard

E-Commerce Customer Segmentation & Sales Performance Analysis

E-Commerce Analytics Dashboard Tableau
Peran & Spesialisasi Lead Data Analyst
Metode Segmentasi RFM & K-Means Clustering
Skala Transaksi 541.909 Baris Transaksi

1. Background

Perusahaan e-commerce menghasilkan ratusan ribu transaksi setiap tahun. Namun, volume data yang besar tidak otomatis menghasilkan keputusan bisnis yang lebih baik. Dibutuhkan proses analisis yang sistematis untuk mengubah data transaksi menjadi insight yang dapat digunakan dalam pengambilan keputusan.

Pada artikel ini saya membangun proyek end-to-end data analytics menggunakan dataset Online Retail dari Kaggle yang berisi lebih dari 541 ribu transaksi. Tujuan analisis adalah memahami performa penjualan, perilaku pelanggan, serta menghasilkan rekomendasi bisnis berbasis data menggunakan gabungan analisis SQL, Python, Tableau, dan Customer Segmentation.

2. Business Problem

Dalam persaingan e-commerce yang ketat, promosi yang seragam kepada seluruh pelanggan sering kali menyebabkan pembengkakan anggaran pemasaran dan rendahnya retensi. Agar perusahaan dapat mengoptimalkan profitabilitas dan alokasi stok, analisis ini dirancang untuk menjawab enam pertanyaan bisnis utama:

  1. Bagaimana tren revenue setiap bulan?
  2. Produk apa yang menjadi revenue driver?
  3. Negara mana yang paling potensial?
  4. Kapan pelanggan aktif berbelanja?
  5. Siapa pelanggan terbaik perusahaan?
  6. Bagaimana segmentasi pelanggan berdasarkan perilaku pembelian?

3. Business Objectives

Dari pertanyaan bisnis tersebut, proyek ini memiliki lima sasaran obyektif yang terukur:

4. Dataset Overview

Dataset yang digunakan memuat riwayat transaksi ritel online di Britania Raya sepanjang periode Desember 2010 hingga Desember 2011. Untuk memahami dimensi dataset secara cepat, ekstraksi metrik awal dilakukan menggunakan kueri SQL:

-- Kueri SQL: Metrik Ikhtisar Dataset E-Commerce
SELECT 
    COUNT(*) AS total_rows,
    COUNT(DISTINCT InvoiceNo) AS total_invoice,
    COUNT(DISTINCT CustomerID) AS total_customer,
    COUNT(DISTINCT StockCode) AS total_product,
    COUNT(DISTINCT Country) AS total_country
FROM ecommerce;
Informasi Metrik Nilai Aktual / Keterangan
Total Rows 541.909 baris transaksi
Total Invoice 25.900 faktur unik
Total Customer 4.372 pelanggan unik
Total Product 4.070 SKU produk unik
Total Country 38 negara asal pembeli

Narasi Analisis: Kueri di atas digunakan sebagai verifikasi awal skala observasi. Insight awalnya menunjukkan bahwa dari 541 ribu baris transaksi, terdapat sebaran 4.372 pelanggan unik dan 4.070 produk, yang menandakan rata-rata aktivitas pembelian berulang per pelanggan cukup tinggi sepanjang tahun.

5. Data Understanding

Sebelum melakukan pembersihan data, observasi lanjutan dilakukan untuk memeriksa rentang waktu transaksi serta struktur tipe kolom menggunakan SQL dan Python:

-- Kueri SQL: Memeriksa Rentang Periode Transaksi
SELECT 
    MIN(InvoiceDate) AS earliest_transaction,
    MAX(InvoiceDate) AS latest_transaction
FROM ecommerce;

Hasil Periode: Transaksi tercatat mulai dari 1 Desember 2010 hingga 9 Desember 2011 (observasi 1 tahun penuh).

# Potongan Kode Python: Pemeriksaan Struktur & Statistik Deskriptif Awal
df.info()
df.describe()
df.head()

Melalui keluaran df.info() dan df.describe(), terungkap indikasi anomali awal: nilai minimum pada kolom Quantity dan UnitPrice bernilai negatif, serta terdapat kejanggalan pada ribuan baris dengan CustomerID bernilai kosong (NULL).

6. Data Quality Assessment

Inilah tahapan paling menarik yang memperlihatkan cerita investigasi dan validasi analitis sebelum data siap dimodelkan:

A. Missing Customer ID

Business Question Seberapa besar volume transaksi yang tidak memiliki identitas pelanggan, dan apa solusinya?
SQL Query SELECT COUNT(*) FROM ecommerce WHERE CustomerID IS NULL;
Output & Insight Terdapat 135.080 transaksi (sekitar 25% dari total baris) tanpa CustomerID.
Decision Data tidak dihapus dari database keseluruhan karena masih valid untuk analisis pendapatan produk macroad (Revenue per SKU/Country), tetapi disisihkan (dikecualikan) khusus pada analisis perilaku pelanggan tingkat individu seperti RFM.

B. Cancel Transaction (Investigasi Prefiks 'C' & Quantity Negatif)

Business Question Bagaimana mengidentifikasi transaksi pembatalan secara akurat tanpa menghapus data penyesuaian stok sistem?
SQL Query SELECT * FROM ecommerce WHERE InvoiceNo LIKE 'C%';
Output & Insight Faktur dengan awalan huruf 'C' terkonfirmasi memiliki Quantity < 0. Namun, saat diinvestigasi lebih lanjut, tidak semua Quantity negatif diawali huruf 'C'. Terdapat ribuan baris bernilai negatif dengan faktur reguler atau kode anomali sistem (seperti deskripsi *'damaged'*, *'lost'*, atau *'check'*).
Decision Transaksi berawalan 'C' divalidasi sebagai pembatalan pelanggan yang sah dan dikecualikan dari agregasi revenue positif. Sementara itu, kuantitas negatif tanpa prefiks 'C' diisolasi sebagai log penyesuaian/penyusutan inventori gudang agar tidak merusak akurasi total penjualan.

C. Invalid Price (Harga Satuan Nol / Negatif)

Business Question Apakah terdapat harga produk yang tidak valid secara akuntansi ritel?
SQL Query SELECT * FROM ecommerce WHERE UnitPrice <= 0;
Output & Insight Ditemukan ribuan transaksi dengan harga UnitPrice = 0 yang merupakan sampel gratis atau kesalahan log sistem, serta sejumlah kecil nilai harga negatif (utang/penyesuaian bank).
Decision Seluruh baris dengan UnitPrice ≤ 0 dihapus dari tabel pemodelan pendapatan (Revenue Analytics).

D. Duplicate Transactions

Business Question Bagaimana membedakan transaksi duplikat sistem dari kebiasaan beli berulang pada hari yang sama?
SQL Query SELECT *, COUNT(*) OVER(PARTITION BY InvoiceNo, StockCode, CustomerID) duplicate_count FROM ecommerce;
Output & Insight Kueri menghasilkan baris dengan duplicate_count > 1. Namun dalam bisnis ritel, duplikat belum tentu salah; seorang pelanggan sah saja membeli SKU produk yang sama dua kali dalam satu faktur jika item di-scan terpisah.
Decision De-duplikasi hanya dilakukan apabila baris memiliki stempel waktu (timestamp), nomor faktur, kode produk, dan kuantitas yang identik 100% secara berurutan.

7. Data Preparation

Di tahap ini, pemrosesan didominasi menggunakan kode Python (Pandas) untuk menyaring observasi bersih dan membentuk variabel baru yang siap diringkas:

# Potongan Kode Python: Preprocessing & Feature Engineering
df = df[df['Quantity'] > 0]
df = df[df['UnitPrice'] > 0]
df['Revenue'] = df['Quantity'] * df['UnitPrice']
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])

Alasan Preprocessing: Pemilihan kondisi Quantity > 0 dan UnitPrice > 0 menyingkirkan pembatalan, anomali stok, dan barang sampel. Pembuatan kolom baru Revenue secara langsung mempermudah agregasi pendapatan tanpa komputasi perkalian berulang pada tahap visualisasi.

8. Exploratory Data Analysis

Berikut adalah 8 analisis eksploratif dominan Python dengan pola konsisten untuk membedah kinerja bisnis:

A. Monthly Revenue Analysis

monthly_revenue = df.groupby(df['InvoiceDate'].dt.to_period('M'))['Revenue'].sum()
Insight Revenue meningkat stabil dari pertengahan tahun dan mencapai puncaknya pada November 2011 (musim belanja akhir tahun & Black Friday).
Recommendation Persiapkan stok ekstra dan alokasikan anggaran pemasaran terbesar pada bulan Oktober–November.
Business Impact Memaksimalkan penyerapan omset saat daya beli pelanggan berada di titik tertinggi.

B. Top Product Contributing Revenue

top_product = df.groupby('Description')['Revenue'].sum().sort_values(ascending=False).head(10)
Insight Produk dekorasi rumah bergaya vintage seperti "Regency Cakestand 3 Tier" menjadi penghasil revenue teratas.
Recommendation Pasang sistem pemesanan ulang otomatis (automated reorder point) untuk 10 SKU terlaris.
Business Impact Mencegah potensi kehilangan penjualan akibat kehabisan stok (stockout).

C. Revenue by Country (Market Dominance)

country = df.groupby('Country')['Revenue'].sum().sort_values(ascending=False)
Insight Pasar domestik United Kingdom (UK) menyumbang >88% total pendapatan, disusul Belanda dan Irlandia.
Recommendation Pertahankan dominasi retensi di UK, dan tawarkan promo gratis ongkir bersyarat di pasar Eropa teratas.
Business Impact Efisiensi biaya logistik internasional dengan hasil ekspansi pasar yang berfokus.

D. Peak Shopping Hour

df['Hour'] = df['InvoiceDate'].dt.hour
peak_hour = df.groupby('Hour')['InvoiceNo'].nunique()
Insight Aktivitas transaksi melonjak pada pukul 11.00 hingga 15.00 waktu setempat (jam istirahat siang).
Recommendation Jadwalkan pengiriman email promosi (email blast) pada pukul 10.30 siang.
Business Impact Meningkatkan rasio klik (CTR) dan konversi pembelian harian.

E. Day of Week Analysis

df['Day'] = df['InvoiceDate'].dt.day_name()
day_analysis = df.groupby('Day')['Revenue'].sum()
Insight Hari Kamis dan Selasa mencatatkan volume pendapatan tertinggi dalam seminggu.
Recommendation Luncurkan kampanye diskon mingguan (*flash sale*) pada hari Selasa dan Kamis.
Business Impact Memanfaatkan kebiasaan transaksi tertinggi untuk mendongkrak volume pesanan mingguan.

F. Top Customer Revenue Contribution

customer = df.groupby('CustomerID')['Revenue'].sum().sort_values(ascending=False).head(10)
Insight 10 pelanggan teratas (didominasi distributor grosir B2B) menyumbang persentase revenue yang sangat besar.
Recommendation Sediakan akun manajer dedicated dan jalur diskon volume khusus untuk pelanggan B2B.
Business Impact Mengamankan stabilitas arus kas jangka panjang dari klien bernilai tinggi.

G. Basket Size Analysis (Quantity per Invoice)

basket = df.groupby('InvoiceNo')['Quantity'].sum()
Insight Mayoritas faktur retail memuat 1–10 unit barang, sementara transaksi grosir dapat mencapai ribuan unit.
Recommendation Buat penawaran paket bundling beli 3 hemat 10% untuk produk aksesoris rumah.
Business Impact Mendorong kenaikan jumlah unit barang yang dibeli per satu transaksi faktur.

H. Average Order Value (AOV) Analysis

aov = df.groupby('InvoiceNo')['Revenue'].sum().mean()
Insight Rata-rata nilai belanja pelanggan per faktur berada di angka £350–£400.
Recommendation Pasang promo gratis ongkir dengan syarat minimal pembelanjaan £500.
Business Impact Mendongkrak rata-rata nilai transaksi secara organik di seluruh segmen.

9. Statistical Insights

Bagian ini memanfaatkan Python untuk visualisasi dan verifikasi distribusi statistik secara mendalam:

A. Revenue & Customer Revenue Distribution (Histogram)

Histogram sebaran pendapatan memperlihatkan distribusi yang sangat condong ke kanan (right-skewed). Ini membuktikan bahwa bisnis e-commerce ini didorong oleh pola pembelian dengan variasi nilai yang luas antara konsumen ritel tangga dengan pembeli grosir.

B. Pareto Validation (26% → 80% Revenue Rule)

Analisis distribusi kumulatif membuktikan hukum Pareto yang sangat tajam di dalam dataset ini:

# Potongan Kode Python: Pareto Customer Revenue Analysis
customer_rev = df.groupby('CustomerID')['Revenue'].sum().sort_values(ascending=False)
pareto_percentage = customer_rev.cumsum() / customer_rev.sum() * 100

Hasil Statistik Pareto: Terbukti bahwa 26% dari total pelanggan menyumbang tepat 80% dari total pendapatan perusahaan. Hal ini memvalidasi bahwa efisiensi iklan terbesar berada pada upaya menjaga kepuasan segmen 26% tersebut.

C. Correlation Heatmap & Outlier Boxplot

Heatmap korelasi Spearman menunjukkan korelasi sangat positif antara frekuensi kedatangan (Frequency) dengan total moneter belanja (Monetary). Sementara itu, evaluasi Boxplot pada kolom pengeluaran membuktikan bahwa outlier bernilai tinggi merupakan transaksi sah dari mitra B2B berulang dan bukan kesalahan entri.

10. Customer Segmentation (RFM & K-Means Clustering)

Penerapan algoritma Machine Learning di sini bertujuan untuk mengelompokkan 4.372 pelanggan ke dalam klaster perilaku secara algoritmik dan objektif:

# Potongan Kode Python: Ekstraksi Variabel RFM
import datetime as dt
snapshot_date = df['InvoiceDate'].max() + dt.timedelta(days=1)
rfm = df.groupby('CustomerID').agg({
    'InvoiceDate': lambda x: (snapshot_date - x.max()).days,
    'InvoiceNo': 'nunique',
    'Revenue': 'sum'
}).rename(columns={'InvoiceDate': 'Recency', 'InvoiceNo': 'Frequency', 'Revenue': 'Monetary'})
# Potongan Kode Python: Feature Scaling & K-Means Clustering
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

scaler = StandardScaler()
rfm_scaled = scaler.fit_transform(rfm)

kmeans = KMeans(n_clusters=4, random_state=42)
rfm['Cluster'] = kmeans.fit_predict(rfm_scaled)
cluster_summary = rfm.groupby('Cluster').mean()

Cluster Summary: Output K-Means menghasilkan 4 klaster utama: Champions (VIP) dengan kontribusi moneter tertinggi dan recency terendah, Loyal Customers dengan transaksi stabil, At-Risk yang sudah lama tidak kembali bertransaksi, dan Hibernating dengan tingkat engagement terendah.

11. Tableau Dashboard

Seluruh pemrosesan SQL dan hasil klasterisasi Python diintegrasikan ke dalam Tableau Dashboard eksekutif. Dashboard ini menyajikan KPI waktu nyata seperti Total Revenue, Jumlah Orders, Average Order Value (AOV), serta visualisasi interaktif pergerakan segmen pelanggan RFM.

Tableau Dashboard E-Commerce Showcase

12. Business Recommendation

Hasil sintesis dari seluruh tahap eksplorasi dan segmentasi merumuskan empat rekomendasi operasional bagi manajemen:

13. Business Impact

Implementasi analisis berbasis data ini berpotensi memberikan dampak transformasi bisnis yang terukur:

14. Conclusion

Proyek analisis data e-commerce ini membuktikan bahwa pengolahan data transaksi yang sistematis—melalui pembersihan SQL, eksplorasi EDA, validasi statistik Pareto, dan segmentasi K-Means—mampu memberikan visibilitas yang utuh atas perilaku pasar. Metodologi ini memberdayakan perusahaan untuk beralih dari keputusan berbasis asumsi menuju strategi pemasaran berbasis data yang berorientasi pada efisiensi dan pertumbuhan laba.