** 2019년 하반기 택시민원분석 결과 입니다.
## [1] "C:/Program Files/Java/jdk-11.0.3"
library(KoNLP)
library(rJava)
library(stringr)
library(wordcloud)
library(RColorBrewer)
library(wordcloud2)
library(arules)
library(arulesViz)
library(corrplot)txt <- file("text_ana.txt") #애초 파일은 ANSI 형태 # text_spot.csv
#encoding="UTF-8", encoding = "UCS-2LE"
text <- readLines(txt)
close(txt)
head(text)## [1] "부평현대더로프트 → 부개역푸르지오 앞 (원래 목적지 아니었으나 그곳에서 내리라고 해서 내렸음기사님이 직진하는곳에서 네비따라 좌회전하시길래 직진해달라고 말씀드리니 그럴꺼면 미리미리 말해야지 아이씨 하면서 화를 내심. 그때부서 욕설하다가 목적지 전에 내리라고 해서 내려서 다툼이 있었음. 서로 욕설하다가 주먹질을하면서 때리려고까지했음. 경찰을 불렀는데 경찰앞에서도 계속 욕설했음. 경찰관이 민원접수하고 경찰신고처리 하라고해서 신고하는것임."
## [2] "\"서울 경부고속도로 ->용인수지 동천동 하차->서울 강남으로 이동 목격(02:10"
## [3] "인천택시가 서울에서 영업을 계속하여 민원접수함"
## [4] "본인도 용인수지를 가는 중이었음. 인천택시가 서울에서 용인수지를 갔다가 나올때 인천방향으로 외곽고속도로로 가면 민원접수 하지 않았을텐데 서울로 다시 감"
## [5] "경부고속도로에서 처음 발견했는데 인천택시가 경부고속도로를 탈리가 없음. 본인도 손님하차하고 인천택시 뒤따라갔는데 용인간고속도로->경부고속도로를 타고 서울강남으로 옴"
## [6] "2:10분경 서울 강남 역삼동 교보생명 사거리에서 신호에 걸려서 인천택시에게 "
## chr [1:4953] "부평현대더로프트 → 부개역푸르지오 앞 (원래 목적지 아니었으나 그곳에서 내리라고 해서 내렸음기사님이 직진하는"| __truncated__ ...
# Encoding(text) = "CP949"
text <- gsub("\\[(.*?)\\]", " ",text) #대괄호안의 내용 삭제(대괄로도 포함)
text <- gsub("[^가-힣]", " ",text) #한글외 모든 문자 제거
head(text)## [1] "부평현대더로프트 부개역푸르지오 앞 원래 목적지 아니었으나 그곳에서 내리라고 해서 내렸음기사님이 직진하는곳에서 네비따라 좌회전하시길래 직진해달라고 말씀드리니 그럴꺼면 미리미리 말해야지 아이씨 하면서 화를 내심 그때부서 욕설하다가 목적지 전에 내리라고 해서 내려서 다툼이 있었음 서로 욕설하다가 주먹질을하면서 때리려고까지했음 경찰을 불렀는데 경찰앞에서도 계속 욕설했음 경찰관이 민원접수하고 경찰신고처리 하라고해서 신고하는것임 "
## [2] " 서울 경부고속도로 용인수지 동천동 하차 서울 강남으로 이동 목격 "
## [3] "인천택시가 서울에서 영업을 계속하여 민원접수함"
## [4] "본인도 용인수지를 가는 중이었음 인천택시가 서울에서 용인수지를 갔다가 나올때 인천방향으로 외곽고속도로로 가면 민원접수 하지 않았을텐데 서울로 다시 감"
## [5] "경부고속도로에서 처음 발견했는데 인천택시가 경부고속도로를 탈리가 없음 본인도 손님하차하고 인천택시 뒤따라갔는데 용인간고속도로 경부고속도로를 타고 서울강남으로 옴"
## [6] " 분경 서울 강남 역삼동 교보생명 사거리에서 신호에 걸려서 인천택시에게 "
# text <- gsub("현재", "",text) #해당글자 제거
# text <- gsub("[^가-힣]", "",text) #한글외 모든 문자 제거
# text <- spacing(text) #띄워쓰기 교정
# text <- str_trim(text) # 문자 앞 뒤 빈공간 없애기## Backup was just finished!
## 983012 words dictionary was built.
## Backup was just finished!
## 983012 words dictionary was built.
# useSejongDic()
# word <- data.frame(c("", "혁신")) # 단어 추가
# buildDictionary(ext_dic = c("sejong", "woorimalsam"), user_dic=word, replace_usr_dic = T)
# buildDictionary(ext_dic = c("woorimalsam"), user_dic=word, replace_usr_dic = T)nouns <- sapply(text, extractNoun, USE.NAMES = F) # KoNLP 명사추출
unlist_nouns <- unlist(nouns) # unlist
head(unlist_nouns, 20)## [1] "부평현대더로프트" "부개역" "푸르지오" "앞"
## [5] "목적지" "그곳" "내렸음기사님이" "직진하는곳에서"
## [9] "네비" "좌회전" "하시" "직진해달라고"
## [13] "그럴꺼면" "말" "아이" "씨"
## [17] "화" "내" "그때" "부"
unlist_nouns <- gsub("아파", "아파트", unlist_nouns) #해당글자 대체
unlist_nouns <- gsub("사거", "사거리 ", unlist_nouns) #해당글자 대체
unlist_nouns <- gsub("오거", "오거리 ", unlist_nouns)
unlist_nouns <- gsub("미추", "미추홀 ", unlist_nouns)
unlist_nouns <- gsub("터미", "터미널 ", unlist_nouns)
unlist_nouns <- gsub("인천터미널 ", "터미널 ", unlist_nouns)
unlist_nouns <- gsub("정류", "정류장 ", unlist_nouns)
unlist_nouns <- gsub("승강", "승강장 ", unlist_nouns)
unlist_nouns <- gsub("아파트트", "아파트",unlist_nouns)unlist_nouns_n <- Filter(function(x){nchar(x)>=2 & nchar(x)<=6}, unlist_nouns)
wordcount <- table(unlist_nouns_n)
wordcount <- sort(wordcount, decreasing = T)
head(wordcount, 20)## unlist_nouns_n
## 기사 택시 시민 요금 결제 본인 신고 목적지 승차 접수 인천
## 3385 2672 1271 1028 718 672 632 611 609 550 539
## 탑승 하차 요청 아파트 불편 거리 이용 미터 해서
## 439 438 392 386 384 372 371 366 359
## 'table' int [1:5688(1d)] 3385 2672 1271 1028 718 672 632 611 609 550 ...
## - attr(*, "dimnames")=List of 1
## ..$ unlist_nouns_n: chr [1:5688] "기사" "택시" "시민" "요금" ...
## unlist_nouns_n Freq
## 1 기사 3385
## 2 택시 2672
## 3 시민 1271
## 4 요금 1028
## 5 결제 718
## 6 본인 672
## 'data.frame': 5688 obs. of 2 variables:
## $ unlist_nouns_n: Factor w/ 5688 levels "기사","택시",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ Freq : int 3385 2672 1271 1028 718 672 632 611 609 550 ...
## unlist_nouns_n Freq
## 4 요금 1028
## 5 결제 718
## 6 본인 672
## 7 신고 632
## 8 목적지 611
## 9 승차 609
## 'data.frame': 5685 obs. of 2 variables:
## $ unlist_nouns_n: Factor w/ 5688 levels "기사","택시",..: 4 5 6 7 8 9 10 11 12 13 ...
## $ Freq : int 1028 718 672 632 611 609 550 539 439 438 ...
## unlist_nouns_n Freq
## 4 요금 1028
## 5 결제 718
## 6 본인 672
## 7 신고 632
## 8 목적지 611
## 9 승차 609
## 'data.frame': 165 obs. of 2 variables:
## $ unlist_nouns_n: Factor w/ 5688 levels "기사","택시",..: 4 5 6 7 8 9 10 11 12 13 ...
## $ Freq : int 1028 718 672 632 611 609 550 539 439 438 ...
***
## unlist_nouns_n
## 기사 택시 시민 요금 결제 본인
## 3385 2672 1271 1028 718 672
## unlist_nouns_n
## 기사 시민 요금 결제 본인 신고 목적지 승차
## 3385 1271 1028 718 672 632 611 609
## 접수 인천 탑승 하차 요청 아파트 불편 거리
## 550 539 439 438 392 386 384 372
## 이용 미터 해서 카카오 얘기 카드 전화 해당
## 371 366 359 349 342 342 326 325
## 도착 확인 정도 운행 승차거부 경찰 시간 이동
## 313 296 295 277 266 264 259 251
## 욕설 이동하
## 243 238
wordcount2 <- sort(table(unlist(nouns)), decreasing = T)
keyword_taxi <- dimnames(wordcount[1:34])
# 빈도 상위 5 wordcount <- sort(wordcount, decreasing = T)
str(keyword_taxi)## List of 1
## $ unlist_nouns_n: chr [1:34] "기사" "시민" "요금" "결제" ...
contents <- c()
for (i in 1:4953) { # str(nouns) : 4953
inter <- intersect(nouns[[i]], unlist(keyword_taxi))
contents <- rbind(contents, table(inter)[unlist(keyword_taxi)])
}
colnames(contents) <- unlist(keyword_taxi)
contents[which(is.na(contents))] <- 0
head(contents)## 기사 시민 요금 결제 본인 신고 목적지 승차 접수 인천 탑승 하차 요청 아파트
## [1,] 0 0 0 0 0 1 1 0 1 0 0 0 0 0
## [2,] 0 0 0 0 0 0 0 0 0 0 0 1 0 0
## [3,] 0 0 0 0 0 0 0 0 1 1 0 0 0 0
## [4,] 0 0 0 0 1 0 0 0 1 1 0 0 0 0
## [5,] 0 0 0 0 1 0 0 0 0 1 0 1 0 0
## [6,] 0 0 0 0 0 0 0 0 0 1 0 0 0 0
## 불편 거리 이용 미터 해서 카카오 얘기 카드 전화 해당 도착 확인 정도 운행
## [1,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [2,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [3,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [4,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [5,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [6,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## 승차거부 경찰 시간 이동 욕설 이동하
## [1,] 0 1 0 0 1 0
## [2,] 0 0 0 0 0 0
## [3,] 0 0 0 0 0 0
## [4,] 0 0 0 0 0 0
## [5,] 0 0 0 0 0 0
## [6,] 0 0 0 0 0 0
# library(arules)
trans <- as.matrix(contents) # str(comments$contents)
rules1 <- apriori(trans, parameter = list(supp = 0.005, conf = 0.3, target = "rules"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.3 0.1 1 none FALSE TRUE 5 0.005 1
## maxlen target ext
## 10 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 24
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[34 item(s), 4953 transaction(s)] done [0.00s].
## sorting and recoding items ... [34 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 6 done [0.00s].
## writing ... [2102 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
## set of 2102 rules
##
## rule length distribution (lhs + rhs):sizes
## 1 2 3 4 5 6
## 1 87 1006 867 135 6
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 3.000 3.000 3.507 4.000 6.000
##
## summary of quality measures:
## support confidence lift count
## Min. :0.005047 Min. :0.3000 Min. : 0.951 Min. : 25.00
## 1st Qu.:0.005653 1st Qu.:0.4063 1st Qu.: 2.562 1st Qu.: 28.00
## Median :0.006864 Median :0.5652 Median : 3.730 Median : 34.00
## Mean :0.009539 Mean :0.6011 Mean : 4.238 Mean : 47.25
## 3rd Qu.:0.009691 3rd Qu.:0.7947 3rd Qu.: 5.500 3rd Qu.: 48.00
## Max. :0.361397 Max. :1.0000 Max. :11.507 Max. :1790.00
##
## mining info:
## data ntransactions support confidence
## trans 4953 0.005 0.3
## To reduce overplotting, jitter is added! Use jitter = 0 to prevent jitter.
## Warning: Unknown control parameters: type
## Available control parameters (with default values):
## main = Graph for 100 rules
## nodeColors = c("#66CC66CC", "#9999CCCC")
## nodeCol = c("#EE0000FF", "#EE0303FF", "#EE0606FF", "#EE0909FF", "#EE0C0CFF", "#EE0F0FFF", "#EE1212FF", "#EE1515FF", "#EE1818FF", "#EE1B1BFF", "#EE1E1EFF", "#EE2222FF", "#EE2525FF", "#EE2828FF", "#EE2B2BFF", "#EE2E2EFF", "#EE3131FF", "#EE3434FF", "#EE3737FF", "#EE3A3AFF", "#EE3D3DFF", "#EE4040FF", "#EE4444FF", "#EE4747FF", "#EE4A4AFF", "#EE4D4DFF", "#EE5050FF", "#EE5353FF", "#EE5656FF", "#EE5959FF", "#EE5C5CFF", "#EE5F5FFF", "#EE6262FF", "#EE6666FF", "#EE6969FF", "#EE6C6CFF", "#EE6F6FFF", "#EE7272FF", "#EE7575FF", "#EE7878FF", "#EE7B7BFF", "#EE7E7EFF", "#EE8181FF", "#EE8484FF", "#EE8888FF", "#EE8B8BFF", "#EE8E8EFF", "#EE9191FF", "#EE9494FF", "#EE9797FF", "#EE9999FF", "#EE9B9BFF", "#EE9D9DFF", "#EE9F9FFF", "#EEA0A0FF", "#EEA2A2FF", "#EEA4A4FF", "#EEA5A5FF", "#EEA7A7FF", "#EEA9A9FF", "#EEABABFF", "#EEACACFF", "#EEAEAEFF", "#EEB0B0FF", "#EEB1B1FF", "#EEB3B3FF", "#EEB5B5FF", "#EEB7B7FF", "#EEB8B8FF", "#EEBABAFF", "#EEBCBCFF", "#EEBDBDFF", "#EEBFBFFF", "#EEC1C1FF", "#EEC3C3FF", "#EEC4C4FF", "#EEC6C6FF", "#EEC8C8FF", "#EEC9C9FF", "#EECBCBFF", "#EECDCDFF", "#EECFCFFF", "#EED0D0FF", "#EED2D2FF", "#EED4D4FF", "#EED5D5FF", "#EED7D7FF", "#EED9D9FF", "#EEDBDBFF", "#EEDCDCFF", "#EEDEDEFF", "#EEE0E0FF", "#EEE1E1FF", "#EEE3E3FF", "#EEE5E5FF", "#EEE7E7FF", "#EEE8E8FF", "#EEEAEAFF", "#EEECECFF", "#EEEEEEFF")
## edgeCol = c("#474747FF", "#494949FF", "#4B4B4BFF", "#4D4D4DFF", "#4F4F4FFF", "#515151FF", "#535353FF", "#555555FF", "#575757FF", "#595959FF", "#5B5B5BFF", "#5E5E5EFF", "#606060FF", "#626262FF", "#646464FF", "#666666FF", "#686868FF", "#6A6A6AFF", "#6C6C6CFF", "#6E6E6EFF", "#707070FF", "#727272FF", "#747474FF", "#767676FF", "#787878FF", "#7A7A7AFF", "#7C7C7CFF", "#7E7E7EFF", "#808080FF", "#828282FF", "#848484FF", "#868686FF", "#888888FF", "#8A8A8AFF", "#8C8C8CFF", "#8D8D8DFF", "#8F8F8FFF", "#919191FF", "#939393FF", "#959595FF", "#979797FF", "#999999FF", "#9A9A9AFF", "#9C9C9CFF", "#9E9E9EFF", "#A0A0A0FF", "#A2A2A2FF", "#A3A3A3FF", "#A5A5A5FF", "#A7A7A7FF", "#A9A9A9FF", "#AAAAAAFF", "#ACACACFF", "#AEAEAEFF", "#AFAFAFFF", "#B1B1B1FF", "#B3B3B3FF", "#B4B4B4FF", "#B6B6B6FF", "#B7B7B7FF", "#B9B9B9FF", "#BBBBBBFF", "#BCBCBCFF", "#BEBEBEFF", "#BFBFBFFF", "#C1C1C1FF", "#C2C2C2FF", "#C3C3C4FF", "#C5C5C5FF", "#C6C6C6FF", "#C8C8C8FF", "#C9C9C9FF", "#CACACAFF", "#CCCCCCFF", "#CDCDCDFF", "#CECECEFF", "#CFCFCFFF", "#D1D1D1FF", "#D2D2D2FF", "#D3D3D3FF", "#D4D4D4FF", "#D5D5D5FF", "#D6D6D6FF", "#D7D7D7FF", "#D8D8D8FF", "#D9D9D9FF", "#DADADAFF", "#DBDBDBFF", "#DCDCDCFF", "#DDDDDDFF", "#DEDEDEFF", "#DEDEDEFF", "#DFDFDFFF", "#E0E0E0FF", "#E0E0E0FF", "#E1E1E1FF", "#E1E1E1FF", "#E2E2E2FF", "#E2E2E2FF", "#E2E2E2FF")
## alpha = 0.5
## cex = 1
## itemLabels = TRUE
## labelCol = #000000B3
## measureLabels = FALSE
## precision = 3
## layout = NULL
## layoutParams = list()
## arrowSize = 0.5
## engine = igraph
## plot = TRUE
## plot_options = list()
## max = 100
## verbose = FALSE
## Warning: plot: Too many rules supplied. Only plotting the best 100 rules using
## 'support' (change control parameter max if needed)
# library(corrplot)
corrplot(cor(contents),
method = 'square',
type = "lower", order = "FPC",
tl.col = "black", tl.cex = 0.9, sig.level = 0.05, pch.cex = 0.9, insig = "pch")# corrplot(cor(contents), method="number", diag=F)
corrplot(cor(contents), method="number", order="hclust", addrect=2, diag=F,
tl.col = "black", tl.cex = 1.1, sig.level = 0.05, pch.cex = 0.9, insig = "pch") ***