Analisis Pola Penjualan Kopi dan Teh Berdasarkan Lokasi Pasar Menggunakan Pendekatan Statistik

Arini Damafika Asri (M0724006)

LATAR BELAKANG

Kopi dan teh menjadi dua komoditas minuman yang paling banyak dikonsumsi. Keduanya memiliki manfaat bagi kesehatan dan peran penting dalam berbagai budaya. Teh merupakan minuman dari daun camellia sinensis, banyak ragam jenis yang dimilikinya. Di antaranya teh hijau, teh hitam, teh putih, oolong, dsb. Teh memiliki kandungan antioksidan yang tinggi yang dapat menurunkan kolestrol jahat, menjaga berat badan karena meningkatkan metabolisme tubuh, dan mengurangi stres yang berasal dari kandungan theanine. Sedangkan kopi berasal dari biji Coffea dengan dua varietas utama yaitu arabika dan robusta. Kopi mengandung kafein yang mampu meningkatkan energi, mengurangi resiko penyakit alzheimer & parkinson, serta menurunkan resiko diabetes jika dikonsumsi tanpa gula berlebih. Kopi dan teh juga memiliki peran budaya seperti tradisi ngopi (Indonesia) maupun tea time (Inggris). Pilihan antara keduanya seringkali bergantung pada selera, kebutuhan energi, hingga momen yang ingin dinikmati.

Di antara negara-negara konsumen terbesar di dunia, Amerika Serikat menempati posisi yang cukup signifikan dalam pasar kopi dan teh secara global. Tahun 2024, National Coffee Assosiation (NCA) melaporkan 45% orang dewasa Amerika mengonsumsi kopi setiap hari, meningkat 80% sejak 2011. Tidak hanya kopi, konsumsi teh juga menunjukkan tren yang meningkat. Namun, pola konsumsi teh dan kopi tidak seragam. Terdapat variasi yang cukup antarwilayah sesuai dengan karakteristik demografis, budaya, dan kondisi ekonomi masing-masing daerah.

Keragaman pola konsumsi menjadi tantangan sekaligus peluang bagi pelaku industri minuman. Oleh karena itu dilakukan analisis berbasis lokasi pasar agar lebih relevan dalam memahami dinamika penjualan secara mendalam. Dalam analisis ini dimanfaatkan data penjualan kopi dan teh di Amerika Serikat tahun 2012 untuk kemudian dianalisis menggunakan metode statistik sehingga diharapkan dapat diperoleh gambaran mengenai pola penjualan kopi dan teh di berbagai wilayah pasar Amerika Serikat.

Deskripsi Data

library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.2
## 
## 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(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.2
## Warning: package 'tidyr' was built under R version 4.4.2
## Warning: package 'readr' was built under R version 4.4.2
## Warning: package 'purrr' was built under R version 4.4.2
## Warning: package 'stringr' was built under R version 4.4.2
## Warning: package 'forcats' was built under R version 4.4.2
## Warning: package 'lubridate' was built under R version 4.4.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ✔ readr     2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
coffee_chains = read_excel("C:/Users/arini/Downloads/1. Tugas SIM 2025B - Coffee Chain Datasets/1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx")
head(coffee_chains)
## # 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>

Beberapa hal yang dapat diketahui melalui variabel-variabel yang ada pada dataset tersebut:

  • Area Code : Kode area

  • Market : Daerah atau wilayah

  • Market Size : Ukuran dari Market

  • Product : Jenis dari produk (Kopi atau Teh)

  • Product Line : Bentuk dari produk

  • Product Type : Tipe dari produk.

  • State : Negara bagian (Amerika Serikat).

  • Type : Jenis produk, kafein atau tanpa kafein.

  • Budget COGS : Estimasi biaya pokok penjualan.

  • Budget Margin : Estimasi margin keuntungan.

  • Budget Profit : Estimasi keuntungan.

  • Budget Sales : Estimasi total penjualan.

  • COGS : Biaya pokok penjualan aktual.

  • Inventory : Jumlah stok barang yang tersedia.

  • Margin : Margin keuntungan aktual.

  • Profit : Keuntungan aktual.

  • Sales : Total penjualan aktual.

  • Total Expenses: Total seluruh biaya yang dikeluarkan.

    Eksplorasi Data

    Eksplorasi data menjadi langkah awal dan utama yang dapat memberikan gambaran dan pemahaman mengenai data. Tahap ini dilakukan untuk mengetahui tipe data, sebaran data, dan beberapa visualisasi dasar yang menggambarkan data.

    Cek Tipe Data

    str(coffee_chains)
    ## 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 4248 baris/observasi dengan 20 kolom/variabel. Terdapat 12 variabel numerik, 7 variabel teks atau character, dan 1 variabel POSIXct (date time).

