Market Basket Analysis Using Python

Dea Ratu Nursidah
5 min readJan 14, 2021

--

Hallo Teman- teman Data Enthusiast!

Ada yang tau atau pernah denger tentang market basket analysis belum ?

jadi apa itu market basket analysis? Market basket analysis adalah suatu analisa atas perilaku konsumen secara spesifik dari suatu golongan / kelompok tertentu. Sumber data dari market basket analysis antara lain dapat bersumber dari transaksi kartu kredit, kartu lotere, kupon diskon, panggilan keluhan pelanggan

Market basket analysis umumnya dimanfaatkan sebagai titik awal pencarian pengetahuan dari suatu transaksi data ketika kita tidak mengetahui pola spesifik apa yang kita cari. Kebutuhan market basket analysis berawal dari keakuratan dan manfaat yang dihasilkannya dalam wujud aturan assosiasi (association rules). Yang dimaksud dengan association rules adalah pola-pola keterkaitan data dalam basis data.

Agar kita tahu lebih dalam mengenai market basket analysis ikutin terus ya !

Disini software yang akan digunakan yaitu python. Berikut merupakan library yang digunakan untuk melakukan coding :

  1. Pandas untuk melakukan operasi pada dataframe

2. mlxtend : Library untuk machine learning

3. matplotlib.pyplot : Untuk visualisasi

Hal yang pertama harus dilakukan yaitu buka python kemudian install library yang akan digunakan.

pip install numpy
pip install pandas
pip install mlxtend
pip install wordcloud

import semua package yang akan digunakan.

# for basic operations
import numpy as np
import pandas as pd
# for visualizations
import matplotlib.pyplot as plt
import squarify
import seaborn as sns
plt.style.use('fivethirtyeight')
# for market basket analysis
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

Donwload data pada link https://www.kaggle.com/mashlyn/online-retail-ii-uci . Selanjutnya, input data kedalam python menggunakan package pandas. Gunakan syntax berikut :

data = pd.read_csv("online_retail_II.csv")
data.head()

Maka akan didapatkan output sebagai berikut.

Lakukan visualiasasi data dengan menggunakan package wordcloud. Wordcloud merupakan visualisasi yang bersifat subjektif. Berikut adalah syntax yang digunakan.Gunakan syntax berikut :

from wordcloud import WordCloud
plt.rcParams['figure.figsize'] = (15, 15)
wordcloud = WordCloud(background_color = 'white', width = 1200, height = 1200, max_words = 121).generate(str(data['Description']))
plt.imshow(wordcloud)
plt.axis('off')
plt.title('Most Popular Items',fontsize = 20)
plt.show()

Maka akan didapatkan output sebagai berikut.

Berdasarkan output diatas dapat dilihat bahwa kata yang paling besar adalah Cherry, Lights, Dolly, Childern, dan Girl yang artinya kata-kata tersebut merupakan barang yang paling sering dibeli. Selanjutnya akan dilihat visualisasi bar chart dengan menggunakan syntax sebagai berikut :

#looking at the frequency of most popular items
plt.rcParams['figure.figsize'] = (18, 7)
color = plt.cm.copper(np.linspace(0, 1, 40))
data['Description'].value_counts().head(40).plot.bar(color = color)
plt.title('frequency of most popular items', fontsize = 20)
plt.xticks(rotation = 90 )
plt.grid()
plt.show()

Maka akan didapatkan output sebagai berikut.

Berdasarkan output diatas dapat dilihat bahwa produk yang paling banyak terbeli mengandung kata White, Hanging, Heart, T-Light, dan Holder. Kedua terbanyak yang terbeli yaitu mengandung kata Regency, Cakestand, dan 3 Tier.

Kemudian akan ditampilan visualisasi Tree Map dari jenis item barang yang dibeli dengan menggunakan syntax sebagai berikut :

y = data['Description'].value_counts().head(50).to_frame()
y.index
# plotting a tree map
plt.rcParams['figure.figsize'] = (20, 20)
color = plt.cm.cool(np.linspace(0, 1, 50))
squarify.plot(sizes = y.values, label = y.index, alpha=.8, color = color)
plt.title('Tree Map for Popular Items')
plt.axis('off')
plt.show()

Maka akan didapatkan output sebagai berikut.

Langkah selanjutnya yaitu akan dilakukan proses MBA dimana akan dilakukan cleaning data terlebih dahulu untuk menghapus variabel yang kosong dan merapikan data dengan menggunakan syntax sebagai berikut :

data['Description'] = data['Description'].str.strip()
data.dropna(axis=0, subset=['Invoice'], inplace=True)

data['Invoice'] = data['Invoice'].astype('str')
data = data[~data['Invoice'].str.contains('C')]

Buat keranjang baru berdasarkan nomer invoice yang berlokasi di negara France. Gunakan syntax berikut :

basket = (data[data['Country'] =="France"] .groupby(['Invoice', 'Description'])['Quantity'] .sum().unstack().reset_index().fillna(0)
.set_index('Invoice'))
basket.head()

Maka akan didapatkan output sebagai berikut.

Berdasarkan output diatas dapat dilihat bahwa jumlah barang masih 0, maka akan diganti sesuai jumlah barang pada masing-masing nomor invoice dengan menggunakan syntax sebagai berikut :

def encode_units(x):
if x <= 0:
return 0
if x >= 1:
return 1
basket_sets = basket.applymap(encode_units)

#menghapus kolom postage
basket_sets.drop('POSTAGE', inplace=True, axis=1)
basket_sets.head()

Maka akan didapatkan output sebagai berikut.

Setelah dilakukan encoding, syntax tersebut bermakna jika barang kurang dari sama dengan 0 maka keranjang tersebut akan bernilai 0. Jika lebih dari 1 maka nilai tersebut akan tetap 1. Berdasarkan output diatas dapat dilihat bahwa barang yg terbeli tidak ada yang melebihi 1.

Selanjutnya akan dibuat variabel yang terdiri dari dari barang-barang yang sering dibeli dengan nilai minimum support 5%,menggunakan syntax sebagai berikut.

# Build up the frequent items 
frequent_itemsets = apriori(basket_sets, min_support=0.05, use_colnames=True)
frequent_itemsets.head()

Maka akan didapatkan output sebagai berikut.

Selanjutnya, akan dibangun sebuah variabel yang memiliki aturan di tiap-tiap item. maka akan digunakan association rules dengan nilai minimum lift ratio sebesar 1 dengan menggunakan syntax sebagai berikut :

# Create the rules
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
rules

Maka akan didapatkan output sebagai berikut.

Berdasarkan output diatas dapat dilihat bahwa Alarm Clock Bakelike Pink biasanya terbeli bersamaan dengan Alarm Clock Bakelike Green dengan nilai support sebesar 0.053055.

Selanjutnya, akan dilakukan filtering dengan nilai lift ratio minimal 11 dan tingkat confidence minimal 0.8. Gunakan syntax berikut :

rules[ (rules['lift'] >= 11) &
(rules['confidence'] >= 0.8) ]

Maka akan didapatkan output sebagai berikut.

Berdasarkan output diatas dapat dilihat bahwa biasanya Alarm Clock Bakelike Red biasanya terbeli bersamaan dengan Alarm Clock Bakelike Green dengan nilai support sebesar 0.056270, nilai confidence sebesar 0.33333 dan nilai lift ratio sebesar 12.341270.

--

--