텍스트 마이닝

-문자로된 데이터에서 가치 있는 정보를 얻어내는 분석 기법

-SNS나 웹 사이트에 올라온 글을 분석해 사람들이 어떤 이야기를 나누고 있는지 파악할 때 활용

-형태소 분석 : 문장을 구성하는 어절들이 어떤 품사로 되어있는지 분석

 

분석절차

형태소 분석 

-명사, 동사 형용사등을 의미를 지닌 품사 단어 추출

-빈도표 만들기

-시각화

 

힙합 가사 텍스트 마이닝

텍스트 마이닝 준비하기

텍스트 다운로드 및 설치

 

install.packages("KoNLP") 인스톨이 안될 때

#스칼라 파일 

https://www.facebook.com/notes/r-korea-krugkorean-r-user-group/konlp-%EC%84%A4%EC%B9%98-%EC%9D%B4%EC%8A%88-%EA%B3%B5%EC%9C%A0/1847510068715020/

 

KoNLP 설치 이슈 공유 | Facebook

안녕하세요, 현재 코드 내부적인 이슈로 KoNLP 패키지가 cran에서 내려져 있습니다. github 버전으로 설치해야 해서 해당 내용을 공유합니다. (최초 아카이브 버전을 공유했었는데, 설치가 제대로 진행되지 않는 이슈가 있어서 수정합니다.) 아래 코드에서 의존성 패키지들이 설치 되지 않고 에러가 발생할 수도 있습니다만, 아래와 같이 에러 메세지에서 출력되는 의존성 패키지들을 먼저 설치후에 실행하시면 됩니다. rJava를 설치하는 방법과 함께 공유합니다

www.facebook.com

C:\R\R-3.6.3\library\KoNLP\java

scala-library-2.11.8.jar
5.48MB

 

https://github.com/cardiomoon/kormaps2014/blob/master/kormaps2014.Rmd

install.packages('rJava')
install.packages('stringr')
install.packages('hash')
install.packages('Sejong')
install.packages('RSQLite')
install.packages('devtools')
install.packages('dplyr')

install.packages('tau')

install.packages("multilinguer")
library(multilinguer)
install_jdk()
install.packages(c('stringr', 'hash', 'tau', 'Sejong', 'RSQLite', 'devtools'), type = "binary")
install.packages("remotes")
remotes::install_github('haven-jeon/KoNLP', upgrade = "never", INSTALL_opts=c("--no-multiarch"))

install.packages("https://cran.r-project.org/src/contrib/Archive/KoNLP/KoNLP_0.80.2.tar.gz", repos = NULL, type="source")
#패키지 설치
install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")
#########라이브러리 로드 해보고 없으면 인스톨

#패키지 로드
library(KoNLP)
library(dplyr)

#패키지 로드 에러 발생할 경우 - java 설치 경로 확인 후 경로 설정
# java 폴더 경로 설정
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jdk1.8.0_171")

#사전 설정하기
useNIADic()

#데이터 준비
#데이터 불러오기
txt <- readLines("hiphop.txt")

head(txt)

#특수문자 제거
install.packages("stringr")

#일단 먼저 로드 해보고 없으면 인스톨 하기
library(stringr)

#특수문자 제거
txt <- str_replace_all(txt, "\\W", " ") # 모든 특수기호를 찾아서 공백 처리
head(txt)
class(txt)
dim(txt)
View(txt)

#명사 추출하기
extractNoun("대한민국의 영토는 한반도와 그 부속 도시로 한다.")
#가사에서 명사 추출
nouns<-extractNoun(txt)
#추출한 명사 리스트를 문자열 백터로 변환, 단어별 빈도표 생성
wordcount<-table(unlist(nouns))

#자주 사용된 단어 빈도표 만들기
#데이터 프레임으로 변환
df_word<-as.data.frame(wordcount,stringsAsFactors = F)

#변수명 수정
df_word<-rename(df_word,
                word=Var1,
                freq=Freq)
#두 글자 이상 단어 추출
df_word<-filter(df_word,nchar(word)>=2)
top_20<-df_word%>%
        arrange(desc(freq))%>%
        head(20)

#워드 클라우드 만들기
#패키지 패키지 설치
#패키지 설치
install.packages("wordcloud")
#패키지 로드
library(wordcloud)
library(RColorBrewer)
#단어 색상 목록 만들기
pal<-brewer.pal(8,"Dark2") #다크2 색상 목록에 8개 색상 추출

