[系列活動] 手把手教你r語言資料分析實務

189
游為翔, 張鈞閔 中央研究院資訊科學研究所 手把手教你R 語言資料分析實務 1

Post on 15-Apr-2017

3.512 views

Category:

Data & Analytics


5 download

TRANSCRIPT

Page 1: [系列活動] 手把手教你R語言資料分析實務

游為翔, 張鈞閔

中央研究院資訊科學研究所

手把手教你R 語言資料分析實務

1

Page 2: [系列活動] 手把手教你R語言資料分析實務

事前準備 (請助教協助)

下載課程投影片、程式碼與資料 程式碼 : https://goo.gl/65QPyM

投影片 : https://goo.gl/JKHJAE

並確認檔案打開是否完整,有沒有亂碼問題

(R, RStudio應該都已安裝好囉……)

2

Page 3: [系列活動] 手把手教你R語言資料分析實務

事前準備 (請助教協助)

將下載的資料夾解壓縮

安裝需要的工具包請打開 session_00_install_packages.R 執行檢查

3

Page 4: [系列活動] 手把手教你R語言資料分析實務

FAQ.1: 打開程式碼後出現亂碼解決辦法: 重新以 UTF-8 開啟程式碼

Page 5: [系列活動] 手把手教你R語言資料分析實務

FAQ.2: 找不到檔案解決辦法: 工作路徑不對, 用setwd指定到上課用的資料夾

Page 6: [系列活動] 手把手教你R語言資料分析實務

FAQ.3: Rtools版本錯誤解決辦法: 手動安裝後, 重新執行session00.R

至 https://cran.r-project.org/bin/windows/Rtools/下載對應你電腦中的R版本

Page 7: [系列活動] 手把手教你R語言資料分析實務

Pkg “installr”

# installing/loading the package:if(!require(installr)) {install.packages("installr"); require(installr)}

# using the package:updateR()

7

FAQ.3: Rtools版本錯誤 (解法2)解決辦法: 直接把 R 的版本升級!!!

Page 8: [系列活動] 手把手教你R語言資料分析實務

FAQ.4: 缺少某些 dependent package解決辦法: 手動安裝後, 重新執行安裝

Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : there is no package called ‘Rcpp’

> install.package(“Rcpp”, dep = T)

Page 9: [系列活動] 手把手教你R語言資料分析實務

FAQ.5: Mac 畫圖時的中文亂碼解決辦法:1) 在繪圖前, 執行 par(family = 'STHeiti')2) 直接在繪圖時指定字型, plot( …, family = “STHeiti”)

Page 10: [系列活動] 手把手教你R語言資料分析實務

台大心理所畢

中研院資訊所研究助理

研究專長 網路數據探勘

消費及使用者行為分析

台大電機所畢

中研院資訊所研究助理

研究專長 線上平台定價自動化

線上平台使用者分析

計算社會學

10

Lecturers

Page 11: [系列活動] 手把手教你R語言資料分析實務

課程簡介

11

Page 12: [系列活動] 手把手教你R語言資料分析實務

今天的進行方式

課程內容說明

實作講解 (demo)

練習公佈參考解答

課程投影片及需要的 data 與 code 皆可下載

12

Page 13: [系列活動] 手把手教你R語言資料分析實務

圖例

請打開 session_00_install_R_packages.R

代表在 Rstudio工作

代表開啟網頁

Ex. http://www.appledaily.com.tw/appledaily/article/headline/20170112/37516585

另外課程有任何問題, 可以在 Sli.do上進行提問

我們會盡可能的在課堂小結時回答

13

Page 14: [系列活動] 手把手教你R語言資料分析實務

Outline

A. 取得資料 &清理 ---資料收集與清整

B. 檢視資料與建立特徵 ---探索性資料分析

C. 以不同面相建立更多特徵 ---文字探勘

D. 解釋與預測 ---建立模型

14

Page 15: [系列活動] 手把手教你R語言資料分析實務

Session A資料收集

Data Collection

Page 16: [系列活動] 手把手教你R語言資料分析實務

蘋果(日報)基金會公益捐款公開資料

資料:蘋果日報暖流版

16

Page 17: [系列活動] 手把手教你R語言資料分析實務

蘋果暖流新聞

17

http://www.appledaily.com.tw/appledaily/article/headline/20160624/37280888

Page 18: [系列活動] 手把手教你R語言資料分析實務

download.file請打開 session_A_DataCollection.R

抓取網頁

資料收集 -講解 A-01

18

Page 19: [系列活動] 手把手教你R語言資料分析實務

抓取網頁

# Article urlurl <-“http://www.appledaily.com.tw/appledaily/article/headline/20160704/37293645”# save the pagedownload.file(url, “data/test.html”)

資料收集 -講解 A-01

19

• 是否一定要把網頁 download下來?• 看狀況, 如果你要爬的頁面很多, 但你還沒確定格式

(或還在測試), 或是已知該網站有 request 次數限制 …-> 建議把原始檔 (整個頁面)抓下來

Page 20: [系列活動] 手把手教你R語言資料分析實務

存好檔案,如何把資訊擷取出來?

20

Page 21: [系列活動] 手把手教你R語言資料分析實務

先利其器

知己知彼瞭解檔案格式,如: xml, csv, json

載入資料前站在巨人的肩膀上 --尋找合適的 R packages

21

Page 22: [系列活動] 手把手教你R語言資料分析實務

網頁架構及語法HTML

<標籤屬性> 內容 </標籤>

<html><head></head><body>

<h1 id=“title”> Title </h1><p> Paragraph </p><ol>

<li> Item 1 </li><li> Item 2 </li>

</ol></body>

</html>

<html>

<head> <body>

<h1 id=‘title’> <p> <ol>

Title Paragraph <li> <li>

Item 1 Item 2

22

Page 23: [系列活動] 手把手教你R語言資料分析實務

利用瀏覽器檢查原始碼在 Chrome/Firefox 按下 F12

Page 24: [系列活動] 手把手教你R語言資料分析實務

讀取網頁資訊 (pkg xml2)

xml2 讀取網頁:read_html; read_xml

選擇節點:xml_find_all; xml_find_first

擷取資訊:xml_text; xml_attr

<html>

<head> <body>

<h1 id=‘title’> <p> <ol>

Title Paragraph <li> <li>

Item 1 Item 2

如何找到需要的節點?

Xpath

<標籤屬性> 內容 </標籤>

24

Page 25: [系列活動] 手把手教你R語言資料分析實務

XPath: a path of XML Tree

標記 意義

/ 選取某標籤的根節點 (children)

// 選取某標籤所有節點 (descendant)

[@] 選取屬性 (attribute)

* 任何標籤的節點

| OR

25

A book

目錄

第一章

第二章

段落1

段落2

段落1

段落2

Page 26: [系列活動] 手把手教你R語言資料分析實務

XPath: a path of XML Tree

標記 意義

/ 選取某標籤的根節點 (children)

// 選取某標籤所有節點 (descendant)

[@] 選取屬性 (attribute)

* 任何標籤的節點

| OR

26

A book

目錄

第一章

第二章

段落1

段落2

段落1

段落2

先來個簡單的例子簡單的網頁: https://goo.gl/jNHmDH

使用Xpath的解析範例: https://goo.gl/OcfO0O

Page 27: [系列活動] 手把手教你R語言資料分析實務

Xpath = “//*[@id=‘inquiry3’]/table//tr[4]/td[1]”

Page 28: [系列活動] 手把手教你R語言資料分析實務

讀取網頁資訊 (pkg xml2)

library(xml2)

# set your target urldoc <- read_html(url)

# set the xpath of info neededxpath <- “//*[@id=‘inquiry3’]/table//tr[4]/td[1]”xml_text(xml_find_all(doc, xpath))

資料收集 -講解 A-01

28

Page 29: [系列活動] 手把手教你R語言資料分析實務

擷取資訊

xml_text(doc): <標籤屬性> 內容 </標籤>

xml_attr(doc, attr): <標籤屬性>內容 </標籤>

29

<html>

<head> <body>

<h1 id=‘title’> <p> <ol>

Title Paragraph <li> <li>

Item 1 Item 2

<html><head></head><body>

<h1 id=“title”> Title </h1><p> Paragraph </p><ol>

<li> Item 1 </li><li> Item 2 </li>

</ol></body>

</html>

Page 30: [系列活動] 手把手教你R語言資料分析實務

