一、專案簡介

1.動機

2020年全年行動支付交易金額高達4,230億元,創下有統計以來新高紀錄,電子支付使用人數亦突破千萬人,表示民眾支付習慣的改變,除了過往以現金支付、信用卡支付的付款行為,也愈來愈多的人以手機支付APP作消費,只要「嗶」一下,不用帶現金,不用找零,又可享受業者五花八門的回饋方案,多「嗶」多賺。 此外行動支付機購百家齊鳴,可支付的商家、通路及使用場域也大增,更增加了民眾使用行動支付作交易的意願,本組想藉此了解網路社群對行動支付的討論為何?

2.分析目的

  • 行動支付網路討論聲量
  • 主要行動支付種類比較
  • 行動支付之通路比較

3.資料集

資料來源:PTT MobilePay版 資料區間:2020/01~2021/03 所有文章 資料數量:發文:1800篇、評論71990篇

系統參數設定

Sys.setlocale(category = "LC_ALL", locale = "zh_TW.UTF-8") # 避免中文亂碼
## [1] ""

安裝需要的packages

# echo = T,results = 'hide'
packages = c("dplyr", "tidytext", "stringr", "wordcloud2", "ggplot2",'readr','data.table','reshape2','wordcloud','tidyr','scales', "ggraph", "igraph", "widyr","BiocManager")
existing = as.character(installed.packages()[,1])
for(pkg in packages[!(packages %in% existing)]) install.packages(pkg)

讀進library

library(dplyr)
library(stringr)
library(tidytext)
library(wordcloud2)
library(data.table)
library(ggplot2)
library(reshape2)
library(wordcloud)
library(tidyr)
library(readr)
require(NLP)
require(jiebaR)
require(ggraph)
require(igraph)
require(scales)
require(reshape2)
require(widyr)
require(limma)
# BiocManager::install("limma")
# 把文章和留言讀進來
# 資料清理
metaData = fread('../data/pay_articleMetaData.csv',encoding = 'UTF-8') %>% 
 mutate(sentence=gsub("[\n]{2,}", "。", sentence)) %>% 
 mutate(sentence=gsub("\n", "", sentence)) %>%  #換行符號 
 mutate(sentence=gsub("http(s)?[-:\\/A-Za-z0-9\\.]+", " ", sentence)) %>%  #有url的取代掉
 mutate(sentence=tolower(sentence))  %>%   #轉小寫 
 mutate(artTitle=tolower(artTitle))   %>%   
 mutate(sentence=gsub("媒體來源|記者署名|完整新聞標題|完整新聞內文|完整新聞連結|(或短網址)|備註|備註請放最後面|違者新聞文章刪除", "", sentence))

metaData$sentence <- gsub(" ","",metaData$sentence) #去空白以免影響英文斷詞 
metaData$sentence <- gsub("  ","",metaData$sentence)
metaData$artTitle <- gsub(" ","",metaData$artTitle) #去空白以免影響英文斷詞 
metaData$artTitle <- gsub("  ","",metaData$artTitle)

#為每篇增加流水號 
metaData <- metaData %>% mutate(seqno = 1:n(),
                                class="",linepay=0,streetpay=0)

#新增發表文章種類欄位
for (ix in c(1:nrow(metaData))) {
  metaData$class[ix] <- if (grepl("情報",metaData$artTitle[ix]) == TRUE){"情報"
    }else if ( grepl("請益",metaData$artTitle[ix]) == TRUE){"請益"
    }else if ( grepl("討論",metaData$artTitle[ix]) == TRUE){"討論"
    }else if ( grepl("心得",metaData$artTitle[ix]) == TRUE){"心得"
    }else if ( grepl("閒聊",metaData$artTitle[ix]) == TRUE){"閒聊"
    }else if ( grepl("優惠",metaData$artTitle[ix]) == TRUE){"優惠"
    }else if ( grepl("新聞",metaData$artTitle[ix]) == TRUE){"新聞"
    }else if ( grepl("公告",metaData$artTitle[ix]) == TRUE){"公告"
    }else{"其他"}
  
    metaData$linepay[ix] <- if (grepl("line",metaData$sentence[ix]) == TRUE){1}else {0}
    
    metaData$streetpay[ix] <- if (grepl("街口",metaData$sentence[ix]) == TRUE){1} else {0}
    
}

