연구 목적 및 배경 설명

국민건강보험공단에서 발표된 건강검진 수검률 연도별 추이를 보면 일반검진인 경우 2020년 67.8%에서 2023년 76.1%로 꾸준히 증가하는 추세이다. 그런데 한국에서는 사업자는 근로자의 건강관리를 위해 건강검진을 실시해야 한다는 의무가 있지만, 대학생인 경우 직장인으로서 일하지 않을 경우가 많을 것이므로 건강검진을 의무적으로 생각하지 않을 수도 있다. 전부에서 무료 국가건강검진 제도를 통해 청소년들도 쉽게 수검할 수 있으나 대학생에 건강검진 수검은 자기 판단이므로 나와 같을 대학생들이 얼마나 건강검진을 수검했는지 알기 어렵다고 생각한다. 그래서 이 분석은 대학생에 건강검진 수검 현황을 파악하여, 건강검진 미수검 이유를 예측, 그들을 데이터로 확인하는 것을 목적으로 한다. 대학생들에서 건강검진을 수검한 사람들이 그다지 많지 않을 것으로 예상하지만 이번 연구를 통해 내가 생각하는 예측이 맞는지 확인하고, 앞으로 건강검진 수검 여부의 판단자료로 활용할 수 있다면 좋겠다.

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

이번 분석의 목적 중에 현황 파악이 포함되어 있기 때문에 한국 복지 패널 사이트에서 최신 데이터인 ’2023년 18차 한국 복지 패널조사(가구용, 가구원용)’데이터를 사용했다. 분석 진행 순서는 다음과 같다.

  1. 데이터지 전처리 단계에서 한국 대학생의 건강 상태와 건강검진 수검 현황을 파악한다.
  2. 본격적인 분석 단계에서 건강 의식에 대한 분석을 진행한다. 자기 건강을 판단하여 수검하는 사람은 건강 의식이 높고, 건강이 안 좋은데도 수검하지 않는 경우는 건강 의식이 낮다고 판단하여 이유 분석 단계에서 활용할 수 있게 사례별로 분석한다.
  3. 내가 예측하는 미수검 이유를, 데이터를 가지고 분석해 본다. 첫 번째 이유는 건강에 대한 관심 저하라고 생각한다. 건강검진 미수검인 경우 내가 건강해서 수검하지 않을 수도 있지만, 자기 건강 상태에 그다지 신경 쓰지 않아서 건강검진을 중시하지 않을 경우도 있다고 예상한다.
  4. 두 번째 이유는 건강검진 비용 마련이 안 돼서라고 생각한다. 앞에서도 썼다시피, 무료 건강검진 제도도 있지만 수검을 받을 시기나 장소를 고려하면 비용이 들 경우도 있으며, 경제적 문제로 미수검자가 될 수 있다고 생각했다. 대학생인 경우, 근로자 여부로 나눌 수 있기 때문에 근로자이면 개인 경제 문제, 근로자가 아니면 가족 경제 문제가 있다고 예상한다.

결론 부분에서 분석 결과와 내 예측을 비교하면서 생각해 볼 다른 원인을 제시해 보고자 한다.

데이터 정제 및 가공 과정

1.데이터 준비하기

1-1. 데이터 불러오기

분석 목적에 맞게 한국 복지 패널 사이트에서 최신 데이터를 불러오고자 한다. 데이터를 불러오며 분석을 위한 데이터 가공하기 쉽게 복사본을 만든다.

# 사용 데이터를 불러오기기
koweps_h <- read.spss(file = "Koweps_h18_2023_beta1.sav",
                         to.data.frame = T)
## Warning in read.spss(file = "Koweps_h18_2023_beta1.sav", to.data.frame = T):
## Koweps_h18_2023_beta1.sav: Compression bias (0) is not the usual value of 100
## Warning in read.spss(file = "Koweps_h18_2023_beta1.sav", to.data.frame = T):
## Koweps_h18_2023_beta1.sav: Very long string record(s) found (record type 7,
## subtype 14), each will be imported in consecutive separate variables
koweps_p <- read.spss(file = "Koweps_p18_2023_beta1.sav",
                         to.data.frame = T)
## Warning in read.spss(file = "Koweps_p18_2023_beta1.sav", to.data.frame = T):
## Koweps_p18_2023_beta1.sav: Compression bias (0) is not the usual value of 100
# 복사본 만들기
welfare_h <- koweps_h 
welfare_p <- koweps_p

1-2.건강검진 현황 분석용 변수 선택하기 및 변수명 바꾸기

먼저, 대학생 건강검진 현황을 분석하기 위해 2023년 18차 한국 복지 패널조사 가구용 데이터에서 기구원 1에서 가구원 9를 대상으로 개인 패널 ID, 태어난 연도, 교육 수준, 재학 여부, 건강 상태, 1년간 건강검진 횟수 변수를 사용했다. 이 wel데이터는 분석을 진행하는 데 중심 데이터가 되기 때문에 나중에 다른 데이터와 결합할 수 있게 기준 역활로 개인 패널 ID 변수도 같이 놓았다. 분석 대상을 가능한 한 많이 잡기 위해 가구원 1에서 가구원 9까지 사용하기로 했으며, 아주 많은 변수 양이므로 가구원별로 데이터를 선정한 다음에 하나로 몫이었다. 마지막으로 해당 데이터들을 잘 불러왔는지 관측치 수와 변수 수를 확인했다.

# 가구원1
welfare_h1 <- welfare_h %>% select(ID = h18_pid1,                     # 개인 패널 ID
                                  birth = h1801_5,                    # 태어난 연도
                                  education = h1801_6,                # 교육 수준
                                  school_attendance_status = h1801_7, # 교육 수준(재학 여부) 
                                  physical_condition = h1802_2,       # 건강상태
                                  health_checkup = h1802_8)           # 1년간 건강검진 횟수    
                              
