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")
##################################################
#연령대별 이혼율을 조사하라
# ages가 있는지 확인
table(welfare$ages)
table(is.na(welfare$ages))
table(welfare$marriage)
# 데이터 처리부분있어야됨 1은 marriage 3은 divorce 나머지는 NA로 처리하여
# group_marriage 생성
welfare$group_marriage <- ifelse(welfare$marriage==1,"marriage",
ifelse(welfare$marriage==3,"divorce",NA))
table(is.na(welfare$group_marriage)) # 필터링 필요
table(welfare$group_marriage)
ages_divorce <- welfare %>% filter(!is.na(group_marriage)) %>%
group_by(ages,group_marriage) %>%
summarise(n=n()) %>%
mutate(total_group=sum(n)) %>% # 연령대별 통합
mutate(divorce_rate=(n/total_group)*100)
# ages group_marriage n total_group divorce_rate
# <chr> <chr> <int> <int> <dbl>
# 1 middle divorce 437 4918 8.89
# 2 middle marriage 4481 4918 91.1
# 3 old divorce 273 4165 6.55
# 4 old marriage 3892 4165 93.4
# 5 young divorce 2 60 3.33
# 6 young marriage 58 60 96.7
ggplot(data=ages_divorce , aes(x=ages, y=divorce_rate,fill=group_marriage))+
geom_col() + scale_x_discrete(limit=c("young","middle","old"))
# 필요한 내용만 뽑기
div3 <- ages_divorce %>% filter(group_marriage=="divorce")
# 시각화
ggplot(data=div3 , aes(x=ages, y=divorce_rate,fill=ages))+
geom_col() + scale_x_discrete(limit=c("young","middle","old"))
##############################################
#연령대, 종교유무, 이혼율의 비율표를 만드시오
# 단, 연령대에서 young 는 제외하시오
table(welfare$ages)
table(welfare$religion)
table(welfare$group_marriage)
rate2 <- welfare %>% filter(ages!="young" &!is.na(group_marriage)) %>%
group_by(ages,religion,group_marriage) %>%
summarise(n=n()) %>%
mutate(tot=sum(n)) %>%
mutate(div_rate=(n/tot)*100) %>%
filter(group_marriage=="divorce")
# ages religion group_marriage n tot div_rate
# <chr> <chr> <chr> <int> <int> <dbl>
# 1 middle no divorce 260 2681 9.70
# 2 middle yes divorce 177 2237 7.91
# 3 old no divorce 123 1884 6.53
# 4 old yes divorce 150 2281 6.58
ggplot(data=rate2, aes(x=ages, y=div_rate, fill=religion))+
geom_col(position = "dodge")
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")
#########################################
# 지역별 연령대 비율
table(welfare$code_region)
table(is.na(welfare$code_region)) # 7개 지역으로 나누어져있음
# "1. 서울 2. 수도권(인천/경기) 3. 부산/경남/울산
#4.대구/경북 5. 대전/충남 6. 강원/충북 7.광주/전남/전북/제주도"
# 데이터프레임 생성후 컬럼 병합
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 <- left_join(welfare,list_region,id="code_region")
table(welfare$region)
table(is.na(welfare$region))
pop <- welfare %>% group_by(region, ages) %>%
summarise(n=n()) %>%
mutate(tot=sum(n))%>%
mutate(per=(n/tot)*100)
ggplot(data=pop, aes(x=region, y=per, fill=ages))+
geom_col(position = "dodge") + coord_flip()
### 지역별 노년층 비율 올림차순으로 정렬하고 그래프로 출력하라
pop_old <- pop %>% filter(ages=="old") %>%
arrange(per)
ggplot(data = pop_old, aes(x=reorder(region,per), y=per, fill=region))+
geom_col() + coord_flip() + order()
############## 자연어 처리 / 텍스트 마이닝
# 패키지 설치
install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP") # 정상적인 방법으로 설치안됨4.0 이하버전가능
install.packages("RSQLite")
install.packages("Sejong")
install.packages("hash")
install.packages("tau")
install.packages("devtools")
Sys.getenv("JAVA_HOME") # 경로확인후 안되있으면 JAVA_HOME='' 설정
install.packages(c('hask')) # 방식으로 설치가능 # hask 얘도 설치안됨
#패키지 로드
library(tau)
library(dplyr)
library(hash)
library(rJava)
#library(hask)
library(vctrs)
library(Sejong)
library(RSQLite)
library(KoNLP)
library(stringr)
useNIADic()
################ 힙합 가서 텍스트 마이닝
txt <- readLines("hiphop.txt")
head(txt)
# [1] "\"보고 싶다" "이렇게 말하니까 더 보고 싶다"
# [3] "너희 사진을 보고 있어도" "보고 싶다"
# [5] "너무 야속한 시간" "나는 우리가 밉다"
#stringr 을 이용해서 문서내부의 특수문자를 제거한다
txt <- str_replace_all(txt,"\\W"," ")
head(txt)
# 명사 추출하기 약간어설프네
extractNoun("대한민국의 영토는 한반도와 그 부속도서로 한다")
# "대한민국" "영토" "한반도" "부속도서" "한"
#hiphop.txt에서 명사를 추출하여 변수에 저장하자
nouns <- extractNoun(txt)
nouns[1:5]
wordcount<- table(unlist(nouns))
class(wordcount) # 빈도 테이블
head(wordcount,30)
## 빈도표를 ===> 데이터 프레임으로 전환
df_word <- as.data.frame(wordcount, stringsAsFactors = F)
# Factors=T 가 될경우 종류갯수를 세어 버림
head(df_word)
# Var1 Freq
# 1 12
# 2 2
# 3 1 9
# 4 100 3
# 5 168 1
# 6 17 1
############### 전처리
# 1. 컬럼 수정 var1 -> word , Freq -> freq
df_word <- rename(df_word, word=Var1, freq=Freq)
head(df_word)
# 2. 두글자 이상만 선택하기
df_word <- filter(df_word,nchar(word)>=2)
head(df_word)
## 워드 클라우드 그리기
install.packages("wordcloud")
library(wordcloud)
library(RColorBrewer)
## 색상표 준비
pal <- brewer.pal(8,"Dark2") # Dark2라는 색상표에서 8가지 색을 추출
set.seed(1234) # 처름 시작값을 주어 매번 같은 값이 나온게 만드는것
wordcloud(word=df_word$word, # 단어
freq=df_word$freq, # 빈도
min.freq = 2, # 최소빈도
max.words =200, # 사용할 단어갯수
random.order= F, # 무작위 배치 F
rot.per = .1, # 회전비율 0.1
scale = c(2.5,0.3), # 단어크기 범위
colors = pal
)
## hiphop에서 가장 많이 나온 단어 10개 출력하고 그래프로
top_10 <- df_word %>% arrange(desc(freq)) %>% head(10)
pal <- brewer.pal(8,"Purples") # Dark2라는 색상표에서 8가지 색을 추출
set.seed(1234) # 여러번 실행해도 동일한 클라우드를 그리도록 한다
wordcloud(word=top_10$word, # 단어
freq=top_10$freq, # 빈도
min.freq = 2, # 최소빈도
max.words =10, # 사용할 단어갯수
random.order= F, # 무작위 배치 F
rot.per = .1, # 회전비율 0.1
scale = c(2.5,0.3), # 단어크기 범위
colors = pal
)
library(ggplot2)
ggplot(data=top_10, aes(x=reorder(word,-freq), y=freq, fill=reorder(word,-freq)))+
geom_col()