# 挑選文章對應的留言
reviews  = fread('../data/pay_articleReviews.csv',encoding = 'UTF-8')
reviews = left_join(metaData, reviews[,c("artUrl", "cmtContent")], by = "artUrl")

 # 
 # z3<-metaData %>% select(class,artDate,artUrl,sentence) %>% 
 #   filter(str_detect(sentence,"咖啡") ) 
 # z4<-reviews %>% select(class,artUrl,sentence,cmtContent) %>% 
 #   filter(str_detect(cmtContent,"咖啡")) 

###發表文章的分佈情形

#各種類發表文章的分佈情形 
metaData %>% 
  count(class,sort=TRUE) %>% 
  ggplot(aes(class, n)) +
  geom_col(show.legend = FALSE) +
  labs(y = "篇數 ",
       x = "發文種類") +
  theme(text=element_text(size=14))

+ 情報類發文最多近800筆,,請益類次之約500筆

二、行動支付資料總覽

(1). 文章斷詞

設定斷詞引擎

# 加入自定義的字典
jieba_tokenizer <- worker(user="../dict/mp_dict.txt", stop_word = "../dict/mp_stop_words.txt")

# 設定斷詞function
customized_tokenizer <- function(t) {
  lapply(t, function(x) {
    tokens <- segment(x, jieba_tokenizer)
    return(tokens)
  })
}
# 把文章和留言的斷詞結果併在一起
meta_tokens <- metaData %>% unnest_tokens(word, sentence, token=customized_tokenizer)
review_tokens <- reviews %>% unnest_tokens(word, cmtContent, token=customized_tokenizer) 

# 把資料併在一起
all_tokens <- rbind(meta_tokens[,c("artDate","artUrl", "word")],
              review_tokens[,c("artDate","artUrl", "word")]
              ) 

(2). 資料基本清理

# 格式化日期欄位
all_tokens$artDate= all_tokens$artDate %>% as.Date("%Y/%m/%d")

# 過濾特殊字元
all_tokens <- all_tokens %>% 
  filter(!grepl('[[:punct:]]',word)) %>% # 去標點符號
  filter(!grepl("['^0-9']",word)) %>% # 去數字,英文要先保留有linepay,linepaymoney, ubear這些詞
  filter(nchar(.$word)>1) 

synonym <- function(str)
{
  str <- recode(str, lp="linepay",
              gp="googlepay",
              gpay="googlepay",
              sp="samsungpay",
              hgpay="happygopay",
              fami="famipay",
              台灣行動支付="台灣pay",
              pi="pipay",
              pi拍錢包="pipay",
              pi錢包="pipay",
              拍錢包="pipay",
              街口="街口支付",
              xd=""
              )
}

meta_tokens$word=synonym(meta_tokens$word) 
review_tokens$word=synonym(review_tokens$word) 
all_tokens$word=synonym(all_tokens$word) 

1.網路討論聲量(Eva)

2.行動支付文字雲

#找出詞頻較常出現的
word_count <- all_tokens %>%
  select(word) %>%
  count(word) %>% 
  filter(n>150) %>%   # 過濾出現太少次的字
  arrange(desc(n())) 

# word_count %>% wordcloud2() 

  • 整體而言行動支付社群討論文字雲為 “信用卡”,行動支付的產品很多,從文字雲初步看來以linepay,台灣pay,google pay, samsungpay,悠遊付,pipay 的詞頻為最高,
  • 消費,優惠,點數,可消費的店家也是社群所關注的
  • 通路部份包括了超市通路如全聯, 超商如全家
  • 與行動支付有關的錢包如linepaymoney, 錢包

3.發文種類TF-IDF

