β Members of Datalicious β
- Nur Imam Masri
- Astuti Rahmawati
- Prasidya Bagaskara
- Moh. Harwin Prayoga
- Riskiyatul Hasanah
- M Rayhan Azzindani
- Siti Hajjah Mardiah
- Christine
- M. Ifzal Asril
- Tools
- Programming Language
- Libraries
- Dataset
Open in Colab
- Business Understanding
- Data Preparation
- Data Understanding
- Data Cleansing/Preprocessing
Lotto Mart adalah sebuah supermarket yang bergerak dibidang retail, menjual berbagai jenis produk seperti Fish, Meat, Fruits, Sweet Products, Wines, dan Gold Products. Selama 6 bulan terakhir, Marketing Team melakukan campaign berupa pemberian discount vouchers kepada semua customer melalui Broadcast Message. Namun, setelah campaign dilakukan, justru Lotto Mart menghadapi beberapa permasalahan sebagai berikut :
- Response rate dari marketing campaign yang dilakukan rendah yaitu sekitar 14.91%
- Inefficient Cost dalam melakukan marketing campaign
- Profit tidak sebanding dengan cost yang dikeluarkan
Berdasarkan hal tersebut, Marketing Team meminta tim data untuk menganalisis permasalahan yang terjadi. Selanjutnya perusahaan ingin membuat marketing campaign yang tepat sasaran sesuai dengan karakteristik customer. Strategi ini diharapkan mampu meningkatkan response rate, meminimalisasi cost, dan kemudian meningkatkan profit
Sebagai tim data di Supermarket Lotto Mart, untuk menganalisis keberhasilan marketing campaign selanjutnya. Berikut adalah beberapa roles beserta PIC yang berkontribusi dalam menyelesaikan permasalahan di Lotto Mart:
-
Lead Data Science
Sebagai koordinator project
PIC:
Nur Imam Masri
-
Machine Learning Engineer
Membuat model dan evaluasi Machine Learning
PIC:
Prasidya Bagaskara
danMoh. Harwin Prayoga
-
Data Engineer
Melakukan Data Preparation, Cleaning, dan
Exploratory Data Analysis (EDA)PIC:
M Rayhan Azzindani
danM. Ifzal Asril
-
Business Analyst
Membuat insight business
PIC:
Riskiyatul Hasanah
danChristine
-
Data Analyst
Membuat dashboard
PIC:
Siti Hajjah Mardiah
danAstuti Rahmawati
Perusahaan ingin meningkatkan response rate dan meminimalisasi marketing campaign cost sehingga dapat memaksimalkan profit.
Membuat classification model untuk memprediksi kelompok customer yang akan merespon campaign agar dapat meminimalisasi biaya pemasaran dan memaksimalkan keuntungan pada campaign marketing berikutnya.
-
Response Rate/RR
Persentase total customer response terhadap total delivered campaign
Indicator RR : 30% is good ( Efti 2018).
-
Net Profit Margin /NPM
Mengukur net profit dibanding penjualannya. Semakin besar NPM, maka kinerja marketing campaign semakin efektif dan efisien (Handayani, Winarningsih 2020).
Indicator NPM : 5% is low, 10-19% is average, 20% is good (Jayathilaka 2020).
-
Return of Investment /ROI
CLV (customer lifetime value)) dibagi CAC((customer acquisition cost). Sebagai indikator kinerja perusahaan dan pembuatan keputusan para investor.
Indicator ROI : 3:1 to 5:1 is good (Manzer 2017).
-
π References :
-
Efti S. 2018. Sales Benchmarks: The 30/50 rule for cold emailing & cold calling. diakses 20 Mei 2023. https://blog.close.com/sales-benchmarks/
-
Handayani N, Winarningsih S. 2020. The Effect of Net Profit Margin and Return on Equity Toward Profit Growth. Moneter-Jurnal Akuntansi Dan Keuangan 7(2): 198-204. https://doi.org/10.31294/moneter.v7i2.8701.
-
Jayathilaka AK. 2020. Operating Profit and Net Profit: Measurements of Profitability. Open Access Library Journal 7(12): 1-11. https://doi.org/10.4236/oalib.1107011.
-
Manzer D. 2017. Five insights into measuring marketing ROI. diakses 20 Mei 2023. https://growswyft.com/five-insights-to-measure-your-roi/.
Marketing Campaign (link datasets)
Boost the profit of a marketing campaign
A response model can provide a significant boost to the efficiency of a marketing campaign by increasing responses or reducing expenses.
The objective is to predict who will respond to an offer for a product or service
Dataset Description:
The training dataset contains 2240 samples
. Contains 28 features
and 1 target boolean
variable "Response"
:
Accepted/Responses Campaign
AcceptedCmp1
- 1 if customer accepted the offer in the 1st campaign, 0 otherwiseAcceptedCmp2
- 1 if customer accepted the offer in the 2nd campaign, 0 otherwiseAcceptedCmp3
- 1 if customer accepted the offer in the 3rd campaign, 0 otherwiseAcceptedCmp4
- 1 if customer accepted the offer in the 4th campaign, 0 otherwiseAcceptedCmp5
- 1 if customer accepted the offer in the 5th campaign, 0 otherwiseResponse (target)
- 1 if customer accepted the offer in the last campaign, 0 otherwiseComplain
- 1 if customer complained in the previous 2 years
Customer Information
ID
- Customer's idYear_Birth
- Customer's year of birthEducation
- customerβs level of educationMarital
- customerβs marital statusKidhome
- number of small children in customerβs householdTeenhome
- number of teenagers in customerβs householdIncome
- customerβs yearly household incomeDtCustomer
- date of customerβs enrolment with the companyRecency
- number of days since the last purchase
Sales Product Type
MntFishProducts
- amount spent on fish products in the last 2 yearsMntMeatProducts
- amount spent on meat products in the last 2 yearsMntFruits
- amount spent on fruits products in the last 2 yearsMntSweetProducts
- amount spent on sweet products in the last 2 yearsMntWines
- amount spent on wine products in the last 2 yearsMntGoldProds
- amount spent on gold products in the last 2 years
Number of Purchases per Type
NumDealsPurchases
- number of purchases made with discountNumCatalogPurchases
- number of purchases made using catalogueNumStorePurchases
- number of purchases made directly in storesNumWebPurchases
- number of purchases made through companyβs web siteNumWebVisitsMonth
- number of visits to companyβs web site in the last month
Cost and Revenue
Z_CostContact = 3
(Cost to contact a customer)Z_Revenue = 11
(Revenue after client accepting campaign)
- Dataset memiliki
29 columns
dan2240 rows
data - Terdapat 3 jenis tipe data yaitu :
int64, object, float64
- Kolom
Income
memiliki 2216 nilai non-null, dan24 nilai null / missing values
Hal yang harus dilakukan saat Data Pre-Processing adalah:
- Karena data yang dimiliki tidak terlalu banyak, sehingga untuk
Missing Values
padaIncome
akan dilakukanImputation
pada tahap Data Preprocessingnya :- Imputation (Median), karena Highly Positively Skewed
- Multivariate Approach (MICE Imputation, KNN Imputer, dll)
Data yang kita miliki tidak memiliki duplikat
- Kolom
Income
memiliki24 nilai null / missing values
, persentase sebesar 1.07% dari jumlah data
Hal yang harus dilakukan saat Data Pre-Processing adalah:
- Karena data yang dimiliki tidak terlalu banyak, sehingga untuk
Missing Values
padaIncome
akan dilakukanImputation
pada tahap Data Preprocessingnya :- Imputation (Median), karena Highly Positively Skewed
- Multivariate Approach (MICE Imputation, KNN Imputer, dll)
List of Column Types:
-
Date
Dt_Customer
-
Categorical (10 Columns) :
ID
- NominalEducation
- Ordinal (Levels : Basic - Graduation - 2n Cycle - Master - PhD)Marital_Status
- NominalAcceptedCmp1, AcceptedCmp2, AcceptedCmp3, AcceptedCmp4, AcceptedCmp5, Complain, Response
- Nominal (Binary 0 & 1)
-
Continuous (18 Columns):
Year_Birth, Income, Kidhome, Teenhome, Recency, MntWines, MntFruits, MntMeatProducts, MntFishProducts, MntSweetProducts, MntGoldProds, NumDealsPurchases, NumWebPurchases, NumCatalogPurchases, NumStorePurchases, NumWebVisitsMonth, Z_CostContact, Z_Revenue
Change the Some column data type
- Kita mengubah tipe data categorical ke
category
, agar dalam melakukan explorasi dan insight tidak di anggap sebagai data numerical - Untuk memudahkan dalam proses extraction
Dt_Customer
maupun part of, maka kolom dateobject
diubah menjadidatetime64
-
Dt_customer
- Sebelumnya masih berbentuk
string/object
, untuk tipe datanya kurang sesuai sehingga di ubah menjadiDatetime
Dt_Customer
tetap dipertahankan untuk Business Insight, namun kemungkinan dihapus karena tanggal customer mulai bergabung tidak mempengaruhi model prediksi
- Sebelumnya masih berbentuk
-
Year_Birth:
- Tahun kelahiran tertua (min) yaitu
1893
, hal ini yang kemungkinan adanyasalah input data
sehingga data harus diproses lebih lanjut padaOutlier
- Kemungkinan akan dilakukan
Feature extraction
untuk mengambildata Umur/Age
pada range tahun saat ini 2014 (sesuai pada data)
- Tahun kelahiran tertua (min) yaitu
-
Household Income:
Mean
nya adalah52247.25
danMedian
nya adalah51381.5
dari data tersebut dapat disimpulkan bahwa rata-rata lebih besar dari pada median maka menggambarkan sedikitRight-skewed Distribution
- Selanjutnya mempunyai
Range 1730.0 (minimal) ke 666666.0 (maximal) yang sangat jauh
, menandakan adanyaoutliers
sehingga perlu dilakukanLog Transformation/Normalisasi atau Segmentasi
pada data income sebelum melanjutkan ke tahap pemodelan
-
Recency, Kidhome, Teenhome
- Rata Rata (mean) dan median memiliki
kesamaan
yang artinyakemungkinan
memiliki distribusi normal-skewed distribution / bimodial(akan dicek pada univariate analysis)
- Untuk
Kidhome
danTeenhome
berpotensi untuk membuat feature baru 'Dependents' untuk lebih menggambarkan berapa jumlah anggota keluarga yg dependent
- Rata Rata (mean) dan median memiliki
-
Mount of Type Products :
Pada beberapa kolom terdapat summary nilai yang memiliki nilai
Mean dan Median
memiliki rentang nilai terlalu jauh seperti pada kolom:MntWines
, mean = 303.9, median = 173.5MntFruits
, mean = 26.3, median = 8MntMeatProducts
, mean = 166.9, median = 67MntFishProducts
, mean = 37.5, median = 12MntSweetProducts
, mean = 27.06, median = 8MntGoldProds
, mean = 44.02, median = 24
Jika dilihat dari beberapa nilai
mean dan median
yang memiliki jarak agak aneh, kemungkinan memiliki jumlahoutlier yang tinggi
dan distribusi yangskewed
, maka untuk Data Preprocessing perlu dilakukanLog Transformation
, digunakan untuk mengubah data skewed mendekati / sesuai dengan normalitas. -
Moderately Positively Skewed (Sedikit skew ke kanan) pada kolom :
NumDealsPurchases, NumWebPurchases, NumCatalogPurchases, NumStorePurchases, NumWebVisitsMonth
Jika dilihat pada data ini nilai
mean dan median
yang memiliki jarak yang tidak lumayan jauh, namun kemungkinan memiliki distribusi yangskewed
ke kanan, maka perlu di visualisasi lebih lanjut, kemudian untuk Data Preprocessing perlu dilakukanLog Transformation
, digunakan untuk mengubah data skewed mendekati / sesuai dengan normalitas. -
Z_CostContact, Z_Revenue
Dapat diketahui bahwa nilai
cost (3)
danrevenue (11)
ini hanya memiliki satu nilai, sehingga akan diDrop pada step modelling nantinya
karena tidak memberikan informasi yang signifikan terhadap model prediksi
- Terlalu banyak kategori pada kolom
ID
,Year_Birth
- Pada data
ID
semuanya hanya muncul sekali, sehingga dapat dikatakan tidak ada duplicate ID pada data - Customer banyak yang lahir (
Year Birth
) pada tahun1976 (age = 38 years)
sebanyak 89 orang - Kategori
Education
, "2n Cycle" dan "Master" memliki arti yang sama. - Kategori
Education
: customer mayoritas memiliki kategori pendidikanGraduation
sebanyak 1127 orang, namun nilainya sangat besar di banding yang lain - Dalam kategori
Marital Status
,: customer mayoritas sudah menikan (Married) 864 orang - Dalam kategori
Marital Status
, "Single" dan "Alone" memiliki arti yang sama. - Dalam kategori
Marital Status
, "Together" dan "Married" memiliki arti yang sama. - Dalam kategori
Marital Status
, ada beberapa data yang tidak jelas apa yang dimaksud yaitu "Absurd" dan "YOLO", maka disarankan digabung dan diganti "Others". - Pada kategori
AcceptedCmp(1-5)
, customer mayoritas tidak merespon / accept dari campaign yang dilakukan - Pada kategori
Complain
, customer mayoritas tidak pernh complain dari campaign yang dilakukan - Target yang kita miliki ada pada kolom
Respon
, yang mana memiliki ketimpangan yang sangat tinggu (Imbalanced Data),- Tidak merespon = 1906
- Merespon = 334
Hal yang harus dilakukan saat Data Pre-Processing adalah:
- Akan dilakukan
replace data / menyatukan yang memiliki arti yang sama
agar mengurangi jumlah dimensi maupunredudansi pada data
- Pada kolom
Response
, Sebaran kategori yang timpang pada target. Pada target, menyebabkan proses Machine Learning gagal. Oleh karena itu, perlu dilakukanSampling Data (Undersampling/Oversampling/Combinded/SMOTE/dll)
- Akan dilakukan
Feature Encoding
pada kolomEducation
danMarital_Status
untuk proses modelling, karena masih belum memiliki representasi nilai numerical
Observations:
Terdapat outlier pada kolom Year_Birth, Income, MntWines, MntFruits, MntMeatProducts, MntFishProducts, MntSweetProducts, MntGoldProds, NumDealsPurchases, NumWebPurchases, NumCatalogPurchases, dan NumWebVisitMonth.
- Pada kolom
Year_Birth
, outlier terjauh adalah di bawah 1900 - Pada kolom
Income
, outlier terjauh adalah di atas $600,000. - Pada kolom
MntWines
, outlier berada pada angka 1200 keatas. - Pada kolom
MntFruits
, outlier berada di sekitar angka 80 sampai 200. - Pada kolom
MntMeatProducts
, outlier terjauh ada di sekitar angka 1,750. - Pada kolom
MntFishProducts
, outlier berada di sekitar angka 125 sampai diatas 250. - Pada kolom
MntSweetProducts
, outlier terjauh berada di sekitar angka 250. - Pada kolom
MntGoldProds
, outlier terjauh berada di sekitar angka 350. - Pada kolom
NumDealsPurchases
, outlier terjauh berada di angka 15. - Pada kolom
NumWebPurchases
, outlier berada di sekitar angka 25. - Pada kolom
NumCatalogPurchases
, outlier terjauh berada di atas angka 25. - Pada kolom
NumWebVisitsMonth
, outlier terjauh berada di angka 20.
Hal yang harus dilakukan saat Data Pre-Processing adalah:
- Mengaplikasikan
Log Transformation
untukFeature Scaling
danHandling Outlier
yang mana transformasi ini de-emphasizes / minimizeoutliers
dan dapat membantu untuk potentially obtain abell-shaped / normal distribution
. Hal ini juga dikarenakan jumlah data yang terbatas hanya sebanyak 2240 baris data saja, menjadi pilihan terbaik karena tanpa menghapus baris data. - Alternatif lainnya, Membersihkan data dengan cara menghapus
outliers
berdasarkanIQR atau Z-score
namun akan mengurangi data yang dimiliki
Berdasarkan chart Boxplot, Distribusi, dan Violin diatas, dapat diketahui bahwa ada beberapa variabel yang memiliki outlier didalamnya dan beberapa memiliki Skewed Distribution. Berikut adalah beberapa variabel tersebut:
-
Normal distribution
Recency
Normal Distribution (Symmetric)Year_Birth
Moderately Normal Distribution (Symmetric)NumWebVisitsMonth
Moderately Normal Distribution (Symmetric)
-
Uniform distribution
Z_CostContact
Uniform Distribution - Memiliki satu nilai sajaZ_Revenue
Uniform Distribution - Memiliki satu nilai saja
-
Positive skewed distribution
- Income
Income
- Amount of Wines Products
MntWines
- Amount of Fruits Products
MntFruits
- Amount of Meats Products
MntMeatProducts
- Amount of Fish Products
MntMeatProducts
- Amount of Sweet Products
MntSweetProducts
- Amount of Golds Products
MntGoldProds
- Number Deals Purchases
NumDealsPurchases
- Number Web Purchases
NumWebPurchases
- Number Catalog Purchases
NumCatalogPurchases
- Number Store Purchases
NumStorePurchases
- Income
-
Bimodal distribution
- Number of small children in customer's household
Kidhome
- Number of teenagers in customer's household
Teenhome
- Number of small children in customer's household
Rekomendasi pada data pre-processing:
Data yang mengalami Positive Skewed Distribution
dilakukan Log Transformation
sehingga data bisa menjadi normal distribution
Observations:
- Terlalu banyak kategori pada kolom
ID
,Year_Birth
- Kolom
Education
danMarital_Status
memiliki beberapa kategori yang valuenya sama dan ambigu.- Kategori
Education
, "2n Cycle" dan "Master" memliki arti yang sama. - Kategori
Education
: customer mayoritas memiliki kategori pendidikanGraduation
sebanyak 1127 orang, namun nilainya sangat besar di banding yang lain - Dalam kategori
Marital Status
, customer mayoritas sudah menikah (Married) 864 orang - Dalam kategori
Marital Status
, "Single" dan "Alone" memiliki arti yang sama. - Dalam kategori
Marital Status
, "Together" dan "Married" memiliki arti yang sama. - Dalam kategori
Marital Status
, ada beberapa data yang tidak jelas apa yang dimaksud yaitu "Absurd" dan "YOLO", maka disarankan digabung dan diganti "Others".
- Kategori
- Kolom
Kidhome
danTeenhome
mayoritas customer tidak memiliki anak dan remaja (value 0) - Kolom
AcceptedCmp1, AcceptedCmp2, AcceptedCmp3 ,AcceptedCmp4, AcceptedCmp5, Complain, dan Response
value didominasi dengan value 0 (Tidak Response / Complain) - Target yang kita miliki ada pada kolom
Respon
, yang mana memiliki ketimpangan yang sangat tinggu (Imbalanced Data),- Tidak merespon = 1906
- Merespon = 334
Hal yang harus dilakukan saat Data Pre-Processing adalah:
- Kolom
ID
di drop untuk proses modelling - Dari kolom
Year_Birth
dibuat kolom baru yaitu kolomAge
yang menunjukkan umur seorang customer. - Akan dilakukan
replace data / menyatukan yang memiliki arti yang sama
agar mengurangi jumlah dimensi maupunredudansi pada data
- Kategori
Education
, "2n Cycle" dan "Master" memliki arti yang sama. - Dalam kategori
Marital Status
, Customer mayoritas sudah menikan (Married) 864 orang - Dalam kategori
Marital Status
, "Single" dan "Alone" memiliki arti yang sama. - Dalam kategori
Marital Status
, "Together" dan "Married" memiliki arti yang sama. - Dalam kategori
Marital Status
, ada beberapa data yang tidak jelas apa yang dimaksud yaitu "Absurd" dan "YOLO", maka disarankan digabung dan diganti "Others".
- Kategori
- Melakukan
Label Encoding
pada kolomEducation
. - Melakukan
One Hot Encoding (OHE)
pada kolomMarital_Status
. - Pada kolom
Response
, Sebaran kategori yang timpang pada feature mengindikasikan ketidakgunaan feature. Pada target, menyebabkan proses Machine Learning gagal. Oleh karena itu, perlu dilakukanSampling Data (Undersampling/Oversampling/Combinded/SMOTE/dll)
-
Korelasi ke Target (Response)
-
Top 10 Yang berkolerasi tinggi ke target
sebagai berikut, Kemungkinan besar top ini bisa menjadi feature yang paling relevan dan harus dipertahankan:AcceptedCmp5
- 0.32 - PositifAcceptedCmp1
- 0.29 - PositifAcceptedCmp3
- 0.25 - PositifMntWines
- 0.24 - PositifMntMeatProducts
- 0.23 - PositifNumCatalogPurchases
- 0.22 - PositifRecency
- 0.19 - NegatifAcceptedCmp4
- 0.17 - PositifAcceptedCmp2
- 0.16 - PositifTeenhome
- 0.15 - Negatif
-
Korelasi Kolom Response dengan kolom lainnya cenderung rendah. Dari seluruh korelasi antara feature-target berada di
range 0.00 sampai 0.33
. Oleh karena itu, kami memutuskan untuk membuat nilaithreshold di angka 0.15
. Feature-feature di atas yang kemungkinan kami pertahankan adalah feature yang memiliki nilai korelasi>0.15
. -
Korelasi kolom Response dengan kolom AcceptedCmp5 adalah yang paling tinggi dibandingkan kolom campaign sebelumnya.
-
Produk yang ditawarkan di campaign terakhir (kolom Response) agak mirip dengan campaign ke 5 (AcceptedCmp5)
-
Customer cenderung lebih tertarik dengan Wines dan Meat yang ditunjukan dengan korelasi kolom Response dengan kolom MntWines dan MntMeatProducts
-
Customer juga lebih menyukai pembelian dengan cara Katalog (kolom NumCatalogPurchases) dibandingkan yang lain.
-
-
Complain, Z_CostContact dan Z_Revenue berpotensi untuk dihapus, karena tidak memiliki korelasi dibanding kolom lainnya
-
Korelasi Antar Feature
- MntMeatProduct berkorelasi positif cukup besar dengan NumCatalogPurchases, bisa dikatakan sebagian besar pembelian meat product dilakukan melalui catalog (korelasinya 0.72) sehingga kemungkinan ada redudansi pada data, sehingga yang di drop adalah NumCatalogPurchases karena lebih rendah korelasi ke target (response)
Selain itu, Pada korelasi antar-feature, terdapat pola yang menarik sebagai berikut :
- Year Birth
- Year_Birth berkolerasi positif dengan Kidhome, bisa dikatakan semakin muda maka semakin banyak pula anak kecilnya sedangkan untuk kolom Teenhome berkolerasi negatif atau semakin tua customer maka jumlah anak remaja semakin banyak
- Kidhome & Teenhome
- Customer yang (Kidhome) memiliki anak kecil Income nya cenderung rendah
- Customer yang (Kidhome) memiliki anak kecil cenderung lebih sering mengunjungi web dan melakukan pembelian ketika sedang diskon
- Customer yang (Teenhome) memiliki anak remaja cenderung lebih banyak melakukan pembelian ketika sedang diskon
- Income
- Customer yang memiliki Income yang tinggi cenderung banyak melakukan pembelian
- Kolom Income berkorelasi positif cukup besar dengan MnWines, MntFruits, MntMeatProduct, MntFishProduct, MntSweetProduct dan MntGoldProduct
- Kolom Income berkorelasi positif cukup besar dengan NumWebPurchases, NumCatalogPurchases, dan NumStorePurchases sedangkan dengan kolom NumWebVisitsPurchases berkorelasi negative cukup besar, bisa dikatakan bahwa semakin besar income customer maka mayoritas tempat yang dipilih untuk melakukan pembelian adalah Web, Catalog dan Store, sedangankan customer yang memiliki income rendah cenderung lebih banyak melakukan pembelian melauli web atau lebih sering mengunjungi web
- Product
- Kolom MntWines berkorelasi positif cukup besar dengan MntMeatProduct, kemungkinan customer membeli wine juga membeli meat
- Kolom MntFruits berkorelasi positif cukup besar dengan MntMeatProduct, MntFishProduct dan MntSweetProduct, kemungkinan ketika customer membeli product tersebut bersamaan
- MntMeatProduct berkorelasi positif cukup besar dengan NumCatalogPurchases, bisa dikatakan sebagian besar pembelian meat product dilakukan melalui catalog
- MntWines paling banyak dibeli melalui katalog dari pada metode pembelian lainya
- Purchases
- Kolom NumDealsPurchases berkorelasi positif dengan NumWebVisitMonth, ketika sedang diskon customer yang mengunjungi web meningkat
- Kolom NumWebVisitMonth berkorelasi negatif cukup besar dengan NumCatalogPurchases dan NumStorePurchases, ketika customer lebih sering mengunjungi web maka pembelian melalui catalog dan store menurun
- Additional
- Customer yang membeli Wines (MntWines) cenderung akan membeli Meat (MntMeatProducts) dan lebih suka membeli langsung di Store, Catalog dan Website.
- Beberapa kombinasi Fruits yang sangat disukai customer antara lain Fruits dan Meat, Fruits dan Fish, atau Fruits dan Sweet. Customer juga lebih nyaman membeli langsung di Store atau melalui Catalog dibandingkan dengan menggunakan Website.
- Kombinasi 5 Kolom product cukup tinggi nilai korelasinya. Oleh karena itu, customer cenderung suka membeli lebih dari 1 product dalam sekali berbelanja.
- Produk Wines dan Gold lebih banyak dibeli menggunakan ebsite. Sedangkan Fruits, Meat, Fish dan Sweet dibeli melalui Store maupun Catalog.
- Produk yang ditawarkan menggunakan Deals (potongan harga) belum terlalu menarik minta customer karena korelasi dengan kolom produk apapun sangat rendah.
- Customer yang menggunakan Deals lebih banyak customer yang menggunakan Website untuk membeli barang/produk.
Berdasarkan analisa awal antar fitur yang kami lakukan terhadap fitur yang memiliki korelasi lebih tinggi dengan target, didapatkan hasil sebagai berikut:
-
Recency
: Nilai korelasi Recency dengan feature lainnya memiliki range 0.00 sampai 0.05 -
MntWines
: Feature yang berkorelasi dengan MntWines:Income = 0.58, NumCatalogPurchases = 0.64, NumStorePurchases = 0.64
-
MntMeatProducts
: Feature yang berkorelasi dengan MntMeatProducts:NumCatalogPurchases = 0.72, Income = 0.58, MntWines = 0.56
-
NumCatalogPurchases
: Feature yang berkorelasi dengan NumCatalogPurchases:MntMeatProducts = 0.72, MntWines = 0.64,Income = 0.59
-
AcceptedCmp3
: Feature yang berkorelasi dengan AcceptedCmp3:MntGoldProducts = 0.12
-
AcceptedCmp5
: Feature yang berkorelasi dengan AcceptedCmp5:MntWines = 0.47, MntMeatProducts = 0.37, Income = 0.34
-
AcceptedCmp1
: Feature yang berkorelasi dengan AcceptedCmp1:AcceptedCmp5 = 0.40, MntWines = 0.35, MntMeatProducts = 0.31, NumCatalogPurchases = 0.31
Dari hasil tersebut, kemungkinan digunakan sebagai fitur prioritas penentuan feature untuk klasifikasi response customer
Berdasarkan analisis Boxplot diatas dengan menambahkan feature Response
sebagai variabel pembanding, maka dapat ditemukan beberapa insights sebagai berikut:
Terdapat beberapa variabel yang memiliki perbedaan yang cukup signifikan dilihat dari jarak antar median antara customer yang respon dan tidak respon sepert : Income
, Recency
, MntWines
, MntFruits
, MntMeatProducts
, MntFishProducts
, MntSweetProducts
, MntGoldProducts
, NumberWebPurchases
, NumberCatalogPurchases
dan NumberStorePurchases
.
Berikut adalah penjelasannya:
- Pada variabel
Income
, Customer yang merespon campaign cenderung memiliki income yang lebih tinggi dengan rata-rata income yang dimiliki customer sekitar 65000, dibanding customer yang tidak merespon campaign memiliki income rata-rata hanya sekitar 50000. - Pada variabel
Recency
, Customer yang merespon campaign cenderung lebih aktif untuk berbelanja dengan rata-rata hari terakhir pembelian produk sekitar 30 hari, dibanding customer yang tidak merespon campaign memiliki rata-rata hari terakhir pembelian produk sekitar lebih dari 50 hari - Pada variabel
MntWines
, Customer yang merespon campaign cenderung lebih banyak membeli produk Wines dengan rata-rata pembelian produk Wines sekitar \$450 selama 2 tahun, dibanding customer yang tidak merespon campaign dengan rata-rata pembelian produk Wines kurang dari \$200 selama 2 tahun - Pada variabel
MntFruits
, Customer yang merespon campaign cenderung lebih banyak membeli produk Fruits dengan rata-rata pembelian produk Fruits lebih dari \$20 selama 2 tahun, dibanding customer yang tidak merespon campaign dengan rata-rata pembelian produk Fruits kurang dari \$5 selama 2 tahun - Pada variabel
MntMeatProducts
, Customer yang merespon campaign cenderung lebih banyak membeli produk Meat dengan rata-rata pembelian produk Meat lebih dari \$190 selama 2 tahun, dibanding customer yang tidak merespon campaign dengan rata-rata pembelian produk Meat kurang dari \$50 selama 2 tahun - Pada variabel
MntFishProducts
, Customer yang merespon campaign cenderung lebih banyak membeli produk Fish dengan rata-rata pembelian produk Fish sekitar \$25 selama 2 tahun, dibanding customer yang tidak merespon campaign dengan rata-rata pembelian produk Fish kurang dari \$5 selama 2 tahun - Pada variabel
MntSweetProducts
, Customer yang merespon campaign cenderung lebih banyak membeli produk Sweet dengan rata-rata pembelian produk Sweet sekitar \$20 selama 2 tahun, dibanding customer yang tidak merespon campaign dengan rata-rata pembelian produk Sweet kurang dari \$5 selama 2 tahun - Pada variabel
MntGoldProducts
, Customer yang merespon campaign cenderung lebih banyak membeli produk Gold dengan rata-rata pembelian produk Gold sekitar \$40 selama 2 tahun, dibanding customer yang tidak merespon campaign dengan rata-rata pembelian produk Gold kurang dari \$20 selama 2 tahun - Pada variabel
NumberWebPurchases
, Customer yang merespon campaign cenderung lebih banyak membeli produk melalui Web dengan rata-rata 5 kali pembelian produk, dibanding customer yang tidak merespon campaign membeli produk melalui Web dengan rata-rata 3 kali pembelian produk - Pada variabel
NumberCatalogPurchases
, Customer yang merespon campaign cenderung lebih banyak membeli produk melalui Catalog dengan rata-rata 4 kali pembelian produk, dibanding customer yang tidak merespon campaign membeli produk melalui Catalog dengan rata-rata 1 kali pembelian produk - Pada variabel
NumberStorePurchases
, Customer yang merespon campaign cenderung lebih banyak membeli produk melalui Toko dengan rata-rata 6 kali pembelian produk, dibanding customer yang tidak merespon campaign membeli produk melalui Toko dengan rata-rata 5 kali pembelian produk
Simplified based on Mount Product
Pada Response yang menerima (values 1)
, memiliki nilai Mount
(Jumlah Pembelian) di tiap product lebih tinggi
daripada yang tidak merespon (values 0)
Simplified based on Type Purchases
- Untuk pembelian melalui
Web
,Catalog
,Web
, PadaResponse yang menerima (values 1)
, memiliki nilaiPurchases
(Jumlah Pembelian) lumayan sedikitlebih tinggi
daripada yang tidak merespon (values 0) - Sedangkan pada pembelian melalui
Deals / Discount
danStore
memiliki nilai yangtidak terlalu berbeda
Simplified based on Status Customer
- Education
Graduation,PhD dan Master
memiliki jumlah respon yang tinggi, masing-masing ada pada ratio perbandingan respon > 13.4% (maks 20%)
- Marital_Status
Single, Married, Together, dan Divorced
memiliki jumlah respon yang tinggi, namun ratio perbandingan respon vs no responnya < 22.4% (maks 50%)
- Kidhome & Teenhome
- Semakin tinggi jumlah anak/remaja yang dimiliki customer, maka semakin kecil kemungkinan customer menerima Response (marketing campaign terakhir), sehingga lebih baik perusahaan menargetkan campaign kepada customer yang tidak memiliki anak/remaja. Begitupun pada ratio perbandingan respon vs no responnya menurun.
Simplified based on Campaign/Complain
-
AcceptedCmp columns
- Dari segi Response tertinggi cenderung pada yang tidak accept campaign.
- Dari yang Accept Campaign, hanya pada 1, 3, 4, 5 yang memiliki nilai yang kebih besar. Bisa juga dilihat pada ratio perbandingan respon vs no responnya 33-56%, berarti tidak berbeda signifikan dan perbandingannya lumayan sama.
- Pada Acccept Campaign 2 Jumlahnya sangat sedikit, namun ratio perbandingan respon vs no responnya yang paling tinggu 66%.
-
Complain
- Dari segi Response tertinggi cenderung pada yang tidak ada complain pada campaign
New Calculation, Extraction, and Binning features for business insight :
- Age Customer
- Age Group
- Has Child
- Dependents
- Month Customer
- Spending
- Total Accepted/Responses
- Education and Marital Simplify
- Income Segment
- Convertion Rate
- Total of days/years joined
- Jumlah yang
Response
signifikan lebih kecil dibandingkan yang Tidak MeresponNo Respon
, dengan ratio 14.9% - Ini berarti adanya
data imbalance
pada campaign terakhir (ke-6) perusahaan - Sehingga bisa dilakukan upaya peningkatan proses marketing campaign agar lebih banyak customer yang merespon campaign
Dari Campaign Rate yang telah kita lakukan, terdapat perubahan drastis yang terjadi dari Campaign 1 ke campaign 2 (menurun drastis) dan 3 (naik signifikan). Adapun dari Campaign 3-5 Semuanya memiliki rate yang kurang lebih sama disekitar ~7%. Sehingga dari perusahaan dan tim perlu melakukan identifikasi lanjutan untuk mengetahui apakah ada pola dari pembelian customer
Paling banyak pada Lima Campaign kita adalah 0 (tidak pernah merespon), namun ada yang sedikit berpotensi pada, hanya sekali (1) atau dua kali (2) merespon masing-masing 325 dan 83 Customers
Customer dengan income diatas > \$120.000 tidak ada yang menerima/respon campaign perusahaan. Jadi sebaiknya perusahaan fokus melakukan campaign kepada customer dengan income dibawah < \$120000.
Kategori customer yang menerima Response (marketing campaign terakhir) terbanyak berasal dari tahun lahir 1970-1975 (39-44 years old), dan 1980-1990 (24-34 years old).
Jika perusahaan harus memprioritaskan beberapa customer saja, maka perusahaan dapat memilih customer yang lahir pada tahun tersebut untuk menawarkan sebuah campaign.
Namun tetap memperhatikan juga No Response (Tidak Menerima) karena pada area tahun lahir 1970-1975 juga sangat tinggi.
Berdasarkan chart diatas dapat dilihat bahwa kelompok umur yang paling banyak merespon campaign adalah Adult dan Senior Adult
dan yang paling rendah adalah Young Adult
.
Artinya semakin Tua seseorang maka jumlah response juga meningkat
Dari visualisasi piechart Education, dapat dilihat bahwa customer yang merespon terbanyak berasal dari customer yang memiliki edukasi Graduation dan PhD, sehingga marketing team dapat memfokuskan campaign ke customer yang beredukasi Graduation.
Jumlah customer paling banyak menerima respon berdasarkan status penikahan yaitu Married dan orang yang masih single, sehingga pada campaign selanjutnya perusahaan sebaiknya memfokuskan kepada customer yang telah menikah (Married)
Sedangkan untuk "Absurd" dan "Yolo" pada data "Others" sangat sedikit
Semakin tinggi jumlah anak/remaja yang dimiliki customer, maka semakin kecil kemungkinan customer menerima Response (marketing campaign terakhir), sehingga lebih baik perusahaan menargetkan campaign kepada customer yang tidak memiliki anak/remaja.
Dari visualisasi kidhome dan teenhome, dapat dilihat bahwa customer yang merespon terbanyak berasal dari customer yang tidak mempunyai anak dan tidak mempunyai remaja (0.265403), sehingga marketing team dapat memfokuskan campaign ke customer yang tidak mempunyai anak dan tidak mempunyai remaja.
Berdasarkan recency (kapan terakhir kali customer melakukan pembayaran), semakin rendah recency maka semakin besar kemungkinan customer tersebut menerima marketing campaign perusahaan yang terakhir (Response). Sehingga marketing campaign selanjutnya dapat difokuskan kepada customer dengan recency yang rendah.
- Recency rendah : waktu purchase terakhir pelanggan dengan produk.belum terlalu lama
Jumlah customer paling banyak menerima respon berdasarkan pendapatan yaitu orang-orang yang memilik pendapatan sebesar 80000, sehingga pada campaign selanjutnya perusahaan sebaiknya lebih memfokuskan kepada orang dengan pendapatan 80000
Semakin sedikit pembelian yang dilakukan (baik yang menggunakan diskon ataupun yang melalui web, catalog, store), maka semakin besar kemungkinan customer untuk menerima Response (marketing campaign terakhir). Sehingga perusahaan dapat menargetkan campaign kepada customer dengan jumlah pembelian yang masih sedikit.
-
Customer dengan Purchase lebih rendah -> Memiliki Jumlah Complain Tinggi, tapi Response Tinggi
Perusahaan sebaiknya meningkatkan kualitas pelayanan, agar respone sejalan dengan tingkat kepuasan pelanggan untuk mengurangi complain customer
-
Customer dengan Purchase lebih tinggi -> Memiliki Jumlah Complain Rendah, tapi Response Rendah
Bisa dilakukan penelaah kembali hal-hal yang membuat customer dengan purchase lebih tinggi, cenderung rendah pada tingkat response
Income dan Spending memiliki korelasi positif pada response, dimana semakin tinggi nilai income dan spending semakin besar tingkat respon sehingga fitur income dan spending perlu dipertahankan
Higher the income, more likely to give response for campaign
Customer yang merespon campaign cenderung memiliki income yang lebih tinggi, terbukti dari customer yang memiliki income βHighβ level merespon campaign lebih banyak.
Customer dengan income High dan Medium lebih suka dengan produk Gold dan Fish. Oleh karena itu, jika ingin membuat campaign disarankan untuk memberikan campaign produk Gold dan Fish untuk cutomer dengan income tersebut.
Kemudian pada pembuatan campaign, disarankan berbentuk Catalog atau Diskon dan lebih banyak diarahkan ke customer dengan income High / Medium. untuk opsi kedua, bisa langsung dibuat banner/booth pada Store.
Customer yang merespon campaign cenderung lebih banyak membeli Wines dan Meat products. Sehingga untuk campaign selanjutnya produk Wines dan Meat menjadi rekomendasi produk utama untuk customer yang merespon.
Berikut adalah insights yang diperoleh berdasarkan Total Campaign vs Variable:
-
Income
: Customer yang menerima total 4 campaign cenderung memiliki income yang lebih tinggi. -
Kidhome:
Customer yang tidak menerima campaign sama sekali memiliki kidhome lebih banyak. -
Teenhome
: Customer yang tidak menerima campaign sama sekali memiliki Teenhome lebih banyak. -
Recency
: Customer yang menerima total 3 campaign cenderung memiliki recency (total hari terakhir berbelanja) yang lebih lama. -
MntWines
: Customer yang menerima total 4 campaign cenderung membeli produk Wines lebih banyak. -
MntFruits
: Customer yang menerima total 3 campaign cenderung membeli produk Fruits lebih banyak. -
MntMeatProducts
: Customer yang menerima total 3 campaign cenderung membeli produk Meat lebih banyak. -
MntFishProducts
: Customer yang menerima total 3 campaign cenderung membeli produk Fish lebih banyak. -
MntSweetProducts
: Customer yang menerima total 3 campaign cenderung membeli produk Sweet lebih banyak. -
MntGoldProducts:
Customer yang menerima total 3 campaign cenderung membeli produk Gold lebih banyak. -
NumDealsPurchases
: Customer yang tidak menerima campaign sama sekali lebih sering membeli produk menggunakan diskon. -
NumWebPurchases
: Customer yang menerima total 2 dan 3 campaign cenderung lebih sering membeli produk melalui web. -
NumCatalogPurchases
: Customer yang menerima total 4 campaign cenderung lebih sering membeli produk melalui katalog. -
NumStorePurchases
: Customer yang menerima total 4 campaign cenderung lebih sering membeli produk melalui toko. -
NumWebVisitsMonths
: Customer yang tidak menerima campaign sama sekali lebih sering melakukan web visit pada bulan terakhir.
Missing values status: True
Total Null Values Percentage Data Type
Income 24 1.071429 int64
ID 0 0.000000 int64
Z_CostContact 0 0.000000 int64
Complain 0 0.000000 object
AcceptedCmp2 0 0.000000 object
AcceptedCmp1 0 0.000000 float64
AcceptedCmp5 0 0.000000 int64
AcceptedCmp4 0 0.000000 int64
AcceptedCmp3 0 0.000000 object
NumWebVisitsMonth 0 0.000000 int64
NumStorePurchases 0 0.000000 int64
NumCatalogPurchases 0 0.000000 int64
NumWebPurchases 0 0.000000 int64
NumDealsPurchases 0 0.000000 int64
Z_Revenue 0 0.000000 int64
MntGoldProds 0 0.000000 int64
MntFishProducts 0 0.000000 int64
MntMeatProducts 0 0.000000 int64
MntFruits 0 0.000000 int64
MntWines 0 0.000000 int64
Recency 0 0.000000 int64
Dt_Customer 0 0.000000 int64
Teenhome 0 0.000000 int64
Kidhome 0 0.000000 int64
Marital_Status 0 0.000000 int64
Education 0 0.000000 int64
Year_Birth 0 0.000000 int64
MntSweetProducts 0 0.000000 int64
Response 0 0.000000 int64
Berdasarkan hasil analisa awal, dapat diketahui bahwa terdapat data kosong pada kolom income sebanyak 24 baris dengan persentase sebesar 1,07% dari keseluruhan data.
Pada proses handling missing values untuk kolom Income
ada beberapa metode yang dapat di lakukan :
- Drop Rows Missing Values
- Imputation Median
Fillna
orSimpleImputer
- Multivariate Approach
- Perlu dipastikan untuk data yang dimiliki semaunya dalam bentuk tipe numerical (categorical encoding)
Label Encoding
:Education
LabelEncoder
orMapping
One Hot Encoding
:Marital Status
get_dummies
orOneHotEncoder
- Kita juga drop kolom yang tidak penting seperti data tanggal
Dt_Customer
- Metode :
KNNImputer
or K-Nearest NeighborMICE
or Multiple Imputation by Chained Equation- Imputation using MICE with
IterativeImputer
- Imputation using MICE with
LightGBM
- Imputation using MICE with
- Perlu dipastikan untuk data yang dimiliki semaunya dalam bentuk tipe numerical (categorical encoding)
Choice Determination:
- Pada proses handling missing values ini kita menggunakan
Imputation using MICE with LightGBM
Imputation using MICE
with LightGBM
import miceforest as mf
# Create kernel.
kds = mf.ImputationKernel(
df_ma,
save_all_iterations=True,
random_state=100
)
# Run the MICE algorithm
kds.mice(iterations=5, n_estimators=50)
# Return the completed dataset.
df_imputed = kds.complete_data()
df["Income"] = df_imputed["Income"].copy()
df.head()
Kesimpulan
Berdasarkan hasil pengecekan, Untuk kolom Income
terdapat missing values 24 rows (1,07%). Dikarenakan data kita terbatas, sehingga untuk prosesnya kita tidak akan melakukan penghapusan baris (Drop Rows), melainkan dilakukan proses Imputation.
Pada proses handling missing values ini kita menggunakan Imputation using MICE with LightGBM
. Imputasi MICE dapat lebih efisien menggunakan miceforest
karena diharapkan kinerjanya jauh lebih baik karena mengimplementasikan algortima lightgbm
di backend untuk melakukan imputasi. LightGBM
dikenal dengan akurasi prediksi yang tinggi. Menggabungkannya dengan algortima mice
menjadikannya algortima yang kuat untuk imputasi.
df[df.duplicated(keep=False)].sort_values(by=list(df.columns.values))
df.duplicated().sum()
df.duplicated(subset=["ID"]).sum()
-----------------------------------------
0
Kesimpulan
- Berdasarkan hasil pengecekan, tidak ditemui baris data yang memiliki duplikat. Sehingga kami tidak perlu melakukan handling duplicated data
- Pada pengecekan duplikat subset untuk ID tidak ditemukan ada nya ID customer yang sama
===== ID =====
[5524, 2174, 4141, 6182, 5324, 7446, 965, 6177, 4855, 5899, .....]
===== Year_Birth =====
[1957, 1954, 1965, 1984, 1981, 1967, 1971, 1985, 1974, 1950, .....]
===== Education =====
['Graduation', 'PhD', 'Master', 'Basic', '2n Cycle']
===== Marital_Status =====
['Single', 'Together', 'Married', 'Divorced', 'Widow', 'Alone', 'Absurd', 'YOLO']
===== Income =====
[58138.0, 46344.0, 71613.0, 26646.0, 58293.0, 62513.0, 55635.0, 33454.0, 30351.0, 5648.0, .....]
===== Kidhome =====
[0, 1, 2]
===== Teenhome =====
[0, 1, 2]
===== Dt_Customer =====
['2012-09-04', '2014-03-08', '2013-08-21', '2014-02-10', '2014-01-19', '2013-09-09', '2012-11-13', '2013-05-08', '2013-06-06', '2014-03-13', .....]
===== Recency =====
[58, 38, 26, 94, 16, 34, 32, 19, 68, 11, .....]
===== MntWines =====
[635, 11, 426, 173, 520, 235, 76, 14, 28, 5, .....]
===== MntFruits =====
[88, 1, 49, 4, 43, 42, 65, 10, 0, 5, .....]
===== MntMeatProducts =====
[546, 6, 127, 20, 118, 98, 164, 56, 24, 11, .....]
===== MntFishProducts =====
[172, 2, 111, 10, 46, 0, 50, 3, 1, 11, .....]
===== MntSweetProducts =====
[88, 1, 21, 3, 27, 42, 49, 2, 112, 5, .....]
===== MntGoldProds =====
[88, 6, 42, 5, 15, 14, 27, 23, 2, 13, .....]
===== NumDealsPurchases =====
[3, 2, 1, 5, 4, 15, 7, 0, 6, 9, .....]
===== NumWebPurchases =====
[8, 1, 2, 5, 6, 7, 4, 3, 11, 0, .....]
===== NumCatalogPurchases =====
[10, 1, 2, 0, 3, 4, 6, 28, 9, 5, .....]
===== NumStorePurchases =====
[4, 2, 10, 6, 7, 0, 3, 8, 5, 12, .....]
===== NumWebVisitsMonth =====
[7, 5, 4, 6, 8, 9, 20, 2, 3, 1, .....]
===== AcceptedCmp3 =====
[0, 1]
===== AcceptedCmp4 =====
[0, 1]
===== AcceptedCmp5 =====
[0, 1]
===== AcceptedCmp1 =====
[0, 1]
===== AcceptedCmp2 =====
[0, 1]
===== Complain =====
[0, 1]
===== Z_CostContact =====
[3]
===== Z_Revenue =====
[11]
===== Response =====
[1, 0]
Untuk mempermudah dalam proses feature extraction/engineering maka untuk data yang mengandung datetime akan dilakukan konversi ke format datetime pandas
df["Dt_Customer"] = pd.to_datetime(df["Dt_Customer"])
Akan dilakukan replace data / menyatukan yang memiliki arti yang sama agar mengurangi jumlah dimensi maupun redudansi pada data
- Mengganti kategori
Widow
,Alone
,Absurd
,YOLO
menjadiSingle
- Mengganti kategori
Together
menjadiMarried
- Mempertahankan kategori
Divorced
# Mengganti kategori 'Widow', 'Alone', 'Absurd', 'YOLO' menjadi 'Single'
df['Marital_Status'] = df['Marital_Status'].replace(['Widow', 'Alone', 'Absurd', 'YOLO'],'Single')
# Mengganti kategori 'Together' menjadi 'Married'
df['Marital_Status'] = df['Marital_Status'].replace(['Together'],'Married')
df['Marital_Status'].unique()
'Single', 'Married', 'Divorced'
Untuk kategori 2n Cycle
dan Master
juga kurang lebih sama. Maka dari itu, baris yang memiliki kategori 2n Cycle
akan dihapus dan digantikan dengan kategori Master
.
df['Education'] = df['Education'].replace(['2n Cycle'],'Master')
Kesimpulan
Berdasarkan hasil pengecekan, Untuk kolom Dt_Customer
sebelumnya masih berbentuk string/object, untuk tipe datanya kurang sesuai sehingga di ubah menjadi Datetime untuk diolah pada tahap Feature Engineering. Kemudian pada Marital_Status
dan Education
replace data / menyatukan yang memiliki arti yang sama agar mengurangi jumlah dimensi maupun redudansi pada data.
Karena pada kolom Year_Birth
memiliki nilai min yang sangat jauh di tahun 1893-1900
dan Income
memiliki nilai max yang sangat tinggi sebesar $666.666
Maka akan dilakukan Penghapusan rows pada nilai ini agar tidak ada ketimpangan nilai. Ada beberapa metode yang dapat kita lakukan :
- Handling Oulier
- IQR (Interquartile Range)
- Z-Score
- Manually Trimmed
Choice Determination:
- Untuk kasus saat ini, akan digunakan metode
Manually Trimmed
, agar menghindari penghapusan data yang terlalu banyak jika menggunakan Handling Outlier - Adapaun pada kolom lainnya
selain Year_Birth dan Income
yang terdapat outlier tidak kita handle karena akan melalui prosesNormal Distribution Transformation
nantinya yang akanmereduksi outliernya.
Manually Trimmed
- Kolom
Year_Birth
, menghapus nilai yang sangat jauh di tahun1893-1900
- Kolom
Income
menghapus nilai yang sangat tinggi sebesar$666.666
Kesimpulan
Berdasarkan hasil perhitungan menggunakan Z-score
dan juga IQR
, dapat diketahui bahwa jumlah baris yang dihapus dari Year_Birth
dan Income
berdasarkan IQR
untuk kolom tidak jauh berbeda dibandingkan dengan Z-score
, yaitu :
-
IQR :
- Jumlah data sebelum handling outliers : 2240
- Jumlah data setelah handling outliers (Year_Birth) : 2237
- Jumlah data setelah handling outliers (Income) : 2229
-
Z_Score :
- Jumlah data sebelum handling outliers : 2240
- Jumlah data setelah handling outliers (Year_Birth) : 2237
- Jumlah data setelah handling outliers (Income) : 2229
Namun, karena kita ingin meminimalisasi penghapusan data maka untuk proses ini kita memiliki Manually Trimmed
agar tidak terlalu banyak data yang dihapus, jadi hanya berfokus pada data yang memiliki jauh yang sangat tinggi
- Jumlah data sebelum handling outliers : 2240
- Jumlah data setelah handling outliers (Year_Birth) : 2237
- Jumlah data setelah handling outliers (Income) : 2236
Kita akan melakukan Calculation, Extraction, dan Binning features :
- Age Customer
- Age Group
- Has Child
- Dependents
- Month Customer (Lifetime)
- Spending
- Primer and Tersier product
- Total of Purchases
- Total_Cmp (Accepted Campaign 1-5)
- Ever_Accept (Accepted Campaign 1-5)
- Total Revenue
- Income Segment
- Conversion Rate Web
- Month Joined
- Recency Segment
Membuat Kolom Umur / Age
Berdasarkan data diketahui basis tahunnya : SAS Institute, 2014
Membuat Kolom Age Group
Akan disederhanakan lagi :
- Young Adult < 30
- Adult 30-45 Tahun
- Senior Adult > 45 tahun
Membuat Kolom Has_child
Menggabungkan Kidhome dan Teenhome menjadi feature Has_child, yang mana hasil penjumlahannya yang memiliki anak minimal 1
Membuat Kolom Dependents
Jumlah tanggungan dari customer, dari penjumlahan Kidhome dan Teenhome
Membuat Kolom Lifetime
Sudah berapa bulan customer sejak pembelian pertama di supermarket
Membuat Kolom Spending
Jumlah pembelian tiap customer pada keseluruhan product
Membuat Kolom Primer and Tersier product
Jumlah pembelian tiap customer pada kelompok primer dan tersier product
Membuat Kolom Total of Purchases
Jumlah pembelian tiap customer pada keseluruhan metode pembelian.
Membuat Kolom Total_Cmp
Berapa kali tiap customer merespon ke 5 campign yang dilaksanakan (AcceptedCmp 1 - 5)
Membuat Kolom Ever_Accept
Apakah Customer pernah minimal sekali menerima campign atau tidak pernah sama sekali
Membuat Kolom Total Revenue
Jumlah Campaign yang diresponse/accept (Campaign 1-5) dikali dengan revenue = 11
Membuat Kolom Income Segmentation
- None -> Missing values
- High -> >= q3(68468)
- Medium -> q1(35335) - q3(68468)
- Low -> < q1(35335)
Membuat Kolom Conversion Rate Web
Perbandingan Total Purchases dengan Jumlah Pengunjung Website
Membuat Kolom Month Joined
Membuat kolom extraction month dari tanggal Customer pertama kali berbelanja
Note : Untuk nilai tahun tidak digunakan karena berpotensi bias karena dari nilai nya akan increasing tiap waktu, sedangkan month akan repeat pada tiap periode
Membuat Kolom Recency_sgmt
Perkiraan pembagian dengan rentang 19 Hari:
- 4 score -> setengah bulan
- 3 score -> 1 bulan
- 2 score -> 1 setengah bulan
- 1 score -> 2 bulan
- 0 score -> 3 bulan
Categorical (String)
- Education - Basic, Graduation, Master, PhD
- Marital_Status - Single, Married, Divorced
- Age_group - Young Adult, Adult, Senior Adult
- Income_sgmt - High, Medium, Low
Categorical (Int)
- ID
- Kidhome - 0, 1, 2
- Teenhome - 0, 1, 2
- AcceptedCmp1 - 0, 1
- AcceptedCmp2 - 0, 1
- AcceptedCmp3 - 0, 1
- AcceptedCmp4 - 0, 1
- AcceptedCmp5 - 0, 1
- Ever_Accept - 0, 1
- Complain - 0, 1
- Response - 0, 1
- Has_child - 0, 1
- Recency_sgmt - 0, 1, 2, 3, 4
Numericals
- Year_Birth = 1940 - 1996
- Income = 1730.0 - 162397.0
- Kidhome = 0 - 2
- Teenhome = 0 - 2
- Recency = 0 - 99
- Age = 18 - 74
- Dependents = 0 - 3
- Lifetime = 1 - 36
- Spending = 5 - 2525
- Primer_purchase = 1 - 1727
- Tersier_purchase = 3 - 1689
- Total_Purchases = 0 - 44
- NumWebVisitsMonth = 0 - 20
- Conversion_rate_web = 0.0 - 43.0
- Total_Cmp = 0 - 4
- Total_revenue = 0 - 44
- Month_joined = 1 - 12
Numericals (one)
- Z_CostContact = 3
- Z_Revenue = 11
Numericals (Product)
- MntWines = 0 - 1493
- MntFruits = 0 - 199
- MntMeatProducts = 0 - 1725
- MntFishProducts = 0 - 259
- MntSweetProducts = 0 - 263
- MntGoldProds = 0 - 362
Numericals (Purchases)
- NumDealsPurchases = 0 - 15
- NumWebPurchases = 0 - 27
- NumCatalogPurchases = 0 - 28
- NumStorePurchases = 0 - 13
Timestamp
- Dt_Customer = 2012-07-30 - 2014-06-29
Dari hasil temuan, kita dapat menentukan beberapa transformasi yang akan kita lakukan :
-
Scaling and Converting to a Normal Distribution :
- log Transformation
- Box-Cox Transformation
- Yeo-Johnson Transformation
Adapun daftar column yang akan kita transform pada proses ini : - Conversion_rate_web - MntFishProducts - MntFruits - MntGoldProds - MntMeatProducts - MntSweetProducts - MntWines - NumCatalogPurchases - NumDealsPurchases - NumStorePurchases - NumWebPurchases - Primer_purchase - Spending - Tersier_purchase - Total_revenue
-
Just Scaling :
- Normalization
- Standardization
Adapun daftar column yang akan kita transform pada proses ini : - Age - Income - Lifetime - Month_joined - NumWebVisitsMonth - Recency - Total_Purchases - Year_Birth
-
Sedangkan untuk beberapa kolom yang tidak perlu melakukan Transformasi karena rentang nilai yang masih wajar sebagai berikut :
- Kidhome
- Teenhome
- Dependents
- Total_Cmp
Choice Determination:
- Pada proses
Scaling and Converting to a Normal Distribution
ini kita menggunakanYeo-Johnson Transformation
, karena dari hasilnya kita bisa melihat hasil bentuk curve yang lebih Normal Distribusi - Pada proses
Just Scaling
ini kita menggunakanNormalization
karena lebih robust untuk algoritma yang akan kita gunakan
Yeo-Johnson Transformation
Unlike the Box-Cox transform, it does not require the values for each input variable to be strictly positive.
It supports zero values and negative values. This means we can apply it to our dataset without scaling it first.
pt = PowerTransformer(method='yeo-johnson')
df[log_cols] = pt.fit_transform(df[log_cols])
Normalization
from sklearn.preprocessing import MinMaxScaler
# create a scaler object
scaler = MinMaxScaler()
# fit and transform the data
df[norm_cols] = pd.DataFrame(scaler.fit_transform(df[norm_cols]), columns=df[norm_cols].columns)
Kesimpulan
Berdasarkan hasil pengecekan pada beberapa fitur yang telah diproses menggunakan transformation sebelumnya, dapat diketahui bahwa keseluruhan nilai skewnessnya sudah memiliki rentang yang lebih seragam (tidak jauh dan tidak terlalu bervariasi). Sehingga dapat disimpulkan bahwa teknik fitur transformation yang telah kami lakukan sudah valid dan kami.
===== Education =====
['Graduation', 'PhD', 'Master', 'Basic']
===== Marital_Status =====
['Single', 'Married', 'Divorced']
===== Age_group =====
['Senior Adult', 'Young Adult', 'Adult']
===== Income_sgmt =====
['Medium', 'High', 'Low']
Dari hasil temuan, kita dapat menentukan beberapa encoding yang akan kita lakukan :
-
Label Encoding :
- LabelEncoder
- Manually Mapped
Adapun daftar column yang akan kita proses :
Education
- Basic (0), Graduation (1), Master (2), PhD (3)Age_group
- Young Adult (0), Adult (1), Senior Adult (2)Income_sgmt
- Low (0), Medium (1), High (2)
-
One Hot Encoding :
- get_dummies
- OneHotEncoder
Adapun daftar column yang akan kita proses :
Marital_Status
- Single, Married, Divorced
Choice Determination:
- Pada proses
Label Encoding
ini kita menggunakanManually Mapped
, karena kita bisa menentukan secara fleksible urutan/order dari categorical feature - Pada proses
One Hot Encoding
ini kita menggunakanOneHotEncoder
, karena hasil encodingnya lebih rapi dan lebih mudah untuk dilakukan adjust
Kesimpulan
Berdasarkan hasil pengecekan pada beberapa fitur yang telah diproses menggunakan encoding sebelumnya, dapat diketahui bahwa keseluruhan nilai telah beripe numeric sesuai dengan nilai yang kita assign. Sehingga dapat disimpulkan bahwa teknik fitur encoding yang telah kami lakukan sudah valid dan kami.
Ada beberapa fitur yang telah diproses menggunakan feature selection :
- Drop Unnecessary Feature
- Univariate Selection
- Anova F-value
- Variance Threshold
- Mutual Information
- SelectKBest
- Feature Importance
- Pearson Correlation
- Drop Redundace
- Drop kolom
ID
karena memiliki banyak kategori dan tidak berguna untuk pemodelan - Drop kolom
Year_Birth
sudah dilakukan Feature extraction untuk mengambil data Umur/Age pada range tahun saat ini 2014 (sesuai pada data) - Drop kolom
Dt_Customer
karena tidak terlalu mempengaruhi model prediksi - Drop kolom
Z_CostContact
(3) danZ_Revenue
(11) karena hanya memiliki satu nilai, tidak memberikan informasi yang signifikan terhadap model prediksi
-
Correlation states how the features are related to each other or the target variable.
-
Correlation can be positive (increase in one value of feature increases the value of the target variable) or negative (increase in one value of feature decreases the value of the target variable)
-
Heatmap makes it easy to identify which features are most related to the target variable, we will plot heatmap of correlated features using the seaborn library.
-
Cek Feature Redundan pada korelasi Antar Feature, Drop salah satunya, yang rendah korelsinya dengan Response (target)
Dari feature yang telah kita pilih dari gabungan Top 20 akan di lakukan pengecekan kembali melalui redudansi antar feature
. Pada proses ini kita memilih antar feature yang memiliki korelasi diatas threshold > 0.70
, yang kemudian akan di bandingkan korelasinya dengan Target
untuk drop salah satu feature
Maka telah didapatkan feature yang akan digunakan pada proses modelling sebagai berikut :
['AcceptedCmp1',
'AcceptedCmp2',
'AcceptedCmp3',
'AcceptedCmp4',
'Dependents',
'Education',
'Lifetime',
'Married',
'MntGoldProds',
'NumCatalogPurchases',
'NumDealsPurchases',
'NumWebVisitsMonth',
'Recency',
'Recency_sgmt',
'Total_Cmp']
I will split the data into training set and testing set with proportion of 75:25.
# define X and y
X = df.drop(['Response'], axis=1)[feature_importance] #features
y = df['Response'] #target
from sklearn.model_selection import train_test_split
# splitting tha data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify= y, random_state=42)
print(X_train.shape, X_test.shape)
Status risiko highly imbalanced, dengan 15% Response dan 85% No Response. Itu sebabnya diperlukan resampling.
Note: Saat menerapkan machine learning algorithms dengan data yang tidak seimbang, model yang diperoleh akan lebih condong ke kelas mayoritas. Artinya model akan memprediksi kelas mayoritas bukan kelas minoritas.
Jika kita ingin melakukan klasifikasi, maka seharusnya melakukan stratified train_test_split
terlebih dahulu untuk menjaga ketidakseimbangannya (imbalance). Sehingga dataset test dan train memiliki distribusi yang sama, kemudian jangan pernah menyentuh test set lagi. Kemudian lakukan pengambilan sampel ulang hanya pada data train.
Summary : You must apply SMOTE
after splitting into training and test
, not before. Doing SMOTE before is bogus and defeats the purpose of having a separate test set.
from imblearn.under_sampling import RandomUnderSampler
from imblearn.over_sampling import RandomOverSampler, SMOTE
....
# Oversampling SMOTE
sm = SMOTE(sampling_strategy=0.5, random_state = 2)
X_balanced_res, y_balanced_res = sm.fit_resample(X_train,y_train)
-
Before OverSampling, the shape of X_train: (1677, 15)
-
Before OverSampling, the shape of y_train: (1677,)
-
Before OverSampling, counts of label '1': 251
-
Before OverSampling, counts of label '0': 1426
-
After OverSampling, the shape of X_train: (2139, 15)
-
After OverSampling, the shape of y_train: (2139,)
-
After OverSampling, counts of label '1': 713
-
After OverSampling, counts of label '0': 1426