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
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
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.
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()
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()
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()
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()
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")
)
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()
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.