#不同種類的tf_idf 
meta_tokens %>% 
  count(class,word,sort=TRUE) %>% 
  bind_tf_idf(word, class, n) %>% 
  filter(n>50,nchar(word)>1) %>% 
  filter(class=="優惠") %>% 
  arrange(class,desc(tf_idf)) 
##     class     word   n          tf       idf      tf_idf
##  1:  優惠     台新  51 0.008132674 0.1335314 0.001085967
##  2:  優惠     回饋 153 0.024398023 0.0000000 0.000000000
##  3:  優惠     活動 123 0.019614097 0.0000000 0.000000000
##  4:  優惠   悠遊付  83 0.013235529 0.0000000 0.000000000
##  5:  優惠  linepay  62 0.009886780 0.0000000 0.000000000
##  6:  優惠      app  61 0.009727316 0.0000000 0.000000000
##  7:  優惠     消費  61 0.009727316 0.0000000 0.000000000
##  8:  優惠 活動期間  59 0.009408388 0.0000000 0.000000000
##  9:  優惠     帳戶  53 0.008451603 0.0000000 0.000000000
## 10:  優惠     綁定  51 0.008132674 0.0000000 0.000000000
  • 情報類,出現“限得”, 如 活動期間每人限得一次,限得8個紅包,限得999點,限得一張 “活動回饋”, “福利”,“零用金”, “回饋資格”,“優惠”
  • 請益類,出現“感應”,表示鄉民較常請益手機感應出現問題的情況,要如何處理 “nfc”,“失敗”,“掃碼”,“hamipay”,“googlepay”,“玉山”和其它類比較不同
  • 新聞類:“基金”,“證券”,“金管會”,“市場”,“電子支付”,等金融法令都用詞 , 另外則是“機構”,“董市長”,“業者”等新聞報導用字
  • 其餘類的tf_idf則都偏低,與其他類沒有比較特殊的用字。

三、主要行動支付種類評比

1.各支付之社群文字雲

(1)「Line Pay」社群文字雲

#以下為linepay的處理
metaData_linepay <- metaData %>% 
   filter(str_detect(sentence,"linepay") | str_detect(sentence,"linepaymoney") | str_detect(sentence,"lp") | str_detect(sentence,"lpm") | str_detect(sentence,"lpmoney")) 

reviews_linepay <-reviews %>%
   filter(str_detect(cmtContent,"linepay") | str_detect(cmtContent,"linepaymoney") | str_detect(cmtContent,"lp") | str_detect(cmtContent,"lpm") | str_detect(cmtContent,"lpmoney"))

meta_tokens_linepay <- metaData_linepay %>% unnest_tokens(word, sentence, token=customized_tokenizer)
review_tokens_linepay <- reviews_linepay %>% unnest_tokens(word, cmtContent, token=customized_tokenizer) 

# 把資料併在一起
all_tokens_linepay <- rbind(meta_tokens_linepay[,c("artDate","artUrl", "word")],
              review_tokens_linepay[,c("artDate","artUrl", "word")]
              ) 

line_synonym<-c("linepay","linepaymoney","lp","lpm","lpmoney") 

all_tokens_linepay  %>% 
  filter(!word %in% line_synonym)  %>% 
  filter(!str_detect(word,"\\d"))  %>% 
  filter(nchar(word)>1)  %>% 
  count(word) %>% 
  filter(n>150) %>%   # 過濾出現太少次的字
  arrange(desc(n()))
##          word   n
##  1:       app 222
##  2:      line 164
##  3: linepoint 515
##  4:    一卡通 236
##  5:      上限 152
##  6:      手機 211
##  7:      支付 379
##  8:      付款 669
##  9:      功能 170
## 10:      用戶 229
## 11:      交易 282
## 12:      同意 224
## 13:      回饋 803
## 14:      成功 200
## 15:  行動支付 246
## 16:      店家 210
## 17:      金額 250
## 18:    信用卡 317
## 19:      指定 179
## 20:      是否 171
## 21:      活動 762
## 22:  活動期間 281
## 23:      消費 453
## 24:      帳戶 337
## 25:      帳號 200
## 26:    悠遊付 193
## 27:    悠遊卡 152
## 28:      條碼 185
## 29:      連結 152
## 30:      陸續 156
## 31:      提供 226
## 32:      最高 233
## 33:      無法 180
## 34:      發放 172
## 35:      結帳 164
## 36:      街口 321
## 37:      會員 170
## 38:      綁定 332
## 39:      資訊 163
## 40:      銀行 277
## 41:      選擇 186
## 42:      優惠 444
## 43:      儲值 166
## 44:      點數 383
## 45:  點數回饋 354
##          word   n
   # %>% wordcloud2() 

