Penjelasan
Keempat skrip pakai setup yang sama: baca CSV, buat order_month, filter Desember 2019, ambil lima brand teratas ke dataset_top5brand_dec.
from pathlib import Path import matplotlib.pyplot as plt import pandas as pd
pandas baca dan olah tabel, matplotlib.pyplot gambar grafik, pathlib cari CSV relatif ke posisi skrip. Matplotlib baru dipakai dari tugas 2.
csv_path = Path(__file__).resolve().parents[2] / "retail_raw_reduced.csv" dataset = pd.read_csv(csv_path)
Path(__file__) = lokasi skrip. parents[2] naik dua folder ke sains-data, tempat retail_raw_reduced.csv. pd.read_csv() muat isinya ke dataset.
dataset['order_date'] = pd.to_datetime(dataset['order_date'])
dataset['order_month'] = dataset['order_date'].dt.strftime('%Y-%m')
order_date di-parse ke datetime, lalu order_month disimpan sebagai YYYY-MM (misalnya 2019-12). Filter Desember cukup order_month == '2019-12'.
1. Menentukan brand top 5
python3 tugas-1.py
Lima brand quantity tertinggi Desember 2019. Filter masuk dataset_top5brand_dec.
top_brands = (dataset[dataset['order_month'] == '2019-12'].groupby('brand')['quantity']
.sum()
.reset_index()
.sort_values(by='quantity', ascending=False)
.head(5))
Jumlahkan quantity Desember 2019 per brand, urutkan menurun, head(5) ambil lima teratas.
dataset_top5brand_dec = dataset[(dataset['order_month'] == '2019-12') &
(dataset['brand'].isin(top_brands['brand'].to_list()))]
print(top_brands)
dataset_top5brand_dec = transaksi Desember dari brand-brand itu saja. print(top_brands) cetak brand dan total quantity.
2. Multi-line chart daily quantity
python3 tugas-2.py
Garis quantity harian Desember 2019, satu garis per brand top 5. Lonjakan ditandai annotation merah.
top_brands = (dataset[dataset['order_month'] == '2019-12'].groupby('brand')['quantity']
.sum()
.reset_index()
.sort_values(by='quantity', ascending=False)
.head(5))
dataset_top5brand_dec = dataset[(dataset['order_month'] == '2019-12') &
(dataset['brand'].isin(top_brands['brand'].to_list()))]
Filter brand: copy dari tugas 1.
dataset_top5brand_dec.groupby(['order_date','brand'])['quantity'].sum().unstack().plot(marker='.', cmap='plasma')
groupby order_date dan brand, jumlahkan quantity. unstack() ubah tiap brand jadi kolom, jadi plot keluar lima garis. marker="." titik harian, cmap="plasma" beda warna per brand.
plt.title('Daily Sold Quantity Dec 2019 - Breakdown by Brands', loc='center', pad=30, fontsize=15, color='blue')
plt.xlabel('Order Date', fontsize=12)
plt.ylabel('Quantity', fontsize=12)
plt.grid(color='darkgray', linestyle=':', linewidth=0.5)
plt.ylim(ymin=0)
plt.legend(loc='upper center', bbox_to_anchor=(1.1, 1), shadow=True, ncol=1)
Judul dan label ikut slide. Grid putus-putus bantu baca skala. y mulai dari 0. Legend di kanan atas (bbox_to_anchor=(1.1, 1)) biar tidak nutup garis.
plt.annotate('Terjadi lonjakan', xy=(7, 310), xytext=(8, 300),
weight='bold', color='red',
arrowprops=dict(arrowstyle='->',
connectionstyle="arc3",
color='red'))
Panah merah ke (7, 310), sesuai lonjakan di slide (sekitar tanggal 8, quantity ~310). Teks "Terjadi lonjakan" di (8, 300).
plt.gcf().set_size_inches(10, 5) plt.tight_layout() plt.show()
Figure 10 × 5 inci. tight_layout rapikan ruang judul, label, legend.
3. Bar chart produk per brand
python3 tugas-3.py
Bar product_id unik per brand top 5, Desember 2019, urut menurun.
top_brands = (dataset[dataset['order_month'] == '2019-12'].groupby('brand')['quantity']
.sum()
.reset_index()
.sort_values(by='quantity', ascending=False)
.head(5))
dataset_top5brand_dec = dataset[(dataset['order_month'] == '2019-12') &
(dataset['brand'].isin(top_brands['brand'].to_list()))]
Blok filter brand sama seperti tugas 1.
plt.clf()
dataset_top5brand_dec.groupby("brand")["product_id"].nunique().sort_values(ascending=False).plot(
kind="bar",
color='green')
plt.clf() kosongkan figure. groupby brand, nunique() hitung product_id unik, urut menurun, plot bar hijau.
plt.title("Jumlah Unique Product Terjual - Top 5 Brands (Desember 2019)", loc='center', fontsize=15, pad=30, color='blue')
plt.xlabel("Brand", fontsize=15)
plt.ylabel("Jumlah Unique Product", fontsize=15)
plt.ylim(ymin=0)
plt.xticks(rotation=0)
plt.show()
Judul pakai teks slide. y mulai 0, label brand x tidak diputar (rotation=0).
4. Stacked bar, >= 100 vs < 100
python3 tugas-4.py
Produk per brand top 5 (Desember 2019), dibagi quantity >= 100 vs < 100. Urutan brand = jumlah produk unik terbanyak dulu.
top_brands = (dataset[dataset['order_month'] == '2019-12'].groupby('brand')['quantity']
.sum()
.reset_index()
.sort_values(by='quantity', ascending=False)
.head(5))
dataset_top5brand_dec = dataset[(dataset['order_month'] == '2019-12') &
(dataset['brand'].isin(top_brands['brand'].to_list()))]
Filter brand ulang, sama seperti tugas 1.
dataset_top5brand_dec_per_product = dataset_top5brand_dec.groupby(['brand','product_id'])['quantity'].sum().reset_index()
groupby brand dan product_id, jumlahkan quantity. Satu baris = total quantity satu produk di satu brand selama Desember.
dataset_top5brand_dec_per_product['quantity_group'] = \
dataset_top5brand_dec_per_product['quantity'].apply(lambda x: '>= 100' if x >= 100 else '< 100')
dataset_top5brand_dec_per_product.sort_values('quantity', ascending=False, inplace=True)
quantity_group = '>= 100' atau '< 100' dari total quantity produk. sort_values urutkan dari quantity terbesar.
s_sort = dataset_top5brand_dec_per_product.groupby(['brand'])['product_id'].nunique().sort_values(ascending=False)
s_sort = jumlah product_id unik per brand, urut menurun. Urutan ini dipakai stacked bar, sama seperti tugas 3 (bukan alfabet).
dataset_top5brand_dec_per_product.groupby(['brand','quantity_group'])['product_id'].nunique().unstack().reindex(index=s_sort.index, level='brand').plot(kind='bar', stacked=True)
groupby brand dan quantity_group, nunique() hitung produk per kelompok. unstack() pisah >= 100 dan < 100 jadi kolom, reindex ikut s_sort, plot stacked bar.
plt.title('Number of Sold Products per Brand, December 2019', loc='center', pad=30, fontsize=15, color='blue')
plt.xlabel('Brand', fontsize=15)
plt.ylabel('Number of Products', fontsize=15)
plt.ylim(ymin=0)
plt.xticks(rotation=0)
plt.show()
Judul dan label ikut slide. y mulai 0, label brand x tidak diputar.