Perkembangan industri makanan dan minuman, khususnya bisnis cafe, menunjukkan pertumbuhan yang pesat dalam beberapa tahun terakhir. Persaingan yang semakin ketat menuntut perusahaan untuk tidak hanya meningkatkan penjualan, tetapi juga mampu memaksimalkan profit. Dalam kondisi tersebut, pengambilan keputusan berbasis data menjadi hal yang sangat penting untuk menjaga keberlanjutan dan daya saing bisnis. Sehingga diperlukan analisis untuk meningkatkan profitabilitas guna mempertahankan bisnis ditengah persaingan industri makanan dan minuman.
Dataset yang digunakan dalam penelitian ini adalah Coffee Chain Dataset, yang berisi data transaksi penjualan dari sebuah jaringan kedai kopi. Data ini mencakup periode waktu 2012-2013 dengan total 4.248 observasi dan 20 variabel.
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.4.3
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.2
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
data <- read_excel("C:/Users/acer/Documents/SEMESTER 4/SIM/Coffee Chain Datasets.xlsx")
data
## # A tibble: 4,248 × 20
## `Area Code` Date Market `Market Size` Product `Product Line`
## <dbl> <dttm> <chr> <chr> <chr> <chr>
## 1 719 2012-01-01 00:00:00 Central Major Market Amaretto Beans
## 2 970 2012-01-01 00:00:00 Central Major Market Colombi… Beans
## 3 970 2012-01-01 00:00:00 Central Major Market Decaf I… Beans
## 4 303 2012-01-01 00:00:00 Central Major Market Green T… Leaves
## 5 303 2012-01-01 00:00:00 Central Major Market Caffe M… Beans
## 6 720 2012-01-01 00:00:00 Central Major Market Decaf E… Beans
## 7 970 2012-01-01 00:00:00 Central Major Market Chamomi… Leaves
## 8 719 2012-01-01 00:00:00 Central Major Market Lemon Leaves
## 9 970 2012-01-01 00:00:00 Central Major Market Mint Leaves
## 10 719 2012-01-01 00:00:00 Central Major Market Darjeel… Leaves
## # ℹ 4,238 more rows
## # ℹ 14 more variables: `Product Type` <chr>, State <chr>, Type <chr>,
## # `Budget COGS` <dbl>, `Budget Margin` <dbl>, `Budget Profit` <dbl>,
## # `Budget Sales` <dbl>, COGS <dbl>, Inventory <dbl>, Margin <dbl>,
## # Marketing <dbl>, Profit <dbl>, Sales <dbl>, `Total Expenses` <dbl>
colSums(is.na(data))
## Area Code Date Market Market Size Product
## 0 0 0 0 0
## Product Line Product Type State Type Budget COGS
## 0 0 0 0 0
## Budget Margin Budget Profit Budget Sales COGS Inventory
## 0 0 0 0 0
## Margin Marketing Profit Sales Total Expenses
## 0 0 0 0 0
sum(duplicated(data))
## [1] 0
summary(data)
## Area Code Date Market
## Min. :203.0 Min. :2012-01-01 00:00:00 Length:4248
## 1st Qu.:417.0 1st Qu.:2012-06-23 12:00:00 Class :character
## Median :573.0 Median :2012-12-16 12:00:00 Mode :character
## Mean :582.3 Mean :2012-12-15 22:00:00
## 3rd Qu.:772.0 3rd Qu.:2013-06-08 12:00:00
## Max. :985.0 Max. :2013-12-01 00:00:00
## Market Size Product Product Line Product Type
## Length:4248 Length:4248 Length:4248 Length:4248
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## State Type Budget COGS Budget Margin
## Length:4248 Length:4248 Min. : 0.00 Min. :-210.0
## Class :character Class :character 1st Qu.: 30.00 1st Qu.: 50.0
## Mode :character Mode :character Median : 50.00 Median : 70.0
## Mean : 74.83 Mean : 100.8
## 3rd Qu.: 90.00 3rd Qu.: 130.0
## Max. :450.00 Max. : 690.0
## Budget Profit Budget Sales COGS Inventory
## Min. :-320.00 Min. : 0.0 Min. : 0.00 Min. :-3534.0
## 1st Qu.: 20.00 1st Qu.: 80.0 1st Qu.: 43.00 1st Qu.: 432.0
## Median : 40.00 Median : 130.0 Median : 60.00 Median : 619.0
## Mean : 60.91 Mean : 175.6 Mean : 84.43 Mean : 749.4
## 3rd Qu.: 80.00 3rd Qu.: 210.0 3rd Qu.:100.00 3rd Qu.: 910.5
## Max. : 560.00 Max. :1140.0 Max. :364.00 Max. : 8252.0
## Margin Marketing Profit Sales
## Min. :-302.00 Min. : 0.00 Min. :-638.0 Min. : 17
## 1st Qu.: 52.75 1st Qu.: 13.00 1st Qu.: 17.0 1st Qu.:100
## Median : 76.00 Median : 22.00 Median : 40.0 Median :138
## Mean : 104.29 Mean : 31.19 Mean : 61.1 Mean :193
## 3rd Qu.: 132.00 3rd Qu.: 39.00 3rd Qu.: 92.0 3rd Qu.:230
## Max. : 613.00 Max. :156.00 Max. : 778.0 Max. :912
## Total Expenses
## Min. : 10.00
## 1st Qu.: 33.00
## Median : 46.00
## Mean : 54.06
## 3rd Qu.: 65.00
## Max. :190.00
str(data)
## tibble [4,248 × 20] (S3: tbl_df/tbl/data.frame)
## $ Area Code : num [1:4248] 719 970 970 303 303 720 970 719 970 719 ...
## $ Date : POSIXct[1:4248], format: "2012-01-01" "2012-01-01" ...
## $ Market : chr [1:4248] "Central" "Central" "Central" "Central" ...
## $ Market Size : chr [1:4248] "Major Market" "Major Market" "Major Market" "Major Market" ...
## $ Product : chr [1:4248] "Amaretto" "Colombian" "Decaf Irish Cream" "Green Tea" ...
## $ Product Line : chr [1:4248] "Beans" "Beans" "Beans" "Leaves" ...
## $ Product Type : chr [1:4248] "Coffee" "Coffee" "Coffee" "Tea" ...
## $ State : chr [1:4248] "Colorado" "Colorado" "Colorado" "Colorado" ...
## $ Type : chr [1:4248] "Regular" "Regular" "Decaf" "Regular" ...
## $ Budget COGS : num [1:4248] 90 80 100 30 60 80 140 50 50 40 ...
## $ Budget Margin : num [1:4248] 130 110 140 50 90 130 160 80 70 70 ...
## $ Budget Profit : num [1:4248] 100 80 110 30 70 80 110 20 40 20 ...
## $ Budget Sales : num [1:4248] 220 190 240 80 150 210 300 130 120 110 ...
## $ COGS : num [1:4248] 89 83 95 44 54 72 170 63 60 58 ...
## $ Inventory : num [1:4248] 777 623 821 623 456 ...
## $ Margin : num [1:4248] 130 107 139 56 80 108 171 87 80 72 ...
## $ Marketing : num [1:4248] 24 27 26 14 15 23 47 57 19 22 ...
## $ Profit : num [1:4248] 94 68 101 30 54 53 99 0 33 17 ...
## $ Sales : num [1:4248] 219 190 234 100 134 180 341 150 140 130 ...
## $ Total Expenses: num [1:4248] 36 39 38 26 26 55 72 87 47 55 ...
data$Date <- as.Date(data$Date)
data <- data%>%
mutate(
Year = format(Date, "%Y"),
Month = format(Date, "%Y-%m"),
Profit_Gap = Profit - `Budget Profit`
)
data$`Area Code` <- as.character(data$`Area Code`)
data$`Product Type` <- as.factor(data$`Product Type`)
data <- data %>%
rename(Product_Type = `Product Type`)
tren_data <- data %>%
mutate(Bulan = floor_date(Date, "month")) %>%
group_by(Bulan) %>%
summarise(
Total_Sales = sum(Sales, na.rm = TRUE),
Total_Profit = sum(Profit, na.rm = TRUE)
)
tren_long <- tren_data %>%
pivot_longer(
cols = c(Total_Sales, Total_Profit),
names_to = "Kategori",
values_to = "Nilai"
)
ggplot(tren_long, aes(x = Bulan, y = Nilai, color = Kategori)) +
geom_line(size = 1) +
geom_point(size = 2) +
labs(
title = "Tren Penjualan dan Profit",
x = "Waktu (Bulan)",
y = "Jumlah"
) +
scale_color_manual(values = c("Total_Sales" = "#1f77b4",
"Total_Profit" = "#BF5C08"))+
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Terlihat bahwa tren penjualan dan profit cenderung bergerak searah, artinya ketika penjualan meningkat, profit juga ikut meningkat.Namun, tidak semua peningkatan penjualan menghasilkan profit yang proporsional.
market_summary <- data %>%
group_by(Market) %>%
summarise(
total_sales = sum(Sales, na.rm = TRUE),
total_profit = sum(Profit, na.rm = TRUE),
margin = total_profit / total_sales
) %>%
arrange(desc(total_profit))
market_summary
## # A tibble: 4 × 4
## Market total_sales total_profit margin
## <chr> <dbl> <dbl> <dbl>
## 1 Central 265045 93852 0.354
## 2 West 272264 73996 0.272
## 3 East 178576 59217 0.332
## 4 South 103926 32478 0.313
market_long <- market_summary %>%
pivot_longer(cols = c(total_sales, total_profit),
names_to = "metric",
values_to = "value")
ggplot(market_long, aes(x = Market, y = value, fill = metric)) +
geom_bar(stat = "identity", , position = "dodge") +
geom_text(aes(label = round(value, 0)),
position = position_dodge(width = 0.9),
vjust = -0.3, color = "black", size = 3) +
labs(title = "Sales vs Profit per Wilayah")
Terdapat perbedaan yang jelas antar wilayah dalam hal kontribusi terhadap penjualan maupun profit. Wilayah dengan penjualan tinggi belum tentu memiliki profit tertinggi. Wilayah dengan profit tinggi menunjukkan kinerja yang lebih efisien dan berpotensi menjadi fokus pengembangan bisnis.Terlihat wilayah Central menghasilkan profit tertinggi dengan nilai margin 0,35 atau 35%.
data_mp <- data %>%
group_by(Market, Product_Type) %>%
summarise(total_profit = sum(Profit, na.rm = TRUE))
## `summarise()` has grouped output by 'Market'. You can override using the
## `.groups` argument.
ggplot(data_mp, aes(x = Market, y = Product_Type, fill = total_profit)) +
geom_tile() +
geom_text(aes(label = round(total_profit, 0)), size = 3) +
scale_fill_gradient(low = "#92AFD6", high = "#001E45")+
labs(
title = "Heatmap Profit: Wilayah vs Product Type",
x = "Wilayah",
y = "Product Type"
) +
theme_minimal()
Visualisasi heatmap ini menunjukkan distribusi total profit berdasarkan kombinasi antara wilayah dan product type. Intensitas warna yang semakin gelap mengindikasikan nilai profit yang semakin tinggi, sedangkan warna yang lebih terang menunjukkan profit yang lebih rendah. Secara umum, terlihat bahwa tidak semua kombinasi wilayah dan jenis produk memberikan kontribusi profit yang sama. Terdapat beberapa kombinasi yang menonjol dengan warna paling gelap, yang berarti menjadi sumber utama keuntungan perusahaan. Hal ini menunjukkan bahwa performa produk sangat bergantung pada wilayah produk tersebut dijual. Terlihat produk unggulan di wilayah Central hampir semua produk, produk unggulan di wilayah East yaitu coffee, produk unggulan di wilayan South yaitu espresso, dan produk unggulan di wilayah West yaitu Herbal Tea. Hal ini menunjukkan bahwa kombinasi wilayah dan jenis produk memberikan kontribusi profit yang berbeda-beda.
data %>%
group_by(Year) %>%
summarise(
N = n(),
Mean_Profit = mean(Profit),
Mean_Budget_Profit = mean(`Budget Profit`),
Mean_Profit_Gap = mean(Profit_Gap),
Total_Profit_Gap = sum(Profit_Gap)
)%>%
kable(caption = "Profit Gap per Tahun") %>%
kable_styling(full_width = FALSE, position = "center")
| Year | N | Mean_Profit | Mean_Budget_Profit | Mean_Profit_Gap | Total_Profit_Gap |
|---|---|---|---|---|---|
| 2012 | 2124 | 49.82392 | 60.91337 | -11.08945 | -23554 |
| 2013 | 2124 | 72.37147 | 60.91337 | 11.45810 | 24337 |
Pada tahun 2012, rata-rata Profit Gap adalah −11,09 USD (perusahaan merugi dari target), sedangkan pada 2013 berbalik menjadi 11,5 USD. Perubahan drastis ini menunjukkan adanya perbaikan operasional atau peningkatan permintaan yang signifikan.
data %>%
group_by(Product_Type) %>%
summarise(
N = n(),
Mean_Profit = mean(Profit),
Mean_Budget = mean(`Budget Profit`),
Mean_Gap = mean(Profit_Gap),
Pct_Above_Budget = mean(Profit_Gap > 0) * 100
) %>%
arrange(Mean_Gap)%>%
kable(caption = "Profit Gap per Tipe Produk") %>%
kable_styling(full_width = FALSE, position = "center")
| Product_Type | N | Mean_Profit | Mean_Budget | Mean_Gap | Pct_Above_Budget |
|---|---|---|---|---|---|
| Coffee | 1056 | 70.72254 | 79.43182 | -8.709280 | 22.82197 |
| Espresso | 1176 | 58.35034 | 61.13946 | -2.789116 | 35.54422 |
| Herbal Tea | 1056 | 59.89962 | 55.60606 | 4.293561 | 41.95076 |
| Tea | 960 | 55.19375 | 46.10417 | 9.089583 | 57.60417 |
Coffee adalah produk dengan profit aktual tertinggi (USD 70,72), namun sekaligus yang paling jauh di bawah target budget-nya (gap = −8,71). Ini mengindikasikan bahwa anggaran untuk Coffee terlalu tinggi, atau ada inefisiensi biaya. Sebaliknya, Tea menjadi produk “star performer” dengan gap tertinggi (+9,09) meskipun profit nominalnya paling rendah.
data %>%
group_by(Product_Type) %>%
summarise(
N = n(),
Mean = mean(Profit),
Median = median(Profit),
SD = sd(Profit),
Min = min(Profit),
Max = max(Profit)
)%>%
kable(caption = "Statistik Deskriptif Profit per Tipe Produk") %>%
kable_styling(full_width = FALSE, position = "center")
| Product_Type | N | Mean | Median | SD | Min | Max |
|---|---|---|---|---|---|---|
| Coffee | 1056 | 70.72254 | 39 | 118.83545 | -221 | 778 |
| Espresso | 1176 | 58.35034 | 40 | 91.23054 | -392 | 646 |
| Herbal Tea | 1056 | 59.89962 | 40 | 85.36225 | -420 | 536 |
| Tea | 960 | 55.19375 | 44 | 109.15530 | -638 | 362 |
\[H_0: \mu_{\text{ }} = \mu_{\text{Central}} = \mu_{\text{East}} = \mu_{\text{South}} = \mu_{\text{West}}\] \[H_1: \text{Minimal terdapat satu rata-rata berbeda}\] \[\alpha = 0.05\]
anova_market <- aov(Profit ~ Market, data = data)
summary(anova_market)
## Df Sum Sq Mean Sq F value Pr(>F)
## Market 3 288811 96270 9.361 3.64e-06 ***
## Residuals 4244 43644825 10284
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Kesimpulan: p-value = 0,0033 < \(\alpha\) maka \(H_0\) ditolak. Terdapat perbedaan profit yang signifikan antar wilayah. Dengan kata lain, kondisi wilayah memiliki pengaruh yang nyata terhadap besar kecilnya profit yang dihasilkan perusahaan.
Karena \(H_0\) ditolak maka lanjut Uji Tukey
TukeyHSD(anova_market)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Profit ~ Market, data = data)
##
## $Market
## diff lwr upr p adj
## East-Central -3.144546 -14.415515 8.1264225 0.8903657
## South-Central -21.500000 -33.813493 -9.1865072 0.0000438
## West-Central -14.773810 -24.827734 -4.7198847 0.0009266
## South-East -18.355454 -31.681197 -5.0297102 0.0022850
## West-East -11.629263 -22.900232 -0.3582944 0.0401115
## West-South 6.726190 -5.587302 19.0396833 0.4969307
Kesimpulan: Berdasarkan uji tukey terlihat perbedaan profit yang signifikan di wilayah South VS Central, West VS Central, South VS East dan West VS East. Hasil ini menunjukkan bahwa wilayah Central dan East memiliki rata-rata profit yang berbeda secara signifikan dibandingkan dengan wilayah South dan West. Dengan kata lain, terdapat ketimpangan kinerja profit antar wilayah, di mana tidak semua market memberikan kontribusi keuntungan yang sama.
\[H_0: \mu_{\text{Coffee}} = \mu_{\text{Tea}} = \mu_{\text{Espresso}} = \mu_{\text{Herbal Tea}}\] \[H_1: \text{Minimal satu rata-rata berbeda}\] \[\alpha = 0.05\]
anova_product <- aov(Profit ~ Product_Type, data = data)
summary(anova_product)
## 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
Kesimpulan: p-value = 0,0033 < \(\alpha\) maka \(H_0\) ditolak. Terdapat perbedaan profit yang signifikan antar tipe produk. Dengan kata lain, jenis produk memiliki pengaruh yang nyata terhadap besar kecilnya profit yang dihasilkan perusahaan.
Karena \(H_0\) ditolak maka lanjut Uji Tukey
TukeyHSD(anova_product)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Profit ~ Product_Type, data = data)
##
## $Product_Type
## diff lwr upr p adj
## Espresso-Coffee -12.372198 -23.44003 -1.3043662 0.0212815
## Herbal Tea-Coffee -10.822917 -22.18438 0.5385423 0.0684855
## Tea-Coffee -15.528788 -27.17082 -3.8867568 0.0034344
## Herbal Tea-Espresso 1.549281 -9.51855 12.6171126 0.9840623
## Tea-Espresso -3.156590 -14.51225 8.1990707 0.8914175
## Tea-Herbal Tea -4.705871 -16.34790 6.9361599 0.7265871
Kesimpulan: Berdasarkan uji tukey terlihat perbedaan profit yang signifikan yaitu Espressi VS Coffee dan Tea VS Coffee. Hal ini menunjukkan bahwa produk kategori Coffee memiliki rata-rata profit yang berbeda secara signifikan dibandingkan dengan Espresso dan Tea. Dengan kata lain, kinerja profit pada produk Coffee tidak sama dengan kedua kategori tersebut.
\[H_0: \mu_{\text{ }} = \mu_{\text{Central}} = \mu_{\text{East}} = \mu_{\text{South}} = \mu_{\text{West}}\] \[H_1: \text{Minimal terdapat satu rata-rata berbeda}\]
\[H_0: \mu_{\text{Coffee}} = \mu_{\text{Tea}} = \mu_{\text{Espresso}} = \mu_{\text{Herbal Tea}}\] \[H_1: \text{Minimal terdapat satu rata-rata berbeda}\]
\[H_0: \text{Tidak terdapat interaksi antara Market dan Product Type terhadap profit (artinya pengaruh product type sama di semua market)}\] \[H_1:\text{Terdapat interaksi antara Market dan Product Type terhadap profit (artinya pengaruh product type berbeda di semua market)}\] \[\alpha = 0.05\]
anova_2way <- aov(Profit ~ Market * Product_Type, data = data)
summary(anova_2way)
## Df Sum Sq Mean Sq F value Pr(>F)
## Market 3 288811 96270 10.233 1.04e-06 ***
## Product_Type 3 170636 56879 6.046 0.000419 ***
## Market:Product_Type 8 3651726 456466 48.521 < 2e-16 ***
## Residuals 4233 39822463 9408
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
p-value = 0,000001 < \(\alpha\) maka \(H_0\) ditolak artinya terdapat perbedaan profit yang signifikan antar wilayah (market).p-value = 0,000417 < \(\alpha\) maka \(H_0\) artinya ditolak terdapat perbedaan profit yang signifikan antar tipe produk. p-value = 0,0000001 < \(\alpha\) maka \(H_0\) ditolak artinya terdapat interaksi signifikan antara market dan product type. Berdasarkan hasil uji ANOVA dua arah, diperoleh bahwa faktor market dan product type memiliki pengaruh terhadap profit. Selain itu, terdapat interaksi antara market dan product type dalam memengaruhi profit. Hal ini menunjukkan bahwa perbedaan profit tidak hanya dipengaruhi oleh masing-masing faktor secara terpisah, tetapi juga oleh kombinasi keduanya. Dengan kata lain, kinerja suatu produk dalam menghasilkan profit bergantung pada market tempat produk tersebut dipasarkan.