(2)「街口支付」社群文字雲

#以下為街口支付的處理
metaData_street <- metaData %>% 
   filter(str_detect(sentence,"街口") ) 

reviews_street <-reviews %>%
   filter(str_detect(cmtContent,"街口"))

meta_tokens_street <- metaData_street %>% unnest_tokens(word, sentence, token=customized_tokenizer)
review_tokens_street <- reviews_street %>% unnest_tokens(word, cmtContent, token=customized_tokenizer) 

# 把資料併在一起
all_tokens_street <- rbind(meta_tokens_street[,c("artDate","artUrl", "word")],
              review_tokens_street[,c("artDate","artUrl", "word")]
              ) 

street_synonym<-c("街口","街口支付") 

all_tokens_street  %>% 
  filter(!word %in% street_synonym)  %>% 
  filter(!str_detect(word,"\\d"))  %>% 
  filter(nchar(word)>1)  %>% 
  count(word) %>% 
  filter(n>80) %>%   # 過濾出現太少次的字
  arrange(desc(n())) 
##         word   n
##  1:      app 253
##  2:  linepay 490
##  3:       lp 296
##  4:      pay  90
##  5:       xd  93
##  6:     一次 103
##  7:     公司 191
##  8:     手機 133
##  9:     支付 302
## 10:     方式  84
## 11:     付款 228
## 12:     功能 111
## 13:     台新  86
## 14:     台灣  93
## 15:  台灣pay 129
## 16:     用戶 110
## 17:     交易 104
## 18:     全家 168
## 19:     全聯  95
## 20:     合作  96
## 21:     回饋 579
## 22: 行動支付 213
## 23:     投信 162
## 24:     店家 169
## 25:     服務 113
## 26:     表示  93
## 27:   金管會 121
## 28:     金額  97
## 29:   信用卡 278
## 30:     活動 259
## 31:     消費 290
## 32:     問題  99
## 33:     基金 110
## 34:     帳戶 290
## 35:   悠遊付 199
## 36:   悠遊卡 134
## 37:     條碼 145
## 38: 現金回饋  81
## 39:     通路 126
## 40:     提供 109
## 41:     最高  83
## 42:     無法  92
## 43:     結帳 103
## 44:   街口幣 310
## 45:     會員 214
## 46:     綁定 189
## 47:     載具 148
## 48: 電子支付 157
## 49:     電支 111
## 50:     銀行 181
## 51:     整合 116
## 52:     優惠 135
## 53:     儲值 102
## 54:   聯名卡 117
## 55:     繳費 115
##         word   n
  # %>% wordcloud2() 

  • 金管會, 投信 : 金管會對街口電支,街口投信開罰,未確實執行內控及街口託付保等新聞,停止街口電支董事長胡亦嘉執行董事職務1年。
  • 現金回饋:街口支付綁定多家銀行信用
  • 和linepay共提的比例高, 悠遊付
  • 聯名卡: 台新銀行街口聯名卡,且指定“通路”有更高的回饋

(3)「Pi拍錢包」社群文字雲

#以下為pi拍錢包的處理
metaData_pi <- metaData %>% 
   filter(str_detect(sentence,"pi") | str_detect(sentence,"拍錢包")) 

reviews_pi <-reviews %>%
   filter(str_detect(cmtContent,"pi") | str_detect(cmtContent,"拍錢包"))

meta_tokens_pi <- metaData_pi %>% unnest_tokens(word, sentence, token=customized_tokenizer)
review_tokens_pi <- reviews_pi %>% unnest_tokens(word, cmtContent, token=customized_tokenizer) 

