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
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
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
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.
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.
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.
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_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.
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.