1. 서론

지구 온난화와 생태계 파괴 등 급격한 기후환경 변화는 이제 추상적인 위협을 넘어 미세먼지 공습, 대기오염 등 시민들이 일상에서 체감하는 실체적 문제로 다가오고 있다. 이에 대응하여 최근 환경부가 기후에너지환경부로 개편되며 국가적 차원의 조직 정비가 이루어졌으며, 서울시 역시 ‘매력가든·동행가든 조성’, ‘기후동행카드 도입’ 등 기후환경 위기에 대처하기 위한 다각적인 정책적 대안을 현장에서 실천하고 있다. 이한 정책적 흐름 속에서 본 보고서는 도심 속 ’숲의 존재’가 실질적으로 미세먼지 저감에 기여하는지를 객관적인 데이터를 통해 검증하고자 한다. 특히 분석 대상을 서울시내 주요 거점으로 한정하여, 수목이 우거진 도시숲과 인간 활동이 밀집된 도심 중심지 간의 미세먼지 저감 효과를 구체적으로 비교·분석한다. 이를 위해 국립산림과학원에서 제공하는 ’청량 아시아 산림 미세먼지 측정넷(AICAN)’의 고해상도 실시간 관측 데이터를 활용하여 분석의 신뢰성을 확보하고자 한다.

setwd("C:/R_Study/청정넷_측정데이터_2026년1분기_서울")

df_gwanak <- read.csv("관악.csv", fileEncoding = "EUC-KR", stringsAsFactors = TRUE)
df_namsan1 <- read.csv("남산1.csv", fileEncoding = "EUC-KR", stringsAsFactors = TRUE)
df_namsan2 <- read.csv("남산2.csv", fileEncoding = "EUC-KR", stringsAsFactors = TRUE)
df_seolleung <- read.csv("선릉.csv", fileEncoding = "EUC-KR", stringsAsFactors = TRUE)
df_jongro <- read.csv("종로.csv", fileEncoding = "EUC-KR", stringsAsFactors = TRUE)
df_changgyeong <- read.csv("창경궁.csv", fileEncoding = "EUC-KR", stringsAsFactors = TRUE)

