Judul: Coffee Chain
Format: .xlsx
Deskripsi: Dataset terdiri dari 4.248 baris dan 20
kolom.
Kolom:
- Area Code: Kode Wilayah
- Date: Waktu
- Market: Wilayah
- Market Size: Ukuran Market
- Product: Nama Produk
- Product Line: Lini Produk
- Product Type: Tipe Produk
- State: Provinsi
- Type: Varian Produk
- Budget COGS (Cost of Goods Sold): Estimasi
Biaya Pokok Penjualan
- Budget Margin: Estimasi Laba Kotor
- Budget Profit: Estimasi Laba Bersih
- Budget Sales: Estimasi Penjualan
- COGS (Cost of Goods Sold): Biaya Pokok
Penjualan
- Inventory: Stok Bahan Baku
- Margin: Laba Kotor Aktual
- Marketing: Biaya Pemasaran
- Profit: Laba Bersih Aktual (Margin - Total
Expenses)
- Sales: Penjualan
- Total Expenses: Total Biaya (Margin -
Profit)
df <-read_xlsx(
here('dataset', '1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx'),
sheet = 1,
col_names = T,
na = c('', ' ', 'NA', 'NULL', 'na', 'null'),
trim_ws = T,
progress = T
)
glimpse(df)
## Rows: 4,248
## Columns: 20
## $ `Area Code` <dbl> 719, 970, 970, 303, 303, 720, 970, 719, 970, 719, 303…
## $ Date <dttm> 2012-01-01, 2012-01-01, 2012-01-01, 2012-01-01, 2012…
## $ Market <chr> "Central", "Central", "Central", "Central", "Central"…
## $ `Market Size` <chr> "Major Market", "Major Market", "Major Market", "Majo…
## $ Product <chr> "Amaretto", "Colombian", "Decaf Irish Cream", "Green …
## $ `Product Line` <chr> "Beans", "Beans", "Beans", "Leaves", "Beans", "Beans"…
## $ `Product Type` <chr> "Coffee", "Coffee", "Coffee", "Tea", "Espresso", "Esp…
## $ State <chr> "Colorado", "Colorado", "Colorado", "Colorado", "Colo…
## $ Type <chr> "Regular", "Regular", "Decaf", "Regular", "Regular", …
## $ `Budget COGS` <dbl> 90, 80, 100, 30, 60, 80, 140, 50, 50, 40, 50, 150, 10…
## $ `Budget Margin` <dbl> 130, 110, 140, 50, 90, 130, 160, 80, 70, 70, 70, 210,…
## $ `Budget Profit` <dbl> 100, 80, 110, 30, 70, 80, 110, 20, 40, 20, 40, 130, 1…
## $ `Budget Sales` <dbl> 220, 190, 240, 80, 150, 210, 300, 130, 120, 110, 120,…
## $ COGS <dbl> 89, 83, 95, 44, 54, 72, 170, 63, 60, 58, 64, 144, 95,…
## $ Inventory <dbl> 777, 623, 821, 623, 456, 558, 1091, 435, 336, 338, 96…
## $ Margin <dbl> 130, 107, 139, 56, 80, 108, 171, 87, 80, 72, 76, 201,…
## $ Marketing <dbl> 24, 27, 26, 14, 15, 23, 47, 57, 19, 22, 19, 47, 30, 7…
## $ Profit <dbl> 94, 68, 101, 30, 54, 53, 99, 0, 33, 17, 36, 111, 87, …
## $ Sales <dbl> 219, 190, 234, 100, 134, 180, 341, 150, 140, 130, 140…
## $ `Total Expenses` <dbl> 36, 39, 38, 26, 26, 55, 72, 87, 47, 55, 40, 90, 52, 1…
df %>%
summarise(total_null = sum(is.na(df)))
df %>%
summarise(total_duplicate = sum(duplicated(df)))
df <-df %>%
mutate(
Date = as.Date(Date)
)
glimpse(df)
## Rows: 4,248
## Columns: 20
## $ `Area Code` <dbl> 719, 970, 970, 303, 303, 720, 970, 719, 970, 719, 303…
## $ Date <date> 2012-01-01, 2012-01-01, 2012-01-01, 2012-01-01, 2012…
## $ Market <chr> "Central", "Central", "Central", "Central", "Central"…
## $ `Market Size` <chr> "Major Market", "Major Market", "Major Market", "Majo…
## $ Product <chr> "Amaretto", "Colombian", "Decaf Irish Cream", "Green …
## $ `Product Line` <chr> "Beans", "Beans", "Beans", "Leaves", "Beans", "Beans"…
## $ `Product Type` <chr> "Coffee", "Coffee", "Coffee", "Tea", "Espresso", "Esp…
## $ State <chr> "Colorado", "Colorado", "Colorado", "Colorado", "Colo…
## $ Type <chr> "Regular", "Regular", "Decaf", "Regular", "Regular", …
## $ `Budget COGS` <dbl> 90, 80, 100, 30, 60, 80, 140, 50, 50, 40, 50, 150, 10…
## $ `Budget Margin` <dbl> 130, 110, 140, 50, 90, 130, 160, 80, 70, 70, 70, 210,…
## $ `Budget Profit` <dbl> 100, 80, 110, 30, 70, 80, 110, 20, 40, 20, 40, 130, 1…
## $ `Budget Sales` <dbl> 220, 190, 240, 80, 150, 210, 300, 130, 120, 110, 120,…
## $ COGS <dbl> 89, 83, 95, 44, 54, 72, 170, 63, 60, 58, 64, 144, 95,…
## $ Inventory <dbl> 777, 623, 821, 623, 456, 558, 1091, 435, 336, 338, 96…
## $ Margin <dbl> 130, 107, 139, 56, 80, 108, 171, 87, 80, 72, 76, 201,…
## $ Marketing <dbl> 24, 27, 26, 14, 15, 23, 47, 57, 19, 22, 19, 47, 30, 7…
## $ Profit <dbl> 94, 68, 101, 30, 54, 53, 99, 0, 33, 17, 36, 111, 87, …
## $ Sales <dbl> 219, 190, 234, 100, 134, 180, 341, 150, 140, 130, 140…
## $ `Total Expenses` <dbl> 36, 39, 38, 26, 26, 55, 72, 87, 47, 55, 40, 90, 52, 1…
df <-df %>%
mutate(
Year = year(Date),
Month = month(Date),
Year_Month = format(Date, '%Y-%m'),
.after = Date
)
head(df, 3)
df <-df %>%
mutate(
Margin_vs_Budget = Margin - `Budget Margin`,
Profit_vs_Budget = Profit - `Budget Profit`,
Sales_vs_Budget = Sales - `Budget Sales`
) %>%
relocate(Margin_vs_Budget, .after = Margin) %>%
relocate(Profit_vs_Budget, .after = Profit) %>%
relocate(Sales_vs_Budget, .after = Sales)
head(df, 3)
df %>%
group_by(Year, `Product Line`) %>%
summarise(
Sales = sum(Sales),
Marketing = sum(Marketing),
Margin = sum(Margin),
Profit = sum(Profit),
Profit_Margin = paste0(round(Profit / Sales * 100, 1), '%')
) %>%
ungroup() %>%
mutate(
Profit_Percent = paste0(round(Profit / sum(Profit) * 100, 1), '%')
)
Beans dan Leaves memiliki kinerja baik, profit margin meningkat selama setahun terakhir sebesar ~10% dari masing-masing kedua lini produk. Hal ini menunjukkan peningkatan profitabilitas yang diikuti dengan peningkatan volume penjualan Beans dari 215.220 penjualan menjadi 224.604 penjualan dan Leaves dari 185.939 penjualan menjadi 194.048 penjualan.
Insight: Beans menunjukkan peningkatan profit paling tinggi sehingga dapat menjadi kandidat untuk rencana ekspansi besar, diikuti dengan demand yang tinggi dan meningkat selama setahun. Leaves juga mengalami peningkatan cukup tinggi meskipun masih di bawah Beans, perlu direncanakan untuk melakukan pemasaran yang lebih strategis lagi.
Rekomendasi: Fokus memaksimalkan performa positif dari Beans untuk terus menekan peningkatan volume penjualan dengan tetap memperhatikan traffic pasar agar lebih terukur. Evaluasi kembali lini produk Leaves meskipun volume penjualan dan profit meningkat, pertimbangkan untuk melakukan pemasaran yang strategis seperti mencoba melakukan campaign, diskon, bundling.
ggplot(
data = df %>%
group_by(Year_Month = ym(Year_Month)) %>%
summarise(
Total_Profit = sum(Profit),
Operational_Margin = sum(Margin),
Profit_Percent = (Total_Profit / Operational_Margin) * 100
) %>%
ungroup(),
aes(x = Year_Month, y = Profit_Percent)
) + geom_line(
color = 'skyblue',
linewidth = 1.5
) + labs(
title = 'PROFIT GROWTH',
x = 'Year-Month',
y = 'Profit Percent'
) + geom_text(
aes(label = paste0(round(Profit_Percent, 1), '%')),
vjust = -1,
size = 3,
fontface = 'bold'
) + theme(
panel.background = element_rect(fill = NA),
panel.grid = element_line(color = 'gray'),
plot.background = element_rect(fill = 'white'),
plot.title = element_text(vjust = -6, hjust = 0.5, margin = margin(t = 3, b = 40), size = 14, face = 'bold'),
plot.margin = margin(r = 20),
axis.title.x = element_text(margin = margin(t = 30), vjust = 6, size = 12, face = 'bold'),
axis.text.x = element_text(margin = margin(t = 5), size = 8, face = 'bold'),
axis.title.y = element_text(margin = margin(r = 30), vjust = -6, size = 12, face = 'bold'),
axis.text.y = element_text(margin = margin(r = 5), size = 8, face = 'bold')
)
Garis cenderung stabil selama tahun 2012 dan terdapat
puncak pertumbuhan sebesar 49,5% di kuartal ke-3 tahun
2012. Transisi pergantian tahun 2013 terdapat
lonjakan sangat tinggi sebesar 72,1%,
kemudian naik-turun cenderung fluktuatif. Fluktuatif
terjadi selama satu tahun hingga akhir Desember 2013, namun meskipun
terjadi fluktuatif naik-turun angka profit merosot tidak lebih
dari 6,5%.
Insight: Lonjakan terjadi di pergantian tahun, penyebab kemungkinan adanya nataru dan libur panjang anak sekolah maupun cuti bersama para pekerja. Hal ini sejalan dengan meningkatnya penjualan lini produk.
Rekomendasi: Pertahankan kondisi positif di tahun 2013 untuk terus membuat profit menjadi terus meningkat atau mininal stabil di tahun selanjutnya.
ggplot(
data = df %>%
group_by(Product) %>%
summarise(Total_Sales = sum(Sales)) %>%
arrange(desc(Total_Sales)) %>%
slice_head(n = 10) %>%
mutate(Product = fct_reorder(Product, Total_Sales, .desc = F)),
aes(x = Total_Sales, y = Product)
) + geom_col(
fill = 'skyblue',
color = 'black',
width = 0.6
) + geom_text(
aes(label = scales::comma(Total_Sales)),
hjust = -0.1,
size = 3,
fontface = 'bold'
) + labs(
title = 'TOP 10 PRODUCT BASED ON CONTRIBUTE',
x = 'Total Sales',
y = 'Product',
) + coord_cartesian(
clip = 'off'
) + scale_x_continuous(
labels = scales::comma,
expand = expansion(mult = c(0.01, 0.1))
) + theme(
panel.background = element_rect(fill = 'white'),
plot.background = element_rect(fill = 'white'),
plot.title = element_text(hjust = 0.5, size = 14, face = 'bold', margin = margin(b = 10, t = 20)),
legend.position = 'none',
axis.text.y = element_text(margin = margin(r = 3), size = 12, face = 'bold'),
axis.title.y = element_text(margin = margin(r = 15), vjust = -5, size = 12, face = 'bold'),
axis.text.x = element_text(margin = margin(t = 3), size = 12, face = 'bold'),
axis.title.x = element_text(margin = margin(t = 30), vjust = 8, size = 12, face = 'bold')
)
Colombian, Lemon, Caffe Mocha menjadi tiga
produk produk tertinggi yang memiliki kontribusi baik.
Colombian memimpin jauh dengan total penjualan mencapai
128.311 penjualan, Lemon menyusul di peringkat
kedua dengan 95.926 penjualan. Total penjualan
Caffe Mocha, Decaf Espresso, Chamomile, Darjeeling, Earl Grey, dan
Decaf Irish Cream tidak terlalu jauh selisih jumlah penjualan satu
sama lainnya.
Insight: Caffe Latte dan Mint menjadi produk yang memiliki performa penjualan yang rendah hanya sekitar 35.500 penjualan dari kedua produk tersebut. Hal ini menjadikannya hampir 2x lebih rendah dibanding Decaf Irish Cream yang berada di atasnya dan sekitar 3,5x lebih rendah dari Colombian.
Rekomendasi: Fokus terhadap produk Colombian untuk mempertahankan posisi best seller, tingkatkan performanya atau minimal performa akan tetap stabil. Produk dengan performa menengah untuk dapat dipertimbangkan melakukan campaign atau bundling dengan diskon. Berikan perhatian khusus pada produk Caffe Latte dan Mint untuk dapat memperbaiki performa penjualannya dan lakukan evaluasi terhadap keduanya apakah terdapat masalah khusus yang perlu ditangani.
ggplot(
data = df %>%
summarise(
Budget_Sales = sum(`Budget Sales`),
Sales = sum(Sales)
) %>%
pivot_longer(
cols = c(Budget_Sales, Sales),
names_to = 'Variable',
values_to = 'Value'
) %>%
mutate(
Variable = factor(Variable, levels = c('Budget_Sales', 'Sales'))
),
aes(x = Variable, y = Value, fill = Variable)
) + geom_col(
color = 'black',
width = 0.6
) + scale_fill_manual(
values = c('#A0E9FF', '#A0E9FF')
) + labs(
y = 'Total'
) + geom_text(
aes(label = paste0(scales::comma(Value))),
vjust = -1,
size = 3,
fontface = 'bold'
) + scale_y_continuous(
labels = scales::comma,
expand = expansion(mult = c(0, 0))
) + coord_cartesian(
clip = 'off'
) + theme(
plot.background = element_rect(fill = 'white'),
panel.background = element_rect(fill = 'white'),
legend.position = 'none',
axis.title.x = element_blank(),
axis.text.x = element_text(margin = margin(b = 20, t = 10), size = 12, face = 'bold'),
axis.title.y = element_text(margin = margin(r = 30), vjust = -5, size = 12, face = 'bold'),
axis.text.y = element_text(size = 8, face = 'bold')
) +
ggplot(
data = df %>%
summarise(
Budget_Profit = sum(`Budget Profit`),
Profit = sum(Profit)
) %>%
pivot_longer(
cols = c(Budget_Profit, Profit),
names_to = 'Variable',
values_to = 'Value'
) %>%
mutate(
Variable = factor(Variable, levels = c('Budget_Profit', 'Profit'))
),
aes(x = Variable, y = Value, fill = Variable)
) + geom_col(
color = 'black',
width = 0.6
) + scale_fill_manual(
values = c('#A0E9FF', '#A0E9FF')
) + labs(
y = 'Total'
) + geom_text(
aes(label = paste0(scales::comma(Value))),
vjust = -1,
size = 3,
fontface = 'bold'
) + scale_y_continuous(
labels = scales::comma,
expand = expansion(mult = c(0, 0))
) + coord_cartesian(
clip = 'off'
) + theme(
plot.background = element_rect(fill = 'white'),
panel.background = element_rect(fill = 'white'),
legend.position = 'none',
axis.title.x = element_blank(),
axis.text.x = element_text(margin = margin(b = 20, t = 10), size = 12, face = 'bold'),
axis.title.y = element_text(margin = margin(r = 30), vjust = -5, size = 12, face = 'bold'),
axis.text.y = element_text(size = 8, face = 'bold')
) +
plot_layout(ncol = 2) +
plot_annotation(
title = 'BUDGET VS ACTUAL',
theme = theme(
plot.title = element_text(margin = margin(t = 30, b = 60), hjust = 0.5, size = 14, face = 'bold'),
)
)
Sales aktual melampaui estimasi penjualan yang cukup
signifikan dari yang diharapkan dengan selisih sekitar 76.000
penjualan dari estimasi.
Insight: Total penjualan aktual melampaui estimasi cukup signifikan sekitar 76.000 penjualan, namun profit aktual hanya memiliki selisih <1.000 dari profit yang telah di estimasi dan aktual cenderung tepat dengan hasil estimasi. Hal ini menunjukkan bahwa ada sinyal bahwa margin tertekan atau ada biaya lain yang meningkat.
Rekomendasi: Fokus terhadap produk dengan performa terbaik untuk memastikan ketersediaan dan margin. Optimisasi produk yang memiliki performa menengah karena memiliki potensi, lakukan eksperimen bundling dengan diskon atau cross sell dengan jangka waktu tertentu. Perhatikan langkah pemasaran, jangan sampai justru menekan biaya yang melebihi margin.
ggplot(
data = df,
aes(x = Sales, fill = Market)
) + geom_density(
stat = 'density',
color = 'black',
alpha = 0.6
) + labs(
title = 'SALES DISTRIBUTION BY MARKET'
) + theme(
plot.background = element_rect(fill = 'white'),
panel.background = element_rect(fill = 'white'),
plot.title = element_text(hjust = 0.5, margin = margin(t = 30, b = 60), size = 14, face = 'bold'),
axis.title.x = element_text(margin = margin(b = 30), size = 10, face = 'bold'),
axis.text.x = element_text(margin = margin(b = 30, t = 5), size = 8, face = 'bold'),
axis.title.y = element_text(margin = margin(l = 30), size = 10, face = 'bold'),
axis.text.y = element_text(margin = margin(l = 40, r = 5), size = 8, face = 'bold'),
legend.margin = margin(r = 30),
legend.title = element_text(size = 12, face = 'bold'),
legend.text = element_text(size = 10)
) + scale_fill_manual(
values = c('#0AC4E0', '#FF52A0', '#FF9B51', '#982598')
)
Distribusi penjualan cenderung miring ke kiri. Sales
aktual melampaui estimasi, tapi profit hampir flat sementara distribusi
penjualan per-wilayah menunjukkan hal berbeda. Wilayah
South sangat terkonsentrasi pada penjualan
rendah dengan frekuensi yang tinggi meskipun distribusi wilayah
lain juga cenderung penjualan rendah.
Insight: Penjualan meningkat jauh dari estimasi, namun profit hampir tepat. Hal ini menunjukkan indikasi penurunan margin per-unit atau biaya lain yang menekan. Jika penjualan meningkat, namun jika hanya didorong oleh produk margin rendah tidak akan meningkat sebanding profit yang didapat.
Rekomendasi: Gunakan strategi pemasaran dari tiap wilayah berbeda. South banyak frekuensi penjualan sehingga gunakan strategi paket bundling dibandingkan dengan Central, East, West yang memiliki peluang upsell ke penjualan menengah. Jalankan taktik khusus dengan waktu sekitar 14-28 hari, lakukan 1-2 eksperimen A/B (bundling, product type targeting).
ggplot(
data = df %>%
group_by(Year_Month = ym(Year_Month)) %>%
summarise(
Total_Sales = sum(Sales)
) %>%
ungroup(),
aes(x = Year_Month, y = Total_Sales)
) + geom_line(
color = 'skyblue',
linewidth = 1.5
) + geom_text(
aes(label = paste0(scales::comma(Total_Sales))),
size = 3,
fontface = 'bold'
) + scale_y_continuous(
labels = scales::comma
) + labs(
title = 'SALES GROWTH',
x = 'Year-Month',
y = 'Total Sales'
) + theme(
plot.background = element_rect(fill = 'white'),
panel.background = element_rect(fill = 'white'),
plot.title = element_text(hjust = 0.5, margin = margin(t = 30, b = 10), size = 14, face = 'bold'),
axis.title.x = element_text(margin = margin(b = 25, t = 20), size = 12, face = 'bold'),
axis.text.x = element_text(margin = margin(t = 5), size = 10, face = 'bold'),
axis.title.y = element_text(margin = margin(l = 20), size = 12, face = 'bold'),
axis.text.y = element_text(margin = margin(l = 15, r = 5), size = 10, face = 'bold')
)
Tahun 2012 hingga pertengahan tahun mengalami peningkatan yang sangat
signifikan hingga mencapai puncak penjualan tertinggi
selama 2 tahun dengan total penjualan mencapai 36.161
penjualan. Namun, setelah puncak penjualan justru menurun
drastis hingga hanya mencapai 32.003
penjualan. Pergantian baru kembali membawa angin segar
karena volume penjualan kembali meningkat hingga
35.316 penjualan. Setelahnya hingga akhir tahun 2013,
volume penjualan bergerak lebih sering fluktuatif.
Insight: Sales tumbuh, namun analisis sebelumnya diketahui profit tidak sejalan signifikan dengan pertumbahan penjualan. hal ini menandakan perlunya fokus pada strategi pemasaran yang lebih terukur dan optimisasi margin produk terjual.
Rekomendasi: Fokus pada strategi pemasaran, seperti product mix, optimalkan biaya pemasaran, dan koversi penjualan menjadi profit. Hentikan promo jika menghasilkan peningkatan penjualan, namun margin kritis.