Introduction

This report analyzes Global Electric Vehicle (EV) Sales data from 2010 to 2024. The dataset contains information related to EV sales, EV stock, market share, charging infrastructure, and powertrain types across different regions and years.

Import Dataset

# Import dataset
dat <- read_csv("IEA Global EV Data 2024.csv")
## Rows: 12654 Columns: 8
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (6): region, category, parameter, mode, powertrain, unit
## dbl (2): year, value
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Convert dataset into tibble
dat <- tibble(dat)

# Display first few rows
head(dat)
## # A tibble: 6 × 8
##   region    category   parameter      mode  powertrain  year unit          value
##   <chr>     <chr>      <chr>          <chr> <chr>      <dbl> <chr>         <dbl>
## 1 Australia Historical EV stock share Cars  EV          2011 percent    0.000390
## 2 Australia Historical EV sales share Cars  EV          2011 percent    0.00650 
## 3 Australia Historical EV sales       Cars  BEV         2011 Vehicles  49       
## 4 Australia Historical EV stock       Cars  BEV         2011 Vehicles  49       
## 5 Australia Historical EV stock       Cars  BEV         2012 Vehicles 220       
## 6 Australia Historical EV sales       Cars  BEV         2012 Vehicles 170

Visualization 1 - Global EV Sales Over Time

fig1 <- dat %>%
  filter(parameter == "EV sales") %>%
  group_by(year) %>%
  summarise(total_sales = sum(value, na.rm = TRUE))

ggplot(fig1, aes(x = year, y = total_sales)) +
  geom_line(color = "blue", size = 1.2) +
  geom_point(color = "red", size = 2) +
  labs(
    title = "Global EV Sales Over Time",
    x = "Year",
    y = "Total EV Sales"
  ) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Visualization 2 - Top 10 Regions by EV Sales

fig2 <- dat %>%
  filter(parameter == "EV sales") %>%
  group_by(region) %>%
  summarise(total_sales = sum(value, na.rm = TRUE)) %>%
  slice_max(total_sales, n = 10)

ggplot(fig2, aes(x = reorder(region, total_sales), y = total_sales, fill = region)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(
    title = "Top 10 Regions by EV Sales",
    x = "Region",
    y = "Total EV Sales"
  ) +
  theme_minimal()

Visualization 3 - Distribution of EV Stock Share

fig3 <- dat %>%
  filter(parameter == "EV stock share")

ggplot(fig3, aes(x = region, y = value, fill = region)) +
  geom_boxplot() +
  labs(
    title = "Distribution of EV Stock Share",
    x = "Region",
    y = "EV Stock Share"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90))

Visualization 4 - Growth of EV Charging Points

fig4 <- dat %>%
  filter(parameter == "EV charging points") %>%
  group_by(year) %>%
  summarise(charging_points = sum(value, na.rm = TRUE))

ggplot(fig4, aes(x = year, y = charging_points)) +
  geom_area(fill = "lightblue") +
  labs(
    title = "Growth of EV Charging Points",
    x = "Year",
    y = "Charging Points"
  ) +
  theme_minimal()

Visualization 5 - Heatmap of EV Sales by Region and Year

fig5 <- dat %>%
  filter(parameter == "EV sales") %>%
  group_by(region, year) %>%
  summarise(total_sales = sum(value, na.rm = TRUE))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by region and year.
## ℹ Output is grouped by region.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(region, year))` for per-operation grouping
##   (`?dplyr::dplyr_by`) instead.
ggplot(fig5, aes(x = year, y = region, fill = total_sales)) +
  geom_tile() +
  labs(
    title = "Heatmap of EV Sales by Region and Year",
    x = "Year",
    y = "Region",
    fill = "Sales"
  ) +
  theme_minimal()

Visualization 6 - EV Sales vs EV Stock

fig6_sales <- dat %>%
  filter(parameter == "EV sales") %>%
  select(region, year, sales = value)

fig6_stock <- dat %>%
  filter(parameter == "EV stock") %>%
  select(region, year, stock = value)

fig6 <- inner_join(fig6_sales, fig6_stock, by = c("region", "year"))
## Warning in inner_join(fig6_sales, fig6_stock, by = c("region", "year")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 2 of `x` matches multiple rows in `y`.
## ℹ Row 2 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
ggplot(fig6, aes(x = sales, y = stock, color = region)) +
  geom_point(alpha = 0.7) +
  labs(
    title = "EV Sales vs EV Stock",
    x = "EV Sales",
    y = "EV Stock"
  ) +
  theme_minimal()

Visualization 7 - Interactive Global EV Sales Trend

fig7 <- dat %>%
  filter(parameter == "EV sales") %>%
  group_by(year) %>%
  summarise(total_sales = sum(value, na.rm = TRUE))

plot_ly(
  fig7,
  x = ~year,
  y = ~total_sales,
  type = 'scatter',
  mode = 'lines+markers'
) %>%
  layout(
    title = "Interactive Global EV Sales Trend",
    xaxis = list(title = "Year"),
    yaxis = list(title = "Total EV Sales")
  )

Visualization 8 - EV Sales by Powertrain Type

fig8 <- dat %>%
  filter(parameter == "EV sales") %>%
  group_by(powertrain) %>%
  summarise(total_sales = sum(value, na.rm = TRUE))

ggplot(fig8, aes(x = powertrain, y = total_sales, fill = powertrain)) +
  geom_bar(stat = "identity") +
  labs(
    title = "EV Sales by Powertrain Type",
    x = "Powertrain Type",
    y = "Total EV Sales"
  ) +
  theme_minimal()

Conclusion

This report analyzed global electric vehicle adoption trends from 2010 to 2024 using multiple visualization techniques including line charts, bar charts, boxplots, heatmaps, scatter plots, area charts, and interactive visualizations. The findings indicate significant growth in EV sales, charging infrastructure, and market penetration across different regions worldwide.