ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210803_1(데이터분석, R, 자연어처리/텍스트마이닝)
    BigData 2021. 8. 3. 17:32
    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()

Designed by Tistory.