텍스트 마이닝(Text mining)이란?

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

 

텍스트 마이닝 과정

1. 형태소 분석(Morphology Analysis) - 문장을 구성하는 어절들이 어떤 품사로 되어 있는지 파악

2. 단어 빈도수 분석(TF_Term Frequency) - 형태소 분석으로 어절들의 품사를 파악한 후, '명사', '동사', '형용사' 등 의미를 지닌 품사의 단어를 추출해 각 단어가 얼마나 많이 등장했는지 확인 (명사, 동사 제일 의미 有)

3. 빈도표 만들기

4. 시각화

 

 

 

■ 텍스트 마이닝 준비하기

(1) 패키지 준비하기

- 한글 자연어 분석 패키지 <KoNLP(Korean Natural Language Processing)> 이용

- KoNLP는 자바(Java)가 설치되어 있어야 사용 가능. 사용 중인 OS에 맞는 파일을 다운로드해 설치할 것

자바 다운로드 https://www.java.com/ko/download/manual.jsp

 

모든 운영 체제용 Java 다운로드

모든 운영 체제용 Java 다운로드 권장 사항 Version 8 Update 211 릴리스 날짜: 2019년 4월 16일 Oracle Java 중요 라이센스 업데이트 Oracle Java 라이센스는 2019년 4월 16일 릴리스부터 변경되었습니다. 새로운 Oracle Java SE에 대한 Oracle Technology Network 라이센스 합의서는 이전 Oracle Java 라이센스와는 상당히 다릅니다. 새로운 라이센스는 개인 용도 및 개발 용도와 같

www.java.com

(참고: OS 버전은 [제어판] >> [시스템 및 보안] >> [시스템]의 '시스템 종류'에서 확인 가능)

(참고: 패키지를 로드했는데 에러 메시지가 출력된다면? - 포스팅 하단 참고)

 

 

(2) rJava, memoise 패키지 설치

- KoNLP를 사용하려면 rJava, memoise 패키지가 설치되어 있어야 함. 두 패키지를 먼저 설치한 후 KoNLP 설치

install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")

 

(3) dplyr 패키지 로드

- 설치가 완료되면 KoNLP와 전처리 작업에 사용할 dplyr을 로드

library(KoNLP)
library(dplyr)

 

(4) 사전 설정하기

- KoNLP에서 지원하는 NIA 사전은 98만여 개의 단어로 구성 (형태소 분석하는 데 이 사전 이용)

UseNIADic()

 

(5) 데이터 준비하기

- 깃허브(bit.ly/doit_rd)에서 hiphop.txt 파일을 다운로드해 프로젝트 폴더에 삽입 (텍스트 파일에는 멜론 차트 랩/힙합 부문 상위 50곡의 가사 있음)

- readLines()로 불러와 일부를 출력

- hiphop.txt는 아래와 같은 노래들의 가사로 구성되어 있음. 50위 전체 목록은 깃허브에 공유한 SongList.xlsx 파일에 있음.

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

## [1] "\"보고싶다"                    "이렇게 말하니까 더 보고 싶다"
## [3] "너희 사진을 보고 있어도"        "보고 싶다"
## [5] "너무 야속한 시간"              "나는 우리가 밉다"

 

(6) 특수문자 제거하기

- 문장에 이모티콘이나 특수문자가 포함되어 있으면 오류가 발생할 수 있음

- 문자 처리 패키지인 stringrstr_replace_all()을 이용해 문장에 들어 있는 특수문자를 빈칸으로 수정

install.packages("stringr")
library(stringr)

# 특수문자 제거
txt <- str_replace_all(txt, "\\W", " ")

(참고: str_replace_all()에 사용된 기호 \\W는 특수문자를 의미하는 '정규 표현식'. 정규 표현식을 이용하면 문장의 내용 중 이메일 주소, 전화 번호처럼 특정한 규칙으로 되어 있는 부분을 추출 가능)

 

 

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

(1) 명사 추출하기

- KoNLPextractNoun()를 이용하면 문장에서 명사 추출 가능

- 명사를 보면 문장이 무엇에 대한 내용인지 파악 가능

extractNoun("대한민국의 영토는 한반도와 그 부속도서로 한다")

## [1] "대한민국" "영토" "한반도" "부속도서" "한"

 

(2) 빈도표 만들기

- 빈도표는 테이블(table) 형태이므로 다루기 쉽도록 데이터 프레임으로 변환하고 변수명을 수정

# 가사에서 명사 추출
nouns <- extractNoun(txt)

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

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

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

