대충벌레 블로그
article thumbnail
Published 2021. 1. 27. 18:00
R언어 공부정리 [8] IT 기술/R
728x90
반응형

2021/01/25 - [IT 기술/R] - R언어 공부정리 [7]

2021/01/22 - [IT 기술/R] - R언어 공부 정리 [6]

2021/01/21 - [IT 기술/R] - R언어 공부 정리 [5]

2021/01/20 - [IT 기술/R] - R언어 공부 정리 [4]

2021/01/19 - [IT 기술/R] - R 언어 공부 정리 [3]

2021/01/18 - [IT 기술/R] - R 언어 공부정리 [2]

2021/01/15 - [IT 기술/R] - 분석 , 통계시 유용한 R 언어 설치와 기본 공부 정리

 

R언어 공부정리 [7]에 이어서 정리합니다.

연령대별 이혼율 분석해봅시다.

연령대별 (3가지) 이혼유무 (2가지) 총 6개의 그룹이 생깁니다.

우선 연령대및 결혼 상태별 비율표를 생성후 이혼한 경우를 추출해서 이혼율 표를 만들어봅시다.

ageg_marriage <- welfare %>% 
  filter(!is.na(group_marriage)) %>%
  group_by(agegroup,group_marriage) %>%
  summarise(n = n()) %>%
  mutate(tot_group = sum(n)) %>%
  mutate(pct = round(n/tot_group*100,1))
  
  
  # Groups:   agegroup [3]
  agegroup 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

count()를 이용하고 비율을 구하는 mutate()를 하나로 합쳐서 새로운  방식으로도 비율표를 만들수 있습니다.

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

연령대별 이혼율 그래프

초년생을 제외하고 이혼한 그룹의 그래프를 만들어봅시다.

ageg_divorce <- ageg_marriage %>%
  filter(agegroup != 'young' & group_marriage == 'divorce') %>%
  select(agegroup,pct)
  
  # A tibble: 2 x 2
# Groups:   agegroup [2]
  agegroup   pct
  <chr>    <dbl>
1 middle     8.9
2 old        6.6

그래프 작업

ggplot(data=ageg_divorce,aes(x=agegroup,y=pct)) + geom_col()

 

연령대 및 종교 유무에 따른 이혼율을 분석해봅시다.

ageg_religion_marriage <- welfare %>%
  filter(!is.na(group_marriage)& agegroup != 'young') %>%
  group_by(agegroup,religion,group_marriage) %>%
  summarise(n = n()) %>%
  mutate(tot_group = sum(n)) %>%
  mutate(pct=round(n/tot_group*100,1))
  
  # A tibble: 8 x 6
# Groups:   agegroup, religion [4]
  agegroup 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(agegroup,religion,pct)
  
  # A tibble: 4 x 3
# Groups:   agegroup, religion [4]
  agegroup 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 으로 설정해줍니다.

