A. PENDAHULUAN

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.


B. Deskripsi Data

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:

  1. Informasi Umum
  1. Area Code: Kode area
  2. Market: Daerah atau Wilayah pasar
  3. Market Size: Ukuran pasar (market)
  4. State: Negara bagian tempat penjualan
  5. Date: Tanggal transaksi
  1. Informasi Produk
  1. Product: Nama produk spesifik
  2. Product Line: Bahan baku produk
  3. Product Type: Kategori produk
  4. Type: Jenis kafein
  1. Informasi Realisasi Keuangan
  1. Sales: Total pendapatan penjualan
  2. COGS (Cost of Goods Sold): Harga Pokok Penjualan (HPP)
  3. Margin: Laba kotor
  4. Profit: Laba bersih
  5. Total Expenses: Total biaya operasional
  6. Marketing: Biaya pemasaran
  7. Inventory: Stok persediaan barang
  1. Informasi Anggaran Keuangan
  1. Budget Sales: Target penjualan yang diharapkan
  2. Budget COGS: Estimasi biaya produksi yang dianggarkan
  3. Budget Margin: Target laba kotor yang diharapkan
  4. Budget Profit: Target laba bersih yang ingin dicapa

a. Pemeriksaan Tipe Data

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

b. Pemeriksaan Kelengkapan Data

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.

c. Pembentukan Kolom Baru

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.

  1. Profit Margin: Mengukur persentase keuntungan dari penjualan
  2. Marketing Efficiency: Menunjukkan seberapa efektif biaya marketing menghasilkan profit
  3. COGS Ratio: Persentase biaya produksi terhadap penjualan
  4. Expense Ratio: Persentase total biaya terhadap penjualan
  5. Gap Profit: Selisih antara realisasi profit dan target (budget)
  6. Gap Sales: Selisih penjualan aktual vs target
  7. Achiev Profit: Persentase pencapaian profit terhadap target
  8. Achiev Sales: Persentase pencapaian penjualan

d. Statistik Deskriptif

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

C. EKPLORASI DATA

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.

a. Distribusi sales per produk

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.

b. Distribusi frekuensi transaksi per kategori.

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.

c. Heatmap Pola Musiman

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.

d. Pertumbuhan YoY per Tipe Produk

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%.

e. Korelasi

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.

  • Marketing–Sales: korelasi positif yang kuat, mengindikasikan bahwa peningkatan investasi pemasaran berkaitan erat dengan peningkatan penjualan
  • Budget Profit–Profit: menunjukkan bahwa perencanaan anggaran perusahaan cukup akurat dalam memperkirakan laba aktual
  • Month vs variabel keuangan: hampir tidak berkorelasi, mengonfirmasi bahwa tidak ada pola musiman yang dominan secara statistik dalam data ini
  • Profit Margin & Marketing Efficiency vs COGS Ratio: berkorelasi negatif, artinya semakin besar proporsi biaya produksi terhadap penjualan, semakin rendah efisiensi keuntungan yang dihasilkan
  • Gap Profit–Profit: korelasi positif moderat yang menunjukkan bahwa produk dengan profit lebih tinggi cenderung juga melebihi target anggaran yang ditetapkan

D. Analisis Data

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.

a. Ringkasan Kinerja Setiap Market

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.

b. Ringkasan Kinerja Setiap Kategori Produk

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.

c. Ringkasan Kinerja Setiap Jenis Produk

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.

d. Ringkasan Kinerja Setiap Ukuran Pasar

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.

e.Top & Bottom 5 Negara Bagian

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.

f. Total Penjualan dan Keuntungan per Bulan

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%.

g. Total Penjualan dan Keuntungan per Tahun

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.

h. Rekap Bulanan per Tahun

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.

i. Analisis Time Series

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.

j. Analisis Regresi Linear: Prediksi Profit

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.

k. Forecasting Penjualan (ARIMA)

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.

l. Clustering Produk (K-Means)

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.

m. Clustering Negara Bagian (K-Means)

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.


E. Kesimpulan

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.