# 기구원2
welfare_h2 <- welfare_h %>% select(ID = h18_pid2,                         
                                  birth = h1801_17,                     
                                  education = h1801_18,                  
                                  school_attendance_status = h1801_19,  
                                  physical_condition = h1802_11,         
                                  health_checkup = h1802_17)                        

# 가구원3
welfare_h3 <- welfare_h %>% select(ID = h18_pid3,                        
                                  birth = h1801_29,                      
                                  education = h1801_30,                 
                                  school_attendance_status = h1801_31,   
                                  physical_condition = h1802_20,         
                                  health_checkup = h1802_26)             

# 가구원4
welfare_h4 <- welfare_h %>% select(ID = h18_pid4,                         
                                  birth = h1801_41,                      
                                  education = h1801_42,                  
                                  school_attendance_status = h1801_43,   
                                  physical_condition = h1802_29,        
                                  health_checkup = h1802_35)            

# 가구원5
welfare_h5 <- welfare_h %>% select(ID = h18_pid5,                       
                                  birth = h1801_53,                      
                                  education = h1801_54,                  
                                  school_attendance_status = h1801_55,   
                                  physical_condition = h1802_38,      
                                  health_checkup = h1802_44)             

# 가구원6
welfare_h6 <- welfare_h %>% select(ID = h18_pid6,                         
                                  birth = h1801_65,                     
                                  education = h1801_66,                  
                                  school_attendance_status = h1801_67,  
                                  physical_condition = h1802_47,         
                                  health_checkup = h1802_53)          

# 가구원7
welfare_h7 <- welfare_h %>% select(ID = h18_pid7,                         
                                  birth = h1801_77,                      
                                  education = h1801_78,                  
                                  school_attendance_status = h1801_79,   
                                  physical_condition = h1802_56,         
                                  health_checkup = h1802_62)             

# 가구원8 
welfare_h8 <- welfare_h %>% select(ID = h18_pid8,                         
                                  birth = h1801_89,                      
                                  education = h1801_90,                 
                                  school_attendance_status = h1801_91,    
                                  physical_condition = h1802_65,         
                                  health_checkup = h1802_71)             

# 가구원9
welfare_h9 <- welfare_h %>% select(ID = h18_pid9,                         
                                  birth = h1801_101,                    
                                  education = h1801_102,                
                                  school_attendance_status = h1801_103,  
                                  physical_condition = h1802_74,         
                                  health_checkup = h1802_80)            
                              
# welfare_h 데이터와 결합하기
wel <- bind_rows(welfare_h1,                                      
                       welfare_h2, 
                       welfare_h3, 
                       welfare_h4, 
                       welfare_h5, 
                       welfare_h6, 
                       welfare_h7, 
                       welfare_h8,
                       welfare_h9)
                     
# 데이터 획인
summary(wel)
##        ID              birth         education     school_attendance_status
##  Min.   :    201   Min.   :1906    Min.   :1.00    Min.   :0.00            
##  1st Qu.: 299804   1st Qu.:1949    1st Qu.:3.00    1st Qu.:3.00            
##  Median : 572901   Median :1965    Median :5.00    Median :5.00            
##  Mean   : 613833   Mean   :1969    Mean   :4.66    Mean   :3.86            
##  3rd Qu.: 959201   3rd Qu.:1988    3rd Qu.:6.00    3rd Qu.:5.00            
##  Max.   :1201102   Max.   :2022    Max.   :9.00    Max.   :5.00            
##  NA's   :52955     NA's   :52955   NA's   :52955   NA's   :52955           
##  physical_condition health_checkup 
##  Min.   :1.00       Min.   :0.00   
##  1st Qu.:2.00       1st Qu.:0.00   
##  Median :2.00       Median :0.00   
##  Mean   :2.54       Mean   :0.48   
##  3rd Qu.:3.00       3rd Qu.:1.00   
##  Max.   :5.00       Max.   :9.00   
##  NA's   :52955      NA's   :52955

1-3.건강검진 미수검 이유 분석용 변수 선택하기 및 변수명 바꾸기

다음으로, 건강검진 미수검 이유에 대한 분석을 위해 2023년 18차 한국 복지 패널조사 가구원용 데이터에서 변수를 선택했다. 이유 1에는 개인 패널 ID, 건강 만족도 변수를 선택하고, 이유 2에는 개인 패널 ID, 근로유형, 일한 달의 월 평균 임금, 가족의 수입 만족도 변수를 사용했다. 여기서 미리 만들어놓았던 wel데이터와 개인 패널 ID 기준으로 결합하여 건강검진 미수검 이유 분석용 데이터를 각각 만들었다. 마지막으로 데이터가 잘 만들었는지 확인했다.

#이유1
reason_a <- welfare_p %>% select(ID = h18_pid,                     # 개인 패널 ID
                                 health_satisfaction = p1803_5)    # 건강 만족도

#이유2
reason_b <- welfare_p %>% select(ID = h18_pid,                     # 개인 패널 ID
                               work_type = p1802_1,                # 근로 유형
                               month_wage = p1802_8aq1,            # 일한달의 월 평균 임금
                               income_satisfaction = p1803_6)      # 가족 수입 만족도

## wel 데이터와 결합하기
reason1 <- left_join(wel, reason_a, by = "ID")
reason2 <- left_join(wel, reason_b, by = "ID")

# 데이터 획인
head(reason1)
##     ID birth education school_attendance_status physical_condition
## 1  201  1945         4                        5                  4
## 2  301  1948         3                        5                  3
## 3  401  1942         7                        3                  3
## 4  601  1962         6                        5                  3
## 5  801  1940         3                        3                  4
## 6 1001  1970         5                        5                  4
##   health_checkup health_satisfaction
## 1              1                   2
## 2              1                   4
## 3              0                   2
## 4              1                   3
## 5              0                   2
## 6              1                   2
head(reason2)
##     ID birth education school_attendance_status physical_condition
## 1  201  1945         4                        5                  4
## 2  301  1948         3                        5                  3
## 3  401  1942         7                        3                  3
## 4  601  1962         6                        5                  3
## 5  801  1940         3                        3                  4
## 6 1001  1970         5                        5                  4
##   health_checkup work_type month_wage income_satisfaction
## 1              1         4         NA                   2
## 2              1         1        180                   4
## 3              0         1         NA                   3
## 4              1         1        252                   2
## 5              0         1         27                   3
## 6              1         2         NA                   1