# 把資料併在一起
all_tokens_pi <- rbind(meta_tokens_pi[,c("artDate","artUrl", "word")],
              review_tokens_pi[,c("artDate","artUrl", "word")]
              ) 

meta_tokens_pi$word=synonym(meta_tokens_pi$word) 
review_tokens_pi$word=synonym(review_tokens_pi$word) 
all_tokens_pi$word=synonym(all_tokens_pi$word) 

pi_synonym<-c("pi","pi錢包","拍錢包","pi拍錢包") 

all_tokens_pi  %>% 
  filter(!word %in% pi_synonym)  %>% 
  filter(!str_detect(word,"\\d"))  %>% 
  filter(nchar(word)>1)  %>% 
  count(word) %>% 
  filter(n>50) %>%   # 過濾出現太少次的字
  arrange(desc(n())) 
##          word   n
##  1:       app 139
##  2:   linepay 158
##  3: linepoint  61
##  4:     pipay 588
##  5:     pixel  54
##  6:       p幣 203
##  7:      上限  55
##  8:      手機  78
##  9:      支付 122
## 10:      付款 164
## 11:      加碼  67
## 12:      交易  76
## 13:      回饋 351
## 14:  行動支付  94
## 15:      金額  71
## 16:    信用卡 169
## 17:      活動 166
## 18:  活動期間  52
## 19:      消費 125
## 20:      最高  76
## 21:  街口支付  78
## 22:      會員  51
## 23:      綁定 130
## 24:      銀行  54
## 25:      優惠  87
## 26:      點數  53
## 27:  點數回饋  62
##          word   n
  # %>% wordcloud2() 

  • pipay主要為使用p幣,但只有綁定玉山聯名卡才有p幣

(4)台灣pay社群文字雲

#以下為台灣pay的處理
metaData_taiwan <- metaData %>% 
   filter(str_detect(sentence,"台灣pay") | str_detect(sentence,"taiwanpay")) 

reviews_taiwan <-reviews %>%
   filter(str_detect(cmtContent,"台灣pay") | str_detect(cmtContent,"taiwanpay"))

meta_tokens_taiwan <- metaData_taiwan %>% unnest_tokens(word, sentence, token=customized_tokenizer)
review_tokens_taiwan <- reviews_taiwan %>% unnest_tokens(word, cmtContent, token=customized_tokenizer) 

# 把資料併在一起
all_tokens_taiwan <- rbind(meta_tokens_taiwan[,c("artDate","artUrl", "word")],
              review_tokens_taiwan[,c("artDate","artUrl", "word")]
              ) 

meta_tokens_taiwan$word=synonym(meta_tokens_taiwan$word) 
review_tokens_taiwan$word=synonym(review_tokens_taiwan$word) 
all_tokens_taiwan$word=synonym(all_tokens_taiwan$word) 

taiwan_synonym<-c("台灣pay","taiwanpay") 

all_tokens_taiwan  %>% 
  filter(!word %in% taiwan_synonym)  %>% 
  filter(!str_detect(word,"\\d"))  %>% 
  filter(nchar(word)>1)  %>% 
  count(word) %>% 
  filter(n>70) %>%   # 過濾出現太少次的字
  arrange(desc(n()))