Cek Missing Value

colSums(is.na(coffee_chains))
##      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

Berdasarkan hasil pengecekan, terlihat dataset ini tidak memiliki missing value. Artinya setiap variabel memiliki nilai observasi.

Cek Data Unik

for(col in names(coffee_chains)) {
  if(is.character(coffee_chains[[col]])) {
    cat("\nNilai unik pada kolom : ", col, ":\n")
    print(unique(coffee_chains[[col]]))
  }
}
## 
## Nilai unik pada kolom :  Market :
## [1] "Central" "East"    "South"   "West"   
## 
## Nilai unik pada kolom :  Market Size :
## [1] "Major Market" "Small Market"
## 
## Nilai unik pada kolom :  Product :
##  [1] "Amaretto"          "Colombian"         "Decaf Irish Cream"
##  [4] "Green Tea"         "Caffe Mocha"       "Decaf Espresso"   
##  [7] "Chamomile"         "Lemon"             "Mint"             
## [10] "Darjeeling"        "Earl Grey"         "Regular Espresso" 
## [13] "Caffe Latte"      
## 
## Nilai unik pada kolom :  Product Line :
## [1] "Beans"  "Leaves"
## 
## Nilai unik pada kolom :  Product Type :
## [1] "Coffee"     "Tea"        "Espresso"   "Herbal Tea"
## 
## Nilai unik pada kolom :  State :
##  [1] "Colorado"      "Illinois"      "Iowa"          "Missouri"     
##  [5] "Ohio"          "Wisconsin"     "Connecticut"   "Florida"      
##  [9] "Massachusetts" "New Hampshire" "New York"      "Louisiana"    
## [13] "New Mexico"    "Oklahoma"      "Texas"         "Utah"         
## [17] "California"    "Nevada"        "Oregon"        "Washington"   
## 
## Nilai unik pada kolom :  Type :
## [1] "Regular" "Decaf"

Statistik Deskriptif

Langkah pertama, dilakukan penghapusan untuk variabel Area Code karena merupakan data unik dan tidak diperlukan dalam analisis.

coffee_chains = coffee_chains[, -1]
head(coffee_chains)
## # A tibble: 6 × 19
##   Date                Market `Market Size` Product `Product Line` `Product Type`
##   <dttm>              <chr>  <chr>         <chr>   <chr>          <chr>         
## 1 2012-01-01 00:00:00 Centr… Major Market  Amaret… Beans          Coffee        
## 2 2012-01-01 00:00:00 Centr… Major Market  Colomb… Beans          Coffee        
## 3 2012-01-01 00:00:00 Centr… Major Market  Decaf … Beans          Coffee        
## 4 2012-01-01 00:00:00 Centr… Major Market  Green … Leaves         Tea           
## 5 2012-01-01 00:00:00 Centr… Major Market  Caffe … Beans          Espresso      
## 6 2012-01-01 00:00:00 Centr… Major Market  Decaf … Beans          Espresso      
## # ℹ 13 more variables: 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>

Mean

\[\bar{x} = \frac{\sum_{i=1}^{n} x_i}{n}\]

Q1 (Kuartil 1)

\[Q_1 = L_{Q_1} + \left(\frac{\frac{n}{4} - F}{f_{Q_1}}\right) \times c\]

Q2 (Median/Kuartil 2)

\[Q_2 = L_{Q_2} + \left(\frac{\frac{2n}{4} - F}{f_{Q_2}}\right) \times c\]

Q3 (Kuartil 3)

\[Q_3 = L_{Q_3} + \left(\frac{\frac{3n}{4} - F}{f_{Q_3}}\right) \times c\]

Variansi

\[s^2 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n-1}\]

Standar Deviasi

\[s = \sqrt{\frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n-1}}\]

