Industri kopi menjadi salah satu sektor bisnis yang terus mengalami pertumbuhan signifikan di Amerika Serikat. Persaingan ketat di antara para pengusaha mendorong perlu adanya pengambilan keputusan berbasis data guna mempertahankan dan meningkatkan kinerja bisnis. Salah satunya yaitu melalui analisis statistik.
Analisis statistik ini bertujuan untuk menggali informasi dalam data penjualan kopi guna memahami pola konsumsi pelanggan, efektivitas operasional di berbagai wilayah, serta akurasi perencanaan keuangan. Dengan ini, pengusaha dapat melakukan evaluasi terhadap performa penjualan dan mengidentifikasi faktor-faktor yang mempengaruhi performa penjualan.
Laporan ini secara khusus disusun dengan tujuan untuk melakukan eksplorasi serta analisis performa penjualan kopi menggunakan pendekatan statistik deskriptif dan komparatif. Melalui pendekatan ini, diharapkan diperoleh gambaran strategis mengenai distribusi keuntungan di berbagai wilayah pasar serta sejauh mana efisiensi penggunaan biaya operasional dan pemasaran telah berkontribusi terhadap pendapatan perusahaan.
Dataset yang digunakan dalam analisis ini adalah “Coffee Chain Dataset” yang mencakup data transaksi operasional dari berbagai cabang toko kopi di wilayah Amerika Serikat. Data ini terdiri dari 4.248 baris dan 20 kolom, mencakup periode Januari 2012 – Desember 2013 (24 bulan).
library(readxl)
data <- read_excel("C:/Users/User/Documents/KULIAH/sem 4/sim/Coffee Chain Datasets.xlsx")
head(data)
## # A tibble: 6 × 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 Colombian Beans
## 3 970 2012-01-01 00:00:00 Central Major Market Decaf Ir… Beans
## 4 303 2012-01-01 00:00:00 Central Major Market Green Tea Leaves
## 5 303 2012-01-01 00:00:00 Central Major Market Caffe Mo… Beans
## 6 720 2012-01-01 00:00:00 Central Major Market Decaf Es… Beans
## # ℹ 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>
Berikut adalah penjelasan mengenai variabel-variabel yang ada dalam dataset tersebut:
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 ...
Terlihat bahwa terdapat 4238 baris data dengan 20 kolom. Terdapat 7 tipe data chr atau tipe data teks, 12 tipe data numerik, dan 1 tipe data POSIXct atau tipe data yang menyimpan waktu dan tanggal.
Kolom Date dikonversi ke dalam format tanggal, kemudian diekstrak menjadi variabel baru yaitu Year, Month, dan Month_Label untuk memudahkan analisis berbasis waktu.
library(dplyr)
##
## 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)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
data <- data %>%
mutate(
Date = as.Date(Date),
Year = year(Date),
Month = month(Date),
Month_Label = month(Date, label = TRUE))
head(data)
## # A tibble: 6 × 23
## `Area Code` Date Market `Market Size` Product `Product Line`
## <dbl> <date> <chr> <chr> <chr> <chr>
## 1 719 2012-01-01 Central Major Market Amaretto Beans
## 2 970 2012-01-01 Central Major Market Colombian Beans
## 3 970 2012-01-01 Central Major Market Decaf Irish Cream Beans
## 4 303 2012-01-01 Central Major Market Green Tea Leaves
## 5 303 2012-01-01 Central Major Market Caffe Mocha Beans
## 6 720 2012-01-01 Central Major Market Decaf Espresso Beans
## # ℹ 17 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>,
## # Year <dbl>, Month <dbl>, Month_Label <ord>
Kolom dengan tipe data character diubah menjadi factor untuk merepresentasikan variabel kategorikal, sehingga lebih sesuai untuk analisis statistik dan pemodelan.
data <- data %>%
mutate(across(where(is.character), as.factor))
head(data)
## # A tibble: 6 × 23
## `Area Code` Date Market `Market Size` Product `Product Line`
## <dbl> <date> <fct> <fct> <fct> <fct>
## 1 719 2012-01-01 Central Major Market Amaretto Beans
## 2 970 2012-01-01 Central Major Market Colombian Beans
## 3 970 2012-01-01 Central Major Market Decaf Irish Cream Beans
## 4 303 2012-01-01 Central Major Market Green Tea Leaves
## 5 303 2012-01-01 Central Major Market Caffe Mocha Beans
## 6 720 2012-01-01 Central Major Market Decaf Espresso Beans
## # ℹ 17 more variables: `Product Type` <fct>, State <fct>, Type <fct>,
## # `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>,
## # Year <dbl>, Month <dbl>, Month_Label <ord>
Kemudian, pada langkah ini dilakukan untuk melihat nilai unik dalam setiap kolom.
for(col in names(data)) {
if(is.factor(data[[col]])) {
cat("\nNilai unik pada kolom : ", col, ":\n")
print(unique(data[[col]]))}}
##
## Nilai unik pada kolom : Market :
## [1] Central East South West
## Levels: Central East South West
##
## Nilai unik pada kolom : Market Size :
## [1] Major Market Small Market
## Levels: Major Market Small Market
##
## Nilai unik pada kolom : Product :
## [1] Amaretto Colombian Decaf Irish Cream Green Tea
## [5] Caffe Mocha Decaf Espresso Chamomile Lemon
## [9] Mint Darjeeling Earl Grey Regular Espresso
## [13] Caffe Latte
## 13 Levels: Amaretto Caffe Latte Caffe Mocha Chamomile Colombian ... Regular Espresso
##
## Nilai unik pada kolom : Product Line :
## [1] Beans Leaves
## Levels: Beans Leaves
##
## Nilai unik pada kolom : Product Type :
## [1] Coffee Tea Espresso Herbal Tea
## Levels: Coffee Espresso Herbal Tea Tea
##
## Nilai unik pada kolom : State :
## [1] Colorado Illinois Iowa Missouri Ohio
## [6] Wisconsin Connecticut Florida Massachusetts New Hampshire
## [11] New York Louisiana New Mexico Oklahoma Texas
## [16] Utah California Nevada Oregon Washington
## 20 Levels: California Colorado Connecticut Florida Illinois Iowa ... Wisconsin
##
## Nilai unik pada kolom : Type :
## [1] Regular Decaf
## Levels: Decaf Regular
##
## Nilai unik pada kolom : Month_Label :
## [1] Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
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
## Year Month Month_Label
## 0 0 0
Terlihat bahwa tidak ada missing value atau data kosong, sehingga data bisa langsung digunakan.
data <- data %>%
mutate(
`Profit Margin` = ifelse(Sales != 0, Profit / Sales * 100, NA),
`Marketing Efficiency` = ifelse(Marketing > 0, Profit / Marketing, NA),
`COGS Ratio` = ifelse(Sales != 0, COGS / Sales * 100, NA),
`Expense Ratio` = ifelse(Sales != 0, `Total Expenses` / Sales * 100, NA),
`Gap Profit` = Profit - `Budget Profit`,
`Gap Sales` = Sales - `Budget Sales`,
`Achiev Profit pct` = ifelse(`Budget Profit` != 0, Profit / `Budget Profit` * 100, NA),
`Achiev Sales pct` = ifelse(`Budget Sales` != 0, Sales / `Budget Sales` * 100, NA))
head(data)
## # A tibble: 6 × 31
## `Area Code` Date Market `Market Size` Product `Product Line`
## <dbl> <date> <fct> <fct> <fct> <fct>
## 1 719 2012-01-01 Central Major Market Amaretto Beans
## 2 970 2012-01-01 Central Major Market Colombian Beans
## 3 970 2012-01-01 Central Major Market Decaf Irish Cream Beans
## 4 303 2012-01-01 Central Major Market Green Tea Leaves
## 5 303 2012-01-01 Central Major Market Caffe Mocha Beans
## 6 720 2012-01-01 Central Major Market Decaf Espresso Beans
## # ℹ 25 more variables: `Product Type` <fct>, State <fct>, Type <fct>,
## # `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>,
## # Year <dbl>, Month <dbl>, Month_Label <ord>, `Profit Margin` <dbl>,
## # `Marketing Efficiency` <dbl>, `COGS Ratio` <dbl>, `Expense Ratio` <dbl>,
## # `Gap Profit` <dbl>, `Gap Sales` <dbl>, `Achiev Profit pct` <dbl>, …
Pada langkah ini, dilakukan penambahan kolom untuk analisis kinerja bisnis.
Analisis statistik deskriptif dilakukan untuk memahami distribusi data. Beberapa ukuran yang diperhatikan antara lain nilai rata-rata (mean), nilai tengah (median), variansi, serta standar deviasi. Informasi ini memberikan gambaran awal mengenai karakteristik data numerik yang berpotensi memengaruhi hasil analisis selanjutnya. Selain itu, kolom Area dihapus karena tidak termasuk dalam variabel yang akan dianalisis.
library(psych)
## Warning: package 'psych' was built under R version 4.5.3
data <- data[, -1] # Menghapus Kolom Kode Area
describe(data %>% select(where(is.numeric)))
## vars n mean sd median trimmed mad min
## Budget COGS 1 4248 74.83 66.24 50.00 62.54 29.65 0.00
## Budget Margin 2 4248 100.82 92.60 70.00 86.41 44.48 -210.00
## Budget Profit 3 4248 60.91 79.55 40.00 52.95 29.65 -320.00
## Budget Sales 4 4248 175.65 148.89 130.00 147.00 88.96 0.00
## COGS 5 4248 84.43 67.25 60.00 71.54 38.55 0.00
## Inventory 6 4248 749.38 661.03 619.00 679.76 336.55 -3534.00
## Margin 7 4248 104.29 94.34 76.00 90.54 48.93 -302.00
## Marketing 8 4248 31.19 27.02 22.00 26.38 14.83 0.00
## Profit 9 4248 61.10 101.71 40.00 52.25 44.48 -638.00
## Sales 10 4248 192.99 151.13 138.00 163.29 84.51 17.00
## Total Expenses 11 4248 54.06 32.35 46.00 49.43 23.72 10.00
## Year 12 4248 2012.50 0.50 2012.50 2012.50 0.74 2012.00
## Month 13 4248 6.50 3.45 6.50 6.50 4.45 1.00
## Profit Margin 14 4248 14.72 155.42 32.00 29.98 17.47 -3190.00
## Marketing Efficiency 15 4182 2.38 2.69 2.52 2.34 1.74 -5.94
## COGS Ratio 16 4248 49.41 82.94 41.05 41.45 2.69 0.00
## Expense Ratio 17 4248 36.09 44.22 28.22 30.75 12.27 6.98
## Gap Profit 18 4248 0.18 38.74 -4.00 -1.88 16.31 -369.00
## Gap Sales 19 4248 17.34 44.28 16.00 16.35 25.20 -310.00
## Achiev Profit pct 20 4096 93.50 58.87 95.00 96.13 42.01 -390.00
## Achiev Sales pct 21 4224 115.45 25.11 113.75 113.20 18.94 66.79
## max range skew kurtosis se
## Budget COGS 450.00 450.00 1.97 4.48 1.02
## Budget Margin 690.00 900.00 2.02 7.06 1.42
## Budget Profit 560.00 880.00 1.27 8.27 1.22
## Budget Sales 1140.00 1140.00 2.28 6.60 2.28
## COGS 364.00 364.00 1.67 2.27 1.03
## Inventory 8252.00 11786.00 2.89 28.50 10.14
## Margin 613.00 915.00 1.42 5.33 1.45
## Marketing 156.00 156.00 1.64 2.41 0.41
## Profit 778.00 1416.00 0.45 9.77 1.56
## Sales 912.00 895.00 1.88 3.49 2.32
## Total Expenses 190.00 180.00 1.32 1.58 0.50
## Year 2013.00 1.00 0.00 -2.00 0.01
## Month 12.00 11.00 0.00 -1.22 0.05
## Profit Margin 118.09 3308.09 -13.55 207.62 2.38
## Marketing Efficiency 45.76 51.70 5.66 74.47 0.04
## COGS Ratio 1589.47 1589.47 13.58 200.30 1.27
## Expense Ratio 773.68 766.70 10.75 140.23 0.68
## Gap Profit 249.00 618.00 -0.32 15.44 0.59
## Gap Sales 347.00 657.00 0.07 9.28 0.68
## Achiev Profit pct 650.00 1040.00 -0.53 8.26 0.92
## Achiev Sales pct 300.00 233.21 1.50 5.17 0.39
Eksplorasi data, atau disebut juga dengan Exploratory Data Analysis (EDA), merupakan tahapan krusial yang dilakukan sebelum tahap pemodelan atau analisis statistik. Tahapan ini berfungsi untuk memahami karakteristik struktur data, mengidentifikasi anomali, serta menggali pola-pola awal yang terdapat dalam dataset. Tanpa proses eksplorasi yang memadai, hasil analisis berisiko menjadi tidak akurat akibat adanya ketidakteraturan data yang tidak terdeteksi sejak dini.
library(ggplot2)
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
library(scales)
##
## Attaching package: 'scales'
## The following objects are masked from 'package:psych':
##
## alpha, rescale
ggplot(data, aes(x = reorder(Product, Sales, median), y = Sales,
fill = `Product Type`)) +
geom_boxplot(outlier.size = 1.2, alpha = 0.85, width = 0.6) +
coord_flip() +
scale_fill_manual(values = c(
"Coffee" = "#6F4E37",
"Espresso" = "#3B1F0E",
"Tea" = "#7CB99A",
"Herbal Tea" = "#C8E6C9")) +
scale_y_continuous(labels = comma) +
labs(title = "Distribusi Sales per Produk", x = NULL, y = "Sales ($)", fill = "Tipe Produk") +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold"),
panel.grid.major.y = element_blank(),
legend.position = "bottom")
Regular Espresso memiliki median penjualan tertinggi sekaligus variasi yang paling besar, menunjukkan penjualan tinggi namun tidak stabil. Colombian dan Earl Grey juga tergolong kuat karena adanya banyak transaksi bernilai besar (outlier).
Sebaliknya, Green Tea, Caffe Latte, dan Darjeeling memiliki median rendah dengan variasi sempit, artinya penjualan cenderung kecil tetapi konsisten. Secara keseluruhan, produk kopi lebih mendominasi penjualan dibandingkan teh.
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.5.3
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
warna_produk <- c(
"Coffee" = "#6F4E37",
"Espresso" = "#3B1F0E",
"Tea" = "#7CB99A",
"Herbal Tea" = "#C8E6C9")
p_market <- data %>% count(Market) %>%
ggplot(aes(x = reorder(Market, n), y = n, fill = Market)) +
geom_col(show.legend = FALSE, fill = "#6F4E37", width = 0.6) +
coord_flip() +
geom_text(aes(label = comma(n)), hjust = -0.2, size = 3) +
scale_y_continuous(expand = expansion(mult = c(0, 0.4))) +
labs(title = "Jumlah Transaksi\nper Wilayah", x = NULL, y = "Frekuensi") +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
p_type <- data %>% count(`Product Type`) %>%
ggplot(aes(x = reorder(`Product Type`, n), y = n, fill = `Product Type`)) +
geom_col(show.legend = FALSE, width = 0.6) +
coord_flip() +
geom_text(aes(label = comma(n)), hjust = -0.2, size = 3) +
scale_fill_manual(values = warna_produk) +
scale_y_continuous(expand = expansion(mult = c(0, 0.4))) +
labs(title = "Jumlah Transaksi\nper Tipe Produk", x = NULL, y = "Frekuensi") +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
p_decaf <- data %>% count(Type) %>%
ggplot(aes(x = Type, y = n, fill = Type)) +
geom_col(show.legend = FALSE, width = 0.5) +
geom_text(aes(label = comma(n)), vjust = -0.5, size = 3) +
scale_fill_manual(values = c("Regular" = "#6F4E37", "Decaf" = "#A67C52")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.4))) +
coord_cartesian(clip = "off") +
labs(title = "Regular vs Decaf", x = NULL, y = "Frekuensi") +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))
grid.arrange(
arrangeGrob(p_market, p_type, ncol = 2),
p_decaf,
nrow = 2,
heights = c(2, 1))
Distribusi transaksi menunjukkan bahwa wilayah West dan Central mendominasi (~1.300), sementara South paling rendah (672), sehingga aktivitas lebih terpusat di dua wilayah tersebut. Dari sisi produk, Espresso memiliki transaksi terbanyak, diikuti Herbal Tea dan Coffee yang relatif seimbang, sedangkan Tea paling sedikit. Berdasarkan kafein, produk Regular jauh lebih banyak dibanding Decaf, menandakan preferensi konsumen pada minuman berkafein.
seasonal <- data %>%
group_by(Year, Month, Month_Label) %>%
summarise(Total_Sales = sum(Sales), .groups = "drop")
ggplot(seasonal, aes(x = Month_Label, y = factor(Year), fill = Total_Sales)) +
geom_tile(color = "white", linewidth = 0.5) +
geom_text(aes(label = comma(Total_Sales)), size = 3, color = "white", fontface = "bold") +
scale_fill_gradient(low = "#A67C52", high = "#3B1F0E", labels = comma) +
labs(title = "Heatmap Penjualan: Bulan dan Tahun",
x = "Bulan", y = "Tahun", fill = "Total Sales") +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold"))
Heatmap penjualan secara visual memperlihatkan perbedaan yang sangat mencolok antara tahun 2012 dan 2013. Warna hijau muda pada baris 2012 menunjukkan total penjualan bulanan yang relatif lebih rendah, berkisar antara 32.000–34.000, sementara warna coklat tua pada baris 2013 mengindikasikan lonjakan penjualan yang konsisten ke kisaran 34.000–36.000 di seluruh bulan. Hal ini menunjukkan adanya pertumbuhan bisnis yang signifikan dari tahun 2012 ke 2013. Selain itu, penjualan pada 2013 mencapai puncaknya di sekitar Juli–Agustus (warna paling gelap), yang mengisyaratkan adanya pola musiman dengan permintaan tertinggi di pertengahan tahun.
library(tidyr)
yoy <- data %>%
group_by(Year, `Product Type`) %>%
summarise(Total_Sales = sum(Sales), .groups = "drop") %>%
pivot_wider(names_from = Year, values_from = Total_Sales, names_prefix = "Y") %>%
mutate(Growth_Pct = round((Y2013 - Y2012) / Y2012 * 100, 1))
ggplot(yoy, aes(x = reorder(`Product Type`, Growth_Pct),
y = Growth_Pct, fill = Growth_Pct > 0)) +
geom_col(width = 0.6) +
coord_flip() +
geom_text(aes(label = paste0(Growth_Pct, "%")),
hjust = ifelse(yoy$Growth_Pct > 0, -0.1, 1.1), size = 4) +
scale_fill_manual(values = c("TRUE" = "#3B1F0E", "FALSE" = "#A67C52"), guide = "none") +
geom_hline(yintercept = 0, linetype = "dashed") +
labs(title = "Pertumbuhan YoY Sales per Tipe Produk (2012 → 2013)",
x = NULL, y = "Pertumbuhan (%)") +
theme_minimal(base_size = 12)
Hasil analisis pertumbuhan Year-over-Year (YoY) menunjukkan bahwa seluruh tipe produk mengalami pertumbuhan positif dari tahun 2012 ke 2013, dengan tingkat pertumbuhan yang sangat merata di kisaran 4,3% hingga 4,4%.
H₀ : Tidak terdapat hubungan yang signifikan antar variabel keuangan (r = 0)
H₁ : Terdapat hubungan yang signifikan antar variabel keuangan (r ≠ 0)
library(corrplot)
## corrplot 0.95 loaded
data_numeric <- data %>% select(where(is.numeric))
cor_matrix <- cor(data_numeric, use = "complete.obs")
suppressWarnings(
corrplot(cor_matrix,
method = "color",
type = "upper",
order = "hclust",
diag = FALSE,
tl.col = "black",
tl.srt = 45,
tl.cex = 0.5,
addCoef.col = "black",
number.cex = 0.5,
col = colorRampPalette(c("#A67C52", "white", "#3B1F0E"))(200),
title = "\nMatriks Korelasi Variabel Keuangan",
mar = c(0, 0, 2, 0)))
Matriks korelasi mengungkapkan sejumlah hubungan penting antar variabel keuangan dalam dataset ini. Terdapat korelasi sangat tinggi (>0.8) antara Sales–Margin, Sales–Budget Sales, Profit–Margin, dan COGS–Sales, yang wajar karena variabel-variabel tersebut memang saling terkait secara matematis.
Analisis Data dilakukan untuk mengetahui pola, hubungan, serta kinerja dari variabel-variabel yang diteliti. Melalui analisis ini, dapat diidentifikasi tingkat penjualan, profitabilitas, serta efektivitas strategi pemasaran pada masing-masing market. Hasil analisis juga digunakan untuk membandingkan pencapaian aktual dengan target yang telah ditetapkan, sehingga dapat memberikan dasar dalam pengambilan keputusan yang lebih tepat.
library(dplyr)
library(tidyr)
library(ggplot2)
market_summary <- data %>%
group_by(Market) %>%
summarise(
Total_Sales = sum(Sales),
Total_Profit = sum(Profit),
Total_Marketing= sum(Marketing),
Avg_Margin_pct = mean(`Profit Margin`),
Mktg_ROI = Total_Profit / Total_Marketing,
.groups = "drop")
market_summary
## # A tibble: 4 × 6
## Market Total_Sales Total_Profit Total_Marketing Avg_Margin_pct Mktg_ROI
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Central 265045 93852 39412 30.4 2.38
## 2 East 178576 59217 29442 17.2 2.01
## 3 South 103926 32478 16562 27.2 1.96
## 4 West 272264 73996 47058 -8.87 1.57
market_summary %>%
select(Market, Total_Sales, Total_Profit, Total_Marketing, Mktg_ROI) %>%
pivot_longer(cols = -Market,
names_to = "Metric",
values_to = "Value") %>%
ggplot(aes(x = Market, y = Value, fill = Metric)) +
geom_col(position = "dodge") +
theme_minimal() +
labs(
title = "Perbandingan Sales, Profit, Marketing & ROI per Market",
x = "Market",
y = "Value") +
scale_fill_manual(values = c(
"Total_Sales" = "#3B1F0E",
"Total_Profit" = "#6F4E37",
"Total_Marketing" = "#A67C52")) +
theme(
plot.title = element_text(face = "bold", size = 14),
axis.text.x = element_text(angle = 20, hjust = 1))
Hasil analisis menunjukkan bahwa setiap market memiliki karakteristik kinerja yang berbeda dalam hal penjualan, profitabilitas, margin keuntungan, serta efektivitas penggunaan biaya pemasaran. Perbedaan ini menunjukkan bahwa kontribusi setiap market terhadap perusahaan tidak hanya ditentukan oleh besarnya penjualan, tetapi juga oleh efisiensi dalam mengelola biaya dan menghasilkan keuntungan.
West dan Central mencatat penjualan tertinggi, namun Central paling unggul karena profit, margin, dan efektivitas pemasaran (ROI) tertinggi yang menandakan pengelolaan biaya yang efisien. Sebaliknya, West kurang sehat karena meski penjualannya tinggi, marginnya negatif dan ROI rendah, sehingga tidak menghasilkan keuntungan optimal.
Sementara itu, East dan South berada di tengah. East penjualannya cukup baik tapi marginnya rendah, sedangkan South penjualannya paling kecil namun relatif stabil dari sisi margin.
product_summary <- data %>%
group_by(`Product Type`) %>%
summarise(
Total_Sales = sum(Sales),
Total_Profit = sum(Profit),
Budget_Profit = sum(`Budget Profit`),
Budget_Sales = sum(`Budget Sales`),
Avg_Margin_pct = mean(`Profit Margin`),
Marketing_ROI = sum(Profit) / sum(Marketing) * 100,
Profit_Achiev = sum(Profit) / sum(`Budget Profit`) * 100,
Sales_Achiev = sum(Sales) / sum(`Budget Sales`) * 100,
.groups = "drop")
product_summary
## # A tibble: 4 × 9
## `Product Type` Total_Sales Total_Profit Budget_Profit Budget_Sales
## <fct> <dbl> <dbl> <dbl> <dbl>
## 1 Coffee 216828 74683 83880 228620
## 2 Espresso 222996 68620 71900 213480
## 3 Herbal Tea 207214 63254 58720 170460
## 4 Tea 172773 52986 44260 133600
## # ℹ 4 more variables: Avg_Margin_pct <dbl>, Marketing_ROI <dbl>,
## # Profit_Achiev <dbl>, Sales_Achiev <dbl>
library(dplyr)
library(tidyr)
library(ggplot2)
# Sales & Profit vs Budget
product_summary %>%
select(`Product Type`,
Total_Sales,
Total_Profit,
Budget_Sales,
Budget_Profit) %>%
pivot_longer(cols = -`Product Type`,
names_to = "Metric",
values_to = "Value") %>%
ggplot(aes(x = `Product Type`, y = Value, fill = Metric)) +
geom_col(position = "dodge") +
theme_minimal() +
labs(
title = "Sales & Profit vs Budget",
x = "Product Type",
y = "Value") +
scale_fill_manual(values = c(
"Total_Sales" = "#3B1F0E",
"Total_Profit" = "#5A3E2B",
"Budget_Sales" = "#A67C52",
"Budget_Profit" = "#9CAF88")) +
theme(
axis.text.x = element_text(angle = 30, hjust = 1),
plot.title = element_text(face = "bold", size = 14),
legend.position = "bottom")
# Achievement & ROI
product_summary %>%
select(`Product Type`,
Profit_Achiev,
Sales_Achiev,
Marketing_ROI) %>%
pivot_longer(cols = -`Product Type`,
names_to = "Metric",
values_to = "Value") %>%
ggplot(aes(x = `Product Type`, y = Value, fill = Metric)) +
geom_col(position = "dodge") +
theme_minimal() +
labs(
title = "Performance Metrics",
x = "Product Type",
y = "Value") +
scale_fill_manual(values = c(
"Profit_Achiev" = "#3B1F0E",
"Sales_Achiev" = "#5A3E2B",
"Marketing_ROI" = "#A67C52")) +
theme(
axis.text.x = element_text(angle = 30, hjust = 1),
plot.title = element_text(face = "bold", size = 14),
legend.position = "bottom")
Hasil analisis berdasarkan Product Type menunjukkan bahwa setiap kategori produk memiliki kontribusi yang berbeda terhadap penjualan, profit, serta efektivitas pencapaian target yang telah ditetapkan perusahaan. Perbedaan ini menggambarkan bahwa performa bisnis tidak merata antar produk, baik dari sisi keuntungan maupun pencapaian terhadap budget.
Espresso dan Coffee menjadi penyumbang penjualan terbesar, tetapi Coffee menghasilkan profit tertinggi. Ini menunjukkan bahwa penjualan tinggi belum tentu diikuti keuntungan besar karena dipengaruhi biaya dan margin.
Herbal Tea memiliki margin tertinggi (paling efisien), sedangkan Tea justru bermargin negatif sehingga berpotensi merugikan. Dari sisi pemasaran, semua produk memiliki ROI yang cukup tinggi, artinya investasi masih efektif, namun tetap perlu dibandingkan dengan profit agar tidak bias.
Untuk pencapaian target, sebagian besar produk sudah mendekati atau melampaui target. Tea dan Herbal Tea bahkan unggul dalam penjualan, meskipun tidak selalu diikuti profit yang sebanding.
product_detail <- data %>%
group_by(Product) %>%
summarise(
Total_Sales = sum(Sales),
Total_Profit = sum(Profit),
Total_Marketing= sum(Marketing),
Total_COGS = sum(COGS),
Profit_Margin = sum(Profit) / sum(Sales) * 100,
.groups = "drop") %>%
arrange(Profit_Margin)
product_detail
## # A tibble: 13 × 6
## Product Total_Sales Total_Profit Total_Marketing Total_COGS Profit_Margin
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Green Tea 32850 -231 7126 19078 -0.703
## 2 Mint 35710 6154 6108 19930 17.2
## 3 Amaretto 26269 4890 4658 12732 18.6
## 4 Caffe Mocha 84904 17678 19686 37990 20.8
## 5 Decaf Iris… 62248 13989 11362 29568 22.5
## 6 Lemon 95926 29869 15880 41494 31.1
## 7 Caffe Latte 35899 11375 5472 15294 31.7
## 8 Chamomile 75578 27231 12166 31386 36.0
## 9 Earl Grey 66772 24164 9846 28554 36.2
## 10 Decaf Espr… 78162 29502 10112 33318 37.7
## 11 Darjeeling 73151 29053 9766 30534 39.7
## 12 Regular Es… 24031 10065 2946 10398 41.9
## 13 Colombian 128311 55804 17346 48396 43.5
Hasil analisis per product menunjukkan adanya variasi kinerja yang sangat signifikan antar produk dalam hal penjualan, profit, biaya, serta efisiensi margin. Hal ini mengindikasikan bahwa tidak semua produk memberikan kontribusi yang sama terhadap profitabilitas perusahaan.
Beberapa produk seperti Colombian, Lemon, dan Caffe Mocha mencatat penjualan tinggi, menandakan permintaan kuat, namun tidak selalu sejalan dengan profit karena dipengaruhi biaya.
Dari sisi keuntungan, sebagian besar produk sudah positif, dengan Colombian, Lemon, dan Chamomile sebagai kontributor utama. Namun Green Tea mengalami kerugian (profit negatif) sehingga perlu perhatian khusus.
Meski ada produk dengan biaya tinggi seperti Caffe Latte dan Chamomile, keduanya tetap mampu menghasilkan profit yang baik, menunjukkan efisiensi biaya. Dari sisi margin, Colombian, Regular Espresso, dan Darjeeling paling efisien, sedangkan Green Tea memiliki margin negatif yang menandakan masalah pada harga atau biaya produksi.
market_size_summary <- data %>%
group_by(`Market Size`) %>%
summarise(
Total_Sales = sum(Sales),
Total_Profit = sum(Profit),
Total_Marketing= sum(Marketing),
Avg_Margin_pct = mean(`Profit Margin`),
Mktg_ROI = Total_Profit / Total_Marketing,
.groups = "drop")
market_size_summary
## # A tibble: 2 × 6
## `Market Size` Total_Sales Total_Profit Total_Marketing Avg_Margin_pct Mktg_ROI
## <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Major Market 425141 155736 64502 25.1 2.41
## 2 Small Market 394670 103807 67972 7.76 1.53
Major Market memiliki penjualan (425.141) dan profit (155.736) lebih tinggi, dengan margin rata-rata 25,1% dan ROI pemasaran 2,41, menandakan kinerja yang kuat dan efisien.Sebaliknya, Small Market memiliki penjualan (394.670) dan profit (103.807) lebih rendah, meskipun biaya marketing lebih besar, namun hanya menghasilkan margin 7,76% dan ROI 1,53, yang menunjukkan efisiensi lebih rendah.
Artinya, Major Market tidak hanya unggul dalam skala, tapi juga lebih efektif dalam menghasilkan keuntungan dibanding Small Market.
state_profit <- data %>%
group_by(State) %>%
summarise(
Total_Profit = sum(Profit),
Total_Sales = sum(Sales),
.groups = "drop") %>%
arrange(desc(Total_Profit))
top5 <- head(state_profit, 5)
bottom5 <- tail(state_profit, 5)
tb5 <- bind_rows(mutate(top5, Group = "Top 5"),
mutate(bottom5, Group = "Bottom 5"))
ggplot(tb5, aes(x = reorder(State, Total_Profit), y = Total_Profit, fill = Group)) +
geom_col() +
coord_flip() +
scale_fill_manual(values = c("Top 5" = "#3B1F0E", "Bottom 5" = "#A67C52")) +
scale_y_continuous(labels = comma) +
geom_text(aes(label = comma(Total_Profit)), hjust = -0.1, size = 3) +
labs(title = "Top 5 & Bottom 5 Negara Bagian berdasarkan Total Profit",
x = NULL, y = "Total Profit", fill = NULL) +
theme_minimal(base_size = 10)
California dan Illinois mendominasi profit tertinggi dengan masing-masing ~31.000 dan ~30.800, jauh melampaui negara bagian lainnya. Iowa, New York, dan Colorado melengkapi Top 5 dengan profit di kisaran 17.000–22.000.
Sebaliknya, New Mexico mencatat profit terendah hanya sebesar 799, diikuti New Hampshire (2.748) dan Missouri (3.601). Kesenjangan antara California dan New Mexico yang mencapai hampir 39 kali lipat mengindikasikan distribusi kinerja yang sangat tidak merata antar wilayah, sehingga perlu adanya evaluasi strategi bisnis di wilayah-wilayah dengan performa rendah.
tabel_bulanan <- data %>%
group_by(Year, Month, Month_Label) %>%
summarise(
Total_Sales = sum(Sales),
Total_Profit = sum(Profit),
Profit_Margin_pct = sum(Profit) / sum(Sales) * 100,
.groups = "drop") %>%
arrange(Year, Month)
data_bulanan <- tabel_bulanan %>%
select(Year, Month_Label, Total_Sales, Total_Profit, Profit_Margin_pct) %>%
rename(Tahun = Year, Bulan = Month_Label,
`Sales ($)` = Total_Sales,
`Profit ($)` = Total_Profit,
`Margin (%)` = Profit_Margin_pct) %>%
mutate(across(c(`Sales ($)`, `Profit ($)`), ~format(., big.mark = ",")),
`Margin (%)` = round(`Margin (%)`, 1))
data_bulanan
## # A tibble: 24 × 5
## Tahun Bulan `Sales ($)` `Profit ($)` `Margin (%)`
## <dbl> <ord> <chr> <chr> <dbl>
## 1 2012 Jan 31,555 " 8,041" 25.5
## 2 2012 Feb 32,092 " 8,369" 26.1
## 3 2012 Mar 32,245 " 8,365" 25.9
## 4 2012 Apr 32,943 " 8,670" 26.3
## 5 2012 May 33,692 " 8,947" 26.6
## 6 2012 Jun 35,125 " 9,571" 27.2
## 7 2012 Jul 36,161 " 9,905" 27.4
## 8 2012 Aug 36,029 " 9,566" 26.6
## 9 2012 Sep 33,092 " 8,508" 25.7
## 10 2012 Oct 32,849 " 8,674" 26.4
## # ℹ 14 more rows
Nilai sales antara 2012 dan 2013 relatif tidak berbeda jauh, berkisar di rentang 31.000–36.000 per bulan di kedua tahun. Namun yang mencolok adalah lonjakan profit margin dari rata-rata ~26% di 2012 menjadi ~37% di 2013, mengindikasikan adanya efisiensi biaya yang signifikan di tahun kedua meskipun volume penjualan tidak meningkat drastis. Puncak performa terbaik terjadi pada Juli di kedua tahun, dengan margin tertinggi dicapai Juli 2013 sebesar 38,2%.
tabel_tahunan <- data %>%
group_by(Year) %>%
summarise(
Total_Sales = sum(Sales),
Total_Profit = sum(Profit),
Budget_Sales = sum(`Budget Sales`),
Budget_Profit = sum(`Budget Profit`),
Profit_Margin_pct = sum(Profit) / sum(Sales) * 100,
Sales_Achiev_pct = sum(Sales) / sum(`Budget Sales`) * 100,
Profit_Achiev_pct = sum(Profit) / sum(`Budget Profit`) * 100,
.groups = "drop")
data_tahunan <- tabel_tahunan %>%
rename(Tahun = Year,
`Sales ($)` = Total_Sales, `Profit ($)` = Total_Profit,
`Budget Sales ($)` = Budget_Sales, `Budget Profit ($)` = Budget_Profit,
`Margin (%)` = Profit_Margin_pct,
`Sales Achiev (%)` = Sales_Achiev_pct,
`Profit Achiev (%)` = Profit_Achiev_pct) %>%
mutate(across(contains("($)"), ~format(., big.mark = ",")),
across(contains("(%)"), ~round(., 1)))
data_tahunan
## # A tibble: 2 × 8
## Tahun `Sales ($)` `Profit ($)` `Budget Sales ($)` `Budget Profit ($)`
## <dbl> <chr> <chr> <chr> <chr>
## 1 2012 401,159 105,826 373,080 129,380
## 2 2013 418,652 153,717 373,080 129,380
## # ℹ 3 more variables: `Margin (%)` <dbl>, `Sales Achiev (%)` <dbl>,
## # `Profit Achiev (%)` <dbl>
Secara keseluruhan, perusahaan menunjukkan peningkatan kinerja yang signifikan dari 2012 ke 2013. Dari sisi pencapaian sales, kedua tahun berhasil melampaui target yaitu 2012 mencapai 107,5% dan 2013 meningkat menjadi 112,2% dari budget yang sama (373.080).
Yang paling mencolok adalah perubahan pada pencapaian profit. Di 2012, realisasi profit hanya mencapai 81,8% dari target (105.826 dari budget 129.380), artinya perusahaan gagal memenuhi target laba. Namun di 2013, kondisi berbalik drastis dengan pencapaian profit mencapai 118,8% (153.717), jauh melampaui anggaran. Hal ini sejalan dengan lonjakan profit margin dari 26,4% menjadi 36,7%, yang mencerminkan perbaikan efisiensi operasional yang nyata di tahun 2013.
tabel_pivot <- tabel_bulanan %>%
select(Year, Month_Label, Total_Sales, Total_Profit) %>%
pivot_wider(
names_from = Year,
values_from = c(Total_Sales, Total_Profit),
names_glue = "{.value}_{Year}") %>%
rename(Bulan = Month_Label) %>%
mutate(
Growth_Sales_pct = (Total_Sales_2013 - Total_Sales_2012) / Total_Sales_2012 * 100,
Growth_Profit_pct = (Total_Profit_2013 - Total_Profit_2012) / Total_Profit_2012 * 100)
data_rekap <- tabel_pivot %>%
mutate(across(starts_with("Total_"), ~format(., big.mark = ",")),
across(ends_with("_pct"), ~paste0(round(., 1), "%")))
data_rekap
## # A tibble: 12 × 7
## Bulan Total_Sales_2012 Total_Sales_2013 Total_Profit_2012 Total_Profit_2013
## <ord> <chr> <chr> <chr> <chr>
## 1 Jan 31,555 35,316 8,041 12,524
## 2 Feb 32,092 34,192 8,369 12,419
## 3 Mar 32,245 34,355 8,365 12,415
## 4 Apr 32,943 35,112 8,670 12,863
## 5 May 33,692 33,394 8,947 12,348
## 6 Jun 35,125 34,807 9,571 13,218
## 7 Jul 36,161 35,830 9,905 13,671
## 8 Aug 36,029 35,707 9,566 13,205
## 9 Sep 33,092 35,269 8,508 12,627
## 10 Oct 32,849 34,987 8,674 12,878
## 11 Nov 32,003 34,103 8,399 12,460
## 12 Dec 33,373 35,580 8,811 13,089
## # ℹ 2 more variables: Growth_Sales_pct <chr>, Growth_Profit_pct <chr>
Secara umum, pertumbuhan profit jauh lebih besar dibandingkan pertumbuhan sales di setiap bulannya, mencerminkan efisiensi biaya yang konsisten sepanjang 2013.
Dari sisi sales, sebagian besar bulan tumbuh positif di kisaran 6,5%–6,6%, namun terdapat anomali menarik pada Mei–Agustus yang justru mencatat pertumbuhan negatif (-0,9%). Ini mengindikasikan bahwa penjualan di pertengahan tahun 2013 sedikit lebih rendah dibanding periode yang sama di 2012, kemungkinan karena 2012 mencapai puncaknya di Juli (36.161) yang sulit dilampaui.
Sebaliknya, pertumbuhan profit tetap positif di semua bulan tanpa kecuali, berkisar antara 38%–55,8%. Pertumbuhan tertinggi terjadi pada Januari (55,8%) yang sekaligus menjadi sinyal bahwa perbaikan efisiensi sudah terasa sejak awal tahun 2013. Meskipun sales sempat menurun di pertengahan tahun, profit tetap tumbuh ~38% yang membuktikan bahwa perusahaan berhasil menekan biaya secara signifikan di seluruh periode.
ggplot(tabel_bulanan, aes(x = Month_Label, y = Total_Sales,
group = factor(Year),
color = factor(Year))) +
geom_line(size = 1) +
geom_point() +
scale_color_manual(values = c(
"2012" = "#3B1F0E",
"2013" = "#A67C52")) +
labs(
title = "Tren Penjualan Bulanan: 2012 vs 2013",
x = "Bulan",
y = "Total Penjualan ($)",
color = "Tahun") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Grafik memperlihatkan perbedaan pola yang jelas antara kedua tahun. Penjualan 2012 (merah) memiliki fluktuasi yang lebih besar, dimulai rendah di Januari (~31.555), naik tajam hingga puncaknya di Juli (~36.161), lalu turun drastis di September–November sebelum sedikit pulih di Desember.
Sebaliknya, penjualan 2013 (hijau) menunjukkan pola yang lebih stabil dan konsisten, bergerak di rentang 33.000–36.000 sepanjang tahun tanpa penurunan yang tajam. Menariknya, 2013 justru lebih unggul di awal dan akhir tahun (Januari dan Desember), namun sedikit di bawah 2012 pada Juni–Agustus.
Secara keseluruhan, tren 2013 mencerminkan distribusi penjualan yang lebih merata sepanjang tahun, mengindikasikan manajemen penjualan yang lebih matang dibandingkan 2012.
Hipotesis:
H₀ : Variabel Sales, COGS, Marketing, Inventory, dan Total Expenses secara bersama-sama tidak berpengaruh signifikan terhadap Profit (β₁ = β₂ = β₃ = β₄ = β₅ = 0)
H₁: Minimal satu variabel prediktor berpengaruh signifikan terhadap Profit
Hipotesis parsial (per variabel):
H₀: Variabel ke-i tidak berpengaruh signifikan terhadap Profit (βᵢ = 0)
H₁: Variabel ke-i berpengaruh signifikan terhadap Profit (βᵢ ≠ 0)
model_lm <- lm(Profit ~ Sales + COGS + Marketing + Inventory + `Total Expenses`,
data = data)
summary(model_lm)
##
## Call:
## lm(formula = Profit ~ Sales + COGS + Marketing + Inventory +
## `Total Expenses`, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -112.138 -5.735 0.558 5.560 105.255
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.2468856 0.7853165 2.861 0.00424 **
## Sales 1.2093422 0.0047448 254.878 < 2e-16 ***
## COGS -1.2454180 0.0144460 -86.212 < 2e-16 ***
## Marketing 0.1936981 0.0409383 4.731 2.3e-06 ***
## Inventory 0.0002270 0.0006511 0.349 0.72732
## `Total Expenses` -1.3982287 0.0317919 -43.981 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.86 on 4242 degrees of freedom
## Multiple R-squared: 0.9726, Adjusted R-squared: 0.9725
## F-statistic: 3.007e+04 on 5 and 4242 DF, p-value: < 2.2e-16
df_pred <- data %>%
mutate(Predicted_Profit = predict(model_lm, data))
ggplot(df_pred, aes(x = Predicted_Profit, y = Profit)) +
geom_point(alpha = 0.3, color = "#5C6BC0", size = 1.5) +
geom_abline(intercept = 0, slope = 1, color = "red", size = 1) +
scale_x_continuous(labels = comma) +
scale_y_continuous(labels = comma) +
labs(title = "Regresi Linear: Actual vs Predicted Profit",
subtitle = paste0("R² = ", round(summary(model_lm)$r.squared, 3)),
x = "Predicted Profit", y = "Actual Profit") +
theme_minimal(base_size = 12)
Model regresi linear yang dibangun menggunakan lima prediktor (Sales, COGS, Marketing, Inventory, Total Expenses) menghasilkan R² = 0,9726, artinya model mampu menjelaskan 97,26% variasi profit.
Dari hasil koefisien, diperoleh temuan sebagai berikut: - Sales (1,209): setiap kenaikan 1 unit sales meningkatkan profit sebesar 1,209 - COGS (-1,245): setiap kenaikan biaya produksi menurunkan profit, dengan dampak terbesar di antara semua prediktor - Marketing (0,194): investasi pemasaran berkontribusi nyata terhadap profit - Total Expenses (-1,398): kenaikan total biaya operasional paling kuat menekan profit - Inventory (0,0002): stok persediaan tidak terbukti mempengaruhi profit secara statistik
Secara keseluruhan, model ini sangat layak digunakan untuk prediksi profit. Hasil utamanya adalah efisiensi biaya (COGS dan Total Expenses) jauh lebih menentukan profit dibandingkan peningkatan penjualan, sehingga strategi penekanan biaya operasional perlu menjadi prioritas utama perusahaan.
library(forecast)
## Warning: package 'forecast' was built under R version 4.5.3
ts_monthly <- data %>%
group_by(Date) %>%
summarise(Total_Sales = sum(Sales), .groups = "drop") %>%
arrange(Date)
sales_ts <- ts(ts_monthly$Total_Sales, start = c(2012, 1), frequency = 12)
fit_arima <- auto.arima(sales_ts, seasonal = TRUE)
summary(fit_arima)
## Series: sales_ts
## ARIMA(0,1,0)
##
## sigma^2 = 1333268: log likelihood = -194.82
## AIC=391.64 AICc=391.83 BIC=392.78
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 169.0231 1130.361 896.2731 0.4498417 2.619954 0.5369316
## ACF1
## Training set -0.001023189
fc <- forecast(fit_arima, h = 6)
autoplot(fc) +
scale_y_continuous(labels = comma) +
labs(title = "Forecast Sales 6 Bulan ke Depan (ARIMA)",
subtitle = "Batas biru = interval kepercayaan 80% & 95%",
x = NULL, y = "Total Sales") +
theme_minimal(base_size = 12)
Model yang terpilih secara otomatis adalah ARIMA(0,1,0) atau random walk yang berarti perubahan penjualan dari bulan ke bulan bersifat acak tanpa pola tren atau musiman yang kuat. Hal ini konsisten dengan hasil sebelumnya bahwa korelasi antara bulan dan variabel keuangan sangat lemah. Dari sisi akurasi model, nilai MAPE sebesar 2,62% menunjukkan tingkat kesalahan prediksi yang tergolong rendah, artinya model cukup andal dalam merepresentasikan data historis.
Hasil forecast memperlihatkan prediksi penjualan 6 bulan ke depan (2014) stabil di sekitar 35.000–36.000 tanpa tren naik maupun turun yang signifikan. Interval kepercayaan yang semakin melebar ke kanan mencerminkan ketidakpastian yang meningkat seiring jauhnya horizon prediksi dengan batas 95% bahkan menyentuh kisaran 30.000–40.000 di ujung forecast. Ini menandakan bahwa meskipun prediksi titik cukup stabil, variabilitas aktual bisa cukup besar sehingga perlu kehati-hatian dalam penggunaan forecast ini sebagai dasar perencanaan jangka menengah.
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.5.3
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
cluster_df <- data %>%
group_by(Product) %>%
summarise(
Avg_Sales = mean(Sales),
Avg_Profit = mean(Profit),
Avg_Margin = mean(Margin),
Avg_COGS = mean(COGS),
Avg_Mkt = mean(Marketing),
.groups = "drop"
)
set.seed(42)
cluster_scaled <- scale(cluster_df[, -1])
# Elbow method
fviz_nbclust(cluster_scaled, kmeans, method = "wss") +
labs(title = "Elbow Method: Jumlah Cluster Optimal")
# K-Means k = 3
km_fit <- kmeans(cluster_scaled, centers = 3, nstart = 25)
cluster_df$Cluster <- factor(km_fit$cluster)
print(cluster_df %>% select(Product, Cluster, Avg_Sales, Avg_Profit))
## # A tibble: 13 × 4
## Product Cluster Avg_Sales Avg_Profit
## <fct> <fct> <dbl> <dbl>
## 1 Amaretto 1 137. 25.5
## 2 Caffe Latte 1 166. 52.7
## 3 Caffe Mocha 3 177. 36.8
## 4 Chamomile 3 197. 70.9
## 5 Colombian 2 267. 116.
## 6 Darjeeling 3 190. 75.7
## 7 Decaf Espresso 3 192. 72.3
## 8 Decaf Irish Cream 1 162. 36.4
## 9 Earl Grey 3 232. 83.9
## 10 Green Tea 1 114. -0.802
## 11 Lemon 3 200. 62.2
## 12 Mint 3 186. 32.1
## 13 Regular Espresso 2 334. 140.
fviz_cluster(km_fit,
data = cluster_scaled,
palette = c("#3B1F0E", "#A67C52", "#6F4E37"),
ggtheme = theme_minimal()) +
labs(title = "Clustering Produk Berdasarkan Kinerja Keuangan")
Elbow method menunjukkan bahwa k = 3 merupakan jumlah cluster optimal, terlihat dari “siku” yang terbentuk di titik tersebut sebelum penurunan WSS mulai melandai.
Hasil clustering membagi 13 produk ke dalam tiga kelompok dengan karakteristik berbeda: Cluster 1: Performa Rendah (Amaretto, Caffe Latte, Decaf Irish Cream, Green Tea) Produk-produk ini memiliki rata-rata sales (114–166) dan profit (−0,8–52,7) terendah. Yang perlu mendapat perhatian khusus adalah Green Tea yang mencatat profit negatif (−0,802), satu-satunya produk yang merugi.
Cluster 2: Performa Tinggi (Colombian, Regular Espresso) Hanya dua produk namun keduanya adalah bintang portofolio — Colombian (sales 267, profit 116) dan Regular Espresso (sales 334, profit 140) jauh melampaui produk lainnya. Kedua produk ini menjadi kontributor utama pendapatan perusahaan.
Cluster 3: Performa Menengah (Caffe Mocha, Chamomile, Darjeeling, Decaf Espresso, Earl Grey, Lemon, Mint) Kelompok terbesar dengan 7 produk, memiliki sales di kisaran 177–232 dan profit 32–84. Earl Grey dan Chamomile menjadi yang terbaik di klaster ini.
Secara strategis, perusahaan sebaiknya memaksimalkan investasi pada Cluster 2, mengoptimalkan efisiensi Cluster 3, dan mengevaluasi ulang Cluster 1, terutama Green Tea yang perlu dikaji apakah layak dilanjutkan atau direposisi.
state_cluster <- data %>%
group_by(State) %>%
summarise(
Avg_Sales = mean(Sales),
Avg_Profit = mean(Profit),
Avg_COGS = mean(COGS),
.groups = "drop"
)
set.seed(42)
state_scaled <- scale(state_cluster[, -1])
km_state <- kmeans(state_scaled, centers = 3, nstart = 25)
state_cluster$Cluster <- factor(km_state$cluster)
print(state_cluster %>% arrange(Cluster))
## # A tibble: 20 × 5
## State Avg_Sales Avg_Profit Avg_COGS Cluster
## <fct> <dbl> <dbl> <dbl> <fct>
## 1 Connecticut 151. 45.4 62.3 1
## 2 Florida 173. 57.0 71.7 1
## 3 Louisiana 138. 43.8 55.9 1
## 4 Missouri 114. 16.7 52.9 1
## 5 New Hampshire 88.6 16.4 33.7 1
## 6 New Mexico 94.6 4.76 45.2 1
## 7 Ohio 160. 49.9 67.7 1
## 8 Oklahoma 163. 50.9 66.9 1
## 9 Oregon 155. 47.1 65.5 1
## 10 Utah 123. 26.9 54.7 1
## 11 Washington 162. 47.5 65.9 1
## 12 Wisconsin 153. 40.3 63.1 1
## 13 Colorado 182. 67.2 77.3 2
## 14 Iowa 253. 103. 109. 2
## 15 Massachusetts 208. 114. 63.0 2
## 16 Nevada 228. 40.2 119. 2
## 17 Texas 223. 93.8 93.3 2
## 18 California 336. 110. 158. 3
## 19 Illinois 324. 143. 136. 3
## 20 New York 369. 105. 183. 3
fviz_cluster(km_state, data = state_scaled,
palette = c("#3B1F0E", "#7CB99A", "#6F4E37"),
ggtheme = theme_minimal()) +
labs(title = "Clustering Negara Bagian Berdasarkan Kinerja")
Hasil clustering membagi 20 negara bagian ke dalam tiga kelompok berdasarkan rata-rata Sales, Profit, dan COGS:
Cluster 1: Performa Rendah (12 negara bagian: Connecticut, Florida, Louisiana, Missouri, New Hampshire, New Mexico, Ohio, Oklahoma, Oregon, Utah, Washington, Wisconsin) Kelompok terbesar dengan sales rata-rata 88–173 dan profit 4,76–57. New Mexico menjadi yang terburuk dengan profit hanya 4,76, jauh di bawah anggota cluster lainnya. Sebagian besar merupakan wilayah Small Market dengan skala bisnis yang terbatas.
Cluster 2: Performa Menengah (Colorado, Iowa, Massachusetts, Nevada, Texas) Sales berkisar 182–253 dengan profit 40–114. Massachusetts menarik perhatian karena memiliki profit tinggi (114) dengan COGS relatif rendah (63), menandakan efisiensi biaya yang baik. Sebaliknya, Nevada memiliki COGS sangat tinggi (119) namun profit rendah (40,2) yang mengindikasikan inefisiensi yang perlu dievaluasi.
Cluster 3: Performa Tinggi (California, Illinois, New York) Hanya tiga negara bagian namun mendominasi kinerja keseluruhan dengan sales 324–369 dan profit 105–143. Illinois mencatat profit tertinggi (143) meski sales-nya lebih rendah dari New York, menunjukkan efisiensi biaya terbaik di klaster ini. Namun COGS ketiga negara bagian ini juga tertinggi, sehingga pengendalian biaya tetap perlu diperhatikan.
Secara strategis, perusahaan perlu mempertahankan momentum di Cluster 3, mengoptimalkan efisiensi di Cluster 2 khususnya Nevada, dan mengevaluasi model bisnis di Cluster 1 terutama New Mexico yang hampir tidak menghasilkan profit.
Berdasarkan analisis Coffee Chain Dataset periode 2012–2013, kinerja perusahaan menunjukkan peningkatan signifikan. Meskipun pertumbuhan penjualan relatif moderat (~4,3–4,4%), profit margin meningkat tajam dari 26% menjadi 37%. Perusahaan juga berhasil beralih dari tidak mencapai target laba pada 2012 (81,8%) menjadi melampauinya pada 2013 (118,8%), yang mencerminkan perbaikan efisiensi operasional.
Namun, terdapat kesenjangan kinerja antar wilayah dan produk. Central Market menjadi yang paling efisien, sementara West Market perlu perhatian karena margin negatif meski penjualannya tinggi. Secara geografis, California dan Illinois mendominasi profit, sedangkan New Mexico hampir tidak berkontribusi, menunjukkan ketimpangan yang besar.
Analisis juga menegaskan bahwa efisiensi biaya lebih berpengaruh terhadap profit dibanding volume penjualan, dibuktikan oleh model regresi (R² = 0,9726) di mana COGS dan total expenses berdampak negatif signifikan, sementara inventory tidak berpengaruh. Dari sisi produk, Colombian dan Regular Espresso menjadi unggulan, sedangkan Green Tea merugi sehingga perlu evaluasi.
Selain itu, tidak ditemukan pola musiman yang kuat, dengan penjualan cenderung stabil dan proyeksi ke depan berada di kisaran 35.000–36.000. Oleh karena itu, perusahaan disarankan untuk fokus pada efisiensi biaya, mengoptimalkan produk dan wilayah yang unggul, serta mengevaluasi produk dan area yang tidak efisien.