(참고: extractNoun()은 출력 결과를 리스트 형태로 반환. table(unlist(nouns))는 리스트로 되어 있는 nouns를 빈도 테이블로 변환하는 기능을 함.)

 

(3) 자주 사용된 단어 빈도표 만들기

- 한 글자로 된 단어는 의미가 없는 경우가 많기 때문에 nchar()를 이용해 두 글자 이상으로 된 단어만 추출

df_word <- filter(df_word, nchar(word) >= 2)

 

(4) 상위 20개 단어 추출

- 빈도 순으로 정렬한 후 상위 20개 단어 추출

top_20 <- df_word %>%
	arrange(desc(freq)) %>%
    head(20)
    
top_20

##    word freq
## 1   you   89
## 2    my   86
## 3   YAH   80
## 4    on   76
## 5   하나   75
.
.
.

- 텍스트가 힙합 가사이기 때문에 you, my, YAH 같은 영단어가 많이 사용됐다는 것을 알 수 있음

 

 

 워드 클라우드 만들기

워드 클라우드(Word cloud)란?

- 단어의 빈도를 구름 모양으로 표현한 그래프

- 단어의 빈도에 따라 글자의 크기와 색깔이 다르게 표현되기 때문에 어떤 단어가 얼마나 많이 사용됐는지 한 눈에 파악 가능

 

(1) 패키지 준비하기

- wordcloud 패키지 이용

- RColorBrewer 패키지 이용 (글자 색깔을 표현하는 데 사용) cf. RColorBrewer 패키지는 R에 내장되어 있으니 별도로 설치하지 않아도 됨

 

(2) 단어 색상 목록 만들기

- RColorBrewer 패키지의 brewer.pal()을 이용해 단어의 색깔을 지정할 때 사용할 색상 코드(Hex Color Code) 목록 생성

# Dark2 색상 목록에서 8개 색상 추출
pal <- brewer.pal(8, "Dark2")

 

(3) 난수 고정하기

- wordcloud()는 함수를 실행할 때마다 난수를 이용해 매번 다른 모양의 워드 클라우드를 생성함. 항상 동일한 워드 클라우드가 생성되도록 wordcloud()를 실행하기 전에 set.seed()로 난수를 고정

set.seed(1234)

 

(4) 워드 클라우드 만들기

- df_word 이용해 워드 클라우드 생성 (df_word는 단어와 단어가 사용된 빈도, 두 변수로 구성된 데이터 프레임)

- 출력된 워드 클라우드는 많이 사용된 단어일수록 글자가 크고 가운데에 배치

- 덜 사용된 단어일수록 글자가 작고 바깥쪽에 배치되는 형태로 구성

 

 

(5) 단어 색상 바꾸기

pal <- brewer.pal(9, "Blues")[5:9]  # 색상 목록 생성
set.seed(1234)                      # 난수 고정

- 파란색 계열의 색상 목록을 만들어 빈도가 높을수록 진한 파란색으로 표현됨

 

 

 

+ 추가

★ 패키지를 로드했는데 에러 메시지가 출력된다면?

- 'Error : .onLoad failed in loadNamespace() for 'rJava'' 라는 에러 메시지가 출력됐다면 자바가 설치된 폴더의 경로를 설정하는 코드를 실행한 후 다시 패키지를 로드하세요. 설치 경로는 자바의 버전이나 OS에 따라 다를 수 있으니 'C:/Program Files/Java/' 에서 확인한 후 자신의 환경에 맞게 설정하세요.

# java 폴더 경로 설정
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jre1.8.0_111/")

 

 

 

(출처; 가천대학교 컴퓨터공학과, 이영호 교수님)

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

 

■ 선 그래프 - 시간에 따라 달라지는 데이터 표현하기

선 그래프(Line Chart): 데이터를 선으로 표현한 그래프

- 시간에 따라 달라지는 데이터를 표현할 때 이용  >> 공식: x축 - 시간(날짜)

 

** 시계열 데이터(Time Series Data): 일정 시간 간격을 두고 나열된 데이터 ex. 일별 환율

** 시계열 그래프(Time Series Chart): 시계열 데이터를 선으로 표현한 그래프

 

(1) 시계열 그래프 만들기

- economics는 미국의 경제 지표들을 월별로 나타낸 데이터

- 시간에 따라 실업자 수가 어떻게 변하는지 나타낸 시계열 그래프

- x축에는 시간(date), y축에는 실업자 수(unemploy)를 지정하고, 선 그래프를 표현하는 함수 geom_line() 사용

ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line()

