Cài đặt và khai báo các gói cần thiết

install.packages("dplyr", repos = "https://cran.rstudio.com/")
## package 'dplyr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\trngo\AppData\Local\Temp\RtmpyoHx1H\downloaded_packages
library(dplyr)
install.packages("lubridate", repos = "https://cran.rstudio.com/")
## package 'lubridate' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\trngo\AppData\Local\Temp\RtmpyoHx1H\downloaded_packages
library(lubridate)
install.packages("ggplot2", repos = "https://cran.rstudio.com/")
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\trngo\AppData\Local\Temp\RtmpyoHx1H\downloaded_packages
library(ggplot2)
install.packages("scales", repos = "https://cran.rstudio.com/")
## package 'scales' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\trngo\AppData\Local\Temp\RtmpyoHx1H\downloaded_packages
library(scales)
install.packages("knitr", repos = "https://cran.rstudio.com/")
## package 'knitr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\trngo\AppData\Local\Temp\RtmpyoHx1H\downloaded_packages
library(knitr)

Đọc dữ liệu từ tệp CSV

dataUK <- read.csv("dataUK.csv")

1. Tổng quan

1.1. Thông tin cơ bản về bộ dữ liệu

Chúng ta sẽ kiểm tra các thông tin tổng quan như số lượng quan sát, số lượng biến, kiểm tra các giá trị bị thiếu, kiểm tra số quan sát trùng lặp.

# Số lượng quan sát
cat(paste("Số lượng quan sát:", nrow(dataUK), "\n"))
## Số lượng quan sát: 278512
# Số lượng biến
cat(paste("Số lượng biến:", ncol(dataUK), "\n"))
## Số lượng biến: 19
# Kiểm tra các giá trị bị thiếu (NA) trên mỗi cột
missing_values <- colSums(is.na(dataUK))
cat("\nSố giá trị thiếu trên mỗi biến:\n")
## 
## Số giá trị thiếu trên mỗi biến:
# Kiểm tra số lượng quan sát trùng lặp
duplicate_rows <- sum(duplicated(dataUK))
cat(paste("\nSố lượng quan sát bị trùng lặp:", duplicate_rows, "\n"))
## 
## Số lượng quan sát bị trùng lặp: 0

Thống kê mô tả:

str(dataUK)
## 'data.frame':    278512 obs. of  19 variables:
##  $ settlement_date          : chr  "01/01/2009 00:00" "01/01/2009 00:30" "01/01/2009 01:00" "01/01/2009 01:30" ...
##  $ settlement_period        : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ period_hour              : chr  "00:00:00" "00:30:00" "01:00:00" "01:30:00" ...
##  $ nd                       : int  37910 38047 37380 36426 35687 35408 34322 33076 31970 31270 ...
##  $ tsd                      : int  38704 38964 38651 37775 37298 37135 36844 35678 34635 33934 ...
##  $ england_wales_demand     : int  33939 34072 33615 32526 31877 31604 30486 29390 28452 27842 ...
##  $ embedded_wind_generation : int  54 53 53 50 50 43 43 56 56 56 ...
##  $ embedded_wind_capacity   : int  1403 1403 1403 1403 1403 1403 1403 1403 1403 1403 ...
##  $ embedded_solar_generation: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ embedded_solar_capacity  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ non_bm_stor              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ pump_storage_pumping     : int  33 157 511 589 851 967 1762 1842 1905 1904 ...
##  $ ifa_flow                 : int  2002 2002 2002 1772 1753 1754 1754 1755 1755 1754 ...
##  $ ifa2_flow                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ britned_flow             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ moyle_flow               : int  -161 -160 -160 -160 -160 -160 -160 -160 -160 -160 ...
##  $ east_west_flow           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ nemo_flow                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ is_holiday               : int  1 1 1 1 1 1 1 1 1 1 ...
summary(dataUK)
##  settlement_date    settlement_period period_hour              nd       
##  Length:278512      Min.   : 1.0      Length:278512      Min.   :13367  
##  Class :character   1st Qu.:12.0      Class :character   1st Qu.:24908  
##  Mode  :character   Median :24.0      Mode  :character   Median :30491  
##                     Mean   :24.5                         Mean   :31187  
##                     3rd Qu.:36.0                         3rd Qu.:36914  
##                     Max.   :48.0                         Max.   :59095  
##       tsd        england_wales_demand embedded_wind_generation
##  Min.   :16513   Min.   :    0        Min.   :   0            
##  1st Qu.:26608   1st Qu.:22677        1st Qu.: 552            
##  Median :31800   Median :27753        Median :1018            
##  Mean   :32686   Mean   :28390        Mean   :1272            
##  3rd Qu.:38112   3rd Qu.:33616        3rd Qu.:1729            
##  Max.   :60147   Max.   :53325        Max.   :5930            
##  embedded_wind_capacity embedded_solar_generation embedded_solar_capacity
##  Min.   :1403           Min.   :    0.0           Min.   :    0          
##  1st Qu.:2109           1st Qu.:    0.0           1st Qu.: 2046          
##  Median :4831           Median :    0.0           Median :11503          
##  Mean   :4454           Mean   :  880.2           Mean   : 8705          
##  3rd Qu.:6527           3rd Qu.:  889.0           3rd Qu.:13080          
##  Max.   :6622           Max.   :11224.0           Max.   :17197          
##   non_bm_stor      pump_storage_pumping    ifa_flow         ifa2_flow    
##  Min.   :-24.000   Min.   :   0.0       Min.   :-2056.0   Min.   :-1030  
##  1st Qu.:  0.000   1st Qu.:   8.0       1st Qu.:  271.0   1st Qu.:    0  
##  Median :  0.000   Median :  11.0       Median : 1183.0   Median :    0  
##  Mean   :  6.668   Mean   : 304.5       Mean   :  926.2   Mean   :   54  
##  3rd Qu.:  0.000   3rd Qu.: 366.0       3rd Qu.: 1892.0   3rd Qu.:    0  
##  Max.   :893.000   Max.   :2019.0       Max.   : 2066.0   Max.   : 1016  
##   britned_flow       moyle_flow     east_west_flow      nemo_flow      
##  Min.   :-1215.0   Min.   :-505.0   Min.   :-585.00   Min.   :-1023.0  
##  1st Qu.:    0.0   1st Qu.:-303.0   1st Qu.:-209.00   1st Qu.:    0.0  
##  Median :  726.0   Median :-148.0   Median :   0.00   Median :    0.0  
##  Mean   :  504.1   Mean   :-125.1   Mean   : -51.11   Mean   :  176.3  
##  3rd Qu.:  994.0   3rd Qu.:  25.0   3rd Qu.:   0.00   3rd Qu.:  338.0  
##  Max.   : 1143.0   Max.   : 499.0   Max.   : 504.00   Max.   : 1033.0  
##    is_holiday    
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :0.0000  
##  Mean   :0.0224  
##  3rd Qu.:0.0000  
##  Max.   :1.0000