green_data <- rbind(df_gwanak, df_namsan1, df_namsan2, df_seolleung, df_jongro, df_changgyeong)
head(green_data)
##    관측지점         관측시간 기상자료...관측온도 기상자료...관측습도
## 1 관악_도심 2026-01-01 00:00                -8.1                44.6
## 2 관악_도심 2026-01-01 00:10                -8.1                44.4
## 3 관악_도심 2026-01-01 00:20                -8.0                44.5
## 4 관악_도심 2026-01-01 00:30                -8.0                44.5
## 5 관악_도심 2026-01-01 00:40                -7.8                44.0
## 6 관악_도심 2026-01-01 00:50                -7.9                44.2
##   기상자료...관측기압 기상자료...관측풍속 기상자료...관측풍향
## 1              1023.4                 1.6               321.6
## 2              1023.2                 1.8               337.6
## 3              1023.2                 1.3               334.2
## 4              1023.0                 1.3               328.9
## 5              1022.8                 1.3               338.1
## 6              1022.6                 0.8               347.1
##   기상자료...관측최대풍속 기상자료...관측미세먼지 기상자료...관측초미세먼지
## 1                     4.4                    21.4                      14.1
## 2                     4.1                    19.9                      14.1
## 3                     3.6                    23.7                      14.2
## 4                     3.6                    20.8                      13.7
## 5                     4.8                    19.9                      13.7
## 6                     3.6                    20.0                      13.4
##   기상자료...관측극초미세먼지 기상자료...배관관측온도 AVOC...관측온도
## 1                        12.5                       0            -8.1
## 2                        12.6                       0            -8.0
## 3                        12.6                       0            -8.0
## 4                        12.3                       0            -7.8
## 5                        12.1                       0            -8.0
## 6                        12.1                       0            -8.0
##   AVOC...관측습도 AVOC...관측기압 AVOC...관측풍속 AVOC...관측풍향
## 1            44.4          1023.2             1.6           315.2
## 2            44.5          1023.2             1.1           341.1
## 3            44.6          1023.1             0.9           329.9
## 4            44.6          1023.0             1.4           349.2
## 5            44.0          1022.7             1.4           352.9
## 6            44.7          1022.5             1.2           331.5
##   AVOC...관측최대풍속 AVOC...관측미세먼지 AVOC...관측초미세먼지
## 1                 4.4                18.6                  11.1
## 2                 3.5                20.0                  11.3
## 3                 3.6                19.1                  11.0
## 4                 4.8                19.5                  11.0
## 5                 4.8                17.7                  11.0
## 6                 3.6                18.0                  11.0
##   AVOC...관측극초미세먼지 AVOC...배관관측온도 BVOC...관측온도 BVOC...관측습도
## 1                     9.8                99.2            -8.1            44.5
## 2                     9.8                99.0            -8.0            44.4
## 3                     9.7                99.1            -8.0            44.5
## 4                     9.7                99.1            -7.9            44.5
## 5                     9.5                99.3            -7.9            44.0
## 6                     9.5                99.3            -7.9            44.4
##   BVOC...관측기압 BVOC...관측풍속 BVOC...관측풍향 BVOC...관측최대풍속
## 1          1023.3             1.6           318.4                 4.4
## 2          1023.2             1.4           339.4                 4.1
## 3          1023.2             1.1           332.1                 3.6
## 4          1023.0             1.3           339.1                 4.8
## 5          1022.7             1.3           345.5                 4.8
## 6          1022.6             1.0           339.3                 3.6
##   BVOC...관측미세먼지 BVOC...관측초미세먼지 BVOC...관측극초미세먼지
## 1                 2.9                   3.0                     2.7
## 2                 0.0                   2.7                     2.8
## 3                 4.6                   3.2                     2.9
## 4                 1.3                   2.7                     2.7
## 5                 2.2                   2.7                     2.6
## 6                 2.1                   2.4                     2.6

2. 데이터 탐색

(변수소개) 데이터 변수는 미세먼지 저감에 영향을 주는 기상요인인 온도, 습도, 기압, 풍향, 풍속 등 5건의 변수와 함께 입자 크기에 따라 미세먼지, 초미세먼지, 극초미세먼지 3단계의 변수가 있다. 이를 한 세트로 기상자료, AVOC, VBOC 세 묶음으로 구성되었는데, 일반 대조군과 함께 인위적 오염원 영향권인 AVOC(Anthropogenic Volatile Organic Compounds, 인위적 휘발성 유기화합물) 과, 자연/도시숲 영향권을 의미하는 BVOC(Biogenic Volatile Organic Compounds, 생물성/자연적 휘발성 유기화합물)의 경우를 함께 비교할 수 있게 구성하였다.

new_names <- c("site", "time", "base_temp", "base_humid", "base_press", "base_wind_sp", "base_wind_dir",
               "base_wind_max", "base_pm10",
               "base_pm25", "base_pm10_sub", "base_pipe_temp","avoc_temp", "avoc_humid", "avoc_press",
               "avoc_wind_sp", "avoc_wind_dir",
               "avoc_wind_max", "avoc_pm10", "avoc_pm25", "avoc_pm10_sub", "avoc_pipe_temp","bvoc_temp",
               "bvoc_humid", "bvoc_press",
               "bvoc_wind_sp", "bvoc_wind_dir", "bvoc_wind_max", "bvoc_pm10", "bvoc_pm25", "bvoc_pm10_sub")

