Pola Pembelian Barang dan Penyusunan Strategi Pemasaran dengan Market Basket Analysis

Navia Istiana Labiba
6 min readMay 14, 2024

Assalamualaikum Warahmatullah Wabarakatuh,

Halo para Statistisi!

Pada kesempatan kali ini, saya akan membahas Market Basket Analysis untuk data Transaction. Apasih Market Basket Analysis itu? Yuk kita simak pembahasan berikut!

Apa itu Market Basket Analysis?

Market Basket Analysis adalah analisis data penjualan dalam jumlah besar. Hasil analisis ini dapat menampilkan barang apa saja yang dibeli oleh sebagian besar konsumen. Selain itu, analisis ini juga mampu memberikan hubungan antara barang satu dengan barang lain yang memiliki korelasi sehingga kemungkinan bisa direkomendasikan pada pelanggan.

Sebuah data yang menampilkan market basket analysis harus ditampung dalam bentuk sistem POS maupun spreadsheet sehingga perusahaan dapat menganalisis barang mana saja yang banyak diinginkan dalam waktu bersamaan. Dengan menganalisis ini, perusahaan mampu memberikan performa lebih baik kepada konsumen ke depannya.

Studi Kasus

Data Transaction merupakan data publik yang berisi data penjualan. Data ini terdiri dari 8 kolom yang berisi user, tanggal pembelian, negara, dan lainnya. Analisis yang cocok untuk data ini adalah Market Basket Analysis karena salah satu algoritma yang bisa dimanfaatkan untuk melihat pola pembelian barang dan penyusunan strategi. Untuk data Transaction dapat diakses melalui https://www.kaggle.com/datasets/vipin20/transaction-data?select=transaction_data.csv.

Langkah awal, input data transaction ke dalam google collab. Lalu tulis syntax import dan jalankan syntax tersebut.

import pandas as pd

# Membaca file csv
datano3 = pd.read_csv("/content/transaction_data.csv")

# Menampilkan beberapa baris pertama
print(datano3.head())
   UserId  TransactionId               TransactionTime  ItemCode  \
0 278166 6355745 Sat Feb 02 12:50:00 IST 2019 465549
1 337701 6283376 Wed Dec 26 09:06:00 IST 2018 482370
2 267099 6385599 Fri Feb 15 09:45:00 IST 2019 490728
3 380478 6044973 Fri Jun 22 07:14:00 IST 2018 459186
4 -1 6143225 Mon Sep 10 11:58:00 IST 2018 1733592

ItemDescription NumberOfItemsPurchased CostPerItem \
0 FAMILY ALBUM WHITE PICTURE FRAME 6 11.73
1 LONDON BUS COFFEE MUG 3 3.52
2 SET 12 COLOUR PENCILS DOLLY GIRL 72 0.90
3 UNION JACK FLAG LUGGAGE TAG 3 1.73
4 WASHROOM METAL SIGN 3 3.40

Country
0 United Kingdom
1 United Kingdom
2 France
3 United Kingdom
4 United Kingdom

Output diatas ditampilkan beberapa baris pertama dari dataset transaction. Dalam dataset tersebut terdapat 8 fitur yang dapat digunakan untuk menganalisis pola pembelian barang.

Kemudian kita akan cek jumlah dari dataset tersebut.

datano3.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1048575 entries, 0 to 1048575
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 UserId 1048575 non-null int64
1 TransactionId 1048575 non-null int64
2 TransactionTime 1048575 non-null object
3 ItemCode 1048575 non-null int64
4 ItemDescription 1048575 non-null object
5 NumberOfItemsPurchased 1048575 non-null int64
6 CostPerItem 1048575 non-null float64
7 Country 1048575 non-null object
dtypes: float64(1), int64(4), object(3)
memory usage: 66.2+ MB

Berdasarkan output diatas, dilihat bahwa dataset transaction berjumlah 1048575 baris. Kemudian kita melakukan pembersihan pada dataset.

Pembersihan Data

datano3=datano3.dropna()
datano3.info()
<class 'pandas.core.frame.DataFrame'>
Index: 1045782 entries, 0 to 1045782
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 UserId 1045782 non-null int64
1 TransactionId 1045782 non-null int64
2 TransactionTime 1045782 non-null object
3 ItemCode 1045782 non-null int64
4 ItemDescription 1045782 non-null object
5 NumberOfItemsPurchased 1045782 non-null int64
6 CostPerItem 1045782 non-null float64
7 Country 1045782 non-null object
dtypes: float64(1), int64(4), object(3)
memory usage: 74.2+ MB

Proses pembersihan data pada analisis ini adalah untuk menghapus baris dengan nilai yang hilang atau kosong (NaN) dan menghapus baris duplikat. Dengan menggunakan metode ‘dropna()’ baris-baris yang mengandung nilai yang hilang dihapus dari data frame. Langkah-langkah ini dapat membantu memastikan bahwa setiap baris dalam data frame mewakili data yang unik, sehingga hasil analisis yang dihasilkan lebih akurat.

Dari output dihasilkan 1045782 nilai yang ada pada dataset setelah dilakukan pembersihan. Ini artinya terdapat 2793 nilai yang hilang atau outlier.

Agregat

datano3['TransactionId'].unique()
array([6355745, 6283376, 6385599, ..., 6231192, 5995748, 5918825])