#워드 클라우드 생성
set.seed(1234)#난수 고정
wordcloud(words = df_word$word,#단어
          freq = df_word$freq,#빈도 freq
          min.freq = 2,#최소 단어 빈도
          max.words = 200,#표현단어 수
          random.order = F,#고빈도 단어 중앙배치
          rot.per=.1,#회전 단어 비율
          scale = c(4,0.3),#단어 크기 범위
          colors = pal) #색상 목록

#상위 20개만 가져오기
wordcloud(words = top_20$word,#단어
          freq = top_20$freq,#빈도 freq
          min.freq = 2,#최소 단어 빈도
          max.words = 200,#표현단어 수
          random.order = F,#고빈도 단어 중앙배치
          rot.per=.1,#회전 단어 비율
          scale = c(4,0.3),#단어 크기 범위
          colors = pal) #색상 목록

#여고생을 고민거리로 만드시오(호지수씨 왈)
#패키지 설치
install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")
#########라이브러리 로드 해보고 없으면 인스톨

#패키지 로드
library(KoNLP)
library(dplyr)

#패키지 로드 에러 발생할 경우 - java 설치 경로 확인 후 경로 설정
# java 폴더 경로 설정
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jdk1.8.0_171")

#사전 설정하기
useNIADic()

#데이터 준비
#데이터 불러오기
txt <- readLines("C:/rStudy/20200403/remake.txt")

head(txt)

#특수문자 제거
install.packages("stringr")

#일단 먼저 로드 해보고 없으면 인스톨 하기
library(stringr)

#특수문자 제거
txt <- str_replace_all(txt, "\\W", " ") # 모든 특수기호를 찾아서 공백 처리 # gsub 함수와 동일한 역할을 해준다.
head(txt)

class(txt) # character 문자열 확인
dim(txt) # NULL 확인

View(txt) # 4261 번 행까지 만들어진다.


#가장 많이 사용된 단어 알아보기

#고민글에서 명사추출
nouns <- extractNoun(txt)
class(nouns) # list
dim(nouns) # NULL
View(nouns)

# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
# 리스트타입은 테이블 함수 사용 못한다. 그래서 리스트를 풀어줘야 한다. 이 때, 사용하는 함수가 [unlist] 함수
wordcount <- table(unlist(nouns))
class(wordcount) # table

# 자주 사용된 단어 빈도표 만들기
df_word <- as.data.frame(wordcount, stringsAsFactors = F) # wordcount(스트링)의 팩터값을 없앤다, 데이터프레임으로 변환한다.
class(df_word) # data.frame
dim(df_word) # 3008 , 2
summary(df_word)

# 변수명 수정
df_word <- rename(df_word,
                  word = Var1,
                  freq = Freq)

# 두 글자 이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 2) # df_word 에서 word 컬럼 데이터 중에 글자의 개수가 2개 이상인 것만 filter로 걸러낸다.
class(df_word) # data.frame
dim(df_word) # 2508, 2
summary(df_word)


#빈도수를 기준으로 빈도수가 높은 상위 20개만 꺼내온다.(freq 컬럼을 이용해서 내림차순으로 정렬)
top_50 <- df_word %>% 
  arrange(desc(freq)) %>% 
  head(50)
class(top_50)
dim(top_50)
summary(top_50)
str(top_50)

# 패키지 준비하기
# 패키지 설치(로드 먼저 해보고 설치)
install.packages("wordcloud")

#패키지 로드
library(wordcloud)
library(RColorBrewer)

# 단어 색상 목록 만들기
pal <- brewer.pal(8, "Dark2") # Dar2 색상 목록에서 8개 색상 추출

set.seed(1234)                  #난수 고정
wordcloud(words= top_50$word,   # 단어
          freq = top_50$freq,  # 빈도
          min.freq = 2,         # 최소 단어 빈도
          max.words = 200,      # 표현 단어 수
          random.order = F,     # 고빈도 단어 중앙 배치
          rot.per = .1,         # 회전 단어 비율
          scale = c(4, 0.3),    # 단어 크기 범위
          colors = pal)         # 색상 목록

#국정원 트윗 텍스트 마이닝
#국정원계정 트윗 데이터
# 국정원 대선 개입 사실이 밝혀져 논란이 됐던 2013년 6월, 독립 언론 뉴스타파가 인터넷을 통해
# 국정원 계정으로 작성된 3744개 트윗

#데이터 로드
twitter<-read.csv("twitter.csv",
                  header = T,
                  stringsAsFactors = F,
                  fileEncoding = "UTF-8")
#변수명 수정
twitter<-rename(twitter,
                no=번호,
                id=계정이름,
                date=작성일,
                tw=내용)

