1. 목표 및 배경

1-1. 분석의 목적 및 필요성

  • 현대 사회의 고용 형태 유연화 및 장시간 근로 환경은 근로자의 고유한 스트레스원으로 작용함. 이는 일주기 리듬 교란과 자율신경계 균형 파괴를 유발하여 코르티솔 분비를 촉진하고 고혈압 발생 위험을 유의하게 높임.

  • 불규칙한 근무 환경은 고나트륨·고포화지방산 섭취 등 영양 불균형과 음주, 흡연, 신체활동 부족 등 불건전한 생활습관과 결합하여 심혈관계 선행 지표인 수축기 혈압 상승을 가속화함.

  • 영양학적으로 칼륨과 식이섬유는 나트륨 배출을 돕고 체질량지수(BMI)는 혈압의 강력한 결정 요인임. 따라서 근로 환경이라는 직업적 요인과 생활습관 및 영양 섭취 행태를 종합적으로 고려한 보건 현상 기술이 시급함.

2. 데이터 설명 / 전처리 / EDA 과정

2-1. 데이터에 대한 설명

2-1-1. 데이터의 출처 및 수집 경로

  • 질병관리청에서 주관하는 국가 지정 통계인 제9기 3차년도(2024년) 국민건강영양조사 원시자료를 활용함.
  • 대한민국 국민의 건강 및 영양 상태 변화 추이를 파악하기 위해 매년 독립적인 표본을 추출하여 수행되는 1년 주기의 순환 표본조사임.
  • 전문 조사 수행원에 의해 가구방문 면접조사(보건·영양) 및 이동검진차량 내 전문 계측(검진조사)을 통해 직접 수집됨.

2-1-2. 조사 설계 및 데이터 구조적 특징

  • 대한민국 전체 인구의 대표성 확보와 선택 편향 최소화를 위해 2단계 층화집락표본설계확률비례계통추출법을 채택함.
  • 동일 대상자에 대해 가구원 면접 중심의 건강설문, 임상 검측 중심의 검진, 24시간 회상법 기반의 영양조사가 상호 연계된 통합형 데이터셋임.
  • 단순 임의추출 자료가 아니므로, 표본 추출률과 모집단 구조 차이를 보정할 층화변수(Stratum), 집락변수(Cluster/조사구), 가중치(Weight) 를 고려한 복합표본분석을 실시함.

2-1-3. 데이터 크기 및 주요 변수의 정의

  • 원시자료 중 만 20세 이상 성인 근로자 타겟 서브셋을 추출하고 결측치를 제거한 최종 유효 표본 크기는 n = 1,507명임(가중치 적용 시 추정 모집단 N = 13,493,126명).
  • 주요 변수의 운영적 정의
    • 종속변수
      수축기 혈압(HE_sbp, 연속형)
    • 통제변수
      성별(sex, 명목형, 남,여)
      연령(age, 연속형)
      주/변형 근로시간(EC_wht_5, 명목형, 주간근무, 저녁근무, 밤근무, 주야교대근무, 24시간교대근무, 분할 근무, 불규칙 교대 근무)
      주당 평균 근로시간(EC_wht_23, 연속형)
      1인가구 여부 (cfam, 명목형, 1명-1, 2~6명=2)
      가구소득 사분위수(ho_incm, 순서형, 하, 중하, 중상, 상)
    • 독립변수(신체지수)
      BMI(HE-BMI, 연속형)
    • 독립변수(영양 섭취 변수)
      나트륨(NF_NA, 연속형)
      칼륨(NF_K, 연속형)
      포화지방산(NF_SFA, 연속형)
      식이섬유(NF_TDF, 연속형)
      당류(NF_SUGAR, 연속형)
    • 독립변수(생활습관)
      1년간 음주빈도(BD1_11, 순서형, 무음주, 월1회 미만, 월1회 정도, 월2~4회, 주2~3회, 주4회 이상)
      현재 일반담배 흡연 여부(BS3_1, 명목형, 매일피움, 가끔피움, 피우지 않음)
      유산소 신체활동 실천(pa_aerobic, 명목형, 일주일에 150분 이상 운동함, 하지 않음)
    • 보정변수
      에너지 섭취량(NF_EN, 연속형)
setwd("C:/Users/shpar/OneDrive/바탕 화면/대학원/회귀분석/기말과제")

library(survey)
library(dplyr)
library(car)
library(readr)
library(psych)

data_common <- read_csv("HN24_ALL.csv")   # 공통/검진/보건설문 데이터
rmarkdown::paged_table(head(data_common))
dim(data_common)
## [1] 6997  798
data_nutrition <- read_csv("HN24_24RC.csv")  # 식품섭취조사/24시간 회상법 데이터
rmarkdown::paged_table(head(data_nutrition))
dim(data_nutrition)
## [1] 543782    110

2-2. 전처리

  • 분석에 필요한 변수 선정
  • 국민건강영양조사의 영양 데이터는 조사 전 24시간 동안 섭취한 개별 식품 단위로 기록되어 있으므로, 개인별 일일 총 영양소 섭취량을 산출하고 1인 1행 구조인 공통 데이터와 오류 없이 병합하기 위해 각 식품별 영양소 함량을 ID 기준으로 일괄 합산하여 분석에 활용해야 함.
