본문 바로가기
공부/IT-R프로그래밍

R프로그래밍 강좌 - [07] [실습] 데이터 분석 - 한국복지패널 데이터

by 썸볼 2017. 10. 24.

R프로그래밍 강좌 - [07] [실습] 데이터 분석 - 한국복지패널 데이터


1. 데이터 분석

- 앞에서 배운 분석기술을 실습한다.
- 한국 복지패널데이터를 이용해서 분석한다.

※ 한국복지패널데이터:
   한국보건사회연구원에서 가구의 경제 활동을 연구해 정책지원에 반영할 목적으로 발간하는 조사 자료이다.
   2006~2015년까지 전국 7000여 가구를 선정해 매년 추적 조사한 자료로, 경제활동, 생활실태, 복지 요구등
   수천 개 변수에 대한 정보를 담고 있다.

(1) 데이터 준비
- 제공된 Koweps_hpc10_2015_beta1.sav 파일을 testR프로젝트 폴더에 넣는다.
- 위 파일은 2016년에 발간된 한국복지패널데이터로, 6,914가구의 16,664명에 대한
  정보를 담고 있다.
- 한국복지패널 사이트 회원가입하면 데이터를 무료로 다운 가능하며, 상용 통계분석 소프트웨어(SPASS, SAS, STATA)
  전용파일로 제공된다.


(2) 데이터 R로 불러오기

1) 패키지 설치 및 로드
- 실습에 사용할 복지패널데이터는 통계분석 소프트웨어 SPSS 전용파일이다.
- foreign 패키지의 함수를 이용하여 SPSS, SAS, STATA등 통계분석 소프트웨어 파일을 불러올수 있다.


install.packages("foreign")  # foreign 패키지 설치
 
library(foreign)             # SPSS 파일 로드
library(dplyr)               # 전처리
library(ggplot2)             # 시각화
library(readxl)              # 엑셀 파일 불러오기

 

2) R의 데이터프레임으로 데이터 가져오기

# 데이터 불러오기
raw_welfare <- read.spss(file = "Koweps_hpc10_2015_beta1.sav",
                         to.data.frame = T)


# 복사본 만들기
welfare <- raw_welfare
 
 

3) 데이터 검토하기


head(welfare)
tail(welfare)
View(welfare)
dim(welfare)
str(welfare)
summary(welfare)


4) 알기쉬운 변수명으로 변경하기
- 규모가 큰 자료는 보통 데이터의 특성을 설명해 놓은 코드북(Codebook)과 함께 제공됩니다.
Koweps_Codebook.xlsx는 제공하는 코드북입니다.
- 코드북을 보면 데이터의 특성을 알수 있으므로 어떤 변수를 활용할지 분석방향에 도움을
  받을 수 있다.

- 분석에 사용할 7개의 변수의 이름을 쉬운 단어로 변경한다.


 
welfare <- rename(welfare,
                  gender= h10_g3,             # 성별
                  birth = h10_g4,               # 태어난 연도
                  marriage = h10_g10,        # 혼인 상태
                  religion = h10_g11,          # 종교
                  income = p1002_8aq1,     # 월급
                  code_job = h10_eco9,      # 직종 코드
                  code_region = h10_reg7)  # 지역 코드
 



(3) 데이터 분석 절차

1 단계 : 변수 검토 및 전처리
- 분석에 사용할 변수들을 전처리한다.
- 변수의 특성을 파악하고 이상치를 정제한 다음 파생변수 생성한다.
- 전처리는 분석에 활용할 변수 각각에 대해 실시한다.
- 성별에 따른 월급차이를 분석한다면 성별 및 월급 두변수 각각 전처리한다.


2 단계 : 변수 간 관계 분석
- 전처리가 완료되며면 본격적으로 변수 간 관계를 파악하는 분석을 한다.
- 데이터 요약표를 만든 후 분석 결과를 쉽게 이해할 수 있는 그래프를 생성한다.



