본문 바로가기
  • Hi Hello, Code
🤔Study . Question🔍

[A] Question2. 빅데이터분석실무2급 내 맘대로 정리 (정답)

by 밍구링구링 2023. 7. 20.

본문 바로가기 

 

[Workshop] 빅데이터분석실무2급 내 맘대로 정리

🚨 글의 모든 내용은 가천대 WIND [IT특강] 빅데이터 특강을 수강한 후, 정리한 글입니다. 이 글의 목적은 스스로 정리하였지만, 자세한 내용 및 출처는 모두 나영희 강사님께 있음을 다시한번 알

minsllogg.tistory.com

본 게시글은 스터디 시간에 올린 글에 대한 퀴즈로 구성되어 있습니다. 

총 4문제
본문 내용 구성
연습문제와 코드 작성 위주로, 하 1문제, 중 3문제, 상 1문제로 구성

 

1. "키워드 추출 텍스트 마이닝"을 하기 위해 저자가 쓴 프로그램으로, (1) 오픈소스 (2) 데이터분석기능 (3) 다양한 그래프 기능 (4) 데이터 핸들링 기능 (5) RAM작동으로 빠른 데이터 처리 이렇게 5가지의 특징이 있는 프로그램의 이름은 무엇인가? ()

정답 : R 프로그램


2. Vector에 대한 연습문제 중 하나이다. 아래 네모 칸에 알맞은 명령어를 쓰도록 하자.   (중)
2-1.

아래 코드 모두 정답으로 인정가능하다.
벡터형을 조회할 때에는 벡터이름, 대괄호, c() 를 이용하여 조회한다. 

drink[c(2,3,5)]
drink[c(2:3, 5)]
drink[c(-1, -4)]

2-2. 

위 결과물을 보면, vec1과 vec2의 내용이 합쳐져있는 것을 볼 수 있다. vector의 내용을 합치려면 union함수를 사용하면 된다.
아래 코드 모두 인정 가능하다.

vec3 <- union(vec1,vec2)
vec3
union(vec1,vec2)

3. Data Frame에 대한 연습문제 중 하나이다. 오른쪽에 'date' 컬럼을 추가하고자 한다. 아래 빈칸을 채우도록 하자. (rbind, cbind 중 하나 사용) (중)

구매정보테이블 <- cbind(구매정보테이블, date=c(2018:2016))
구매정보테이블

 

* 주어진 조건은 오른쪽에 date컬럼 추가이다. 따라서 행 추가이므로 cbind()를 사용한다. (열 추가인 경우 rbind)
rbind(): 벡터를 행 방향으로 합침
cbind(): 벡터를 열 방향으로 합침

cbind는 아래와 같이 작성하면 된다.
cbind(추가할 데이터프레임 이름, 추가할 컬럼이름=(컬럼내용))


추가할 컬럼 이름은 date이고 추가하고자 하는 내용은 2018, 2017, 2016이다. 이를 반영하여, 코드를 작성하면 아래와 같다.
구매정보테이블 <- cbind(구매정보테이블, date=c(2018:2016))

 


4. for문에 관한 퀴즈 중 일부이다.  char1에 들어있는 과자 이름을 아래 결과물처럼 출력하는 예제이다. for 반복문을 사용하고 맛동산이나 자갈치가 나올 경우, '너 미워!'를 붙여 출력하고 나머지 과자 이름 뒤에는 '너 좋아!'를 아래와 같이 출력하도록 빈칸에 적절한 코드를 채워보자. (paste함수를 사용) (중)

정답:

for(i in 1:length(char1)){ 
  if(char1[i]=="맛동산"|char1[i]=="자갈치"){
    print(paste(char1[i], "너 미워!"))
  }
  else{
    print(paste(char1[i], "너 좋아!"))
  }
}

 

* 여기서 paste함수가 사용되는 이유
- paste함수는 각 요소를 문자열로 이어주는 함수이다. 

 

* 나머지 for문에 대한 내용은 이미 알고 있으므로, 자세한 설명은 생략한다.

 

5. 아래 원본파일을 토대로, wordcloud를 이용해 오른쪽 그림과 같이 결과물을 만들었다. 이러한 텍스트 마이닝 순서는 가장 아래 그림과 같으며, 이 코드에서는 KoNLP 패키지를 이용해서 구하였다. 아래 A와 B에 사용된 패키지/코드는 무엇인지 힌트를 보고 유추해보세요. (상)

 

힌트: 코드

##############################################################
## 예제 1. 경주 여행지 추천 소스코드<교재5_P13>
##############################################################
# KoNLP 패키지로 한글 분석하는 종합 정리 #