colnames(green_data) <- new_names
str(green_data)
## 'data.frame':    212073 obs. of  31 variables:
##  $ site          : Factor w/ 17 levels "관악_도심","관악_숲",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ time          : Factor w/ 12960 levels "2026-01-01 00:00",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ base_temp     : num  -8.1 -8.1 -8 -8 -7.8 -7.9 -8.1 -8.1 -8.2 -7.9 ...
##  $ base_humid    : num  44.6 44.4 44.5 44.5 44 44.2 44.8 46.1 47.2 46.2 ...
##  $ base_press    : num  1023 1023 1023 1023 1023 ...
##  $ base_wind_sp  : num  1.6 1.8 1.3 1.3 1.3 0.8 1.1 0.4 1.2 0.9 ...
##  $ base_wind_dir : num  322 338 334 329 338 ...
##  $ base_wind_max : num  4.4 4.1 3.6 3.6 4.8 3.6 3.1 3.1 3.2 3.2 ...
##  $ base_pm10     : num  21.4 19.9 23.7 20.8 19.9 20 20 22 19.6 19.4 ...
##  $ base_pm25     : num  14.1 14.1 14.2 13.7 13.7 13.4 14 13.8 13.3 12.9 ...
##  $ base_pm10_sub : num  12.5 12.6 12.6 12.3 12.1 12.1 12.2 12.3 12 11.5 ...
##  $ base_pipe_temp: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ avoc_temp     : num  -8.1 -8 -8 -7.8 -8 -8 -8.2 -8.2 -7.9 -7.9 ...
##  $ avoc_humid    : num  44.4 44.5 44.6 44.6 44 44.7 45.4 46.2 46.7 46.1 ...
##  $ avoc_press    : num  1023 1023 1023 1023 1023 ...
##  $ avoc_wind_sp  : num  1.6 1.1 0.9 1.4 1.4 1.2 0.6 0.5 1.2 0.9 ...
##  $ avoc_wind_dir : num  315 341 330 349 353 ...
##  $ avoc_wind_max : num  4.4 3.5 3.6 4.8 4.8 3.6 3.1 2.2 3.2 3 ...
##  $ avoc_pm10     : num  18.6 20 19.1 19.5 17.7 18 18.7 18.4 17.1 17 ...
##  $ avoc_pm25     : num  11.1 11.3 11 11 11 11 11.1 10.9 10.4 10.5 ...
##  $ avoc_pm10_sub : num  9.8 9.8 9.7 9.7 9.5 9.5 9.6 9.6 9.1 9.1 ...
##  $ avoc_pipe_temp: num  99.2 99 99.1 99.1 99.3 99.3 99.2 99.4 98.9 98.8 ...
##  $ bvoc_temp     : num  -8.1 -8 -8 -7.9 -7.9 -7.9 -8.1 -8.1 -8.1 -7.9 ...
##  $ bvoc_humid    : num  44.5 44.4 44.5 44.5 44 44.4 45.1 46.1 47 46.2 ...
##  $ bvoc_press    : num  1023 1023 1023 1023 1023 ...
##  $ bvoc_wind_sp  : num  1.6 1.4 1.1 1.3 1.3 1 0.8 0.4 1.2 0.9 ...
##  $ bvoc_wind_dir : num  318 339 332 339 346 ...
##  $ bvoc_wind_max : num  4.4 4.1 3.6 4.8 4.8 3.6 3.1 3.1 3.2 3.2 ...
##  $ bvoc_pm10     : num  2.9 0 4.6 1.3 2.2 2.1 1.3 3.6 2.5 2.4 ...
##  $ bvoc_pm25     : num  3 2.7 3.2 2.7 2.7 2.4 2.9 2.9 2.9 2.4 ...
##  $ bvoc_pm10_sub : num  2.7 2.8 2.9 2.7 2.6 2.6 2.6 2.7 2.9 2.5 ...

(결측치 처리) : 결측치가 5000건 이상인 BASE 관측최대풍속, AVOC 관측최대풍속, BVOC 관측최대풍속 항목을 삭제하였다.