##          word   n
##  1:       app 346
##  2: googlepay  77
##  3:   linepay 105
##  4:       nfc  81
##  5:    qrcode 101
##  6:      一次  72
##  7:      一銀  72
##  8:    三倍券 122
##  9:      上限 108
## 10:      手機 101
## 11:      支付 197
## 12:      支援  92
## 13:      方式  81
## 14:      付款 163
## 15:      加碼  98
## 16:      台灣 146
## 17:      用戶 153
## 18:      交易 273
## 19:      兆豐  73
## 20:      回饋 554
## 21:    回饋金  75
## 22:      成功  93
## 23:  行動支付 243
## 24:      刷卡  89
## 25:      官網  95
## 26:      店家 117
## 27:    金融卡 208
## 28:      金額  75
## 29:    信用卡 447
## 30:      客服  97
## 31:      指定  74
## 32:      活動 436
## 33:  活動期間 103
## 34:      消費 303
## 35:      參與  95
## 36:      問題  92
## 37:      帳戶 234
## 38:      掃碼 260
## 39:      條碼  92
## 40:      通路  97
## 41:      無法  75
## 42:      華南  76
## 43:  街口支付 122
## 44:      感應 156
## 45:      綁定 180
## 46:      彰銀 115
## 47:      銀行 330
## 48:      優惠 157
## 49:      轉帳  72
## 50:      繳費  80
##          word   n
  # %>% wordcloud2() 

  • 台灣Pay透過三倍券的活動大力推廣台灣Pay,有 23家銀行有推出三倍券 + 台灣 Pay 的活動,這 23家銀行的“金融卡”或銀行帳戶都可以綁定, 但是只有 13家的銀行,可以綁定其信用卡在台灣 Pay 之中
  • 各家銀行APP+ 台灣pay, 或台灣行動支付 APP 中的台灣 Pay 都可以使用
  • 使用台灣 Pay 累積三倍券額度,一定要用“掃碼”方式支付
jieba_tokenizer = worker(user="../dict/mp_dict.txt") #還未加stop_words 

# unnest_tokens 使用的bigram分詞函數
# Input: a character vector
# Output: a list of character vectors of the same length
# 直接寫成一個bigram function呼叫 
jieba_bigram <- function(t) {
  lapply(t, function(x) {
    if(nchar(x)>1){ #長度2以上的才可以ngrams(tokens,2)
      tokens <- segment(x, jieba_tokenizer)
      bigram<- ngrams(tokens, 2)
      bigram <- lapply(bigram, paste, collapse = " ") #用空白隔開 
      unlist(bigram)
    }
  })
}

## visualize_bigrams 
visualize_bigrams <- function(bigrams) {
  set.seed(2016)
  a <- grid::arrow(type = "closed", length = unit(.15, "inches"))
  
  bigrams %>%
    graph_from_data_frame() %>%
    ggraph(layout = "fr") +
    geom_edge_link(aes(edge_alpha = n), show.legend = FALSE, arrow = a) +
    geom_node_point(color = "lightblue", size = 5) +
    geom_node_text(aes(label = name), vjust = 1, hjust = 1) +
    theme_void()
}
#作bigram
mobilePay_bigram <- metaData %>%
  unnest_tokens(bigram, sentence, token = jieba_bigram)
mobilePay_bigram %>% 
  separate(bigram, c("word1", "word2"), sep=" ") %>% 
  count(word1, word2, sort = TRUE) %>% 
  filter(n > 100,
         !str_detect(word1, "\\d"),
         !str_detect(word2, "\\d")) %>%
  visualize_bigrams()

#stop_words登場 
stop_words <- scan(file = "../dict/mp_stop_words.txt", what=character(),sep='\n', 
                   encoding='utf-8',fileEncoding='utf-8')

mp_lexicon <- scan(file = "../dict/mp_dict.txt", what=character(),sep='\n', 
                   encoding='utf-8',fileEncoding='utf-8')
# stop_words
#清除stop words 
mobilePay_bigram_separated <- mobilePay_bigram %>% 
  select(-artPoster,-artCat,-commentNum,-push,-boo) %>%
  filter(!str_detect(bigram, regex("[0-9]"))) %>%
  separate(bigram, c("word1", "word2"), sep = " ") %>% 
  filter(!(word1 %in% stop_words), !(word2 %in% stop_words))
#找出前20的bigram , 作為自行斷詞的參考
 mobilePay_bigram_separated %>%
  unite_("bigram", c("word1","word2"), sep=" ")  %>%  
  count(bigram, sort = TRUE) 