#Step 1. 작업디렉토리 설정하고 필요한 패키지를 설치 및 구동
setwd("c:\\temp\\")  
install.packages("KoNLP") 
install.packages("wordcloud") 
install.packages("stringr")

library(stringr)
library(KoNLP)  
library(wordcloud)

useSejongDic() 

data1 <- readLines("경주여행_지식인_2016.txt", encoding="UTF-8")
head(data1,10)
length(data1)

data1 <- unique(data1)

data2 <- str_replace_all(data1,"[^[:alpha:][:digit:]]"," ")

data3 <- extractNoun(data2)
head(data3,5)

data4 <- lapply(data3, unique) # 각 리스트안에서 중복된 단어들 제거하기

data5 <- gsub("\\d+", "", unlist(data4)) 
data5 <- gsub("스프링", "스프링돔", data5) 
data5 <- gsub("파크", "워터파크", data5) 
data5 <- gsub("\\^", "", data5)
data5 <- gsub(paste(c("교촌","마을","한옥"),collapse='|'), "교촌한옥마을", data5)
data5 <- gsub(paste(c("주상","절리"),collapse='|'), "주상절리", data5)
data5 <- gsub(paste(c("보문단지","보문"),collapse='|'), "보문관광단지", data5)
data5 <- gsub(paste(c("달동네","추억","추억의달동네"),collapse='|'), "추억의달동네", data5)
data5 <- gsub(paste(c("한우","떡갈비"),collapse='|'), "한우수제떡갈비", data5)
data5 <- gsub(paste(c("게스트","하우스"),collapse='|'), "게스트하우스", data5)
data5 <- gsub(paste(c("월성","반월성"),collapse='|'), "반월성", data5)
data5 <- gsub(paste(c("맛집이","맛집"),collapse='|'), "맛집", data5)
data5 <- gsub(paste(c("교리","김밥","계란지단"),collapse='|'), "교리김밥", data5)
data5 <- gsub(paste(c("천마","천마총"),collapse='|'), "천마총", data5)
data5 <- gsub(paste(c("박물관","테디베어","테디베어박물관"),collapse='|'), "테디베어박물관", data5)
data5 <- gsub("월드", "월드엑스포", data5)
data5 <- gsub("순두부", "멧돌순두부", data5)
data5 <- gsub(paste(c("현대","밀면"),collapse='|'), "현대밀면", data5)
data5 <- gsub("한정", "이조한정식", data5)
data5 <- gsub("블루", "블루원워터파크",data5)

data5 <- lapply(data5, unique) # 각 리스트안에서 중복된 단어들 제거하기

# 글자수로 제거하기, 2글자 이상 6글자 이하만 출력
data6 <- sapply(data5, function(x) {Filter(function(y) {nchar(y) <= 6 && nchar(y) > 1 },x)} ) 

wordcount <- table(unlist(data6)) 
wordcount <- Filter(function(x) {nchar(x) <= 10} ,wordcount)
head(sort(wordcount, decreasing=T),100)

txt <- readLines("경주gsub.txt")
txt
cnt_txt <- length(txt)
cnt_txt
for( i in 1:cnt_txt) {
      data5 <- gsub((txt[i]),"", data5)  
      }
head(data5,5)

data6 <- sapply(data5, function(x) {Filter(function(y) { nchar(y) >=2 },x)} )
head(data6,5)

#아래 과정이 필터링이 완료된 단어들을 언급 빈도수로 집계하는 과정입니다.
wordcount <- table(unlist(data6))
head(sort(wordcount, decreasing=T),100)

library(RColorBrewer) 
palete <- brewer.pal(7,"Set2")

wordcloud(names(wordcount),freq=wordcount,scale=c(5,1),rot.per=0.25,min.freq=28,
random.order=F,random.color=T,colors=palete)

# Step 8- 언급된 빈도에 따라 색깔을 다르게 설정하기 

wordcount <- table(unlist(data6))
data54 <- head(sort(wordcount , decreasing=T) , 100)

# write.table 과 read.table 에 대한 내용은 이 책 Chap     의  페이지      를 참고하세요~
write.table(data54,"data54.txt")
data64 <- read.table("data54.txt")

# 언급 빈도에 따라 색깔을 다르게 설정함
# 예제는 100번 이상 언급된 키워드는 빨간색으로 표시하고 나머지는 회색으로 표시하여 강조함

col4 <- ifelse(data64$Freq >= 100 , "red" , "gray") # ifelse 문장은 반복문 부분을 참고하세요~

wordcloud(data64$Var1 , freq=data64$Freq , scale=c(4,1) , rot.per=0.25 , min.freq=1 ,
          random.order=F , ordered.color=T , colors=col4 )

# wordcloud2( ) 패키지로 시각화 하기
install.packages("wordcloud2")
library(wordcloud2)
wordcount2 <- head(sort(wordcount, decreasing=T),100)
wordcloud2(wordcount2,gridSize=1,size=0.5,shape="polygon")