2. 성별에 따른 월급 차이 
(1) 1단계 - 변수 검토 및 전처리
  1)성별 변수 검토 및 전처리
  - class()로 성별의 변수 타입을 파악한다.
  - table()로 각범주(남,여)에 몇명인지 확인한다.
  - numeric 타입, 1,2로 구성 


  class(welfare$gender)
  table(welfare$gender)

  - 코드북확인하기(
 Koweps_Codebook.xlsx)
  - 성별의 구분이 1은남자, 2는 여자, 9는 모름/무응답 이다.
  - 9의 값은 성별이 확인이 안되므로 결측값(NA)처리한다.


 # 이상치 확인 -> 현재의 데이터는 9는 없다.

table(welfare$gender)
 
# 이상치 결측 처리-> 만약 존재한다면 ifelse()로 9를 NA로 결측처리한다.
welfare$gender <- ifelse(welfare$gender == 9, NA, welfare$gender)
 
# 결측치 확인
table(is.na(welfare$gender))


 - 성별 변수의 값이 1,2대신 이해하기 쉽게 male,female로 변경한다.

# 성별 항목 이름 부여
welfare$gender <- ifelse(welfare$gender == 1, "male", "female")
 

- 변경된 값을 table(),gplot()로 확인하다.

table(welfare$gender)
qplot(welfare$gender)






  2)월급 변수 검토 및 전처리
  - 코드북의 월급은 1만원단위이며, income(월급)을 검토하고 분포를 확인하다.
  - 연속 변수는 table()(범주가 많을시 데이터항목이 많아진다)보다 summary()로 요약 통계량을 확인해서 특징을 파악한다.
  - 
qplot()를 이용해서 분포를 그래프로 확인한다.

> class(welfare$income)

[1] "numeric"
 
> summary(welfare$income)
   Min. 1st Qu.  Median   Mean   3rd Qu.    Max.    NA's 
    0.0   122.0   192.5      241.6   316.6     2400.0   12030 
 

  - 0~2400만원 사이값을 지니며, 중값값이 평균값보다 작으므로 낮은쪽에 치우쳐 있다.
  -122~316만원 사이값에 가장 많이 분포되어있다.
 
  - gplot()는 최대값까지 출력되는데 대다수 차지하는 0~1000까지의 값이 잘 안나옴으로 
    x축값을 0~1000값으로 조정을 한다.


class(welfare$income)

summary(welfare$income)
qplot(welfare$income)  #대다수 차지하는 0~1000까지의 값이 잘 안나옴
qplot(welfare$income) + xlim(0, 1000)


 


 - 코드북의 월급은 1~9998사이값을 가지며, 모름/무응답은 9999 이다.
 - summary()로 이상치를 확인해 보면 최소값이 0이므로 0과 9999에 대해서 결측값 처리를 한다.


> summary(welfare$income)
 
   Min. 1st Qu.  Median   Mean   3rd Qu.    Max.    NA's 
    0.0   122.0   192.5      241.6   316.6      2400.0   12030 
 
> welfare$income <- ifelse(welfare$income %in% c(0, 9999), NA, welfare$income)
 
> table(is.na(welfare$income))
 
FALSE  TRUE 
 4620 12044 
 


  
(2) 2단계 - 변수 간 관계 분석
 1) 성별 월급 평균표 생성
 - 두변수의 전처리 작업이후 변수 간 관계를 분석한다.


> gender_income <- welfare %>%
+   filter(!is.na(income)) %>%
+   group_by(gender) %>%
+   summarise(mean_income = mean(income
))
> gender_income
# A tibble: 2 x 2
  gender mean_income
   <chr>       <dbl>
1 female    163.2471
2   male    312.2932



 2) 그래프 생성
 - 분석결과를 그래프로 만들어 쉽게 이해할 수 있도록 한다.
 - 막대그래프는 
+ geom_col() 추가로 만들수 있다.

ggplot(data = gender_income, aes(x = gender, y = mean_income)) + geom_col()





3. 나이와 월급의 관계 

(1) 1단계 - 변수 검토 및 전처리 
 1) 월급은 전처리가 완료되었으므로 나이의 전처리만 한다.
  - 나이변수는 태어난연도를 이용해서 만들어야 한다.
  - 태어난 연도 검토한다.