#특수 문자 제거
twitter$tw <- str_replace_all(twitter$tw, "\\W", " ")
head(twitter$tw)

#단어 빈도표 만들기
#트윗에서 명사 추출
nouns<-extractNoun(twitter$tw)

#추출한 명사 list를 문자열 백터로 변환, 단어별 빈도표 생성
wordcount<-table(unlist(nouns))

#데이터 프레임으로 변환
df_word<-as.data.frame(wordcount,stringsAsFactors = F)

#변수명 수정
df_word<-rename(df_word,
                word=Var1,
                freq=Freq)

# 두 글자 이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 3) # df_word 에서 word 컬럼 데이터 중에 글자의 개수가 3개 이상인 것만 filter로 걸러낸다.
class(df_word) # data.frame
dim(df_word)  # 4921 2
summary(df_word)

top_40<-df_word%>%
  arrange(desc(freq))%>%
  head(40)

# 단어 색상 목록 만들기
pal <- brewer.pal(8, "Dark2") # Dar2 색상 목록에서 8개 색상 추출

set.seed(1234)                  #난수 고정
#상위 40개만 가져오기
wordcloud(words = top_40$word,#단어
          freq = top_40$freq,#빈도 freq
          min.freq = 2,#최소 단어 빈도
          max.words = 200,#표현단어 수
          random.order = F,#고빈도 단어 중앙배치
          rot.per=.1,#회전 단어 비율
          scale = c(4,0.4),#단어 크기 범위
          colors = pal) #색상 목록


#
install.packages("wordcloud2")
install.packages("tm")
library(devtools)
library(htmlwidgets)
library(htmltools)
library(jsonlite)
library(yaml)
library(base64enc)
library(tm)
library(wordcloud2)


#워드 클라우드 그리기(기본)
wordcloud2(top_40)

#3.1 클라우드 2 크기 , 색변경
wordcloud2(top_40, size=0.5, col="random-dark")

#3.2키워드 회전 정도 조절
wordcloud2(top_40, size=0.5, col="random-dark", rotateRatio=0)

#3.3배경 색 검정
wordcloud2(top_40, size=0.5, col="random-dark", backgroundColor="black")

# 특정 개수 이상 추출되는 글자만 색깔을 변경하여 나타나도록
# https://html-color-codes.info/Korean/

#사이값 지정시 : (weight > 800 && weight <1000)
# 100개 이상 검색될 시 노랑, 아니면 초록으로 표현
In_out_colors = "function(word, weight){
                    return(weight > 100) ? '#F3EF12':'#1EC612'}"

#워드클라우드2 그리기
library(wordcloud2)
#기존 모형으로 워드클라우드 2 생성
#모양 선택 : shape= 'circle','cardioid',diamond,triangle-forward,triangle,pentagon,star

wordcloud2(df_word,
           shape = 'star',
           size = 0.8,
           color = htmlwidgets::JS(In_out_colors),
           backgroundColor = "black")

########################################

#단계 구분도
#-지역별 통계치를 색깔의 차이로 표현한 지도
#-인구나 소득같은 특성이 지역별로 얼마나 다른지쉽게 이해할 수 있음

#패키지 준비하기
install.packages("ggiraphExtra")
library(ggiraphExtra)
#구조 확인
str(USArrests)
head(USArrests)

library(tibble)

#행 이름을 state 변수로 바꿔 데이터 프레임 생성
crime<-rownames_to_column(USArrests, var="state")

View(crime)

#지도 데이터와 동일하게 맞추기 위해 state의 값을 소문자로 수정
crime$state <- tolower(crime$state)

#tibble(티블)은 행 이름을 가질 수 있지만(예:일반 데이터 프레임에서 변환할 때)
#연산자로 서브 셋팅할 때 제거됩니다
#null이 아닌 행 이름을 티블에 지정하려고 하면 경고가 발생합니다
#일반적으로 행 이름은 기본적으로 다른 모든 열과 의미가 다른 문자 열이므로 행 이름을
#사용하지 않는 것이 가장 좋습니다
#이러한 함수를 사용하면
#데이터프레임에 행이름(has_rownames())이 있는지 감지하거나,
#제거하거나(remove_rownames())
#명시적 열(rownames_to_column()및 column_to_rownames())사이에서 앞뒤로 변환 할 수 있습니다.
#rowid_to_column()도 포함되어 있습니다
#이것은 1부터 시작하여 순차적인 행 id를 오름차순으로 하는 데이터 프레임의 시작 부분에
# 열을 추가합니다. 기존 행 이름이 제거됩니다.

