# CRAN 미러 설정
chooseCRANmirror(graphics = FALSE, ind = 1)  # 

연구 목적 및 배경 설명

현대 사회의 정신건강 문제는 다양한 요인에 의해 복합적으로 발생하고 있으며, 이는 개인의 삶의 질과 사회 전체에 큰 영향을 미치고 있습니다. 한국의 경우, OECD 국가 중 자살률이 가장 높고, 정신 건강에 대한 사회적 낙인 또한 강한 편에 속합니다. 이는 많은 사람들이 정신적 어려움을 겪으면서도 공식적인 도움을 받지 못하고 방치되는 결과로 이어지고 있습니다. 이러한 현실은 단순히 개인의 문제가 아닌 사회적 구조와 제도, 그리고 환경적 요인이 복합적으로 작용하고 있는 결과로 해석할 수 있습니다. 이는 단순히 개개인의 심리 상태만으로 설명할 수 없으며 다양한 사회적 요인들과 밀접하게 얽혀있는 문제입니다. 본 연구는 이러한 배경을 바탕으로 한국복지패널 데이터를 활용하여 다양한 변수들이 어떻게 정신건강에 영향을 미치는지 분석하는 것을 목적으로 두고 있습니다.

데이터에 대한 개괄적인 설명

분석에 사용한 데이터는 한국복지패널의 ’2024년 19차 한국복지패널조사(가구용, 가구원용, 머지데이터)’입니다. 주요 분석 변수로는 개인의 성별, 나이, 교육 수준, 혼인 상태, 자녀 유무, 직업상태,월 평균 개인소득, 건강 상태, 자살 생각 여부, 가족관계 만족도, 7대 권역 지역 구분, 주거 환경 만족도, 사회적 친분관계 등을 설정하였습니다.

데이터 정제 및 가공 과정

본 분석에 사용된 자료는 한국보건사회연구원에서 2024년에 수집한 한국복지패널 제19차 데이터(KOWEPS, Beta1 버전)로, 가구 및 개인 데이터를 결합한 koweps_hpc19_2024_beta1.dta 파일을 기반으로 하였습니다. 2025년 현재 시점에서는 가장 최신 연도 데이터를 활용한 분석이라는 점에서 시의성과 대표성을 동시에 확보할 수 있습니다. 해당 원자료는 약 1,000여 개의 변수와 다차원적 정보를 포함하고 있으며, 분석 목적에 맞는 주요 변수만을 선별하여 정제하였습니다. 정제 및 가공 과정은 다음과 같습니다.

##패키지 설치

install.packages("haven")
## 'C:/Users/kimen/AppData/Local/R/win-library/4.5'의 위치에 패키지(들)을 설치합니다.
## (왜냐하면 'lib'가 지정되지 않았기 때문입니다)
## 패키지 'haven'를 성공적으로 압축해제하였고 MD5 sums 이 확인되었습니다
## Warning: 패키지 'haven'의 이전설치를 삭제할 수 없습니다
## Warning in file.copy(savedcopy, lib, recursive = TRUE):
## C:\Users\kimen\AppData\Local\R\win-library\4.5\00LOCK\haven\libs\x64\haven.dll를
## C:\Users\kimen\AppData\Local\R\win-library\4.5\haven\libs\x64\haven.dll로
## 복사하는데 문제가 발생했습니다: Permission denied
## Warning: 'haven'를 복구하였습니다
## 
## 다운로드된 바이너리 패키지들은 다음의 위치에 있습니다
##  C:\Users\kimen\AppData\Local\Temp\RtmpK8Onac\downloaded_packages
install.packages("dplyr")
## Warning: 패키지 'dplyr'가 사용중이므로 설치되지 않을 것입니다
install.packages("ggplot2")
## Warning: 패키지 'ggplot2'가 사용중이므로 설치되지 않을 것입니다
install.packages("summarytools")
## 'C:/Users/kimen/AppData/Local/R/win-library/4.5'의 위치에 패키지(들)을 설치합니다.
## (왜냐하면 'lib'가 지정되지 않았기 때문입니다)
## 패키지 'summarytools'를 성공적으로 압축해제하였고 MD5 sums 이 확인되었습니다
## 
## 다운로드된 바이너리 패키지들은 다음의 위치에 있습니다
##  C:\Users\kimen\AppData\Local\Temp\RtmpK8Onac\downloaded_packages

