MySkill Intensive Bootcamp Data Analisis Phyton Excercise
Link Excercise 1, Excercise SQL
Link Excercise 2, Excercise Looker Studio
Python adalah sebuah bahasa pemrograman yang digunakan untuk membuat aplikasi, perintah komputer, dan melakukan analisis data (1). Pada Python, terdapat yang namanya library. Library Python ini akan membawahi berbagai fungsi yang ada. Sehingga ketika kita ingin menggunakan sebuah fungsi, maka kita harus memanggil library yang membawahinya terlebih dahulu (2).
Di excercise phyton ini saya akan menggunakan Goggle Colab. Google Colab adalah software yang disediakan oleh google yang memungkinkan kita untuk menjalankan dan mengeksekusi kode Python secara online.
Tabel
berikut adalah tabel yang akan dipakai dalam excercise phyton ini
Soal dan Jawaban
full coding di colab dapat dilihat disini.
Sebelum menjawab soal, kita harus mengimport terlebih dahulu library yang akan digunakan pada excercise phyton ini. Library yang akan kita pakai pada excercise ini adalah pandas, numpy, matplotlib, dan seaborn yang dapat dilihat pada coding berikut.
#list libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pandas.tseries.offsets import BDay
Kemudian, kita harus memasukkan dataset yang akan kita gunakan. Dataset dapat kita masukkan melalui cara seperti berikut.
#Sumber data yang digunakan
path_od = "https://raw.githubusercontent.com/dataskillsboost/myskill/main/order_detail.csv"
path_pd = "https://raw.githubusercontent.com/dataskillsboost/myskill/main/payment_detail.csv"
path_cd = "https://raw.githubusercontent.com/dataskillsboost/myskill/main/customer_detail.csv"
path_sd = "https://raw.githubusercontent.com/dataskillsboost/myskill/main/sku_detail.csv"
df_od = pd.read_csv(path_od)
df_pd = pd.read_csv(path_pd)
df_cd = pd.read_csv(path_cd)
df_sd = pd.read_csv(path_sd)
setelah melakukan step ini maka kita siap untuk menjawab pertanyaan excercise phyton yang ada.
Nomor 1
Dear Data Analyst,
Akhir tahun ini, perusahaan akan memberikan hadiah bagi pelanggan yang memenangkan kompetisi Festival Akhir Tahun. Tim Marketing membutuhkan bantuan untuk menentukan perkiraan hadiah yang akan diberikan pada pemenang kompetisi nantinya. Hadiah tersebut akan diambil dari TOP 5 Produk dari Kategori Mobiles & Tablets selama tahun 2022, dengan jumlah kuantitas penjualan (valid = 1) paling tinggi.
Mohon bantuan, untuk mengirimkan data tersebut sebelum akhir bulan ini ke Tim Marketing. Atas bantuan yang diberikan, kami mengucapkan terima kasih.
Regards
Tim Marketing
Dari pertanyaan diatas dapat kita diminta untuk menampilkan TOP 5 Produk dari Kategori Mobiles & Tablets selama tahun 2022, dengan jumlah kuantitas penjualan (valid = 1) paling tinggi. Sehingga dapat kita buat coding pyton seperti.
#Top 5 Mobiles & Tablets 2022
#Menyimpan data dalam bentuk Pandas DataFrame
data1 = pd.DataFrame(\
#Memfilter data dengan valid=1
df[(df['is_valid']==1) &\
#Memfilter data dengan Category = Mobiles & Tablets
(df['category']=='Mobiles & Tablets') &\
#Memfilter data pada transaksi selama 2022
((df['order_date'] >= '2022-01-01') & (df['order_date'] <= '2022-12-31'))]\
#Mengelompokan data
.groupby(by=["sku_name"])["qty_ordered"]\
#Pengelompokan berdasarkan penjumlahan
.sum()\
#Mengurutkan data
.sort_values(ascending=False)\
#Mengambil TOP 5 Produk
.head(5)\
#Mereset nama header
.reset_index(name='qty_2022'))
data1
Setelah mendapatkan data tersebut, kita dapat membuat grafik dengan coding berikut.
#Sort data untuk dapat digunakan sebagai grafik
data1.sort_values(\
by=['qty_2022'], \
ascending=True,\
inplace=True)
#Membuat grafik
data1.plot(x='sku_name',
y=['qty_2022'],
kind='barh',
grid = True,
xlabel = 'Quantity',
ylabel = 'Product Name',
figsize=(12,7),
rot = 0,
title = 'TOP 5 Product',
table = False,
sort_columns = False,
secondary_y = False)
Yang menghasilkan grafik seperti berikut.
Nomor 2 & 3
Dear Data Analyst,
Menindaklanjuti meeting gabungan Tim Werehouse dan Tim Marketing, kami menemukan bahwa ketersediaan stock produk dengan Kategori Beauty & Grooming pada akhir 2022 kemarin masih banyak.
- Kami mohon bantuan untuk melakukan pengecekan data penjualan kategori tersebut dengan tahun 2021 secara kuantitas penjualan. Dugaan sementara kami, telah terjadi penurunan kuantitas penjualan pada 2022 dibandingkan 2021. (Mohon juga menampilkan data ke-15 kategori)
- Apabila memang terjadi penurunan kuantitas penjualan pada kategori Beauty & Grooming, kami mohon bantuan untuk menyediakan data TOP 20 nama produk yang mengalami penurunan paling tinggi pada 2022 jika dibanding dengan 2021. Hal ini kami gunakan sebagai bahan diskusi pada meeting selanjutnya.
Mohon bantuan untuk mengirimkan data tersebut paling lambat 4 hari dari hari ini. Atas bantuan yang diberikan, kami mengucapkan terima kasih.
Regards
Tim Werehouse
Pada pertanyaan no 2 kita diminta untuk menampilkan growth tiap kategori secara kuantitas penjualan dari tahun 2021 sampai tahun 2022. sehingga dapat kita buat coding seperti.
#Kuantitas 2021
#Menyimpan data dalam bentuk Pandas DataFrame
data2 = pd.DataFrame(\
#Memfilter data dengan valid=1
df[(df['is_valid']==1) &\
#Memfilter data pada transaksi selama 2021
((df['order_date'] >= '2021-01-01') & (df['order_date'] <= '2021-12-31'))]\
#Mengelompokan data
.groupby(by=["category"])["qty_ordered"]\
#Pengelompokan berdasarkan penjumlahan
.sum()\
#Mengurutkan data
.sort_values(ascending=False)\
#Mereset nama header
.reset_index(name='qty_2021'))
data2
#Kuantitas 2022
#Menyimpan data dalam bentuk Pandas DataFrame
data3 = pd.DataFrame(\
#Memfilter data dengan valid=1
df[(df['is_valid']==1) &\
#Memfilter data pada transaksi selama 2022
((df['order_date'] >= '2022-01-01') & (df['order_date'] <= '2022-12-31'))]\
#Mengelompokan data
.groupby(by=["category"])["qty_ordered"]\
#Pengelompokan berdasarkan penjumlahan
.sum()\
#Mengurutkan data
.sort_values(ascending=False)\
#Mereset nama header
.reset_index(name='qty_2022'))
data3
#penggabungan kuantitas 2021 dengan 2022
data4 = data2.merge(data3, left_on = 'category', right_on = 'category')
data4
#perhitungan growth kategori dari 2021 sampai 2022
#Growth = tahun terakhir - tahun sebelumnya
data4['qty_growth']=data4['qty_2022']-data4['qty_2021']
data4.sort_values(by=['qty_growth'],ascending=True,inplace=True)
data4
sehingga menghasilkan data sebagai berikut
Pada pertanyaan no 3, jika terjadi penurunan growth pada kategori Beauty & Grooming, maka tampilkan TOP 20 produk yang mengalami penurunan paling tinggi. sehingga dapat kita buat coding seperti.
#kuantitas produk Beauty & Grooming 2021
#Menyimpan data dalam bentuk Pandas DataFrame
data5 = pd.DataFrame(\
#Memfilter data dengan valid=1
df[(df['is_valid']==1) &\
# Memfilter data pada category Beauty & Grooming
(df['category']=='Beauty & Grooming') &\
#Memfilter data pada transaksi selama 2021
((df['order_date'] >= '2021-01-01') & (df['order_date'] <= '2021-12-31'))]\
#Mengelompokan data
.groupby(by=["sku_name"])["qty_ordered"]\
#Pengelompokan berdasarkan penjumlahan
.sum()\
#Mengurutkan data
.sort_values(ascending=False)\
#Mereset nama header
.reset_index(name='qty_bg_2021'))
data5
#kuantitas produk Beauty & Grooming 2022
#Menyimpan data dalam bentuk Pandas DataFrame
data6 = pd.DataFrame(\
#Memfilter data dengan valid=1
df[(df['is_valid']==1) &\
(df['category']=='Beauty & Grooming') &\
#Memfilter data pada transaksi selama 2022
((df['order_date'] >= '2022-01-01') & (df['order_date'] <= '2022-12-31'))]\
#Mengelompokan data
.groupby(by=["sku_name"])["qty_ordered"]\
#Pengelompokan berdasarkan penjumlahan
.sum()\
#Mengurutkan data
.sort_values(ascending=False)\
#Mereset nama header
.reset_index(name='qty_bg_2022'))
data6
#Menggabungkan data dan perhitungan growth 2021–2022
data7 = data5.merge(data6, left_on = 'sku_name', right_on = 'sku_name')
data7['qty_bg_growth']=data7['qty_bg_2022']-data7['qty_bg_2021']
data7.sort_values(by=['qty_bg_growth'],ascending=True,inplace=True)
data7 = data7.head(20)
data7
Sehingga akan menghasilkan data sebagai berikut.
Nomor 4
Dear Data Analyst,
Terkait ulang tahun perusahaan pada 2 bulan mendatang, Tim Digital Marketing akan memberikan informasi promo bagi pelanggan pada akhir bulan ini. Kriteria pelanggan yang akan kami butuhkan adalah mereka yang sudah melakukan check-out namun belum melakukan pembayaran (is_gross = 1) selama tahun 2022. Data yang kami butuhkan adalah ID Customer dan Registered Date.
Mohon bantuan, untuk mengirimkan data tersebut sebelum akhir bulan ini ke Tim Digital Marketing. Atas bantuan yang diberikan, kami mengucapkan terima kasih.
Regards
Tim Digital Marketing
Pada pertanyaan no 4, kita diminta untuk menampilkan Customer ID dan Registered Date customer yang sudah melakukan check-out namun belum melakukan pembayaran (is_gross = 1) selama tahun 2022. pada pertanyaan ini diminta untuk menghasilkan output berupa file csv. sehingga dapat kita buat coding seperti
#filterring data yang mau ditampilkan
#Menyimpan data dalam bentuk Pandas DataFrame
data8 = df[\
#Memfilter data dengan gross=1
(df['is_gross']==1) &\
#Memfilter data dengan valid=0
(df['is_valid']==0) &\
#Memfilter data dengan net=0
(df['is_net']==0) &\
#Memfilter data pada transaksi selama 2022
((df['order_date'] >= '2022-01-01') & (df['order_date'] <= '2022-12-31'))]
#menampilkan data customer_id dan registered_date
data9 = data8[['customer_id','registered_date']]
data9
sehingga kita mendapatkan data seperti
dan untuk mendapatkan file csv kita dapat menggunakan coding seperti berikut
#ekstrak data as csv
from google.colab import files
data9.to_csv('audience_list.csv', encoding = 'utf-8-sig',index=False)
files.download('audience_list.csv')
Nomor 5 & 6
Dear Data Analyst,
Bulan depan kami akan membuat Laporan Tahunan yang akan kami sampaikan ke Investor, terkait hal tersebut mohon sediakan data berikut:
- Profit Growth (%) secara keseluruhan tahun 2021 vs 2022 sebagai hasil kinerja tahunan penjualan.
- Profit Growth (%) berdasarkan Kategori produk tahun 2021 vs 2022.
Mohon bantuan untuk mengirimkan data tersebut paling lambat besok. Atas bantuan yang diberikan, kami mengucapkan terima kasih.
Regards
Board of Director (BOD)
Pada pertanyaan no 5 kita diminta untuk menampilkan profit growth keseluruhan pada tahun 2021 vs 2022. sehingga dapat kita buat coding seperti berikut
#mendefinisikan perhitungan profit
df['profit'] = df['after_discount'] - df['cogs']
#mengambil data 2022
#Menyimpan data dalam bentuk Pandas DataFrame
data10 = df[\
#Memfilter data dengan valid=1
(df['is_valid']==1) &\
#Memfilter data pada transaksi selama 2022
((df['order_date'] >= '2022-01-01') & (df['order_date'] <= '2022-12-31'))]
data10.head()
#mengambil data 2021
#Menyimpan data dalam bentuk Pandas DataFrame
data11 = df[\
#Memfilter data dengan valid=1
(df['is_valid']==1) &\
#Memfilter data pada transaksi selama 2021
((df['order_date'] >= '2021-01-01') & (df['order_date'] <= '2021-12-31'))]
data11.head()
#perhitugan profit 2021 dan 2022
#Membuat Dataframe dan Summary
data12 = {\
'Periode Profit':'Total',\
'2021': data11['profit'].sum(), \
'2022': data10['profit'].sum(),\
'Growth (Value)': data10['profit'].sum() - data11['profit'].sum(),\
'Growth': pd.Series(round(((data10['profit'].sum() - data11['profit'].sum())/data11['profit'].sum())*100,2), dtype=str)+'%'
}
pd.DataFrame(data=data12, index=[0])
Sehingga kita mendapatkan data seperti berikut
Pada pertanyaan no 6, kita diminta untuk menampilkan profit 2021–2022 per kategori dalam bentuk grafik. sehingga dapat kita buat coding seperti berikut
#profit kategori 2022
#Menggunakan Groupby untuk menjumlahkan
data13 = pd.DataFrame(data10\
.groupby(by="category")["profit"].sum()\
.sort_values(ascending=False)\
.reset_index(name='profit_2022'))
data13
#profit kategori 2021
data14 = pd.DataFrame(data11\
.groupby(by="category")["profit"].sum()\
.sort_values(ascending=False)\
.reset_index(name='profit_2021'))
data14
#Menggabungkan data kategori 2021 dan 2022
data15 = data14.merge(data13, left_on = 'category', right_on = 'category')
data15
#Kalkulasi growth per kategori dari 2021–2022
#Melakukan kalkulasi
data15['Growth (Value)'] = data15['profit_2022']-data15['profit_2021']
data15['Growth (%)'] = round(data15['Growth (Value)']/data15['profit_2021']*100,2)
data15.sort_values(by=['Growth (%)'], ascending = False, inplace = True)
data15
#Membuat grafik
data15.plot(x='category',
y=['Growth (%)'],
kind='bar',
grid = True,
title = 'Growth 2021 vs 2022',
xlabel = 'Category',
ylabel = 'Growth (%)',
figsize=(12,7),
rot = 90,
table = False,
sort_columns = False,
secondary_y = False)
Sehingga kita mendapatkan grafik seperti berikut
Nomor 7 & 8
Dear Data Analyst,
Pada bulan October hingga Desember 2022, kami melakukan campaign setiap hari Sabtu dan Minggu. Kami hendak menilai, apakah campaign tersebut cukup berdampak pada kenaikan penjualan (before_discount). Mohon bantuan untuk menampilkan data:
- Rata-rata harian penjualan weekends (Sabtu dan Minggu) vs rata-rata harian penjualan weekdays (Senin-Jumat) per bulan tersebut. Apakah ada peningkatan penjualan pada masing-masing bulan tersebut.
- Rata-rata harian penjualan weekends (Sabtu dan Minggu) vs rata-rata harian penjualan weekdays (Senin-Jumat) keseluruhan 3 bulan tersebut.
Mohon bantuan untuk mengirimkan data tersebut paling lambat minggu depan. Atas bantuan yang diberikan, kami mengucapkan terima kasih.
Regards
Tim Campaign
Pada pertanyaan no 7, kita diminta untuk membuat grafik perbandinggan penjualan pada weekends (Sabtu dan Minggu) dengan weekdays (Senin-Jumat) dari bulan Oktober-Desember 2022. Sehingga kita dapat membuat grafik seperti berikut.
#Membuat kolom tambahan untuk day, month, month_num
df['day']=df['order_date'].dt.day_name()
df['month']=df['order_date'].dt.month_name()
df['month_num']=df['order_date'].dt.month
df.head(5)
#perhitungan average profit weekend
data16 = pd.DataFrame(df[(df['is_valid']==1) \
& (df['day'].isin(['Saturday','Sunday']))\
& (df['order_date'] >= '2022-10-01') & (df['order_date'] <= '2022-12-31')]\
.groupby(by=["month_num","month"])["before_discount"].mean()\
.round()\
.sort_values(ascending=False)\
.reset_index(name='avg_profit_weekend'))
data16
#perhitungan average profit weekdays
data17 = pd.DataFrame(df[(df['is_valid']==1) \
& (df['day'].isin(['Monday','Tuesday','Wednesday','Thusday','Friday']))\
& (df['order_date'] >= '2022-10-01') & (df['order_date'] <= '2022-12-31')]\
.groupby(by=["month_num","month"])["before_discount"].mean()\
.sort_values(ascending=False)\
.round()\
.reset_index(name='avg_profit_weekdays'))
data17
#penggabungan data profit weekdays dengan weekends
data18 = data16.merge(data17, left_on = 'month', right_on = 'month')
data18.sort_values(by='month_num_x',ascending=True, inplace=True)
data18 = data18[["month","avg_profit_weekend","avg_profit_weekdays"]]
data18
#Membuat grafik
data18.plot(x='month',
y=['avg_profit_weekend','avg_profit_weekdays'],
kind='bar',
grid = True,
xlabel = 'Category',
ylabel = 'Total',
figsize=(12,7),
rot = 90,
table = False,
secondary_y = False)
Sehingga kita mendapatkan grafik seperti berikut.
Pada pertanyaan no 8, kita diminta untuk menampilkan perbandinggan keseluruhan penjualan pada weekends (Sabtu dan Minggu) dengan weekdays (Senin-Jumat) dari bulan Oktober-Desember 2022. Sehingga kita dapat membuat coding seperti berikut.
#Perhitungan profit weekends
#Menyimpan data dalam bentuk Pandas DataFrame
data19 = df[\
#Memfilter data dengan valid=1
(df['is_valid']==1) &\
(df['day'].isin(['Saturday','Sunday'])) &\
#Memfilter data pada transaksi selama 2022
((df['order_date'] >= '2022-10-01') & (df['order_date'] <= '2022-12-31'))]
data19
#Perhitungan profit weekdays
#Menyimpan data dalam bentuk Pandas DataFrame
data20 = df[\
#Memfilter data dengan valid=1
(df['is_valid']==1) &\
(df['day'].isin(['Monday','Tuesday','Wednesday','Thusday','Friday'])) &\
#Memfilter data pada transaksi selama 2022
((df['order_date'] >= '2022-10-01') & (df['order_date'] <= '2022-12-31'))]
#Penggabungan data dan perhitungan growth
data21 = {\
'Periode':'Total 3 months',\
'Avg Weekend Sales': round(data19['before_discount'].mean(),2), \
'Avg Weekdays Sales': round(data20['before_discount'].mean(),2),\
'Diff (Value)': round(data19['before_discount'].mean() - data20['before_discount'].mean(),2),\
'Diff (%)': pd.Series(round(((data19['before_discount'].mean() - data20['before_discount'].mean())/data19['before_discount'].mean())*100,2), dtype=str)+'%'
}
pd.DataFrame(data=data21, index=[0])
Sehingga kita mendapatkan data sebagai berikut
Nomor 9 & 10
Dear Data Analyst,
Guna mengetahui kemampuan beli pelanggan, kami membutuhkan data:
- AOV (Average Order Value atau Total sales / Total Order) tiap bulan selama tahun 2021 vs 2022.
- AOV tahun 2021 vs 2022.
Atas bantuan yang diberikan, kami mengucapkan terima kasih
Regards
Tim Campaign
Pada pertanyaan no 9 kita diminta membuat grafik dari AOV tiap bulan pada tahun 2021 vs 2022. sehingga kita dapat membuat coding seperti berikut
# Total Sales 2022
data22 = pd.DataFrame(df[(df['is_valid']==1) & ((df['order_date'] >= '2022-01-01') & (df['order_date'] <= '2022-12-31'))]\
.groupby(by=['month_num','month'])["after_discount"].sum()\
.round()\
.reset_index(name='sales_2022'))\
.sort_values(by=['month_num'],ascending=True)\
.head(12)
data22
# Total Unique Order 2022
data23 = pd.DataFrame(df[(df['is_valid']==1) & ((df['order_date'] >= '2022-01-01') & (df['order_date'] <= '2022-12-31'))]\
.groupby(by=['month_num','month'])["id"].nunique()\
.round()\
.reset_index(name='order_2022'))\
.sort_values(by=['month_num'],ascending=True)\
.head(12)
data23
# Total Sales 2021
data24 = pd.DataFrame(df[(df['is_valid']==1) & ((df['order_date'] >= '2021-01-01') & (df['order_date'] <= '2021-12-31'))]\
.groupby(by=['month_num','month'])["after_discount"].sum()\
.round()\
.reset_index(name='sales_2021'))\
.sort_values(by=['month_num'],ascending=True)\
.head(12)
data24
# Total Unique Order 2021
data25 = pd.DataFrame(df[(df['is_valid']==1) & ((df['order_date'] >= '2021-01-01') & (df['order_date'] <= '2021-12-31'))]\
.groupby(by=['month_num','month'])["id"].nunique()\
.round()\
.reset_index(name='order_2021'))\
.sort_values(by=['month_num'],ascending=True)\
.head(12)
data25
#import library sqlite3 agar dapat menjalankan sql query
from sqlite3 import connect
conn = connect(':memory:')
data22.to_sql('sales_2022', conn, index=False, if_exists='replace')
data23.to_sql('order_2022', conn, index=False, if_exists='replace')
data24.to_sql('sales_2021', conn, index=False, if_exists='replace')
data25.to_sql('order_2021', conn, index=False, if_exists='replace')
#Penggabungan data menggunakan sql query
data26 = pd.read_sql("""
SELECT
sales_2021.*,
order_2021.order_2021,
sales_2022.sales_2022,
order_2022.order_2022
FROM sales_2022
LEFT JOIN order_2022
on order_2022.month_num = sales_2022.month_num
LEFT JOIN sales_2021
on sales_2021.month_num = sales_2022.month_num
LEFT JOIN order_2021
on order_2021.month_num = sales_2022.month_num
""", conn)
data26
#Data AOV pertahun dan selisih nominal dan persentase
data26['AOV 2021'] = round(data26['sales_2021']/data26['order_2021'],2)
data26['AOV 2022'] = round(data26['sales_2022']/data26['order_2022'],2)
data26['Diff AOV (value)']= data26['AOV 2022']-data26['AOV 2021']
data26['Diff AOV (%)'] = round((data26['AOV 2022']-data26['AOV 2021'])/data26['AOV 2021']*100,2)
data26
#membuat grafik
data26.plot(x='month',
y=['AOV 2021','AOV 2022'],
kind='bar',
grid = True,
xlabel = 'Month',
ylabel = 'AOV',
figsize=(12,7),
rot = 90,
table = False,
secondary_y = False)
Sehingga kita mendapatkan grafik berikut
Pada pertanyaan no 10 kita diminta untuk menampilkan AOV keseluruhan pada tahun 2021 dan 2022 beserta nominal dan persentase growth nya. sehingga dapat kita buat coding seperti berikut
#Perhitungan AOV 2021, AOV 2022, nominal growth dan persentase growth
aov_2021 = round(data26['sales_2021'].sum()/data26['order_2021'].sum(),2)
aov_2022 = round(data26['sales_2022'].sum()/data26['order_2022'].sum(),2)
data27 = {\
'Periode':'Total',\
'AOV 2021': aov_2021, \
'AOV 2022': aov_2022, \
'Growth (value)': aov_2022-aov_2021,\
'Growth': pd.Series(round((aov_2022-aov_2021)/aov_2021*100,2), dtype=str)+'%'
}
pd.DataFrame(data=data27, index=[0])
Sehingga menghasilkan data sebagai berikut
Demikianlah jawaban dan sedikit penjelasan dari saya terhadap Phyton Excercise Bootcamp ini, Terima Kasih.