#미국 주 지도 데이터 준비하기
install.packages("maps")
library(ggplot2)
states_map<-map_data("state")
str(states_map)

install.packages("mapproj")
#단계 구분도 만들기
ggChoropleth(data= crime, # 지도에 표현할 데이터
             aes(fill=Murder, #색깔로 표현할 변수
                 map_id=state),#지역기준변수
                  map=states_map)#지도데이터

#인터랙티브 단계 구분도 만들기
ggChoropleth(data= crime, # 지도에 표현할 데이터
             aes(fill=Murder, #색깔로 표현할 변수
                 map_id=state),#지역기준변수
             map=states_map,#지도데이터
             interactive = T)#인터렉티브

# 대한민국 시도별 인구 단계 구분도 만들기
#패키지 준비하기
install.packages("stringi")
install.packages("devtools")
#https://github.com/cardiomoon/kormaps2014/blob/master/kormaps2014.Rmd
devtools::install_github("cardiomoon/kormaps2014")
library(kormaps2014)

#대한민국 시도별 인구 데이터 준비하기
str(changeCode(korpop1))

library(dplyr)
korpop1<-rename(korpop1,
                pop=총인구_명,
                name=행정구역별_읍면동)
str(changeCode(kormap1))


library(mapproj)
#인터랙티브 단계 구분도 만들기
ggChoropleth(data= korpop1, # 지도에 표현할 데이터
             aes(fill=pop, #색깔로 표현할 변수
                 map_id=code,#지역기준 변수
                 tooltip=name),#지도위에 표시할 지역명
             map=kormap1,#지도데이터
             interactive = T)#인터렉티브
#대한민국 시도별 결핵 환자 수 단계 구분도 만들기
str(changeCode(tbc))
#인터랙티브 단계 구분도 만들기
ggChoropleth(data= tbc, # 지도에 표현할 데이터
             aes(fill=NewPts, #색깔로 표현할 변수
                 map_id=code,#지역기준 변수
                 tooltip=name),#지도위에 표시할 지역명
             map=kormap1,#지도데이터
             interactive = T)#인터렉티브

# 패키지 설치 : 인터랙티브 그래프 만들기
install.packages("plotly")
library(plotly)

# ggplot 으로 그래프 만들기
library(ggplot2)
p <- ggplot(data = mpg, aes(x = displ, y = hwy, col = drv)) + geom_point()

# 인터랙티브 그래프 만들기
ggplotly(p)
# https://plotly.com/ : 패키지 설명 사이트

# 인터랙티브 막대 그래프 만들기
p <- ggplot(data = diamonds, aes(x=cut, fill = clarity))+
  geom_bar(position = "dodge")

ggplotly(p)


install.packages("dygraphs")
library(dygraphs)

# 데이터 준비하기 ( 인구대비 실업률 )
economics <- ggplot2::economics
head(economics)


library(xts)
eco <- xts(economics$unemploy, order.by = economics$date)  # 실업자수를 정렬시키겠다. 날짜컬럼을 기준으로
head(eco)

#그래프 생성
dygraph(eco)

#날짜 범위 선택가능
dygraph(eco)%>%dyRangeSelector()

#여러 값 표현하기
#저축률
eco_a<-xts(economics$psavert, order.by = economics$date)

#실업자 수
eco_b<-xts(economics$unemploy/1000,order.by = economics$date)

# 합치기
eco2 <- cbind(eco_a, eco_b)                   # 데이터 결합합
colnames(eco2) <- c("psavert", "unemploy")    # 변수명 바꾸기
head(eco2)

# 그래프 만들기
dygraph(eco2) %>% dyRangeSelector()

#http://dygraphs.com/


# 통계 분석 기법을 이용한 가설 검정
# 
# 13-1. 통계적 가설 검정이란?
#   
#   기술 통계와 추론 통계
# 
# - 기술 통계(Descriptive statistics)
# 
# -> 데이터를 요약해 설명하는 통계 기법
# 
# -> ex) 사람들이 받는 월급을 집계해 전체 월급 평균 구하기
# 
# - 추론 통계(Inferential statistics)
# 
# -> 단순히 숫자를 요약하는 것을 넘어 어떤 값이 발생할 확률을 계산하는 통계 기법
# 
# -> ex) 수집된 데이터에서 성별에 따라 월급에 차이가 있는 것으로 나타났을 때, 이런 차이가 우연히 발생할 확률을 계산