2.데이터 정제

분석을 쉽게 진행할 수 있게 사용하는 데이터들을 미리 전저리하고 데이터를 파악하고자 한다.

2-1.건강검진 분석용 데이터 전처리

2-1-1. 분석 대상 선정

분석 목적에 맞게 대상을 대학생으로 제한하고자 한다. 다음부터 다른 변수를 전처리하는 데 필요 없는 대상을 제외해서 작업을 쉽게 할 수 있게 제일 먼저에 대상을 선정한다. 교육 수준이 대학교, 재학 또는 휴학하는 사람만 선정하며, 건강검진 수검 대상이 만 20세 이상이기 때문에 태어난 연도 변수에서 2004년 이전에 해당하도록 제한한다. 조건에 맞으면 ’pass’로 구분하여, 해당하지 않으면 결측치로 바꾸며 제거한다. 코딩 북에 따르면 교육 수준(education)에서 7값은 “대학교”, 교육 수준(school_attendance_status)에서 1값은 “재학”, 2값은 “휴학”을 의미한다. 마지막으로 정리된 데이터를 확인하니 분석 대상은 456명으로 나왔다.

wel <- wel %>%
  mutate(university_student = 
           ifelse(education == 7 &                         
                    (school_attendance_status == 1 |
                       school_attendance_status == 2) &    
                    birth <= 2004, "pass", NA)) %>%        
  filter(!is.na(university_student))                       


# 데이터 획인
table(wel$university_student)
## 
## pass 
##  456

2-1-2. 건강상태 데이터 전처리

대학생의 건강 상태를 파악하고자 한다. 건강 상태 변수를 건강 상태가 좋을지 안 좋을지 두가지로 나누기로 한다. 코딩 북에 따르면 건강 상태(physical_condition)에서 1값은’아주 건강하다’, 2값은 ‘건강한 편이다’, 3값은 ‘보통이다’, 4값은 ‘건강하지 않은 편이다’, 5값은 ’건강이 아주 안 좋다’를 의미한다. 1,2,3값을 ’good’로 구분하여 4,5값을 ’bad’로 구분했다.

wel <- wel %>% 
  mutate(physical_condition_sum = ifelse(physical_condition == 1 |                  
                                           physical_condition ==  2 | 
                                           physical_condition ==  3,"good", "bad"))

# 데이터 획인
table(wel$physical_condition_sum)
## 
##  bad good 
##    9  447

2-1-3. 1년간 건강검진 횟수 데이터 확인

대학생이 건강검진을 수검해봤는지 확인했다.

# 데이터 획인
table(wel$health_checkup)
## 
##   0   1 
## 392  64

2-2. 이유 분석용 데이터 전처리

2-2-1. 이유1 데이터 전처리

첫 번째로 생각하는 건강검진 미구검 이유인 건강에 대한 관심 저하에 대해 건강 만족도 데이터 전처리를 진행하고자 한다. 먼저 1-1에서 진행한 것과 똑같이 대상을 대학생으로 선정한다.

# 대학생 선정
reason1 <- reason1 %>%
  mutate(university_student = ifelse(education == 7 &                                       
                                       (school_attendance_status == 1 |                     
                                          school_attendance_status == 2), "pass", NA)) %>%  
  filter(!is.na(university_student))                                                        

# 데이터 획인
table(reason1$university_student)
## 
## pass 
##  456

다음으로 결측치를 확인해 보니 ’FALES’이 55게 확인되었으므로 이유분석 대상은 401명으로 진행하도록 한다.

#결측치 확인
table(!is.na(reason1$health_satisfaction))
## 
## FALSE  TRUE 
##    55   401

그리고 건강 만족도(health_satisfaction)에서 수준을 설정하기 위해 1값은’매우불만족’, 2값은’대체로 불만족’는 ‘low’로 구분, 3값인 ’그저 그렇다’는 ’medium’으로 구분, 4값인’대체로 만족’, 5값인’매우만족’는 ’high’로 나눠서 건강만족도 수준(health_satisfaction_sum)으로 저장한다.

#수준 설정
reason1 <- reason1 %>% 
  mutate(health_satisfaction_sum = ifelse(health_satisfaction == 1| health_satisfaction == 2, "high", 
                                          ifelse(health_satisfaction == 3, "medium", "low"))) %>% 
  filter(!is.na(health_satisfaction))                 

# 데이터 획인
table(reason1$health_satisfaction_sum)
## 
##   high    low medium 
##     16    326     59

2-2-2. 이유2 데이터 전처리

두 번째 건강검진 미수검 이유인 ’경제적 문제’에서 사용하는 데이터 전처리를 진행하고자 한다. 먼저, 이유1과 똑같이 대상을 대학생으로 한다.

# 대학생 선정
reason2 <- reason2 %>%
  mutate(university_student = ifelse(education == 7 &                                       
                                       (school_attendance_status == 1 |                    
                                          school_attendance_status == 2), "pass", NA)) %>%  
  filter(!is.na(university_student))   

# 데이터 획인
table(reason2$university_student)
## 
## pass 
##  456

다음으로 ’일한 달의 월 평균 임금’에서 수준을 정하기 위해 summary()를 사용해서 요약 통계를 확인한다. 요약 통계에서 1사 분위값인 68(만원) 이하와 무임금(NA)을 저임금으로 ’low’에 해당, 3사 분위값인 233(만원) 이상을 고임금으로 ’high’에 해당하게 했다. 그들에 해당하지 않은 가운데 값들은 ’ave’로 구분했다. 여기서 NA값도 있지만, 가정 경제 문제로 해당하는 사람들이 진짜 받은 임금이 없는지 확인하기 위해 이 단계에서는 제거하지 않는다.