colSums(is.na(green_data))
##           site           time      base_temp     base_humid     base_press 
##              0              0              0              0              0 
##   base_wind_sp  base_wind_dir  base_wind_max      base_pm10      base_pm25 
##              0              0           5210              2              2 
##  base_pm10_sub base_pipe_temp      avoc_temp     avoc_humid     avoc_press 
##              2              0              0              0              0 
##   avoc_wind_sp  avoc_wind_dir  avoc_wind_max      avoc_pm10      avoc_pm25 
##              0              0           5210              0              0 
##  avoc_pm10_sub avoc_pipe_temp      bvoc_temp     bvoc_humid     bvoc_press 
##              0              0              0              0              0 
##   bvoc_wind_sp  bvoc_wind_dir  bvoc_wind_max      bvoc_pm10      bvoc_pm25 
##              0              0           5210              0              0 
##  bvoc_pm10_sub 
##              0
cols_to_drop <- c("base_wind_max", "avoc_wind_max", "bvoc_wind_max")

green_subset <- green_data[, !(names(green_data) %in% cols_to_drop)]
green_clean <- na.omit(green_subset)

dim(green_clean)
## [1] 212071     28

3.1.1. 기초 통계 및 탐색적 데이터 분석

library(dplyr)
library(ggplot2)
library(tidyr)

관측지점별 초미세먼지 농도분포

site_summary_table <- green_clean %>%
  group_by(site) %>%
  summarise(
    데이터수_N   = n(),
    평균_Mean   = mean(base_pm25, na.rm = TRUE),
    중앙값_Med   = median(base_pm25, na.rm = TRUE),
    표준편차_SD  = sd(base_pm25, na.rm = TRUE),
    분산_Var     = var(base_pm25, na.rm = TRUE),
    최솟값_Min   = min(base_pm25, na.rm = TRUE),
    최댓값_Max   = max(base_pm25, na.rm = TRUE)
  ) %>%
  ungroup()

print(site_summary_table)
## # A tibble: 17 × 8
##    site        데이터수_N 평균_Mean 중앙값_Med 표준편차_SD 분산_Var 최솟값_Min
##    <fct>            <int>     <dbl>      <dbl>       <dbl>    <dbl>      <dbl>
##  1 관악_도심        12613      29.9       23.6        19.5     379.        1.1
##  2 관악_숲          12622      25.5       20.7        16.1     258.        0.7
##  3 관악_캠퍼스      12597      33.3       27.1        21.3     455.        0  
##  4 남산_13.5m       12594      28.5       22.7        18.5     342.        0.7
##  5 남산_25.5m       12602      27.7       21.7        19.2     370.        0.7
##  6 남산_5m          12594      28.5       22          21.1     445.        0  
##  7 남산2_도심       12599      33.3       26.8        21.2     451.        1.3
##  8 남산2_숲1        12496      34.6       27.5        23.7     562.        1  
##  9 남산2_숲2        12538      31.4       25.1        20.6     426.        0  
## 10 선릉_12m         12944      28.4       21.6        19.2     369.        0.6
## 11 선릉_19m         12909      31.8       25.6        20.4     417.        0.8
## 12 선릉_5m          12933      32.6       26.7        20.8     434.        0.8
## 13 종로_도심        12245      32.9       27.4        20.1     402.        1.3
## 14 종로_주거        10823      31.4       23.3        22.2     493.        1.1
## 15 창경궁_10m       12920      26.8       20.7        18.0     324.        1  
## 16 창경궁_19m       11141      33.7       28.1        21.0     442.        1.4
## 17 창경궁_지상      12901      29.6       23.5        19.4     378.        1.2
## # ℹ 1 more variable: 최댓값_Max <dbl>

기초 통계 시각화

지점별 박스플롯 분석은 도심지 인접성과, 도시숲의 유무가 미세먼지 저감 능력을 결정하는 변수일 수 있음을 시사한다.

set.seed(123)
plot_sample <- green_clean[sample(nrow(green_clean), 10000), ]

