library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.5.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.0     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.1     
## ── 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(lubridate)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.3
## corrplot 0.95 loaded
# 2. Import data
data <- read.csv("D:/R/Chocolate Sales (2).csv")
head(data)
##     Sales.Person   Country             Product       Date     Amount
## 1 Jehu Rudeforth        UK     Mint Chip Choco 04/01/2022  $5,320.00
## 2    Van Tuxwell     India       85% Dark Bars 01/08/2022  $7,896.00
## 3   Gigi Bohling     India Peanut Butter Cubes 07/07/2022  $4,501.00
## 4   Jan Morforth Australia Peanut Butter Cubes 27/04/2022 $12,726.00
## 5 Jehu Rudeforth        UK Peanut Butter Cubes 24/02/2022 $13,685.00
## 6    Van Tuxwell     India  Smooth Sliky Salty 06/06/2022  $5,376.00
##   Boxes.Shipped
## 1           180
## 2            94
## 3            91
## 4           342
## 5           184
## 6            38
str(data)
## 'data.frame':    3282 obs. of  6 variables:
##  $ Sales.Person : chr  "Jehu Rudeforth" "Van Tuxwell" "Gigi Bohling" "Jan Morforth" ...
##  $ Country      : chr  "UK" "India" "India" "Australia" ...
##  $ Product      : chr  "Mint Chip Choco" "85% Dark Bars" "Peanut Butter Cubes" "Peanut Butter Cubes" ...
##  $ Date         : chr  "04/01/2022" "01/08/2022" "07/07/2022" "27/04/2022" ...
##  $ Amount       : chr  "$5,320.00" "$7,896.00" "$4,501.00" "$12,726.00" ...
##  $ Boxes.Shipped: int  180 94 91 342 184 38 176 73 59 102 ...
summary(data)
##  Sales.Person         Country            Product              Date          
##  Length:3282        Length:3282        Length:3282        Length:3282       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Amount          Boxes.Shipped  
##  Length:3282        Min.   :  1.0  
##  Class :character   1st Qu.: 71.0  
##  Mode  :character   Median :137.0  
##                     Mean   :164.7  
##                     3rd Qu.:232.0  
##                     Max.   :778.0
# cek missing value
colSums(is.na(data))
##  Sales.Person       Country       Product          Date        Amount 
##             0             0             0             0             0 
## Boxes.Shipped 
##             0

Berdasarkan pemeriksaan missing value, seluruh variabel memiliki nilai missing sebesar 0. Hal ini menunjukkan bahwa dataset tidak memiliki data yang hilang sehingga seluruh observasi dapat digunakan dalam analisis tanpa melakukan imputasi atau penghapusan data.

# Mengubah Amount menjadi numerik
data$Amount <- as.numeric(gsub("[\\$,]", "", data$Amount))

# mengubah date menjadi format tanggal
data$Date <- dmy(data$Date)

# mengubah variabel kategori menjadi factor
data$Country <- as.factor(data$Country)
data$Product <- as.factor(data$Product)
data$Sales.Person <- as.factor(data$Sales.Person)

# cek kembali struktur data
str(data)
## 'data.frame':    3282 obs. of  6 variables:
##  $ Sales.Person : Factor w/ 25 levels "Andria Kimpton",..: 14 24 10 13 14 24 21 11 14 4 ...
##  $ Country      : Factor w/ 6 levels "Australia","Canada",..: 5 3 3 1 5 3 5 1 4 1 ...
##  $ Product      : Factor w/ 22 levels "50% Dark Bites",..: 15 3 18 18 18 20 4 5 1 4 ...
##  $ Date         : Date, format: "2022-01-04" "2022-08-01" ...
##  $ Amount       : num  5320 7896 4501 12726 13685 ...
##  $ Boxes.Shipped: int  180 94 91 342 184 38 176 73 59 102 ...

Analisis Deskriptif

# analisis deskriptif