> class(welfare$birth)
[1] "numeric"
> summary(welfare$birth)
   Min. 1st Qu.  Median   Mean  3rd Qu.    Max. 
   1907    1946    1966    1968    1988      2014 
> qplot(welfare$birth)


- 코드북을 보면 1900년도~2014년도 사이의 값을 지니며, 모름/무응답은 9999  이다
- 이상치 확인후 만약 존재한다면 전처리 작업을 해줘야 하다.
- 현재 데이터는 이상치(9999)나 NA(결측치)가 없다.


# 이상치 확인->없음
summary(welfare$birth) 
 
# 결측치 확인->없음
table(is.na(welfare$birth))
 
# 이상치 결측 처리->없으므로 생략 가능
welfare$birth <- ifelse(welfare$birth == 9999, NA, welfare$birth)
table(is.na(welfare$birth))


- 태어난 연도를 이용해 파생변수를 만든다.
- 2015년도에 조사한 내용이므로  나이=  2015-태어난연도 를 하면된다.


> welfare$age <- 2015 - welfare$birth + 1
> summary(welfare$age)
   Min. 1st Qu.  Median  Mean  3rd Qu.  Max. 
   2.00   28.00   50.00    48.43    70.00    109.00 
> qplot(welfare$age)
 


(2) 2단계 - 변수 간 관계 분석 
 1) 나이별 월급 평균표 생성

> age_income <- welfare %>%  #기본데이터에서
+   filter(!is.na(income)) %>%    #월급의 결측치가 없는 데이터만
+   group_by(age) %>%           #나이별 그룹으로 
+   summarise(mean_income = mean(income))  #월급 평균을 구한다.
> head(age_income)
# A tibble: 6 x 2
    age mean_income
  <dbl>       <dbl>
1    20    121.3000
2    21    105.5185
3    22    130.0923
4    23    141.7157
5    24    134.0877
6    25    144.6559



 2) 그래프 생성
- x축 나이, y축 월급으로 나이에 따른 월급의 변화를 선그래프로 생성한다.


  ggplot(data = age_income, aes(x = age, y = mean_income)) + geom_line()

 




4. 연령대에 따른 월급 차이 
(1) 1단계 - 변수 검토 및 전처리 
- 연령대 변수는 앞에서 만든 나이변수로 만들 수 있다.
- 초년(30미만),중년(30~59세),노년(60세이상)이란 범주를 만들고 각 범주에 몇명이 있는지 확인한다.


> welfare <- welfare %>%
+   mutate(ageg = ifelse(age < 30, "young",
+                        ifelse(age <= 59, "middle", "old")))
> table(welfare$ageg)
 
middle    old  young 
  6049   6281   4334 
> qplot(welfare$ageg)
 


(2) 2단계 - 변수 간 관계 분석 

 1) 연련대별 월급 평균표 생성

> ageg_income <- welfare %>%   #기본데이터에서
+   filter(!is.na(income)) %>%       #월급에서 결측치없이
+   group_by(ageg) %>%            #연령대별로
+   summarise(mean_income = mean(income)) #평균급여를 생성한다.
 
> ageg_income
# A tibble: 3 x 2
    ageg mean_income
   <chr>       <dbl>
1 middle    281.8871
2    old    125.3295
3  young    163.5953
 


 2) 그래프 생성

ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) + geom_col()



- 연령대별의 나이순으로 막대를 정렬하려면 
 scale_x_discrete(limits = c("young", "middle", "old")) 지정한다.

  ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) +
  geom_col() +
  scale_x_discrete(limits = c("young", "middle", "old"))


   



5. 연령대 및 성별 월급 차이 
(1) 1단계 - 변수 검토 및 전처리 
  - 연령대, 성별, 월급 검토 및 전처리 앞에서 완료



(2) 2단계 - 변수 간 관계 분석 
 1) 연령대 및 성별 월급 평균표 생성
 

