텍스트 마이닝
-문자로된 데이터에서 가치 있는 정보를 얻어내는 분석 기법
-SNS나 웹 사이트에 올라온 글을 분석해 사람들이 어떤 이야기를 나누고 있는지 파악할 때 활용
-형태소 분석 : 문장을 구성하는 어절들이 어떤 품사로 되어있는지 분석
분석절차
형태소 분석
-명사, 동사 형용사등을 의미를 지닌 품사 단어 추출
-빈도표 만들기
-시각화
힙합 가사 텍스트 마이닝
텍스트 마이닝 준비하기
텍스트 다운로드 및 설치
install.packages("KoNLP") 인스톨이 안될 때
#스칼라 파일
C:\R\R-3.6.3\library\KoNLP\java
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) #대각 행렬 제외
':: IT > R' 카테고리의 다른 글
[빅데이터] 전처리 작업, 오라클 연결, xml/json 다루는 방법, Markdown (0) | 2020.04.07 |
---|---|
[빅데이터]20200402 데이터 전처리 (0) | 2020.04.06 |
[빅데이터] 20200401 qplot, 데이터 프레임, 외부데이터 이용, 데이터 수정 및 파악, 파생변수, 조건문, 데이터 전처리, 그래프 그리기 (0) | 2020.04.01 |
[빅데이터] 20200331 RStudio 설치, plot, 워드클라우드 (0) | 2020.03.31 |
[빅데이터] 20200330 R 정의, 설치, 시각화 (2) | 2020.03.30 |