##데이터 불러오기

library(haven)
library(dplyr)
 data <- read_sav("C:/Users/kimen/Desktop/2025ICMAD/rproject/koweps_hpc19_2024_beta1.sav")

file_path <- "C:/Users/kimen/Desktop/2025ICMAD/rproject/koweps_hpc19_2024_beta1.sav"

koweps_h19_2024 <- read_sav(file_path)

# 데이터 확인
head(koweps_h19_2024)
## # A tibble: 6 × 1,046
##   h19_id h19_ind h19_sn h19_merkey h_new h_new1 h19_cobf p19_wsc p19_wsl p19_wgc
##    <dbl>   <dbl>  <dbl>      <dbl> <dbl>  <dbl>    <dbl>   <dbl>   <dbl>   <dbl>
## 1      2       1      1      20101     0      0       NA   0.266   0.269   1441.
## 2      3       1      1      30101     0      0       NA   0.435   0.411   2356.
## 3      4       1      1      40101     0      0       NA   0.236   0.223   1279.
## 4      6       1      1      60101     0      0       NA   0.555   0.507   3006.
## 5      6       1      1      60101     0      0       NA   0.849   0.828   4598.
## 6      6       1      1      60101     0      0       NA   2.54    2.56   13743.
## # ℹ 1,036 more variables: p19_wgl <dbl>, p19_wsc_all <dbl>, p19_wsl_all <dbl>,
## #   p19_wgc_all <dbl>, p19_wgl_all <dbl>, p19_wsc_n_all <dbl>,
## #   p19_wgc_n_all <dbl>, p19_wsl_n_all <dbl>, p19_wgl_n_all <dbl>,
## #   h19_reg5 <dbl>, h19_reg7 <dbl>, h19_din <dbl>, h19_cin <dbl>,
## #   h19_flag <dbl>, h19_hc <dbl>, h19_hc_all <dbl>, h19_hc_n_all <dbl>,
## #   nh1901_1 <dbl>, nh1901_2 <dbl>, h1901_1 <dbl>, h19_pind <dbl>,
## #   h19_pid <dbl>, h19_g1 <dbl>, h19_g2 <dbl>, h19_g3 <dbl>, h19_g4 <dbl>, …

##변수 선택

file_path <- "C:/Users/kimen/Desktop/2025ICMAD/rproject/koweps_hpc19_2024_beta1.sav"
koweps_raw <- read_sav(file_path)
#변수 확인
c("h19_g3", "h19_g4", "p1902_8aq1", "p1902_5", "p1902_6",
    "p1902_3", "p19_wgl", "p1903_5", "p1905_6aq7", "p1905_3aq1", "p1903_7", "p1902_12", "p1903_10", "h19_reg7") %in% names(koweps_raw)
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

##변수명 변경 | 변수명 | 변경한한 변수명 (rename) | 의미 및 설명 | | ———— | —————————- | ——————————— | | h19_g3 | gender | 성별 (1=남성, 2=여성) | | h19_g4 | age | 나이 (만 나이) | | p1902_8aq1 | education | 교육 수준 | | p1902_5 | marital_status | 현재 혼인 상태 | | p1902_6 | has_children | 자녀 유무 | | p1902_3 | job_status | 현재 직업 상태 | | p19_wgl | income | 월평균 개인 소득 (세후) | | p1903_5 | health_satisfaction | 주관적 건강 상태 | | p1905_6aq7 | whether to think of suicide| 자살 생각 여부 | | p1905_3aq1 | family_satisfaction | 가족관계 만족도 | | p1903_7 | residential_environment | 주거환경 만족도 | | p1902_12 | financial_stress | 경제적 어려움 경험 여부 | | p1903_10 | social_friendship | 사회적 친분에 대한 만족도 | | h19_reg7 | region | 7대 권역 지역 코드 |