#대학생 '일한달의 월 평균 임금'의 데이터 요약을 확인
summary(reason2$month_wage)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    30.0    68.5   135.0   165.2   233.0   839.0     330
# 일한달의 월 평균 임금 수준 정하기          
reason2 <- reason2 %>%
  mutate(month_wage_sum = ifelse((month_wage <= 68 | is.na(month_wage)), "low",
                                 ifelse(month_wage <= 233, "ave","high")))

# 데이터 획인
table(reason2$month_wage_sum)
## 
##  ave high  low 
##   62   32  362

다음으로 근로 유형 데이터를 사용해서 대상이 근로자인지 아닌지를 구별하고자 한다. 코딩북에 따르면 근로 유형(work_type)에서 1값은 ‘임금근로자’,2값은 ‘자영업, 고용주’, 3값은 ‘무급 가족 종사자’, 4값은 ‘미취업자(근로 능력 있음), 5값은 ’미취업자(근로능력없음)’를 의미한다. 1.2를 ’yes’(근로자)로, 3.4.5를 ‘no’(비근로자)로 구별한다.

#근로자 선정
reason2 <- reason2 %>%
  mutate(work_type_sum = ifelse(work_type == 1 | work_type ==2, "yes", "no"))

# 데이터 획인
table(reason2$work_type_sum)
## 
##  no yes 
## 316 139

그리고 가족 수입 만족도 수준 정하기로 했다. 코딩북에 따르면 가족 수입 만족도(income_satisfaction)에서 1값은 ‘매우불만족’,2값은 ‘대체로 만족’, 3값은 ‘그저 그렇다, 4값은 ’대체로 만족’, 5값은 ’매우 만족’을 의미한다. 1,2를 ’high’에, 3,4,5를’low’에 놓았다.

# 가족 수입 만족도 수준 정하기
reason2 <- reason2 %>%
  mutate(income_satisfaction_sum = ifelse((income_satisfaction == 1 | income_satisfaction == 2), "low","high")) %>% 
  filter(!is.na(income_satisfaction))

# 데이터 획인
table(reason2$income_satisfaction_sum)
## 
## high  low 
##  356   45

3.데이터 분석

3-1.건강의식 분석

건강 상태 데이터와 1년간 건강검진 횟수 데이터를 이용하여 건강의식(health_cons)에 대한 분석을 진행하고자 한다. 먼저, 건강 상태가 좋으면서 건강검진을 수검하는 경우와 건강 상태가 안 좋아서 수검을 받을 경우는 건강의식이 높다고 판단하여 ’high’에 해당, 건강 상태가 좋아서 수검을 안 받는 경우는 ’medium’에 해당, 건강 상태가 안 좋은데 수검도 안 받는 경우를 ’low’로 나누었다.

#건강의식 수준 나누기
wel <- wel %>% 
  mutate(health_cons = ifelse((physical_condition_sum == "good" | physical_condition_sum == "bad") & health_checkup == 1,"high",
                                ifelse(physical_condition_sum == "bad" & health_checkup == 0,"low","medium")))

# 데이터 획인
table(wel$health_cons)
## 
##   high    low medium 
##     64      9    383

다음으로 사례별로 %를 산출했다.

# % 산출
wel1 <- wel %>%
  group_by(physical_condition_sum, health_checkup,health_cons) %>%
  summarise(n = n()) %>%
  mutate(health_cons_pct = round(n/456*100, 1)) %>% 
  arrange(desc(health_cons_pct))
## `summarise()` has grouped output by 'physical_condition_sum', 'health_checkup'.
## You can override using the `.groups` argument.
# 데이터 획인
wel1
## # A tibble: 3 × 5
## # Groups:   physical_condition_sum, health_checkup [3]
##   physical_condition_sum health_checkup health_cons     n health_cons_pct
##   <chr>                           <dbl> <chr>       <int>           <dbl>
## 1 good                                0 medium        383              84
## 2 good                                1 high           64              14
## 3 bad                                 0 low             9               2

3-2.미수검 이유 분석

3-2-1. (이유1) 건강에 대한 관심 저하

첫 번째 이유에 대해 분석해 보고자 한다. 먼저 여기까지 분석해 온 데이터를 불러오고자 최신 wel데이터와 결합한다.

#최신 wel데이터와 결합하기 
wel_reason1 <- inner_join(wel, reason1)
## Joining with `by = join_by(ID, birth, education, school_attendance_status,
## physical_condition, health_checkup, university_student)`
# 데이터 획인
head(wel_reason1)
##       ID birth education school_attendance_status physical_condition
## 1  42303  1995         7                        2                  2
## 2  92651  1966         7                        1                  2
## 3 143505  1983         7                        1                  3
## 4 259402  1970         7                        1                  2
## 5 276603  1994         7                        2                  1
## 6 300903  1997         7                        1                  1
##   health_checkup university_student physical_condition_sum health_cons
## 1              1               pass                   good        high
## 2              1               pass                   good        high
## 3              0               pass                   good      medium
## 4              1               pass                   good        high
## 5              0               pass                   good      medium
## 6              0               pass                   good      medium
##   health_satisfaction health_satisfaction_sum
## 1                   3                  medium
## 2                   4                     low
## 3                   3                  medium
## 4                   4                     low
## 5                   3                  medium
## 6                   5                     low

다음으로 건강검진 미수검자의 건강 만족도 분포와 비율을 확인하기 위해 모수를 확인해 보면 0회는 342면, 1회는 59명으로 나왔다.

#% 산출를 위한 모수 확인
wel_reason1 %>% 
  group_by(health_checkup) %>% 
  summarise(n = n())
## # A tibble: 2 × 2
##   health_checkup     n
##            <dbl> <int>
## 1              0   342
## 2              1    59

다음으로 사례별로 %를 산출했다.