summary(coffee_chains)
##       Date                        Market          Market Size       
##  Min.   :2012-01-01 00:00:00   Length:4248        Length:4248       
##  1st Qu.:2012-06-23 12:00:00   Class :character   Class :character  
##  Median :2012-12-16 12:00:00   Mode  :character   Mode  :character  
##  Mean   :2012-12-15 22:00:00                                        
##  3rd Qu.:2013-06-08 12:00:00                                        
##  Max.   :2013-12-01 00:00:00                                        
##    Product          Product Line       Product Type          State          
##  Length:4248        Length:4248        Length:4248        Length:4248       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##      Type            Budget COGS     Budget Margin    Budget Profit    
##  Length:4248        Min.   :  0.00   Min.   :-210.0   Min.   :-320.00  
##  Class :character   1st Qu.: 30.00   1st Qu.:  50.0   1st Qu.:  20.00  
##  Mode  :character   Median : 50.00   Median :  70.0   Median :  40.00  
##                     Mean   : 74.83   Mean   : 100.8   Mean   :  60.91  
##                     3rd Qu.: 90.00   3rd Qu.: 130.0   3rd Qu.:  80.00  
##                     Max.   :450.00   Max.   : 690.0   Max.   : 560.00  
##   Budget Sales         COGS          Inventory           Margin       
##  Min.   :   0.0   Min.   :  0.00   Min.   :-3534.0   Min.   :-302.00  
##  1st Qu.:  80.0   1st Qu.: 43.00   1st Qu.:  432.0   1st Qu.:  52.75  
##  Median : 130.0   Median : 60.00   Median :  619.0   Median :  76.00  
##  Mean   : 175.6   Mean   : 84.43   Mean   :  749.4   Mean   : 104.29  
##  3rd Qu.: 210.0   3rd Qu.:100.00   3rd Qu.:  910.5   3rd Qu.: 132.00  
##  Max.   :1140.0   Max.   :364.00   Max.   : 8252.0   Max.   : 613.00  
##    Marketing          Profit           Sales     Total Expenses  
##  Min.   :  0.00   Min.   :-638.0   Min.   : 17   Min.   : 10.00  
##  1st Qu.: 13.00   1st Qu.:  17.0   1st Qu.:100   1st Qu.: 33.00  
##  Median : 22.00   Median :  40.0   Median :138   Median : 46.00  
##  Mean   : 31.19   Mean   :  61.1   Mean   :193   Mean   : 54.06  
##  3rd Qu.: 39.00   3rd Qu.:  92.0   3rd Qu.:230   3rd Qu.: 65.00  
##  Max.   :156.00   Max.   : 778.0   Max.   :912   Max.   :190.00
for(col in names(coffee_chains)) {
  if(is.numeric(coffee_chains[[col]])) {
    # Hitung statistik
    kolom <- coffee_chains[[col]]
    sd <- sd(kolom, na.rm = TRUE)
    var <- var(kolom, na.rm = TRUE)
    
    # Tampilkan hasil
    # Tampilkan hasil
    cat("\n- Standar Deviasi  :", round(sd, 2),
        "\n- Variansi         :", round(var, 2), "\n")
  }
}
## 
## - Standar Deviasi  : 66.24 
## - Variansi         : 4387.49 
## 
## - Standar Deviasi  : 92.6 
## - Variansi         : 8575.26 
## 
## - Standar Deviasi  : 79.55 
## - Variansi         : 6327.59 
## 
## - Standar Deviasi  : 148.89 
## - Variansi         : 22168.69 
## 
## - Standar Deviasi  : 67.25 
## - Variansi         : 4522.53 
## 
## - Standar Deviasi  : 661.03 
## - Variansi         : 436963.2 
## 
## - Standar Deviasi  : 94.34 
## - Variansi         : 8900.51 
## 
## - Standar Deviasi  : 27.02 
## - Variansi         : 730.26 
## 
## - Standar Deviasi  : 101.71 
## - Variansi         : 10344.63 
## 
## - Standar Deviasi  : 151.13 
## - Variansi         : 22841.22 
## 
## - Standar Deviasi  : 32.35 
## - Variansi         : 1046.69

Heatmap Persebaran Penjualan Tiap Produk di Tiap Market

Visualisasi ini ditujukan untuk mengetahui persebaran tiap produk pada setiap market yang ada di Amerika Serikat. Sehingga diperoleh gambaran bagaiaman produk terjual di setiap wilayah market

heatmap_data <- coffee_chains %>%
  group_by(Market, Product) %>%
  summarise(Total_Sales = sum(Sales), .groups="drop")

