1. Persiapan Library dan Data

library(ggplot2)
library(dplyr)
## 
## 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(readxl)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(scales)
library(tidyr)
df <- read_excel("C:/Users/Shera Dhafa/Downloads/car sales.xlsx")

# Konversi kolom Date
df$Date <- as.Date(df$Date)

# Tambah kolom bulan dan tahun
df$Month     <- floor_date(df$Date, "month")
df$YearMonth <- format(df$Date, "%Y-%m")
df$Year      <- format(df$Date, "%Y")

head(df)
## # A tibble: 6 × 19
##   Car_id   Date       `Customer Name` Gender `Annual Income` Dealer_Name Company
##   <chr>    <date>     <chr>           <chr>            <dbl> <chr>       <chr>  
## 1 C_CND_0… 2022-01-02 Geraldine       Male             13500 Buddy Stor… Ford   
## 2 C_CND_0… 2022-01-02 Gia             Male           1480000 C & M Moto… Dodge  
## 3 C_CND_0… 2022-01-02 Gianna          Male           1035000 Capitol KIA Cadill…
## 4 C_CND_0… 2022-01-02 Giselle         Male             13500 Chrysler o… Toyota 
## 5 C_CND_0… 2022-01-02 Grace           Male           1465000 Chrysler P… Acura  
## 6 C_CND_0… 2022-01-02 Guadalupe       Male            850000 Classic Ch… Mitsub…
## # ℹ 12 more variables: Model <chr>, Engine <chr>, Transmission <chr>,
## #   Color <chr>, `Price ($)` <dbl>, Dealer_No <chr>, `Body Style` <chr>,
## #   Phone <dbl>, Dealer_Region <chr>, Month <date>, YearMonth <chr>, Year <chr>

2. Tren penjualan bulanan

tren <- df %>%
  group_by(Month, Year) %>%
  summarise(Total_Unit = n(), .groups = "drop")

ggplot(tren, aes(x = Month, y = Total_Unit, color = Year)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2) +
  scale_x_date(date_labels = "%b %Y", date_breaks = "2 months") +
  scale_y_continuous(labels = comma) +
  labs(
    title    = "Tren Penjualan Mobil Bulanan (2022–2023)",
    x        = "Bulan",
    y        = "Jumlah Unit Terjual",
    color    = "Tahun"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Interpretasi: Tren penjualan secara keseluruhan menunjukkan pola yang konsisten sepanjang tahun. Terdapat fluktuasi bulanan, dan beberapa bulan mengalami lonjakan.

3. Total Penjualan

region <- df %>%
  group_by(Dealer_Region) %>%
  summarise(
    Total_Unit    = n(),
    Total_Revenue = sum(`Price ($)`, na.rm = TRUE)
  ) %>%
  arrange(desc(Total_Unit))

ggplot(region, aes(x = reorder(Dealer_Region, Total_Unit), y = Total_Unit, fill = Dealer_Region)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = comma(Total_Unit)), hjust = -0.2, size = 3.5) +
  coord_flip() +
  scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Total Unit Terjual per Wilayah Dealer",
    x     = "Wilayah",
    y     = "Jumlah Unit"
  ) +
  theme_minimal()

Interpretasi: Terdapat perbedaan volume penjualan yang signifikan antar wilayah dealer. Wilayah dengan penjualan tertinggi mengindikasikan pasar yang lebih besar atau juga disebabkan oleh pemasaran yang lebih bagus.

4. Dist Penjualan berdasarkan body style

body <- df %>%
  group_by(`Body Style`) %>%
  summarise(Total = n()) %>%
  mutate(Pct = round(Total / sum(Total) * 100, 1))

ggplot(body, aes(x = reorder(`Body Style`, Total), y = Total, fill = `Body Style`)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(Pct, "%")), hjust = -0.2, size = 4) +
  coord_flip() +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Distribusi Penjualan Berdasarkan Body Style",
    x     = "Body Style",
    y     = "Jumlah Unit"
  ) +
  theme_minimal()

Interpretasi: SUV dan Sedan mendominasi preferensi pembeli, mengindikasikan bahwa konsumen cenderung menyukai kedua fitur atau kenyamanan yang diberikan mobil tersebut

5. Merk Terlaris

top_brand <- df %>%
  group_by(Company) %>%
  summarise(Total_Unit = n(), Avg_Price = mean(`Price ($)`, na.rm = TRUE)) %>%
  arrange(desc(Total_Unit)) %>%
  head(10)

ggplot(top_brand, aes(x = reorder(Company, Total_Unit), y = Total_Unit, fill = Avg_Price)) +
  geom_col() +
  geom_text(aes(label = comma(Total_Unit)), hjust = -0.2, size = 3.5) +
  coord_flip() +
  scale_fill_gradient(low = "#AED6F1", high = "#1A5276", labels = dollar) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Top 10 Merek Mobil Terlaris",
    x     = "Merek",
    y     = "Jumlah Unit Terjual",
    fill  = "Rata-rata Harga ($)"
  ) +
  theme_minimal()

Interpretasi: Chevrolet dan Ford secara konsisten mendominasi penjualan, sementara merek seperti Nissan dan Toyota berada di posisi bawah

6. Transimisi vs Gender

trans_gender <- df %>%
  group_by(Transmission, Gender) %>%
  summarise(Total = n(), .groups = "drop")

ggplot(trans_gender, aes(x = Transmission, y = Total, fill = Gender)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = comma(Total)), position = position_dodge(width = 0.9),
            vjust = -0.5, size = 3.5) +
  scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.1))) +
  labs(
    title = "Perbandingan Preferensi Transmisi Berdasarkan Gender",
    x     = "Jenis Transmisi",
    y     = "Jumlah Pembeli",
    fill  = "Gender"
  ) +
  theme_minimal()

Interpretasi: Mobil auto lebih banyak dipilih dibandingkan manual. Pola ini berlaku baik untuk pembeli laki-laki maupun perempuan, menandakan preferensi pasar yang kuat terhadap kemudahan berkendara.

7. Boxplot Body Style

ggplot(df, aes(x = `Body Style`, y = `Price ($)`, fill = `Body Style`)) +
  geom_boxplot(show.legend = FALSE, outlier.alpha = 0.3) +
  scale_y_continuous(labels = dollar) +
  labs(
    title = "Distribusi Harga Kendaraan per Body Style",
    x     = "Body Style",
    y     = "Harga ($)"
  ) +
  theme_minimal()

Interpretasi: Hardtop dan SUV cenderung memiliki rentang harga yang lebih lebar dibandingkan Sedan, menandakan variasi yang lebih beragam pada segmen tersebut. Outlier pada beberapa kategori menandakan adanya model premium dengan harga jauh di atas rata-rata.