# % 산출
reason1_data <- wel_reason1 %>% 
  group_by(health_checkup,health_satisfaction_sum) %>% 
  filter(health_checkup == 0) %>% 
  summarise(n = n()) %>% 
  mutate(health_satisfaction_pct = round(n/342*100, 1)) %>% 
  arrange(desc(health_satisfaction_pct))
## `summarise()` has grouped output by 'health_checkup'. You can override using
## the `.groups` argument.
# 데이터 획인
reason1_data
## # A tibble: 3 × 4
## # Groups:   health_checkup [1]
##   health_checkup health_satisfaction_sum     n health_satisfaction_pct
##            <dbl> <chr>                   <int>                   <dbl>
## 1              0 low                       276                    80.7
## 2              0 medium                     51                    14.9
## 3              0 high                       15                     4.4

3-2-2. (이유2) 경재적 문제

두 번째 이유에 대해 분석해 보도록 한다. 먼저 3-2-1과 똑같이 최신 wel데이터와 두 번째 이유분석용 데이터와 결합한다.

#최신 wel데이터와 결합하기 
wel_reason2 <- inner_join(wel, reason2)
## Joining with `by = join_by(ID, birth, education, school_attendance_status,
## physical_condition, health_checkup, university_student)`
# 데이터 획인
head(wel_reason2)
##       ID birth education school_attendance_status physical_condition
## 1  42303  1995         7                        2                  2
## 2  92651  1966         7                        1                  2
## 3 143505  1983         7                        1                  3
## 4 259402  1970         7                        1                  2
## 5 276603  1994         7                        2                  1
## 6 300903  1997         7                        1                  1
##   health_checkup university_student physical_condition_sum health_cons
## 1              1               pass                   good        high
## 2              1               pass                   good        high
## 3              0               pass                   good      medium
## 4              1               pass                   good        high
## 5              0               pass                   good      medium
## 6              0               pass                   good      medium
##   work_type month_wage income_satisfaction month_wage_sum work_type_sum
## 1         1        230                   2            ave           yes
## 2         1        839                   4           high           yes
## 3         1        225                   3            ave           yes
## 4         1        260                   3           high           yes
## 5         1        355                   4           high           yes
## 6         1        241                   4           high           yes
##   income_satisfaction_sum
## 1                     low
## 2                    high
## 3                    high
## 4                    high
## 5                    high
## 6                    high

먼저, 건강검진 수검자와 미수검자로 구별하여, 각각 근로 현황이 어쩌는지 분석해 보도록 한다. 대상이 스스로 돈을 버는지 구별할 필요가 있기 때문에 근로 유형(work_type_sum)을 사용해서 대상을 선택하여, 건강검진 수검 여부로 나눠서 비율을 구한다.

# 건강검진 수검자 대상으로 % 산출
 reason2_o <- wel_reason2 %>% group_by(health_checkup, work_type_sum) %>% 
  filter(health_checkup == 0) %>% 
  summarise(n = n()) %>% 
  mutate( pct= round(n/342*100, 1))
## `summarise()` has grouped output by 'health_checkup'. You can override using
## the `.groups` argument.
# 건강검진 미미수검자 대상으로 % 산출
reason2_x <- wel_reason2 %>% group_by(health_checkup, work_type_sum) %>% 
  filter(health_checkup == 1) %>% 
  summarise(n = n()) %>% 
  mutate( pct = round(n/59*100, 1))
## `summarise()` has grouped output by 'health_checkup'. You can override using
## the `.groups` argument.
# 데이터 결합하기
reason2_data1 <- bind_rows(reason2_o,reason2_x)

# 데이터 획인
reason2_data1
## # A tibble: 4 × 4
## # Groups:   health_checkup [2]
##   health_checkup work_type_sum     n   pct
##            <dbl> <chr>         <int> <dbl>
## 1              0 no              239  69.9
## 2              0 yes             103  30.1
## 3              1 no               29  49.2
## 4              1 yes              30  50.8

