Market Basket Analisys (lagi hehe) dengan Menggunakan Python

Gifa Delyani Nursyafitri
5 min readJul 9, 2019

--

Source: https://datamathstat.wordpress.com/2018/02/27/market-basket-analysis-association-rules/

What’s up guys!

Di artikel sebelumnya (Market Basket Analisys (MBA) dengan Menggunakan Datasets Groceries di R), kita telah membahas tentang MBA namun menggunakan Dataset di R yaitu Groceries. Nah sekarang kita akan membahas bagaimana MBA dengan menggunakan data Phyton.

Sekarang kita akan mencoba dengan data apa?

Untuk data yang digunakan, kalian bisa mendownload Data nya di sini. Data ini merupakan Analisis Market Basket tentang perilaku pembelian Pelanggan.

Pre-Coding

Ada beberapa library python yang di gunakan untuk coding ini

  • Pandas : Untuk melakukan operasi pada dataframe
  • mlxtend : Library untuk machine learning
  • matplotlib.pyplot : Untuk visualisasi

Silahkan melakukan installasi dengan pip install ...

# 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 defining path
import os
print(os.listdir('E:/file kuliah/smt 6/Data Mining/MBA'))

# for market basket analysis
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

Selanjutnya meng-input data. Data harus disimpan satu folder dengan lokasi script yang sedang kita jalankan.

# reading the dataset

data = pd.read_csv('../input/Market_Basket_Optimisation.csv', header = None)

Setelah berhasil ter-input, maka kita dapat melihat ukuran dari data.

# let's check the shape of the dataset
data.shape

Kemudian melihat beberapa data yang teratas.

# checking the head of the data

data.head()

Kemudian kita dapat melihat visualisasi data.

Visualisasi pertama, dapat menggunakan Wordcloud.

import matplotlib.pyplot as plt
import seaborn as sns

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[0]))
plt.imshow(wordcloud)
plt.axis('off')
plt.title('Most Popular Items',fontsize = 20)
plt.show()

Dapat dilihat dari hasil Word Cloud, kata “Turkey” adalah kata yang paling besar. Hal ini menunjukkan bahwa item yang bernama Turkey paling banyak dibeli.

Namun karena Word Cloud merupakan visualisasi, maka hal ini bersifat subjektif. Karena kita tidak dapat mengukur secara pasti ukuran dari masing-masing kata, jadi kita tidak dapat memastikan kata mana yang menjadi kata yang paling besar.

Selanjutnya kita dapat melihat bar chart dari data yang digunakan.

# looking at the frequency of most popular items 

plt.rcParams['figure.figsize'] = (18, 7)
color = plt.cm.copper(np.linspace(0, 1, 40))
data[0].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()

Dari output ini, kita dapat melihat yang paling banyak terbeli bukanlah Turkey, namun Mineral Water yang kemudian diikuti oleh Burgers. Turkey berada di urutan ketiga.

Selanjutnya, kita juga dapat melakukan visualisasi dengan menggunakan Tree Map.

y = data[0].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()

Berdasarkan output, kita dapat melihat bahwa area yang terdapat di pojok kiri bawah merupakan area yang terbesar, yaitu Mineral Water. Semakin menuju pojok kanan atas, maka area map akan semakin kecil.

Selanjutnya melakukan pre-processing data.

# making each customers shopping items an identical list
trans = []
for i in range(0, 7501):
trans.append([str(data.values[i,j]) for j in range(0, 20)])

# conveting it into an numpy array
trans = np.array(trans)

# checking the shape of the array
print(trans.shape)

Dapat dilihat bahwa dimensi dari data masih sama dengan sebelumnya.

Kemudian mulai menggunakan Transaction Encoder.

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder

te = TransactionEncoder()
data = te.fit_transform(trans)
data = pd.DataFrame(data, columns = te.columns_)
# getting the shape of the data
data.shape

Didapatkan dimensi dari hasil Transaction Encoder adalah 7501 x 121.

Karena kolom terlalu banyak, maka akan direduksi hingga menjadi 40.

import warnings
warnings.filterwarnings('ignore')

# getting correlations for 121 items would be messy
# so let's reduce the items from 121 to 40

data = data.loc[:, ['mineral water', 'burgers', 'turkey', 'chocolate', 'frozen vegetables', 'spaghetti',
'shrimp', 'grated cheese', 'eggs', 'cookies', 'french fries', 'herb & pepper', 'ground beef',
'tomatoes', 'milk', 'escalope', 'fresh tuna', 'red wine', 'ham', 'cake', 'green tea',
'whole wheat pasta', 'pancakes', 'soup', 'muffins', 'energy bar', 'olive oil', 'champagne',
'avocado', 'pepper', 'butter', 'parmesan cheese', 'whole wheat rice', 'low fat yogurt',
'chicken', 'vegetables mix', 'pickles', 'meatballs', 'frozen smoothie', 'yogurt cake']]
# getting the shape of the data
data.shape

Dapat dilihat bahwa dimensi data telah menjadi 7501 x 40. Kemudian kita akan mengecek, kolom apa saja yang terdapat dalam data kita setelah direduksi.

# let's check the columns

data.columns

Langkah selanjutnya, mulai menerapkan Algoritma Apriori.

from mlxtend.frequent_patterns import apriori

#Now, let us return the items and itemsets with at least 5% support:
apriori(data, min_support = 0.01, use_colnames = True)

Output di atas merupakan tampilan dari beberapa data hasil dari analisis dengan algoritma apriori. Karena data yang dihasilkan terlalu banyak, maka akan dispesifik lagi. Misalkan kita akan melihat rules yang length nya = 2, dan support nya lebih dari 0.01

frequent_itemsets = apriori(data, min_support = 0.05, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x))
# getting th item sets with length = 2 and support more than 1%

frequent_itemsets[ (frequent_itemsets['length'] == 2) &
(frequent_itemsets['support'] >= 0.01) ]

Dari output di atas, kita dapat melihat bahwa rules yang memiliki length = 2 dan nilai support lebih dari 0.01 hanya terdapat 3 rules.

Rules yang paling di sarankan adalah rules ke 25. Jika seseorang membeli spaghetti maka ia juga akan membeli mineral water dengan nilai support sebesar 0.059.

Oke teman teman sekian dulu ya. Semoga artikel ini bisa membantu teman teman. Jangan lupa mencoba dengan menggunakan data lain. Kritik dan saran yang membangun sangat ditunggu.

See yaa !

Sumber :

  1. http://pbpython.com/market-basket-analysis.html
  2. https://medium.com/@hafizhan.aliady/market-basket-analysis-acossiation-rule-menggunakan-python-1012f9e1611d
  3. https://rpubs.com/fajriyahakim/288870

--

--

Gifa Delyani Nursyafitri

Ku abadikan disini, karena aku paham betul bahwa ingatan manusia terbatas.