28. SPSS 파일(.sav) 불러오기


r

Overview

R에서 SPSS 파일(.sav)을 사용하여 데이터를 가공하는 방법을 알아본다.

예제 파일1 : Koweps_Codebook.xlsx
예제 파일2 : Koweps_hpc10_2015_beta1.zip


외부 통계 프로그램 파일 로드

.sav 파일의 데이터를 전처리하는 과정이다.

# install.packages('foreign')

# 외부 통계 프로그램 파일 로드 패키지
library(foreign)

fileName <- 'Koweps_hpc10_2015_beta1.sav'
raw_data <- read.spss(file = fileName, to.data.frame = T)

raw_data
str(raw_data)

# 코드 북 파일 : Koweps_Codebook.xlsx
welfare <- raw_data[c('h10_g3', 'h10_g4', 'h10_g10', 'h10_g11', 'h10_eco9', 'p1002_8aq1', 'h10_reg7')]
str(welfare)
dim(welfare)

# help(rename)
# 가독성 있게 컬럼 이름을 변경( colnames로도 가능)
welfare <- rename(welfare, gender=h10_g3, birth=h10_g4, 
                  marriage=h10_g10, religion=h10_g11, code_job=h10_eco9, 
                  income=p1002_8aq1, code_region=h10_reg7 )
head(welfare)
tail(welfare)
dim(welfare) # 16664     7
str(welfare)

write.csv(welfare, 'welfare.csv', row.names=F, quote=F)

성별에 따른 월급 차이

# 성별에 따른 월급 차이

library(ggplot2)
library(dplyr)

# welfareSavEx01 에서 만들어진 복지데이터 로드
welfare <- read.csv('welfare.csv')

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

# 데이터 전처리
welfare$gender <- ifelse(welfare$gender == 9, NA, welfare$gender)
welfare$gender <- ifelse(welfare$gender == 1, 'male', 'female')

# 성별 빈도수 정리
# table함수를 통해 성별의 빈도를 구할 수 있음
mData <- as.data.frame(table(welfare$gender))
colnames(mData) <- c('Gender', 'Freq')
mData

ggplot(mData, aes(x = Gender, y = Freq, color = Gender, fill = Gender)) + geom_bar(stat = 'identity') + theme_minimal(base_family = 'AppleGothic') + labs(title = 'Gender Frequency', subtitle = 'Sub Title', caption = 'copyright etc.')

# 급여
class(welfare$income)
summary(welfare$income)

# 월급의 결측치는 분석에서 제외
qplot(welfare$income, bins = 50) + xlim(0, 1000)
welfare$income <- ifelse(welfare$income %in% c(0, 9999), NA, welfare$income)
table(is.na(welfare$income))

# 소득이 있는 사람들 중 성별 별 평균 급여
gender_income <- welfare %>% filter(!is.na(income)) %>% group_by(gender) %>% summarise(mean_income = mean(income))
gender_income

ggplot(gender_income, aes(x = gender, y = mean_income, color = gender, fill = gender)) + geom_bar(stat = 'identity') + theme_minimal(base_family = 'AppleGothic') + labs(title = 'Gender Income', subtitle = 'Sub Title', caption = 'copyright etc.')

나이와 월급의 상관 관계

# 나이와 월급의 상관 관계

library(ggplot2)

getwd()
setwd('../../R_script/largedata/')
setwd('Documents/_2_WorkSpace/_2_R-Programming/R-Programming/R_data/191023/')
welfare <- read.csv('welfare.csv')

# 태어난 연도 히스토그램
qplot(welfare$birth, bins = 30)

# 나이 컬럼 생성(2015년 기준자료)
age <- 2015 - welfare$birth + 1
welfare$age <- age
summary(age)

# 나이 히스토그램
qplot(welfare$age, bins = 30)

# 월급 
age_income <- welfare %>% filter(!is.na(income)) %>% group_by(age) %>% summarise(mean_income = mean(income))
age_income

# geon_line : 꺾은선 그래프
ggplot(data = age_income, aes(x = age_income$age, y = age_income$mean_income)) + geom_line()+ labs(title = 'Age and Income')