1.2. Ý nghĩa các biến số

  • settlement_date: ngày ghi nhận dữ liệu theo định dạng dd/mm/yy.

  • settlement_period: chu kỳ nửa giờ cho sản lượng lịch sử đã xảy ra.

  • nd (National Demand): tổng sản lượng điện được đo đếm, nhưng không bao gồm sản lượng điện cần thiết để đáp ứng tải tại các trạm, bơm tích trữ và xuất khẩu liên kết. Nhu cầu Quốc gia được tính bằng tổng sản lượng điện dựa trên công tơ đo đếm phát điện vận hành của National Grid ESO. Đơn vị đo là MW.

  • tsd (Transmission System Demand): bằng nd cộng với sản lượng điện bổ sung cần thiết để đáp ứng tải tại các trạm, bơm tích trữ và xuất khẩu liên kết. Đơn vị đo là MW.

  • england_wales_demand: nhu cầu của Anh và xứ Wales, như ND ở trên nhưng dựa trên cơ sở Anh và xứ Wales. Đơn vị đo là MW.

  • embedded_wind_generation: ước tính sản lượng điện gió của Vương quốc Anh từ các trang trại gió không lắp đặt công tơ đo đếm Hệ thống Truyền tải. Các trang trại gió này được nhúng trong mạng lưới phân phối và không được ESO của National Grid ESO theo dõi. Tác dụng của chúng là giảm nhu cầu điện trong thời kỳ gió mạnh. Công suất thực tế của các máy phát điện này chưa được biết rõ, do đó, ước tính được đưa ra dựa trên mô hình tốt nhất của National Grid ESO. Được đo bằng MW.

  • embedded_wind_capacity: đây là góc nhìn tốt nhất của National Grid ESO về công suất điện gió nhúng đã lắp đặt tính bằng GB. Thông tin này dựa trên thông tin công khai được tổng hợp từ nhiều nguồn khác nhau và không phải là góc nhìn chính thức. Nó phù hợp với ước tính sản lượng điện được cung cấp ở trên. Được đo bằng MW.

  • england_wales_demand: nhu cầu của Anh và xứ Wales, như ND ở trên nhưng dựa trên cơ sở Anh và xứ Wales. Đơn vị đo là MW.

  • embedded_solar_generation: ước tính sản lượng điện mặt trời của GB từ các tấm pin quang điện. Các tấm pin này được lắp đặt trong lưới điện phân phối và không được National Grid ESO phát hiện. Tác dụng của chúng là giảm nhu cầu điện trong thời kỳ bức xạ mạnh. Công suất thực tế của các máy phát điện này chưa được biết rõ, do đó, ước tính được đưa ra dựa trên mô hình tốt nhất của National Grid ESO. Được đo bằng MW.

  • embedded_solar_capacity: giống như công suất điện gió nhúng ở trên, nhưng dành cho sản lượng điện mặt trời. Được đo bằng MW.

  • non_bm_stor (Non-Balancing Mechanism SHort-Term Operating Reserve): dành cho các đơn vị không được bao gồm trong định nghĩa máy phát điện ND. Điều này có thể ở dạng giảm phát điện hoặc giảm nhu cầu. Được đo bằng MW.

  • pump_storage_pumping: nhu cầu do bơm tại các đơn vị lưu trữ bơm thủy điện; -ve biểu thị tải bơm.

  • ifa_flow (IFA Interconnector Flow): dòng chảy trên liên kết tương ứng. -ve biểu thị công suất xuất ra từ GB; +ve biểu thị công suất nhập vào GB. Được đo bằng MW.

  • britned_flow : lưu lượng trên liên kết tương ứng. -ve biểu thị công suất xuất ra từ Vương quốc Anh; +ve biểu thị công suất nhập vào Vương quốc Anh. Được đo bằng MW.

  • moyle_flow (Moyle Interconnector FLow): dòng chảy trên liên kết tương ứng. -ve biểu thị công suất xuất ra từ GB; +ve biểu thị công suất nhập vào GB. Được đo bằng MW.

  • east_flow (East West Innterconnector FLow): lưu lượng trên liên kết tương ứng. -ve biểu thị công suất xuất ra từ Vương quốc Anh; +ve biểu thị công suất nhập vào Vương quốc Anh. Được đo bằng MW.

  • nemo_flow (Nemo Interconnector FLow): lưu lượng trên liên kết tương ứng. -ve biểu thị công suất xuất ra từ Vương quốc Anh; +ve biểu thị công suất nhập vào Vương quốc Anh. Được đo bằng MW.

  • is_holiday: biến nhị phân (1 = Ngày lễ, 0 = Ngày thường).

2. Tiền xử lý và phân tổ biến

Ở đây, nhóm chúng em đã phân tổ dữ liệu theo các tiêu chí sau:

  1. Phân tổ theo mùa: Spring (Mùa Xuân), Summer (Mùa Hạ), Autumn (Mùa Thu), Winter (Mùa Đông).

  2. Phân tổ theo tháng: January (Tháng 1), February (Tháng 2), March (Tháng 3), April (Tháng 4), May (Tháng 5), June (Tháng 6), July (Tháng 7), August (Tháng 8), September (Tháng 9), October (Tháng 10), November (Tháng 11), December (Tháng 12).

  3. Phân tổ theo buổi trong ngày: Morning (Sáng), Afternoon (Chiều), Evening (Tối).

  4. Phân tổ theo nhu cầu: Nhu cầu thấp, Nhu cầu trung bình, Nhu cầu cao.

data_processed <- dataUK %>%
  mutate(
    settlement_date = dmy_hm(settlement_date),
    year = year(settlement_date),
    month = month(settlement_date, label = TRUE, abbr = FALSE),
    weekday = wday(settlement_date, label = TRUE, abbr = FALSE),
    hour = as.numeric(substr(period_hour, 1, 2)),
    season = case_when(
      month %in% c("December", "January", "February") ~ "Winter",
      month %in% c("March", "April", "May") ~ "Spring",
      month %in% c("June", "July", "August") ~ "Summer",
      month %in% c("September", "October", "November") ~ "Autumn"
    ),
    time_of_day = case_when(
      hour >= 5 & hour < 12 ~ "Morning",
      hour >= 12 & hour < 17 ~ "Afternoon",
      hour >= 17 & hour < 22 ~ "Evening",
      TRUE ~ "Night"
    ),
    demand_group = case_when(
      england_wales_demand <= 20000 ~ "Nhu cầu thấp",
      england_wales_demand > 20000 & england_wales_demand <= 40000 ~ "Nhu cầu trung bình",
      england_wales_demand > 40000 ~ "Nhu cầu cao"
    )
  )
