본문 바로가기
데이터 분석/쉽게 배우는 R 데이터 분석

한국복지패널데이터

by BLOSSOMED_IN 2021. 1. 11.
한국복지패널데이터

한국복지패널 데이터

데이터 준비하기

깃허브(http://bit.ly/2rvvixu)에서에서){.uri} 2016년에 발간된 복지패널 데이터 다운로드

패키지 설치 및 로드

#install.packages("foreign")
library(foreign)
#install.packages("dplyr")
library(dplyr)
#install.packages("ggplot2")
library(ggplot2)
#install.packages("readxl")
library(readxl)

데이터 불러오기

raw_welfare = read.spss(file = "C:/rproject/doit_welfare/데이터/Koweps_hpc10_2015_beta1.sav", to.data.frame = T)
to.data.frame = T는 SPSS 파일을 데이터 프레임 형태로 변환하는 기능

복사본 만들기

welfare = raw_welfare

데이터 검토하기

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

변수명 바꾸기

welfare = rename(welfare,
                 sex = h10_g3, #성별
                 birth = h10_g4, #태어난 연도
                 marriage = h10_g10, #혼인 상태
                 religion = h10_g11, #종교
                 income = p1002_8aq1, #월급급
                 code_job = h10_eco9, #직업_코드
                 code_region = h10_reg7) #지역_코드
rename() -> 변수명을 변경하는 함수

데이터 분석 절차

1단계 : 변수 검토 및 전처리
2단계 : 변수 간 관계 분석

성별에 따른 월급 차이

변수 검토하기

class(welfare$sex)
## [1] "numeric"
table(welfare$sex)
## 
##    1    2 
## 7578 9086
class() -> 변수의 타입파악
table() -> 각 범주에 몇 명이 있는지 파악

전처리(데이터 코드북 확인) - 이상치 확인

table(welfare$sex) 
## 
##    1    2 
## 7578 9086

이상치 결측 처리

welfare$sex = ifelse(welfare$sex == 9, NA, welfare$sex)

결측치 확인

table(is.na(welfare$sex))
## 
## FALSE 
## 16664

성별 항목별 이름 부여

welfare$sex = ifelse(welfare$sex == 1, "male", "female")
table(welfare$sex)
## 
## female   male 
##   9086   7578
qplot(welfare$sex)

월급 변수 검토하기

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
qplot(welfare$income)

qplot(welfare$income) + xlim(0, 1000)

xlim()함수를 활용하여 0~1000까지 표현하여 분포가 더 잘 드러나도록 표현

전처리 - 이상치 확인

summary(welfare$income) # 결측치가 12,030개 존재
##    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)
%in% ? -> 백터 내 특정값 포함 여부 확인하는 연산자

결측치 확인

table(is.na(welfare$income))
## 
## FALSE  TRUE 
##  4620 12044

성별에 따른 월급 차이 분석하기

성별 월급 평균표 만들기

sex_income = welfare %>% 
  filter(!is.na(income)) %>%
  group_by(sex) %>%
  summarise(mean_income = mean(income))
sex_income
## # A tibble: 2 x 2
##   sex    mean_income
##   <chr>        <dbl>
## 1 female        163.
## 2 male          312.
#그래프 만들기
ggplot(data = sex_income, aes(x = sex, y = mean_income)) + geom_col()

나이와 월급의 관계

변수 검토하기

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)

전처리

# 이상치 확인
summary(welfare$birth)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1907    1946    1966    1968    1988    2014
# 결측치 확인
table(welfare$birth)
## 
## 1907 1911 1914 1915 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 
##    1    1    1    1    1    3    5   10   13   19   27   22   38   34   52   57 
## 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 
##   65   94  121  174  160  195  224  256  269  279  300  293  261  354  264  232 
## 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 
##  196  231  269  191  208  207  154  224  169  196  201  209  194  199  204  248 
## 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 
##  216  219  205  205  214  193  199  229  221  244  254  230  240  256  229  203 
## 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 
##  189  193  205  185  176  182  158  110  119  130   92  139  135  132  169  149 
## 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 
##  122  167  179  189  198  193  209  217  190  186  171  168  146  168  154  161 
## 2009 2010 2011 2012 2013 2014 
##  131  151  153  117  117   31
# 이상치 결측 처리
welfare$birth = ifelse(welfare$birth == 9999, NA, welfare$birth)
table(is.na(welfare$birth))
## 
## FALSE 
## 16664

