Insight: Pola musiman coffee chain

cat(paste(
  "Dari insight ini dapat membantu dalam:\n", 
  "1. Menentukan waktu untuk mempromosikan produk tertentu\n", 
  "2. Mengatur stok produk sesuai permintaan musiman\n", 
  "3. Mengatur penggunaan sumber daya agar lebih efisien"
))
## Dari insight ini dapat membantu dalam:
##  1. Menentukan waktu untuk mempromosikan produk tertentu
##  2. Mengatur stok produk sesuai permintaan musiman
##  3. Mengatur penggunaan sumber daya agar lebih efisien

Variabel yang digunakan

cat(paste("\n", 
  "1. Date\n",
  "2. Profit\n", 
  "3. Product"
))
## 
##  1. Date
##  2. Profit
##  3. Product
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.2
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.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.5.2

Impor data

coffee <- read_excel("C:/Fairuz Makayla Namira/SIM/1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx", sheet = "data")

Ekstrak variabel Date

# Konversi kolom Date ke format tanggal 
coffee$Date <- as.Date(coffee$Date)

 
coffee$Bulan <- format(coffee$Date, "%B") #nama bulan 
coffee$Tahun <- format(coffee$Date, "%Y") #tahun 
coffee$Bulan_ke <- as.numeric(format(coffee$Date, "%m")) 
coffee$Tahun_Bulan <- format(coffee$Date, "%Y-%m") 

# cek data hasil ekstraksi 
head(coffee[, c("Date", "Bulan", "Tahun", "Bulan_ke", "Tahun_Bulan")]) 
## # A tibble: 6 × 5
##   Date       Bulan   Tahun Bulan_ke Tahun_Bulan
##   <date>     <chr>   <chr>    <dbl> <chr>      
## 1 2012-01-01 January 2012         1 2012-01    
## 2 2012-01-01 January 2012         1 2012-01    
## 3 2012-01-01 January 2012         1 2012-01    
## 4 2012-01-01 January 2012         1 2012-01    
## 5 2012-01-01 January 2012         1 2012-01    
## 6 2012-01-01 January 2012         1 2012-01

Hasil Analisis

# Statistik profit per bulan
profit_bulanan <- coffee %>% 
  group_by(Bulan_ke, Bulan) %>% 
  summarise(
    total_profit = sum(Profit, na.rm=TRUE), 
    rata_profit = mean(Profit, na.rm=TRUE), 
    jumlah_transaksi = n(),
  .groups = "drop") %>%
  arrange(Bulan_ke) 

# Tabel profit per bulan
knitr::kable(profit_bulanan, 
             caption = "Total Profit per Bulan (2012-2013)",
             col.names = c("No.", "Bulan", "Total Profit (USD)", 
                           "Rata-rata Profit (USD)", "n"))
Total Profit per Bulan (2012-2013)
No. Bulan Total Profit (USD) Rata-rata Profit (USD) n
1 January 20565 58.09322 354
2 February 20788 58.72316 354
3 March 20780 58.70056 354
4 April 21533 60.82768 354
5 May 21295 60.15537 354
6 June 22789 64.37571 354
7 July 23576 66.59887 354
8 August 22771 64.32486 354
9 September 21135 59.70339 354
10 October 21552 60.88136 354
11 November 20859 58.92373 354
12 December 21900 61.86441 354
# Identifikasi bulan dengan profit tertinggi dan terendah 
profit_tertinggi <- profit_bulanan %>% filter(total_profit == max(profit_bulanan$total_profit))
profit_terendah <- profit_bulanan %>% filter(total_profit == min(profit_bulanan$total_profit))