koweps <- koweps_raw %>%
  rename(
    gender = h19_g3,
    age = h19_g4,
    education = p1902_8aq1,
    marital_status = p1902_5,
    has_children = p1902_6,
    job_status = p1902_3,
    income = p19_wgl,
    health_satisfaction = p1903_5,
    suicidal_thought = p1905_6aq7,
    family_satisfaction = p1905_3aq1,
    residential_satisfaction = p1903_7,
    financial_stress = p1902_12,
    social_friendship_satisfaction = p1903_10,
    region = h19_reg7
  )

##변수 모아보기

koweps <- koweps %>%
  select(
    gender,                         # 성별
    age,                            # 나이
    education,                      # 교육 수준
    marital_status,                 # 혼인 상태
    has_children,                   # 자녀 유무
    job_status,                     # 직업 상태
    income,                         # 소득
    health_satisfaction,            # 건강 인식
    suicidal_thought,               # 자살 생각 여부 (추후 제외 가능)
    family_satisfaction,            # 가족 관계 만족도
    residential_satisfaction,       # 주거 환경 만족도
    financial_stress,               # 경제적 어려움 경험 여부
    social_friendship_satisfaction, # 사회적 친분 만족도
    region                          # 지역
  )

koweps
## # A tibble: 15,422 × 14
##    gender   age education marital_status has_children job_status income
##     <dbl> <dbl>     <dbl>          <dbl>        <dbl>      <dbl>  <dbl>
##  1      2  1945        NA             NA           NA         NA  1456.
##  2      1  1948       183              6           12         NA  2227.
##  3      1  1942        NA              1           12         NA  1210.
##  4      1  1962       270              1           12         NA  2744.
##  5      2  1963        33              5           12         12  4487.
##  6      2  2003        NA             NA           NA         NA 13856.
##  7      2  1934        NA             NA           NA         NA  1299.
##  8      2  1940        27              1           11          5   547.
##  9      2  1970        NA              4           12         NA  3675.
## 10      2  1992        20              1           12         NA  4373.
## # ℹ 15,412 more rows
## # ℹ 7 more variables: health_satisfaction <dbl>, suicidal_thought <dbl>,
## #   family_satisfaction <dbl>, residential_satisfaction <dbl>,
## #   financial_stress <dbl>, social_friendship_satisfaction <dbl>, region <dbl>

데이터 분석

##변수 리코딩

library(dplyr)

koweps <- koweps %>%
  mutate(
    # 성별
    gender = factor(gender, levels = c(1, 2), labels = c("남성", "여성")),
    
    # 혼인 상태
    marital_status = factor(marital_status,
                            levels = c(1, 2, 3, 4, 5),
                            labels = c("기혼", "사별", "이혼", "별거", "미혼")),
    
    # 자녀 유무
    has_children = ifelse(has_children == 1, "있음", "없음"),
    
    # 직업 상태
    job_status = factor(job_status, levels = c(1:6),
                        labels = c("종사", "실업", "비경제활동", "가사", "학생", "기타")),
    
    # 교육 수준
    education = factor(education,
                       levels = c(1:7),
                       labels = c("무학", "초등졸", "중졸", "고졸", "전문대", "대졸", "대학원졸")),

    
    # 자살 생각 여부
    suicidal_thought = ifelse(suicidal_thought == 1, "있음", "없음"),
    
    # 경제적 어려움
    financial_stress = ifelse(financial_stress == 1, "경험 있음", "없음"),
    
    # 지역
    region = factor(region,
                    levels = 1:7,
                    labels = c("서울", "수도권(경기/인천)", "충청권", "호남권", "대구/경북", "부산/경남/울산", "강원/제주"))
  )

##데이터 전처리

table(koweps$region)
## 
##              서울 수도권(경기/인천)            충청권            호남권 
##              1798              3425              2647              1828 
##         대구/경북    부산/경남/울산         강원/제주 
##              1605              1325              2794

1.지역 변수