gender_income <- welfare %>%
+   filter(!is.na(income)) %>%
+   group_by(ageg, gender) %>%                 #연령대별 및 성별 그룹으로
+   summarise(mean_income = mean(income))  #월급 평균을 생성
> gender_income
# A tibble: 6 x 3
# Groups:   ageg [?]
    ageg gender mean_income
   <chr>  <chr>       <dbl>
1 middle  female   187.97552
2 middle    male   353.07574
3    old   female    81.52917
4    old     male   173.85558
5  young  female   159.50518
6  young   male   170.81737



 2) 그래프 생성
- 연령대 별로 표시되므로 x축에 ageg를 지정하며 성별에 따라 다른 색으로 표현되도록
  fill = gender를 명시합니다.
- 연령대 순으로 정렬을 위해서
 scale_x_discrete(limits = c("young", "middle", "old"))  지정한다.

  ggplot(data = gender_income, aes(x = ageg, y = mean_income, fill = gender)) +
  geom_col() +
  scale_x_discrete(limits = c("young", "middle", "old"))






- 독립된 막대로 성별을 표시하기 위해서   geom_col(position = "dodge")

  ggplot(data = gender_income, aes(x = ageg, y = mean_income, fill = gender)) +

  geom_col(position = "dodge") +
  scale_x_discrete(limits = c("young", "middle", "old"))


 
3) 연령대로 구분하지 않고 나이 및 성별 월급 평균표 작성하여 그래프 그리기


> gender_age <- welfare %>%
+   filter(!is.na(income)) %>%
+   group_by(age, gender) %>%
+   summarise(mean_income = mean(income))
 
> head(gender_age)
# A tibble: 6 x 3
# Groups:   age [3]
    age gender mean_income
  <dbl>  <chr>       <dbl>
1    20 female    147.4500
2    20   male     69.0000
3    21 female    106.9789
4    21   male    102.0500
5    22 female    139.8547
6    22   male    118.2379
 
> ggplot(data = gender_age, aes(x = age, y = mean_income, col = gender)) + geom_line()



 

 


6. 직업별 월급 차이 
(1) 1단계 - 변수 검토 및 전처리 
1) 월급의 변수검토 및 전처리를 되어있으므로 직업에 대한 변수 검토 및 전처리를 하나.
 - code_job변수는 직업분류코드이다 이변수를 파악하여 직업 명칭 변수를 만든다.


class(welfare$code_job)
table(welfare$code_job)


- 코드북(Koweps_Codebook.xlsx)의 직종코드 sheet 에서 직업 명칭을 가져온다.
- left_join()으로 job변수를 welfare에 결합하다. 공통변수 code_job을 기준으로 결합한다.



> library(readxl) #엑셀에서 읽어오는 함수가 들어있는 패키지 로등
 
> list_job <- read_excel("Koweps_Codebook.xlsx", col_names = T, sheet = 2) #엑셀파일 읽어오기
 
> head(list_job)
# A tibble: 6 x 2
  code_job                                 job
     <dbl>                               <chr>
1      111 의회의원 고위공무원 및 공공단체임원
2      112                        기업고위임원
3      120             행정 및 경영지원 관리자
4      131       연구 교육 및 법률 관련 관리자
5      132                 보험 및 금융 관리자
6      133        보건 및 사회복지 관련 관리자
 
> dim(list_job)
[1] 149   2
 
> welfare <- left_join(welfare, list_job, id = "code_job")  #id 기준으로 welfare데이터에 직업 분류를 새로운 열로 조인
Joining, by = "code_job"
 
> welfare %>%
+   filter(!is.na(code_job)) %>%
+   select(code_job, job) %>%
+   head(10)
   code_job                                job
1       942                   경비원 및 검표원
2       762                             전기공
3       530 방문 노점 및 통신 판매 관련 종사자
4       999        기타 서비스관련 단순 종사원
5       312                    경영관련 사무원
6       254             문리 기술 및 예능 강사
7       510                        영업 종사자
8       530 방문 노점 및 통신 판매 관련 종사자
9       286   스포츠 및 레크레이션 관련 전문가

