library(foreign) # SPSS 파일
library(dplyr) # 전처리
library(ggplot2) # 시각화
library(readxl) # 엑셀로드
# 데이터 불러오기
raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav",to.data.frame=T)
# 용량이 큰경우 경고가 뜬다고함 오류는 아님
# 복사본 만들기
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) #지역코드
#### 성별에 따른 월급차이
# 1. 성별에 대한 이상치,결측치 확인 및 처리
# 1) 데이터형
class(welfare$sex)
#"numeric"
# 2) 빈도 측정
table(welfare$sex)
# 1 2
# 7578 9086 이상치 없음
table(is.na(welfare$sex))
# FALSE
# 16664 결측치 없음
# 이상치가 원래 있었다면
welfare$sex <- ifelse(welfare$sex == 9, NA, welfare$sex)
# 1이면 male로 2이면 female로 변경하기
welfare$sex <- ifelse(welfare$sex == 1, "male", "female")
class(welfare$sex)
# "character"
table(welfare$sex)
# female male
# 9086 7578
qplot(welfare$sex)
# 2. 소득에 대한 이상치와 결측치 확인 및 처리
# 1) 데이터 형
class(welfare$income)
# "numeric"
# 결측치 확인
table(is.na(welfare$income))
# FALSE TRUE
# 4634 12030 NA가 12030건. 나중에 필터링으로 제거
# 극단치 확인 / 이상치 확인
boxplot(welfare$income)
boxplot(welfare$income)$stats
# [,1]
# [1,] 0.0
# [2,] 122.0
# [3,] 192.5
# [4,] 316.6
# [5,] 608.0
table(welfare$income)
# 0 이거나 9999 는 이상치다.
# 이상치는 결측치로 변경
# 무응답/모름은 9999로 되어있으므로 NA로 변경해준다.
welfare$income <- ifelse(welfare$income==c(0,9999),NA,welfare$income)
table(is.na(welfare$income))
# FALSE TRUE
# 4628 12036 <- na가 증가했음.
qplot(welfare$income)+xlim(0,1000)
###### 3. 분석하기. 성별에 따른 월급차이
welfare %>% filter(!is.na(income)) %>%
group_by(sex) %>%
summarise(mean_income=mean(income))
# sex mean_income
# <chr> <dbl>
# 1 female 163.
# 2 male 312.
###### 4. 시각화 #변수에 담기
sex_income <- welfare %>% filter(!is.na(income)) %>%
group_by(sex) %>%
summarise(mean_income=mean(income))
ggplot(data = sex_income, aes(x=sex, y=mean_income)) +
geom_col()
library(foreign) # SPSS 파일
library(dplyr) # 전처리
library(ggplot2) # 시각화
library(readxl) # 엑셀로드
# 데이터 불러오기
raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav",to.data.frame=T)
# 용량이 큰경우 경고가 뜬다고함 오류는 아님
# 복사본 만들기
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) #지역코드
########################### 나이와 월급의 차이를 분석하시오
# 소득에 대한 이상치와 결측치 확인 및 처리
# 데이터 형
class(welfare$income)
# "numeric"
# 결측치 확인
table(is.na(welfare$income))
# FALSE TRUE
# 4634 12030 NA가 12030건. 나중에 필터링으로 제거
# 극단치 확인 / 이상치 확인
boxplot(welfare$income)
boxplot(welfare$income)$stats
# [,1]
# [1,] 0.0
# [2,] 122.0
# [3,] 192.5
# [4,] 316.6
# [5,] 608.0
table(welfare$income)
# 0 이거나 9999 는 이상치다.
# 이상치는 결측치로 변경
# 무응답/모름은 9999로 되어있으므로 NA로 변경해준다.
welfare$income <- ifelse(welfare$income==c(0,9999),NA,welfare$income)
table(is.na(welfare$income))
# FALSE TRUE
# 4628 12036 <- na가 증가했음.
##############################
# 나이 - 시계열,
# 1) 데이터형
class(welfare$birth)
#"numeric"
# 2) 빈도 측정
table(welfare$birth)
# 이상치 성인이하는 잘라야하지 않을까 - 16세 이하는 이상치로 자르기
# 하려했는데 알아서 20살 미만은 걸러짐
# welfare$birth <- ifelse(welfare$birth >= 2001, NA, welfare$birth )
table(is.na(welfare$birth))
# FALSE TRUE
# 14620 2044 16세 미만은 NA로 자름
# 이상치가 원래 있었다면
welfare$bitrh <- ifelse(welfare$birth == 9999 |
welfare$birth < 1900 |
welfare$birth > 2014, NA, welfare$birth)
# 나이 컬럼을 추가하자 : 생일을 이용해서 나이컬럼을 만든다
welfare$age <- (2015 - welfare$birth) + 1
#분석
qplot(welfare$age)
welfare %>% filter(!is.na(income)) %>%
group_by(age) %>%
summarise(mean_income=mean(income))
# 변수에 담기
age_income <- welfare %>% filter(!is.na(income)) %>%
group_by(age) %>%
summarise(mean_income=mean(income))
# 시각화
ggplot(data = age_income, aes(x=age, y=mean_income)) +
geom_line()
#############################################
# 분석3 - 연령대별 월급 차이
# 30미만은 young , 59이하는 middle, 나머지는 old 그룹으로 나눈다
welfare$age <- (2015 - welfare$birth) + 1
welfare$ages <- ifelse(welfare$age >60, "old",
ifelse(welfare$age > 30, "middle","young"))
#또는
welfare <- welfare %>% mutate(ages = ifelse(age<30,"young",
ifelse (age<=59,"middle","old")))
table(welfare$ages)
# middle old young
# 6128 6072 4464
#분석
qplot(welfare$ages)
welfare %>% filter(!is.na(income)) %>%
group_by(ages) %>%
summarise(mean_income=mean(income))
# 변수에 담기
ages_income <- welfare %>% filter(!is.na(income)) %>%
group_by(ages) %>%
summarise(mean_income=mean(income))
# 시각화 순서넣음 scale_x_discreate() 지정안하면 알파벳순
ggplot(data = ages_income, aes(x=ages, y=mean_income)) +
geom_col() + scale_x_discrete(limit=c("young","middle","old"))
library(foreign) # SPSS 파일
library(dplyr) # 전처리
library(ggplot2) # 시각화
library(readxl) # 엑셀로드
# 데이터 불러오기
raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav",to.data.frame=T)
# 용량이 큰경우 경고가 뜬다고함 오류는 아님
# 복사본 만들기
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) #지역코드
# 나이
welfare$age <- (2015 - welfare$birth) + 1
# 연령대
welfare <- welfare %>% mutate(ages = ifelse(age<30,"young",
ifelse (age<=59,"middle","old")))
#################################################
head(welfare$ages) # 이전에 분석했던것이 살아있는지 확인
table(welfare$sex)
# welfare$sex <- ifelse(welfare$sex == 1, "male", "female")
table(welfare$income)
### 이상치와 결측치는 이전에 처리되었다.
ages_sex <- welfare %>% filter(!is.na(income)) %>%
group_by(ages,sex) %>%
summarise(mean_income=mean(income))
# 시각화 fill= 이중 그룹일때 색으로 구별함
ggplot(data = ages_sex, aes(x=ages, y=mean_income, fill=sex)) +
geom_col() +
scale_x_discrete(limit=c("young","middle","old"))
# 막대 그래프 분리
ggplot(data = ages_sex, aes(x=ages, y=mean_income, fill=sex)) +
geom_col(position = "dodge") +
scale_x_discrete(limit=c("young","middle","old"))
# 어디선가 꼬여서 잘안됨 나중에 수정
library(foreign) # SPSS 파일
library(dplyr) # 전처리
library(ggplot2) # 시각화
library(readxl) # 엑셀로드
# 데이터 불러오기
raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav",to.data.frame=T)
# 용량이 큰경우 경고가 뜬다고함 오류는 아님
# 복사본 만들기
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) #지역코드
# 나이
welfare$age <- (2015 - welfare$birth) + 1
# 연령대
welfare <- welfare %>% mutate(ages = ifelse(age<30,"young",
ifelse (age<=59,"middle","old")))
####################################### 직업별 월급차이
#데이터형
class(welfare$code_job)
# "numeric
table(welfare$code_job) #150가지 직업군
list_job <- read_excel("Koweps_Codebook.xlsx",
sheet = 2,col_names = T)
head(list_job)
# code_job job
# <dbl> <chr>
# 1 111 의회의원 고위공무원 및 공공단체임원
# 2 112 기업고위임원
# 3 120 행정 및 경영지원 관리자
# 4 131 연구 교육 및 법률 관련 관리자
# 5 132 보험 및 금융 관리자
# 6 133 보건 및 사회복지 관련 관리자
dim(list_job) # 149 2
# 직종코드가 코드화 되어있어서 파악하기 어려우므로 직업명을 같이사용할것
welfare <- left_join(welfare, list_job, id='code_job')
head(welfare$job) # NA가 섞여있음을 알수 있다.
# [1] NA
# [3] "경비원 및 검표원"
# [4] "전기공"
# [6] "방문 노점 및 통신 판매 관련 종사자"
jobs_income <- welfare %>% filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>% #직업별
summarise(mean_income=mean(income))
# job mean_income
# <chr> <dbl>
# 1 가사 및 육아 도우미 80.2
# 2 간호사 241.
# 3 건설 및 광업 단순 종사원 190.
#시각화
ggplot(data = jobs_income, aes(x=job, y=mean_income))+
geom_col()
jobs_income <- welfare %>% filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>% #직업별
summarise(mean_income=mean(income)) %>%
arrange(desc(mean_income)) %>% head(10) #내림차순10개
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income))+
geom_col()
# x축의 각 이름들이 너무길어서 확인하기 힘들다 -> 회전,피복->수평바 coord_flip()
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income))+
geom_col() + coord_flip()
#######################하위 10개 결과를 출력하고 그래프화
jobs_income <- welfare %>% filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>% #직업별
summarise(mean_income=mean(income)) %>%
arrange(mean_income) #올림차순
head(10) # 10개
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income))+
geom_col() + coord_flip() #수평바
# 직종별로 색 채우기
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income,
fill=job))+geom_col() + coord_flip() #수평바
library(foreign) # SPSS 파일
library(dplyr) # 전처리
library(ggplot2) # 시각화
library(readxl) # 엑셀로드
# 데이터 불러오기
raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav",to.data.frame=T)
# 용량이 큰경우 경고가 뜬다고함 오류는 아님
# 복사본 만들기
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) #지역코드
# 나이
welfare$age <- (2015 - welfare$birth) + 1
# 연령대
welfare <- welfare %>% mutate(ages = ifelse(age<30,"young",
ifelse (age<=59,"middle","old")))
# 성별
welfare$sex <- ifelse(welfare$sex==1,"male","female")
####################################### 직업별 월급차이
#데이터형
class(welfare$code_job)
# "numeric
table(welfare$code_job) #150가지 직업군
list_job <- read_excel("Koweps_Codebook.xlsx",
sheet = 2,col_names = T)
head(list_job)
# code_job job
# <dbl> <chr>
# 1 111 의회의원 고위공무원 및 공공단체임원
# 2 112 기업고위임원
# 3 120 행정 및 경영지원 관리자
# 4 131 연구 교육 및 법률 관련 관리자
# 5 132 보험 및 금융 관리자
# 6 133 보건 및 사회복지 관련 관리자
dim(list_job) # 149 2
# 직종코드가 코드화 되어있어서 파악하기 어려우므로 직업명을 같이사용할것
welfare <- left_join(welfare, list_job, id='code_job')
head(welfare$job) # NA가 섞여있음을 알수 있다.
# [1] NA
# [3] "경비원 및 검표원"
# [4] "전기공"
# [6] "방문 노점 및 통신 판매 관련 종사자"
jobs_income <- welfare %>% filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>% #직업별
summarise(mean_income=mean(income))
# job mean_income
# <chr> <dbl>
# 1 가사 및 육아 도우미 80.2
# 2 간호사 241.
# 3 건설 및 광업 단순 종사원 190.
#시각화
ggplot(data = jobs_income, aes(x=job, y=mean_income))+
geom_col()
jobs_income <- welfare %>% filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>% #직업별
summarise(mean_income=mean(income)) %>%
arrange(desc(mean_income)) %>% head(10) #내림차순10개
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income))+
geom_col()
# x축의 각 이름들이 너무길어서 확인하기 힘들다 -> 회전,피복->수평바 coord_flip()
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income))+
geom_col() + coord_flip()
#######################하위 10개 결과를 출력하고 그래프화
jobs_income <- welfare %>% filter(!is.na(job) & !is.na(income)) %>%
group_by(job) %>% #직업별
summarise(mean_income=mean(income)) %>%
arrange(mean_income) #올림차순
head(10) # 10개
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income))+
geom_col() + coord_flip() #수평바
# 직종별로 색 채우기
ggplot(data = jobs_income, aes(x=reorder(job,-mean_income), y=mean_income,
fill=job))+geom_col() + coord_flip() #수평바
########################################### 성별 직업 빈도 dplyr 에서 빈도n()
# 1. 남성 직업 빈도 상위 10개를 추출하고 출력하라
welfare$sex <- ifelse(welfare$sex==1,"male","female")
male_job <- welfare %>% filter(!is.na(job)& sex=="male") %>%
group_by(job) %>%
summarise(n=n()) %>%
arrange(desc(n)) %>% head(10)
# job n
# <chr> <int>
# 1 작물재배 종사자 640
# 2 자동차 운전원 251
# 3 경영관련 사무원 213
# 4 영업 종사자 141
# 눞히고 정렬, 색구별
ggplot(data=male_job,aes(x=reorder(job, -n), y=n, fill=job))+
geom_col() + coord_flip()
# 2. 여성 직업 빈도 상위 10개를 추출하고 출력하라
welfare$sex <- ifelse(welfare$sex==1,"male","female")
female <- welfare %>% filter(!is.na(job)& sex=="female") %>%
group_by(job) %>%
summarise(n=n()) %>%
arrange(desc(n)) %>% head(10)
# job n
# <chr> <int>
# 1 작물재배 종사자 640
# 2 자동차 운전원 251
# 3 경영관련 사무원 213
# 4 영업 종사자 141
# 눞히고 정렬, 색구별
ggplot(data=female,aes(x=reorder(job, -n), y=n, fill=job))+
geom_col() + coord_flip()
library(foreign) # SPSS 파일
library(dplyr) # 전처리
library(ggplot2) # 시각화
library(readxl) # 엑셀로드
# 데이터 불러오기
raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav",to.data.frame=T)
# 용량이 큰경우 경고가 뜬다고함 오류는 아님
# 복사본 만들기
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) #지역코드
# 나이
welfare$age <- (2015 - welfare$birth) + 1
# 연령대
welfare <- welfare %>% mutate(ages = ifelse(age<30,"young",
ifelse (age<=59,"middle","old")))
# 성별
welfare$sex <- ifelse(welfare$sex==1,"male","female")
# 종교유무
welfare$religion <- ifelse(welfare$religion==1,"yes","no")
##########################################
# 종교 유무에 따른 이혼율
class(welfare$religion) # "numeric"
table(welfare$religion)
# 1있음2없음
# 8047 8617
class(welfare$marriage) #"numeric"
table(welfare$marriage)
# 0비해당1유2사별 3이혼4별거5미혼6기타 이상치없음
# 2861 8431 2117 712 84 2433 26
table(is.na(welfare$marriage)) # NA없음
# 참고) 종교 이상치 9 체크 및 전환
welfare$religion <- ifelse(welfare$religion==9,NA,welfare$religion)
# 결측치 체크
table(is.na(welfare$religion))
# 종교가 있으면 yes, 없으면 no 로 변경하시오. 두번실행하면 전부no됨
welfare$religion <- ifelse(welfare$religion==1,"yes","no")
table(welfare$religion)
# no yes
# 8617 8047
# 결혼은 1 marriage, 3은 divorce 로, 나머지는 NA로 처리하는 컬럼
# group_marriage를 추가하라
welfare$group_marriage <- ifelse(welfare$marriage==1,"marriage",
ifelse(welfare$marriage==3,"divorce",NA))
table(welfare$group_marriage)
qplot(welfare$group_marriage)
# 종교 유무에 따른 이혼율 = 이혼/(이혼+결혼) *100
welfare %>% filter(!is.na(group_marriage)) %>%
group_by(religion,group_marriage) %>%
summarise(n=n()) # 4가지 종류의 카운팅이된다
# religion group_marriage n
# <chr> <chr> <int>
# 1 no divorce 384
# 2 no marriage 4218
# 3 yes divorce 328
# 4 yes marriage 4213
welfare %>% filter(!is.na(group_marriage)) %>%
group_by(religion, group_marriage) %>%
summarise(n=n()) %>% #그룹별행의 갯수 카운트
mutate(total_group=sum(n)) %>% # 2가지종류 (종교유무)
mutate(divorce_rate=(n/total_group)*100)
# 1 no divorce 384 4602 8.34
# 2 no marriage 4218 4602 91.7
# 3 yes divorce 328 4541 7.22
# 4 yes marriage 4213 4541 92.8
#종교유무 전체 결혼,이혼 비율
rel_divorce <- welfare %>% filter(!is.na(group_marriage)) %>%
group_by(religion, group_marriage) %>%
summarise(n=n()) %>% #그룹별행의 갯수 카운트
mutate(total_group=sum(n)) %>% # 2가지종류 (종교유무)
mutate(divorce_rate=(n/total_group)*100)
### 시각화
ggplot(data=rel_divorce, aes(x=religion, y=divorce_rate,
fill=group_marriage)) +
geom_col()
# 종교가 있는 사람의 이혼율
yes_rel <- welfare %>% filter(!is.na(group_marriage) & religion=="yes") %>%
group_by(religion, group_marriage) %>%
summarise(n=n()) %>% #그룹별행의 갯수 카운트
mutate(total_group=sum(n)) %>% # 2가지종류 (종교유무)
mutate(divorce_rate=(n/total_group)*100)
# religion group_marriage n total_group divorce_rate
# <chr> <chr> <int> <int> <dbl>
# 1 yes divorce 328 4541 7.22
# 2 yes marriage 4213 4541 92.8
# 뽑아서 변수에 담아놓은 데이터를 그대로 이용할수있음 확인
rel_divorce %>% filter(religion=="yes" & group_marriage=="divorce")
rel_divorce %>% filter(religion=="yes")
ggplot(data=yes_rel, aes(x=group_marriage, y=divorce_rate,
fill=group_marriage)) + geom_col()
# 종교가 없는 사람의 이혼율
no_rel <- welfare %>% filter(!is.na(group_marriage) & religion=="no") %>%
group_by(religion, group_marriage) %>%
summarise(n=n()) %>% #그룹별행의 갯수 카운트
mutate(total_group=sum(n)) %>% # 2가지종류 (종교유무)
mutate(divorce_rate=(n/total_group)*100)
# religion group_marriage n total_group divorce_rate
# <chr> <chr> <int> <int> <dbl>
# 1 no divorce 384 4602 8.34
# 2 no marriage 4218 4602 91.7
ggplot(data=no_rel, aes(x=group_marriage, y=divorce_rate,
fill=group_marriage)) + geom_col()
### 종교 여부에 따른 이혼율
div2 <- welfare %>% filter(!is.na(group_marriage)) %>%
group_by(religion, group_marriage) %>%
summarise(n=n()) %>% #그룹별행의 갯수 카운트
mutate(total_group=sum(n)) %>% # 2가지종류 (종교유무)
mutate(divorce_rate=(n/total_group)*100) %>%
filter(group_marriage=="divorce")
ggplot(data=div2, aes(x=religion, y=divorce_rate,
fill=religion)) + geom_col()