Syntax diatas digunakan untuk mengembalikan array atau daftar yang berisi semua nilai unik dari kolom ‘TransactionId’ dalam DataFrame. Ini sering digunakan untuk memeriksa nilai unik dalam suatu kolom, misalnya untuk melihat berapa banyak transaksi yang berbeda yang ada dalam dataset. Kemudian kita akan memfilter data transaksi berdasarkan jumlah item yang dibeli.

itemset=datano3[datano3['NumberOfItemsPurchased']>0]
itemset
Filter Data Berdasarkan Jumlah Item Yang Dibeli

Syntax diatas berfungsi untuk membuat subset dari DataFrame yang hanya berisi baris-baris di mana jumlah item lebih besar dari 0. Selanjutnya kita akan melihat jumlah barang yang dibeli dalam setiap transaksi setelah diurutkan ID transaksi.

#daftar barang per transaksi
jumlahbarang=(itemset.groupby(['TransactionId','ItemDescription'])['NumberOfItemsPurchased'].sum().unstack().reset_index().fillna(0).set_index('TransactionId'))
jumlahbarang
Jumlah Barang yang Dibeli

Membuat Kode

def encode_units(x):
if x <= 0:
return 0
if x >= 1:
return 1
data_encode = jumlahbarang.applymap(encode_units)
data_encode

Membuat kode ini dilakukan untuk mengubah jumlah barang dalah setiap transaksi menjadi 0 jika tidak ada barang yang dibeli, dan menjadi 1 jika ada barang yang dibeli.

Kemudian kita gunakan apriori untuk melihat itemset yang sering muncul atau sering dibeli pelanggan.

data_filter = data_encode[(data_encode>0).sum(axis=1)>=2]
data_filter
#apriori
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import apriori, association_rules

frequent_itemsets_plus = apriori(data_filter, min_support=0.03, use_colnames=True)
frequent_itemsets_plus['length'] = frequent_itemsets_plus['itemsets'].apply(lambda x: len(x))

# Sorting berdasarkan support dan reset index
frequent_itemsets_plus = frequent_itemsets_plus.sort_values(by='support', ascending=False).reset_index(drop=True)

print(frequent_itemsets_plus)
 warnings.warn(
support itemsets length
0 0.122205 (WHITE HANGING HEART T-LIGHT HOLDER) 1
1 0.113317 (JUMBO BAG RED RETROSPOT) 1
2 0.107264 (REGENCY CAKESTAND 3 TIER) 1
3 0.091122 (PARTY BUNTING) 1
4 0.085233 (LUNCH BAG RED RETROSPOT) 1
.. ... ... ...
160 0.030320 (LUNCH BAG RED RETROSPOT, LUNCH BAG SUKI DESIGN ) 2
161 0.030210 (HAND WARMER BIRD DESIGN) 1
162 0.030210 (LUNCH BAG RED RETROSPOT, LUNCH BAG CARS BLUE) 2
163 0.030101 (CHILDRENS APRON SPACEBOY DESIGN) 1
164 0.030101 (PAPER CHAIN KIT VINTAGE CHRISTMAS, PAPER CHAI... 2

[165 rows x 3 columns]

Berdasarkan output diatas, dilihat tingkat dukungan (support) yang merupakan proporsi dari seluruh transaksi untuk setiap itemset yang ditemukan dalam data transaksi mengandung itemset tertentu. Sebagai contoh untuk support terbesar pada itemset ‘WHITE HANGING HEART T-LIGHT HOLDER’ sebesar 0.122205 atau 12.22%. Kemudian terdapat lenght yang menunjukkan panjang dari setiap itemset. Dalam output, itemset White Hanging Heart T-Light Holder memiliki lenght sebesar 1, ini artinya itemset tersebut hanya terdiri satu barang. Semakin tinggi nilai support menunjukkan item-item ini sering dibeli bersama-sama dalam transaksi.

Aturan Asosiasi

from mlxtend.frequent_patterns import association_rules
association_rules(frequent_itemsets_plus, metric='lift',
min_threshold=1).sort_values('lift', ascending=False).reset_index(drop=True)
Hasil Asosiasi

Syntax diatas digunakan untuk menghasilkan aturan asosiasi dari frekuensi itemsets dengan menggunakan metrik lift, dan kemudian mengurutkannya berdasarkan nilai lift secara menurun.

Dari output, dilihat bahwa nilai confidence tertinggi sebesar 0.831800 atau 83.18% dan nilai lift tertinggi sebesar 15.028131 atau 15.02%. Hal ini menunjukkan bahwa setiap pembelian Green Regency TeaCup and Saucer kemungkinan besar akan membeli juga Pink Regency TeaCup and Saucer. Sehingga penjual dapat menempatkan kedua produk tersebut bersama-sama didalam toko atau ilan dengan promosi cross-selling atau paket bundling.

Kesimpulan

Setelah melakukan Market Basket Analysis, analisis ini memberikan wawasan untuk menyusun pola strategi penjualan, penargetan pelanggan, memungkinkan bundling produk, dan promosi cross selling. Dalam dataset Transaction menunjukkan bahwa setiap pembelian Green Regency TeaCup and Saucer kemungkinan besar akan membeli juga Pink Regency TeaCup and Saucer. Hal ini dapat memudahkan penjual untuk mempromosikan kedua barang ini secara bersama didalam toko atau memasang iklan.

Sekian pembahasan dari saya, semoga bermanfaat!

Wassalamualaikum Warahmatullah Wabarakatuh.

--

--