# shape = “diamond” , “star” , “circle”  등 다양한 옵션 사용 가능함.

정답: A) extractNoun B) gsub()

 

A, B 모두 텍스트 전처리를 할 때에 자주 사용된다고 합니다.
extractNoun() :  한글의 명사 추출 함수
gsub() : 특정 글자 없애기 

# gsub 문법
gsub(“변경전글자” , ”변경후글자” , data)

 

 

extractNoun을 사용했을 때의 결과
> data1 <- unique(data1)
> data2 <- str_replace_all(data1,"[^[:alpha:][:digit:]]"," ")
> data3 <- extractNoun(data2)
> head(data3,5)
[[1]]
[1] "                                                            "

[[2]]
[1] "제목" "경주" "여행" "문의" "드"   "5"   

[[3]]
[1] "날짜"         "질문마감률70" "5"           

[[4]]
 [1] "질문"       "내용"       "안녕"       "겨울"       "아이들"    
 [6] "경주"       "여행"       "준비"       "2"          "박"        
[11] "혹은3박"    "정도"       "계획"       "중"         "유적지"    
[16] "외"         "만"         "곳"         "아이들"     "물놀이"    
[21] "경주"       "호텔"       "리조트"     "중아이들이" "수"        
[26] "실내"       "워터"       "파크"       "곳"         "어디인지요"
[31] "들"         "추천"       "부탁드립니"

[[5]]
  [1] "답변"                                                                
  [2] "안녕"                                                                
  [3] "여행"                                                                
  [4] "블로거"
... 밑에 일부 생략​



불용어 제거 및 용어 정리하기

> data4 <- lapply(data3, unique) # 각 리스트안에서 중복된 단어들 제거하기
> data5 <- gsub("\\d+", "", unlist(data4)) #숫자데이터 지워짐
> head(data5, 20)
 [1] "                                                            "
 [2] "제목"                                                        
 [3] "경주"                                                        
 [4] "여행"                                                        
 [5] "문의"                                                        
 [6] "드"                                                          
 [7] ""                                                            
 [8] "날짜"                                                        
 [9] "질문마감률"                                                  
[10] ""                                                            
[11] "질문"                                                        
[12] "내용"                                                        
[13] "안녕"                                                        
[14] "겨울"                                                        
[15] "아이들"                                                      
[16] "경주"                                                        
[17] "여행"                                                        
[18] "준비"                                                        
[19] ""                                                            
[20] "박"
> data5 <- gsub("스프링", "스프링돔", data5)
> data5 <- gsub("파크", "워터파크", data5)
> data5 <- gsub("\\^", "", data5)
> data5 <- gsub(paste(c("교촌","마을","한옥"), collapse='|'), "교촌한옥마을", data5)
> data5 <- gsub(paste(c("주상","절리"), collapse='|'), "주상절리", data5)
> data5 <- gsub(paste(c("보문단지","보문"), collapse='|'), "보문관광단지", data5)
> data5 <- gsub(paste(c("달동네","추억","추억의달동네"), collapse='|'), "추억의달동네", data5)
> data5 <- gsub(paste(c("한우","떡갈비"), collapse='|'), "한우수제떡갈비", data5)
> data5 <- gsub(paste(c("게스트","하우스"), collapse='|'), "게스트하우스", data5)>data5 <- gsub(paste(c("월성","반월성"), collapse='|'), "반월성", data5)
> data5 <- gsub(paste(c("맛집이","맛집"), collapse='|'), "맛집", data5)
> data5 <- gsub(paste(c("교리","김밥","계란지단"), collapse='|'), "교리김밥", data5)
> data5 <- gsub(paste(c("천마","천마총"), collapse='|'), "천마총", data5)
> data5 <- gsub(paste(c("박물관","테디베어","테디베어박물관"), collapse='|'), "테디베어박물관",
data5)
> data5 <- gsub("월드", "월드엑스포", data5)
> data5 <- gsub("순두부", "멧돌순두부", data5)
> data5 <- gsub(paste(c("현대","밀면"), collapse='|'), "현대밀면", data5)
> data5 <- gsub("한정", "이조한정식", data5)
> data5 <- gsub("블루", "블루원워터파크",data5)\
>
> data5 <- lapply(data5, unique) # 각 리스트안에서 중복된 단어들 제거하기
>
> data6 <- sapply(data5, function(x) {Filter(function(y) {nchar(y) <= 6 & nchar(y) > 1 } , x ) } ) # 글자수로 제거하기, 2글자 이상 6글자 이하만 출력

 

 

고생하셨습니다(・ัᗜ・ั)و

반응형