##               bigram   n
##     1:   linepoint s 314
##     2:   悠遊卡 公司 300
##     3:     回饋 上限 210
##     4:     自動 加值 143
##     5: 台灣 行動支付 142
##    ---                  
## 59855:       鑽 法律   1
## 59856:       鑽 金卡   1
## 59857:       鑽 保卡   1
## 59858:     鑽保 數位   1
## 59859:   鑽保卡 這張   1
#重新畫bigram圖
mobilePay_bigram_separated %>% 
  count(word1,word2,sort=TRUE) %>% 
  filter(n > 60,
         !str_detect(word1, "\\d"),
         !str_detect(word2, "\\d"),
         nchar(word1)>1
         # nchar(word2)>1
         ) %>% 
  visualize_bigrams() 

2.各主要支付之字詞相關性

###以下要作斷句
# 以全形或半形 驚歎號、問號、分號 以及 全形句號 爲依據進行斷句
mobilePay_sentences <- strsplit(metaData$sentence,"[。!;?!?;]")

# 將每句句子,與他所屬的文章連結配對起來,整理成一個dataframe
mobilePay_sentences <- data.frame(
                        artUrl = rep(metaData$artUrl, sapply(mobilePay_sentences, length)), 
                        sentence = unlist(mobilePay_sentences)
                      ) %>%
                      filter(!str_detect(sentence, regex("^(\t|\n| )*$")))
#轉成文字型態
mobilePay_sentences$sentence <- as.character(mobilePay_sentences$sentence)
mobilePay_sentences$sentence <- gsub("~","",mobilePay_sentences$sentence)
# mobilePay_sentences
#加入斷詞
mp_dict <- scan(file = "../dict/mp_dict.txt", what=character(),sep='\n', 
                   encoding='utf-8',fileEncoding='utf-8',quiet = T)
# mp_dict
jieba_tokenizer = worker(write = "NOFILE")

# 重新斷詞
new_user_word(jieba_tokenizer, c(mp_dict))
## [1] TRUE
chi_tokenizer <- function(t) {
  lapply(t, function(x) {
    if(nchar(x)>1){
      tokens <- segment(x, jieba_tokenizer) #用新的tokenizer
      tokens <- tokens[!tokens %in% stop_words] #stop_words就移除
      # 去掉字串長度爲1的詞彙
      tokens <- tokens[nchar(tokens)>1]
      return(tokens)
    }
  })
}


# 剛才的斷詞結果沒有使用新增的辭典,因此我們重新進行斷詞,再計算各詞彙在各文章中出現的次數

mp_words <- mobilePay_sentences %>%
  unnest_tokens(word, sentence, token=chi_tokenizer) %>% #一個字的斷詞 
  filter(!str_detect(word, regex("[0-9]"))) %>% #只去除數字,pay的名字很多有英文字 
  count(artUrl, word, sort = TRUE)

#處理同義字
mp_words$word=synonym(mp_words$word)


word_pairs <- mp_words %>%
  pairwise_count(word, artUrl, sort = TRUE) %>% #每一篇文章同時出現詞彙
  filter(!item1 %in% c("行動支付") & !item2 %in% c("行動支付"))
## Warning: `distinct_()` was deprecated in dplyr 0.7.0.
## Please use `distinct()` instead.
## See vignette('programming') for more help
## Warning: `tbl_df()` was deprecated in dplyr 1.0.0.
## Please use `tibble::as_tibble()` instead.
word_pairs
## # A tibble: 6,055,792 x 3
##    item1 item2     n
##    <chr> <chr> <dbl>
##  1 活動  回饋    409
##  2 回饋  活動    409
##  3 消費  回饋    338
##  4 回饋  消費    338
##  5 消費  活動    312
##  6 活動  消費    312
##  7 帳戶  回饋    267
##  8 回饋  帳戶    267
##  9 帳戶  活動    237
## 10 活動  帳戶    237
## # ... with 6,055,782 more rows
word_cors <- mp_words %>% 
  filter(!str_detect(word,regex("[0-9]"))) %>% 
  group_by(word) %>%
  filter(n() >= 60) %>% 
  pairwise_cor(word, artUrl, sort = TRUE) #呼叫後就自動加上item1,item2 