common_cleaned <- data_common %>%
  select(ID, kstrata, psu, wt_ntr, HE_sbp, age, sex, 
         EC_wht_5, EC_wht_23, cfam, ho_incm, 
         BD1_11, BS3_1, HE_BMI, pa_aerobic)

nutrition_cleaned <- data_nutrition %>%
  group_by(ID) %>%
  summarize(
    total_en = sum(NF_EN, na.rm = TRUE),
    total_na = sum(NF_NA, na.rm = TRUE),
    total_k = sum(NF_K, na.rm = TRUE),
    total_sfa = sum(NF_SFA, na.rm = TRUE),
    total_TDF = sum(NF_TDF, na.rm = TRUE),
    total_sugar = sum(NF_SUGAR, na.rm = TRUE)
  )
  • ID를 기준으로 2개의 데이터 병합
final_data <- inner_join(common_cleaned, nutrition_cleaned, by = "ID")
rmarkdown::paged_table(head(final_data))
  • 주요 변수에 대한 비응답(8, 9, 88, 99) NA 처리.
  • 주/변형 근로시간
    주간근무(일반적인 낮 시간대 고정 근무)에 해당하는 케이스는 기준 집단인 1로, 주간근무를 제외한 모든 형태(저녁근무, 야간근무, 24시간 교대근무, 분할근무 등)를 2로 통합함.
  • 1인 가구여부
    가구원 구성수가 1명인 경우는 단독 가구인 1인 가구(=1)로, 가구원 2~6명 경우는 다인 가구(=2)로 범주화.
final_data <- final_data %>%
  mutate(
    ho_incm = ifelse(ho_incm == c(8, 9), NA, ho_incm),
    BD1_11 = ifelse(BD1_11 %in% c(8, 9), NA, BD1_11),
    BS3_1 = ifelse(BS3_1 %in% c(8, 9), NA, BS3_1),
    EC_wht_5 = ifelse(EC_wht_5 %in% c(88, 99), NA, BS3_1),
    pa_aerobic = ifelse(pa_aerobic == 9, NA, pa_aerobic),
    

    is_single_hh = case_when(
      cfam == 1 ~ 1,
      cfam %in% 2:6 ~ 2,
      TRUE ~ NA_real_
    ),
    is_single_hh = factor(is_single_hh, levels = c(1, 2), labels = c("Single", "Multi")),
    
 
    work_type = case_when(
      EC_wht_5 == 1 ~ 1,
      EC_wht_5 %in% 2:7 ~ 2,
      TRUE ~ NA_real_
    ),
    work_type = factor(work_type, levels = c(1, 2), labels = c("Regular", "Irregular")),
    
 
    EC_wht_23 = ifelse(EC_wht_23 %in% c(888, 999), NA, as.numeric(EC_wht_23))
  )
rmarkdown::paged_table(head(final_data))
dim(final_data)
## [1] 6802   23
  • 변수 타입 변경
final_data <- final_data %>%
  mutate(
    sex = factor(sex, 
                 levels = c(1, 2), 
                 labels = c("남자", "여자")),
    
    BD1_11 = factor(BD1_11, 
                    levels = c(1, 2, 3, 4, 5, 6), 
                    labels = c("비음주", "월1회미만", "월1회정도", "월2~4회", "주2~3회", "주4회이상")),
    
    BS3_1 = factor(BS3_1, 
                   levels = c(1, 2, 3), 
                   labels = c("매일피움", "가끔피움", "안피움")),
    ho_incm = factor(ho_incm, 
                   levels = c(1, 2, 3, 4), 
                   labels = c("하", "중하", "상중", "상")),
    pa_aerobic = factor(pa_aerobic, 
                   levels = c(0, 1), 
                   labels = c("유산소활동 하지 않음", "유산소활동 함"))
  )

2-3. EDA 과정

  • 원데이터의 연령(age)가 20세 이하가 관찰되어 복합표본 분석에서 subset 처리가 필요하다.
  • 대부분의 변수에서 결측치가 식별되어 복합표본 분석에서 subset 처리가 필요하다. (EDA는 NA 제외)