# 추론통계
#   - 이런 차이가 우연히 나타날 확률이 작다
#  -> 성별에 따른 월급차이가 통계적으로 유의 하다고 결론
#   - 이런 차이가 우연히 나타날 확률이 크다.
#   -> 성별에 따른 월급차이가 통계적으로 유의하지 않다고 결론
# - 기술 통계분석에서 집단간 차이가 있는 것으로 나타났더러도 이는 우연에 의한 차이일 수 있음
#   -> 데이터를 이용해 신뢰 할 수 있는 결론을 내리려면 유의확률을 계산하는 통계적 가설 점정 절차를 거쳐야함

# 통계적 가설 검정
# 
# 1) 통계적 가설 검정(Statistical hypothesis test)
# 
# - 유의 확률을 이용해 가설을 검정하는 방법
# 
# 2) 유의 확률(Significance probability, p-value)
# 
# - 실제로는 집단 간 차이가 없는데 우연히 차이가 있는 데이터가 추출될 확률
# 
# - 분석 결과 유의확률이 크게 나타났다면
# 
# --> 집단 간 차이가 통계적으로 유의하지 않다고 해석
# 
# --> 실제로 차이가 없더라도 우연에 의해 이 정도의 차이가 관찰될 가능성이 크다는 의미
# 
# - 분석 결과 유의확률이 작게 나타났다면
# 
# --> 집단 간 차이가 통계적으로 유의하다고 해석


# --> 실제로 차이가 없는데 우연히 이 정도의 차이가 관찰될 가능성이 작다, 우연이라고 보기 힘들다는 의미

# 13-2 검정 - 두 집단의 평균 비교
# T검정 t-test
# -두집단의 평균에 통계적으로 유의한 차이가 있는지 알아 볼 때 사용하는 통계 분석 기법
# 
# 3데이터 준비
mpg <- as.data.frame(ggplot2::mpg)
str(mpg)

library(dplyr)

mpg_diff <- mpg %>%
  select(class, cty) %>% #전체 데이터를 갖고 있는 mpg를 이용하여 두가지 컬럼 값을 선택
  filter(class %in% c("compact","suv")) #filter : 행 선택 // %in% : 값 매칭 추출해주는 연산


head(mpg_diff)
table(mpg_diff$class)
t.test(data=mpg_diff,cty~class, var.equal=T)
#p-value: 유의 확률값 

#일반 휘발류와 고급 휘발류의 도시 연비 t 검정
#데이처준비
mpg_diff2<-mpg%>%
  select(fl,cty)%>%
  filter(fl %in% c("r","p")) # r:regular, p:premium

table(mpg_diff2$fl)

t.test(data=mpg_diff2,cty~fl,var.equal=T)

#상관분석 - 두 변수의 관계성 분석
# # - 두연속 변수가 서로 관련이 있는지 검정하는 통계 분석 기법
# 상관계수
# -두 변수 가 얼마나 관련되어있는지, 관련성의 정도를 나타내는 값
# -0~1 사이의 값을 지니고 1에 가까울 수록 연관설이 크다는 의미
# - 상관계수가 양수면 정비례 , 음수면 반비례 관계

#실업자 수와 개인 소비 지출의 상관 관계
#데이터 준비
economics<-as.data.frame(ggplot2::economics)

#상관 분석
cor.test(economics$unemploy, economics$pce)

#상관 행렬
# - 여러 변수 간 상관계수를 행렬로 나타낸 표
# - 어떤 변수끼리 관련이 크고 적은지 파악할 수 있음

#데이터 준비
head(mtcars)

#상관 행렬 만들기
car_cor<-cor(mtcars) #상관 행렬 생성
round(car_cor,2)# 소수점 셋째 자리에서 반올림하여 출력

#상관행렬 히트맵 만들기
#- 히트맵(heat map): 값의 크기를 색깔로 표현한 그래프
install.packages("corrplot")
library(corrplot)

corrplot(car_cor)

corrplot(car_cor,method = "number")

#다양한 파라미터 지정하기
col<-colorRampPalette(c("#BB4444","#EE9988","#FFFFFF","#77AADD","#4477AA"))

#색상 팔레트로 색상 직접 지정 / 색상 팔레트 만들시 색상 하나는 있어야함
#얘네가 만들어낸 다섯가지 색상을 지정해주고 그 사이사이는 200가지 색상이 들어감

corrplot(car_cor,
         method="color",      #색깔로 표현
         col = col(200),      #색상 200개 선정
         type="lower",        #왼쪽 아래 행렬만 표시
         order = "hclust",    #유사한 상관계수끼리 군집화
         addCoef.col="black", #상관계수 색깔
         tl.col="black",      #변수명 색깔
         tl.srt=45,           #변수명 45도 기울임
         diag=F)              #대각 행렬 제외

+ Recent posts