연령대에 따른 월급 차이

# 연령대에 따른 월급 차이

library(ggplot2)

welfare <- read.csv('welfare.csv')

# 나이 컬럼 생성(2015년 기준자료)
welfare$age <- 2015 - welfare$birth + 1

mAge <- welfare$age

range(mAge)

# 연령대 나누기
welfare <- welfare %>% mutate(age_group = ifelse(mAge < 30, 'young', ifelse(mAge < 60, 'mid', 'old')))

head(welfare[c('age', 'age_group')])

unique(welfare$age_group)
table(welfare$age_group)

chart1 <- as.data.frame(table(welfare$age_group))
colnames(chart1) <- c('AgeGroup', 'Freq')

# scale_x_discrete : x 축 순서
ggplot(data = chart1, aes(x = AgeGroup, y = Freq, col = AgeGroup, fill = AgeGroup)) + geom_bar(stat = 'identity') + scale_x_discrete(limits = c('young', 'mid', 'old'))

age_group_income <- welfare %>% filter(!is.na(income)) %>% group_by(age_group) %>% summarise(mean_age_group_income = mean(income))

ggplot(data = age_group_income, aes(x = age_group, y = mean_age_group_income, fill = age_group, col = age_group)) + geom_bar(stat = 'identity')


직업별 월급 차이

# 직업별 월급 차이 

library(readxl)

df1 <- data.frame(col1 = c('kim', 'lee'), col2 = c(100, 200))
df2 <- data.frame(col1 = c('kim', 'park'), col3 = c(300, 400))

left_join(df1, df2, id = 'col1')
full_join(df1, df2, id = 'col1')

welfare <- read.csv('welfare.csv')
unique(welfare$code_job)

jobList <- read_excel('Koweps_Codebook.xlsx', sheet = 2, col_names = T)
jobList

data01 <- full_join(welfare, jobList, id = 'code_job')
data01

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

job_top10 <- job_income %>% arrange(desc(mean_income)) %>% head(10)
job_top10

# reorder 함수를 이용한 sort
# coord_flip : 긴 이름으로 인한 축 반전
ggplot(data = job_top10, aes(x = reorder(job, mean_income), y = mean_income, fill = job, col = job)) + geom_bar(stat = 'identity') + theme_minimal(base_family = 'AppleGothic') + coord_flip()

# job_income_bottom_10
job_bot10 <- job_income %>% arrange(mean_income) %>% head(10)
job_bot10
ggplot(data = job_bot10, aes(x = reorder(job, mean_income), y = mean_income, fill = job, col = job)) + geom_bar(stat = 'identity') + theme_minimal(base_family = 'AppleGothic') + coord_flip()



지역별 연령대 비율

# 지역별 연령대 비율 

library(ggplot2)

welfare <- read.csv('welfare.csv')
welfare$code_region

# 지역구분
mRegion <- c('서울', '수도권(인천/경기)', '부산/경남/울산', '대구/경북', '대전/충남', '강원/충북', '광주/전남/전북/제주도')

list_reg <- data.frame(code_region = c(1:7), region = mRegion)
list_reg

welfare <- left_join(welfare, list_reg, id = 'code_region')
welfare

welfare$age <- 2015 - welfare$birth + 1
welfare <- welfare %>% mutate(age_group = ifelse(age < 30, 'young', ifelse(age < 60, 'mid', 'old')))

# 지역별 / 연령별 그룹핑하여 빈도수 비율
reg_age_group <- welfare %>% group_by(region, age_group) %>% summarise(cnt = n()) %>% mutate(tot_group = sum(cnt)) %>% mutate(pct = round(100 * cnt / tot_group, 1))
reg_age_group

# geom col함수의 position 옵션 ~ dodge, dodge2 옵션
# dodge : bar 간격을 붙여 보여줌 
# dodge2 : bar 간격을 떼어줌
ggplot(data = reg_age_group, aes(x = region, y = pct, fill = age_group)) + geom_col(position = 'dodge2') + coord_flip() + theme_minimal(base_family = 'AppleGothic')






© 2019. by RaP0d

Powered by aiden