data_processed$season <- factor(data_processed$season,
                                levels = c("Spring", "Summer", "Autumn", "Winter"))
data_processed$time_of_day <- factor(data_processed$time_of_day,
                                     levels = c("Morning", "Afternoon", "Evening", "Night"))
data_10 <- head(data_processed, 10)
kable(
  data_10,
  caption = "Bảng 1",
  align = "c"
)
Bảng 1
settlement_date settlement_period period_hour nd tsd england_wales_demand embedded_wind_generation embedded_wind_capacity embedded_solar_generation embedded_solar_capacity non_bm_stor pump_storage_pumping ifa_flow ifa2_flow britned_flow moyle_flow east_west_flow nemo_flow is_holiday year month weekday hour season time_of_day demand_group
2009-01-01 00:00:00 1 00:00:00 37910 38704 33939 54 1403 0 0 0 33 2002 0 0 -161 0 0 1 2009 January Thursday 0 Winter Night Nhu cầu trung bình
2009-01-01 00:30:00 2 00:30:00 38047 38964 34072 53 1403 0 0 0 157 2002 0 0 -160 0 0 1 2009 January Thursday 0 Winter Night Nhu cầu trung bình
2009-01-01 01:00:00 3 01:00:00 37380 38651 33615 53 1403 0 0 0 511 2002 0 0 -160 0 0 1 2009 January Thursday 1 Winter Night Nhu cầu trung bình
2009-01-01 01:30:00 4 01:30:00 36426 37775 32526 50 1403 0 0 0 589 1772 0 0 -160 0 0 1 2009 January Thursday 1 Winter Night Nhu cầu trung bình
2009-01-01 02:00:00 5 02:00:00 35687 37298 31877 50 1403 0 0 0 851 1753 0 0 -160 0 0 1 2009 January Thursday 2 Winter Night Nhu cầu trung bình
2009-01-01 02:30:00 6 02:30:00 35408 37135 31604 43 1403 0 0 0 967 1754 0 0 -160 0 0 1 2009 January Thursday 2 Winter Night Nhu cầu trung bình
2009-01-01 03:00:00 7 03:00:00 34322 36844 30486 43 1403 0 0 0 1762 1754 0 0 -160 0 0 1 2009 January Thursday 3 Winter Night Nhu cầu trung bình
2009-01-01 03:30:00 8 03:30:00 33076 35678 29390 56 1403 0 0 0 1842 1755 0 0 -160 0 0 1 2009 January Thursday 3 Winter Night Nhu cầu trung bình
2009-01-01 04:00:00 9 04:00:00 31970 34635 28452 56 1403 0 0 0 1905 1755 0 0 -160 0 0 1 2009 January Thursday 4 Winter Night Nhu cầu trung bình
2009-01-01 04:30:00 10 04:30:00 31270 33934 27842 56 1403 0 0 0 1904 1754 0 0 -160 0 0 1 2009 January Thursday 4 Winter Night Nhu cầu trung bình

3. Phân tích chuyên sâu

Trong phần này, nhóm chúng em sẽ tập trung phân tích 3 biến chính: Nhu cầu quốc gia (nd), Sản lượng điện gió (embedded_wind_genaraion)Dòng điện liên kết với Pháp (ifa_flow).

3.1. Phân tích Nhu cầu quốc gia (nd)

3.1.1. Xu hướng nhu cầu điện qua các năm

data_processed %>%
  group_by(year, month) %>%
  summarise(avg_nd = mean(nd, na.rm = TRUE)) %>%
  mutate(date = make_date(year, month)) %>%
  ggplot(aes(x = date, y = avg_nd)) +
  geom_line(color = "blue", size = 0.8) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Xu hướng Nhu cầu Điện trung bình hàng tháng tại Anh (2009 - 2024)",
    subtitle = "Đường nét đứt thể hiện xu hướng chung",
    x = "Năm",
    y = "Nhu cầu điện trung bình (MW)"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  )