ggplot(data=df_divorce, aes(x=agegroup,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    모두 7개 지역으로 되어있음
# 2486 3711 2785 2036 1467 1257 2922 

모두 숫자로 이루어져있고 7개의 지역으로 된것을 알수있습니다.

 

code_region 값은 지역코드입니다. 우선 우리가 알고있는 지역으로 지역 코드 목록 데이터프레임을 생성해준뒤

welfare와 열병합을 해줍니다.

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와 list_region을 열병합해서 code_region을 기준으로 지역명 변수를 추가해줍니다.

welfare <- left_join(welfare,list_region,id="code_region")
welfare %>% select(agegroup,code_region,region) %>% head(10)
# agegroup code_region region
# 1       old           1   서울
# 2       old           1   서울
# 3       old           1   서울
# 4       old           1   서울
# 5       old           1   서울
# 6    middle           1   서울
# 7    middle           1   서울
# 8     young           1   서울
# 9       old           1   서울
# 10      old           1   서울

 

우선 지역및 연령대별로 나눠서 빈도를 구하고 , 각지역의 전체 빈도를 나눠서 비율을 구합니다.

region_ageg <- welfare %>% 
  group_by(region, agegroup) %>% 
  summarise(n = n()) %>%  # 7*3 = 21가지
  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                agegroup     n tot_group   pct
  <chr>                 <fct>    <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

위의 표를 이용해서 그래프를 생성해줍니다. 연령대 비율막대는 비교할수있게 fill 에 agegroup을 설정해주고

x축값이 겹칠수 있기 때문에 coord_flip을 해주겠습니다.

노년층 비율 높은 순으로 막대 정렬을 해봅시다 

위에서 만든 그래프는 지역명이 아래에서부터 가나다 순으로 정렬이 됩니다.

이 순서를 노년층 비율이 높은순서대로 정렬해줍니다.

우선 노년층 비율이 높은순으로 정렬된 변수를 생성해줍니다.

list_order_old <- region_ageg %>% 
  filter(agegroup == "old") %>% 
  arrange(desc(pct))
# A tibble: 7 x 5
# Groups:   region [7]
  region                agegroup     n tot_group   pct
  <chr>                 <chr>    <int>     <int> <dbl>
1 대구/경북             old        928      2036  45.6
2 강원/충북             old        555      1257  44.2
3 광주/전남/전북/제주도 old       1233      2922  42.2
4 부산/경남/울산        old       1124      2785  40.4
5 대전/충남             old        527      1467  35.9
6 서울                  old        805      2486  32.4
7 수도권(인천/경기)     old       1109      3711  29.9

지역명 순서의 변수를 만들어줍니다.

order <- list_order_old$region
[1] "대구/경북"             "강원/충북"             "광주/전남/전북/제주도"
[4] "부산/경남/울산"        "대전/충남"             "서울"                 
[7] "수도권(인천/경기)" 

지역명이 노년층 비율이 높은순으로 정렬된 order 변수를 활용해서 그래프를 만들어줍니다.

위에서 사용했던 그래프 코드에 scale_x_discrete()를 추가해 줍니다.

ggplot(data = region_ageg, aes(x = region, y = pct, fill = agegroup)) +
  geom_col(position = 'dodge') +
  coord_flip()+
  scale_x_discrete(limits=order)

노년층 비율이 높은 대구/경북이 맨 하단에 위치한것을 볼수있습니다.

연령대 순서로 막대색깔 나열

old,middle,young 순서로 나열되게 합니다. 사실 위의 결과는 middle,old,young 순서로 알파벳 순서대로 나오는게 정상인데 깜빡하고 원래 진행했던 데이터로 하게되엇습니다.

우선 막대색으로 순서를 나열하려면 fill 파라미터에 지정할 변수의 범주(levels)를 지정해주면 되는데

연령대 변수는 character 타입이라 level이 없습니다

class(region_ageg$agegroup)
# [1] "character"
levels(region_ageg$agegroup)
# NULL

factor()를 이용해서 agegroup변수를 factor타입으로 변환후 levels 파라미터를 이용해서 순서를 지정하면 됩니다.

region_ageg$agegroup <- factor(region_ageg$agegroup,
                               levels = c('young','middle','old'))
class(region_ageg$agegroup)
# [1] "factor"

levels(region_ageg$agegroup)
[1] "young"  "middle" "old" 

여기서 다시 그래프 작업을 하면 원하는 연령대별 순서대로 표시할수있습니다.

ggplot(data = region_ageg, aes(x = region, y = pct, fill = agegroup)) +
  geom_col(position = 'dodge') +
  coord_flip()+
  scale_x_discrete(limits=order)

반응형

'IT 기술 > R' 카테고리의 다른 글

데이터 마이닝 R 4버전 이상 - KoNLP 설치  (0) 2021.01.26
R언어 공부정리 [7]  (0) 2021.01.25
R언어 공부 정리 [6]  (0) 2021.01.22
R언어 공부 정리 [5]  (0) 2021.01.21
R언어 공부 정리 [4]  (2) 2021.01.20
profile

대충벌레 블로그

@대충벌레

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!