Dalam manajemen operasional, salah satu fungsi penting pada Sistem Informasi Manajemen adalah mendukung pengambilan keputusan terkait alokasi sumber daya. Laporan berfokus pada Marketing Return on Investment.
Laporan ini dibuat untuk menganalisis apakah biaya pemasaran yang dikeluarkan di setiap wilayah (Central, East, South, dan West) berbanding lurus dengan hasil penjualan. Dengan insight ini, manajemen dapat mengidentifikasi wilayah yang marketingnya tinggi tetapi penjualan rendah dan melakukan realokasi anggaran ke wilayah yang lebih responsif terhadap iklan.
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.2
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.3
## Warning: package 'ggplot2' was built under R version 4.5.2
## Warning: package 'tidyr' was built under R version 4.5.3
## Warning: package 'readr' was built under R version 4.5.3
## Warning: package 'purrr' was built under R version 4.5.3
## Warning: package 'dplyr' was built under R version 4.5.2
## Warning: package 'stringr' was built under R version 4.5.2
## Warning: package 'forcats' was built under R version 4.5.2
## Warning: package 'lubridate' was built under R version 4.5.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.0
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.2
## ── 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(janitor)
## Warning: package 'janitor' was built under R version 4.5.3
##
## Attaching package: 'janitor'
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(scales)
## Warning: package 'scales' was built under R version 4.5.2
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
X1_Tugas_SIM_2025B_Coffee_Chain_Datasets <- read_excel("D:/KULIAH/KELAS/SEMESTER 2/Sistem Informasi Manajemen/1. Tugas SIM 2025B - Coffee Chain Datasets.xlsx")
View(X1_Tugas_SIM_2025B_Coffee_Chain_Datasets)
data_coffe <- X1_Tugas_SIM_2025B_Coffee_Chain_Datasets
data_coffe
## # A tibble: 4,248 × 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 Colombi… Beans
## 3 970 2012-01-01 00:00:00 Central Major Market Decaf I… Beans
## 4 303 2012-01-01 00:00:00 Central Major Market Green T… Leaves
## 5 303 2012-01-01 00:00:00 Central Major Market Caffe M… Beans
## 6 720 2012-01-01 00:00:00 Central Major Market Decaf E… Beans
## 7 970 2012-01-01 00:00:00 Central Major Market Chamomi… Leaves
## 8 719 2012-01-01 00:00:00 Central Major Market Lemon Leaves
## 9 970 2012-01-01 00:00:00 Central Major Market Mint Leaves
## 10 719 2012-01-01 00:00:00 Central Major Market Darjeel… Leaves
## # ℹ 4,238 more rows
## # ℹ 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>
View(data_coffe)
data_coffe <- data_coffe %>%
clean_names()%>%
mutate(across(where(is.numeric), as.numeric))
names(data_coffe)
## [1] "area_code" "date" "market" "market_size"
## [5] "product" "product_line" "product_type" "state"
## [9] "type" "budget_cogs" "budget_margin" "budget_profit"
## [13] "budget_sales" "cogs" "inventory" "margin"
## [17] "marketing" "profit" "sales" "total_expenses"
str(data_coffe)
## 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 ...
head(data_coffe)
## # 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 Irish C… 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 Mocha Beans
## 6 720 2012-01-01 00:00:00 Central Major Market Decaf Espresso 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>
tail(data_coffe)
## # A tibble: 6 × 20
## area_code date market market_size product product_line
## <dbl> <dttm> <chr> <chr> <chr> <chr>
## 1 425 2013-12-01 00:00:00 West Small Market Lemon Leaves
## 2 206 2013-12-01 00:00:00 West Small Market Caffe Latte Beans
## 3 509 2013-12-01 00:00:00 West Small Market Caffe Mocha Beans
## 4 360 2013-12-01 00:00:00 West Small Market Decaf Espresso Beans
## 5 360 2013-12-01 00:00:00 West Small Market Colombian Beans
## 6 206 2013-12-01 00:00:00 West Small Market Decaf Irish Cr… 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>
colnames(data_coffe)
## [1] "area_code" "date" "market" "market_size"
## [5] "product" "product_line" "product_type" "state"
## [9] "type" "budget_cogs" "budget_margin" "budget_profit"
## [13] "budget_sales" "cogs" "inventory" "margin"
## [17] "marketing" "profit" "sales" "total_expenses"
summary(data_coffe)
## area_code date market
## Min. :203.0 Min. :2012-01-01 00:00:00 Length:4248
## 1st Qu.:417.0 1st Qu.:2012-06-23 12:00:00 Class :character
## Median :573.0 Median :2012-12-16 12:00:00 Mode :character
## Mean :582.3 Mean :2012-12-15 22:00:00
## 3rd Qu.:772.0 3rd Qu.:2013-06-08 12:00:00
## Max. :985.0 Max. :2013-12-01 00:00:00
## market_size product product_line product_type
## Length:4248 Length:4248 Length:4248 Length:4248
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## state type budget_cogs budget_margin
## Length:4248 Length:4248 Min. : 0.00 Min. :-210.0
## Class :character Class :character 1st Qu.: 30.00 1st Qu.: 50.0
## Mode :character Mode :character Median : 50.00 Median : 70.0
## Mean : 74.83 Mean : 100.8
## 3rd Qu.: 90.00 3rd Qu.: 130.0
## Max. :450.00 Max. : 690.0
## budget_profit budget_sales cogs inventory
## Min. :-320.00 Min. : 0.0 Min. : 0.00 Min. :-3534.0
## 1st Qu.: 20.00 1st Qu.: 80.0 1st Qu.: 43.00 1st Qu.: 432.0
## Median : 40.00 Median : 130.0 Median : 60.00 Median : 619.0
## Mean : 60.91 Mean : 175.6 Mean : 84.43 Mean : 749.4
## 3rd Qu.: 80.00 3rd Qu.: 210.0 3rd Qu.:100.00 3rd Qu.: 910.5
## Max. : 560.00 Max. :1140.0 Max. :364.00 Max. : 8252.0
## margin marketing profit sales
## Min. :-302.00 Min. : 0.00 Min. :-638.0 Min. : 17
## 1st Qu.: 52.75 1st Qu.: 13.00 1st Qu.: 17.0 1st Qu.:100
## Median : 76.00 Median : 22.00 Median : 40.0 Median :138
## Mean : 104.29 Mean : 31.19 Mean : 61.1 Mean :193
## 3rd Qu.: 132.00 3rd Qu.: 39.00 3rd Qu.: 92.0 3rd Qu.:230
## Max. : 613.00 Max. :156.00 Max. : 778.0 Max. :912
## total_expenses
## Min. : 10.00
## 1st Qu.: 33.00
## Median : 46.00
## Mean : 54.06
## 3rd Qu.: 65.00
## Max. :190.00
Melakukan uji asumsi dengan menggunakan Shapiro-Wilk untuk melihat apakah data yang digunakan berdistribusi normal atau tidak. Data yang normal menunjukkan stabilitas operasional, sedangkan data yang tidak normal mengindikasikan adanya anomali atau fluktuasi yang ekstrem.
cat("--- Hasil Uji Normalitas ---\n")
## --- Hasil Uji Normalitas ---
shapiro.test(data_coffe$sales)
##
## Shapiro-Wilk normality test
##
## data: data_coffe$sales
## W = 0.78969, p-value < 2.2e-16
shapiro.test(data_coffe$marketing)
##
## Shapiro-Wilk normality test
##
## data: data_coffe$marketing
## W = 0.81776, p-value < 2.2e-16
Jika nilai p-value > 0.05, maka data berdistribusi normal. Sedangkan jika nilai p-value < 0.05, maka data tidak normal. Nilai p-value dari sales dan marketing < 0.05, maka data dinyatakan tidak normal.
Untuk mendapatkan hasil yang akurat, digunakan dua pendekatan statistika sebagai berikut:
Menghitung beberapa persen biaya pemasaran dibandingkan total penjualan. Semakin rendah rasionya, maka semakin efisien wilayah tersebut dalam menghasilkan pendapatan. Dapat dilakukan dengan rumus: Rasio marketing = (Total marketing/Total sales) * 100%
analisis_market <- data_coffe %>%
group_by(market) %>%
summarise(
total_penjualan = sum(sales, na.rm = TRUE),
total_marketing = sum(marketing, na.rm = TRUE),
rasio_marketing = (total_marketing / total_penjualan)*100
)
print(analisis_market)
## # A tibble: 4 × 4
## market total_penjualan total_marketing rasio_marketing
## <chr> <dbl> <dbl> <dbl>
## 1 Central 265045 39412 14.9
## 2 East 178576 29442 16.5
## 3 South 103926 16562 15.9
## 4 West 272264 47058 17.3
Semakin rendah rasio marketingnya, maka semakin efisien wilayah tersebut dalam menghasilkan pendapatan. Hasil menunjukkan bahwa rasio marketing pada wilayah Central lebih kecil dibandingkan dengan wilayah lainnya, yaitu sebanyak 14.86%. Sehingga dapat disimpulkan bahwa wilayah Central lebih efisien dalam menghasilkan pendapatan.
Korelasi spearman digunakan untuk memberikan gambaran objektif mengenai konsistensi hubungan antara input biaya (marketing) dan output pendapatan (sales). Dengan mengandalkan peringkat data, analisis ini mampu mengeliminasi bias yang disebabkan oleh data ekstrem, sehingga dapat mengidentifikasi wilayah mana yang memiliki respon pasar yang paling stabil terhadap kampanye perusahaan.
korelasi_spearman = cor(data_coffe$marketing, data_coffe$sales, method = "spearman", use = "complete.obs")
print(korelasi_spearman)
## [1] 0.8071508
Hasil korelasi spearmannya adalah 0.80 maka terdapat hubungan yang sangat kuat. Strategi pemasaran yang dilakukan sangat konsisten. Setiap kenaikan budget marketing hampir selalu diikuti kenaikan peringkat penjualan.
datalengkap <- analisis_market %>%
select(market, total_penjualan, total_marketing) %>%
pivot_longer(cols = c(total_penjualan, total_marketing),
names_to = "Metric", values_to = "Amount")
datalengkap
## # A tibble: 8 × 3
## market Metric Amount
## <chr> <chr> <dbl>
## 1 Central total_penjualan 265045
## 2 Central total_marketing 39412
## 3 East total_penjualan 178576
## 4 East total_marketing 29442
## 5 South total_penjualan 103926
## 6 South total_marketing 16562
## 7 West total_penjualan 272264
## 8 West total_marketing 47058
Transformasi data dengan fungsi pivot_longer digunakan untuk menyelaraskan struktur data dengan kebutuhan visualisasi grouped bar chart. Dengan mengonversi format wide menjadi long, variabel “sales” dan “marketing” dapat dikategorikan ke dalam satu dimensi metrik, sehingga memungkinkan perbandingan visual yang presisi antar wilayah dalam satu grafik.
ggplot(datalengkap, aes(x = market, y = Amount, fill = Metric)) +
geom_bar(stat = "identity", position = "dodge") +
scale_y_continuous(labels = scales::comma) +
scale_fill_manual(values = c("total_marketing" = "lightblue", "total_penjualan" = "darkblue" )) +
labs(tittle = "Perbandingan Sales dengan Marketing per Wilayah",
x = "Wilayah (Market)", y = "Nilai (USD)",
fill = "Keterangan") +
theme_minimal()
## Ignoring unknown labels:
## • tittle : "Perbandingan Sales dengan Marketing per Wilayah"
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## <theme> List of 1
## $ axis.text.x: <ggplot2::element_text>
## ..@ family : NULL
## ..@ face : NULL
## ..@ italic : chr NA
## ..@ fontweight : num NA
## ..@ fontwidth : num NA
## ..@ colour : NULL
## ..@ size : NULL
## ..@ hjust : num 1
## ..@ vjust : NULL
## ..@ angle : num 45
## ..@ lineheight : NULL
## ..@ margin : NULL
## ..@ debug : NULL
## ..@ inherit.blank: logi FALSE
## @ complete: logi FALSE
## @ validate: logi TRUE
Hasil bar chart menunjukkan bahwa wilayah West dan Central berkontribusi besar terhadap pendapatan bagi perusahaan. Yang mana kedua wilayah tersebut memiliki total penjualan di atas 200.000 USD. Wilayah South memiliki total marketing yang paling sedikit dibanding wilayah lainnya. Maknanya, wilayah South mengeluarkan uang paling sedikit untuk iklan. Wilayah East memiliki total marketing lebih sedikit dibandingkan dengan Central dan West, tetapi wilayah ini mampu menghasilkan volume penjualan yang lebih besar.
ggplot(analisis_market, aes(x = reorder(market, rasio_marketing), y = rasio_marketing)) +
geom_col(fill = "blue") +
coord_flip() +
labs(title = "Rasio Biaya Marketing terhadap Penjualan (%)",
subtitle = "Semakin kecil persentase, semakin efisien penggunaan budget",
x = "Wilayah", y = "Persentase Marketing/Sales") +
theme_light()
### Interpretasi Hasil menunjukkan bahwa persentase wilayah Central
lebih kecil dibanding wilayah lainnya. Hal ini menunjukkan bahwa wilayah
Central lah yang menggunakan budget dengan efisien.
Melakukan uji normalitas dengan menggunakan uji normalitas Shapiro-Wilk untuk mengetahui fluktutasi data_coffe pada kolom ‘sales’ dan ‘marketing’ berada dalam batas yang wajar atau memiliki banyak anomali. Data menunjukkan bahwa terdapat variasi antar wilayah yang mengakibatkan data dikatakan tidak berdistribusi normal.
Wilayah West dan Central berkontribusi besar dalam pendapatan sebuah perusahaan karena kedua wilayah tersebut menghasilkan total penjualan lebih dari 200.000 USD. Perusahaan memiliki kebijakan dimana manajemen pusat mematok biaya iklan berdasarkan persentase target penjualan. Hal ini dapat dibuktikan dengan rasio pemasaran di setiap wilayah yang cenderung stabil di angka sekitar 16%.
Nilai korelasi pearson membuktikan dengan kuat mengenai efisiensi operasional. Wilayah dengan nilai korelasi yang tinggi (rho mendekati 1) menunjukkan bahwa sistem informasi pemasaran bekerja dengan sangat baik karena setiap kenaikan biaya iklam terbukti mampu mendorong kenaikan penjualan secara konsisten. Berbeda dengan wilayah yang memiliki korelasi yang rendah. Wilayah dengan korelasi yang rendah membuktikan bahwa penjualan lebih dipengaruhi oleh faktor eksternal seperti lokasi atau selera pasar lokal daripada intensitas iklan.