summary(final_data)
##       ID               kstrata          psu                wt_ntr       
##  Length:6802        Min.   :101.0   Length:6802        Min.   :  319.6  
##  Class :character   1st Qu.:106.0   Class :character   1st Qu.: 4768.6  
##  Mode  :character   Median :110.0   Mode  :character   Median : 6784.1  
##                     Mean   :111.5                      Mean   : 7571.6  
##                     3rd Qu.:117.0                      3rd Qu.: 9327.7  
##                     Max.   :127.0                      Max.   :32117.5  
##                                                                         
##      HE_sbp           age          sex          EC_wht_5       EC_wht_23   
##  Min.   : 75.0   Min.   : 1.00   남자:2975   Min.   :1.000   Min.   : 1.0  
##  1st Qu.:107.5   1st Qu.:31.00   여자:3827   1st Qu.:1.000   1st Qu.:24.0  
##  Median :117.0   Median :52.00               Median :3.000   Median :40.0  
##  Mean   :119.1   Mean   :48.01               Mean   :2.285   Mean   :35.3  
##  3rd Qu.:128.5   3rd Qu.:66.00               3rd Qu.:3.000   3rd Qu.:44.0  
##  Max.   :201.0   Max.   :80.00               Max.   :3.000   Max.   :98.0  
##  NA's   :222                                 NA's   :5246    NA's   :2955  
##       cfam       ho_incm           BD1_11          BS3_1          HE_BMI     
##  Min.   :1.000   하  :1187   비음주   :1096   매일피움: 659   Min.   :11.56  
##  1st Qu.:2.000   중하:1633   월1회미만:1157   가끔피움: 116   1st Qu.:20.61  
##  Median :3.000   상중:1923   월1회정도: 663   안피움  :1336   Median :23.26  
##  Mean   :2.744   상  :2025   월2~4회  :1196   NA's    :4691   Mean   :23.42  
##  3rd Qu.:4.000   NA's:  34   주2~3회  : 777                   3rd Qu.:25.99  
##  Max.   :6.000               주4회이상: 283                   Max.   :48.68  
##                              NA's     :1630                   NA's   :100    
##                 pa_aerobic      total_en         total_na       
##  유산소활동 하지 않음:3038   Min.   : 161.2   Min.   :   56.98  
##  유산소활동 함       :2392   1st Qu.:1246.5   1st Qu.: 1828.60  
##  NA's                :1372   Median :1655.5   Median : 2736.55  
##                              Mean   :1784.7   Mean   : 3048.84  
##                              3rd Qu.:2171.8   3rd Qu.: 3843.68  
##                              Max.   :7187.8   Max.   :19793.85  
##                                                                 
##     total_k           total_sfa           total_TDF         total_sugar     
##  Min.   :   89.32   Min.   :  0.09704   Min.   :  0.3525   Min.   :  0.063  
##  1st Qu.: 1716.26   1st Qu.:  7.37705   1st Qu.: 14.5965   1st Qu.: 28.188  
##  Median : 2410.13   Median : 12.67974   Median : 21.2007   Median : 47.882  
##  Mean   : 2634.16   Mean   : 15.51083   Mean   : 23.8038   Mean   : 56.674  
##  3rd Qu.: 3298.48   3rd Qu.: 20.07515   3rd Qu.: 30.2204   3rd Qu.: 75.008  
##  Max.   :14394.30   Max.   :181.88680   Max.   :126.0534   Max.   :736.055  
##                                                                             
##  is_single_hh      work_type   
##  Single:1060   Regular  : 509  
##  Multi :5742   Irregular:1047  
##                NA's     :5246  
##                                
##                                
##                                
## 
  • 연속형 변수는 Box-plot,히스토그램, 명목형 변수는 막대그래프로 시각화
  • 국민건강영양조사는 복합표본분석을 위해 이상치나 결측치를 제거하면 가중치의 균형과 모집단의 대표성이 파괴되어 통계적 왜곡이 발생하므로, 복합표본 전용 하위집단 추출을 사용해 함
  • 연구 변수들의 분포적 특성을 확인하기 위해 히스토그램을 분석한 결과, 종속변수인 수축기 혈압(HE_sbp)과 체질량지수(HE_BMI)는 임상적으로 안정적인 정규분포에 근접한 단봉형 양상을 보였다.
  • 일일 영양소 섭취량 변수들은 전형적인 우측 편포(Right-skewed) 경향을 나타내어 극소수 대량 섭취자에 의한 극단값을 볼 수 있다.
  • 일일 포화지방(sfa) 및 당류(sugar) 섭취량의 분포를 검토한 결과, 첨도(Kurtosis) 값이 각각 19와 17로 관찰되어 일반적인 정규분포 판정기준 절대값 7미만을 초과하여 윈저라이징(상위 1% 시점을 임계치로 고섭취자들을 임계치 값으로 조정)후 다시 분석한 결과 첨도 값이 2.85. 1.77로 낮춰짐을 확인했다. (영양역학 및 보건통계학 분야에서 검정력 유지를 위해 널리 권장되는 윈저라이징(Winsorization) 기법을 적용)
library(ggplot2)
library(tidyr)

continuous_plots <- final_data %>%
  select(HE_sbp, age, HE_BMI, total_en, total_na, total_k, total_sfa, total_TDF, total_sugar,  
         EC_wht_23) %>%
  pivot_longer(cols = everything(), names_to = "variable", values_to = "value") %>%
  filter(!is.na(value))