site_boxplot <- ggplot(plot_sample, aes(x = site, y = base_pm25, fill = site)) +
  geom_boxplot(alpha = 0.7, outlier.alpha = 0.1, outlier.size = 0.8) +
  theme_minimal() +
  labs(
    title = "서울시 6개 거점 관측지점별 초미세먼지(PM2.5) 농도 분포 (N = 10,000)",
    x = "관측 지점 (Site)",
    y = "초미세먼지 농도 (㎍/㎥)"
  ) +
  theme(
    legend.position = "none",
    plot.title = element_text(face = "bold", size = 13),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

print(site_boxplot)

3.1.2. 집단 간 평균 비교 (t-test)

귀무가설 : 서울시 주중과 주말의 평균 초미세 먼지 농도는 차이가 없다.

대립가설 : 서울시 주중과 주말의 평균 초미세 먼지 농도는 차이가 있을 것이다.

(관측시간에서 요일을 숫자로 변환하여 주말과 주중의 범주형 변수로 추출)

데이터 정제

str(green_clean$time)
##  Factor w/ 12960 levels "2026-01-01 00:00",..: 1 2 3 4 5 6 7 8 9 10 ...
green_clean$date_time <- as.POSIXct(green_clean$time, format="%Y-%m-%d %H:%M")
green_clean$wday_num <- as.POSIXlt(green_clean$date_time)$wday
green_clean <- green_clean %>%
  mutate(day_type = ifelse(wday_num %in% c(0, 6), "주말", "주중"))
green_clean$day_type <- factor(green_clean$day_type, levels = c("주중", "주말"))

t-test

t_test_daytype <- t.test(base_pm25 ~ day_type, data = green_clean)
print(t_test_daytype)
## 
##  Welch Two Sample t-test
## 
## data:  base_pm25 by day_type
## t = -1.8545, df = 127835, p-value = 0.06367
## alternative hypothesis: true difference in means between group 주중 and group 주말 is not equal to 0
## 95 percent confidence interval:
##  -0.352975775  0.009763537
## sample estimates:
## mean in group 주중 mean in group 주말 
##           30.49055           30.66216

3.1.3. 분산분석 (ANOVA)

관악 측정 파일에서 관악_도심(인간활동 밀집), 관악_캠퍼스(도시 인프라 완충), 관악_숲(자연식생보존구역에 대해 일원분산분석을 시행하였다.

귀무가설 : 관악구 내 세부 공간(관악_도심, 관악_캠퍼스, 관악_숲) 간의 일반 대기 평균 초미세먼지지 농도는 모두 같다.

대립가설 : 관악구 내 세부 공간 중 적어도 한 곳의 일반 대기 평균 초미세먼지 농도는 통계적으로 다를 것이다.

colnames(df_gwanak) <- new_names

cols_to_drop <- c("base_wind_max", "avoc_wind_max", "bvoc_wind_max")
gwanak_subset <- df_gwanak[, !(names(df_gwanak) %in% cols_to_drop)]
gwanak_clean  <- na.omit(gwanak_subset)

str(gwanak_clean)
## 'data.frame':    37832 obs. of  28 variables:
##  $ site          : Factor w/ 3 levels "관악_도심","관악_숲",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ time          : Factor w/ 12960 levels "2026-01-01 00:00",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ base_temp     : num  -8.1 -8.1 -8 -8 -7.8 -7.9 -8.1 -8.1 -8.2 -7.9 ...
##  $ base_humid    : num  44.6 44.4 44.5 44.5 44 44.2 44.8 46.1 47.2 46.2 ...
##  $ base_press    : num  1023 1023 1023 1023 1023 ...
##  $ base_wind_sp  : num  1.6 1.8 1.3 1.3 1.3 0.8 1.1 0.4 1.2 0.9 ...
##  $ base_wind_dir : num  322 338 334 329 338 ...
##  $ base_pm10     : num  21.4 19.9 23.7 20.8 19.9 20 20 22 19.6 19.4 ...
##  $ base_pm25     : num  14.1 14.1 14.2 13.7 13.7 13.4 14 13.8 13.3 12.9 ...
##  $ base_pm10_sub : num  12.5 12.6 12.6 12.3 12.1 12.1 12.2 12.3 12 11.5 ...
##  $ base_pipe_temp: num  0 0 0 0 0 0 0 0 0 0 ...
##  $ avoc_temp     : num  -8.1 -8 -8 -7.8 -8 -8 -8.2 -8.2 -7.9 -7.9 ...
##  $ avoc_humid    : num  44.4 44.5 44.6 44.6 44 44.7 45.4 46.2 46.7 46.1 ...
##  $ avoc_press    : num  1023 1023 1023 1023 1023 ...
##  $ avoc_wind_sp  : num  1.6 1.1 0.9 1.4 1.4 1.2 0.6 0.5 1.2 0.9 ...
##  $ avoc_wind_dir : num  315 341 330 349 353 ...
##  $ avoc_pm10     : num  18.6 20 19.1 19.5 17.7 18 18.7 18.4 17.1 17 ...
##  $ avoc_pm25     : num  11.1 11.3 11 11 11 11 11.1 10.9 10.4 10.5 ...
##  $ avoc_pm10_sub : num  9.8 9.8 9.7 9.7 9.5 9.5 9.6 9.6 9.1 9.1 ...
##  $ avoc_pipe_temp: num  99.2 99 99.1 99.1 99.3 99.3 99.2 99.4 98.9 98.8 ...
##  $ bvoc_temp     : num  -8.1 -8 -8 -7.9 -7.9 -7.9 -8.1 -8.1 -8.1 -7.9 ...
##  $ bvoc_humid    : num  44.5 44.4 44.5 44.5 44 44.4 45.1 46.1 47 46.2 ...
##  $ bvoc_press    : num  1023 1023 1023 1023 1023 ...
##  $ bvoc_wind_sp  : num  1.6 1.4 1.1 1.3 1.3 1 0.8 0.4 1.2 0.9 ...
##  $ bvoc_wind_dir : num  318 339 332 339 346 ...
##  $ bvoc_pm10     : num  2.9 0 4.6 1.3 2.2 2.1 1.3 3.6 2.5 2.4 ...
##  $ bvoc_pm25     : num  3 2.7 3.2 2.7 2.7 2.4 2.9 2.9 2.9 2.4 ...
##  $ bvoc_pm10_sub : num  2.7 2.8 2.9 2.7 2.6 2.6 2.6 2.7 2.9 2.5 ...
gwanak_clean$site <- factor(gwanak_clean$site, levels = c("관악_도심", "관악_캠퍼스", "관악_숲"))

gwanak_anova <- aov(base_pm25 ~ site, data = gwanak_clean)
summary(gwanak_anova)
##                Df   Sum Sq Mean Sq F value Pr(>F)    
## site            2   377901  188950   519.5 <2e-16 ***
## Residuals   37829 13758552     364                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tukey_res <- TukeyHSD(gwanak_anova)
print(tukey_res)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = base_pm25 ~ site, data = gwanak_clean)
## 
## $site
##                            diff       lwr       upr p adj
## 관악_캠퍼스-관악_도심  3.352521  2.789506  3.915536     0
## 관악_숲-관악_도심     -4.366987 -4.929722 -3.804251     0
## 관악_숲-관악_캠퍼스   -7.719508 -8.282422 -7.156593     0

분산분석 결과 유의확률(p-value <2e-16 이 연구 유의수준 0.05보다 현저히 낮아 귀무가설을 기각할 수 있다.

본 연구에서는 사후검정 기법 중 1대1 쌍별 평균 격차를 전수 비교하는 Tukey HSD (Honest Significant Difference) 검정을 채택하여 분석하였다.

연구 시행 전 ’도심’의 미세먼지가 가장 높을거라 예상했지만, 투키 사후 검정 결과 관악_캠퍼스가 관악_도심보다 초미세먼지 농도가 유의미하게 높다는 사실을 확인하였다.

3.1.4. 상관분석 (Correlation)

독립변수 : 관측기압

종속변수 : 초미세먼지

귀무가설 : 현지 기압과 초미세먼지 농도 간에는 선형적인 상관관계가 없다.

대립가설 : 현지 기압과 일반 대기 초미세 먼지 농도 간에는 선형적인 상관관계가 있다

cor_test2 <- cor.test(green_clean$base_press, green_clean$base_pm25, method = "pearson")
print(cor_test2)
## 
##  Pearson's product-moment correlation
## 
## data:  green_clean$base_press and green_clean$base_pm25
## t = -59.11, df = 212069, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.1314991 -0.1231249
## sample estimates:
##        cor 
## -0.1273143
ggplot(data = plot_sample, aes(x = base_press, y = base_pm25)) +
  geom_point(alpha = 0.15, color = "darkblue", size = 1) +  
  geom_smooth(method = "lm", color = "darkred", se = TRUE, size = 1.2) +
  labs(
    title = "현지 기압과 초미세먼지(PM2.5) 농도의 상관관계 (N = 10,000)",
    x = "현지 기압 (hPa)", 
    y = "초미세먼지 농도 (㎍/㎥)"
  ) +
  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.
## `geom_smooth()` using formula = 'y ~ x'

(분석) 피어슨 상관분석 결과, 유의 확률 < 2.2e-16 이 도출되었다. 이는 기압과 초미세먼지 농도 간에 상관관계가 없다”는 귀무가설을 기각한다.

상관계수 및 신뢰구간: 기압과 초미세먼지 농도 간의 피어슨 상관계수는 0.1273 (-0.1273143)으로 도출되었다. 또한, 상관계수의 95% 신뢰구간은 [-0.1315, -0.1231]로 도출되어 대기압이 상승할 때 초미세먼지 농도가 감소하는 음(-)의 선형 관계를 재확인해준다.

3.1.5. 회귀분석 (Regression)

독립변수 : 기온, 습도, 풍속 종속변수 : 초미세먼지 농도

귀무가설 : 기온, 습도, 풍속은 초미세먼지 농도에 어떠한 영향도 미치지 않는다.

대립가설 : 기온, 습도, 풍속 중 적어도 하나의 기상 요인은 초미세먼지 농도에 유의미한 영향을 미친다.

green_multi <- lm(base_pm25 ~ base_temp + base_humid + base_wind_sp, data = green_clean)
summary(green_multi)
## 
## Call:
## lm(formula = base_pm25 ~ base_temp + base_humid + base_wind_sp, 
##     data = green_clean)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -53.034  -8.218  -0.899   8.034 267.211 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.434853   0.111126  12.912  < 2e-16 ***
## base_temp    0.978266   0.005218 187.480  < 2e-16 ***
## base_humid   0.515853   0.001984 260.064  < 2e-16 ***
## base_wind_sp 0.009044   0.001637   5.524 3.32e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.65 on 212067 degrees of freedom
## Multiple R-squared:  0.331,  Adjusted R-squared:  0.331 
## F-statistic: 3.498e+04 on 3 and 212067 DF,  p-value: < 2.2e-16

\[\widehat{\text{base\_pm25}} = 1.4349 + (0.9783 \times \text{base\_temp}) + (0.5159 \times \text{base\_humid}) + (0.0090 \times \text{base\_wind\_sp})\]

(분석결과) p-value는 < 2e-16으로 나타났으며 유의수준 0.05보다 작아 귀무가설을 기각한다. 즉 설정한 다중회귀모형은 통계적으로 매우 유의미하다.

결정계수 R^2는 0.331로 도출되었다. 이는 투입한 기온, 습도, 풍속이라는 기상 요인들이 초미세먼지 농도 변화량의 약 33.1%를 설명할 수 있음을 의미한다.

세 변수 중 초미세먼지 상승에 가장 크게 기여하는 것은 기온와 습도이다. 즉 고온다습한 날씨일 수록 미세먼지 생성이 촉진되고 대기 정체 현상이 심화된다.