summary(data$Amount)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       7    2521    5226    6030    8557   26171
summary(data$Boxes.Shipped)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0    71.0   137.0   164.7   232.0   778.0
mean(data$Amount)
## [1] 6030.339
median(data$Amount)
## [1] 5225.5
sd(data$Amount)
## [1] 4393.98

Berdasarkan hasil analisis deskriptif, rata-rata nilai penjualan (Amount) pada setiap transaksi adalah sebesar $6.030,34, dengan median sebesar $5.225,50. Hal ini menunjukkan bahwa secara umum setiap transaksi menghasilkan penjualan sekitar $6.030, sedangkan 50% transaksi memiliki nilai penjualan di bawah atau sama dengan $5.225,50 dan 50% lainnya berada di atas atau sama dengan nilai tersebut. Standar deviasi sebesar $4.393,98 menunjukkan bahwa nilai penjualan memiliki variasi yang cukup besar antartransaksi. Nilai rata-rata yang lebih tinggi dibandingkan median juga mengindikasikan adanya sejumlah transaksi dengan nilai penjualan yang relatif tinggi sehingga meningkatkan nilai rata-rata keseluruhan.

mean(data$Boxes.Shipped)
## [1] 164.667
median(data$Boxes.Shipped)
## [1] 137
sd(data$Boxes.Shipped)
## [1] 124.0247

Berdasarkan hasil analisis deskriptif, rata-rata jumlah box cokelat yang dikirim dalam setiap transaksi adalah 164,67 box, dengan median sebesar 137 box. Hal ini menunjukkan bahwa secara umum jumlah pengiriman berada pada kisaran 165 box per transaksi, sedangkan 50% transaksi memiliki jumlah pengiriman di bawah atau sama dengan 137 box dan 50% lainnya di atas atau sama dengan 137 box. Standar deviasi sebesar 124,02 menunjukkan bahwa jumlah box yang dikirim memiliki variasi yang cukup besar antartransaksi. Nilai mean yang lebih tinggi daripada median juga mengindikasikan adanya beberapa transaksi dengan jumlah pengiriman yang relatif tinggi sehingga meningkatkan nilai rata-rata.

# Total penjualan
sum(data$Amount)
## [1] 19791572

Penjualan Berdasarkan Negara

country_sales <- data %>%
  group_by(Country) %>%
  summarise(Total_Sales = sum(Amount), Average_Sales = mean(Amount), Total_Boxes = sum(Boxes.Shipped), Jumlah_Transaksi = n()) %>%
  arrange(desc(Total_Sales))

print(country_sales)
## # A tibble: 6 × 5
##   Country     Total_Sales Average_Sales Total_Boxes Jumlah_Transaksi
##   <fct>             <dbl>         <dbl>       <int>            <int>
## 1 Australia      3646444.         5929.       99618              615
## 2 UK             3365389.         6302.       92523              534
## 3 India          3343731.         6057.       89968              552
## 4 USA            3313858.         6171.       81820              537
## 5 Canada         3078496.         5864.       95158              525
## 6 New Zealand    3043654.         5864.       81350              519

Berdasarkan hasil pengelompokan penjualan berdasarkan negara, Australia memiliki total penjualan tertinggi sebesar $3.646.444 dari 615 transaksi, dengan rata-rata penjualan sebesar $5.929 per transaksi dan total pengiriman sebanyak 99.618 box. Selanjutnya, UK memiliki total penjualan sebesar $3.365.389, diikuti India sebesar $3.343.731 dan USA sebesar $3.313.858.

Canada mencatat total penjualan sebesar $3.078.496, sedangkan New Zealand memiliki total penjualan terendah sebesar $3.043.654. Meskipun Australia memiliki total penjualan tertinggi, rata-rata penjualan per transaksi tertinggi justru terdapat di UK, yaitu sekitar $6.302 per transaksi. New Zealand memiliki rata-rata penjualan terendah, yaitu sekitar $5.864 per transaksi.

Secara keseluruhan, hasil tersebut menunjukkan adanya perbedaan kontribusi penjualan antarnegara. Tingginya total penjualan Australia juga didukung oleh jumlah transaksi dan jumlah box yang dikirim yang paling tinggi dibandingkan negara lainnya.

