Halo pembaca semuanya.. Sebelumnya terima kasih telah membaca tulisan ini, kali ini saya akan mendokumentasikan hasil belajar saya di DQLab.id yang mana Data Mentor proyek kali ini adalah Wahyu Herlambang beliau adalahSenior Data Analyst di Traveloka, yuk langsung saja saya akan coba jelaskan dokumentasi proyek ini.
Data analytics test ini berisi 2 bagian, teori dan test coding yang terdiri dari:
Teori
Konsep Dasar Data Analytics: Tes ini dimaksudkan untuk menguji pemahaman saya tentang data analytics.
Coding Test
Data preparation test: Tes ini dimaksudkan untuk menguji kemampuan saya dalam melakukan ETL data.
Data visualization test: Tes ini dimaksudkan untuk menguji kemampuan saya dalam hal visualisasi data.
Basic Stats Method test: Tes ini dimaksudkan untuk menguji kemampuan saya dalam melakukan modeling data menggunakan statistika dasar.
DQLab sport center adalah toko yang menjual berbagai kebutuhan olahraga seperti Jaket, Baju, Tas, dan Sepatu. Toko ini mulai berjualan sejak tahun 2013, sehingga sudah memiliki pelanggan tetap sejak lama, dan tetap berusaha untuk mendapatkan pelanggan baru sampai saat ini.
Di awal tahun 2019, manajer toko tersebut merekrut junior DA untuk membantu memecahkan masalah yang ada di tokonya, yaitu menurunnya pelanggan yang membeli kembali ke tokonya. Junior DA tersebut pun diberi kepercayaan mengolah data transaksi toko tersebut. Manajer toko mendefinisikan bahwa customer termasuk sudah bukan disebut pelanggan lagi (churn) ketika dia sudah tidak bertransaksi ke tokonya lagi sampai dengan 6 bulan terakhir dari update data terakhir yang tersedia.
Manajer toko pun memberikan data transaksi dari tahun 2013 sampai dengan 2019 dalam bentuk csv (comma separated value) dengan data_retail.csv dengan jumlah baris 100.000 baris data.
Berikut tampilan datanya:
Field yang ada pada data tersebut antara lain:
No
Row_Num
Customer_ID
Product
First_Transaction
Last_Transaction
Average_Transaction_Amount
Count_Transaction
OKee,, sesudah saya mengetahui datanya selanjutnya langkah yang dilakukan adalah menjabarkan proses yang akan dilakukan agar lebih terarah, seperti dibawah ini :
Data preparation test
Importing data: Melakukan import data_retail.csv ke python environment.
Cleansing data: Melakukan pembersihan dan modifikasi data sehingga siap digunakan untuk analisis lebih lanjut..
Data visualization test: Mendapatkan insight dari hasil visualisasi yang telah dibuat.
Basic stats method test: Mendapatkan insight dari model dan evaluasi model yang sudah dibuat dan diuji.
Data preparation test : melakukan import data retail.csv dari url https://storage.googleapis.com/dqlab-dataset/data_retail.csv
import pandas as pd
df = pd.read_csv('https://storage.googleapis.com/dqlab-dataset/data_retail.csv', sep=';')
print('Lima data teratas:')
print(df.head())
print('\nInfo dataset:')
print(df.info())
## Jika saya menggunakan Google Spreaadsheet
import pandas as pd
sheet_id = "1rPyyYF4F6gFVFYtqam9Dtn7NAau1URODDjErCeexXuI"
sheet_name = "data_retail.csv"
url = f"https://docs.google.com/spreadsheets/d/{sheet_id}/gviz/tq?tqx=out:csv&sheet={sheet_name}"
df = pd.read_csv(url, engine="python", sep='\;')
df["Count_Transaction\""] = df["Count_Transaction\""].str.replace(r"[\"]",' ').astype(str).astype(int)
df = df.rename({'Count_Transaction\"': 'Count_Transaction'}, axis=1)
print('Lima data teratas:')
print(df.head())
print('\nInfo dataset:')
print(df.info())
Output :
2. Cleansing data: Melakukan pembersihan dan modifikasi data sehingga siap digunakan untuk analisis lebih lanjut.
Dua kolom yang menunjukkan terjadinya transaksi tidak bertipe datetime tepatnya pada kolom First_Transaction dan Last Transaction, maka saya ubah kedua kolom tersebut ke tipe data datetime.
Setelah mengubah tipe datanya langkah selanjutnya adalah mencari data Last_Transaction 6 bulan terakhir dari update data terakhir yang tersedia . Agar kita dapat mengklasifikasikan customer yang berstatus churn atau tidak dengan boolean.
print(max(df['Last_Transaction']))
Data Last_Transaction update terakhir adalah 1 Februari 2019 maka 6 bulan terakhir nya adalah 1 Agustus 2018.
Selanjutnya adalah mengklasifikasikan mana customer yang berstatus churn dan mana yang tidak. Menggunakan script berikut
# Klasifikasikan customer yang berstatus churn atau tidak dengan boolean
df.loc[df['Last_Transaction'] <= '2018-08-01', 'is_churn'] = True
df.loc[df['Last_Transaction'] > '2018-08-01', 'is_churn'] = False
print('Lima data teratas:')
print(df.head())
print('\nInfo dataset:')
print(df.info())
Terdapat kolom baru is_churn yang berisi status churn atau tidaknya customer.
Selanjutnya menghapus kolom yang tidak diperlukan yaitu kolom no dan Row_Num.
# Hapus kolom-kolom yang tidak diperlukan
del df['no']
del df['Row_Num']
# Cetak lima data teratas
print(df.head())
Baik sepertinya Data Preparation yang dilakukan sudah cukup selanjutnya ke tahap Data Visualization
Data Visualization : Mendapatkan insight dari hasil visualisasi yang telah dibuat.
Membuat visualisasi data berupa trend of customer acquisition by year dengan meggunakan bar chart. Untuk itu saya buat feature/kolom tambahan yang merupakan tahun dari First_Transaction dan tahun dari Last_Transaction masing-masingnya dengan nama Year_First_Transaction dan Year_Last_Transaction sebelum melakukan visualisasi.
import matplotlib.pyplot as plt
# Kolom tahun transaksi pertama
df['Year_First_Transaction'] = df['First_Transaction'].dt.year
# Kolom tahun transaksi terakhir
df['Year_Last_Transaction'] = df['Last_Transaction'].dt.year
df_year = df.groupby(['Year_First_Transaction'])['Customer_ID'].count()
df_year.plot(x='Year_First_Transaction', y='Customer_ID', kind= 'bar', title='Graph of Customer Acquisition')
plt.xlabel('Year_First_Transaction')
plt.ylabel('Num_of_Customer')
plt.tight_layout()
plt.show()
2. Selanjutnya saya akan Visualisasikan trend jumlah transaksi per tahunnya dengan menggunakan bar chart.
import matplotlib.pyplot as plt
plt.clf()
df_year = df.groupby(['Year_First_Transaction'])['Count_Transaction'].sum()
df_year.plot(x='Year_First_Transaction', y='Count_Transaction_Amount', kind='bar', title='Graph of Transaction Customer')
plt.xlabel('Year_First_Transaction')
plt.ylabel('Num_of_Transaction')
plt.tight_layout()
plt.show()
3. Kemudian saya akan menggunakan seaborn pointplot, untuk memvisualisasikan tren dari tahun ke tahun rata-rata jumlah transaksi untuk tiap-tiap produknya.
import matplotlib.pyplot as plt
import seaborn as sns
plt.clf()
sns.pointplot(data = df.groupby(['Product', 'Year_First_Transaction']).mean().reset_index(),
x='Year_First_Transaction',
y='Average_Transaction_Amount',
hue='Product')
plt.tight_layout()
plt.show()
4. Dari sisi churned customer, khususnya untuk melihat seberapa besar proporsi churned customer untuk tiap-tiap produk dapat diketahui insight-nya melalui pie chart. Maka saya akan Visualisasikan pie chartnya untuk keempat produk tersebut.
import matplotlib.pyplot as plt
plt.clf()
# Melakukan pivot data dengan pivot_table
df_piv = df.pivot_table(index='is_churn',
columns='Product',
values='Customer_ID',
aggfunc='count',
fill_value=0)
# Mendapatkan Proportion Churn by Product
plot_product = df_piv.count().sort_values(ascending=False).head(5).index
# Plot pie chartnya
df_piv = df_piv.reindex(columns=plot_product)
df_piv.plot.pie(subplots=True,
figsize=(10, 7),
layout=(-1, 2),
autopct='%1.0f%%',
title='Proportion Churn by Product')
plt.tight_layout()
plt.show()
5. Selanjutnya akan melakukan visualisasi dari distribusi kategorisasi count transaction. Kategorisasi ini dilakukan dengan mengelompokkan jumlah transaksi seperti yang diperlihatkan oleh tabel berikut:
import matplotlib.pyplot as plt
plt.clf()
# Kategorisasi jumlah transaksi
def func(row):
if row['Count_Transaction'] == 1:
val = '1. 1'
elif (row['Count_Transaction'] > 1 and row['Count_Transaction'] <= 3):
val ='2.2-3'
elif (row['Count_Transaction'] > 3 and row['Count_Transaction'] <= 6):
val ='3.4-6'
elif (row['Count_Transaction'] > 6 and row['Count_Transaction'] <= 10):
val ='4.7-10'
else:
val ='5.>10'
return val
# Tambahkan kolom baru
df['Count_Transaction_Group'] = df.apply(func, axis=1)
df_year = df.groupby(['Count_Transaction_Group'])['Customer_ID'].count()
df_year. plot(x='Count_Transaction_Group', y='Customer_ID', kind='bar', title='Customer Distribution by Count Transaction Group')
plt.xlabel('Count_Transaction_Group')
plt.ylabel('Num_of_Customer')
plt.tight_layout()
plt.show()
6. Kemudian, saya akan melakukan visualisasi dari distribusi kategorisasi average transaction amount. Kategorisasi ini dilakukan dengan mengelompokkan rata-rata besar transaksi seperti yang diperlihatkan oleh tabel berikut:
import matplotlib.pyplot as plt
plt.clf()
# Kategorisasi rata-rata besar transaksi
def f(row):
if (row['Average_Transaction_Amount'] >= 100000 and row['Average_Transaction_Amount'] <=200000):
val ='1. 100.000 - 250.000'
elif (row['Average_Transaction_Amount'] >250000 and row['Average_Transaction_Amount'] <= 500000):
val ='2. >250.000 - 500.000'
elif (row['Average_Transaction_Amount'] >500000 and row['Average_Transaction_Amount'] <= 750000):
val ='3. >500.000 - 750.000'
elif (row['Average_Transaction_Amount'] >750000 and row['Average_Transaction_Amount'] <= 1000000):
val ='4. >750.000 - 1.000.000'
elif (row['Average_Transaction_Amount'] >1000000 and row['Average_Transaction_Amount'] <= 2500000):
val ='5. >1.000.000 - 2.500.000'
elif (row['Average_Transaction_Amount'] >2500000 and row['Average_Transaction_Amount'] <= 5000000):
val ='6. >2.500.000 - 5.000.000'
elif (row['Average_Transaction_Amount'] >5000000 and row['Average_Transaction_Amount'] <= 10000000):
val ='7. >5.000.000 - 10.000.000'
else:
val ='8. >10.000.000'
return val
# Tambahkan kolom baru
df['Average_Transaction_Amount_Group'] = df.apply(f, axis=1)
df_year = df.groupby(['Average_Transaction_Amount_Group'])['Customer_ID'].count()
df_year.plot(x='Average_Transaction_Amount_Group', y='Customer_ID',kind='bar', title='Customer Distribution by Average Transaction Amount Group')
plt.xlabel('Average_Transaction_Amount_Group')
plt.ylabel('Num_of_Customer')
plt.tight_layout()
plt.show()
Setelah mendapat beberapa insight dari visualisasi Selanjutnya adalah tahap ketiga yaitu Basic stats method.
Basic stats method : Mendapatkan insight dari model dan evaluasi model yang sudah dibuat dan diuji
Di bagian ini, selanjutnya akan menentukan feature columns dari dataset yang dimiliki, di sini dipilih kolom Average_Transaction_Amount, Count_Transaction, dan Year_Diff. Akan tetapi, kolom terakhir belum ada. Silakan dicreate dahulu kolom Year_Diff ini dan kemudian assign dataset dengan feature columns ini sebagai variabel independent X.
Untuk target tentunya persoalan costumer dengan kondisi churn atau tidak, saya assign dataset untuk target ini ke dalam variabe dependent y.
2. Setelah variabel independent X dan variabel dependent y selesai dilakukan, maka saya pecah X dan y ke dalam bagian training dan testing. Bagian testing 25% dari jumlah entri data.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
3. Langkah selanjutnya saya akan membuat model menggunakan Linear Regression, saya melaukan inisialisasi model, fit, dan kemudian evaluasi model dengan menggunakan confusion matrix.
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
# Inisiasi model logreg
logreg = LogisticRegression()
# fit the model with data
logreg.fit(X_train, y_train)
# Predict model
y_pred = logreg.predict(X_test)
# Evaluasi model menggunakan confusion matrix
cnf_matrix = confusion_matrix(y_test, y_pred)
print('Confusion Matrix:\n', cnf_matrix)
4. Confusion matrix yang telah dihitung sebelumnya dapat divisualisasikan dengan menggunakan heatmap dari seaborn. Untuk itu akan saya tampilkan visualisasi dari confusion matrix ini
Selesai... Akhirnya selesai sudah Proyek ini Ini adalah bagian terakhir dari DQLab- Data Analyst Career Track Series. Tidak terasa seluruh materi dalam Data Analyst Career Track telah selesai kupelajari dengan baik. Ini adalah permulaan agar aku dapat melangkah menjadi seorang data analyst.
Terima kasih pembaca telah membaca sampai selesai.
Optional : Saya juga dapat mengimport nya menggunakan file spearsheet yang ada sini