ggplot(heatmap_data, aes(x=Product, y=Market, fill=Total_Sales)) +
  geom_tile(color="white", linewidth=0.5) +
  scale_fill_gradient(low="lightyellow", high="darkred",
                      name="Total Sales") +
  geom_text(aes(label=Total_Sales), color="black", size=3) +
  labs(
    title="Heatmap Penjualan Produk per Market",
    x="Produk",
    y="Market"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle=45, hjust=1),
    plot.title = element_text(hjust=0.5, face="bold")
  )

Berdasarkan heatmap, terdapat perbedaan pola penjualan antarwilayah market. Market East didominasi oleh Product Colombian, Market Central didominasi oleh espresso dan teh, sedangkan Market South secara keseluruhan memiliki penjualan yang paling rendah. Hal ini mengindikasikan adanya preferensi konsumen yang berbeda antarmarket/wilayah.

Product Colombian menjadi Product terlaris di semua Market, terutama di East dengan 47.305 penjualan, Product Caffe Mocha dan Chamomile menjadi Product yang direkomendasikan pada Market Central dengan penjualan sebanyak 35.218 untuk Caffe Mocha dan 36.571 untuk Chamomile, Product Earl Grey menjadi Product dengan performa penjualan baik di Market West dan Central sedangkan Lemon cukup konsisten di Market West dan East. Untuk Product yang lain masih belum terlalu mencolok di salah satu atau beberapa Market.

Dengan gambaran umum seperti itu, dapat diketahui persebarannya untuk tiap State di wilayah Amerika Serikat sebagai berikut

bar_data <- coffee_chains %>%
  group_by(State, Product) %>%
  summarise(Total_Sales = sum(Sales), .groups="drop") %>%
  slice_max(State, n=3, by=Total_Sales) # top 3 produk per state

ggplot(bar_data, aes(x=reorder(Product, Total_Sales), 
                     y=Total_Sales, fill=Product)) +
  geom_col() +
  facet_wrap(~State, scales="free") +
  coord_flip() +
  labs(title="Top Produk per State") +
  theme_minimal()

Colombian menjadi Product yang mendominasi di 16 dari 20 state yang diidentifikasi. Product ini selain menajdi pilihan yang sangat kuat juga menjadi pilihan tanpa kompetitor yang benar-benar mengancam keberadaannya. Jika dilihat dari State nya, Florida menjadi satu-satunya State yang memiliki Product tertinggi selain Colombian, yakni Mint. Hal ini diperkuat oleh faktor geografisnya yang panas dan lembab sehingga preferensi minumannya cenderung pada minuman yang segar. Selain itu penduduk Florida lebiih beragam dengan komunitas Latin dan Karibia yang memiliki preferensi yang cenderung berbeda.

Jika Colombia mendominasi sebagai Product yang paling banyak dipilih, Green Tea konsisten menjadi Product dengan penjualan paling sedikit. Hal ini bisa menjadi salah satu peluang bisnis yang dapat dimanfaatkan, terutama dengan mensosialisasikan kesadaran kesehatan dan megoptimalkan strategi pemasaran.

Selain itu, jika dilihat berdasarkan Statenya terlihat adanya kesenjangan skala pasar. Pada State California, Illinois, New York, dan Ohio skala penjualannya mencapat 5-10 kali lipat dibandingkan New Hampshire, New Mexico, dan Connecticut.

Melalui dua visualisasi persebaran Product, dapat dilihat mengenai persebaran Product Type nya, apakah kopi mendominasi atau justru teh lebih mendominasi

pie_data <- coffee_chains %>%
  group_by(Market, `Product Line`) %>%
  summarise(Total_Sales = sum(Sales), .groups = "drop") %>%
  group_by(Market) %>%
  mutate(
    Pct = round(Total_Sales / sum(Total_Sales) * 100, 1),
    Label = paste0(`Product Line`, "\n", Pct, "%")
  )


ggplot(pie_data, aes(x="", y=Total_Sales, fill=`Product Line`)) +
  geom_bar(stat="identity", width=1) +
  coord_polar("y") +
  scale_fill_manual(values = c("Beans" = "#452829", "Leaves" = "#5B7E3C")) +
  facet_wrap(~Market) +
  labs(title="Proporsi Beans vs Leaves per Market") +
  theme_void()

Jika dilihat dari pie chart yang disajikan, Product Type Leaves/Teh justru unggul di beberapa Market seperti Central dan West sedangkan Beans/Kopi unggu di Market East dan South. Sesuai dengan hasil visualisasi sebelumnya yang mengatakan bahwa Market east didominasi Colombian yang merupakan salah satu Product dari Beans/Kopi.