=> Nhận xét:

  • Xu hướng dài hạn: Nhu cầu điện quốc gia có xu hướng giảm nhẹ qua các năm, có thể do các biện pháp tiết kiệm năng lượng và hiệu quả sử dụng điện ngày càng tăng.
  • Tính chu kỳ: Biểu đồ thể hiện rất rõ tính chu kỳ theo mùa. Nhu cầu điện luôn đạt đỉnh vào các tháng mùa đông (tháng 12, 1, 2) và giảm xuống mức thấp nhất vào mùa hè (tháng 6, 7, 8).

3.1.2. Phân bố nhu cầu điện theo mùa và buổi trong ngày

data_processed %>%
  ggplot(aes(x = hour, y = nd, color = season)) +
  stat_summary(fun = "mean", geom = "line", size = 1.2) +
  facet_wrap(~season) +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Chu kỳ Nhu cầu điện trung bình trong ngày theo từng Mùa",
    x = "Giờ trong ngày",
    y = "Nhu cầu điện trung bình (MW)",
    color = "Mùa"
  ) +
  theme_bw() +
  theme(legend.position = "none") +
  theme(
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  )

=> Nhận xét:

  • Nhu cầu điện trong ngày thường có 2 đỉnh: một đỉnh nhỏ vào buổi sáng (khoảng 8-9h) và một đỉnh lớn hơn vào buổi tối (khoảng 17-19h).
  • Mùa đông có nhu cầu cao nhất ở mọi thời điểm trong ngày, đặc biệt là vào buổi tối.
  • Mùa hè có nhu cầu thấp nhất và đường cong nhu cầu cũng “phẳng” hơn so với các mùa khác.

3.2. Phân tích Sản lượng Điện gió (embedded_wind_generation)

data_processed %>%
  group_by(year) %>%
  summarise(avg_wind_gen = mean(embedded_wind_generation, na.rm = TRUE)) %>%
  ggplot(aes(x= year, y = avg_wind_gen)) +
  geom_col(fill = "green") +
  geom_text(aes(label = round(avg_wind_gen)), vjust = -0.5, size = 3) +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Sự tăng trưởng của sản lượng điện gió trung bình tại Anh (2009 - 2024)",
    x = "Năm",
    y = "Sản lượng điện gió trung bình (MW)"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  )

=> Nhận xét: Biểu đồ cho thấy một sự tăng trưởng vượt bậc trong sản lượng điện từ gió. Sản lượng trung bình đã tăng từ mức rất thấp vào năm 2009 lên mức đáng kể vào những năm gần đây, phản ánh sự đầu tư mạnh mẽ của Anh vào năng lượng tái tạo.

3.3. Phân tích Dòng điện liên kết với Pháp (ifa_flow)

Đường dây IFA là một trong những kết nối quan trọng nhất, cho phép Anh trao đổi điện với Pháp.

data_processed %>%
  filter(year >= 2012) %>%
  ggplot(aes(x = settlement_date, y = ifa_flow)) +
  geom_line(alpha = 0.1, color = "grey") +
  geom_smooth(color = "purple", se = FALSE) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Dòng điện trao đổi với Pháp qua đường dây IFA (2009 - 2024)",
    x = "Ngày",
    y = "Dòng điện (MW)"
  ) + 
  theme(
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  )

=> Nhận xét:

  • Đường xu hướng màu tím chủ yếu nằm trên vạch số 0 (màu đỏ), cho thấy trong phần lớn thời gian, Vương quốc Anh là nước nhập khẩu điện ròng từ Pháp qua đường dây IFA.
  • Sự biến động của dòng điện rất lớn, phản ánh sự thay đổi liên tục của giá cả và nhu cầu điện giữa hai thị trường.
  • Có những giai đoạn đáng chú ý khi dòng điện giảm mạnh hoặc đảo chiều, có thể do các sự kiện về giá năng lượng hoặc bảo trì đường dây.

4. Kết luận

Qua phân tích sơ bộ, chúng ta có thể rút ra một số kết luận chính:

  1. Nhu cầu điện tại Anh có xu hướng giảm nhẹ trong dài hạn nhưng vẫn tuân theo quy luật chu kỳ chặt chẽ theo mùa và theo giờ trong ngày, với đỉnh điểm vào mùa đông.
  2. Năng lượng gió đã có sự phát triển ngoạn mục, trở thành một phần ngày càng quan trọng trong cơ cấu nguồn điện của quốc gia, góp phần vào mục tiêu chuyển đổi năng lượng.
  3. Anh phụ thuộc vào việc nhập khẩu điện từ các nước láng giềng, đặc biệt là Pháp, để đảm bảo cân bằng cung cầu, cho thấy tầm quan trọng của hệ thống lưới điện liên kết châu Âu.