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.
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 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.
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).
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.
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"
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
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.
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 Chi-Square
\[\chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}\]
Product Type vs
MarketH0: 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 SizeH0: 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 MarketH0: 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.
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.
Saleslibrary(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.
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.