>> 실업자 수가 약 5년 주기로 등락을 반복하고, 2005년 이후 급격하게 증가했다가 2010년 이후 다시 감소하는 추세라는 것을 알 수 있음

 

(2) <혼자서 해보기>

Q. psavert(개인 저축률)가 시간에 따라 어떻게 변해 왔는지 알아보려고 합니다. 시간에 따른 개인 저축률의 변화를 나타낸 시계열 그래프를 만들어 보세요.

- x축에는 시간(date), y축에는 변화를 알아보려는 psavert를 지정하고, 선 그래프를 나타내는 함수 geom_line()을 이용

ggplot(data = economics, aes(x = date, y = psavert)) + geom_line()

 

 

 

■ 상자 그림 - 집단 간 분포 차이 표현하기

상자 그림(Box Plot): 데이터의 분포를 직사각형 상자 모양으로 표현한 그래프

- 상자 그림을 보면 분포를 알 수 있기 때문에 평균만 볼 때보다 데이터의 특징을 더 자세히 이해할 수 있다.

- 보통 x축에 범주형, y축에 연속형

- drv(구동 방식)별 hwy(고속도로 연비)를 상자 그림으로 표현하려면 x축을 drv, y축을 hwy로 지정한 후 상자 그림으로 표현하도록 하는 geom_boxplot() 함수를 사용

ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot()

>> 상자 그림은 값을 크기 순으로 나열해 4등분 했을 때 위치하는 값인 '사분위수'를 이용해 그려짐.

 

상자 그림이 의미하는 내용 / 1.5 IQR: 사분위 범위(Q1~Q3 간 거리)의 1.5배

 

 

 

 

 

(출처; 가천대학교 컴퓨터공학과, 이영호 교수님)

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

그래프(Graph)란?

- 데이터를 보기 쉽게 그림으로 표현한 것. 데이터를 그래프로 표현하며 추세와 경향성이 드러나기 때문에 특징을 쉽게 이해할 수 있고, 그래프를 만드는 과정에서 새로운 패턴을 발견하기도 함. 특히 분석 결과를 발표해야 한다면 데이터의 특징을 쉽게 이해할 수 있도록 그래프를 만드는 것이 좋음.

 

R 그래프의 종류

- 2차원 그래프, 3차원 그래프, 지도 그래프, 네트워크 그래프, 시간에 따라 변화하는 모션 차트, 마우스 조작에 반응하는 인터랙티브 그래프 등

 

사용하는 패키지

- ggplot2는 그래프를 만들 때 가장 많이 사용하는 패키지 / ggplot2 문법은 레이어(layer) 구조

1단계: 배경 설정(축)  /  2단계: 그래프 추가(점, 막대, 선)  /  3단계: 설정 추가(축 범위, 색, 표시)

 

 

■ 산점도 - 변수 간 관계 표현하기

산점도(Scater Plot): 데이터를 x축과 y축에 점으로 표현한 그래프

- 나이와 소득처럼 연속 값으로 된 두 변수의 관계를 표현할 때 사용됨 >> 변수 둘 다 연속형일 때

 

(1) 배경 설정하기

library(ggplot2)  #ggplot2 패키지 로드

# x축은 displ, y축은 hwy로 지정해 배경 설정
ggplot(data=mpg, aes(x=displ, y=hwy))

 

>> 코드를 실행하면 R 스튜디오 우측 하단에 있는 플롯 창에 배경 그림이 생성

 

(2) 그래프 추가하기

- + 기호를 이용해 그래프 유형을 지정하는 함수를 추가

- 산점도를 그리는 함수 geom_point()

(** 참고) dplyr 패키지 함수들은 %>% 기호로 연결하는 반면 ggplot2 패키지 함수들은 + 기호로 연결

# 배경에 산점도 추가
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point()

>> 앞에서 만든 배경 위에 점 표식이 추가된 산점도가 만들어짐. 산점도에 표시된 점들은 각각의 관측치(행)를 의미하고, 여기서는 각 점이 하나의 자동차 모델을 의미.

전반적으로 배기량이 큰 자동차일수록 고속도로 연비가 낮은 경향이 있다는 것을 알 수 있음

 

(3) 축 범위를 조정하는 설정 추가하기

- 축은 기본적으로 최솟값에서 최댓값까지 모든 범위의 데이터가 표현되도록 설정되어 있음

- 축 범위는 xlim()과 ylim()을 이용해 지정 가능. xlim()을 이용해 x축을 지정하고, 축이 시작되는 값과 끝나는 값을 쉼표로 나열하면 됨. ex) x축이 3~6까지만 표현되도록 설정: xlim(3, 6) / y축이 10~30까지만 표현되도록 설정: ylim(10, 30)