UJI STATISTIK

Melalui eksplorasidata yang sudah dilakukan. Dapat diketahui apakah sebenarnya variabel-variabel yang teridentifikasi saling berhubungan menggunakan uji independensi (Chi Square) dan dapat diketahui mengenai karakteristik pada setiap State berdasarkan Total Penjualannya (Sales)

Uji Independensi (Chi Square)

Uji Chi-Square

\[\chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}\]

Product Type vs Market

H0: Product Type dan Market saling independen (tidak ada hubungan)

H1: Product Type dan Market saling dependen (ada hubungan)

p-value : 0.05

H0 ditolak jika p-value < 0.05

tabel <- table(coffee_chains$`Product Type`, coffee_chains$Market)
chisq.test(tabel)
## 
##  Pearson's Chi-squared test
## 
## data:  tabel
## X-squared = 291.66, df = 9, p-value < 2.2e-16

Karena p-value < 2.2e-16 < 0.05, sehingga H0 ditolak yang artinya terdapat hubungan antara Product Type dengan Market.

Product Type vs Market Size

H0: Product Type dan Market Size saling independen (tidak ada hubungan)

H1: Product Type dan Market Size saling dependen (ada hubungan)

p-value : 0.05

H0 ditolak jika p-value < 0.05

tabel <- table(coffee_chains$`Product Type`, coffee_chains$`Market Size`)
chisq.test(tabel)
## 
##  Pearson's Chi-squared test
## 
## data:  tabel
## X-squared = 12.962, df = 3, p-value = 0.004718

p-value = 0.004718 < 0.05 sehingga H0 ditolak, artinya Product Type dan Market Size memiliki hubungan.

Type vs Market

H0: Type dan Market saling independen (tidak ada hubungan)

H1: Type dan Market saling dependen (ada hubungan)

p-value : 0.05

H0 ditolak jika p-value < 0.05

tabel <- table(coffee_chains$Type, coffee_chains$Market)
chisq.test(tabel)
## 
##  Pearson's Chi-squared test
## 
## data:  tabel
## X-squared = 103.06, df = 3, p-value < 2.2e-16

p-value < 2.2e-16 < 0.05, sehingga H0 ditolak artinya Type dan Market memiliki hubungan atau saling dependen.

Dari ketiga uji independensi tersebut, dapat disimpulkan bahwa lokasi dalam hal ini menggunakan variabel Market mempengaruhi preferensi konsumen terhadap Product maupun Product Type. Apakah konsumen prefer mengonsumi minuman berkafein atau tidak, Kopi atau Teh, dan beberapa pilihan produk Kopi maupun Teh.

Matriks Korelasi

Jika uji independensi melihat hubungan dari variabel kategorik, maka korelasi dapat menunjukkan hubungan antarvariabel numerik.

# Fokus ke Sales sebagai variabel utama
# Pilih variabel numerik
num_vars <- coffee_chains %>%
  select(Sales, Profit, COGS, 
         Marketing, Inventory,
         `Total Expenses`,
         `Budget Profit`,
         `Budget Sales`,
         `Budget COGS`,
         `Budget Margin`)

# Matriks korelasi
cor_matrix <- cor(num_vars, 
                  method="pearson",
                  use="complete.obs")

print(round(cor_matrix, 3))
##                Sales Profit  COGS Marketing Inventory Total Expenses
## Sales          1.000  0.797 0.887     0.711     0.326          0.689
## Profit         0.797  1.000 0.465     0.225    -0.092          0.200
## COGS           0.887  0.465 1.000     0.818     0.621          0.783
## Marketing      0.711  0.225 0.818     1.000     0.498          0.966
## Inventory      0.326 -0.092 0.621     0.498     1.000          0.434
## Total Expenses 0.689  0.200 0.783     0.966     0.434          1.000
## Budget Profit  0.815  0.938 0.515     0.279    -0.019          0.256
## Budget Sales   0.957  0.759 0.850     0.682     0.332          0.661
## Budget COGS    0.863  0.480 0.948     0.774     0.580          0.744
## Budget Margin  0.921  0.877 0.689     0.543     0.119          0.531
##                Budget Profit Budget Sales Budget COGS Budget Margin
## Sales                  0.815        0.957       0.863         0.921
## Profit                 0.938        0.759       0.480         0.877
## COGS                   0.515        0.850       0.948         0.689
## Marketing              0.279        0.682       0.774         0.543
## Inventory             -0.019        0.332       0.580         0.119
## Total Expenses         0.256        0.661       0.744         0.531
## Budget Profit          1.000        0.848       0.579         0.950
## Budget Sales           0.848        1.000       0.912         0.956
## Budget COGS            0.579        0.912       1.000         0.750
## Budget Margin          0.950        0.956       0.750         1.000
cor_sales <- cor(num_vars, 
                 coffee_chains$Sales,
                 use="complete.obs")