koweps <- koweps %>%
  mutate(
    region_group = case_when(
      region == "서울" ~ "서울권",
      region == "수도권(경기/인천)" ~ "수도권",
      TRUE ~ "지방권"
    ),
    region_group = factor(region_group, levels = c("서울권", "수도권", "지방권"))
  )
table(koweps$region_group, useNA = "ifany")
## 
## 서울권 수도권 지방권 
##   1798   3425  10199
  1. 소득분위
koweps <- koweps %>%
  mutate(
    income_quartile = ntile(income, 4)  # 1=하위25%, 4=상위25%
  )
table(koweps$income_quartile, useNA = "ifany")
## 
##    1    2    3    4 <NA> 
## 2387 2387 2387 2386 5875
  1. 연령대
head(koweps$age)
## [1] 1945 1948 1942 1962 1963 2003
# 연령대 파생변수 생성
koweps <- koweps %>%
  mutate(
    age_2025 = 2025 - age,  # 태어난 연도를 기준으로 나이 계산
    age_group = case_when(
      age_2025 < 30 ~ "청년",   # 청년: 40세 미만
      age_2025 < 60 ~ "중년",   # 중년: 40세 이상 65세 미만
      age_2025 >= 60 ~ "노년",  # 노년: 65세 이상
      TRUE ~ NA_character_
    ),
    age_group = factor(age_group, levels = c("청년", "중년", "노년"))
  )

# 연령대 빈도 확인
table(koweps$age_group, useNA = "ifany")
## 
## 청년 중년 노년 
## 2969 4827 7626

##결측치 확인

# 각 변수에 대한 결측치 확인
summary(koweps)
##   gender          age         education     marital_status has_children      
##  남성:6909   Min.   :1906   전문대 :    1   기혼:1569      Length:15422      
##  여성:8513   1st Qu.:1949   무학   :    0   사별: 861      Class :character  
##              Median :1966   초등졸 :    0   이혼:1988      Mode  :character  
##              Mean   :1970   중졸   :    0   별거: 506                        
##              3rd Qu.:1989   고졸   :    0   미혼: 529                        
##              Max.   :2023   (Other):    0   NA's:9969                        
##                             NA's   :15421                                    
##       job_status        income      health_satisfaction suicidal_thought  
##  종사      :   41   Min.   :    0   Min.   :1.000       Length:15422      
##  실업      :    6   1st Qu.: 2419   1st Qu.:3.000       Class :character  
##  비경제활동:    6   Median : 4577   Median :3.000       Mode  :character  
##  가사      :   10   Mean   : 5417   Mean   :3.241                         
##  학생      :  685   3rd Qu.: 7554   3rd Qu.:4.000                         
##  기타      :   40   Max.   :15955   Max.   :5.000                         
##  NA's      :14634   NA's   :5875    NA's   :2707                          
##  family_satisfaction residential_satisfaction financial_stress  
##  Min.   :1.000       Min.   :1.000            Length:15422      
##  1st Qu.:3.000       1st Qu.:3.000            Class :character  
##  Median :3.000       Median :4.000            Mode  :character  
##  Mean   :2.773       Mean   :3.726                              
##  3rd Qu.:3.000       3rd Qu.:4.000                              
##  Max.   :3.000       Max.   :5.000                              
##  NA's   :15197       NA's   :2707                               
##  social_friendship_satisfaction               region     region_group  
##  Min.   :1.000                  서울             :1798   서울권: 1798  
##  1st Qu.:3.000                  수도권(경기/인천):3425   수도권: 3425  
##  Median :4.000                  충청권           :2647   지방권:10199  
##  Mean   :3.736                  호남권           :1828                 
##  3rd Qu.:4.000                  대구/경북        :1605                 
##  Max.   :5.000                  부산/경남/울산   :1325                 
##  NA's   :2707                   강원/제주        :2794                 
##  income_quartile    age_2025      age_group  
##  Min.   :1.0     Min.   :  2.00   청년:2969  
##  1st Qu.:1.5     1st Qu.: 36.00   중년:4827  
##  Median :2.0     Median : 59.00   노년:7626  
##  Mean   :2.5     Mean   : 55.06              
##  3rd Qu.:3.0     3rd Qu.: 76.00              
##  Max.   :4.0     Max.   :119.00              
##  NA's   :5875
# 각 변수별 결측치 개수 확인
sapply(koweps, function(x) sum(is.na(x)))
##                         gender                            age 
##                              0                              0 
##                      education                 marital_status 
##                          15421                           9969 
##                   has_children                     job_status 
##                           7413                          14634 
##                         income            health_satisfaction 
##                           5875                           2707 
##               suicidal_thought            family_satisfaction 
##                          15197                          15197 
##       residential_satisfaction               financial_stress 
##                           2707                          15283 
## social_friendship_satisfaction                         region 
##                           2707                              0 
##                   region_group                income_quartile 
##                              0                           5875 
##                       age_2025                      age_group 
##                              0                              0