다음으로 대상을 근로자로 하고 수검자와 미수검자의 비율을 분석하고자 한다. 대상을 근로자로 제한하기 위해 근로 유형(work_type_sum)은 ‘yes”로 설정하여, 1년간 건강검진 횟수((health_checkup)을 ’0’과 ’1’로 구별하여, 사례별로 ’일한 달의 월 평균 임금 수준(month_wage_sum)’ 데이터를 가지고 경제적 여유가 있는지도 확인하여 분석을 진행해 보도록 한다.

# 근로자 대상으로 건강검진 미수검자인 경우 % 산출
reason2_o_worker <- wel_reason2 %>% group_by(health_checkup, work_type_sum, month_wage_sum) %>% 
  filter(health_checkup == 0 & work_type_sum == "yes") %>% 
  summarise(n = n()) %>% 
  mutate(pct = round(n/103*100, 1)) %>% 
  arrange(desc(pct))
## `summarise()` has grouped output by 'health_checkup', 'work_type_sum'. You can
## override using the `.groups` argument.
# 비근로자 대상으로 건강검진 수검자인 경우 % 산출
reason2_x_worker <- wel_reason2 %>% group_by(health_checkup,work_type_sum,month_wage_sum) %>% 
  filter(health_checkup == 1 & work_type_sum == "yes") %>% 
  summarise(n = n()) %>% 
  mutate(pct = round(n/30*100, 1)) %>% 
  arrange(desc(pct))
## `summarise()` has grouped output by 'health_checkup', 'work_type_sum'. You can
## override using the `.groups` argument.
# 데이터 결합하기
reason2_data2 <- bind_rows(reason2_o_worker,reason2_x_worker)

# 데이터 획인
reason2_data2
## # A tibble: 6 × 5
## # Groups:   health_checkup, work_type_sum [2]
##   health_checkup work_type_sum month_wage_sum     n   pct
##            <dbl> <chr>         <chr>          <int> <dbl>
## 1              0 yes           ave               49  47.6
## 2              0 yes           low               36  35  
## 3              0 yes           high              18  17.5
## 4              1 yes           high              14  46.7
## 5              1 yes           ave                8  26.7
## 6              1 yes           low                8  26.7

대상을 비근로자로 하고 약시 수검자와 미수검자의 비율을 분석하고자 한다. 대상을 근로자로 제한하기 위해 근로 유형(work_type_sum)은 ‘no”로 설정하여, 1년간 건강검진 횟수((health_checkup)을 ’0’과 ’1’로 구별하여, 사례별로 ’가족 수입 만족도’(income_satisfaction_sum)’ 데이터를 가지고 비근로자인 경우에도 경제적 여유가 있는지를 확인하여 분석을 진행해 보도록 한다.

# 비근로자 대상으로 건강검진 미수검자인 경우 % 산출
reason2_x_non <- wel_reason2 %>% group_by(health_checkup,work_type,month_wage,income_satisfaction_sum) %>% 
  filter(health_checkup == 0 & work_type_sum == "no") %>% 
  summarise(n = n()) %>% 
  mutate(pct = round(n/239*100, 1)) %>% 
  arrange(desc(pct))
## `summarise()` has grouped output by 'health_checkup', 'work_type',
## 'month_wage'. You can override using the `.groups` argument.
# 비근로자 대상으로 건강검진 수검자인 경우 % 산출
reason2_o_non <- wel_reason2 %>% group_by(health_checkup,work_type,month_wage,income_satisfaction_sum) %>% 
  filter(health_checkup == 1 & work_type_sum == "no") %>% 
  summarise(n = n()) %>% 
  mutate(pct = round(n/29*100, 1)) %>% 
  arrange(desc(pct))
## `summarise()` has grouped output by 'health_checkup', 'work_type',
## 'month_wage'. You can override using the `.groups` argument.
# 데이터 결합하기
reason2_data3 <- bind_rows(reason2_o_non,reason2_x_non)

# 데이터 획인
reason2_data3
## # A tibble: 4 × 6
## # Groups:   health_checkup, work_type, month_wage [2]
##   health_checkup work_type month_wage income_satisfaction_sum     n   pct
##            <dbl>     <dbl>      <dbl> <chr>                   <int> <dbl>
## 1              1         4         NA high                       25  86.2
## 2              1         4         NA low                         4  13.8
## 3              0         4         NA high                      217  90.8
## 4              0         4         NA low                        22   9.2

4.그래프 만들기

4-1. 건강검진 분석용 데이터 시각화

먼저 ’2. 데이터 정제’에서 가공한 데이터들로 현황 파악을 쉬게 할 수 있게 그래프로 시각화했다. 대학생 건강 상태 현황과 대학생 건강검진 수검 여부 현황을 확인 세어보도록 한다. 한눈에 그래프를 이해할 수 있게 색깔로 구분하여, 자세한 분포도 같이 표시했다.

4-1-1. 대학생에 건강 상태 현황

건강 상태가 좋은 사람이 447명, 안 좋은 사람이 9명으로 나왔다. 대학생 대상으로 확인한 결과 5값인 ’아주 건강이 안 좋다’고 응답한 사람은 존재하지 않았다.

#건강상태 데이터 값별 인원
건강상태 <- wel %>% 
  group_by(physical_condition_sum, physical_condition) %>% 
           summarise(physical_condition_n = n()) %>% 
  arrange(desc(physical_condition))
## `summarise()` has grouped output by 'physical_condition_sum'. You can override
## using the `.groups` argument.
# 건강상태 데이터 겂 이름 바꾸기
건강상태$physical_condition <- ifelse(건강상태$physical_condition == 4, "건강하지 않은 편이다",
                                         ifelse(건강상태$physical_condition == 3, "보통이다",
                                                ifelse(건강상태$physical_condition == 2, "건강한 편이다", "아주 건강하다" ))) 


# 라벨 의치 산출
건강상태 <- 건강상태 %>%
  group_by(physical_condition_sum) %>%
  mutate(pos1 = cumsum(physical_condition_n) - 0.7 * physical_condition_n)


# 그래프 만들기
ggplot(data = 건강상태, aes(x = physical_condition_sum, 
                        y = physical_condition_n, 
                        fill = factor(physical_condition,levels = c("아주 건강하다", 
                                                                   "건강한 편이다", 
                                                                   "보통이다", 
                                                                   "건강하지 않은 편이다")))) +
  geom_col() +
  scale_fill_manual(values = c("아주 건강하다" = "deepskyblue", 
                               "건강한 편이다" = "skyblue", 
                               "보통이다" = "lightblue", 
                               "건강하지 않은 편이다" = "white")) +
  labs(x = "건강상태 (good or bad)", y = "사람", fill = "건강상태", title = "대학생 건강상태") + 
  geom_text(aes(label = physical_condition_n, y = pos1), vjust = -0.3)

4-1-2. 대학생 건강검진 현황

대학생 대상으로는 건강검진 횟수가 0회와 1회만 있고, 건강검진을 수검해본 사람은 64명, 안 해본 사람은 392명으로 나왔다.

# 건강검진 횟수 별 인원 
건강검진수 <- wel %>% 
  group_by(health_checkup) %>% 
           summarise(health_checkup_n = n())

# 그래프 만들기
ggplot(data = 건강검진수, aes(x = health_checkup, y = health_checkup_n, fill = health_checkup)) +
  geom_col() +
  scale_x_discrete(limits = c(0, 1)) +
  labs(x = "건강검진 홧수", 
       y = "사람", fill = "건강검진 홧수", 
       title = "대학생 건강검진 현황") + 
  geom_text(aes(label = health_checkup_n), vjust = -0.1)
## Warning in scale_x_discrete(limits = c(0, 1)): Continuous limits supplied to discrete scale.
## ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?

4-2. 데이터 분석 시각화

’3. 데이터 분석’에서 나온 데이터들을 사용해서 데이터를 이해하기 쉽게 그래프를 만든다. 첫 번째 이유에서 대학생의 건강 의식, 두 번째 이유에서 건강검진 수검 여부별로 대학생 근로 현황, 이어서 근로자 중 건강검진 수검 여부에 따른 임금 수준, 비근로자 중 건강검진 수검 여부에 따른 가족 수입 만족도를 시각화하도록 한다. 자세한 수치도 알 수 있게 각 데이터의 비율도 같이 표시했다.

4-2-1. 대학생 건강 의식

건강 의식(health_cons)이 높은 사람(high)은 전체에 14%(64명), 보통인 사람(medium)은 84%(383명), 낮은 사람(low)은 2%(9명)를 자치했다. 그런데 건강 의식이 높은 사람 중에 건강 상태가 안 좋아서 수검을 받을 경우는 없었다. 건강 의식이 높은 사람들은 건강 상태에 상관없이 건강검진을 받고 있는데 이 그룹은 자신의 건강 상태에 대해 신경을 많이 쓰고 있으며, 건강 상태가 좋아도 검진을 받는다는 점에서, 예방적 건강관리의 중요성을 인식하고 있는 것으로 보이며 예방적 조치를 취하고 있음을 나타내고 있다. 이 분석에서 대부분을 자치한 건강 의식이 보통인 사람들은 자신의 현재 건강 상태에 만족하고 있으며, 건강검진의 필요성을 느끼지 않기 때문에 검진을 받지 않는 경우가 많을 것으로 보인다. 건강 의식이 낮은 사람들인 경우, 건강관리에 대한 인식이 부족하거나, 검진의 중요성을 간과하고 있을 가능성이 크다고 보인다. 여기서 나온 분석 결과를 가지고 건강검진 미수검 이유를 분석해 보도록 한다.

# 그래프 만들기
ggplot(data = wel1, aes(x = '', y = health_cons_pct, fill = health_cons)) +
  geom_bar(stat = 'identity', color = "white") +
  geom_text(aes(label = paste0(round(health_cons_pct, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 5) +
  scale_fill_discrete(limits = c("high","medium","low" )) +
  scale_fill_manual(values = c("high" = "lightcyan2", 
                               "medium" = "gray",  
                               "low"  = "skyblue")) +
  theme_void() +
  coord_polar('y', start = 0) +
  labs(fill = "건강의식", 
       title = "대학생 건강의식")
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.

4-2-2. (이유 1) 건강에 대한 관심 저하

건강검진 미수검자 342명 중에서 건강 만족도가 높은 사람은 전체에 4.4%(15명), 보통인 사람은 14.9(51명), 낮은 사람은 80.7%(276명)를 자치했다. 건강검진 미수검자 중에서 건강 만족도가 높은 사람들은 건강검진을 받지 않더라도 스스로 건강 상태에 만족하는 사람들이 존재한다는 것을 나타내고 있다. 80% 이상을 자치한 건강 만족도가 낮지만, 검진을 받지 않는 사람들은 건강에 대한 관심이 부족하거나, 검진의 필요성을 인식하지 못하는 경우가 많다고 볼 수 있다.

# 그래프 만들기
reason1_data
## # A tibble: 3 × 4
## # Groups:   health_checkup [1]
##   health_checkup health_satisfaction_sum     n health_satisfaction_pct
##            <dbl> <chr>                   <int>                   <dbl>
## 1              0 low                       276                    80.7
## 2              0 medium                     51                    14.9
## 3              0 high                       15                     4.4
ggplot(data = reason1_data, aes(x = '', y = health_satisfaction_pct, fill = health_satisfaction_sum)) +
  geom_bar(stat = 'identity', color = "white") +
  geom_text(aes(label = paste0(round(health_satisfaction_pct, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 5) +
  scale_fill_discrete(limits = c("high","medium","low" )) +
  scale_fill_manual(values = c("high" = "lightcyan2", 
                               "medium" = "gray",  
                               "low"  = "skyblue")) +
  theme_void() +
  coord_polar('y', start = 0) +
  labs(fill = "건강에 대한 관심", 
       title = "(이유1) 건강에 대한 관심 저하")
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.

4-2-3. (이유 2) 경제적 문제

4-2-3-1. 건강검진 여부와 대학생의 근로 현황

결과를 비교해 보면 건강검진 미수검자 중 비근로자가 차지하는 비율은 69.9%로 상당히 높지만, 수검자 중 비근로자가 차지하는 비율은 49.1%로 비교적 낮을 것을 알 수 있다. 근로자는 경제적 여유가 상대적으로 더 있어 건강검진을 받을 가능성이 높고, 비근로자는 경제적 제약 때문에 건강검진을 받지 못할 가능성이 크다고 생각한다.

# 그래프 만들기
ggplot(data = reason2_data1, aes(x = health_checkup, y = pct, fill = work_type_sum)) +
  geom_col(color = "white") +
  coord_flip() +
  scale_x_discrete(limits = c(0, 1))+
  geom_text(aes(label = paste0(round(pct, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 5) +
  scale_fill_manual(values = c("no" = "gray",  
                               "yes"  = "skyblue")) +
  labs(x = "건강검진 수검 여부",
       fill = "근로 여부", 
       title = "(이유2) 건강검진 여부와 대학생의 근로 현환")
## Warning in scale_x_discrete(limits = c(0, 1)): Continuous limits supplied to discrete scale.
## ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?

4-2-3-2. 건강검진 여부와 근로자의 임금 수준

근로자 중 건강검진 수검자의 경우 고임금자가 45.2%로 가장 높은 비율을 차지했다. 이는 경제적으로 여유가 있는 사람들이 건강검진을 받을 가능성이 높다는 것을 시사하여, 보통 임금과 저임금자의 비율도 상당히 있으나, 고임금자가 압도적으로 많았다. 건강검진 미수검자의 경우 고임금자의 비율이 16.7%로 낮았으나, 보통 임금 자가 49.1%, 저임금자가 34.3%로, 경제적 여유가 적을수록 건강검진을 받지 않는 경향이 있었다. 특히 저임금자의 비율이 수검자에 비해 크게 높아, 경제적 이유가 건강검진 미수검의 중요한 요인임을 나타낸다.

# 그래프 만들기
ggplot(data = reason2_data2, aes(x = health_checkup, 
                                 y = pct, 
                                 fill = factor(month_wage_sum,levels = c("high", 
                                                                    "ave", 
                                                                   "low")))) +
  geom_col(color = "white") +
  coord_flip() +
  scale_x_discrete(limits = c(0, 1))+
  geom_text(aes(label = paste0(round(pct, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 5) +
  scale_fill_manual(values = c("low" = "deepskyblue",
                               "ave" = "gray",  
                               "high"  = "skyblue")) +
  labs(x = "건강검진 수검 여부",
       fill = "일한달의 월 평균 임금 수준", 
       title = "(이유2) 건강검진 여부와 근로자의 임금 수준")
## Warning in scale_x_discrete(limits = c(0, 1)): Continuous limits supplied to discrete scale.
## ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?

4-2-3-3. 건강검진 여부와 비근로자의 가족 수입 만족도

비근로자 중 건강검진 수검자의 경우 가족 수입 만족도가 높은 사람이 86.2%로 비근로자라도 가족의 경제적 상황이 여유로우면 건강검진을 받는 경향이 높다는 것을 시사한다. 건강검진 미수검자의 경우 가족 수입 만족도가 높은 사람이 90.8%로 더 높은 비율을 차지했다. 이는 경제적 여유와 건강검진 수검 사이의 직접적인 상관관계를 완전히 설명하지 못할 수도 있음을 나타내며, 경제적 여유가 있어도 건강검진을 받지 않는 다른 이유들이 있을 수 있다고 생각한다.

# 그래프 만들기
ggplot(data = reason2_data3, aes(x = health_checkup, 
                                 y = pct, 
                                 fill = income_satisfaction_sum)) +
  geom_col(color = "white") +
  coord_flip() +
  scale_x_discrete(limits = c(0, 1))+
  geom_text(aes(label = paste0(round(pct, 1), "%")),
            position = position_stack(vjust = 0.5),
            size = 5) +
  scale_fill_manual(values = c("low" = "gray",
                               "high"  = "skyblue")) +
  labs(x = "건강검진 수검 여부",
       fill = "가족 수입 만족도", 
       title = "(이유2) 건강검진 여부와 비근로자의 가족 수입 만족도")
## Warning in scale_x_discrete(limits = c(0, 1)): Continuous limits supplied to discrete scale.
## ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?

5. 결론

이번 분석 보고서를 통해 한국 대학생들의 건강 상태와 건강검진 수검 현황, 그리고 건강검진 미수검 이유에 대한 종합적인 이해를 얻을 수 있었다.

대학생의 건강 의식이 건강검진 수검에 큰 영향을 미치며, 건강 의식이 높은 학생들이 예방적 건강관리의 중요성을 인식하고 있으며, 이 반면에 건강 의식이 낮은 학생들은 건강검진을 받지 않는 경향이 많아 건강관리에 대한 인식이 부족하다는 시사점도 있었다. 또한 건강검진 미수검자의 대다수가 건강에 대한 관심이 부족하거나 건강검진의 필요성을 인식하지 못하는 경우가 많았다.

내가 예상한 이유들도 분석해 본 결과 역시 건강검진 미수검에 큰 영향을 미치고 있다는 것을 알 수 있었다. 건강검진 미수검자 중 건강 만족도가 낮은 비율이 80.7%로 매우 높았으며, 이는 건강에 대한 관심이 부족하거나 검진의 필요성을 인식하지 못하는 경우가 많다는 것을 보여준다. 건강 만족도가 높은 경우에도 건강검진을 받지 않는 사람들이 일부 존재하는데, 이는 자신의 건강 상태에 대해 지나치게 낙관적인 시각을 가질 가능성이 있다고 생각할 수 있다. 경제적 요인도 역시 건강검진 미수검 이유에 대해 큰 영향을 미치고 있다는 것을 확인하였으며, 근로자 중 고임금자가 건강검진을 받을 가능성이 높았고, 비근로자 중 경제적 여유가 부족한 경우 건강검진을 받지 않는 경향이 두드러졌다. 비근로자 중에서도 가족의 경제적 상황이 여유로울 경우 건강검진을 받을 가능성이 높았지만, 가족 수입 만족도가 높아도 건강검진을 받지 않는 경우가 있다는 점에서 경제적 요인 외에도 다른 이유들이 존재할 수 있음을 알 수 있다.

추가적으로 고려해야 할 원인으로 3가지를 제시하도록 한다. 1. 정보의 부족 : 건강검진의 중요성에 대한 정보 부족이나 접근성 문제로 인해 검진을 받지 않는 경우가 있을 수 있으며 대학 내에서 건강검진에 대한 홍보나 교육이 부족할 가능성도 있다. 2. 시간적 제약 : 학업과 관련된 바쁜 일정으로 인해 건강검진을 받지 못하는 경우도 생각할 수 있다. 이는 특히 학업과 아르바이트를 병행하는 학생들에게 더 큰 영향을 미칠 수 있다. 3. 심리적 요인 : 병원 방문에 대한 두려움이나 불안감이 건강검진을 받지 않는 이유가 될 수 있으며, 이는 특히 젊은 세대에서 흔히 나타나는 문제로, 이러한 심리적 요인도 고려해야 한다. 4. 문화적 요인 : 건강검진을 받는 문화적 습관이 부족하며, 가족이나 주변인들이 건강검진을 중요시하지 않는 경우, 본인도 건강검진의 중요성을 느끼지 못할 수 있다.

이번 분석을 통해 대학생들의 건강검진 미수검 이유를 좀 더 명확히 이해할 수 있었으며, 이를 바탕으로 건강검진 수검률을 높이기 위한 다양한 접근 방안을 생각해 봤다. 앞으로는 대학 내에서 건강검진의 중요성에 대한 교육 및 홍보를 강화하고, 경제적 및 시간적 제약을 줄일 수 있는 방안을 마련하는 것이 중요하다고 생각한다.