ggplot(continuous_plots, aes(y = value, fill = variable)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  facet_wrap(~ variable, scales = "free", ncol = 4) +  
  theme_minimal() +
  labs(title = "주요 연속형 연구 변수별 박스플롯 분포", y = "측정값") +
  theme(strip.text = element_text(face = "bold", size = 10))

ggplot(continuous_plots, aes(x = value, fill = variable)) + 
  geom_histogram(bins = 30, color = "white", alpha = 0.8, show.legend = FALSE) + 
  facet_wrap(~ variable, scales = "free", ncol = 4) + 
  theme_minimal() +
  labs(title = "주요 연속형 변수별 히스토그램 빈도 분포 (한눈에 보기)",
       x = "측정값",
       y = "데이터 개수 (Count)") +
  theme(strip.text = element_text(face = "bold", size = 10))

target_vars <- final_data %>%
  select(HE_sbp, age, HE_BMI, total_en, total_na, total_k, total_sfa, total_TDF, total_sugar, EC_wht_23)
desc_results <- describe(target_vars, type = 2)

final_table <- desc_results %>%
  select(n, mean, sd, skew, kurtosis)

print(round(final_table, 4))
##                n    mean      sd  skew kurtosis
## HE_sbp      6580  119.13   16.00  0.80     1.09
## age         6802   48.01   22.12 -0.39    -0.95
## HE_BMI      6702   23.42    4.31  0.47     1.13
## total_en    6802 1784.67  780.10  1.36     3.69
## total_na    6802 3048.84 1750.68  1.61     5.33
## total_k     6802 2634.16 1308.50  1.39     4.14
## total_sfa   6802   15.51   12.28  2.88    19.57
## total_TDF   6802   23.80   13.19  1.44     3.76
## total_sugar 6802   56.67   40.72  2.40    17.35
## EC_wht_23   3847   35.30   16.02  0.03     0.15
# 윈저라이징
cutoff_sfa   <- quantile(final_data$total_sfa, 0.99, na.rm = TRUE)
cutoff_sugar <- quantile(final_data$total_sugar, 0.99, na.rm = TRUE)

final_data <- final_data %>%
  mutate(
    sfa_win = ifelse(total_sfa > cutoff_sfa, cutoff_sfa, total_sfa),
    sugar_win = ifelse(total_sugar > cutoff_sugar, cutoff_sugar, total_sugar)
  )



describe(final_data %>% select(sfa_win, sugar_win), type = 2)
##           vars    n  mean    sd median trimmed   mad  min    max  range skew
## sfa_win      1 6802 15.32 11.15  12.68   13.73  8.97 0.10  59.47  59.37 1.53
## sugar_win    2 6802 56.14 37.71  47.88   51.54 32.84 0.06 195.72 195.66 1.25
##           kurtosis   se
## sfa_win       2.85 0.14
## sugar_win     1.77 0.46
  • 범주형 변수의 빈도분포 분석 결과는 아래 그래프와 같음
categorical_plots <- final_data %>%
  select(sex, ho_incm, BD1_11, BS3_1, pa_aerobic, is_single_hh, work_type) %>%
  mutate(across(everything(), as.character)) %>% # 모든 범주형 변수를 문자형으로 통일
  pivot_longer(cols = everything(), names_to = "variable", values_to = "value") %>%
  filter(!is.na(value))


ggplot(categorical_plots, aes(x = value, fill = variable)) +
  geom_bar(alpha = 0.8, show.legend = FALSE, color = "black", width = 0.6) +
  facet_wrap(~ variable, scales = "free", ncol = 3) +  # 3열 격자로 배치
  theme_minimal() +
  labs(title = "주요 범주형(명목형) 연구 변수별 빈도 분포", x = "범주/코드", y = "빈도수 (명)") +
  theme(strip.text = element_text(face = "bold", size = 10),
        axis.text.x = element_text(angle = 45, hjust = 1)) # 글자 겹침 방지 각도 조절

* 주요 연속형 변수 간의 상관관계를 분석한 결과, 종속변수인 수축기 혈압(HE_sbp)은 연령(age:r=0.37) 및 체질량지수(HE_BMI:r=0.34)와 유의한 양의 상관관계를 나타냈다. * 일일 영양소 섭취량 간의 상관관계를 분석한 결과, 칼륨(k)과 총 식이섬유(TDF) 섭취량 간의 상관계수는 r=0.82로 나타나, 두 변수 간에 매우 강력한 양(+)의 선형 상관관계가 존재함을 확인하였다.

library(corrplot)



cor_matrix <- final_data %>%
  select(HE_sbp, age, HE_BMI, total_en, total_na, total_k, sfa_win, total_TDF, sugar_win, EC_wht_23) %>%
  cor(use = "complete.obs", method = "pearson")

corrplot(cor_matrix, 
         method = "circle",       
         type = "upper",         
         order = "hclust",        
         tl.col = "black",       
         tl.srt = 45,             
         diag = FALSE)

base_eda_data <- final_data[, c("HE_sbp", "age", "HE_BMI", "total_en", "total_na", 
                               "total_k", "sfa_win", "total_TDF", "sugar_win", "EC_wht_23")]


cor_matrix_base <- cor(base_eda_data, use = "complete.obs", method = "pearson")
round(cor_matrix_base, 2)
##           HE_sbp   age HE_BMI total_en total_na total_k sfa_win total_TDF
## HE_sbp      1.00  0.37   0.34     0.06     0.08    0.08   -0.07      0.14
## age         0.37  1.00   0.04    -0.10     0.01    0.17   -0.29      0.30
## HE_BMI      0.34  0.04   1.00     0.14     0.15    0.10    0.08      0.07
## total_en    0.06 -0.10   0.14     1.00     0.66    0.69    0.70      0.55
## total_na    0.08  0.01   0.15     0.66     1.00    0.62    0.39      0.55
## total_k     0.08  0.17   0.10     0.69     0.62    1.00    0.37      0.82
## sfa_win    -0.07 -0.29   0.08     0.70     0.39    0.37    1.00      0.16
## total_TDF   0.14  0.30   0.07     0.55     0.55    0.82    0.16      1.00
## sugar_win  -0.04 -0.03   0.02     0.52     0.29    0.56    0.39      0.52
## EC_wht_23  -0.01 -0.08   0.09     0.16     0.13    0.11    0.11      0.05
##           sugar_win EC_wht_23
## HE_sbp        -0.04     -0.01
## age           -0.03     -0.08
## HE_BMI         0.02      0.09
## total_en       0.52      0.16
## total_na       0.29      0.13
## total_k        0.56      0.11
## sfa_win        0.39      0.11
## total_TDF      0.52      0.05
## sugar_win      1.00      0.04
## EC_wht_23      0.04      1.00

3. 복합표본 설계

  • 본 연구에서는 국민건강영양조사의 복합표본 추출 디자인을 반영하고자 survey 패키지를 이용해 조사구(psu), 통합층(kstrata), 영양가중치(wt_ntr)를 결합한 복합표본 설계 개체를 생성 함.
options(survey.lonely.psu = "adjust")

knhanes_full_design <- svydesign(
  ids = ~psu, 
  strata = ~kstrata, 
  weights = ~wt_ntr, 
  data = final_data, 
  nest = TRUE
)
  • 복합표본 분석 시 데이터를 임의로 제거하면 층화 구조가 깨져 표준오차가 왜곡되므로, subset 함수를 통해 만 20세 이상 성인이면서 분석 대상상 변수에 결측치가 없는 대상자만을 하위 그룹으로 추출하여 통계적 타당성을 확보하고 최종 분석 대상자 수를 산출하였다. (n=1,509)
analysis_vars <- c("HE_sbp", "age", "sex", "ho_incm", "is_single_hh", 
                   "work_type", "EC_wht_23", "HE_BMI", "BD1_11", "BS3_1", 
                   "pa_aerobic", "total_en", "total_na", "total_k", 
                   "sfa_win", "total_TDF", "sugar_win")

adult_design <- subset(knhanes_full_design, 
                       age >= 20 & complete.cases(final_data[analysis_vars]))


cat("최종 분석 대상자 수:", sum(weights(adult_design, "sampling") > 0), "명\n")
## 최종 분석 대상자 수: 1509 명

4. 복합표본 빈도분석

library(gtsummary)


table1 <- adult_design %>%
  tbl_svysummary(
    include = c(sex, ho_incm, is_single_hh, work_type, BD1_11, BS3_1),
    statistic = list(all_categorical() ~ "{n_unweighted} ({p}%)"),  
    missing = "no"
  ) %>%
  as_tibble() 

table1
## # A tibble: 25 × 2
##    `**Characteristic**` `**N = 13,523,609**`
##    <chr>                <chr>               
##  1 sex                  <NA>                
##  2 남자                 1,268 (87%)         
##  3 여자                 241 (13%)           
##  4 ho_incm              <NA>                
##  5 하                   132 (6.8%)          
##  6 중하                 323 (20%)           
##  7 상중                 478 (33%)           
##  8 상                   576 (40%)           
##  9 is_single_hh         <NA>                
## 10 Single               248 (17%)           
## # ℹ 15 more rows

5. 복합표본 위계적 회귀분석

5-1. 단계별 회귀모형

# Model 1
model1 <- svyglm(HE_sbp ~ age + sex + ho_incm + is_single_hh + work_type + EC_wht_23, 
                 design = adult_design)

# Model 2
model2 <- svyglm(HE_sbp ~ age + sex + ho_incm + is_single_hh + work_type + EC_wht_23 + 
                          HE_BMI + BD1_11 + BS3_1 + pa_aerobic,
                          design = adult_design)

# Model 3
model3 <- svyglm(HE_sbp ~ age + sex + ho_incm + is_single_hh + work_type + EC_wht_23 + 
                          HE_BMI + BD1_11 + BS3_1 + pa_aerobic +
                          total_na + total_k + sfa_win + total_TDF + sugar_win + 
                          total_en, 
                          design = adult_design)

5-2. 모형 적합도 평가

  • 3단계 위계적 일반선형모형의 통계적 적합도를 비교·평가하기 위해 AIC를 분석한한 결과, 인구사회학적 및 고용 요인만 통제한 Model 1의 AIC는 12020.50으로 나타났다. 여기에 신체 지표 및 생활 습관 변수군을 추가 투입한 Model 2의 AIC는 11850.91로, Model 1 대비 169.59 가량 AIC 수치가 감소하며 모형의 적합도가 개선되었다. 최종적으로 핵심 독립변수인 영양소 섭취량 변수군과 총에너지 섭취량을 모두 투입한 Model 3의 AIC는 11850.32로 산출되어 세 모형 중 낮은 수치를 기록하였다.
  • AIC는 수치가 작을수록 데이터의 손실을 최소화하는 최적의 모형임을 의미하므로, 본 연구의 최종 Model3가 최적 모형임을 확인 함.
aic_results <- AIC(model1, model2, model3)
cat("=== 단계별 dAIC ===\n\n")
print(aic_results)
## === 단계별 dAIC ===
## 
##          eff.p      AIC deltabar
## [1,]  9.601188 12020.50 1.066799
## [2,] 18.727900 11850.91 1.101641
## [3,] 25.076638 11850.32 1.090289
  • 최종다중회귀모형(Model 3)의 통계적 유의성과 전체 변수군의 효과를 종합적으로 검증하기 위해 Wald 검정을 실시한 결과, 투입된 모든 독립변수(인구사회학적 요인, 생활 습관, 신체 지표 및 핵심 영양소 변수군)가 수축기 혈압에 미치는 전반적인 효과에 대한 F-통계량은 30.32로 산출되었으며, 이에 대한 유의확률은 < 2.22e-16으로 나타나 통계적 유의수준 0.001 미만에서 유의미하였다. 따라서, 본 연구에서 설정한 독립변수들의 조합이 수축기 혈압의 변동을 유의미하게 설명하고 있음을 증명한다.
cat("=== Model3 Wald Test ===\n")
regTermTest(model3, ~ age + sex + ho_incm + is_single_hh + work_type + EC_wht_23 + 
                 HE_BMI + BD1_11 + BS3_1 + pa_aerobic +
                 total_na + total_k + sfa_win + total_TDF + sugar_win + 
                 total_en)
## === Model3 Wald Test ===
## Wald test for age sex ho_incm is_single_hh work_type EC_wht_23 HE_BMI BD1_11 BS3_1 pa_aerobic total_na total_k sfa_win total_TDF sugar_win total_en
##  in svyglm(formula = HE_sbp ~ age + sex + ho_incm + is_single_hh + 
##     work_type + EC_wht_23 + HE_BMI + BD1_11 + BS3_1 + pa_aerobic + 
##     total_na + total_k + sfa_win + total_TDF + sugar_win + total_en, 
##     design = adult_design)
## F =  30.32468  on  22  and  141  df: p= < 2.22e-16

5-3. 잔차분석

5-3-1. 잔차 대 예측값 산점도(Residuals vs Fitted Plot)

  • 잔차의 평균 추세를 나타내는 빨간색 실선이 중심선인 0 라인을 따라 평탄한 직선을 유지하고 있어 모형의 선형성과 독립성 가정을 충족함.
  • 잔차의 퍼진 폭(분산) 또한 예측값 전 구간에 걸쳐 일정한 대역을 형성하고 있어 등분산성 가정 역시 안정적으로 만족하는 것으로 확인 됨.
  • 일부 관측치들(5531번, 5302번, 527번)은 실제 혈압이 모델의 예측치보다 다소 높게 측정된 극단적 고혈압 샘플이나, 오차의 크기가 전반적인 모형의 타당성을 훼손하지 않는 범위 내에 있어 본 최종 회귀모형은 왜곡 없이 안정적인 회귀계수를 산출하고 있는 것으로 판단 함.
plot(model3,1)

5-3-2. 정규 Q-Q 플롯(Normal Q-Q Plot)

  • 대다수의 데이터 관측치가 이론적 대각선(점선) 위에 긴밀하게 밀착하여 직선 형태를 유지하고 있으므로 잔차의 정규성(Normality) 가정을 전반적으로 잘 만족하는 것으로 나타남.
  • 그래프의 우측 상단 꼬리 부분에서 일부 관측치들이 대각선 위로 소폭 이탈하는 경향을 보이며, 이 중 오차가 가장 큰 상위 샘플들은 대규모 국가 보건 데이터셋에서 흔히 관찰되는 우측으로 치우친 혈압 분포의 특성이 반영된 결과로 판단 됨.
plot(model3,2)

5-3-3. 위치-척도 플롯(Scale-Location Plot)

  • 가로축인 예측값(Predicted values)의 변화에 따라 잔차의 절대값 변환 추세를 나타내는 빨간색 실선이 급격한 기울기 변화 없이 대체로 수평에 가까운 완만한 흐름을 유지하고 있음을 확인 함.
  • 또한 데이터 관측치들이 특정 구간에 집중되어 왜곡되지 않고 전 구간에 걸쳐 비교적 균일한 폭의 띠 형태로 분포하고 있어, 본 모형이 오차의 등분산성 가정을 안정적으로 충족하고 있음을 확인 함.
plot(model3,3)

5-3-4. 레버리지 산점도(Residuals vs Leverage Plot)

  • 그래프 상단에 일부 잔차가 큰 관측치들이이 나타났으나, 해당 표본들을 포함한 모형 내 모든 데이터가 Cook’s distance 위험 임계선인 0.5를 초과하지 않고 안쪽에 위치하고 있음을 확인 함.
  • 우측 최극단(Leverage 0.22)에 고레버리지 관측치가 식별되었으며, 이는 잔차가 0에 가까워 오차가 없고 Cook’s distance 위험선(0.5)을 넘지 않는 극단치이로 확인 됨.
plot(model3,5)

lev <- hatvalues(model3)
head(sort(lev, decreasing = TRUE), 5)
##       4859       1344       4941       1027       1942 
## 0.21847902 0.07504910 0.07266332 0.06928493 0.06787727

5-4. 모형 해석

  • 인구사회학적 요인만 투입한 Model1의 설명력(R^2)은 0.12이며, 이후 신체 지표(BMI)와 음주, 운동 등 후천적 생활습관 변수군이 추가된 Model2에서 0.23으로 설명력이 11% 상승하며 혈압 예측에 결정적인 실증적 기여도를 증명 함.
  • 최종 영양소 변수군이 투입된 Model3은 설명력(R^2) 0.23을 그대로 유지 함.
  • 수축기 혈압(HE_sbp)에 영향을 미치는 영양학적 요인을 체계적으로 파악하기 위해 인구사회학적 요인, 신체 및 생활습관 요인을 위계적으로 통제한 다중회귀분석을 실시 함.
  • 최종 모형인 Model3을 분석한 결과, 식습관 요인 중 당류 섭취량(B = -0.02, p = 0.04)은 수축기 혈압과 유의한 부(-)의 관계를 나타낸 반면, 총에너지 섭취량(B = 0.002, p = 0.02)은 유의한 정(+)의 영향을 미치는 것으로 확인되어 과잉 칼로리 섭취가 혈압 상승의 독립적인 위험 요인임이 확인 됨.
  • 반면, 나트륨(p = 0.62) 및 칼륨(p = 0.14) 섭취량은 통계적 유의성을 확인하지 못함.
  • 통제변수군에서는 연령(B = 0.34, p < .001)과 BMI(B = 0.94, p < .001)가 수축기 혈압을 높이는 핵심 요인이었으며, 음주 빈도가 월 2~4회(B=2.57), 주 2~3회(B=4.28), 주 4회 이상(B=5.66)으로 증가함에 따라 혈압이 유의하게 비례하여 상승하는 건강 위해효과가 관찰 됨.
library(jtools)
library(huxtable)
summ(model1, ,scale = TRUE, digits = 3)
summ(model2, digits = 3)
summ(model3, digits = 3)


export_summs(model3, model3, 
             scale = c(FALSE, TRUE), 
             model.names = c("비표준화 (Unstd)", "표준화 (Std)"),
             statistics = "character", 
             error_format = "[t = {statistic}, p = {p.value}]",
             digits = 3)
## MODEL INFO:
## Observations: 1509
## Dependent Variable: HE_sbp
## Type: Survey-weighted linear regression 
## 
## MODEL FIT:
## R² = 0.123
## Adj. R² = 0.078 
## 
## Standard errors: Robust
## -----------------------------------------------------------
##                               Est.    S.E.   t val.       p
## ------------------------ --------- ------- -------- -------
## (Intercept)                121.653   1.811   67.189   0.000
## age                          3.901   0.369   10.582   0.000
## sex여자                     -5.950   1.242   -4.792   0.000
## ho_incm중하                 -1.815   1.679   -1.081   0.281
## ho_incm상중                  0.238   1.646    0.145   0.885
## ho_incm상                    0.508   1.599    0.318   0.751
## is_single_hhMulti            0.240   0.910    0.264   0.792
## work_typeIrregular          -0.987   0.786   -1.255   0.211
## EC_wht_23                   -0.316   0.339   -0.933   0.353
## -----------------------------------------------------------
## 
## Estimated dispersion parameter = 166.656 
## 
## Continuous predictors are mean-centered and scaled by 1 s.d. The outcome variable remains in its original units.
## MODEL INFO:
## Observations: 1509
## Dependent Variable: HE_sbp
## Type: Survey-weighted linear regression 
## 
## MODEL FIT:
## R² = 0.226
## Adj. R² = 0.142 
## 
## Standard errors: Robust
## ---------------------------------------------------------------
##                                   Est.    S.E.   t val.       p
## ----------------------------- -------- ------- -------- -------
## (Intercept)                     79.827   2.853   27.977   0.000
## age                              0.331   0.028   11.662   0.000
## sex여자                         -3.901   1.105   -3.531   0.001
## ho_incm중하                     -2.376   1.534   -1.550   0.123
## ho_incm상중                     -0.552   1.488   -0.371   0.711
## ho_incm상                       -0.425   1.472   -0.288   0.773
## is_single_hhMulti               -0.070   0.779   -0.090   0.929
## work_typeIrregular              -0.942   0.747   -1.260   0.210
## EC_wht_23                       -0.025   0.021   -1.192   0.235
## HE_BMI                           0.940   0.079   11.937   0.000
## BD1_11월1회미만                 -0.498   1.175   -0.424   0.672
## BD1_11월1회정도                  1.303   1.280    1.018   0.310
## BD1_11월2~4회                    2.764   1.103    2.506   0.013
## BD1_11주2~3회                    4.669   1.075    4.344   0.000
## BD1_11주4회이상                  6.579   1.525    4.314   0.000
## BS3_1가끔피움                    1.518   1.644    0.923   0.357
## pa_aerobic유산소활동 함          2.632   0.698    3.773   0.000
## ---------------------------------------------------------------
## 
## Estimated dispersion parameter = 147.149 
## MODEL INFO:
## Observations: 1509
## Dependent Variable: HE_sbp
## Type: Survey-weighted linear regression 
## 
## MODEL FIT:
## R² = 0.233
## Adj. R² = 0.113 
## 
## Standard errors: Robust
## ---------------------------------------------------------------
##                                   Est.    S.E.   t val.       p
## ----------------------------- -------- ------- -------- -------
## (Intercept)                     80.007   3.050   26.235   0.000
## age                              0.345   0.029   11.915   0.000
## sex여자                         -3.780   1.091   -3.465   0.001
## ho_incm중하                     -2.525   1.541   -1.638   0.104
## ho_incm상중                     -0.523   1.469   -0.356   0.722
## ho_incm상                       -0.298   1.471   -0.202   0.840
## is_single_hhMulti               -0.217   0.789   -0.275   0.784
## work_typeIrregular              -0.650   0.761   -0.854   0.395
## EC_wht_23                       -0.026   0.021   -1.249   0.214
## HE_BMI                           0.941   0.075   12.474   0.000
## BD1_11월1회미만                 -0.345   1.189   -0.290   0.772
## BD1_11월1회정도                  1.295   1.294    1.001   0.319
## BD1_11월2~4회                    2.570   1.132    2.270   0.025
## BD1_11주2~3회                    4.277   1.103    3.879   0.000
## BD1_11주4회이상                  5.665   1.605    3.530   0.001
## BS3_1가끔피움                    1.237   1.692    0.731   0.466
## pa_aerobic유산소활동 함          2.595   0.704    3.684   0.000
## total_na                        -0.000   0.000   -0.499   0.619
## total_k                         -0.001   0.000   -1.494   0.137
## sfa_win                         -0.025   0.040   -0.618   0.537
## total_TDF                        0.005   0.043    0.121   0.904
## sugar_win                       -0.021   0.010   -2.040   0.043
## total_en                         0.002   0.001    2.353   0.020
## ---------------------------------------------------------------
## 
## Estimated dispersion parameter = 145.86
비표준화 (Unstd)표준화 (Std)
(Intercept)80.007 ***118.443 ***
[t = 26.235, p = 0.000]   [t = 70.442, p = 0.000]   
age0.345 ***4.827 ***
[t = 11.915, p = 0.000]   [t = 11.915, p = 0.000]   
sex여자-3.780 ***-3.780 ***
[t = -3.465, p = 0.001]   [t = -3.465, p = 0.001]   
ho_incm중하-2.525    -2.525    
[t = -1.638, p = 0.104]   [t = -1.638, p = 0.104]   
ho_incm상중-0.523    -0.523    
[t = -0.356, p = 0.722]   [t = -0.356, p = 0.722]   
ho_incm상-0.298    -0.298    
[t = -0.202, p = 0.840]   [t = -0.202, p = 0.840]   
is_single_hhMulti-0.217    -0.217    
[t = -0.275, p = 0.784]   [t = -0.275, p = 0.784]   
work_typeIrregular-0.650    -0.650    
[t = -0.854, p = 0.395]   [t = -0.854, p = 0.395]   
EC_wht_23-0.026    -0.374    
[t = -1.249, p = 0.214]   [t = -1.249, p = 0.214]   
HE_BMI0.941 ***3.684 ***
[t = 12.474, p = 0.000]   [t = 12.474, p = 0.000]   
BD1_11월1회미만-0.345    -0.345    
[t = -0.290, p = 0.772]   [t = -0.290, p = 0.772]   
BD1_11월1회정도1.295    1.295    
[t = 1.001, p = 0.319]   [t = 1.001, p = 0.319]   
BD1_11월2~4회2.570 *  2.570 *  
[t = 2.270, p = 0.025]   [t = 2.270, p = 0.025]   
BD1_11주2~3회4.277 ***4.277 ***
[t = 3.879, p = 0.000]   [t = 3.879, p = 0.000]   
BD1_11주4회이상5.665 ***5.665 ***
[t = 3.530, p = 0.001]   [t = 3.530, p = 0.001]   
BS3_1가끔피움1.237    1.237    
[t = 0.731, p = 0.466]   [t = 0.731, p = 0.466]   
pa_aerobic유산소활동 함2.595 ***2.595 ***
[t = 3.684, p = 0.000]   [t = 3.684, p = 0.000]   
total_na-0.000    -0.242    
[t = -0.499, p = 0.619]   [t = -0.499, p = 0.619]   
total_k-0.001    -0.966    
[t = -1.494, p = 0.137]   [t = -1.494, p = 0.137]   
sfa_win-0.025    -0.308    
[t = -0.618, p = 0.537]   [t = -0.618, p = 0.537]   
total_TDF0.005    0.068    
[t = 0.121, p = 0.904]   [t = 0.121, p = 0.904]   
sugar_win-0.021 *  -0.842 *  
[t = -2.040, p = 0.043]   [t = -2.040, p = 0.043]   
total_en0.002 *  1.458 *  
[t = 2.353, p = 0.020]   [t = 2.353, p = 0.020]   
*** p < 0.001; ** p < 0.01; * p < 0.05.

6. 결론 및 고찰

  • 본 분석의 핵심은 한국인 성인의 수축기 혈압을 결정하는 가장 지대한 요인이 영양소 섭취량 자체보다는, 통제변수로 투입된 비만도(BMI)와 음주 빈도 같은 ’신체·생활습관 요인’에 있다는 점입니다.독립변수인 당류(B = -0.02, β = -0.842)를 비롯한 나트륨, 칼륨 등의 개별 영양소들은 하루 총에너지(칼로리)를 통제한 상태에서 혈압에 미치는 실제적 영향력이 거의 없거나 미미한 수준에 그쳤습니다. 반면, 통제변수인 비만도(BMI)는 B = 0.94라는 강한 정(+)의 영향력을 유지하였고, 음주 빈도 역시 주 4회 이상일 때 B = 5.66으로 혈압을 상승시키는 계수 크기를 보여주고 있음.
  • 이는 영양학적 왜곡(총칼로리)을 완벽히 보정한 상태에서도, 무엇을 먹느냐라는 식단 조절보다 체중을 감량하고 술을 끊는 것이 성인의 혈압을 낮추는 데 훨씬 더 결정적이고 즉각적인 선결 과제임을 실증적으로 입증한 결과라고 볼 수 있음.
  • 본 분석은 단일 연도의 국민건강영양조사 자료만을 활용하였다는 한계를 가짐. 따라서 단일 연도 분석 한계를 극복하기 위해, 향후에는 국민건강영양조사의 다년도 자료를 합산 가중치를 적용하여 결합하는 통합 분석(Pooling Analysis) 후속 연구가 필요하다고 판단 됨.