# Urutkan dari tertinggi
cor_sales_df <- data.frame(
  Variabel   = rownames(cor_sales),
  Korelasi   = round(cor_sales[,1], 3)
) %>%
  arrange(desc(abs(Korelasi)))

print(cor_sales_df)
##                      Variabel Korelasi
## Sales                   Sales    1.000
## Budget Sales     Budget Sales    0.957
## Budget Margin   Budget Margin    0.921
## COGS                     COGS    0.887
## Budget COGS       Budget COGS    0.863
## Budget Profit   Budget Profit    0.815
## Profit                 Profit    0.797
## Marketing           Marketing    0.711
## Total Expenses Total Expenses    0.689
## Inventory           Inventory    0.326
library(ggplot2)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
## 
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
# Ubah ke format panjang
cor_melt <- melt(cor_matrix)

ggplot(cor_melt, aes(x=Var1, y=Var2, fill=value)) +
  geom_tile(color="white") +
  scale_fill_gradient2(
    low  = "#2196F3",   # biru = korelasi negatif
    mid  = "white",     # putih = tidak berkorelasi
    high = "#F44336",   # merah = korelasi positif
    midpoint = 0,
    limits = c(-1, 1),
    name = "Korelasi"
  ) +
  geom_text(aes(label=round(value, 2)), 
            size=3, color="black") +
  labs(
    title = "Matriks Korelasi",
    x = "", y = ""
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle=45, hjust=1),
    plot.title  = element_text(hjust=0.5, face="bold")
  )

Berdasarkan matriks korelasi tersebut, variabel-variabel yang berhubungan kuat dengan Sales di antaranya Budget Sales, COGS, Profit, BUdget COGS, Marketing.

Klusterisasi Total Sales

library(dplyr)
library(tidyr)

# Agregasi total sales per product per state
cluster_data <- coffee_chains %>%
  group_by(State, Product) %>%
  summarise(Total_Sales = sum(Sales), .groups="drop") %>%
  pivot_wider(names_from = Product, 
              values_from = Total_Sales,
              values_fill = 0)  # isi NA dengan 0

# Simpan nama state untuk label nanti
state_labels <- cluster_data$State

# Jadikan matrix numerik
cluster_matrix <- scale(cluster_data[,-1])  
rownames(cluster_matrix) <- state_labels

library(cluster)  
## Warning: package 'cluster' was built under R version 4.4.3
sil <- sapply(2:10, function(k){
  km <- kmeans(cluster_matrix, centers=k, nstart=25)
  ss <- silhouette(km$cluster, dist(cluster_matrix))
  mean(ss[,3])
})

plot(2:10, sil, type="b", pch=19,
     main="Silhouette Method",
     xlab="Jumlah Cluster (K)",
     ylab="Average Silhouette Width",
     col="#4CAF50")

library(ggdendro)
## Warning: package 'ggdendro' was built under R version 4.4.3
# Hitung jarak
dist_matrix <- dist(cluster_matrix, method="euclidean")

# Hierarchical clustering
hclust_model <- hclust(dist_matrix, method="ward.D2")

# Dendrogram pakai base R
plot(hclust_model,
     main="Dendrogram Clustering State",
     xlab="State",
     ylab="Height",
     cex=0.7,          # ukuran label
     hang=-1)          # label rata bawah

# Tambah garis & kotak cluster
rect.hclust(hclust_model, k=4, 
            border=c("#6F4E37","#4CAF50","#2196F3", "#C44545"))

# Tentukan K dari hasil silhouette
k <- 4

# Potong cluster
clusters <- cutree(hclust_model, k=k)

# Ambil data dendrogram
dendro_data <- dendro_data(hclust_model)

# Tambahkan info cluster ke label
dendro_data$labels$cluster <- as.factor(
  clusters[dendro_data$labels$label]
)

