Introduction

Electric Vehicles (EVs) are becoming increasingly important in reducing carbon emissions and promoting sustainable transportation. This report analyzes EV adoption trends across different countries using publicly available datasets from the International Energy Agency (IEA).

The project focuses on: - EV stock growth over time - Country-wise EV adoption - Market share comparison - Relationship between charging infrastructure and EV growth - Trends in battery electric vehicles (BEVs) and plug-in hybrid electric vehicles (PHEVs)

Data Source

Dataset Source: https://www.iea.org/data-and-statistics/data-tools/global-ev-data-explorer

Visualization Reference: https://www.iea.org/energy-system/transport/electric-vehicles

# Import dataset

ev_data <- read_excel("EVDataExplorer2025.xlsx")
names(ev_data)
## [1] "region_country"  "category"        "parameter"       "mode"           
## [5] "powertrain"      "year"            "unit"            "value"          
## [9] "Aggregate group"
# Convert to tibble

ev_data <- tibble(ev_data)

# Display first rows

head(ev_data)
## # A tibble: 6 × 9
##   region_country category         parameter mode   powertrain  year unit   value
##   <chr>          <chr>            <chr>     <chr>  <chr>      <dbl> <chr>  <dbl>
## 1 World          Projection-STEPS EV stock  2 and… BEV         2030 Vehi… 1.7 e8
## 2 World          Projection-STEPS EV stock  Cars   BEV         2030 Vehi… 1.5 e8
## 3 China          Projection-STEPS EV stock  2 and… BEV         2030 Vehi… 9.1 e7
## 4 China          Projection-STEPS EV stock  Cars   BEV         2030 Vehi… 8.2 e7
## 5 World          Projection-STEPS EV stock  Cars   PHEV        2030 Vehi… 8.2 e7
## 6 World          Historical       EV stock  2 and… BEV         2024 Vehi… 7.90e7
## # ℹ 1 more variable: `Aggregate group` <chr>

Data Cleaning

# Filter important columns

ev_clean <- ev_data %>%
  select(region_country,
         category,
         parameter,
         mode,
         powertrain,
         year,
         unit,
         value)

# Remove missing values

ev_clean <- na.omit(ev_clean)

# Display cleaned data

head(ev_clean)
## # A tibble: 6 × 8
##   region_country category         parameter mode   powertrain  year unit   value
##   <chr>          <chr>            <chr>     <chr>  <chr>      <dbl> <chr>  <dbl>
## 1 World          Projection-STEPS EV stock  2 and… BEV         2030 Vehi… 1.7 e8
## 2 World          Projection-STEPS EV stock  Cars   BEV         2030 Vehi… 1.5 e8
## 3 China          Projection-STEPS EV stock  2 and… BEV         2030 Vehi… 9.1 e7
## 4 China          Projection-STEPS EV stock  Cars   BEV         2030 Vehi… 8.2 e7
## 5 World          Projection-STEPS EV stock  Cars   PHEV        2030 Vehi… 8.2 e7
## 6 World          Historical       EV stock  2 and… BEV         2024 Vehi… 7.90e7

Visualization 1: Global EV Stock Growth Over Time

This visualization shows how global EV stock has increased over the years.

fig1 <- ev_clean %>%
  filter(parameter == "EV stock") %>%
  group_by(year) %>%
  summarise(total_ev = sum(value, na.rm = TRUE))

ggplot(fig1, aes(x = year, y = total_ev)) +
  geom_line(color = "blue", linewidth = 1.2) +
  geom_point(color = "red") +
  labs(
    title = "Global EV Stock Growth Over Time",
    x = "Year",
    y = "Total EV Stock"
  ) +
  theme_minimal()

Visualization 2: Top Countries by EV Sales

This bar chart compares EV sales across countries.

fig2 <- ev_clean %>%
  filter(parameter == "EV sales") %>%
  group_by(region_country) %>%
  summarise(total_sales = sum(value, na.rm = TRUE)) %>%
  arrange(desc(total_sales)) %>%
  slice(1:10)