파생변수 만들기 - 나이

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)

나이와 월급에 관계 분석하기

나이에 따른 월급 평균표 만들기

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.
## 2    21        106.
## 3    22        130.
## 4    23        142.
## 5    24        134.
## 6    25        145.
# 그래프 만들기
ggplot(data = age_income, aes(x = age, y = mean_income)) + geom_line()

연령대에 따른 월급 차이

연령대 변수 검토 및 전처리 파생변수 만들기 - 연령대

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)

mutate()함수는 파생변수를 만드는 함수

연령대에 따른 월급차이 분석하기

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        282.
## 2 old           125.
## 3 young         164.
## 그래프 만들기
ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) + geom_col()

# ggplot은 알파벳 순으로 정렬 -> 나이순으로 재정렬
ggplot(data = ageg_income, aes(x = ageg, y = mean_income)) + geom_col() +
  scale_x_discrete(limits = c("young", "middle", "old"))

scale_x_discrete(limits = c())는 범주 순서를 지정할 수 있다.

연령대 및 성별 월급차이 분석하기

연령대 및 성별 월급 평균표 만들기

sex_income = welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(ageg, sex) %>% 
  summarise(mean_income = mean(income))
sex_income
## # A tibble: 6 x 3
## # Groups:   ageg [3]
##   ageg   sex    mean_income
##   <chr>  <chr>        <dbl>
## 1 middle female       188. 
## 2 middle male         353. 
## 3 old    female        81.5
## 4 old    male         174. 
## 5 young  female       160. 
## 6 young  male         171.
# 그래프 만들기
ggplot(data = sex_income, aes(x = ageg, y = mean_income, fill = sex)) + 
  geom_col() +
  scale_x_discrete(limits = c("young", "middle", "old"))

# geom_col() position 피라미터를 "dodge"로 설정해 막대를 분리해보자.
ggplot(data = sex_income, aes(x = ageg, y = mean_income, fill = sex)) + 
  geom_col(position = "dodge") +
  scale_x_discrete(limits = c("young", "middle", "old"))

나이 및 성별 월급차이 분석하기

성별 연령별 월급 평균표 만들기

sex_age = welfare %>% 
  filter(!is.na(income)) %>% 
  group_by(age, sex) %>% 
  summarise(mean_income = mean(income))
sex_age
## # A tibble: 134 x 3
## # Groups:   age [69]
##      age sex    mean_income
##    <dbl> <chr>        <dbl>
##  1    20 female        147.
##  2    20 male           69 
##  3    21 female        107.
##  4    21 male          102.
##  5    22 female        140.
##  6    22 male          118.
##  7    23 female        139.
##  8    23 male          153.
##  9    24 female        126.
## 10    24 male          158.
## # ... with 124 more rows
head(sex_age)
## # A tibble: 6 x 3
## # Groups:   age [3]
##     age sex    mean_income
##   <dbl> <chr>        <dbl>
## 1    20 female        147.
## 2    20 male           69 
## 3    21 female        107.
## 4    21 male          102.
## 5    22 female        140.
## 6    22 male          118.
## 그래프 만들기
ggplot(data = sex_age, aes(x = age, y = mean_income, col = sex)) + geom_line()

직업별 월급 차이

직업변수 검토 및 전처리하기