cat("======================================== 
POLA MUSIMAN PROFIT 
========================================")
## ======================================== 
## POLA MUSIMAN PROFIT 
## ========================================
paste("✓ Bulan dengan profit TERTINGGI :", profit_tertinggi$Bulan, 
          "-", round(profit_tertinggi$total_profit, 0), "USD\n")
## [1] "✓ Bulan dengan profit TERTINGGI : July - 23576 USD\n"
paste("✓ Bulan dengan profit TERENDAH  :", profit_terendah$Bulan, 
          "-", round(profit_terendah$total_profit, 0), "USD\n")
## [1] "✓ Bulan dengan profit TERENDAH  : January - 20565 USD\n"
paste("✓ Selisih :", 
          round(profit_tertinggi$total_profit - profit_terendah$total_profit, 0), "USD\n")
## [1] "✓ Selisih : 3011 USD\n"
# Uji normalitas data (Shapiro-Wilk)  
cat(paste("\n",
    "H0 : Data profit berdistribusi normal\n", 
    "H1 : Data profit tidak berdistribusi normal\n\n"))
## 
##  H0 : Data profit berdistribusi normal
##  H1 : Data profit tidak berdistribusi normal
shap_profit <- shapiro.test(coffee$Profit) 
shap_profit 
## 
##  Shapiro-Wilk normality test
## 
## data:  coffee$Profit
## W = 0.79969, p-value < 2.2e-16
paste("Nilai p-value :", format.pval(shap_profit$p.value)) 
## [1] "Nilai p-value : < 2.22e-16"
uji_norm_profit <- ifelse(shap_profit$p.value < 0.05, "Data Tidak Normal", "Data Normal") 
uji_norm_profit 
## [1] "Data Tidak Normal"
## Interpretasi 
cat("Karena p-value < 0.05, maka H0 ditolak yang berarti data tidak berdistribusi normal. Selanjutnya dilakukan uji non-parametrik Kruskal Wallis."
)
## Karena p-value < 0.05, maka H0 ditolak yang berarti data tidak berdistribusi normal. Selanjutnya dilakukan uji non-parametrik Kruskal Wallis.
# Uji non-parametrik Kruskal-Wallis 
cat(paste("\n", 
    "H0 : Tidak ada perbedaan profit yang signifikan antar bulan\n", 
    "H1 : Ada perbedaan profit yang signifikan antar bulan\n\n")) 
## 
##  H0 : Tidak ada perbedaan profit yang signifikan antar bulan
##  H1 : Ada perbedaan profit yang signifikan antar bulan
kruskal_profit <- kruskal.test(Profit ~ Bulan, data = coffee)
kruskal_profit
## 
##  Kruskal-Wallis rank sum test
## 
## data:  Profit by Bulan
## Kruskal-Wallis chi-squared = 0.66395, df = 11, p-value = 1
pval_kruskal <- kruskal_profit$p.value

paste("Nilai p-value :", format.pval(pval_kruskal)) 
## [1] "Nilai p-value : 0.99999"
beda_profit <- ifelse(pval_kruskal < 0.05, "Ada perbedaan signifikan profit antar bulan", "Tidak ada perbedaan signifikan profit antar bulan") 
beda_profit 
## [1] "Tidak ada perbedaan signifikan profit antar bulan"
## Interpretasi 
cat("Karena p-value > 0.05, maka H0 gagal ditolak yang berarti tidak cukup bukti untuk menyatakan adanya perbedaan profit yang signifikan antar bulan"
)
## Karena p-value > 0.05, maka H0 gagal ditolak yang berarti tidak cukup bukti untuk menyatakan adanya perbedaan profit yang signifikan antar bulan
# Top 5 produk di bulan dengan profit tertinggi
top_produk <- coffee %>% 
  filter(Bulan == profit_tertinggi$Bulan) %>% 
  group_by(Product) %>% 
  summarise(total_profit = sum(Profit, na.rm = TRUE), .groups = "drop") %>% 
  arrange(desc(total_profit)) %>% 
  head(5) 

knitr::kable(top_produk, 
  caption = paste("Top 5 Produk di Bulan", profit_tertinggi$Bulan), 
col.names = c("Produk", "Total_Profit (USD)"))
Top 5 Produk di Bulan July
Produk Total_Profit (USD)
Colombian 5474
Lemon 3181
Decaf Espresso 2566
Darjeeling 2551
Chamomile 2242

Visualisasi Data

# Tren Profit Bulanan (line chart)
profit_per_bulan <- coffee %>%
  group_by(Tahun_Bulan, Tahun, Bulan_ke, Bulan) %>%
  summarise(total_profit = sum(Profit, na.rm = TRUE), .groups = "drop") %>%
  arrange(Tahun, Bulan_ke)

ggplot(profit_per_bulan, aes(x = Tahun_Bulan, y = total_profit, group = 1)) +
  geom_line(color = "#FB8C00", linewidth = 1.2) +
  geom_point(color = "#5E0006", size = 2) +
  geom_text(aes(label = round(total_profit, 0)), vjust = -1, size = 3) +
  labs(
    title = "Tren Profit Bulanan Coffee Chain",
    subtitle = "Periode Januari 2012 - Desember 2013",
    x = "Tahun-Bulan",
    y = "Total Profit (USD)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

## Interpretasi line chart
cat(paste("\n",  
    "Visualisasi tren profit ini menunjukkan fluktuasi antar bulan yang cukup bervariasi dengan beberapa lonjakan dan\n", 
    "penurunan profit. Setiap tahun, profit cenderung meningkat dari bulan Maret hingga puncaknya di bulan Juli. Sepanjang\n", 
    "periode, profit tertinggi tercatat pada bulan Juli 2013. Sedangkan profit terendah tercatat pada bulan Januari 2012.\n", 
    "Pola ini, mengindikasikan bahwa faktor musim memiliki pengaruh terhadap profit coffee chain. Pertumbuhan bisnis\n", 
    "dari tahun ke tahun dapat dilihat dari total profit di tahun 2013 yang lebih tinggi dibandingkan tahun sebelumnya."
))
## 
##  Visualisasi tren profit ini menunjukkan fluktuasi antar bulan yang cukup bervariasi dengan beberapa lonjakan dan
##  penurunan profit. Setiap tahun, profit cenderung meningkat dari bulan Maret hingga puncaknya di bulan Juli. Sepanjang
##  periode, profit tertinggi tercatat pada bulan Juli 2013. Sedangkan profit terendah tercatat pada bulan Januari 2012.
##  Pola ini, mengindikasikan bahwa faktor musim memiliki pengaruh terhadap profit coffee chain. Pertumbuhan bisnis
##  dari tahun ke tahun dapat dilihat dari total profit di tahun 2013 yang lebih tinggi dibandingkan tahun sebelumnya.
# Rata-rata profit per bulan (bar chart)
ggplot(profit_bulanan, aes(x = reorder(Bulan, Bulan_ke), y = total_profit, fill = total_profit)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = round(total_profit, 0)), vjust = -0.5, size = 3) +
  labs(
    title = "Rata-rata Profit per Bulan",
    subtitle = paste("Tertinggi:", profit_tertinggi$Bulan, "| Terendah:", profit_terendah$Bulan),
    x = "Bulan",
    y = "Total Profit (USD)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_gradient(low = "#B2DFDB", high = "#00695C", name = "Profit (USD)")

## Interpretasi bar chart 
cat(paste("\n",  
    "Visualisasi ini menampilkan total profit per bulan selama 2 tahun. Grafik ini mengonfirmasi bahwa Juli adalah bulan\n", 
    "dengan profit tertinggi, dan Januari adalah bulan dengan profit terendah dengan selisih profit mencapai 3.011 USD,\n", 
    "memperkuat bukti adanya pola musiman."
    ))
## 
##  Visualisasi ini menampilkan total profit per bulan selama 2 tahun. Grafik ini mengonfirmasi bahwa Juli adalah bulan
##  dengan profit tertinggi, dan Januari adalah bulan dengan profit terendah dengan selisih profit mencapai 3.011 USD,
##  memperkuat bukti adanya pola musiman.

Kesimpulan

cat(paste(
  "Berdasarkan analisis data Coffee Chain periode Januari 2012 - Desember 2013, dapat disimpulkan bahwa:\n",
  "1. Data profit Coffee Chain tidak terdistribusi normal sehingga digunakan uji non-parametrik Kruskal-Wallis.\n",
  "2. Dari uji Kruskal-Wallis didapatkan hasil: Tidak ada perbedaan profit yang signifikan antar bulan.\n",
  "3. Rata-rata profit per bulan yaitu", round(mean(profit_bulanan$total_profit), 0), "USD.\n", 
  "4. Profit tertinggi terjadi di bulan", profit_tertinggi$Bulan, "sebesar", 
    round(profit_tertinggi$total_profit, 0), "USD, dan terendah di bulan", 
    profit_terendah$Bulan, "sebesar", round(profit_terendah$total_profit, 0), "USD\n", 
    "dengan selisih", round(profit_tertinggi$total_profit - profit_terendah$total_profit, 0), "USD.\n",
  "5. Pada bulan dengan profit tertinggi, produk", top_produk$Product[1], "memberikan kontribusi profit terbesar sebanyak", round(top_produk$total_profit[1], 0), "USD.\n"
))
## Berdasarkan analisis data Coffee Chain periode Januari 2012 - Desember 2013, dapat disimpulkan bahwa:
##  1. Data profit Coffee Chain tidak terdistribusi normal sehingga digunakan uji non-parametrik Kruskal-Wallis.
##  2. Dari uji Kruskal-Wallis didapatkan hasil: Tidak ada perbedaan profit yang signifikan antar bulan.
##  3. Rata-rata profit per bulan yaitu 21629 USD.
##  4. Profit tertinggi terjadi di bulan July sebesar 23576 USD, dan terendah di bulan January sebesar 20565 USD
##  dengan selisih 3011 USD.
##  5. Pada bulan dengan profit tertinggi, produk Colombian memberikan kontribusi profit terbesar sebanyak 5474 USD.

Rekomendasi bisnis

cat(paste("\n", 
  "1. Tingkatkan stok di bulan Juni-Juli dan kurangi stok di bulan Desember-Januari (untuk mengantisipasi lonjakan\n", 
  "permintaan menjelang bulan dengan profit tertinggi dan menghindari kelebihan stok produk di bulan dengan profit rendah). \n",
  "2. Mengadakan diskon untuk meningkatkan penjualan di bulan dengan profit rendah. \n",
  "3. Promosi produk unggulan di bulan dengan profit tertinggi. \n", 
  "4. Mengatur stok produk berdasarkan pola musim (tingkatkan penjualan minuman dingin dan kurangi stok minuman hangat\n", 
  "di musim panas)."
))
## 
##  1. Tingkatkan stok di bulan Juni-Juli dan kurangi stok di bulan Desember-Januari (untuk mengantisipasi lonjakan
##  permintaan menjelang bulan dengan profit tertinggi dan menghindari kelebihan stok produk di bulan dengan profit rendah). 
##  2. Mengadakan diskon untuk meningkatkan penjualan di bulan dengan profit rendah. 
##  3. Promosi produk unggulan di bulan dengan profit tertinggi. 
##  4. Mengatur stok produk berdasarkan pola musim (tingkatkan penjualan minuman dingin dan kurangi stok minuman hangat
##  di musim panas).