練習 A-01 (8 mins)

請觀察網頁,寫出可以擷取正確資訊的 Xpath1-1: 編號

1-2: 欄位名稱

1-3: 捐款文章連結

bonus: 共計頁數

資料收集 -練習 A-01

30

Page 31: [系列活動] 手把手教你R語言資料分析實務

練習 A-01 (8 mins)

1-1

1-2

1-3

資料收集 -練習 A-01

31

Page 32: [系列活動] 手把手教你R語言資料分析實務

練習 A-01 (8 mins)

請觀察網頁,寫出可以擷取正確資訊的 Xpath1-1: 編號

1-2: 欄位名稱

1-3: 捐款文章連結

bonus: 共計頁數

bonus

資料收集 -練習 A-01

32

Page 33: [系列活動] 手把手教你R語言資料分析實務

練習 A_ex01 (參考解答)

請觀察網頁,寫出可以擷取正確資訊的 Xpath1-1: 編號:"//*[@id='inquiry3']/table//tr/td[1]"

1-2: 欄位名稱: "//*[@id='inquiry3']//tr[2]/th"

1-3: 捐款明細連結:"//*[@id='inquiry3']//tr/td[6]/a"

bonus: 共計頁數: "//*[@id='charity_day']"

資料收集 -練習 A-01

35

Page 34: [系列活動] 手把手教你R語言資料分析實務

將爬下來的資料轉存成 data frame

# 第一種作法:把抓下來的vector合起來data.frame(a1=a1, a2=a2, a3=a3, …)

# 第二種作法:依特定排列填入二維表格matrix()

資料收集 -講解 A-02

36

Page 35: [系列活動] 手把手教你R語言資料分析實務

練習 A-02 (13 mins)

請將捐款進度報告頁面轉存成 csv檔# 學員自行隨機取第n頁page <- sample(1:n.page, 1)

資料收集 -練習 A-02

df_article_raw.csv

37

Page 36: [系列活動] 手把手教你R語言資料分析實務

欄位aid

title

date.published

case.closed

donation

url.article

url.detail

練習 A-02 (13 mins)

資料收集 -練習 A-02

df_article_raw.csv

# 學員自行隨機取第 n頁page <- sample(1:n.page, 1)

38

Page 37: [系列活動] 手把手教你R語言資料分析實務

欄位aid

title

date.published

case.closed

donation

url.article

url.detail (需要特別處理)

練習 A-02 (13 mins)

資料收集 -練習 A-02

df_article_raw.csv

Xpath

39

Page 38: [系列活動] 手把手教你R語言資料分析實務

練習 A_ex02 (參考解答)

資料收集 -練習 A-02

40

Page 39: [系列活動] 手把手教你R語言資料分析實務

練習 A-03 (Optional)

請規劃如何分析蘋果公益捐款資料,依設定的目標將需要的網頁資訊擷取轉存下來。

資料收集 -練習 A-03

41

Page 40: [系列活動] 手把手教你R語言資料分析實務

練習 A-03 (Optional)

Outcomedf_article_raw.csv

文章.txt

捐款明細.txt

資料收集 -練習 A-03

42

Page 41: [系列活動] 手把手教你R語言資料分析實務

抓取該文章的Facebook讚數 –Facebook Graph API

http://graph.facebook.com/?fields=share&id=http://www.appledaily.com.tw/appledaily/article/headline/20170113/37517808

43

Page 42: [系列活動] 手把手教你R語言資料分析實務

小結

網頁爬蟲觀察網頁 (靜態)

抓取所需資訊 (結構 / 非結構化資料處理)

轉成結構化形式儲存

進階知識 (動態網頁……)

44

Page 43: [系列活動] 手把手教你R語言資料分析實務

小結

練習 A-01了解 Xpath運作方式

練習 A-02把捐款進度報告頁抓下來 (大表)

練習 A-03把捐款明細抓下來 (每則捐款細目)

把原文抓下來

45

Page 44: [系列活動] 手把手教你R語言資料分析實務

原本就有的欄位aid (文章代號)

case.closed (是否結案)

date.published (文章日期)

donation (捐款金額)

title (文章標題)

url.article (文章連結)

url.detail (捐款明細)

文章內容抓取欄位 journalist (撰文記者)

n.image (圖片數量)

n.word (文章字數)

捐款明細抓取欄位donor (捐款人數)

date.funded (結案日期)

下一堂課需要用到的資料欄位

df_article_raw → df_article

46

A - 02

A - 03

Page 45: [系列活動] 手把手教你R語言資料分析實務

Next session starts at AM 11:00

Stay Tuned…… We’ll be back soon!!

47

Page 46: [系列活動] 手把手教你R語言資料分析實務

練習 A-03 解答

48

Page 47: [系列活動] 手把手教你R語言資料分析實務

練習 A_ex03 (參考解答)

資料收集 -練習 A-03

df_article_raw.csv

49

Page 48: [系列活動] 手把手教你R語言資料分析實務

Session B探索式資料分析Explanatory Data Analysis

Page 49: [系列活動] 手把手教你R語言資料分析實務

Data Manipulation

51

Page 50: [系列活動] 手把手教你R語言資料分析實務

現有資料

Outcome文章總表 (df_article_raw.csv)

文章.txt (data/db_article_txt/)

捐款明細.txt (data/db_detail_txt/)

EDA-講解 B-01

52

Page 51: [系列活動] 手把手教你R語言資料分析實務

df_article.csv

欄位aid

case.closed

date.published

donation

title

url.article

url.detail

donor

date.funded

journalist

n.image

n.word

df_article.csv

df_article_raw.csv

53

Page 52: [系列活動] 手把手教你R語言資料分析實務

df_article.csv

範例

54

Page 53: [系列活動] 手把手教你R語言資料分析實務

df_donation.csv

In db_detail_txt.rar

df_donation.csv

55

Page 54: [系列活動] 手把手教你R語言資料分析實務

練習 B-01 (10 mins)

請將 crawl 下來的所有專案捐款明細表,整合成一張大表 df_donation.csv

取出必要資訊計算各篇捐款總人數

各篇捐款總金額

各篇每人平均捐款金額

各篇捐款人捐款金額的中位數

EDA -練習 B-01

56

Page 55: [系列活動] 手把手教你R語言資料分析實務

Character Encoding Problem (Mac)

如果 read.csv 讀取中文出現亂碼透過 Sys.getlocale()確認 locale 預設語言

設定成英文system("defaults write org.R-project.Rforce.LANG en_US.UTF-8")

設定成繁體中文system("defaults write org.R-project.Rforce.LANG zh_TW.UTF-8")

或是透過 read.csv 的 parameters 設定fileEncoding = "UTF-8"

57

Page 56: [系列活動] 手把手教你R語言資料分析實務

探索式資料分析

58

Page 57: [系列活動] 手把手教你R語言資料分析實務

什麼是 EDA ?

EDA (Exploratory Data Analysis)

初步透過視覺化方法進行分析,達到三個主要的目的 最大化對資料的了解

找出重要的變數

發現 outliers 或異常數值

不做過度假設地從原始數據看出隱含意義

59

Page 58: [系列活動] 手把手教你R語言資料分析實務

資料分析流程

資料收集 資料清理

決策應用

60

1 2

4

資料分析特徵值萃取

建立模型

模型驗證 資料視覺化

3

Page 59: [系列活動] 手把手教你R語言資料分析實務

觀察資料與初步處理

61

Page 60: [系列活動] 手把手教你R語言資料分析實務

Summary Functions in R

Function Description 白話文

names() Functions to get or set the names of an object 看欄位名稱

head(), tail()Returns the first or last parts of a vector, matrix, table,

data frame or function 看前/(後) 幾筆資料

str() Compactly display the internal structure of an R object 物件屬性

summary() Produce result summaries 物件的基本數值狀態

dim() Retrieve or set the dimension of an object 矩陣大小

length() Get or set the length of vectors 向量長度

complete.cases()Return a logical vector indicating which cases are

complete, i.e., have no missing values 回傳各元素 NA 邏輯值

as.Date()Convert between character representations and

objects of class "Date" representing calendar dates 轉成日期型態

Function name and parameter 的縮寫解釋:http://jeromyanglim.blogspot.tw/2010/05/abbreviations-of-r-commands-explained.html

62

Page 61: [系列活動] 手把手教你R語言資料分析實務

Visualization Functions in R

Function Description 白話文