# Plot
ggplot() +
  geom_segment(data=segment(dendro_data),
               aes(x=x, y=y, xend=xend, yend=yend)) +
  geom_text(data=label(dendro_data),
            aes(x=x, y=y, label=label, 
                color=cluster),   # warna per cluster
            hjust=1, size=2.5, angle=90) +
  scale_color_manual(values=c("#6F4E37","#4CAF50","#2196F3", "#C44545")) +
  labs(title="Dendrogram Clustering State",
       x="State", y="Height",
       color="Cluster") +
  ylim(-500, NA) +   # beri ruang untuk label bawah
  theme_minimal() +
  theme(
    plot.title=element_text(hjust=0.5, face="bold"),
    axis.text.x=element_blank(),
    axis.ticks.x=element_blank()
  )

#k means
set.seed(2023)

k <- 4  # sesuaikan hasil elbow/silhouette

kmeans_model <- kmeans(cluster_matrix, 
                       centers=k, 
                       nstart=25)

# Lihat hasil
print(kmeans_model)
## K-means clustering with 4 clusters of sizes 1, 2, 2, 15
## 
## Cluster means:
##      Amaretto Caffe Latte Caffe Mocha  Chamomile  Colombian Darjeeling
## 1 -0.69877263 -0.60070926  -0.8293305 -1.0408200  2.2454203  0.6651100
## 2  0.02316917  1.40745583   2.2096064  0.7136650  1.5207972  0.4947941
## 3 -0.37717070 -0.42367079  -0.9643944  2.0299420 -0.8708858  2.4911958
## 4  0.09378505 -0.09112405  -0.1107396 -0.2964263 -0.2363495 -0.4424726
##   Decaf Espresso Decaf Irish Cream  Earl Grey   Green Tea      Lemon       Mint
## 1     -1.0288388       -1.36319800  0.7738118  1.59992395  2.6938707  0.9731436
## 2      2.4735462        1.08735232  0.2429824  0.19802228  0.9245407  1.3283955
## 3     -0.7243808       -0.76753251  2.4145352 -0.71069182  1.1354497  0.7967498
## 4     -0.1646328        0.04823723 -0.4059231 -0.03830566 -0.4542568 -0.3482289
##   Regular Espresso
## 1        3.7083559
## 2       -0.3331558
## 3       -0.3331558
## 4       -0.1583822
## 
## Clustering vector:
##    California      Colorado   Connecticut       Florida      Illinois 
##             2             4             4             4             2 
##          Iowa     Louisiana Massachusetts      Missouri        Nevada 
##             3             4             4             4             3 
## New Hampshire    New Mexico      New York          Ohio      Oklahoma 
##             4             4             1             4             4 
##        Oregon         Texas          Utah    Washington     Wisconsin 
##             4             4             4             4             4 
## 
## Within cluster sum of squares by cluster:
## [1]  0.000000 19.932857  7.627985 85.782514
##  (between_SS / total_SS =  54.1 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
cluster_data$Cluster <- as.factor(kmeans_model$cluster)

# Lihat state masuk cluster mana
cluster_data %>%
  select(State, Cluster) %>%
  arrange(Cluster) %>%
  print()
## # A tibble: 20 × 2
##    State         Cluster
##    <chr>         <fct>  
##  1 New York      1      
##  2 California    2      
##  3 Illinois      2      
##  4 Iowa          3      
##  5 Nevada        3      
##  6 Colorado      4      
##  7 Connecticut   4      
##  8 Florida       4      
##  9 Louisiana     4      
## 10 Massachusetts 4      
## 11 Missouri      4      
## 12 New Hampshire 4      
## 13 New Mexico    4      
## 14 Ohio          4      
## 15 Oklahoma      4      
## 16 Oregon        4      
## 17 Texas         4      
## 18 Utah          4      
## 19 Washington    4      
## 20 Wisconsin     4
# Reduksi dimensi dengan PCA
pca <- prcomp(cluster_matrix)

pca_df <- data.frame(
  PC1     = pca$x[,1],
  PC2     = pca$x[,2],
  Cluster = as.factor(kmeans_model$cluster),
  State   = state_labels
)

