2019年1月30日 星期三

《數據分析的力量:Google、Uber都在用的因果關係思考法》-言簡意賅的資料分析入門書


  學習資料科學領域的技能至此,從網站擷取,到使用NumPyPandas整理數據資料,再到使用Matplotlib進行繪圖,這些程式技術的使用,主要是協助我們將以往繁雜且難以處理的工作轉化,透過容易上手處理與方便自動化的程式介面,讓我們能夠又快、又準確、又方便地轉換各式數據資料,但是我們也應該會發現,如何蒐集、使用與判斷這些數據資料,往往才是資料科學能否發揮價值的關鍵。

  這本由伊藤公一朗著作,王美娟翻譯的《數據分析的力量:GoogleUber都在用的因果關係思考法》確切點到了問題的核心,書中開宗明義地指出:大數據或小數據與否,不會是數據分析成敗的關鍵,真正的關鍵應該是「洞悉資料因果關係的能力」。

  數據分析能力的要求,也是資料分析師與資料工程師在能力上的最大不同之處,表一取自《大數據分析Excel Power BI全方位應用》,可以發現資料科學相關職位與職能的異同;此外,綜合國內求職市場與資料科學職缺的狀況而言,文法商科系畢業的學生,若欲投入資料科學領域,幾乎只能從事資料分析工作,畢竟從事資料工程工作除了需要扎實的學識能力(如資料結構、線性代數等),與人工智慧技術不易在短時間內學習使用也有很大的關係。