plot() Generic function for plotting of R objects 畫圖 (散布圖 or R object)

boxplot()Produce box-and-whisker plot(s) of the given

(grouped) values 盒鬚圖

hist() Computes a histogram of the given data values 分布圖

barplot()Creates a bar plot with vertical or horizontal

bars 長條圖

arrows() Draw arrows between pairs of points 加箭頭 (x0, y0, x1, y1)

abline()a, b: the intercept and slope, single values.

y = [A] + [B]x 加一條截距為a, 斜率為b的直線

lines()Join the corresponding points with line

segments. 折線圖

Function name and parameter 的縮寫解釋:http://jeromyanglim.blogspot.tw/2010/05/abbreviations-of-r-commands-explained.html

63

Page 62: [系列活動] 手把手教你R語言資料分析實務

session_B_eda.R

讀入資料與看一看變數

# load in apple daily article> d <- read.csv(“df_article.csv”, fileEncoding = “utf-8”)

# use dim() to know data frame dimension> dim(d)[1] 3779 12

# check the column names> names(d)[1] "aid" "case.closed" "date.funded" "date.published" [5] "donation" "donor" "journalist" "n.image" "n.word" [10] "title" "url.article" "url.detail"

EDA -講解 B-02

64

Page 63: [系列活動] 手把手教你R語言資料分析實務

檢視欄位

檢查每個欄位的屬性 (character, integer, date …)

> typeof(d$date.published)

> sapplay(d, typeof) # 懶惰一點, 一次看全部

將欄位轉換至適當格式> d$date.published <- as.Date(d$date.published)> d$title <- as.character(d$title)

EDA -講解 B-02

65

Page 64: [系列活動] 手把手教你R語言資料分析實務

# use str() to have a brief data summary> str(d)

利用 str() 迅速了解資料格式

EDA -講解 B-02

66

Page 65: [系列活動] 手把手教你R語言資料分析實務

用 summary() 找出 NA

EDA -講解 B-02

67

Page 66: [系列活動] 手把手教你R語言資料分析實務

缺失值 (NA) 處理

判斷重要性

填補刪除

找出缺失值 (NA)

替換

1. which() + is.na()2. !complete.case()3. summary()

1. 變數是否重要2. NA 所佔比例

1. 各別刪除2. na.omit()

1. 比例法2. 中位數3. 內差法

尋找新資料

68

Page 67: [系列活動] 手把手教你R語言資料分析實務

練習 B-02 (Later)

處理 NA值將 n.word 的 NA值補以平均數

將 n.image的 NA值補以眾數

EDA -練習 B-02

69

Page 68: [系列活動] 手把手教你R語言資料分析實務

資料視覺化

70

Page 69: [系列活動] 手把手教你R語言資料分析實務

畫圖 - 畫什麼 - 怎麼畫

透過各種圖表檢視資料中各個變項間的關係取決於你的核心問題是什麼 捐款總金額 vs. 捐款總人數

捐款的總金額 / 總人數 vs. 特定的議題 /撰寫者 / 關鍵字

適合用什麼樣的圖表達 Box plot

Scatter plot

Bar plot

Line chart

Density plot

……

71

Page 70: [系列活動] 手把手教你R語言資料分析實務

EDA 常用的視覺化方式

箱型圖 (Box-plot)

直方圖 (Histogram)

散佈圖 (Scatter-plot)折線圖 (Line-chart)

72

Page 71: [系列活動] 手把手教你R語言資料分析實務

問題

每篇文章獲得多少捐款?一個分布問題

73

Page 72: [系列活動] 手把手教你R語言資料分析實務

# use hist() to check donation distribution> hist(d$donation, breaks = 100)

hist()

EDA -講解 B-02

74

Page 73: [系列活動] 手把手教你R語言資料分析實務

EDA -講解 B-02Question : 捐款金額的整體分布長怎樣

Page 74: [系列活動] 手把手教你R語言資料分析實務

問題

捐款金額和人數的關係?兩變數間的散佈問題

76

Page 75: [系列活動] 手把手教你R語言資料分析實務

# use plot to check relationship between numbers of donors and total donation (and draw a linear line)> plot(d$donor, d$donation, pch = ‘.’, cex = 2)> y <- lm(donation ~ donor, data = d)> abline(y, col = ‘red’, lwd = 1.5)

plot()

EDA -講解 B-02

77

Page 76: [系列活動] 手把手教你R語言資料分析實務

EDA -講解 B-02Question : 單篇的捐款人數跟總金額的關係

Page 77: [系列活動] 手把手教你R語言資料分析實務

問題

不同記者寫的文章獲得的捐款金額是否相同?一個比較性的問題

79

Page 78: [系列活動] 手把手教你R語言資料分析實務

# check received donation of each journalist > n <- length(unique(d$journalist)) > b <- boxplot(d$donation ~ d$journalist, col = heat.colors(n), las = 2, ylim = c(0,2e6))> abline(h = mean(d$donation), lty = 2, cex = 2)> text(1:n, (b$stats[3,]+b$stats[4,])/2, b$n, cex = 0.8)

boxplot()

EDA -講解 B-02

80

Page 79: [系列活動] 手把手教你R語言資料分析實務

Question : 記者的文筆有差?-> 每個記者的文章得到的捐款金額分布

Page 80: [系列活動] 手把手教你R語言資料分析實務

索爾好棒棒!!

Page 81: [系列活動] 手把手教你R語言資料分析實務

問題

為什麼不同記者的捐款金額有大差異?可能是文筆特別好?

先確認其他面向捐款人數 & 捐款金額平均捐款金額

時間

83

Page 82: [系列活動] 手把手教你R語言資料分析實務

練習 B-02 (10 mins)

處理 NA值將 n.word 的 NA值補以平均數

將 n.image的 NA值補以眾數

問問題,嘗試用各種圖觀察其他面向捐款金額 / 捐款人數是否隨時間有變化?

捐款人平均捐款金額是否逐年增加?

捐款人捐給不同記者所寫的文章平均金額不同?

EDA -練習 B-02

84

Page 83: [系列活動] 手把手教你R語言資料分析實務

練習 B_ex02 (參考解答)

85

Page 84: [系列活動] 手把手教你R語言資料分析實務

捐款金額隨時間的變化

86

Page 85: [系列活動] 手把手教你R語言資料分析實務

EDA -講解 B-02Question : 越來越多台灣人有愛心?-> 單篇捐款人數隨年份的關係

Page 86: [系列活動] 手把手教你R語言資料分析實務

EDA -練習 B-02

Page 87: [系列活動] 手把手教你R語言資料分析實務

A FINDING!

平均捐款金額隨時間稍微改變

捐款人數隨時間增加

得到的捐款金額隨時間增加!!

不同記者的文章獲得的捐款金額

是否亦受時間因素影響?

EDA –講解 B-02

89

Page 88: [系列活動] 手把手教你R語言資料分析實務

EDA -練習 B-02

Page 89: [系列活動] 手把手教你R語言資料分析實務

此時間趨勢可能造成…

誤解變數的影響力或遮蔽變數的效果以為索爾很厲害,寫出了高質量文章…

但可能只是因為生逢其時?

EDA –講解 B-02

91

Page 90: [系列活動] 手把手教你R語言資料分析實務

Detrending

92

Page 91: [系列活動] 手把手教你R語言資料分析實務

時間序列資料的 Detrending

透過統計或數學的操作,移除時間上的趨勢,才能夠看清楚索爾的真正實力或許貓女比較強 ?

基本的方法線性回歸

LOWESS 局部加權散點平滑法 Locally weighted scatterplot smoothing

取一定比例的局部樣本做多項式回歸曲線

查看二維變量之間關係的有力工具

93

Page 92: [系列活動] 手把手教你R語言資料分析實務

# 用 lm() 與 lowess() 看 donation vs date.published> plot(d$published, d$donation, pch = ‘.’, cex = 2)> lines(lowess(d$published, d$donation), col = ‘red’)> abline(lm(d$published, d$donation), col = ‘blue’)

lm 與 lowess

EDA –講解 B-02

94

Page 93: [系列活動] 手把手教你R語言資料分析實務

# 利用 R 內建的 lowess() 做 detrending> l <- lowess(d$donation ~ d$date.published)> d$donation.de <- d$donation - l$y + mean(l$y)> plot(d$published, d$donation.de, pch = ‘.’, cex = 3)