ggplot(pca_df, aes(x=PC1, y=PC2, 
                   color=Cluster, 
                   label=State)) +
  geom_point(size=4) +
  geom_text(vjust=-0.8, size=2.5) +
  scale_color_manual(values=c("#6F4E37","#4CAF50","#2196F3", "#C44545")) +
  labs(title="Clustering State Berdasarkan Penjualan Produk",
       x="PC1", y="PC2") +
  theme_minimal() +
  theme(plot.title = element_text(hjust=0.5, face="bold"))

# Rata-rata sales tiap produk per cluster
interpretasi <- cluster_data %>%
  group_by(Cluster) %>%
  summarise(across(where(is.numeric), 
                   ~round(mean(.x, na.rm=TRUE), 2),
                   .names="avg_{.col}"))
print(interpretasi)  
## # A tibble: 4 × 14
##   Cluster avg_Amaretto `avg_Caffe Latte` `avg_Caffe Mocha` avg_Chamomile
##   <fct>          <dbl>             <dbl>             <dbl>         <dbl>
## 1 1                 0                 0              1654             0 
## 2 2              1357              6000.            11149          6370 
## 3 3               604.              529              1232         11149 
## 4 4              1490.             1523.             3899.         2703.
## # ℹ 9 more variables: avg_Colombian <dbl>, avg_Darjeeling <dbl>,
## #   `avg_Decaf Espresso` <dbl>, `avg_Decaf Irish Cream` <dbl>,
## #   `avg_Earl Grey` <dbl>, `avg_Green Tea` <dbl>, avg_Lemon <dbl>,
## #   avg_Mint <dbl>, `avg_Regular Espresso` <dbl>

Hasil klusterisasi menunjukkan bahwa State di Amerika Serikat dapat diklasifikasikan menjadi 5 kluster dengan tipe pasar yang berbeda berdasarkan pola penjualan produknya.

  • Kluster 2 (Illinois dan California)

    Colombian : 14.428

    Caffe Mocha : 11.149

    Caffe Latte : 6.000

    Chamomile : 6.370

    Semua produk dalam kluster ini terjual tinggi.

  • Kluster 4 (Massachusetts, New Hampshire, Connecyicut, Missouri, New Mexico, Louisiana, Oklahoma, Texas, Wisconsin, Ohio, Utah, Washington, Florida, Colorado, Oregon)

    Colombian : 5.170,4

    Mocha : 3.899,2

    Chamomile : 2.702,67

    Amaretto : 1.489,73

    Memiliki pola homogen dengan pola penjualan tipikal/umum/rata-rata di Amerika. Colombian mendominasi akan tetapi tidak terlalu jauh berbeda dengan produk lain pada kluster ini.

  • Kluster 1 (New York)

    Colombian : 18.245

    Darjeeling : 6.233

    Amaretto : 0

    Caffe Latte : 0

    Chamomile : 0

    Hanya memiliki 2 produk yang terjual yaitu Colombian dan Darjeeling.

  • Kluster 3 (Iowa dan Nevada)

    Chamomile : 11.149

    Darjeeling : 13.304

    Lemon : tinggi

    Colombian : 1.828

    Caffe Latte : 529

    Kluster ini adalah kluster paling minat terhadap Product Type Teh. 3 dari 5 teratas merupakan jenis teh, terutama Darjeeling dan Chamomile yang sangat mendominasi penjualan.

Sehingga, strategi pemasaran dapat disesuaikan untuk setiap kluster mengingat setiap kluster memiliki katrakteristik konsumsi dan histori total penjualan yang berbeda.

PENUTUP

Berdasarkan analisis yang telah dilakukan terhadap data penjualan kopi dan teh di Amerika Serikat tahun 2012 dapat disimpulkan bahwa terdapat perbedaan pola penjualan yang signifikan antrwilayah Market. Ketika diuji menggunakan uji independensi pada Product Type & Market, Product Type & Market Size, dan Type & Market, ketiganya saling dependen yang membuktikan bahwa Market atau lokasi menjadi faktor penting dalam preferensi konsumen terhadap jenis produk yang dikonsumsi baik dari jenis produk, ukuran pasar, maupun kandungan kafein dalam produk. Berdasarkan analisis korelasi, variabel-variabel numerik yanga da pada dataset juga sebagian besar berhubungan dengan Sales. Kemudian dengan klusterisasi menggunakan k-means didapatkan 5 kluster dengan karakteristik yang berbeda. Hal tersebut mdapat dijadikan sebagai acuan/pedoman dalam memberikan rekomendasi ataupun membuat strategi pemasaran maupun penjualan untuk setiap State ataupun tiap kluster.