library(ggplot2)
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
ggplot(country_sales, aes(x = reorder(Country, Total_Sales), y = Total_Sales, fill = Total_Sales)) + geom_col(width = 0.7) +
  geom_text(aes(label = dollar(Total_Sales)), hjust = -0.1, size = 4.2, fontface = "bold") +
  scale_fill_gradient(low = "#90CAF9", high = "#1565C0") +
  scale_y_continuous(labels = label_number(big.mark = ","), expand = expansion(mult = c(0, 0.25))) +
  coord_flip(clip = "off") +labs(title = "Total Penjualan Berdasarkan Negara", subtitle = "Periode Januari 2022 – Agustus 2024",
    x = "",
    y = "Total Penjualan (USD)") + theme_minimal(base_size = 14) +
  theme(legend.position = "none", plot.title = element_text(face = "bold", size = 18), plot.subtitle = element_text(size = 12), axis.text = element_text(size = 12), panel.grid.major.y = element_blank(), panel.grid.minor = element_blank(), plot.margin = margin(10, 40, 10, 10))

Berdasarkan visualisasi total penjualan berdasarkan negara, Australia menunjukkan total penjualan tertinggi sebesar $3.646.444, sedangkan New Zealand memiliki total penjualan terendah sebesar $3.043.654. UK, India, dan USA memiliki total penjualan yang relatif berdekatan, yaitu sekitar $3,3 juta. Grafik menunjukkan bahwa kontribusi penjualan antarnegara cukup merata, meskipun Australia terlihat lebih dominan dibandingkan negara lainnya

Penjualan Berdasarkan Produk

library(ggplot2)
library(scales)
library(dplyr)

# Menghitung penjualan berdasarkan produk
product_sales <- data %>%
  group_by(Product) %>%
  summarise(Total_Sales = sum(Amount), Average_Sales = mean(Amount), Total_Boxes = sum(Boxes.Shipped)) %>%
  arrange(desc(Total_Sales))

# Mengambil 10 produk dengan penjualan tertinggi
top10 <- head(product_sales, 10)

# Visualisasi
ggplot(top10, aes(x = reorder(Product, Total_Sales), y = Total_Sales, fill = Total_Sales)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = dollar(Total_Sales, accuracy = 1)), hjust = -0.1, size = 4, fontface = "bold") +
  scale_fill_gradient(low = "#BBDEFB", high = "#1565C0") +
  scale_y_continuous(labels = label_number(scale = 1e-6, suffix = "M", accuracy = 0.1), expand = expansion(mult = c(0, 0.25))) +
  coord_flip(clip = "off") +
  labs(title = "10 Produk dengan Penjualan Tertinggi", subtitle = "Periode Januari 2022 – Agustus 2024", x = NULL, y = "Total Penjualan (Juta USD)") +
  theme_minimal(base_size = 14) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold", size = 18),
    plot.subtitle = element_text(size = 12, color = "grey40"),
    axis.text.y = element_text(size = 11, face = "bold"),
    axis.text.x = element_text(size = 10),
    axis.title.x = element_text(size = 12, face = "bold"),
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    plot.margin = margin(15, 50, 10, 10)
  )

Berdasarkan visualisasi, Smooth Sliky Salty memiliki total penjualan tertinggi sebesar $1.120.201, diikuti 50% Dark Bites sebesar $1.087.659 dan White Choc sebesar $1.054.257. Hal ini menunjukkan bahwa ketiga produk tersebut menjadi produk dengan kontribusi penjualan terbesar selama periode pengamatan.

Korelasi