利用 lowess() 做 detrending

EDA –講解 B-02

95

Page 94: [系列活動] 手把手教你R語言資料分析實務

> n <- len(unique(d$journalist))> b <- boxplot(d$donation.de ~ d$journalist, col =

heat.colors(n), las = 3, ylim = c(0, 1e6))> abline(h = mean(d$donation.de), lty = 2, cex = 2)> title(‘journalist vs. donation.de’, ylab = ‘donation.de’)> text(1:n, 0, b$n, cex = 0.8, col = ‘blue’)

重新看一次 journalist 的表現

EDA –講解 B-02

96

Page 95: [系列活動] 手把手教你R語言資料分析實務
Page 96: [系列活動] 手把手教你R語言資料分析實務

練習 B-03 (Later)

以文章發行時間對捐款人數做 detrend

EDA -練習 B-03

98

Page 97: [系列活動] 手把手教你R語言資料分析實務

有沒有更多變數可以拿來解釋”捐款”?

爬新的資料外部資料, for example 經濟指標

年度大事

從既有的資料挖出更多東西文章本身

EDA –講解 B-03

101

Page 98: [系列活動] 手把手教你R語言資料分析實務

i <- grep('夫|父|男|翁|公|爸|漢', d$title)d$ttl.male <- 0d[i, ]$ttl.male <- 1

i <- grep('妻|母|女|婆|嬤|媽|婦', d$title)d$ttl.female <- 0d[i, ]$ttl.female <- 1

i <- grep('憂', d$title)d$ttl.anxiety <- 0d[i, ]$ttl.anxiety <- 1

i <- grep('瞎|盲|失明', d$title)d$ttl.eye <- 0d[i, ]$ttl.eye <- 1

找出標題內的資訊

EDA –講解 B-03

102

Page 99: [系列活動] 手把手教你R語言資料分析實務

EDA –講解 B-03

Page 100: [系列活動] 手把手教你R語言資料分析實務

EDA –講解 B-03

Page 101: [系列活動] 手把手教你R語言資料分析實務

練習 B-03

以文章發行時間對捐款人數做 detrend

觀察資料特徵並創造新變數利用 donation & donor 創造新變數

創造2 ~3 個新的標題相關變數

創造至少 2 個時間相關變數

EDA –練習 B-03

105

Page 102: [系列活動] 手把手教你R語言資料分析實務

練習 B_ex03 (參考解答)

EDA –練習 B-03

106

Page 103: [系列活動] 手把手教你R語言資料分析實務

練習 B_ex03 (參考解答)

EDA –練習 B-03

107

Page 104: [系列活動] 手把手教你R語言資料分析實務

EDA 總結

基本函數運用

釐清問題與視覺化

資料變形 (data transformation)

時間序列的 detrending

創造新變數 (variable creation)

找到彼此之間擁有最高相關性的變數組合

並且有合理的解釋

EDA –總結

108

Page 105: [系列活動] 手把手教你R語言資料分析實務

Next session starts at 13:50

Stay Tuned…… We’ll be back soon!!

109

Page 106: [系列活動] 手把手教你R語言資料分析實務

Session C90 分鐘的文字礦工

Text Mining in 90 minutes

Page 107: [系列活動] 手把手教你R語言資料分析實務
Page 108: [系列活動] 手把手教你R語言資料分析實務

透過 Text Mining 了解文章的遣詞用字如何影響人們的捐款行為

Page 109: [系列活動] 手把手教你R語言資料分析實務

中文好難

中文需要斷詞每個英文單字 (word / term) 都用空格分開

下雨天留客,天留我不留

斷完詞,電腦還是看不懂爬蟲是什麼?可以吃嗎?

建立詞庫

瞭解詞義

113

Page 110: [系列活動] 手把手教你R語言資料分析實務

詞庫、詞義

_______ 是最炎熱的季節季節:春季、夏季、秋季、冬季

哪個比較適合?

詞與詞之間的距離同義字:溫拿人生勝利組

反義字:溫拿魯蛇

詞的特徵化 (word embeddings)

114

Page 111: [系列活動] 手把手教你R語言資料分析實務

建立詞庫

詞庫:所有看過的字詞的集合, 通常用 V表示V: vocabulary

詞庫內的詞可以用 1 x |V| 的向量表示稱為 one-hot vector可視為索引

彼此獨立,沒有詞意

利用 jiebaR斷詞和 text2vec 建立詞庫吧!

0:0:1:0:0

1 x |V|

12::k

k+1::

|V|

115

Page 112: [系列活動] 手把手教你R語言資料分析實務

db_article_txt.rar df_article_after_eda.csv

需要的材料?

資料礦工-講解 C-01

116

Page 113: [系列活動] 手把手教你R語言資料分析實務

$A2719 [1] "火燒厝 男寒夜睡破車初春乍暖還寒,55歲的單親爸爸阿水(周正水)窩在報廢廂型車裡準備就寢,雖已蓋上兩層被,還是冷得直發抖。阿水無奈地說,去年底住處鐵皮屋慘遭祝融,「現在我最擔心的,是住校讀高二兒子放假回來沒地方睡。」多年來,單親爸爸阿水靠著山區林務零工掙錢撫養17歲的獨生子小傑,去年12月中,住處鐵皮屋被無名火燒毀,家當付之一炬,並波及隔壁姪女一家,「害姪女一家4口沒地方住,很對不起他們。」阿水說:「至今重建的錢不知到哪兒去找?」蘋果基金會獲悉後,已先撥款襄助阿水父子短期生活窘迫,並聯繫幫貧困家庭修屋的寶島行善義工團協力修繕,義工團評估,兩屋重建材料費用約需70萬元。當地村長說,目前已有縣府補助款共20萬元。疑老舊電線走火望著火場殘垣灰燼,阿火說,那天傍晚,他結束工作返家,一進門,便見屋後廚房濃煙不斷竄出,急忙打電話叫消防隊,住家位於偏遠山區,過了半個多小時消防車才趕到,一切都來不及了。當地村長說,鄰居趕緊拿出自家滅火器幫忙滅火,但當天風勢強助長火舌,用掉20多個滅火器卻沒用,「火災鑑定是老舊電線走火,沒人受傷已是不幸中的大幸。」姪女家境也不好阿水33歲的姪女阿菁說,她與33歲的丈夫阿元育有6歲、4歲的子女,平時她在家帶孩子,家計由阿元打零工維持,日子只能勉強餬口。火災當時,「聽到外面有人叫『失火了』,我趕緊拉著兩個孩子往外衝。」阿菁說,目前一家暫住附近大伯家,屋子太小,只能在客廳打地舖,「我也知道二伯阿水沒錢,我們手頭也不寬裕,不知何時房子才能重建。」阿水說,他現暫時睡在報廢廂型車中,並在車外搭上帆布充當煮飯、作息空間,向鄰居借廁所大小便、洗澡。「住在車裡,就當作野外露營,前幾波寒流來時,整晚冷到睡不著,春節也只能在哥哥家裡過。」阿水17歲的兒子小傑說:「車子空間小,我短期可借住同學家,久了不好意思。」"

資料礦工-講解 C-01

117

Page 114: [系列活動] 手把手教你R語言資料分析實務

# get all article names

> files =

