Insight yang akan diambil yaitu:
Jenis produk yang menghasilkan profit tertinggi.
Perbandingan performa profit antar wilayah pasar.
Faktor yang secara statistik mempengaruhi profit.
Profit merupakan indikator keberhasilan bisnis yang paling mendasar. Memahami faktor-faktor yang mendorong atau menghambat profit sangat penting bagi manajemen untuk mengambil keputusan strategis mulai dari alokasi anggaran pemasaran, pemilihan produk, hingga ekspansi ke wilayah tertentu.
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'tibble' was built under R version 4.4.2
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
## Warning: package 'stringr' was built under R version 4.4.2
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 4.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
library(ggplot2)
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.4.3
## corrplot 0.95 loaded
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
df <- read_excel("C:/Users/LENOVO/OneDrive/Dokumen/WIWID/Sem 4/Sistem Informasi Manajemen/Coffee Chain Datasets.xlsx")
cat("Dimensi dataset:", nrow(df), "baris x", ncol(df), "kolom\n")
## Dimensi dataset: 4248 baris x 20 kolom
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_clean <- df %>%
select(
Market, `Market Size`, `Product Type`, `Product Line`,
Sales, Profit, Margin, Marketing, COGS, `Total Expenses`,
`Budget Profit`
) %>%
rename(
market = Market,
market_size = `Market Size`,
product_type = `Product Type`,
product_line = `Product Line`,
sales = Sales,
profit = Profit,
margin = Margin,
marketing = Marketing,
cogs = COGS,
total_exp = `Total Expenses`,
budget_profit = `Budget Profit`
)
# Cek missing values
cat("Jumlah nilai kosong per variabel:\n")
## Jumlah nilai kosong per variabel:
colSums(is.na(df_clean))
## market market_size product_type product_line sales
## 0 0 0 0 0
## profit margin marketing cogs total_exp
## 0 0 0 0 0
## budget_profit
## 0
# Hitung median per produk untuk label urutan
median_profit <- df_clean %>%
group_by(product_type) %>%
summarise(median_profit = median(profit)) %>%
arrange(desc(median_profit))
df_clean$product_type <- factor(df_clean$product_type,
levels = median_profit$product_type)
ggplot(df_clean, aes(x = product_type, y = profit, fill = product_type)) +
geom_boxplot(alpha = 0.7, outlier.shape = NA) +
geom_jitter(aes(color = product_type), width = 0.2, size = 0.8, alpha = 0.3) +
stat_summary(fun = mean, geom = "point", shape = 23,
size = 3, fill = "white", color = "black") +
scale_fill_brewer(palette = "Set2") +
scale_color_brewer(palette = "Set2") +
labs(
title = "Distribusi Profit Berdasarkan Jenis Produk",
subtitle = "Titik berlian putih menunjukkan nilai rata-rata; produk diurutkan berdasarkan median profit",
x = "Jenis Produk",
y = "Profit",
fill = "Jenis Produk",
color = "Jenis Produk"
) +
theme_minimal(base_size = 12) +
theme(legend.position = "none",
plot.title = element_text(face = "bold"),
plot.subtitle = element_text(color = "gray40", size = 10))
Coffee memiliki nilai median dan rata-rata profit tertinggi dibandingkan produk lainnya, meskipun penyebarannya cukup lebar yang menandakan adanya variasi profit yang tinggi. Espresso dan Herbal Tea cenderung memiliki distribusi profit yang lebih stabil dengan variasi yang tidak terlalu ekstrem. Tea memiliki beberapa nilai profit negatif yang cukup besar, sehingga dapat disimpulkan bahwa produk ini memiliki risiko kerugian yang lebih tinggi dibandingkan produk lainnya.
df_market <- df_clean %>%
group_by(market) %>%
summarise(
avg_profit = mean(profit),
avg_sales = mean(sales),
avg_marketing = mean(marketing),
.groups = "drop"
) %>%
pivot_longer(cols = -market, names_to = "Metrik", values_to = "Nilai") %>%
mutate(Metrik = recode(Metrik,
avg_profit = "Rata-rata Profit",
avg_sales = "Rata-rata Sales",
avg_marketing = "Rata-rata Marketing"
))
ggplot(df_market, aes(x = market, y = Nilai, fill = Metrik)) +
geom_col(position = "dodge", alpha = 0.85) +
geom_text(aes(label = round(Nilai, 1)),
position = position_dodge(width = 0.9),
vjust = -0.5, size = 3.2) +
scale_fill_brewer(palette = "Paired") +
labs(
title = "Perbandingan Performa per Wilayah Pasar",
subtitle = "Rata-rata Profit, Sales, dan Marketing per Wilayah",
x = "Wilayah",
y = "Nilai Rata-Rata",
fill = "Metrik"
) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"),
plot.subtitle = element_text(color = "gray40", size = 10),
legend.position = "bottom")
Wilayah Central mencatat rata-rata profit tertinggi meskipun bukan yang memiliki rata-rata sales tertinggi. Hal ini menunjukkan efisiensi operasional yang lebih baik di wilayah tersebut. Sebaliknya, wilayah West memiliki rata-rata sales dan biaya marketing tertinggi, namun profit-nya hanya menempati urutan ketiga mengindikasikan adanya inefisiensi, dimana pengeluaran yang lebih besar belum mampu menghasilkan profit yang sebanding.
ggplot(df_clean, aes(x = sales, y = profit, color = product_type)) +
geom_point(alpha = 0.4, size = 1.5) +
geom_smooth(method = "lm", se = TRUE, linewidth = 1) +
scale_color_brewer(palette = "Set1") +
facet_wrap(~ product_type, ncol = 2) +
labs(
title = "Hubungan Sales dan Profit per Jenis Produk",
subtitle = "Garis regresi linier dengan interval kepercayaan 95%",
x = "Sales",
y = "Profit",
color = "Jenis Produk"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold"),
plot.subtitle = element_text(color = "gray40", size = 10),
legend.position = "none")
## `geom_smooth()` using formula = 'y ~ x'
Hubungan antara sales dan profit pada setiap jenis produk menunjukkan adanya korelasi positif yang kuat, dimana peningkatan sales cenderung diikuti oleh peningkatan profit. Coffee memiliki sebaran data yang paling luas dengan beberapa titik profit sangat tinggi, mencerminkan potensi keuntungan besar namun dengan variabilitas yang tinggi. Tea menunjukkan pola regresi yang paling konsisten dan linier, namun terdapat beberapa nilai profit negatif yang cukup ekstrem pada sales rendah. Herbal Tea memiliki pola serupa dengan Tea, tetapi dengan distribusi yang sedikit lebih tersebar dan beberapa transaksi bernilai profit tinggi pada volume sales besar. Espresso memiliki volume penjualan yang rendah dengan sebagian besar transaksi berada di kisaran sales, tetapi terdapat satu outlier dengan profit hampir 700 dan beberapa transaksi merugi hingga -400, menunjukkan bahwa produk ini memiliki risiko dan potensi keuntungan yang sama-sama ekstrem. Secara keseluruhan, Coffee dan Herbal Tea tampak menjadi produk dengan potensi pertumbuhan profit paling menjanjikan seiring meningkatnya volume penjualan.
cor_matrix <- df_clean %>%
select(sales, profit, margin, marketing, cogs, total_exp) %>%
cor()
corrplot(cor_matrix,
method = "color",
type = "upper",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
number.cex = 0.8,
col = colorRampPalette(c("#d73027", "white", "#1a9850"))(200),
title = "Matriks Korelasi Variabel Numerik",
mar = c(0, 0, 2, 0))
Sebelum membangun model regresi, dilakukan analisis korelasi Pearson untuk mengidentifikasi hubungan linear antara variabel numerik dengan profit.
cor_profit <- df_clean %>%
select(sales, profit, margin, marketing, cogs, total_exp) %>%
cor() %>%
as.data.frame() %>%
select(profit) %>%
rownames_to_column("Variabel") %>%
filter(Variabel != "profit") %>%
arrange(desc(abs(profit))) %>%
rename(`Korelasi dengan Profit` = profit)
kable(cor_profit, digits = 4,
caption = "Tabel 1. Korelasi Variabel Numerik terhadap Profit") %>%
kable_styling(bootstrap_options = c("striped", "hover"),
full_width = FALSE) %>%
column_spec(2, bold = TRUE,
color = ifelse(cor_profit$`Korelasi dengan Profit` > 0,
"#1a9850", "#d73027"))
| Variabel | Korelasi dengan Profit |
|---|---|
| margin | 0.9206 |
| sales | 0.7973 |
| cogs | 0.4648 |
| marketing | 0.2255 |
| total_exp | 0.2000 |
Seluruh variabel menunjukkan korelasi positif satu sama lain. Variabel yang paling kuat mempengaruhi profit adalah margin (r=0,9206) dan sales (r=0,7973), artinya peningkatan efisiensi margin dan volume penjualan adalah kunci utama profitabilitas. Sebaliknya, marketing (r=0,2255) dan total_exp (r=0,2000) memiliki korelasi sangat rendah terhadap profit menunjukkan bahwa besarnya pengeluaran operasional tidak menjamin peningkatan keuntungan secara proporsional. Perlu diwaspadai korelasi sangat tinggi antara marketing dan total_exp (r=0,97) yang mengindikasikan potensi multikolinearitas dalam model regresi. Untuk meningkatkan profit, manajemen sebaiknya berfokus pada peningkatan margin dan volume penjualan daripada menambah anggaran pemasaran karena keduanya terbukti memiliki hubungan yang jauh lebih kuat terhadap profitabilitas bisnis.
tabel_produk <- df_clean %>%
group_by(product_type) %>%
summarise(
N = n(),
`Mean Profit` = round(mean(profit), 2),
`Median Profit` = round(median(profit), 2),
`SD Profit` = round(sd(profit), 2),
`Mean Sales` = round(mean(sales), 2),
`Mean Margin` = round(mean(margin), 2),
.groups = "drop"
) %>%
arrange(desc(`Mean Profit`))
kable(tabel_produk,
caption = "Tabel 2. Statistik Deskriptif Profit per Jenis Produk") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| product_type | N | Mean Profit | Median Profit | SD Profit | Mean Sales | Mean Margin |
|---|---|---|---|---|---|---|
| Coffee | 1056 | 70.72 | 39 | 118.84 | 205.33 | 115.12 |
| Herbal Tea | 1056 | 59.90 | 40 | 85.36 | 196.23 | 104.17 |
| Espresso | 1176 | 58.35 | 40 | 91.23 | 189.62 | 103.04 |
| Tea | 960 | 55.19 | 44 | 109.16 | 179.97 | 94.06 |
tabel_wilayah <- df_clean %>%
group_by(market) %>%
summarise(
N = n(),
`Mean Profit` = round(mean(profit), 2),
`Mean Sales` = round(mean(sales), 2),
`Mean Marketing` = round(mean(marketing), 2),
`Profit Margin (%)` = round(mean(profit / sales * 100), 2),
.groups = "drop"
) %>%
arrange(desc(`Mean Profit`))
kable(tabel_wilayah,
caption = "Tabel 3. Statistik Deskriptif Profit per Wilayah Pasar") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| market | N | Mean Profit | Mean Sales | Mean Marketing | Profit Margin (%) |
|---|---|---|---|---|---|
| Central | 1344 | 69.83 | 197.21 | 29.32 | 30.43 |
| East | 888 | 66.69 | 201.10 | 33.16 | 17.19 |
| West | 1344 | 55.06 | 202.58 | 35.01 | -8.87 |
| South | 672 | 48.33 | 154.65 | 24.65 | 27.19 |
Metode regresi linier berganda digunakan Untuk mengidentifikasi faktor-faktor yang secara signifikan mempengaruhi profit dengan variabel dependen profit, sedangkan variabel independennya yaitu sales, marketing, cogs, total_exp, serta variabel kategorikal market dan product_type.
model <- lm(profit ~ sales + marketing + cogs + total_exp +
market + product_type,
data = df_clean)
summary(model)
##
## Call:
## lm(formula = profit ~ sales + marketing + cogs + total_exp +
## market + product_type, data = df_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -112.292 -5.701 0.529 5.516 104.950
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.219590 0.898572 2.470 0.0135 *
## sales 1.208294 0.003751 322.116 < 2e-16 ***
## marketing 0.201018 0.040963 4.907 9.58e-07 ***
## cogs -1.241929 0.010345 -120.048 < 2e-16 ***
## total_exp -1.405094 0.031658 -44.383 < 2e-16 ***
## marketEast 0.120218 0.735084 0.164 0.8701
## marketSouth 0.134025 0.821005 0.163 0.8703
## marketWest 0.314260 0.657767 0.478 0.6328
## product_typeEspresso -0.048777 0.760774 -0.064 0.9489
## product_typeHerbal Tea 0.015906 0.767147 0.021 0.9835
## product_typeCoffee 0.449482 0.778337 0.577 0.5636
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.87 on 4237 degrees of freedom
## Multiple R-squared: 0.9726, Adjusted R-squared: 0.9725
## F-statistic: 1.502e+04 on 10 and 4237 DF, p-value: < 2.2e-16
Model regresi menghasilkan Adjusted R² sebesar 0,9725, artinya 97,25% variasi profit dapat dijelaskan oleh variabel dalam model. Variabel yang berpengaruh signifikan terhadap profit adalah sales (1,21), marketing (0,20), cogs (-1,24), dan total_exp (-1,41). Sales dan marketing berpengaruh positif, yaitu semakin tinggi penjualan dan pemasaran, semakin besar profit. Sebaliknya, cogs dan total_exp berpengaruh negatif, semakin tinggi biaya produksi dan pengeluaran, semakin kecil profit. Sementara itu, variabel wilayah dan jenis produk tidak menunjukkan pengaruh yang signifikan.
ANOVA Satu Aarah digunakan untuk menguji apakah terdapat perbedaan profit yang signifikan secara statistik antar wilayah.
anova_model <- aov(profit ~ market, data = df_clean)
summary(anova_model)
## 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
Hasil uji ANOVA menunjukkan F-value sebesar 9,361 dengan p-value 3,64e-06 < 0,05, yang berarti terdapat perbedaan profit yang signifikan antar wilayah. Wilayah tempat penjualan berlangsung terbukti mempengaruhi besarnya profit yang dihasilkan.
# Uji Post-hoc Tukey untuk melihat pasangan wilayah yang berbeda signifikan
tukey <- TukeyHSD(anova_model)
as.data.frame(tukey$market) %>%
rownames_to_column("Perbandingan Wilayah") %>%
rename(
`Selisih Rata-rata` = diff,
`Batas Bawah (95%)` = lwr,
`Batas Atas (95%)` = upr,
`p-value (adj.)` = `p adj`
) %>%
mutate(Signifikan = ifelse(`p-value (adj.)` < 0.05, "Ya ✓", "Tidak")) %>%
kable(digits = 4,
caption = "Tabel 5. Uji Post-hoc Tukey — Perbedaan Profit Antar Wilayah") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE)
| Perbandingan Wilayah | Selisih Rata-rata | Batas Bawah (95%) | Batas Atas (95%) | p-value (adj.) | Signifikan |
|---|---|---|---|---|---|
| East-Central | -3.1445 | -14.4155 | 8.1264 | 0.8904 | Tidak |
| South-Central | -21.5000 | -33.8135 | -9.1865 | 0.0000 | Ya ✓ |
| West-Central | -14.7738 | -24.8277 | -4.7199 | 0.0009 | Ya ✓ |
| South-East | -18.3555 | -31.6812 | -5.0297 | 0.0023 | Ya ✓ |
| West-East | -11.6293 | -22.9002 | -0.3583 | 0.0401 | Ya ✓ |
| West-South | 6.7262 | -5.5873 | 19.0397 | 0.4969 | Tidak |
Uji Tukey dilakukan untuk melihat wilayah mana yang berbeda secara spesifik. Hasilnya menunjukkan bahwa South dan Central memiliki perbedaan profit terbesar (selisih -21,50) dan paling signifikan (p=0,000). Wilayah South juga berbeda signifikan dengan East (p=0,002) dan West dengan East (p=0,040). Sementara perbandingan East-Central dan West-South tidak menunjukkan perbedaan yang signifikan. Secara keseluruhan, wilayah South secara konsisten memiliki profit lebih rendah dibandingkan wilayah lainnya.
Berdasarkan analisis yang telah dilakukan terhadap Coffee Chain Dataset diperoleh:
Sales dan Margin adalah prediktor profit terkuat. Korelasi keduanya terhadap profit masing-masing sebesar 0,7973 dan 0,9206. Upaya meningkatkan volume penjualan dan menjaga efisiensi margin akan berdampak langsung pada profitabilitas bisnis.
Coffee adalah produk dengan performa profit tertinggi, baik dari sisi rata-rata maupun potensi nilai transaksi tinggi. Meskipun demikian, perbedaan antar produk tidak signifikan secara statistik setelah mengontrol faktor lain, artinya strategi peningkatan sales pada semua kategori produk sama pentingnya.
Wilayah Central memimpin dalam efisiensi profit. Meskipun bukan wilayah dengan sales atau marketing tertinggi, Central menghasilkan profit rata-rata tertinggi. Sebaliknya, wilayah South secara konsisten memiliki performa profit terendah dan berbeda signifikan dari ketiga wilayah lainnya, ini menjadi sinyal bahwa dibutuhkan evaluasi strategi operasional di wilayah tersebut.
Model regresi linier berganda mampu menjelaskan ±97% variasi profit, dengan Sales dan COGS sebagai prediktor paling berpengaruh. Biaya pemasaran yang tinggi tidak selalu berbanding lurus dengan peningkatan profit, efisiensi pengeluaran perlu menjadi perhatian, khususnya di wilayah West.
Rekomendasi manajerial: Fokus pada sumber daya pada peningkatan volume penjualan produk Coffee dan Herbal Tea di wilayah Central dan East, sembari melakukan evaluasi efisiensi biaya di wilayah South dan West untuk mendongkrak profitabilitas secara keseluruhan.