cor.test(
  data$Boxes.Shipped,
  data$Amount,
  method = "pearson"
)
## 
##  Pearson's product-moment correlation
## 
## data:  data$Boxes.Shipped and data$Amount
## t = -0.7534, df = 3280, p-value = 0.4513
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.04734687  0.02106993
## sample estimates:
##         cor 
## -0.01315387
# Scatter plot
ggplot(data,
       aes(x = Boxes.Shipped,
           y = Amount)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "lm", se = TRUE) +
  labs(
    title = "Hubungan Boxes Shipped dan Amount",
    x = "Boxes Shipped",
    y = "Amount"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Hasil uji korelasi Pearson menunjukkan koefisien korelasi sebesar -0,0132 dengan p-value sebesar 0,4513. Nilai korelasi yang mendekati nol menunjukkan hubungan linear yang sangat lemah dan berarah negatif antara Boxes Shipped dan Amount. Karena p-value > 0,05, hubungan tersebut tidak signifikan secara statistik. Interval kepercayaan 95% sebesar -0,0473 hingga 0,0211 juga mencakup nilai nol. Dengan demikian, tidak terdapat bukti yang cukup untuk menyatakan adanya hubungan linear yang signifikan antara jumlah box yang dikirim dengan nilai penjualan.

Berdasarkan scatter plot, titik-titik data terlihat menyebar tanpa membentuk pola linear yang jelas. Garis regresi juga cenderung mendatar, yang menunjukkan bahwa perubahan jumlah Boxes Shipped tidak diikuti oleh perubahan Amount secara konsisten.

Regresi Linear Berganda

model <- lm(
  Amount ~ Boxes.Shipped + Country + Product,
  data = data
)

summary(model)
## 
## Call:
## lm(formula = Amount ~ Boxes.Shipped + Country + Product, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6998.8 -3507.4  -803.6  2573.3 19115.5 
## 
## Coefficients:
##                               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  6027.7841   371.6682  16.218   <2e-16 ***
## Boxes.Shipped                  -0.5207     0.6232  -0.836   0.4034    
## CountryCanada                 -80.6873   262.1910  -0.308   0.7583    
## CountryIndia                  106.9073   258.7442   0.413   0.6795    
## CountryNew Zealand           -135.3913   263.3679  -0.514   0.6072    
## CountryUK                     321.4928   260.1761   1.236   0.2167    
## CountryUSA                    252.6609   259.7018   0.973   0.3307    
## Product70% Dark Bites        -615.7937   509.7354  -1.208   0.2271    
## Product85% Dark Bars          362.2685   485.6046   0.746   0.4557    
## Product99% Dark & Pure        483.7924   487.1293   0.993   0.3207    
## ProductAfter Nines           -414.2328   486.0153  -0.852   0.3941    
## ProductAlmond Choco           147.3504   490.4094   0.300   0.7638    
## ProductBaker's Choco Chips    481.4888   512.9444   0.939   0.3480    
## ProductCaramel Stuffed Bars  -259.3322   506.6090  -0.512   0.6088    
## ProductChoco Coated Almonds   578.9812   521.8533   1.109   0.2673    
## ProductDrinking Coco        -1148.9232   470.2342  -2.443   0.0146 *  
## ProductEclairs               -487.0834   463.1150  -1.052   0.2930    
## ProductFruit & Nut Bars      -485.0321   485.5138  -0.999   0.3179    
## ProductManuka Honey Choco     542.0963   499.4900   1.085   0.2779    
## ProductMilk Bars             -140.2576   487.1505  -0.288   0.7734    
## ProductMint Chip Choco        733.0642   501.5348   1.462   0.1439    
## ProductOrange Choco          -178.3220   493.4656  -0.361   0.7178    
## ProductOrganic Choco Syrup     69.7689   480.3336   0.145   0.8845    
## ProductPeanut Butter Cubes   1037.4110   488.3183   2.124   0.0337 *  
## ProductRaspberry Choco       -162.5068   490.2320  -0.331   0.7403    
## ProductSmooth Sliky Salty     303.3143   465.0693   0.652   0.5143    
## ProductSpicy Special Slims   -209.5643   476.4186  -0.440   0.6601    
## ProductWhite Choc              17.0061   466.3061   0.036   0.9709    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4381 on 3254 degrees of freedom
## Multiple R-squared:  0.0143, Adjusted R-squared:  0.006119 
## F-statistic: 1.748 on 27 and 3254 DF,  p-value: 0.009803

Berdasarkan hasil regresi linear berganda, model signifikan secara simultan dengan p-value 0,0098 < 0,05. Namun, nilai R² sebesar 0,0143 menunjukkan bahwa Boxes Shipped, Country, dan Product hanya mampu menjelaskan 1,43% variasi Amount. Secara parsial, Boxes Shipped dan seluruh kategori Country tidak berpengaruh signifikan terhadap Amount. Pada variabel Product, hanya Drinking Coco (p-value 0,0146) dan Peanut Butter Cubes (p-value 0,0337) yang menunjukkan perbedaan signifikan terhadap produk referensi. Dengan demikian, kemampuan model dalam menjelaskan variasi nilai penjualan masih tergolong rendah.

Uji Asumsi Model

par(mfrow = c(2, 2))
plot(model)

Berdasarkan grafik uji asumsi, residual pada Residuals vs Fitted menunjukkan penyebaran yang belum sepenuhnya acak. Grafik Q-Q juga menunjukkan penyimpangan yang cukup jelas dari garis normal, sehingga asumsi normalitas residual belum terpenuhi dengan baik. Pada Scale-Location terlihat adanya perubahan pola penyebaran residual yang mengindikasikan potensi heteroskedastisitas. Sementara itu, Residuals vs Leverage menunjukkan beberapa observasi dengan leverage relatif tinggi, tetapi tidak terlihat observasi yang sangat dominan berdasarkan Cook’s Distance. Secara umum, beberapa asumsi regresi linear belum terpenuhi dengan baik.

Model Sederhana

model_simple <- lm(
  Amount ~ Boxes.Shipped,
  data = data
)

summary(model_simple)
## 
## Call:
## lm(formula = Amount ~ Boxes.Shipped, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6060.9 -3485.3  -787.1  2528.9 20168.3 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   6107.0767   127.5065  47.896   <2e-16 ***
## Boxes.Shipped   -0.4660     0.6186  -0.753    0.451    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4394 on 3280 degrees of freedom
## Multiple R-squared:  0.000173,   Adjusted R-squared:  -0.0001318 
## F-statistic: 0.5676 on 1 and 3280 DF,  p-value: 0.4513
ggplot(data,
       aes(x = Boxes.Shipped,
           y = Amount)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = "lm") +
  theme_minimal() +
  labs(
    title = "Regresi Boxes Shipped terhadap Amount",
    x = "Jumlah Box Dikirim",
    y = "Nilai Penjualan"
  )
## `geom_smooth()` using formula = 'y ~ x'

Berdasarkan regresi linear sederhana, Boxes Shipped memiliki koefisien sebesar -0,4660 dengan p-value 0,4513 > 0,05. Artinya, jumlah box yang dikirim tidak berpengaruh signifikan terhadap nilai penjualan. Nilai R² sebesar 0,000173 menunjukkan bahwa Boxes Shipped hanya mampu menjelaskan sekitar 0,017% variasi Amount. Hal ini juga terlihat pada grafik, di mana garis regresi cenderung mendatar dan titik data tersebar tanpa pola linear yang jelas.

Kesimpulan

Berdasarkan hasil analisis, total penjualan selama periode Januari 2022 hingga Agustus 2024 mencapai $19.791.572 dengan rata-rata penjualan sebesar $6.030,34 per transaksi. Australia menjadi negara dengan total penjualan tertinggi, sedangkan Smooth Sliky Salty menjadi produk dengan total penjualan tertinggi. Hasil korelasi dan regresi linear sederhana menunjukkan bahwa jumlah box yang dikirim tidak memiliki hubungan yang signifikan dengan nilai penjualan. Pada regresi linear berganda, model signifikan secara simultan, tetapi hanya mampu menjelaskan 1,43% variasi nilai penjualan. Hasil ini menunjukkan bahwa variasi nilai penjualan lebih banyak dipengaruhi oleh faktor lain di luar variabel yang digunakan dalam model.