ggplot(fig2, aes(x = reorder(region_country, total_sales),
                 y = total_sales)) +
  geom_bar(stat = "identity", fill = "darkgreen") +
  coord_flip() +
  labs(
    title = "Top 10 Countries by EV Sales",
    x = "Country",
    y = "EV Sales"
  ) +
  theme_minimal()

Visualization 3: EV Market Share by Country

This visualization compares EV market share across countries.

fig3 <- ev_clean %>%
  filter(parameter == "EV sales share") %>%
  group_by(region_country) %>%
  summarise(avg_share = mean(value, na.rm = TRUE)) %>%
  arrange(desc(avg_share)) %>%
  slice(1:10)

ggplot(fig3,
       aes(x = reorder(region_country, avg_share),
           y = avg_share)) +
  geom_col(fill = "purple") +
  coord_flip() +
  labs(
    title = "Average EV Market Share by Country",
    x = "Country",
    y = "Average Market Share"
  ) +
  theme_minimal()

Visualization 4: BEV vs PHEV Comparison

This graph compares Battery Electric Vehicles and Plug-in Hybrid Electric Vehicles.

fig4 <- ev_clean %>%
  filter(powertrain %in% c("BEV", "PHEV"),
         parameter == "EV sales") %>%
  group_by(powertrain, year) %>%
  summarise(total = sum(value, na.rm = TRUE))
## `summarise()` has grouped output by 'powertrain'. You can override using the
## `.groups` argument.
ggplot(fig4,
       aes(x = year,
           y = total,
           color = powertrain)) +
  geom_line(linewidth = 1.2) +
  labs(
    title = "BEV vs PHEV Sales Trends",
    x = "Year",
    y = "Sales",
    color = "Vehicle Type"
  ) +
  theme_minimal()

Visualization 5: EV Sales Distribution

This histogram displays the distribution of EV sales values.

fig5 <- ev_clean %>%
  filter(parameter == "EV sales")

ggplot(fig5, aes(x = value)) +
  geom_histogram(bins = 30,
                 fill = "orange",
                 color = "black") +
  labs(
    title = "Distribution of EV Sales",
    x = "EV Sales",
    y = "Frequency"
  ) +
  theme_minimal()

Visualization 6: Scatterplot of EV Sales vs EV Stock

This visualization shows the relationship between EV sales and EV stock.

sales_data <- ev_clean %>%
  filter(parameter == "EV sales") %>%
  select(region_country, year, sales = value)

stock_data <- ev_clean %>%
  filter(parameter == "EV stock") %>%
  select(region_country, year, stock = value)

scatter_data <- inner_join(sales_data,
                           stock_data,
                           by = c("region_country", "year"))
## Warning in inner_join(sales_data, stock_data, by = c("region_country", "year")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 1 of `x` matches multiple rows in `y`.
## ℹ Row 1 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(scatter_data,
       aes(x = sales,
           y = stock)) +
  geom_point(color = "darkred", alpha = 0.6) +
  labs(
    title = "EV Sales vs EV Stock",
    x = "EV Sales",
    y = "EV Stock"
  ) +
  theme_minimal()

Visualization 7: Interactive EV Trend Visualization

This interactive chart displays EV stock trends.

interactive_data <- fig1

plot_ly(interactive_data,
        x = ~year,
        y = ~total_ev,
        type = 'scatter',
        mode = 'lines+markers')

Visualization 8: EV Adoption by Powertrain Type

This chart compares adoption of different powertrain technologies.

fig8 <- ev_clean %>%
  filter(parameter == "EV stock") %>%
  group_by(powertrain) %>%
  summarise(total_stock = sum(value, na.rm = TRUE))

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

Conclusion

The analysis demonstrates rapid growth in Electric Vehicle adoption globally. Countries such as China, the United States, and several European nations dominate EV sales and stock. Battery Electric Vehicles (BEVs) show stronger growth compared to Plug-in Hybrid Electric Vehicles (PHEVs).

The visualizations also highlight increasing market share and expanding adoption trends over time, indicating a global transition toward sustainable transportation systems.