10      521                   매장 판매 종사자 

 

(2) 2단계 - 변수 간 관계 분석 
 1) 직업별 월급 평균표 만들기

  job_income <- welfare %>%                   
  filter(!is.na(job) & !is.na(income)) %>%         
  group_by(job) %>%
  summarise(mean_income = mean(income))
 
  head(job_income)

 
 2) 월급을 내림차순으로 정렬후 상위10위까지 출력


> top10 <- job_income %>%
+   arrange(desc(mean_income)) %>%
+   head(10)
 
> top10
# A tibble: 10 x 2
                                    job mean_income
                                  <chr>       <dbl>
 1      금속 재료 공학 기술자 및 시험원    845.0667
 2                      의료진료 전문가    843.6429
 3  의회의원 고위공무원 및 공공단체임원    750.0000
 4                  보험 및 금융 관리자    726.1800
 5                     제관원 및 판금원    572.4067
 6              행정 및 경영지원 관리자    563.7633
 7 문화 예술 디자인 및 영상 관련 관리자    557.4667
 8        연구 교육 및 법률 관련 관리자    549.9125
 9        건설 전기 및 생산 관련 관리자    535.8056
10       석유 및 화학물 가공장치 조작원    531.6600


  
3) 그래프 생성
- x축 직업명이 겹쳐 보여 잘 안보이므로 오른쪽으로 90도 회전해서 보기위해 
coord_flip()를 추가한다.

  ggplot(data = top10, aes(x = reorder(job, mean_income), y = mean_income)) +

  geom_col() +
  coord_flip()



- 직업을 하위10위로 정렬하여 그래프로 그려본다.

 

> bottom10 <- job_income %>%

+   arrange(mean_income) %>%
+   head(10)
 
> bottom10
# A tibble: 10 x 2
                            job mean_income
                          <chr>       <dbl>
 1          가사 및 육아 도우미    80.16648
 2              임업관련 종사자    83.33000
 3  기타 서비스관련 단순 종사원    88.22101
 4        청소원 및 환경 미화원    88.78775
 5               약사 및 한약사    89.00000
 6              작물재배 종사자    92.00000
 7     농립어업관련 단순 종사원   101.58125
 8 의료 복지 관련 서비스 종사자   103.52643
 9         음식관련 단순 종사원   107.84511
10         판매관련 단순 종사원   116.82203
 
> ggplot(data = bottom10, aes(x = reorder(job, -mean_income), 
+                             y = mean_income)) +
+   geom_col() + 
+   coord_flip() + 
+   ylim(0, 850)   #하위순위의 월급 평균이 최대100이 안되므로 상위10위비교하기 위해 y축을 지정하였다.



 




7. 성별 직업 빈도 
(1) 1단계 - 변수 검토 및 전처리 
 1) 성별 및 직업의 검토및 전처리 완료됨



(2) 2단계 - 변수 간 관계 분석 
 1) 성별 직업 빈도표 생성
    - 성별로 직업빈도표를 구해 상위 10개 생성


# 남성 직업 빈도 상위 10개 추출

> job_male <- welfare %>%
+   filter(!is.na(job) & gender == "male") %>%
+   group_by(job) %>%
+   summarise(n = n()) %>%
+   arrange(desc(n)) %>%
+   head(10)
 
> job_male
# A tibble: 10 x 2
                        job     n
                      <chr> <int>
 1          작물재배 종사자   640
 2            자동차 운전원   251
 3          경영관련 사무원   213
 4              영업 종사자   141
 5         매장 판매 종사자   132
 6     제조관련 단순 종사원   104
 7    청소원 및 환경 미화원    97
 8 건설 및 광업 단순 종사원    95
 9         경비원 및 검표원    95
10              행정 사무원    92


