# 복지패널 데이터 분석
# 필요한 라이브러리 로드
library(dplyr)
library(ggplot2)
search()
# 저장해둔 R 데이터 파일을 로드 -> 변수 자동 생성
rm(list=ls())
load('data/welfare.rda')
#데이터프레임 확인
str(welfare)
welfare %>%
select(code_job, job) %>%
head(10)
code_job job
1 NA <NA>
2 NA <NA>
3 942 경비원 및 검표원
4 762 전기공
5 NA <NA>
6 530 방문 노점 및 통신 판매 관련 종사자
7 NA <NA>
8 NA <NA>
9 NA <NA>
10 NA <NA>
> table(is.na(welfare$job))
FALSE TRUE
7529 9135
- 직업별 평균 소득 분석
income_by_job = welfare %>%
filter(!is.na(job)& !is.na(income)) %>%
group_by(job) %>%
summarise(mean_income= mean(income))
income_by_job %>% arrange(desc(mean_income))
# A tibble: 142 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.
# ... with 132 more rows
- 평균소득 하위 10개 직종
> bottom10 = income_by_job %>%
+ 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
- 직종별 평균 급여 상위 10개 그래프
ggplot(data = top10,
mapping = aes( x = reorder( job, mean_income), y = mean_income))+
geom_col()+coord_flip() + xlab('job')
# 이 데이터가 의미가 있는 데이터일까? 특정 직업의 표본이 1명인데,
그 사람의 급여가 지나치게 높다면, 데이터를 왜곡하지 않을까?
# 직종별 인구수가 30명 이상인 직종에 대해서
# 평균 소득 상위 10개의 직종을 찾고, 그래프 작성
top10_30m= welfare %>%
filter(!is.na(job)& !is.na(income)) %>% # job, income NA 제외
group_by(job) %>%
summarise(mean_income=mean(income), numofworker=n()) %>% # job별 평균소득 + job별 인구수
filter(numofworker>=30) %>% # 종사자 수 30명 이상인 직업만 선택
arrange(desc(mean_income)) %>% # 평균소득별 내림차순 정렬
head(10)
ggplot(data= top10_30m, mapping = aes(x = reorder(job, mean_income), y = mean_income)) +
geom_col() + coord_flip() + xlab('job')
# 지역별 연령대 비율
# 지역(1 ~ 7권역) 변수 확인 - NA 없음
table(welfare$code_region)
# 연령대(ageg, age_range)
table (welfare$ageg)
table (welfare$age_range)
# 지역 코드 - 해당 지역 이름 데이터 프레임 생성
regions = data.frame(
code_region = c(1:7),
region = c("서울",'수도권/인천/경기','부산/경남/울산',
'대구/경북','대전/충남','강원/충북','광주/전남/전북/제주') )
code_region region
1 1 서울
2 2 수도권/인천/경기
3 3 부산/경남/울산
4 4 대구/경북
5 5 대전/충남
6 6 강원/충북
7 7 광주/전남/전북/제주
# 두개의 데이터 프레임을 조인해서 region(지역 이름) 변수를 추가
welfare = left_join(welfare,regions, by = "code_region")
> table(welfare$region)
강원/충북 광주/전남/전북/제주 대구/경북 대전/충남 부산/경남/울산
1257 2922 2036 1467 2785
서울 수도권/인천/경기
2486 3711
# 지역별, 연령대별 인구수
region_ageg = welfare %>%
group_by(region, ageg) %>%
summarise(count = n()) %>%
mutate(total = sum(count), percentage = count/total * 100)
> region_ageg
# A tibble: 21 x 3
# Groups: region [7]
region ageg count total percentage
<fct> <ord> <int> <int> <dbl>
1 강원/충북 young 294 1257 23.4
2 강원/충북 middle 431 1257 34.3
3 강원/충북 old 532 1257 42.3
4 광주/전남/전북/제주 young 758 2922 25.9
5 광주/전남/전북/제주 middle 963 2922 33.0
6 광주/전남/전북/제주 old 1201 2922 41.1
7 대구/경북 young 481 2036 23.6
8 대구/경북 middle 651 2036 32.0
9 대구/경북 old 904 2036 44.4
10 대전/충남 young 401 1467 27.3
# ... with 11 more rows
ggplot(data=region_ageg, mapping = aes(x = region, y = percentage, fill=ageg))+
geom_col() + coord_flip()
region_ageg = welfare %>%
group_by(region, age_range) %>% # 지난강의 연습문제에서 만든 변수
summarise(count = n()) %>%
mutate(total = sum(count), percentage = count/total*100)
region_ageg
ggplot(data=region_ageg, mapping = aes(x = region, y = percentage, fill=age_range))+
geom_col() + coord_flip()
install.packages('tidyr')
library(tidyr)
#tidyr::gather()함수 사용법
> exam
id class math english science
1 1 1 50 98 50
2 2 1 60 97 60
3 3 1 45 86 78
4 4 1 30 98 58
5 5 2 25 80 65
6 6 2 50 89 98
7 7 2 80 90 45
8 8 2 90 78 25
9 9 3 20 98 15
10 10 3 50 98 45
11 11 3 65 65 65
12 12 3 45 85 32
13 13 4 46 98 65
14 14 4 48 87 12
15 15 4 75 56 78
16 16 4 58 98 65
17 17 5 65 68 98
18 18 5 80 78 90
19 19 5 89 68 87
20 20 5 78 83 58
- 표 변환 함수 : 데이터 프레임에서 행과 열의 위치를 바꾸어줌.
df <- exam_by_class %>%
gather(key = 'subject', value = 'mean', -class) # class를 제외하고 돌리기 ( 피봇 -> 클래스를 제외하고 math, english, science가 피봇됨)
df
class subject mean
<int> <chr> <dbl>
1 1 math 46.2
2 2 math 61.2
3 3 math 45
4 4 math 56.8
5 5 math 78
6 1 english 94.8
7 2 english 84.2
8 3 english 86.5
9 4 english 84.8
10 5 english 74.2
11 1 science 61.5
12 2 science 58.2
13 3 science 39.2
14 4 science 55
15 5 science 83.2
ggplot(data = df,
mapping = aes ( x = class, y = mean, fill = subject)) + geom_col(position = 'dodge')
'R > R기초' 카테고리의 다른 글
R13_ 지도 시각화 (2) | 2019.10.21 |
---|---|
R12_ 텍스트 마이닝 (0) | 2019.10.18 |
R10_복지패널 데이터 분석 2 (0) | 2019.10.16 |
R09_복지패널 데이터분석1 (0) | 2019.10.15 |
R08_ggplot2를 이용한 여러가지 그래프 (0) | 2019.10.14 |