Laporan ini disusun untuk melihat bagaimana kegiatan operasional di Coffee Chain berpengaruh terhadap keuntungan yang didapat perusahaan, dilakukan dengan menganalisis hubungan antara stok barang yang tersedia (Inventory) dan seberapa banyak barang yang laku terjual (Sales) dalam menghasilkan laba (Profit). Di sini, kita ingin memastikan apakah penjualan yang terjadi benar-benar efektif memberikan keuntungan bersih bagi bisnis. Selain itu, laporan ini juga membahas bagaimana setiap jenis produk (Product Type) mampu menciptakan variasi keuntungan yang berbeda-beda atau tidak.
Analisis ini menggunakan data gabungan dari facttable (data transaksi) dan tabel product (atribut produk). Hal yang ingin dibahas dalam laporan ini meliputi:
Analisis ini bertujuan membantu manajemen merumuskan kebijakan inventaris yang lebih tepat sasaran. Kita ingin memastikan stok yang tersedia mampu mendukung target penjualan secara maksimal, sekaligus menghindari risiko pembengkakan biaya operasional akibat tumpukan barang yang tidak terjual.
Bagian ini menampilkan seluruh library dan sintaks yang digunakan untuk memproses data dari database MySQL.
library(DBI)
library(odbc)
library(knitr)
library(ggplot2)
library(dplyr)
con <- dbConnect(odbc::odbc(),
Driver = "MySQL ODBC 8.0 ANSI Driver",
Server = "127.0.0.1",
Database = "db",
UID = "root",
PWD = "amadea07",
Port = 3306)
# Pengecekan atribut tabel
dbListFields(con, "facttable")
## [1] "Profit" "Margin" "Sales" "COGS"
## [5] "Total Expenses" "Marketing" "Inventory" "Budget Profit"
## [9] "Budget COGS" "Budget Margin" "Budget Sales" "Area Code"
## [13] "ProductId" "Date"
dbListFields(con, "product")
## [1] "Product Line" "Product Type" "Product" "ProductId" "Type"
# Menampilkan data awal
df_coffeechain <- dbGetQuery(con, "SELECT * FROM facttable, product LIMIT 100")
kable(head(df_coffeechain, 10), caption = "Pratinjau 10 Baris Data Coffee Chain")
| Profit | Margin | Sales | COGS | Total Expenses | Marketing | Inventory | Budget Profit | Budget COGS | Budget Margin | Budget Sales | Area Code | ProductId | Date | Product Line | Product Type | Product | ProductId | Type |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Leaves | Tea | Green Tea | 13 | Regular |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Leaves | Tea | Earl Grey | 12 | Regular |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Leaves | Tea | Darjeeling | 11 | Regular |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Leaves | Herbal Tea | Mint | 10 | Decaf |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Leaves | Herbal Tea | Lemon | 9 | Decaf |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Leaves | Herbal Tea | Chamomile | 8 | Decaf |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Beans | Espresso | Regular Espresso | 7 | Regular |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Beans | Espresso | Decaf Espresso | 6 | Decaf |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Beans | Espresso | Caffe Mocha | 5 | Regular |
| 94 | 130 | 219 | 89 | 36 | 24 | 777 | 100 | 90 | 130 | 220 | 719 | 1 | 2012-01-01 00:00:00 | Beans | Espresso | Caffe Latte | 4 | Regular |
query1 <- "SELECT f.Inventory, f.Sales, f.Profit, p.`Product Type`
FROM facttable f
JOIN product p ON f.ProductId = p.ProductId"
data1 <- dbGetQuery(con, query1)
kable(head(data1, 10), caption = "Pratinjau 10 baris pertama data gabungan")
| Inventory | Sales | Profit | Product Type |
|---|---|---|---|
| 777 | 219 | 94 | Coffee |
| 623 | 190 | 68 | Coffee |
| 821 | 234 | 101 | Coffee |
| 623 | 100 | 30 | Tea |
| 456 | 134 | 54 | Espresso |
| 558 | 180 | 53 | Espresso |
| 1091 | 341 | 99 | Herbal Tea |
| 435 | 150 | 0 | Herbal Tea |
| 336 | 140 | 33 | Herbal Tea |
| 338 | 130 | 17 | Tea |
# Visualisasi 1: Scatter Plot
ggplot(data1, aes(x = Inventory, y = Sales)) +
geom_jitter(alpha = 0.2, color = "steelblue") +
geom_smooth(method = "lm", color = "red") +
theme_minimal() +
labs(title = "Tren Inventory vs Sales",
x = "Stok", y = "Volume Penjualan")
Grafik ini menunjukkan hubungan antara jumlah stok barang (Inventory) dengan volume penjualan (Sales). Garis merah yang naik ke kanan (regresi) menandakan adanya korelasi positif, yang artinya secara umum, semakin banyak stok yang tersedia, maka volume penjualan juga cenderung meningkat. Namun, jika dilihat dari persebaran titik-titiknya, data ini memiliki variasi yang sangat tinggi. Sebagian besar data menumpuk pada level stok yang rendah dengan volume penjualan yang beragam, sementara terdapat beberapa data pencilan (outliers) di mana stok sangat tinggi namun penjualannya justru rendah. Hal ini menunjukkan bahwa meskipun stok penting untuk mendukung penjualan, jumlah stok yang berlebih tidak selalu menjamin peningkatan penjualan yang sebanding, sehingga diperlukan manajemen inventaris yang lebih efisien agar tidak terjadi penumpukan barang yang sia-sia.
# Visualisasi 2: Boxplot
ggplot(data1, aes(x = `Product Type`, y = Profit, fill = `Product Type`)) +
geom_boxplot(outlier.shape = NA) +
coord_cartesian(ylim = c(-200, 400)) +
theme_minimal() +
labs(title = "Perbandingan Profit Tiap Product Type",
x = "Jenis Produk", y = "Keuntungan")
Grafik boxplot ini memperlihatkan perbedaan pola keuntungan dari setiap kategori produk. Menariknya, produk Coffee dan Herbal Tea menunjukkan performa yang sekilas hampir sama stabilnya. Namun, jika diperhatikan lebih detail, kategori Tea (ungu) memiliki rentang keuntungan yang paling lebar, di mana penjualannya bisa menghasilkan untung yang sangat tinggi namun juga memiliki risiko variasi yang besar.
Sementara itu, produk Coffee, Espresso, dan Herbal Tea memiliki sebaran yang lebih rapat. Ini menandakan bahwa ketiga jenis produk ini merupakan penyumbang profit yang lebih konsisten bagi perusahaan, meskipun nilai keuntungan maksimal per transaksinya tidak sebesar kategori teh.
datavisualisasi3 <- data1 %>%
mutate(Kategori_Stok = ifelse(Inventory > median(Inventory), "Stok Tinggi", "Stok Rendah")) %>%
group_by(`Product Type`, Kategori_Stok) %>%
summarise(Rata_Profit = mean(Profit, na.rm = TRUE), .groups = 'drop')
ggplot(datavisualisasi3, aes(x = `Product Type`, y = Rata_Profit, fill = Kategori_Stok)) +
geom_bar(stat = "identity", position = "dodge") +
theme_minimal() +
scale_fill_manual(values = c("Stok Rendah" = "#eb4d4b", "Stok Tinggi" = "#6ab04c")) +
labs(title = "Eksplorasi 3: Rata-rata Profit Berdasarkan Level Inventory",
x = "Jenis Produk", y = "Rata-rata Keuntungan", fill = "Kondisi Stok")
Diagram batang ini menunjukkan bahwa kondisi Stok Tinggi (hijau) secara konsisten menghasilkan rata-rata keuntungan yang jauh lebih besar di seluruh kategori produk dibandingkan kondisi Stok Rendah (merah). Kategori Espresso dan Coffee mencatatkan potensi keuntungan tertinggi saat stok melimpah, sementara Tea memiliki rata-rata keuntungan yang paling rendah pada kondisi stok tinggi tersebut. Di sisi lain, Espresso menjadi produk yang paling rentan terhadap penipisan barang karena rata-rata profitnya turun paling rendah dari yang lain saat stoknya menipis, berbeda dengan kategori Coffee yang tetap menunjukkan performa stabil dan mampu mempertahankan keuntungan tinggi meski dalam kondisi stok terbatas.
hasil_korelasi <- cor.test(data1$Inventory, data1$Sales)
print(hasil_korelasi)
##
## Pearson's product-moment correlation
##
## data: data1$Inventory and data1$Sales
## t = 22.465, df = 4246, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.2987891 0.3525510
## sample estimates:
## cor
## 0.3259335
Hasil uji korelasi menunjukkan nilai p-value yang sangat kecil (p < 0,05), sehingga korelasi positif antara stok dan penjualan adalah signifikan secara statistik. Hal ini membuktikan bahwa penambahan stok secara empiris mampu meningkatkan peluang volume transaksi di pasar.
# Analisis 2: Uji ANOVA
hasil_anova <- aov(Profit ~ `Product Type`, data = data1)
summary_anova <- summary(hasil_anova)
print(summary_anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## `Product Type` 3 141680 47227 4.577 0.00333 **
## Residuals 4244 43791957 10319
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Nilai F-statistik menunjukkan hasil yang signifikan (p < 0,05), sehingga kita menolak H0. Secara statistik, terbukti bahwa rata-rata profit antar keempat jenis produk tidak sama. Ini menunjukkan bahwa Product Type merupakan faktor penentu utama dalam besar kecilnya laba yang dihasilkan.
model_final <- lm(Profit ~ Inventory + Sales, data = data1)
summary_final <- summary(model_final)
print(summary_final)
##
## Call:
## lm(formula = Profit ~ Inventory + Sales, data = data1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -464.22 -24.94 3.59 31.99 307.43
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -13.764220 1.329095 -10.36 <2e-16 ***
## Inventory -0.060498 0.001188 -50.94 <2e-16 ***
## Sales 0.622827 0.005195 119.89 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 48.37 on 4245 degrees of freedom
## Multiple R-squared: 0.7739, Adjusted R-squared: 0.7738
## F-statistic: 7265 on 2 and 4245 DF, p-value: < 2.2e-16
Nilai Adjusted R-Squared sebesar 0.7738 menjelaskan bahwa 77,38% variasi profit dapat dijelaskan oleh variabel stok dan penjualan dalam model ini. Sales memiliki pengaruh positif yang dominan, sementara Inventory memiliki koefisien yang menunjukkan bahwa jika stok terlalu berlebih tanpa diikuti penjualan, hal tersebut berisiko menjadi beban biaya penyimpanan (carrying cost) yang menekan margin keuntungan.
Berdasarkan hasil analisis data Coffee Chain, ketersediaan stok (Inventory) terbukti memiliki pengaruh yang signifikan dalam mendorong volume penjualan (Sales) dan perolehan keuntungan perusahaan. Melalui pengujian statistik, ditemukan bahwa Sales merupakan faktor yang paling dominan dalam menentukan besar kecilnya Profit. Meskipun setiap kategori produk memiliki karakteristik yang berbeda, seperti Coffee yang tetap stabil dan Espresso yang sangat bergantung pada kecukupan stok. Secara keseluruhan kondisi stok yang tinggi mampu memberikan rata-rata keuntungan yang lebih maksimal.
Sebagai saran kebijakan, manajemen direkomendasikan untuk menjaga stok pada level yang optimal. Artinya, ketersediaan barang harus cukup untuk memenuhi permintaan pelanggan guna menghindari hilangnya potensi laba, namun tetap terkontrol agar tidak terjadi penumpukan barang berlebih yang justru dapat meningkatkan biaya penyimpanan dan menekan margin keuntungan perusahaan.