# 여성 직업 빈도 상위 10개 추출
> job_female <- welfare %>%
+   filter(!is.na(job) & gender == "female") %>%
+   group_by(job) %>%
+   summarise(n = n()) %>%
+   arrange(desc(n)) %>%
+   head(10)
> job_female
# A tibble: 10 x 2
                            job     n
                          <chr> <int>
 1              작물재배 종사자   680
 2        청소원 및 환경 미화원   228
 3             매장 판매 종사자   221
 4         제조관련 단순 종사원   185
 5          회계 및 경리 사무원   176
 6            음식서비스 종사자   149
 7             주방장 및 조리사   126
 8          가사 및 육아 도우미   125
 9 의료 복지 관련 서비스 종사자   121
10         음식관련 단순 종사원   104
 




 2) 그래프 생성

# 남성 직업 빈도 상위 10개 직업
ggplot(data = job_male, aes(x = reorder(job, n), y = n)) +
  geom_col() +
  coord_flip()



 
 
# 여성 직업 빈도 상위 10개 직업
  ggplot(data = job_female, aes(x = reorder(job, n), y = n)) +
  geom_col() +
  coord_flip()








8. 종교 유무에 따른 이혼율 
(1) 1단계 - 변수 검토 및 전처리
 1) 종교변수 검토 및 전처리 


> class(welfare$religion)
[1] "numeric"
 
> table(welfare$religion) #종교있음1, 종교없음2, 모름/무응답9
 
   1    2 
8047    8617 



- 1,2대신 yes,no로 값변경

> welfare$religion <- ifelse(welfare$religion == 1, "yes", "no")
> table(welfare$religion)
 
  no  yes 
8617 8047 
 
> qplot(welfare$religion)   #그래프로 확인



 2) 혼인상태 변수 검토 및 전처리

> class(welfare$marriage)
[1] "numeric"
 
> table(welfare$marriage)
 
   0    1    2    3    4    5    6 
2861 8431 2117  712   84 2433   26 

- marriage코드를 코드북에서 확인하면
0:18세미만, 1: 유배우, 2: 사별,  3:이혼,  4:별거,  5:미혼, 6:기타(사방 등)


# 이혼 여부 변수 만들기
welfare$group_marriage <- ifelse(welfare$marriage == 1, "marriage",
                                            ifelse(welfare$marriage == 3, "divorce", NA))



> table(welfare$group_marriage)
 
 divorce marriage 
     712     8431 
 
> table(is.na(welfare$group_marriage))
 
FALSE  TRUE 
 9143  7521 
 
> qplot(welfare$group_marriage)
 


(2) 2단계 - 변수 간 관계 분석 
 1) 종교 유무에 따른 이혼율표 생성
 - 종교유무 및 결혼 상태별로 나눠 빈도를 구한뒤 각 종교 유무 그룹의 전체 빈도로 나눠 비율을 구한다.
 - 비율은 round()를 이용해서 소수점 첫째 자리까지 표현한다.


religion_marriage <- welfare %>%
  filter(!is.na(group_marriage)) %>%
  group_by(religion, group_marriage) %>%
  summarise(n = n()) %>%
  mutate(tot_group = sum(n)) %>%
  mutate(pct = round(n/tot_group*100, 1))  # 종교유무별 결혼 및 이혼비율


> religion_marriage

# A tibble: 4 x 5
# Groups:   religion [2]
  religion group_marriage     n tot_group   pct
     <chr>          <chr> <int>     <int> <dbl>
1       no        divorce   384      4602   8.3
2       no       marriage  4218      4602  91.7
3      yes        divorce   328      4541   7.2
4      yes       marriage  4213      4541  92.8


- 이혼율을 구하는 것이므로 이혼을 추출 한다.


# 이혼 추출
  divorce <- religion_marriage %>%
  filter(group_marriage == "divorce") %>% 
  select(religion, pct)


divorce
# A tibble: 2 x 2
# Groups:   religion [2]
  religion   pct
     <chr> <dbl>
1       no   8.3
2      yes   7.2


 

 2) 그래프 생성

ggplot(data = divorce, aes(x = religion, y = pct)) + geom_col()





3) 연령대 및 종교 유무에 따른 이혼율 분석하기
- 연령대별 이혼율 표만들기


 ageg_marriage <- welfare %>%
  filter(!is.na(group_marriage)) %>%
  group_by(ageg, group_marriage) %>%
  summarise(n = n()) %>%
  mutate(tot_group = sum(n)) %>%
  mutate(pct = round(n/tot_group*100, 1))