# x축 범위 3~6으로 지정
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6)

 

<참고>

ggplot() 함수는 레이어 구조로 되어 있어, 각각의 요소를 어떻게 지정하느냐에 따라 다른 그래프가 생성됨

 

 

Q. ggplot과 qplot의 차이?

- 이전까지는 그래프를 만들 때 qplot()을 사용. qplot()은 기능은 많지 않지만 문법이 간단하기 때문에 주로 전처리 단계에서 데이터를 빠르게 확인해보는 용도로 활용함. 그러나 최종적으로 분석 결과를 보고하기 위해 그래프를 만들 때는 ggplot()을 사용한다. ggplot()을 사용하면 다양한 그래프를 만들 수 있고 색, 크기, 폰트 등 세부 요소들을 자유롭게 조절할 수 있다.

 

 

 

■ 막대 그래프 - 집단 간 차이 표현하기

막대 그래프(Bar Chart): 데이터의 크기를 막대의 길이로 표현한 그래프

- 성별 소득 차이처럼 집단 간 차이를 표현할 때 주로 사용 >> 범주형 + 연속형 (~별 ~ / ~당 ~)

 

가장 많이 사용되는 막대 그래프는 각 집단의 평균값을 막대 길이로 표현한 평균 막대 그래프이다. mpg 데이터를 이용해 drv(구동방식)별 평균 hwy(고속도로 연비) 막대 그래프를 만들어 보자.

(1) 집단별 평균표 만들기

- 평균 막대 그래프를 만들려면 집단별 평균표로 구성된 데이터 프레임 필요 (구동 방식별 평균 고속도로 연비)

library(dplyr)

df_mpg <- mpg %>%
	group_by(drv) %>%
    summarise(mean_hwy = mean(hwy))

 

(2) 그래프 생성하기

- aes의 x축에 범주를 나타내는 변수를 지정하고, y축에 평균값을 나타내는 변수를 지정

- 막대 그래프 만드는 함수: geom_col()

ggplot(data = df_mpg, aes(x = drv, y = mean_hwy)) + geom_col()

 

(3) 크기 순으로 정렬하기

- 막대는 기본적으로 범주의 알파벳 순서로 정렬됨

- reorder()를 사용하면 막대를 값의 크기 순으로 정렬 가능. reorder()에 x축 변수와 정렬 기준으로 삼을 변수를 지정하면 됨. (정렬 기준 변수 앞에 - 기호를 붙이면 내림차순으로 정렬)

ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()

>> 참고: 변수의 값이 숫자와 문자로 함께 구성되면 숫자 오름차순, 알파벳 오름차순으로 정렬됨

 

Q. geom_col() vs geom_bar()?

- 평균 막대 그래프는 데이터를 요약한 평균표를 먼저 만든 후 이 평균표를 이용해 만든다. 반면 빈도 막대 그래프는 별도로 표를 만들지 않고 원자료를 이용해 바로 만든다. 요약표를 이용하는지 원자료를 이용하는지에 따라 그래프를 만드는 절차와 함수가 다르므로 유의

 

 

 

(출처; 가천대학교 컴퓨터공학과, 이영호 교수님)

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

07-2. 이상한 데이터를 찾아라! - 이상치 정제하기

이상치(Outlier)란?

- 정상 범주에서 크게 벗어난 값

 

이상치 제거하기 - 존재할 수 없는 값

1. 이상치가 포함된 데이터 생성 (sex는 1과 2만 나올 수 있고, score는 1부터 5까지의 값만 들어갈 수 있음)

4행의 sex와 6행의 score에 이상치 확인 가능

 

2. 이상치 확인하기

table(outlier$sex)
table(outlier$score)

 

3. 결측 처리하기 - 이상치를 결측치로 변환, ifelse()를 이용해 이상치일 경우 NA 부여

#sex가 3이면 NA 부여
outlier$sex <- ifelse(outlier$sex == 3, outlier$sex)

4행의 sex 값이 NA로 변환

# score가 5초과면 NA 할당
outlier$score <- ifelse(outlier$score > 5, NA, outlier$score)

6행의 score 값이 NA로 변환

4. 결측치 제외 후 성별에 따른 score 평균 구하기

outlier %>%
	filter(!is.na(sex)&!is.na(score)) %>%
    group_by(sex) %>%
    summarise(mean_score = mean(score))

 

 

(출처; 쉽게 배우는 R 데이터 분석, 김영우)

+ Recent posts