#그래프 만들기

##연령대별 주관적 건강상태

ggplot(koweps, aes(x = age, y = health_satisfaction)) +
  geom_line(color = "blue") +  # 실제 데이터 선
  geom_smooth(method = "loess", color = "red") +  # 추세선 (LOESS 방식)
  labs(title = "나이와 주관적 건강 상태의 관계", x = "나이", y = "주관적 건강 상태") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 2707 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 1695 rows containing missing values or values outside the scale range
## (`geom_line()`).

연령대별 주관적 건강 상태를 시각화하여 나타내었습니다. 이 그래프는 각 연령대에서의 건강 상태 분포를 확인할 수 있게 해줍니다.중년층과 노년층에서 주관적 건강 상태가 낮은 경향이 나타났습니다.청년층의 건강 상태가 상대적으로 높은 평균을 보였으며, 건강 상태의 분포가 더 좁고 균등하게 나타났습니다.나이가 많을수록 주관적인 건강 상태가 저조하다는 결과는, 노년층이 더 많은 정신 건강 문제와 직면하고 있다는 것을 시사합니다.

##성별에 따른 건강상태

ggplot(koweps, aes(x = gender, y = health_satisfaction, fill = gender)) +
  geom_boxplot() +
  labs(title = "성별에 따른 주관적 건강 상태", x = "성별", y = "주관적 건강 상태") +
  theme_minimal() +
  scale_fill_manual(values = c("skyblue", "pink"))  # 성별에 따른 색상 지정
## Warning: Removed 2707 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

성별에 따른 주관적 건강 상태의 평균을 막대 그래프로 시각화했습니다. 이는 남성과 여성 간의 평균적인 건강 상태 차이를 분석하는 데 유용합니다.여성의 주관적 건강 상태가 남성보다 더 낮게 나타났습니다. 이는 여성들이 더 많은 정신적 스트레스나 정신건강 문제를 경험하는 경향을 시사할 수 있습니다.

##소득분위별 정신건강 상태

# 결측치가 있는 행 제거
koweps_clean <- koweps %>%
  filter(!is.na(income) & !is.na(suicidal_thought))

# 소득 분위 계산 (4분위로 나누기)
koweps_clean <- koweps_clean %>%
  mutate(income_quartile = ntile(income, 4))  # 1=하위25%, 4=상위25%

ggplot(koweps_clean, aes(x = factor(income_quartile), fill = suicidal_thought)) +
  geom_bar(position = "fill") +
  labs(title = "소득 분위별 자살 생각 여부", x = "소득 분위", y = "비율", fill = "자살 생각 여부") +
  theme_minimal()

소득 분위별로 자살 생각 여부를 시각화했습니다. 하위 소득 분위에서 자살 생각을 하는 비율이 상위 소득 분위보다 높았습니다.저소득층은 더 많은 정신건강 문제와 자살 생각을 겪는 경향이 있었습니다.소득층이 더 많은 정신적 고통을 겪고 있으며, 이는 경제적 지원과 정신건강 관리의 필요성을 강조합니다.

##직업별 스트레스 정도

##결측치가 있는 행 제거
koweps_clean <- koweps %>%
  filter(!is.na(job_status) & !is.na(health_satisfaction))