class(welfare$code_job)
## [1] "numeric"
table(welfare$code_job)
## 
##  111  120  131  132  133  134  135  139  141  149  151  152  153  159  211  212 
##    2   16   10   11    9    3    7   10   35   20   26   18   15   16    8    4 
##  213  221  222  223  224  231  232  233  234  235  236  237  239  241  242  243 
##    3   17   31   12    4   41    5    3    6   48   14    2   29   12    4   63 
##  244  245  246  247  248  251  252  253  254  259  261  271  272  273  274  281 
##    4   33   59   77   38   14  111   24   67  109    4   15   11    4   36   17 
##  283  284  285  286  289  311  312  313  314  320  330  391  392  399  411  412 
##    8   10   26   16    5  140  260  220   84   75   15    4   13   87   47   12 
##  421  422  423  429  431  432  441  442  510  521  522  530  611  612  613  620 
##  124   71    5   14   20   33  154  197  192  353    5  106 1320   11   40    2 
##  630  710  721  722  730  741  742  743  751  752  753  761  762  771  772  773 
##   20   29   30   22   16   27    3   34   34    5   49   69   27   11   61   86 
##  774  780  791  792  799  811  812  819  821  822  823  831  832  841  842  843 
##    7   17    5   21   45   16    1    6    9    9   23    5   17   32   10    4 
##  851  852  853  854  855  861  862  863  864  871  873  874  875  876  881  882 
##   19   13    7   33    9    3   14   17   31    2  257   34   37    2    2    3 
##  891  892  899  910  921  922  930  941  942  951  952  953  991  992  999 1011 
##    8   19   16  102   31   74  289  325   99  125  122   73   45   12  141    2 
## 1012 
##   17
# 전처리
library(readxl)
list_job = read_excel("C:/rproject/doit_welfare/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
# left_join()함수를 이용하여 job변수를 welfar에 결합하기
welfare = left_join(welfare, list_job, id = "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                   매장 판매 종사자

직업별 월급 차이 분석하기

직업별 월급 평균표 만들기

job_income = welfare %>% 
  filter(!is.na(job) & !is.na(income)) %>% 
  group_by(job) %>% 
  summarise(mean_income = mean(income))
head(job_income)
## # A tibble: 6 x 2
##   job                           mean_income
##   <chr>                               <dbl>
## 1 가사 및 육아 도우미                  80.2
## 2 간호사                              241. 
## 3 건설 및 광업 단순 종사원            190. 
## 4 건설 및 채굴 기계운전원             358. 
## 5 건설 전기 및 생산 관련 관리자       536. 
## 6 건설관련 기능 종사자                247.
# 어떤 직업의 월급이 많은지 내림차순 정렬
top10 = job_income %>% 
  arrange(desc(mean_income)) %>% 
  head(10)
top10
## # A tibble: 10 x 2
##    job                                  mean_income
##    <chr>                                      <dbl>
##  1 금속 재료 공학 기술자 및 시험원             845.
##  2 의료진료 전문가                             844.
##  3 의회의원 고위공무원 및 공공단체임원         750 
##  4 보험 및 금융 관리자                         726.
##  5 제관원 및 판금원                            572.
##  6 행정 및 경영지원 관리자                     564.
##  7 문화 예술 디자인 및 영상 관련 관리자        557.
##  8 연구 교육 및 법률 관련 관리자               550.
##  9 건설 전기 및 생산 관련 관리자               536.
## 10 석유 및 화학물 가공장치 조작원              532.
# 그래프 만들기
ggplot(data = top10, aes(x = reorder(job, mean_income), y = mean_income)) +
  geom_col() +
  coord_flip()

coord_flip() 사용하여 막대를 오른쪽으로 90도 회전
reorder()함수는 어떤 기준으로 정렬할지 설정(기본은 오름차순, -를 붙이면 내림차순)

하위 10위 추출

bottom10 = job_income %>% 
  arrange(mean_income) %>% 
  head(10)
bottom10
## # A tibble: 10 x 2
##    job                          mean_income
##    <chr>                              <dbl>
##  1 가사 및 육아 도우미                 80.2
##  2 임업관련 종사자                     83.3
##  3 기타 서비스관련 단순 종사원         88.2
##  4 청소원 및 환경 미화원               88.8
##  5 약사 및 한약사                      89  
##  6 작물재배 종사자                     92  
##  7 농립어업관련 단순 종사원           102. 
##  8 의료 복지 관련 서비스 종사자       104. 
##  9 음식관련 단순 종사원               108. 
## 10 판매관련 단순 종사원               117.
## 그래프 만들기
ggplot(data = bottom10, aes(x = reorder(job, -mean_income), y = mean_income)) + 
  geom_col() + 
  coord_flip() + 
  ylim(0, 850)

성별 직업 빈도 분석하기

성별 직업 빈도표 만들기

# 남성 직업 빈도 상위 10개 추출
job_male = welfare %>% 
  filter(!is.na(job) & sex == "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) & sex == "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
# 그래프 만들기

# 남성 직업 빈도 상위 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()

종교 유무에 따른 이혼율

# 종교 변수 검토 및 전처리
class(welfare$religion)
## [1] "numeric"
table(welfare$religion)
## 
##    1    2 
## 8047 8617
# 전처리
# 종교 유무 이름 부여
welfare$religion = ifelse(welfare$religion == 1, "yes", "no")
table(welfare$religion)
## 
##   no  yes 
## 8617 8047
qplot(welfare$religion)

# 혼인 상태 변수 검토 및 전처리
# 변수 검토하기
class(welfare$marriage)
## [1] "numeric"
table(welfare$marriage)
## 
##    0    1    2    3    4    5    6 
## 2861 8431 2117  712   84 2433   26
# 파생변수 만들기
# 이혼 여부 변수 만들기
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)

# 종교 유무에 따른 이혼율 표 만들기
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
# count()함수는 집단별 빈도를 구하는 함수, 비율을 구하는 mutate()를 하나로 합쳐서 아래와 같은 방식으로 비율표를 만들 수 있다.
religion_marriage = welfare %>% 
  filter(!is.na(group_marriage)) %>% 
  count(religion, group_marriage) %>%
  group_by(religion) %>% 
  mutate(pct = round(n/sum(n)*100, 1))
religion_marriage
## # A tibble: 4 x 4
## # Groups:   religion [2]
##   religion group_marriage     n   pct
##   <chr>    <chr>          <int> <dbl>
## 1 no       divorce          384   8.3
## 2 no       marriage        4218  91.7
## 3 yes      divorce          328   7.2
## 4 yes      marriage        4213  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
# 그래프 만들기
ggplot(data = divorce, aes(x = religion, y = pct)) + geom_col()

# 연령대 및 종교 유무에 따른 이혼율 분석하기

# 연령대별 이혼율 표 만들기
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_marriage = welfare %>% 
  filter(!is.na(group_marriage)) %>% 
  count(ageg, group_marriage) %>% 
  group_by(ageg) %>% 
  mutate(pct = round(n/sum(n)*100, 1))
ageg_marriage
## # A tibble: 6 x 4
## # Groups:   ageg [3]
##   ageg   group_marriage     n   pct
##   <chr>  <chr>          <int> <dbl>
## 1 middle divorce          437   8.9
## 2 middle marriage        4481  91.1
## 3 old    divorce          273   6.6
## 4 old    marriage        3892  93.4
## 5 young  divorce            2   3.3
## 6 young  marriage          58  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_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
# 
ageg_religion_marriage = welfare %>% 
  filter(!is.na(group_marriage) & ageg != "young") %>% 
  count(ageg, religion, group_marriage) %>% 
  group_by(ageg, religion) %>% 
  mutate(pct = round(n/sum(n)*100, 1))
ageg_religion_marriage
## # A tibble: 8 x 5
## # Groups:   ageg, religion [4]
##   ageg   religion group_marriage     n   pct
##   <chr>  <chr>    <chr>          <int> <dbl>
## 1 middle no       divorce          260   9.7
## 2 middle no       marriage        2421  90.3
## 3 middle yes      divorce          177   7.9
## 4 middle yes      marriage        2060  92.1
## 5 old    no       divorce          123   6.5
## 6 old    no       marriage        1761  93.5
## 7 old    yes      divorce          150   6.6
## 8 old    yes      marriage        2131  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
# 연령대 및 종교 유무에 따른 이혼율 그래프 만들기
ggplot(data = df_divorce, aes(x = ageg, y = pct, fill = religion)) +
  geom_col(position = "dodge")

지역별 연령대 비율

지역 변수 검토 및 전처리

class(welfare$code_region)
## [1] "numeric"
table(welfare$code_region)
## 
##    1    2    3    4    5    6    7 
## 2486 3711 2785 2036 1467 1257 2922
# 전처리 - 지역 코드 목록 만들기
list_region = data.frame(code_region = c(1:7),
                         region = c("서울",
                                    "수도권",
                                    "부산/경남/울산",
                                    "대구/경북",
                                    "대전/충남",
                                    "강원/충북",
                                    "광주/전남/전북/제주도"))
## code_region에 7개의 권역을 의미하는 지역 코드입니다. 먼저 코드북의 내용을 참조해 지역 코드목록을 만든 다음 지역 코드 목록과 welfare에 동시에 들어 있는 code_region 변수를 이용해 welfare에 지역명 변수를 추가 하였습니다.

list_region
##   code_region                region
## 1           1                  서울
## 2           2                수도권
## 3           3        부산/경남/울산
## 4           4             대구/경북
## 5           5             대전/충남
## 6           6             강원/충북
## 7           7 광주/전남/전북/제주도
# 지역명 변수추가
library(dplyr)
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   서울
# 지역별 연령대 비율 분석하기
region_ageg = welfare %>%
  group_by(region, ageg) %>% 
  summarise(n = n()) %>% 
  mutate(tot_group =sum(n)) %>%
  mutate(pct = round(n/tot_group*100, 2))
region_ageg
## # A tibble: 21 x 5
## # Groups:   region [7]
##    region                ageg       n tot_group   pct
##    <chr>                 <chr>  <int>     <int> <dbl>
##  1 강원/충북             middle   417      1257  33.2
##  2 강원/충북             old      555      1257  44.2
##  3 강원/충북             young    285      1257  22.7
##  4 광주/전남/전북/제주도 middle   947      2922  32.4
##  5 광주/전남/전북/제주도 old     1233      2922  42.2
##  6 광주/전남/전북/제주도 young    742      2922  25.4
##  7 대구/경북             middle   637      2036  31.3
##  8 대구/경북             old      928      2036  45.6
##  9 대구/경북             young    471      2036  23.1
## 10 대전/충남             middle   548      1467  37.4
## # ... with 11 more rows
#
region_ageg = welfare %>% 
  count(region, ageg) %>%
  group_by(region) %>% 
  mutate(pct = round(n/sum(n)*100, 2))
region_ageg
## # A tibble: 21 x 4
## # Groups:   region [7]
##    region                ageg       n   pct
##    <chr>                 <chr>  <int> <dbl>
##  1 강원/충북             middle   417  33.2
##  2 강원/충북             old      555  44.2
##  3 강원/충북             young    285  22.7
##  4 광주/전남/전북/제주도 middle   947  32.4
##  5 광주/전남/전북/제주도 old     1233  42.2
##  6 광주/전남/전북/제주도 young    742  25.4
##  7 대구/경북             middle   637  31.3
##  8 대구/경북             old      928  45.6
##  9 대구/경북             young    471  23.1
## 10 대전/충남             middle   548  37.4
## # ... with 11 more rows
# 그래프 만들기
library(ggplot2)
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
  geom_col() +
  coord_flip()

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

# 노년층 비율 내림차순 정렬
list_order_old = region_ageg %>% 
  filter(ageg == "old") %>% 
  arrange(pct)
list_order_old
## # A tibble: 7 x 4
## # Groups:   region [7]
##   region                ageg      n   pct
##   <chr>                 <chr> <int> <dbl>
## 1 수도권                old    1109  29.9
## 2 서울                  old     805  32.4
## 3 대전/충남             old     527  35.9
## 4 부산/경남/울산        old    1124  40.4
## 5 광주/전남/전북/제주도 old    1233  42.2
## 6 강원/충북             old     555  44.2
## 7 대구/경북             old     928  45.6
# 지역명 순서 변수 만들기
order = list_order_old$region
order
## [1] "수도권"                "서울"                  "대전/충남"            
## [4] "부산/경남/울산"        "광주/전남/전북/제주도" "강원/충북"            
## [7] "대구/경북"
ggplot(data = region_ageg, aes(x = region, y = pct, fill = ageg)) +
  geom_col() +
  coord_flip() +
  scale_x_discrete(limits = order)

# 연령대별 순으로 막대 색깔 나열하기
class(region_ageg$ageg)
## [1] "character"
levels(region_ageg$ageg)
## NULL
# factor()를 이용해 ageg 변수를 factor 타입으로 변환하고, level 피라미터를 이용해 순서를 지정
region_ageg$ageg = factor(region_ageg$ageg,
                          levels = 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)

책정보, Do it! 쉽게 배우는 R 데이터 분석 _ 네이버 책.html
221.2 kB

댓글