list.files('data/db_articles_txt/db_articles_txt/',

pattern = ‘txt', full.names = T)

> file.name = gsub('.txt', '' ,basename(files))

# read the first 100 articles

> file.len = 100

> article_txt = list()

> for(i in 1:file.len) {

a = readLines(files[i], encoding = ‘UTF-8’)

article_txt[[file.name[i]]] = paste(a, collapse =‘’)

}

# check if all are correctly read in

> fivenum(nchar(article_txt))

讀入蘋果暖流文章

資料礦工-講解 C-01

session_C_01_separate_words.R

118

Page 115: [系列活動] 手把手教你R語言資料分析實務

$A2719 [1] "火燒厝 男寒夜睡破車初春乍暖還寒,55歲的單親爸爸阿水(周正水)窩在報廢廂型車裡準備就寢,雖已蓋上兩層被,還是冷得直發抖。阿水無奈地說,去年底住處鐵皮屋慘遭祝融,「現在我最擔心的,是住校讀高二兒子放假回來沒地方睡。」多年來,單親爸爸阿水靠著山區林務零工掙錢撫養17歲的獨生子小傑,去年12月中,住處鐵皮屋被無名火燒毀,家當付之一炬,並波及隔壁姪女一家,「害姪女一家4口沒地方住,很對不起他們。」阿水說:「至今重建的錢不知到哪兒去找?」蘋果基金會獲悉後,已先撥款襄助阿水父子短期生活窘迫,並聯繫幫貧困家庭修屋的寶島行善義工團協力修繕,義工團評估,兩屋重建材料費用約需70萬元。當地村長說,目前已有縣府補助款共20萬元。疑老舊電線走火望著火場殘垣灰燼,阿火說,那天傍晚,他結束工作返家,一進門,便見屋後廚房濃煙不斷竄出,急忙打電話叫消防隊,住家位於偏遠山區,過了半個多小時消防車才趕到,一切都來不及了。當地村長說,鄰居趕緊拿出自家滅火器幫忙滅火,但當天風勢強助長火舌,用掉20多個滅火器卻沒用,「火災鑑定是老舊電線走火,沒人受傷已是不幸中的大幸。」姪女家境也不好阿水33歲的姪女阿菁說,她與33歲的丈夫阿元育有6歲、4歲的子女,平時她在家帶孩子,家計由阿元打零工維持,日子只能勉強餬口。火災當時,「聽到外面有人叫『失火了』,我趕緊拉著兩個孩子往外衝。」阿菁說,目前一家暫住附近大伯家,屋子太小,只能在客廳打地舖,「我也知道二伯阿水沒錢,我們手頭也不寬裕,不知何時房子才能重建。」阿水說,他現暫時睡在報廢廂型車中,並在車外搭上帆布充當煮飯、作息空間,向鄰居借廁所大小便、洗澡。「住在車裡,就當作野外露營,前幾波寒流來時,整晚冷到睡不著,春節也只能在哥哥家裡過。」阿水17歲的兒子小傑說:「車子空間小,我短期可借住同學家,久了不好意思。」"

[1] "火燒" "厝" "男" "寒夜" "睡" "破車" "初春" "乍暖還寒" "55" "歲" "的" "單親" "爸爸“[14] "阿水" "周正" "水" "窩" "在" "報廢" "廂型" "車裡" "準備" "就寢" "雖" "已" "蓋" [27] "上" "兩層" "被" "還是" "冷得" "直發抖" "阿水" "無奈" "地說" "去年底" "住處" "鐵皮屋" "慘遭" [40] "祝融" "現在" "我" "最" "擔心" "的" "是" "住校" "讀高二" "兒子" "放假" "回來" "沒" [53] "地方" "睡" "多" "年來" "單親" "爸爸" "阿水靠" "著" "山區" "林務" "零工" "掙錢" "撫養" [66] "17" "歲" "的" "獨生子" "小傑" "去年" "12" "月" "中" "住處" "鐵皮屋" "被" "無名" [79] "火燒" "毀" "家當" "付之一炬" "並" "波及" "隔壁" "姪" "女" "一家" "害" "姪" "女" [92] "一家" "4" "口" "沒" "地方" "住" "很" "對不起" "他們" "阿" "水" "說" "至今" [105] "重建" "的" "錢" "不知" "到" "哪兒" "去找" "蘋果" "基金會" "獲悉" "後" "已先" "撥款" [118] "襄助" "阿水" "父子" "短期" "生活" "窘迫" "並" "聯繫" "幫" "貧困家庭" "修屋" "的" "寶島" [131] "行善" "義工" "團" "協力" "修繕" "義工" "團" "評估" "兩屋" "重建" "材料" "費用" "約" [144] "需" "70" "萬元" "當地" "村長" "說" "目前" "已有" "縣府" "補助款" "共" "20" "萬元" [157] "疑老舊" "電線走火" "望著" "火場" "殘垣" "灰燼" "阿火" "說" "那天" "傍晚" "他" "結束" "工作" [170] "返家" "一" "進門" "便" "見" "屋後" "廚房" "濃煙" "不斷" "竄出" "急忙" "打電話" "叫" [183] "消防隊" "住家" "位於" "偏遠" "山區" "過了" "半個" "多" "小時" "消防車" "才" "趕到" "一切" [196] "都" "來不及" "了" "當地" "村長" "說" "鄰居" "趕緊" "拿出" "自家" "滅火器" "幫忙" "滅火"

119

Page 116: [系列活動] 手把手教你R語言資料分析實務

文章斷詞

jiebaR https://qinwenfeng.com/jiebaR/號稱最好的 Python 中文斷詞組件的 R 語言版本

支持四種斷詞引擎 最大概率法、隱式馬爾科夫模型、混和模型、索引模型

可以標註詞性

中研院斷詞系統 http://ckipsvr.iis.sinica.edu.tw/號稱地表最強中文斷詞系統 (96% 精準度)

自動標註詞性

需要申請……

120

Page 117: [系列活動] 手把手教你R語言資料分析實務

library(jiebaR)

# initiate segmentation engine

cutter = worker(bylines = T)

# traditional way

article_words = sapply(article_txt,

function(x) segment(x, cutter))

# cooler way to do segmentation

article_words = sapply(article_txt,

function(x) cutter <= x)

# check if all got segmented

print(length(article_words))

利用 jiebaR 斷詞

資料礦工-講解 C-01

session_C_01_separate_words.R

121

Page 118: [系列活動] 手把手教你R語言資料分析實務

a = article_words

library(text2vec)

# an iterator to access tokens in each article

a.token <- itoken(a)

# to create vocabulary based on the above tokens

a.vocab <- create_vocabulary(a.token,

ngram = c(1, 1))

# 詞(terms), 次數(terms count), 文章佔比(doc_counts)

head(a.vocab$vocab)

利用 text2vec 建立詞庫

資料礦工-講解 C-01

session_C_01_separate_words.R

122

Page 119: [系列活動] 手把手教你R語言資料分析實務

練習 C-01 (8 mins)

讀入 1000 篇文章並用 jiebaR斷詞 jiebaR可標註詞性 格式:夫(n)肺癌(n)末期(f)…

text2vec 建立詞庫

123

Page 120: [系列活動] 手把手教你R語言資料分析實務

教電腦從文章中解讀詞意

word2vecTomas Mikolov et.al 2013 年於 Google開發

Prediction-based method reference

Glove Jeffrey Pennington et al. 2015 年開發 (Stanford)

Count-based method reference

Dmitriy Selivanov 開發其 R套件 text2vec https://cran.r-project.org/web/packages/text2vec/index.html

124

Page 121: [系列活動] 手把手教你R語言資料分析實務

淺談 word2vec

語意相近的字較常出現在一起 Local window

讓電腦玩克漏字填空學習 word embeddingSkip-gram

Continuous bag of words

最熱的夏天 季節

Word,wt

Context words

……

Wt-1 Wt+1

125

Page 122: [系列活動] 手把手教你R語言資料分析實務

Skip-gram 模型

藉由 current word 推測 context words

Neural network model Stochastic gradient descend (SGD)

126

|V|:詞庫內所有的字詞數量d :字詞向量化的維度

1 x |V|

0.2::

0.5:

0.10

0:1::00

0.1::

0.6:

0.10

::::

|V| x dW

Cd x |V|

Cd x |V|

1 x d

wt

最熱的Wt-1

夏天

Wt+1

季節

0::1:00

0::1:00

126

Page 123: [系列活動] 手把手教你R語言資料分析實務

Continuous Bag of Words 模型

由 context words推測 current word

127

0.20.10:

0.5:0

1 x |V|

d x |V|W

C|V| x d

C|V| x d

:::::

1 x d

01:0:0000:1:00

wt

最熱的

Wt-1

夏天

Wt+1

季節

000:1:0

127

Page 124: [系列活動] 手把手教你R語言資料分析實務

詞向量

訓練結束後,將1 x |V| 字詞轉換成 d維向量的矩陣

|V| x d

W

|V| x d

1

2

:

i

:

:

|V|

1 2 … … … (d-2) (d-1) d

第 i 個詞的詞向量

128

Page 125: [系列活動] 手把手教你R語言資料分析實務

淺談 text2vec

Global corpus statistics + local window

Count-based methodTerm co-occurrence matrix, X

Xij:詞-i和詞-j 共同出現次數

最熱的夏天 季節

Word,wt

Context words

Wt-1 Wt+1

1

2

i

|V|

1 … j … k … |V|

最熱的

夏天

季節

+1

Term Co-occurrence Matrix

+1

129

Page 126: [系列活動] 手把手教你R語言資料分析實務

GloVe 模型

目標:訓練出一個詞矩陣W最能表示 term co-occurrence statistics

使用 AdaGrad, a variant of stochastic gradient descend

|V| x d

W

𝑤𝑖𝑇𝑤𝑗 + 𝑏𝑖 + 𝑏𝑗 = log𝑋𝑖𝑗1. 對於一組詞向量𝑤𝑖 和𝑤𝑗,我們希望:

3. 𝑓(𝑋𝑖𝑗)為加權函數,減少常見詞: 𝑓 𝑋𝑖𝑗 =

𝑋𝑖𝑗

𝑥𝑚𝑎𝑥

𝛼

, 𝑋𝑖𝑗 < 𝑥𝑚𝑎𝑥

1 , 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒

𝐽 =

𝑖=1

𝑉

𝑗=1

𝑉

𝑓(𝑋𝑖𝑗)(𝑤𝑖𝑇𝑤𝑗 + 𝑏𝑖 + 𝑏𝑗 − log𝑋𝑖𝑗)

22.目標函數:最小化

130

Page 127: [系列活動] 手把手教你R語言資料分析實務

計算詞之間的距離同義、反義

Cosine-similarity

計算字詞間的關係老鼠跟大米

神奇的詞向量

在你(U)身上看見部份的自己(I)

老鼠

大米

找出你我之間的關係131

Page 128: [系列活動] 手把手教你R語言資料分析實務

# an iterator to help usa.token <- itoken(a)

# vectorization of wordsa.vectorizer <- vocab_vectorizer(a.vocab, grow_dtm= FALSE, skip_grams_window = 5)

# construct term co-occurrence matrix, tcma.tcm <- create_tcm(a.token, a.vectorizer)

計算 TCM

資料礦工-講解 C-02

session_C_02_create_glove.R

132

Page 129: [系列活動] 手把手教你R語言資料分析實務

# glove fitting model

fit <- glove(a.tcm, word_vectors_size = 100, x_max

= 10, learning_rate = 0.2, num_iters = 15)

# word_vectors$w_i = word vectors

# word_vectors$w_j = context vectors

word.vec <- fit$word_vectors$w_i +

fit$word_vectors$w_j

rownames(word.vec) = rownames(a.tcm)

Encoding(rownames(word.vec)) = 'UTF-8'

向量化字詞組

資料礦工-講解 C-02

session_C_02_create_glove.R

133

Text2vec version = 0.3Check package version –

Session_info() 找到 text2vec的數字就是你安裝的版本

Page 130: [系列活動] 手把手教你R語言資料分析實務

如果你裝的是 text2vec 0.4

134

glove = GlobalVectors$new(word_vectors_size = 100, vocabulary = a.vocab, x_max = 30)

glove$fit(a.tcm, n_iter = 15)

word.vec <- glove$get_word_vectors()

rownames(word.vec) = rownames(a.tcm)

Encoding(rownames(word.vec)) = "UTF-8"

View(word.vec)

Text2vec version = 0.4

Page 131: [系列活動] 手把手教你R語言資料分析實務

練習 C-02 (15 mins)

用 text2vec 做出 2種不同的詞向量結果向量長度 word_vectors_size

字詞頻率限制 x_max

將 word vectors和 context vectors 的兩種詞向量相加,給下一個部分使用

資料礦工-練習 C-01,02

135

Page 132: [系列活動] 手把手教你R語言資料分析實務

練習 C-03 (15 mins)

寫出 get_analogy function測試 get_analogy("女兒","爸爸","媽媽")

測試 get_analogy("房子","孝順","不孝")

從頭一次!改成讀入 1500 篇文章 file.len <- 1500

source(“session_C_02_create_glove.R”)

再測試一次 get_analogy("女兒","爸爸","媽媽")

get_analogy("房子","孝順","不孝")

資料礦工-練習 C-03

session_C_03_get_analogy.R

136

<Note>Text2vec version

在 v0.3, v0.4的 code不同唷!

Page 133: [系列活動] 手把手教你R語言資料分析實務

# calculate unit vector

> word.vec.norm = sqrt(rowSums(word.vec^2))

# build the function

> get_analogy = function(king, man, woman) {

queen = word.vec[king, , drop = F] –

word.vec[man, , drop = F] +

word.vec[woman, , drop = F]

cos.dist = text2vec:::cosine(queen,

word.vec, word.vec.norm)

head(sort(cos.dist[1, ], decreasing = T,10)

}

get_analogy

資料礦工-練習 C-03

session_C_03_get_analogy.R

139

<Note>Text2vec version

在 v0.3, v0.4的 code不同唷!

Text2vec version = 0.3

Page 134: [系列活動] 手把手教你R語言資料分析實務

如果你裝的是 text2vec 0.4

140

get_analogy = function(king, man, woman) {# HINT: establish an analogy logic, vec(queen) =

vec(king) - vec(man) + woman

queen = word.vec[king, , drop = F] - word.vec[man, , drop = F] + word.vec[woman, , drop = F]

# HINT: calculte the cosine-similarity among vec(queen) and other word vectors

cos.dist = text2vec:::sim2(x = queen, y = word.vec, method = "cosine", norm = "l2")

# please show the top-10 words for this analogy taskhead(sort(cos.dist[1,], decreasing = T), 10)

}

Text2vec version = 0.4

Page 135: [系列活動] 手把手教你R語言資料分析實務

使用 100篇文章

> get_analogy('女兒', '爸爸', '媽媽')

女兒 媽媽 的 歲 了 大0.6894198 0.5624501 0.4997210 0.4710033 0.4637007 0.4396069

先生 著 為 好0.4341230 0.4339599 0.4281633 0.4276368

> get_analogy('房子','孝順','不孝')

不孝 房子 支才 精緻 離職 現況0.5783372 0.4811721 0.3316755 0.3299203 0.3294964 0.3214770

斷藥 供水 外面 靠的還0.3096872 0.3076579 0.3048728 0.3018286

141

Page 136: [系列活動] 手把手教你R語言資料分析實務

使用 1500篇文章

> get_analogy('女兒','爸爸','媽媽')

女兒 兒子 兩個 弟弟 孫子 媽媽0.9166055 0.7407315 0.7194995 0.6973939 0.6941895 0.6889858

歲 孩子 她 和0.6829127 0.6699260 0.6691248 0.6688349

> get_analogy('房子','孝順','不孝')

房子 拍 抵押 貸款 租 老家0.6921786 0.4567163 0.4464729 0.4350123 0.4319352 0.4130161

賣掉 房貸 田地 犛0.3984212 0.3918540 0.3888297 0.3665320

> get_analogy('肝癌','爸爸','媽媽')

肝癌 罹患 乳癌 末期 口腔癌 肺癌0.8684388 0.6630712 0.6099472 0.5853218 0.5523871 0.5438197

罹 那年 癌症 父親0.5383895 0.5241434 0.5236973 0.5022830

142

Page 137: [系列活動] 手把手教你R語言資料分析實務

在字詞向量化後相似的字詞之間距離較相近

將相似的詞做分群 (Clustering)

資料礦工-練習 C-04

Page 138: [系列活動] 手把手教你R語言資料分析實務

k-means clustering 資料分類

資料礦工-練習 C-04

146

Page 139: [系列活動] 手把手教你R語言資料分析實務

k-means clustering 步驟

隨機選取 k個中心點 (cluster center)

計算所有點與中心點的距離

歸類到最近的中心

重新計算 k 個群的中心點,做為新的群中心點

重複上面三步驟,直到群中心點收斂(不改變)

資料礦工-練習 C-04

147

Page 140: [系列活動] 手把手教你R語言資料分析實務

Source: http://simplystatistics.orgwp-content/uploads/2014/02/kmeans.gif

資料礦工-練習 C-04

Page 141: [系列活動] 手把手教你R語言資料分析實務

Source: http://simplystatistics.orgwp-content/uploads/2014/02/kmeans.gif

資料礦工-練習 C-04

Page 142: [系列活動] 手把手教你R語言資料分析實務

k = 200

donor.de vs k133 (死亡用詞), cor = 0.203

donor.de vs k180 (食物用詞), cor = 0.1008

> w[w$k == 133,]$V1 [1] "走(Vi)" "病逝(Vi)" "逝(Vi)" "留下(Vt)" "死(Vi)" "去世(Vi)" "生前(N)" "喪葬(N)" "喪葬費(N)" "往生(Vi)" [11] "猝(ADV)" "交代(Vt)" "後事(N)" "留(Vt)" "驟(ADV)" "心肌(N)" "梗塞(Vi)" "來不及(ADV)" "身亡(Vi)" "悲傷(Vi)" [21] "喪夫(Vi)" "喪事(N)" "遺照(N)" "送走(Vt)" "突然(Vi)" "出殯(Vi)" "辦妥(Vt)" "靈堂(N)" "猝死(Vi)" "喪子(Vi)" [31] "程(N)" "國民(N)" "不敵(Vt)" "白髮人(N)" "黑髮人(N)" "臨終(Vi)" "病故(Vi)" "含淚(Vi)" "溺斃(Vi)" "辦好(Vt)" [41] "撒手(Vi)" "遺體(N)" "辭世(Vi)" "老幼(N)" "人世(N)" "辦完(Vt)" "斷氣(Vi)" "殯儀館(N)" "冰櫃(N)" "悲慟(Vi)" [51] "桂圓(N)" "奠儀(N)" "睡夢(N)" "繼(P)" "葬儀社(N)" "離世(Vi)" "紙錢(N)" "再見(Vi)" "黑髮(N)" "平復(Vt)" [61] "小晟(N)" "喪禮(N)" "林美琴(N)" "遺言(N)" "棺木(N)" "葬(Vt)" "積勞成疾(Vi)" "遽逝(Vi)" "享年(Vt)" "陳芷涵(N)" [71] "孤(Vi)" "安葬(Vt)" "永隔(N)" "杜氏(N)" "火化(Vt)" "薛(N)" "葉榮進(N)" "含悲(Vi)" "悲痛(Vi)" "遺書(N)" [81] "處理完(Vt)" "周麗珠(N)" "江鎧安(N)" "莫惠萍(N)" "自焚(Vi)" "莊台(N)" "阿治(N)" "李瑪美(N)" "忠正(N)" "悲(Vi)"

> w[w$k == 180,]$V1 [1] "吃(Vt)" "餐(M)" "飯(N)" "晚餐(N)" "煮(Vt)" "便當(N)" "青菜(N)" "餓(Vi)" "省錢(Vi)" "配(Vt)" [11] "罐頭(N)" "飯菜(N)" "泡麵(N)" "早餐(N)" "稀飯(N)" "炒(Vt)" "熱(Vt)" "白飯(N)" "麵(N)" "肉(N)" [21] "餓肚子(Vi)" "飽(Vi)" "包(M)" "鍋(M)" "碗(M)" "拌(Vt)" "果腹(Vi)" "粥(N)" "碗(N)" "吃飽(Vi)" [31] "瓶(M)" "頓(M)" "好吃(Vi)" "吃完(Vt)" "一口(ADV)" "蛋(N)" "醬油(N)" "麵包(N)" "湯(N)" "加菜(Vi)" [41] "餐桌(N)" "道(M)" "鍋(N)" "樣(M)" "麵線(N)" "煎(Vt)" "剩菜(N)" "饅頭(N)" "弄(Vt)" "麵條(N)" [51] "開水(N)" "澆(Vt)" "鹹(Vi)" "填飽(Vt)" "煮好(Vt)" "鹽(N)" "肉鬆(N)" "炒飯(N)" "盤(M)" "蛋炒飯(N)" [61] "加熱(Vi)" "荷包蛋(N)" "苦瓜(N)" "吃到(Vt)" "水餃(N)" "營養(Vi)" "滷肉(N)" "豆漿(N)" "菜色(N)" "年夜飯(N)" [71] "放進(Vt)" "自助餐(N)" "省下來(Vi)" "扒(Vt)" "舀(Vt)" "吃剩(Vi)" "醬瓜(N)" "餓死(Vt)" "打發(Vt)" "蒸(Vt)" [81] "充飢(Vi)" "燙(Vt)" "滷(Vt)" "菜肉(N)" "匙(M)" "攪拌(Vt)" "絲瓜(N)" "會兒(N)" "豆腐(N)" "配上(Vt)" [91] "罐(N)" "飯桌(N)" "包子(N)" "白開水(N)" "津津有味(Vi)" "食量(N)" "吐司(N)" "熱騰騰(Vi)" "醬菜(N)" "用餐(Nv)" [101] "填(Vt)" "湯汁(N)" "配飯(N)" "吃光(Vt)" "大鍋(N)" "菜葉(N)" "湯麵(N)" "午飯(N)" "食欲(N)" "菜湯(N)"

資料礦工-練習 C-04

155

Page 143: [系列活動] 手把手教你R語言資料分析實務

Text mining in R 總結

jiebaR文章斷詞

text2vec 建立詞庫、TCM與 GloVe字詞向量化

類比函數 get_analogy

運用 k-means clustering 將字詞向量分群

資料礦工-練習 C-04

160

Page 144: [系列活動] 手把手教你R語言資料分析實務

Next session starts at 15:50

Stay Tuned…… We’ll be back soon!!

161

Page 145: [系列活動] 手把手教你R語言資料分析實務

Session D建立模型 & 預測Model Building & Prediction

Page 146: [系列活動] 手把手教你R語言資料分析實務

模型要幹嘛, 能吃嗎?

163

Page 147: [系列活動] 手把手教你R語言資料分析實務

建立模型

目標 :

找到一個方法 f(x)來盡可能地解釋/預測我們有興趣的東西 y

164

y ≈ f( )

Page 148: [系列活動] 手把手教你R語言資料分析實務

建立模型

以文本資料建立模型 –預測文章是哪位記者寫的

以所有資訊建立模型 –預測每篇的捐款金額 / 捐款人數

165

Page 149: [系列活動] 手把手教你R語言資料分析實務

驗證模型

Continuous Variable

Pearson correlation coefficient =𝑐𝑜𝑣(𝑋,𝑌)

𝜎𝑥𝜎𝑦

Coefficient of determination (R2) = 1 −𝑆𝑆𝑟𝑒𝑔

𝑆𝑆𝑡𝑜𝑡

RMSE (Root mean square error) = 𝑡=1

𝑛 ( 𝑦𝑡−𝑦𝑡)

𝑛

Categorical Variable

Accuracy = 𝑇𝑃+ 𝑇𝑁

𝑃+𝑁

F1-score = 2 ⋅𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛∙𝑟𝑒𝑐𝑎𝑙𝑙

𝑝𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛+𝑟𝑒𝑐𝑎𝑙𝑙=

2𝑇𝑃

2𝑇𝑃+𝐹𝑃+𝐹𝑁

SStot

SSreg

166

預測值

1 0

實際值1 TP FN

0 FP TN

Page 150: [系列活動] 手把手教你R語言資料分析實務

以文本資料建立模型

167

Page 151: [系列活動] 手把手教你R語言資料分析實務

核心問題

我們有文章的資訊,機器是否可以判讀出這篇文章是哪一位 Hero記者寫的呢?

168

Page 152: [系列活動] 手把手教你R語言資料分析實務

詞向量

計算文章向量

上一堂課我們計算了每個文詞的詞向量,並且利用向量來看各個文詞之間的關係。

文章內的每個詞向量加總起來,可以用來代表每篇文章的屬性。

文章

169

Page 153: [系列活動] 手把手教你R語言資料分析實務

計算文章向量 (cont’d)

詞向量

文章

170

Page 154: [系列活動] 手把手教你R語言資料分析實務

資料欄位

# read in the dataload('data/w2v_name_clustering(k=200).Rdata')

# subset the column by namesch <- which(sapply(d, is.factor)) ttl<- names(d)[grep("^ttl", colnames(d))]fb <- names(d)[grep("fb", colnames(d))]kg <- names(d)[grep('^g', names(d))]time <- names(d)[grep('day|month', names(d))]yns <- names(d)[grep('^don', names(d))]rest <- names(d)[!names(d)%in%c(ttl, fb, k, kg, yns, time)]

預測模型 -講解 D-01

171

Page 155: [系列活動] 手把手教你R語言資料分析實務

預測文章是哪位記者寫的

172

Page 156: [系列活動] 手把手教你R語言資料分析實務

決策樹的簡單版概念

在空間中找到一些線(rule)讓這些點可以被分開

173

Page 157: [系列活動] 手把手教你R語言資料分析實務

Decision Tree

set.seed(904) # Control random samplesample_index <- sample(1:nrow(data), nrow(data) * 0.95)dta_trn <- data[sample_index, ]dta_tst <- data[-sample_index, ]dt.fit <- rpart(form, data=dta_trn)printcp(dt.fit)plot(dt.fit, uniform=T)text(dt.fit, use.n=T, cex=0.75)pred <- predict(dt.fit, newdata = dta_tst)

預測模型 –講解 D-01

174

Page 158: [系列活動] 手把手教你R語言資料分析實務
Page 159: [系列活動] 手把手教你R語言資料分析實務

練習 D-01 (15 mins)

決策樹練習

改變 training /testing set 的比例

嘗試丟新的文章進去預測該篇文章的記者是誰,並計算正確率

預測模型 –練習 D-01

session_D_ex01.R

176

Page 160: [系列活動] 手把手教你R語言資料分析實務

捐款金額 / 捐款人數受到哪些因素影響 ?

核心問題

177

y ≈ f( )

Page 161: [系列活動] 手把手教你R語言資料分析實務

線性模型

178

Page 162: [系列活動] 手把手教你R語言資料分析實務

線性迴歸模型

179

Page 163: [系列活動] 手把手教你R語言資料分析實務

線性迴歸模型 (Multiple regression model)

目標:在空間中找到一條線, 讓誤差項總和最小化

Model evaluation:1. R-square (解釋量)

= SSreg/SStot

2.n

SSEn

1

2

RMSE

180

Page 164: [系列活動] 手把手教你R語言資料分析實務

手上有哪些材料?

原始資料:每篇文章的時間、捐款金額、捐款人數

標題、內文、字數、圖片、撰文者

萃取資訊數字轉化 mean, med, log……

文本 標題是否含有男女、單親、小孩、癌症、死亡……

文章內文的用字、結構、語意 (詞向量)

預測模型 -講解 D-02

181

Page 165: [系列活動] 手把手教你R語言資料分析實務

資料欄位

選定應變數 (Response variables, or Y)donor.de (or detrended donation, donation.mean, etc.)

選定自變數 (Features, or Xs) 文章的meta info 時間、文章標題資料

文章的詞向量 GloVe

Word2vec

文章的分群詞比例 (n 群) “k-ratio”

預測模型 -講解 D-02

182

Page 166: [系列活動] 手把手教你R語言資料分析實務

篩選資料

變數間相關性Mutual-correlation check

共線性診斷變異數膨脹因素 VIF (Variance Inflation Factor)

預測模型 -講解 D-02

183

Page 167: [系列活動] 手把手教你R語言資料分析實務

篩選資料 (cont’d)

# pseudo code# feature-feature correlationdata <- cor(data, use=“complete”)

# variance inflation fractionsource(“func/vif.R”)vif(data, th=10)

預測模型 -講解 D-02

184

Page 168: [系列活動] 手把手教你R語言資料分析實務

線性迴歸模型

# pseudo codelm.fit <- lm(y ~ x1 + x2 + x3……, data=data)

預測模型 -講解 D-02

185

Page 169: [系列活動] 手把手教你R語言資料分析實務

練習 D-02 (8 mins)

資料修整請讀取 “w2v_name_clustering(k=200).Rdata”

去除 outliers (保留約 95%資料)

取近一年資料 從 2015-01-01 到 2016-06-03

設定 Response Variable 捐款人數 donor.de

檢查mutual correlation和 VIF

練習檢查lm結果

預測模型 –練習 D-02

session_D_ex02.R

186

Page 170: [系列活動] 手把手教你R語言資料分析實務

好多變項啊! 到底要挑哪些?

Step Function# pseudo codelm.select <- step(lm.fit)

預測模型 -講解 D-02

187

Page 171: [系列活動] 手把手教你R語言資料分析實務

好多變項啊! 到底要挑哪些? (Cont.)

1. 比較 Adjusted R2

2. 簡單的用 ANOVA 做模型比較 (看是否有差)

個人 Conclusion –選 Adjusted R2 高的

188

Page 172: [系列活動] 手把手教你R語言資料分析實務

支持向量機 (support vector machine)

目標:在空間中找到一條向量, 把海劈開 ,讓兩群樣本分開

Picture from themetapicture.com 189

Page 173: [系列活動] 手把手教你R語言資料分析實務

支持向量機 (pkg e1071)

# pseudo codesvm.fit <- svm(y ~ x1 + x2 + x3……, data=data)

預測模型 -講解 D-03

190

Page 174: [系列活動] 手把手教你R語言資料分析實務
Page 175: [系列活動] 手把手教你R語言資料分析實務

Cross Validation

# leave-One-Outi <- 1testing <- d1[i, c(yn, x.ttl, x.fb, x.t, x.k, x.g)]training <- d1[-i, c(yn, x.ttl, x.fb, x.t, x.k, x.g)]svm.fit <- svm(form, data = training)p <- predict(fit, testing)c(testing[, yn], p)

預測模型 -講解 D-03

192

Page 176: [系列活動] 手把手教你R語言資料分析實務

練習 D-03 (8 mins)

請以 leave-one-out 的方式做 SVM 的 cross validation計算 Pearson Correlation Coefficient

計算 Coefficient Determination (R-squared)

畫圖

預測模型 –練習 D-03

session_D_ex03.R

193

Page 177: [系列活動] 手把手教你R語言資料分析實務

練習 D-03 (進階)

Bonus: 更換 SVM kernel 看結果有何不同。

預測模型 –練習 D-03

session_D_ex03_bonus.R

194

Page 178: [系列活動] 手把手教你R語言資料分析實務

練習 D-03 (解答)

請以 leave-one-out 的方式做 SVM 的 cross validation。計算 Pearson Correlation Coefficient

計算 Coefficient Determination (R-squared)

畫圖

預測模型 –練習 D-03

195

Page 179: [系列活動] 手把手教你R語言資料分析實務
Page 180: [系列活動] 手把手教你R語言資料分析實務

Classification

將資料切為前 50% 與後 50% 兩類,做 SVM 的classification。

預測模型 -講解 D-04

197

Page 181: [系列活動] 手把手教你R語言資料分析實務

Diagnostic Testing

預測值

1 0

實際值1 TP FN

0 FP TN

Accuracy = 𝑇𝑃+ 𝑇𝑁

𝑃+𝑁

F1-score = 2𝑇𝑃

2𝑇𝑃+𝐹𝑃+𝐹𝑁預測值

1 0

實際值1 TP FN

0 FP TN

Selected

Relevant

False Negatives True Negatives

False Positives

TruePositives

Precision Recall

198

Page 182: [系列活動] 手把手教你R語言資料分析實務

Classification (cont’d)

# pseudo code# cut data in halfy <- ifelse(y > median(y), "high", "low")

# 做SVM並以leave-one-out檢查# accuracyacc <- mean(p$actual==p$predict)

# f1-scorefsc <- 2*TP / (2*TP+FP+FN)

預測模型 -講解 D-04

199

Page 183: [系列活動] 手把手教你R語言資料分析實務

練習 D-04 (5 mins)

將資料切為前 25% 與最後 25% 兩類,做 SVM 的 classification 後,計算 accuracy 與 F1-score。

預測模型 –練習 D-04

200

Page 184: [系列活動] 手把手教你R語言資料分析實務

練習 D-04 (解答)

將資料切為前 25% 與最後 25% 兩類,做 SVM 的 classification 後,計算 accuracy 與 F1-score。

# 切 upper / lower classesquantile(d1[, yn], c(0.25, 0.75))[c("25%", "75%")]

預測模型 –練習 D-04

session_D_ex04.R

201

Page 185: [系列活動] 手把手教你R語言資料分析實務

練習 D-05 (Homework)

請練習找出最好的method 與 features 做預測模型,提昇準確率,並做 cross validation。

預測模型 –練習 D-05

202

Page 186: [系列活動] 手把手教你R語言資料分析實務

練習 D-05 (參考解答)

gratio kratio

glv a2v

203

Page 187: [系列活動] 手把手教你R語言資料分析實務

今天學到了什麼?

204

Page 188: [系列活動] 手把手教你R語言資料分析實務

資料分析流程

資料收集 資料清理

決策應用

205

1 2

4

資料分析特徵值萃取

建立模型

模型驗證 資料視覺化

3

Page 189: [系列活動] 手把手教你R語言資料分析實務

Hard work pays off.

THANK YOU ALL!!

206