> ageg_marriage
# A tibble: 6 x 5
# Groups:   ageg [3]
    ageg group_marriage     n tot_group   pct
   <chr>          <chr> <int>     <int> <dbl>
1 middle        divorce   437      4918   8.9
2 middle       marriage  4481      4918  91.1
3    old        divorce   273      4165   6.6
4    old       marriage  3892      4165  93.4
5  young        divorce     2        60   3.3
6  young       marriage    58        60  96.7



- 연령대별 이혼율 그래프를 생성한다.
   

# 초년 제외, 이혼 추출
 ageg_divorce <- ageg_marriage %>% 
  filter(ageg != "young" & group_marriage == "divorce") %>% 
  select(ageg, pct)


> ageg_divorce
# A tibble: 2 x 2
# Groups:   ageg [2]
    ageg   pct
   <chr> <dbl>
1 middle   8.9
2    old   6.6


# 그래프 만들기
ggplot(data = ageg_divorce, aes(x = ageg, y = pct)) + geom_col()



- 연령대(ageg)별 종교 유무(religion)에 따른 이혼율 표 생성


# 연령대, 종교유무, 결혼상태(group_marriage)별 비율표 만들기
  ageg_religion_marriage <- welfare %>%
  filter(!is.na(group_marriage) & ageg != "young") %>%
  group_by(ageg, religion, group_marriage) %>%
  summarise(n = n()) %>%
  mutate(tot_group = sum(n)) %>%
  mutate(pct = round(n/tot_group*100, 1))   #비율

> ageg_religion_marriage
# A tibble: 8 x 6
# Groups:   ageg, religion [4]
    ageg religion group_marriage     n tot_group   pct
   <chr>    <chr>          <chr> <int>     <int> <dbl>
1 middle       no        divorce   260      2681   9.7
2 middle       no       marriage  2421      2681  90.3
3 middle      yes        divorce   177      2237   7.9
4 middle      yes       marriage  2060      2237  92.1
5    old       no        divorce   123      1884   6.5
6    old       no       marriage  1761      1884  93.5
7    old      yes        divorce   150      2281   6.6
8    old      yes       marriage  2131      2281  93.4


# 연령대 및 종교 유무별 이혼율 표 만들기
df_divorce <- ageg_religion_marriage %>%
  filter(group_marriage == "divorce") %>% 
  select(ageg, religion, pct)
 
> df_divorce
# A tibble: 4 x 3
# Groups:   ageg, religion [4]
    ageg religion   pct
   <chr>    <chr> <dbl>
1 middle       no   9.7
2 middle      yes   7.9
3    old       no   6.5
4    old      yes   6.6



- 연령대별 종교 유무에 따른 이혼율  그래프 생성한다.
  종교유무별 막대색깔 다르게 표현을 위해
 fill = religion
  geom_col()의 position='dodge'로 막대그래프를 분리한다.


  ggplot(data = df_divorce, aes(x = ageg, y = pct, fill = religion )) +

  geom_col(position = "dodge")

 





9. 지역별 연령대 비율 
(1) 1단계 - 변수 검토 및 전처리
 1) 지역 변수 검토 및 전처리
  - code_region 변수의 값은 7개로 나누어진 지역 코드이다.
  - 코드북의 내용을 참조하여 지역명 변수를 추가한다.


class(welfare$code_region)

table(welfare$code_region)
 
# 지역 코드 목록 만들기
list_region <- data.frame(code_region = c(1:7),
                          region = c("서울",
                                     "수도권(인천/경기)",
                                     "부산/경남/울산",
                                     "대구/경북",
                                     "대전/충남",
                                     "강원/충북",
                                     "광주/전남/전북/제주도"))



> list_region

  code_region                region