ggplot(koweps_clean, aes(x = job_status, y = health_satisfaction, fill = job_status)) +
  geom_boxplot() +
  labs(title = "직업 상태에 따른 주관적 건강 상태", x = "직업 상태", y = "주관적 건강 상태") +
  theme_minimal()

직업 상태에 따른 주관적 건강 상태를 분석하여, 실업 또는 비경제활동 상태에서 정신건강이 더 나쁠 수 있는지를 확인하는 그래프입니다.직업의 안정성이 정신건강에 긍정적인 영향을 미친다는 결과는, 실업 상태가 정신건강 문제를 악화시킬 수 있다는 것을 보여줍니다.

##주거환경 만족도에 따른 정신적 겅강 상태

ggplot(koweps, aes(x = residential_satisfaction, y = health_satisfaction, fill = residential_satisfaction)) +
  stat_summary(fun = "mean", geom = "bar") +
  labs(title = "주거 환경 만족도에 따른 주관적 건강 상태 (평균)", x = "주거 환경 만족도", y = "평균 주관적 건강 상태") +
  theme_minimal()
## Warning: Removed 2707 rows containing non-finite outside the scale range
## (`stat_summary()`).

주거 환경 만족도에 따라 주관적 건강 상태의 평균을 막대 그래프로 나타냈습니다. 이는 주거 환경이 정신건강에 미치는 영향을 보여주는 분석입니다.주거환경이 사람들의 정신건강에 큰 영향을 미친다는 것을 볼 수 있습니다. 주거환경에 대한 만족도가 높을수록 정신건강 상태가 양호하다는 결론을 보여줍니다.

##가족관계 만족도와 정신건강 관계

ggplot(koweps, aes(x = family_satisfaction, y = health_satisfaction)) +
  geom_point(aes(color = family_satisfaction), alpha = 0.6) +
  labs(title = "가족 관계 만족도와 주관적 건강 상태의 관계", x = "가족 관계 만족도", y = "주관적 건강 상태") +
  theme_minimal()
## Warning: Removed 15232 rows containing missing values or values outside the scale range
## (`geom_point()`).

##자살 생각 여부

suicidal_thought_freq <- table(koweps$suicidal_thought)

suicidal_thought_df <- as.data.frame(suicidal_thought_freq)
names(suicidal_thought_df) <- c("Suicidal_Thought", "Frequency")

# 원형 그래프 시각화
ggplot(suicidal_thought_df, aes(x = "", y = Frequency, fill = Suicidal_Thought)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") +
  labs(title = "자살 생각 여부 통계") +
  theme_void() +
  scale_fill_manual(values = c("skyblue", "orange")) +
  theme(legend.title = element_blank())

#결론

본 연구는 다양한 사회적, 경제적, 심리적 요인들이 정신건강에 미치는 영향을 분석하고, 자살 생각 여부와 주관적 건강 상태를 중심으로 주요 요인들이 어떻게 상호작용하는지 탐구했습니다. 소득, 직업 상태, 가족 관계 만족도, 주거 환경은 정신건강과 밀접하게 연관되어 있으며, 특히 저소득층과 실업 상태에서 정신건강 문제가 더욱 심각하게 나타난다는 결과를 도출하였습니다. 또한 가족 관계와 주거 환경이 정신건강에 미치는 긍정적인 영향을 확인할 수 있었습니다.이를 바탕으로 각 변수들이 정신건강에 미치는 영향을 명확히 밝혀내었으며, 이러한 결과를 토대로 정신건강 향상과 예방을 위한 정책적 제언을 도출할 수 있었습니다. 이러한 결과를 바탕으로, 정신건강 문제를 해결하고 예방하기 위해서는 경제적 지원, 가족 지원, 직업 안정성, 주거 환경 개선 등 다양한 정책적 접근이 필요합니다. 정신건강 지원 시스템의 접근성을 높이고, 소득 불평등을 해결하기 위한 정책, 직업 안정성과 가족 관계 개선을 위한 사회적 지원이 강화되어야 합니다.이는 정신건강 문제를 해결하는 데 있어 다각적인 접근이 필수적이며, 각 분야의 협력이 중요함을 강조할 수 있습니다.