Laporan ini merupakan hasil analisis data penjualan produk UMKM binaan yang dipasarkan di Mall Lippo, periode Januari–Juni. Data dikumpulkan oleh tim magang Dinas UMKM sebagai bagian dari monitoring dan evaluasi kinerja produk UMKM di lokasi pemasaran ritel modern.
Tujuan analisis:
# install.packages(c("tidyverse","readr","knitr","scales","forcats")) # jalankan sekali jika belum terpasang
library(tidyverse)
library(readr)
library(knitr)
library(scales)
library(forcats)Struktur file CSV asli memiliki 3 baris judul/header gabungan sebelum
data mulai, sehingga kita lewati (skip = 3) dan beri nama
kolom secara manual.
df_raw <- read_csv(
"Penjualan_Produk_UMKM_di_Mall_Lippo.csv",
skip = 4,
col_names = c("Produk", "Januari", "Februari", "Maret", "April", "Mei", "Juni"),
show_col_types = FALSE
)
glimpse(df_raw)## Rows: 151
## Columns: 7
## $ Produk <chr> "IEC KOPI LUWAK BALI POWDER 100GR", "IEC KOPI LUWAK SUMATRA W…
## $ Januari <dbl> 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ Februari <dbl> 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0…
## $ Maret <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0…
## $ April <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0…
## $ Mei <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0…
## $ Juni <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 1, 0…
df <- df_raw %>%
filter(!is.na(Produk)) %>%
mutate(across(Januari:Juni, ~replace_na(.x, 0))) %>%
mutate(Total_Terjual = Januari + Februari + Maret + April + Mei + Juni) %>%
distinct()
cat("Jumlah produk terdata:", nrow(df), "\n")## Jumlah produk terdata: 151
## Total unit terjual (semua produk, Jan-Jun): 1516
## Jumlah produk yang TIDAK LAKU sama sekali (total = 0): 58
top10 <- df %>%
arrange(desc(Total_Terjual)) %>%
slice_head(n = 10) %>%
select(Produk, Januari:Juni, Total_Terjual)
kable(top10, caption = "10 Produk dengan Penjualan Tertinggi (Jan-Jun)")| Produk | Januari | Februari | Maret | April | Mei | Juni | Total_Terjual |
|---|---|---|---|---|---|---|---|
| ANTE KRIPIK SINGKONG BALADO 200G | 59 | 32 | 14 | 27 | 30 | 33 | 195 |
| BWANG BAWANG GORENG 100 GR | 8 | 24 | 30 | 26 | 12 | 21 | 121 |
| TOKEZI CHEESE STICK ORIGINAL 70GR | 26 | 17 | 2 | 26 | 37 | 8 | 116 |
| BNJ KERUPUK BANGKA 225 G | 20 | 11 | 12 | 19 | 25 | 24 | 111 |
| ANTE KRIPIK SINGKONG BALADO 430G | 12 | 11 | 16 | 7 | 3 | 15 | 64 |
| BNJ KERUPUK OVEN BANGKA 185 G | 4 | 10 | 4 | 8 | 19 | 12 | 57 |
| BNJ GETAS BULAT BANGKA 225 G | 7 | 6 | 6 | 10 | 6 | 3 | 38 |
| PAWON JUNA KENTANG MUSTOFA 100 GR | 8 | 2 | 9 | 3 | 4 | 10 | 36 |
| EL S DRIP COFEE JAVA MOCHA 10GRX5 S | 0 | 8 | 5 | 2 | 5 | 8 | 28 |
| BASO CUANKI INSTANT ORIGINAL | 3 | 1 | 6 | 6 | 4 | 6 | 26 |
top10 %>%
mutate(Produk = fct_reorder(Produk, Total_Terjual)) %>%
ggplot(aes(x = Produk, y = Total_Terjual)) +
geom_col(fill = "#0884F5") +
geom_text(aes(label = Total_Terjual), hjust = -0.15, size = 3.3) +
coord_flip() +
labs(
title = "10 Produk UMKM Terlaris di Mall Lippo (Jan-Jun)",
x = NULL, y = "Total Unit Terjual"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold")) +
expand_limits(y = max(top10$Total_Terjual) * 1.1)
Ini 10 produk paling laku selama Januari–Juni. Kesimpulannya secara
umum:
Produk dengan total penjualan 0 dipisah ke bagian 1.3 karena jumlahnya cukup banyak dan perlu perhatian khusus (produk yang sama sekali belum terjual).
bottom10 <- df %>%
filter(Total_Terjual > 0) %>%
arrange(Total_Terjual) %>%
slice_head(n = 10) %>%
select(Produk, Januari:Juni, Total_Terjual)
kable(bottom10, caption = "10 Produk dengan Penjualan Terendah (namun > 0 unit)")| Produk | Januari | Februari | Maret | April | Mei | Juni | Total_Terjual |
|---|---|---|---|---|---|---|---|
| AL WALIY MADU ANGKAK 350 GR | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| KOPI SIHOLTA ROBUSTA KOPI KAPSUL 10 X 7 GR | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
| KOPI SIHOLTA ROBUSTA ROASTED BEAN 70 GR | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
| KOPI SIHOLTA ROBUSTA BUBUK 70 GR | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
| SAMU BALI ROBUSTA COFFE 250 GR | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
| SAMU BALI ROASTED BEANS KINTAMANI ARABICA 250 G | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
| AGRO SWEET NATURAL SUGAR 250GR | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| WATU CASHEW NUT SALTED 100GR | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
| MALIKA S CHEESESTICK 80GR | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| MALIKA S KAPIT ORIGINAL 80GR | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
Ini 10 produk yang paling sedikit lakunya (tapi masih ada yang beli, bukan nol sama sekali):
zero_sales <- df %>%
filter(Total_Terjual == 0) %>%
select(Produk)
cat("Jumlah produk dengan penjualan 0 selama 6 bulan:", nrow(zero_sales),
"dari", nrow(df), "produk (", percent(nrow(zero_sales)/nrow(df)), ")\n")## Jumlah produk dengan penjualan 0 selama 6 bulan: 58 dari 151 produk ( 38% )
| Produk |
|---|
| IEC KOPI LUWAK BALI POWDER 100GR |
| IEC KOPI LUWAK SUMATRA WHOLEBEAN 100GR |
| IEC KOPI LUWAK SUMATRA POWDER 100GR |
| IEC KOPI LUWAK BALI WHOLEBEAN 100GR |
| AL WALIY MADU MIX FOOD 250 GR |
| AL WALIY MADU HITAM 470 GR |
| KOPI SIHOLTA ARABICA ROASTED BEAN 70 GR |
| MANDAILING PREMIUM COFFEE HOMELAND BEAN 200G |
| SAMU BALI ARABIKA COFFE 500 GR |
| SAMU BALI ROBUSTA COFFE 500 GR |
| EL S 1 MINUTE COFFEE BASE 600ML |
| EL S COFFEE LUWAK BOX 100G |
| EL S COFFEE LUWAK 100G |
| EL S COFFEE TURKISH 5X10G |
| RENGGINANG UDGTRSBWANG |
| PAWON BUMBON BAWANG GORENG 150 GR |
| PAWON KERIPIK CIRENG ORI 65GR |
| PAWON KERIPIK CIRENG SEBLAK 65GR |
| PAWON OSH SERBUK JAHE SECANG 150 G |
| PAWON MAK KERIPIK TAHU ORIGINAL 70 GR |
| PAWON MAK KERIPIK TAHU PEDES 70 GR |
| PAWON ARA RENGGINANG KUPANG 125 GR |
| PAWON LILY KERING TEMPE KACANG 180 GR |
| PAWON LILY SURENDENG MAWUT 180 GR |
| PAWON ENTIN ONWAJEN 300GR |
| PAWON ASAP KERIPIK KULIT AYAM |
| PAWON DE KISS SARI JAHE INSTANT 140 ML |
| ING PAWON BANDREK 75 ML |
| NEW ACEH FISH SKIN SALTED EGG ORI 40 G |
| NEW ACEH FISH SKIN SALTED EGG SPICY 40 G |
| KRIWAK KERIPIK WADER PEDAS |
| KRIWAK KERIPIK WADER RASA ORIGINAL |
| NEW KRIWAK KERIPIK WADER BLACK PAPER |
| NEW KRIWAK KEONG KRISPY SPICY |
| KRIWAK KERIPIK PATIN ORIGINAL 80GR |
| KRIWAK KERIPIK PATIN SPICY 80GR |
| KRIWAK KERANG ORIGINAL 100GR |
| KRIWAK KERANG SPICY 100GR |
| WATU CASHEW BUTTER 180GR |
| WATU CASHEW NUT ESPRESSO 35GR |
| WATU CASHEW NUT ORIGINAL 35GR |
| WATU CASHEW NUT ESPRESSO 100GR |
| WATU KUANSING 200 GR |
| WATU HONEY BANGKA 400 GR |
| WATU HONEY LUWU 200 GR |
| WATU HONEY CALLIANDRA 400 GR |
| WATU HONEY KAPUAS HULU 200 GR |
| WATU CASHEW NUT BUTTER CHUNKY 180 GR |
| WATU CASHEW NUT CARAMEL 35GR |
| MALIKA S KAPIT PANDAN 80GR |
| MALIKA S KAPIT TARO 80GR |
| CHEESE TOKEZI CORNED 70 GR |
| CHEESE TOKEZI ORIGINAL 70 GR |
| DAPUR SITI SEROJA MINI ASIN GURIH 80 GR |
| ANTE KRIPIK PISANG COKLAT 100G |
| ANTE KRIPIK PISANG SUSU 100G |
| ANTE PILUS IKAN BALADO 150G |
| ANTE TALAS BALADO 100G |
tren_bulanan <- df %>%
summarise(across(Januari:Juni, sum)) %>%
pivot_longer(everything(), names_to = "Bulan", values_to = "Total") %>%
mutate(Bulan = factor(Bulan, levels = c("Januari","Februari","Maret","April","Mei","Juni")))
ggplot(tren_bulanan, aes(x = Bulan, y = Total, group = 1)) +
geom_line(color = "#0884F5", linewidth = 1.1) +
geom_point(color = "#0884F5", size = 3) +
geom_text(aes(label = Total), vjust = -1, size = 3.5) +
labs(title = "Tren Total Penjualan Produk UMKM per Bulan",
x = NULL, y = "Total Unit Terjual") +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold")) +
expand_limits(y = max(tren_bulanan$Total) * 1.15)
Ini tren total penjualan semua produk per bulan:
Jadi ada pola naik-turun, bukan tren yang terus naik. Maret bisa jadi bulan yang perlu dievaluasi (kenapa sepi), sedangkan Mei bisa dicontoh strateginya (apa yang beda di bulan itu, misal ada promo atau musim liburan).
Nama produk dikelompokkan ke dalam kategori berdasarkan kata kunci pada nama produk. Kategori minuman/bahan minuman (kopi, madu, gula, herbal) dipisahkan dari makanan olahan/camilan agar pertanyaan “produk olahan makanan apa yang paling laku” bisa dijawab spesifik pada kelompok makanan.
Catatan: aturan kata kunci di bawah ini bisa disesuaikan tim jika ada kategori yang kurang tepat.
df_kat <- df %>%
mutate(
Kelompok_Besar = case_when(
str_detect(Produk, regex("KOPI|COFFEE|COFEE", ignore_case = TRUE)) ~ "Minuman - Kopi",
str_detect(Produk, regex("MADU|HONEY", ignore_case = TRUE)) ~ "Minuman/Bahan - Madu",
str_detect(Produk, regex("SUGAR|GULA", ignore_case = TRUE)) ~ "Bahan - Gula",
str_detect(Produk, regex("JAHE|BANDREK|SECANG", ignore_case = TRUE)) ~ "Minuman Herbal",
TRUE ~ "Makanan Olahan"
),
Kategori_Makanan = case_when(
Kelompok_Besar != "Makanan Olahan" ~ NA_character_,
str_detect(Produk, regex("KERUPUK|KEMPLANG|GETAS|RENGGINANG", ignore_case = TRUE)) ~ "Kerupuk & Sejenisnya",
str_detect(Produk, regex("KERIPIK|KRIPIK|KRIWAK|WADER|PATIN|KERANG|KULIT AYAM|KULIT BELUT|RAJUNGAN|CUMI|KEONG|FISH SKIN", ignore_case = TRUE)) ~ "Keripik & Kerupuk Ikan/Umbi",
str_detect(Produk, regex("CASHEW|KUANSING", ignore_case = TRUE)) ~ "Kacang Olahan",
str_detect(Produk, regex("TERI|KANANORI|ABON", ignore_case = TRUE)) ~ "Ikan Olahan (Teri/Abon)",
str_detect(Produk, regex("BAWANG|BUMBU|MUSTOFA", ignore_case = TRUE)) ~ "Bumbu Dapur",
str_detect(Produk, regex("EGGROLL|KAPIT|CHEESESTICK|CHEESE STICK|CHEESE|SOES", ignore_case = TRUE)) ~ "Camilan Manis/Renyah",
str_detect(Produk, regex("CUANKI|BASRENG|BATAGOR|TEMPE|TAHU|ONWAJEN|SURENDENG", ignore_case = TRUE)) ~ "Makanan Siap Saji/Kudapan",
TRUE ~ "Lainnya"
)
)
table(df_kat$Kelompok_Besar, useNA = "ifany")##
## Bahan - Gula Makanan Olahan Minuman - Kopi
## 4 104 31
## Minuman Herbal Minuman/Bahan - Madu
## 4 8
Ini hasil pengelompokan semua produk ke kategori besar:
Jadi dari segi jumlah produk yang dijual, mall ini didominasi camilan/makanan olahan. Tapi ingat ini baru jumlah jenis produk, bukan jumlah terjual — makanya di bagian selanjutnya (2.1) baru kelihatan apakah banyaknya varian makanan olahan ini sebanding dengan tingginya penjualan atau tidak.
ringkas_besar <- df_kat %>%
group_by(Kelompok_Besar) %>%
summarise(Total_Terjual = sum(Total_Terjual), Jumlah_SKU = n(), .groups = "drop") %>%
arrange(desc(Total_Terjual))
kable(ringkas_besar, caption = "Total Penjualan per Kelompok Besar")| Kelompok_Besar | Total_Terjual | Jumlah_SKU |
|---|---|---|
| Makanan Olahan | 1279 | 104 |
| Minuman - Kopi | 200 | 31 |
| Bahan - Gula | 27 | 4 |
| Minuman Herbal | 6 | 4 |
| Minuman/Bahan - Madu | 4 | 8 |
ggplot(ringkas_besar, aes(x = fct_reorder(Kelompok_Besar, Total_Terjual), y = Total_Terjual)) +
geom_col(fill = "#0884F5") +
coord_flip() +
geom_text(aes(label = Total_Terjual), hjust = -0.15, size = 3.3) +
labs(title = "Total Penjualan: Minuman vs Makanan Olahan", x = NULL, y = "Total Unit Terjual") +
theme_minimal(base_size = 11) +
expand_limits(y = max(ringkas_besar$Total_Terjual) * 1.1)
Grafik ini menunjukkan bahwa Makanan Olahan mendominasi
penjualan secara signifikan, dengan total 1.279 unit terjual,
jauh melampaui kategori lainnya. Kopi berada di posisi kedua dengan 200
unit, sementara Gula, Herbal, dan Madu masing-masing hanya terjual dalam
jumlah yang sangat kecil (di bawah 30 unit).
Temuan ini sekaligus menegaskan hasil sebelumnya: baik dari segi jumlah varian produk maupun jumlah unit terjual, kategori makanan olahan konsisten menjadi yang paling diminati pengunjung mall, sedangkan kategori minuman selain kopi (madu, gula, herbal) memiliki kontribusi penjualan yang sangat minim dan perlu menjadi perhatian dalam evaluasi strategi UMKM.
ringkas_makanan <- df_kat %>%
filter(Kelompok_Besar == "Makanan Olahan") %>%
group_by(Kategori_Makanan) %>%
summarise(Total_Terjual = sum(Total_Terjual), Jumlah_SKU = n(), .groups = "drop") %>%
arrange(desc(Total_Terjual))
kable(ringkas_makanan, caption = "Total Penjualan per Kategori Makanan Olahan")| Kategori_Makanan | Total_Terjual | Jumlah_SKU |
|---|---|---|
| Keripik & Kerupuk Ikan/Umbi | 405 | 29 |
| Kerupuk & Sejenisnya | 240 | 7 |
| Bumbu Dapur | 186 | 5 |
| Camilan Manis/Renyah | 153 | 11 |
| Ikan Olahan (Teri/Abon) | 150 | 12 |
| Makanan Siap Saji/Kudapan | 74 | 10 |
| Lainnya | 62 | 19 |
| Kacang Olahan | 9 | 11 |
ggplot(ringkas_makanan, aes(x = fct_reorder(Kategori_Makanan, Total_Terjual), y = Total_Terjual)) +
geom_col(fill = "#14B8A6") +
coord_flip() +
geom_text(aes(label = Total_Terjual), hjust = -0.15, size = 3.3) +
labs(title = "Kategori Makanan Olahan Paling Laku di Mall Lippo", x = NULL, y = "Total Unit Terjual") +
theme_minimal(base_size = 11) +
expand_limits(y = max(ringkas_makanan$Total_Terjual) * 1.1)
Grafik ini merinci kategori makanan olahan yang paling diminati.
Keripik & Kerupuk Ikan/Umbi menjadi kategori dengan
penjualan tertinggi, yaitu 405 unit, diikuti oleh Kerupuk &
Sejenisnya dengan 240 unit dan Bumbu Dapur
dengan 186 unit. Sementara itu, Kacang Olahan menjadi
kategori dengan penjualan paling rendah, hanya 9 unit.
Temuan ini menunjukkan bahwa produk berbasis keripik dan kerupuk secara konsisten menjadi favorit pengunjung, sehingga dapat menjadi fokus utama dalam strategi pengembangan dan promosi produk UMKM. Sebaliknya, kategori kacang olahan perlu dievaluasi lebih lanjut, baik dari sisi penempatan produk, harga, maupun kesesuaian dengan preferensi pasar di mall tersebut.
top_makanan <- df_kat %>%
filter(Kelompok_Besar == "Makanan Olahan") %>%
arrange(desc(Total_Terjual)) %>%
slice_head(n = 10) %>%
select(Produk, Kategori_Makanan, Total_Terjual)
kable(top_makanan, caption = "10 Produk Olahan Makanan (Non-Minuman) dengan Penjualan Tertinggi")| Produk | Kategori_Makanan | Total_Terjual |
|---|---|---|
| ANTE KRIPIK SINGKONG BALADO 200G | Keripik & Kerupuk Ikan/Umbi | 195 |
| BWANG BAWANG GORENG 100 GR | Bumbu Dapur | 121 |
| TOKEZI CHEESE STICK ORIGINAL 70GR | Camilan Manis/Renyah | 116 |
| BNJ KERUPUK BANGKA 225 G | Kerupuk & Sejenisnya | 111 |
| ANTE KRIPIK SINGKONG BALADO 430G | Keripik & Kerupuk Ikan/Umbi | 64 |
| BNJ KERUPUK OVEN BANGKA 185 G | Kerupuk & Sejenisnya | 57 |
| BNJ GETAS BULAT BANGKA 225 G | Kerupuk & Sejenisnya | 38 |
| PAWON JUNA KENTANG MUSTOFA 100 GR | Bumbu Dapur | 36 |
| BASO CUANKI INSTANT ORIGINAL | Makanan Siap Saji/Kudapan | 26 |
| GUE KRIPIK TEMPE SAGU 100 GR | Keripik & Kerupuk Ikan/Umbi | 26 |
Interpretasi:
Penjualan Keseluruhan
Tren Bulanan
Kategori Produk
Produk Unggulan
Benang Merah
Preferensi pengunjung Mall Lippo condong ke camilan gurih siap makan (keripik, kerupuk, bawang goreng) dibanding produk minuman/bahan seperti kopi, madu, dan gula. Temuan ini menjadi dasar penting untuk rekomendasi strategi UMKM pada bagian selanjutnya.
1. Prioritaskan Kategori Unggulan
2. Evaluasi Produk yang Tidak Laku
3. Perbaiki Penempatan dan Promosi Kategori Lemah
4. Manfaatkan Pola Musiman
5. Perkuat Diversifikasi Produk Unggulan
6. Pendampingan UMKM Berkinerja Rendah
7. Monitoring Berkelanjutan
Laporan ini disusun oleh tim magang Dinas UMKM: Dadan Ramdan Hidayat, M. Rizki Ragil Mulya, dan Isnaini Nur Hasanah, berdasarkan data penjualan produk UMKM di Mall Lippo periode Januari-Juni.