word_cors
## # A tibble: 71,556 x 3
##    item1 item2 correlation
##    <chr> <chr>       <dbl>
##  1 解釋  權利        0.835
##  2 權利  解釋        0.835
##  3 保留  權利        0.821
##  4 權利  保留        0.821
##  5 終止  保留        0.803
##  6 保留  終止        0.803
##  7 終止  權利        0.786
##  8 權利  終止        0.786
##  9 終止  違反        0.783
## 10 違反  終止        0.783
## # ... with 71,546 more rows
# 找出與各個pay相關性最高的 15 個詞彙

#主要行動支付產品 
# mp_products<-c("linepay",  "街口支付","台灣pay","pi錢包","悠遊付","applepay","famipay","samsungpay","pxpay","googlepay")
mp_products<-c("linepay",  "街口支付","台灣pay","pipay") 

word_cors %>%
  filter(item1 %in% mp_products) %>%
  group_by(item1) %>%
  top_n(15) %>%
  ungroup() %>%
  mutate(item2 = reorder(item2, correlation)) %>%
  ggplot(aes(item2, correlation)) +
  geom_bar(stat = "identity") +
  facet_wrap(~ item1, scales = "free") +
  coord_flip()+ #座標轉向 
  theme(text = element_text(family = "Heiti TC Light")) #加入中文字型設定,避免中文字顯示錯誤。
## Selecting by correlation
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database

  • linepay網友主推回饋點數, 街口支付以現金回饋為賣點。
  • 台灣pay綁定的是「金融卡」,以條碼付款、掃描支付,主推回饋金,2020/6振興三倍券電子票券有3倍回饋,造成網路聲量。
  • Pi拍錢包僅綁定特定銀行「玉山」銀行推出的聯名卡才能享有「P幣回饋」。

3.行動支付共現圖

set.seed(2020)

filter_word=c("解釋","權利","保留","終止","違反","點選","如有","不可","另行通知","技術","變更","暫停","活動資格","注意事項","辨識","電話","活動期間","活動內容","版本","陸續","取消","狀態","回饋資格","規定","上述","如有","最終","決定","標題","時間")
#線愈粗表示correlation愈高 
word_cors %>% 
  filter(!item1 %in% filter_word ) %>% 
  filter(!item2 %in% filter_word) %>%
  filter(correlation > 0.4) %>% 
  graph_from_data_frame() %>% #data_frame轉為圖形 
  ggraph(layout = "fr") +
  geom_edge_link(aes(edge_alpha = correlation), show.legend = FALSE) +
  geom_node_point(color = "lightblue", size = 3) +
  geom_node_text(aes(label = name), repel = TRUE, family = "Heiti TC Light") + #加入中文字型設定,避免中文字顯示錯誤。
  theme_void()
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

  • 字詞共現多為情報類活動辦法之官方文字
  • 情報類的發文都有各行動支付公司對優惠活動“做出最終解釋,無須另行通知” , “如有任何因電腦、網路、電話、技術或不可歸責於LINE Pay的事由” 的但書
  • 回饋點數將“陸續發放”
  • 本活動期間回饋所有參加者之上,限總金額為“新臺幣”

+ 發文主要為情報版上的活動情報。 + line Pay, line points,line pay money的活動,一直是網友的議題 + 台北市發行的悠遊付電子支付,因2020初一直處封測階段,屬於假上線狀況,一直在社群上有討論,另外悠遊付採用的是掃碼支付方式,目前僅支援萊爾富、頂好等多個通路,無法如同現有的NFC SIM卡或Samsung Pay悠遊卡在所有悠遊卡通路使用。另外有關悠遊付的操作討論也不少。

4.Line Pay/街頭支付競爭度比較

LINE Pay x 街口支付共提次數文氏圖 共提次數117次,佔line pay總聲量 26% 佔街口支付 43% ,表示對街口支付的潛在競爭影響較大

art_count<-metaData %>% select (linepay,streetpay) 
venn_art_count <- vennCounts(art_count)
vennDiagram(venn_art_count, names = c("Line Pay", "街頭支付"), cex = 1, counts.col = "red")

四、行動支付通路比較

超市通路(均)

夜市通路探索(Eva)

五、結論