表一、資料分析職缺與工作職掌(參考來源:1041111人力銀行)
職缺名稱
具備條件(工作範疇)
資料科學家
(Data Scientist)
1. 電腦科學(Hadoop/ Mahout/ 大量資料處理-平行技術)
2. 結構化資料和非結構化資料蒐集與處理技術
3. 統計分析、資料採礦應用和軟體操作(例如:SASSPSSR
4. 資料視覺化策略分析:原始資料àAPIà處理àDashboard/ Mapà傳達à提出商業洞見à執行
大數據分析師
(Big Data Analyst)
1. Data MiningWeb MiningText Mining能力
2. 提出企業有效營運策略
3. 統計和資料採礦軟體操作(例如:SASSPSSR)和資料傳達可視化能力
資料採礦分析師
(Data Mining Analyst/ Data Minor)
1. 查詢資料能力(T-SQL/ PL-SQL)與關聯式資料庫架構
2. 統計/資料採礦軟體操作能力(例如:SAS/ SPSS/ R)和建置模型
3. Data Insight能力(例如:行為分析)和提供營運策略
資料探勘工程師
(Data Mining Engineer)
1. 程式語言能力(例如:JavaRSQL...
2. 開發設計資料採礦演算法(例如:機器學習、類神經網路、網路爬蟲)
3. ETL/ Reporting開發設計能力、資料探勘模型建置與維護
數據/資料分析師
(Data Analyst)
1. 查詢資料能力(T-SQL/ PL-SQL
2. 使用資料採礦軟體經驗(例如:SASSPSSR)和Data Insight能力(例如:行為分析)
CRM分析/顧客經營/客群經營人員
1. Data/ Customer Insight能力(例如:行為分析)和客群經營規劃
營運分析/經營分析
1. 資料撈取、例行報表製作和分析營運數據(例如:商品銷售狀況/業績表現)

  數據分析絕對不是把數據攤在面前,開會討論一下或自己在腦袋思考一下的任務,而是講求數學邏輯、假設推理,龐大且複雜的統計任務。《數據分析的力量》作者伊藤公一朗為計量經濟學領域的教授專家,撰寫本書時訴求不使用數學表達式,以直覺的語言說明商業或公共政策最常碰到的問題模式,以及如何使用因果關係思考法進行嚴謹的分析推論,非常值得一讀。

因果關係思考法
l   難以證明因果關係的原因:
1.
有可能是其他因素造成影響
2.
有可能為反向因果關係
l   因果關係不同於相關關係:
無論是商業現場還是制定政策的過程,決定事物的關鍵大多是因果關係,而非相關關係。
l   因果關係思考法:
1.
使用隨機對照試驗(Randomized Controlled Trail, RCT),或稱為A/B測試
2.
如果不能使用RCT,改使用自然實驗(Natural Experiment)
 (1). RD設計(Regression Discontinuity Design),適用於界線上的變化
 (2). 堆集分析(Bunching Analysis),適用於階梯狀的變化
 (3). 縱橫資料分析(Panel Data Method),適用於數個期間的資料

隨機對照試驗(RCT)
l   RCT的概念:
1.
因果關係可用介入效果(Treatment Effect)定義
2. Yt
是有X的介入,Yc是沒有X的介入,介入效果=Yt-Yc
3.
就是介入組(Treatment Group)與比較組(Control Group)之概念
l   RCT的假設:
如果沒有X的介入,介入組的結果Yt與比較組的結果Yc就會相同。
l   RCT的鐵則:
1.
妥善建立群組
2.
一定要隨機分組
3.
各組的樣本數必須充足
l   RCT的優點與弱點:
優點1. 可用科學證明因果關係
優點2. 分析手法與結果具透明性
弱點1. 進行實驗時需要成本、勞力、時間、各組織的合作

善加利用「界線上變化」的RD設計
圖一、RD設計
l   RD設計的概念:
1. RD
設計是在界線附近製造近似RCT的狀況。
l   RD設計的假設:
如果介入因素X未在界線上變動,Y就不會在界線上發生跳躍。
l   RD設計的鐵則:
1.
找出在界線上,僅介入因素X發生不連續變化的狀況
2.
檢查介入因素X以外的因素,有無在界線附近發生不連續的變化
l   RD設計的優點與弱點:
優點1. 假設若成立,即可利用界線附近類似RCT的狀況
優點2. 分析具透明性,可用圖表進行視覺化說明
優點3. 社會上隨處可見能夠運用RD設計的狀況
弱點1. RD設計需要的假設,無法證明成立
弱點2. 只能針對界線附近的資料主張因果關係

善加利用「階梯狀變化」的堆集分析
圖二、堆集分析
l   堆集分析的概念:
1. RD
設計做為對象的主體無法操縱圖中橫軸的變數
2.
推集分析做為對象的主體能夠操縱圖中橫軸的變數
l   堆集分析的假設:
如果介入因素X並未呈階梯狀變化,Y的分布就會平滑,不會堆集。
l   堆集分析的鐵則:
1.
評估某個呈階梯狀變化的誘因能否用於分析
2.
其它因素不會在級距的分界點附近發生不連續的變化
3.
分析誘因大幅變化的分界點上發生的堆集
l   堆集分析的優點與弱點:
優點1. 假設若成立,即可利用界線附近類似RCT的狀況
優點2. 分析具透明性,可用圖表進行視覺化說明
優點3. 社會上隨處可見能夠運用堆集分析的狀況
弱點1. 堆集分析需要的假設,無法證明成立
弱點2. 只能分析對呈階梯狀變化的誘因產生反應的主體

善加利用「數個期間資料」的縱橫資料分析
圖三、縱橫資料分析
l   縱橫資料分析的概念:
1.
縱橫資料是指針對數個群組蒐集的數個期間之資料
2.
介入效果=(介入後介入組與比較組的差異Yt1-Yc1)-(介入前介入組與比較組的差異Yt0-Yc0)
l   縱橫資料分析的假設:
如果沒發生介入,介入組的平均結果(Yt)和比較組的平均結果(Yc)就會平行推移,為平行趨勢假設(Rarallel Trend Assumption)
l   縱橫資料分析的鐵則:
1.
先確定能否取得介入發生前後,介入組和比較組雙方的資料
2.
檢驗平行趨勢假設是否成立
3.
若假設可能成立,製成圖表,測定介入效果的平均數
l   縱橫資料分析的優點與弱點:
優點1. 只要假設成立,就能應用於任何狀況,就算介入組和比較組存在事前的差異也不成問題
優點2. 分析具透明性,可用圖表進行視覺化說明
優點3. 可針對隸屬介入組的所有主體分析介入效果
弱點1. 縱橫資料分析需要的假設,無法證明成立
弱點2. 平行趨勢假設十分不易成立

數據分析的不完全性與極限
l   應用數據分析的成功關鍵:
1.
與資料分析專家建立合作關係
2.
開放資料
l   數據分析的不完全性與極限:
1.
假如資料本身有問題,分析手法再出色也難以解決問題
2.
分析結果的外在效度(External Validity)問題
外在效度:外在效度的高低是隨資料的取得範圍而定
3.
出版偏誤(Publication Bias)與夥伴關係偏誤問題
出版偏誤:檢驗因果關係,分析之後若發現影響為零,就不出版論文了
夥伴關係偏誤:優先選擇有可能合作的夥伴進行RCT之類的分析
4.
介入存在外溢效果(Spillover Effect)問題
外溢效果:對介入組實施介入,影響到比較組
5.
存在一般均衡效果時,小規模實驗結果可能與大規模政策結果不同
一般均衡效果:介入可能影響到預料之外的因素

附錄-自然實驗示意圖繪圖程式碼
l   RD設計:
import numpy as np
import matplotlib.pyplot as plt

aX = np.linspace(5, 6, 20)
aY = np.sin(aX)
plt.plot(aX, aY, color = "lightgreen")

aDots = aY + (np.random.rand(20) - 0.5) / 5
plt.plot(aX, aDots, "o", color = "darkgreen")

plt.axvline(6, alpha = 0.25, color = "red", linestyle = "--")

bX = np.linspace(6, 7, 20)
bY = np.sin(bX) + 0.5
plt.plot(bX, bY, color = "lightgreen")

bDots = bY + (np.random.rand(20) - 0.5) / 5
plt.plot(bX, bDots, "o", color = "darkgreen")

plt.show()
l   堆集分析:
import random
import numpy as np
import matplotlib.pyplot as plt

data = []
for num in range(1000):
    randNum = int(random.random() * 10)
    for i in range(randNum):
        data.append(num)
    if num % 100 <= 95:
        for i in range(randNum):
            data.append(num)
    if num % 100 <= 85:
        for i in range(randNum):
            data.append(num)
    if num % 100 <= 5:
        for i in range(randNum * 5):
            data.append(num)

x = np.array(data)
bins = np.linspace(0, 1000, 101)
plt.hist(x, bins = bins, density = True)

for line in range(0, 1001, 100):
    plt.axvline(line, alpha = 0.25, color = "red", linestyle = "--")

ax = plt.axes()
ax.xaxis.set_major_locator(plt.MaxNLocator(11))

plt.show()

l   縱橫資料分析:
import numpy as np
import matplotlib.pyplot as plt

aX = np.linspace(5, 7, 40)
aY = np.sin(aX)
plt.plot(aX, aY, color = "lightgreen")

aDots = aY + (np.random.rand(40) - 0.5) / 5
plt.plot(aX, aDots, "o", color = "darkgreen")

plt.axvline(6, alpha = 0.25, color = "red", linestyle = "--")

bX = np.linspace(5, 6, 20)
bY = np.sin(bX) + 0.5
plt.plot(bX, bY, color = "lightblue")

cX = np.linspace(6, 7, 20)
cY = np.sin(cX) + 0.5 + np.linspace(0.25, 1, 20)
plt.plot(cX, cY, color = "lightblue")

bDots = bY + (np.random.rand(20) - 0.5) / 5
plt.plot(bX, bDots, "o", color = "darkblue")

cDots = cY + (np.random.rand(20) - 0.5) / 5
plt.plot(cX, cDots, "o", color = "darkblue")

ax = plt.axes()
ax.xaxis.set_major_formatter(plt.NullFormatter())
ax.set_xticklabels(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct"])

plt.show()

沒有留言:

張貼留言