1           1                  서울
2           2     수도권(인천/경기)
3           3        부산/경남/울산
4           4             대구/경북
5           5             대전/충남
6           6             강원/충북
7           7 광주/전남/전북/제주도

 

 
# 지역명 변수 추가 
welfare <- left_join(welfare, list_region, id = "code_region")

> welfare %>%
+   select(code_region, region) %>%
+   head
 
  code_region region
1           1   서울
2           1   서울
3           1   서울
4           1   서울
5           1   서울
6           1   서울

 


(2) 2단계 - 변수 간 관계 분석 
 1) 지역별 연령대 비율표 만들기

 region_ageg <- welfare %>%

  group_by(region, ageg) %>%
  summarise(n = n()) %>%
  mutate(tot_group = sum(n)) %>% 
  mutate(pct = round(n/tot_group*100, 2))
 
> head(region_ageg)
# A tibble: 6 x 5
# Groups:   region [2]
                 region   ageg     n tot_group   pct
                 <fctr>  <chr> <int>     <int> <dbl>
1             강원/충북 middle   417      1257 33.17
2             강원/충북    old   555      1257 44.15
3             강원/충북  young   285      1257 22.67
4 광주/전남/전북/제주도 middle   947      2922 32.41
5 광주/전남/전북/제주도    old  1233      2922 42.20
6 광주/전남/전북/제주도  young   742      2922 25.39



 2) 그래프 생성
- 연령대 비율 막대를 서로 다른색으로 표현하도록 aes의 
fill = ageg 지정한다.
- 지역별로 비교가 쉽도록 coord_flip()를 추가해서 오른쪽으로 90도 회전한다.


 ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
 geom_col() +
 coord_flip()


 3) 노년층 비율 높은 순으로 막대 정렬하기

# 노년층 비율 오름차순 정렬
list_order_old <- region_ageg %>%
  filter(ageg == "old") %>%
  arrange(pct)

 
> list_order_old
# A tibble: 7 x 5
# Groups:   region [7]
                 region  ageg     n tot_group   pct
                 <fctr> <chr> <int>     <int> <dbl>
1     수도권(인천/경기)   old  1109      3711 29.88
2                  서울   old   805      2486 32.38
3             대전/충남   old   527      1467 35.92
4        부산/경남/울산   old  1124      2785 40.36
5 광주/전남/전북/제주도   old  1233      2922 42.20
6             강원/충북   old   555      1257 44.15
7             대구/경북   old   928      2036 45.58


- 지역명이 노년층 비율순으로 정렬된 order변수를 활용하여 그래프 생성한다.
# 지역명 순서 변수 만들기
order <- list_order_old$region
order
[1] 수도권(인천/경기)     서울                  대전/충남             부산/경남/울산       
[5] 광주/전남/전북/제주도 강원/충북             대구/경북            
7 Levels: 강원/충북 광주/전남/전북/제주도 대구/경북 대전/충남 부산/경남/울산 ... 수도권(인천/경기)
 

- 막대가 노년층 비율이 높은순으로   
  ggplot(data = region_ageg, aes(x = region,  y = pct, fill = ageg)) +
  geom_col() +
  coord_flip() +
  scale_x_discrete(limits = order)




 4) 연령대 순으로 막대 색깔 나열하기
- 초년, 중년, 노년의 연령대순으로 나열한다.
- 연령대 별 막대그래프의 색상을 순서대로 나열하기 위해 fill= 변수의범주(ageg) 해야한다.
- ageg는 범주가 아니므로 factor()로 factor로 변환하고 level파라미터를 이용해 순서를 지정한다.


> class(region_ageg$ageg)
[1] "character"
> levels(region_ageg$ageg)
NULL
> region_ageg$ageg <- factor(region_ageg$ageg,       #factor로 변환 및 level지정
+                            level = c("old", "middle", "young"))
> class(region_ageg$ageg)
[1] "factor"
> levels(region_ageg$ageg)
[1] "old"    "middle" "young" 


- 그래프 생성


  ggplot(data = region_ageg, aes(x = region,  y = pct, fill = ageg)) +
  geom_col() +
  coord_flip() +
  scale_x_discrete(limits = order)
 

댓글