相關不是因果,哪又是啥?

来源:https://www.cnblogs.com/xuruilong100/archive/2019/02/25/10434564.html
-Advertisement-
Play Games

[TOC] 近期廣泛閱讀券商關於 巨集觀高頻數據 的研報,發現了兩點不足: 就研究手段而言,比較粗放,普遍停留在僅僅比較數據相關係數的層面; 就理論高度而言,很少探討數據背後的因果關聯。 不過有些理念先進的券商團隊已經開始從 產業鏈傳導 的角度試圖細緻的描述數據間的關聯,這正好契合了下麵這篇文章的核心 ...


目錄

近期廣泛閱讀券商關於巨集觀高頻數據的研報,發現了兩點不足:

  • 就研究手段而言,比較粗放,普遍停留在僅僅比較數據相關係數的層面;
  • 就理論高度而言,很少探討數據背後的因果關聯。

不過有些理念先進的券商團隊已經開始從產業鏈傳導的角度試圖細緻的描述數據間的關聯,這正好契合了下麵這篇文章的核心概念——有向無環圖(DAG)。

相關不是因果,哪又是啥?

本文翻譯自《"Correlation is not causation". So what is?》

鏈接:https://iyarlin.github.io/2019/02/08/correlation-is-not-causation-so-what-is/

導論

在過去幾年中,機器學習應用的數量和範圍都在迅速增長。什麼是因果推斷,它與傳統的 ML 有什麼不同?什麼時候應該考慮使用它?在本報告中,我嘗試通過一個例子給出一個簡短而具體的答案。

一個典型的數據科學課題

想象一下,營銷團隊的任務是找到提高營銷支出對銷售的影響。我們擁有營銷支出(mkt)、網站訪問(visits)、銷售(sales)和競爭指數(comp)的記錄。

我們將使用一組方程(也稱為結構方程)來模擬數據集:

\[ sales = \beta_1vists + \beta_2comp + \epsilon_1 \\ vists = \beta_3mkt + \epsilon_2\\ mkt = \beta_4comp + \epsilon_3\\ comp = \epsilon_4 \]

其中 \(\{\beta_1, \beta_2, \beta_3\, \beta_4\} = \{0.3, -0.9, 0.5, 0.6\}\).

下麵圖片中展示以及擬合模型用到的所有數據均由上面的等式模擬得到。

以下是數據集的前幾行:

mkt visits sales comp
282.5 2977 379 3.635
338.8 3149 308 4.515
303.9 2485 369 3.092
558.8 3117 191 5.22
334.4 4038 286 4.281
297.7 2854 441 3.592

我們的目標是,得到預測營銷支出對銷售額的影響是 0.15 的結論(根據上面的方程組,對分項目做乘積,我們得到 \(\beta_1 \cdot \beta_3 = 0.3 \cdot 0.5 = 0.15\))。

常規分析方法

方法一:畫出雙變數關係

我們通常從畫出 sales 和 mkt 之間的散點圖開始:

我們可以看到圖中看到的關係實際上與我們預期的相反!看起來增加營銷實際上會降低銷售額。實際上,不僅相關性不是因果關係,有時它可能表現出與真實因果關係相反的關係。

擬合一個簡單的線性模型 \(sales = r_0 + r_1mkt + \epsilon\) 將會產生下麵的繫數:(註意,\(r\) 泛指回歸繫數,而 \(\beta\) 泛指結構方程中真實的參數)

(Intercept) mkt
513.5 -0.3976

確認我們得到的效果與我們想要的效果截然不同(0.15)。

方法二:對所有可用特征使用 ML 模型

有人可能會假設,查看雙變數關係相當於僅使用 1 個預測變數,但如果我們要使用所有可用的特征,我們可能能夠找到更準確的估計。

運行回歸模型 \(sales = r_0 + r_1mkt + r_2visits + r_3comp + \epsilon\),得到下麵的繫數:

(Intercept) mkt visits comp
596.7 0.009642 0.02849 -90.06

現在看來營銷支出幾乎沒有任何影響!我們從線性方程模擬數據,並且我們知道即使使用更複雜的模型(例如 XGBoost、GAM)也無法產生更好的結果(我建議有疑慮的讀者通過重新運行 Rmd 腳本來嘗試一下生成報告)。

也許我們應該考慮下特征之間的關聯...

到目前為止我們獲得的結果相當令人困惑,我們進而咨詢營銷團隊,我們瞭解到,在競爭激烈的市場中,團隊通常會增加營銷支出(這反映在繫數 \(\beta_4 = 0.6\) 以上)。因此,競爭可能是一個“混雜”因數:當我們觀察到高營銷支出時,競爭也會很激烈,從而導致銷售額下降。

此外,我們註意到營銷可能會影響網站的訪問,而這些訪問又會影響銷售。

我們可以使用有向無環圖(DAG)可視化這些特征的相互依賴性:

因此,通過將混雜競爭加到我們的回歸是有意義的。而在我們的模型中添加訪問可能會“屏蔽”或“消解”營銷對銷售的影響,所以我們應該從我們的模型中省略它。

運行回歸模型 \(sales = r_0 + r_1mkt + r_2comp + \epsilon\),得到下麵的繫數:

(Intercept) mkt comp
654.8 0.1494 -89.8

現在我們終於得到了正確的效果估計!

我們解決問題的方式有點不穩健。我們提出了諸如特征的“混雜”和“屏蔽”等一般概念。試圖將這些應用於由數十個具有複雜關係的變數組成的數據集可能會非常困難。

所以現在做什麼?因果推斷!

到目前為止,我們已經看到,試圖通過檢查雙變數圖來估計營銷支出對銷售的影響可能會失敗。我們還看到,將所有可用特征拋入我們的標準 ML 模型也會失敗。看起來我們需要仔細構建模型中包含的協變數集,以獲得真實的效果。

在因果推斷中,該協變數集合也稱為“調整集”。給定模型的 DAG,我們可以利用各種演算法,這些演算法非常類似於上面提到的規則,例如“混雜”和“屏蔽”,以找到正確的調整集。

Backdoor Criteria 演算法

可以獲得正確調整集的最基本演算法之一是由 J. Pearl 開發的“Backdoor-criteria”。簡而言之,它尋求調整集,屏蔽“暴露”變數(例如營銷)和“結果”變數(例如銷售)之間的每一個“虛假”路徑,同時保持影響路徑存在。

考慮下麵的 DAG,我們試圖找到 x5x10 的影響:

使用 backdoor-criterion 演算法(由 R 包 dagitty 實現),我們找到正確的調整集:

如何得到模型的 DAG?

誠然,找到模型的 DAG 非常有挑戰性。可以綜合考慮下列幾種方法:

  • 藉助領域知識;
  • 想給出一些候選 DAG,再用統計檢驗比較擬合水平;
  • 使用搜索方法(藉助一些 R 包,例如 mgmbnlearn

我會在後面的文章中展開這些主題。

進階閱讀

想要進一步瞭解上述問題的朋友,我推薦閱讀 Pearl 寫的一篇輕量級的技術報告——《The Seven Tools of Causal Inference with Reflections on Machine Learning》

想要深入瞭解因果推斷與 DAG 機制的話,我推薦 Pearl 的小冊子——《Causal Inference in Statistics - A Primer》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] 如何使用yii2的緩存依賴特性 概述 緩存是Yii2的強大特性之一,合理使用緩存技術可以有效地減小伺服器的訪問壓力。Yii2最基本的緩存包括 數據緩存 、 片段緩存 、 頁面緩存 和 HTTP緩存 ,這部分內容在官方文檔中有更加詳細的說明,這裡不再贅述,如有需要可以參考Yii2官方開發文 ...
  • 首先分享這篇文章《ParameterizedType詳解》 https://blog.csdn.net/JustBeauty/article/details/81116144 ParameterizedType就是參數化類型的意思 聲明類型中帶有“<>”的都是參數化類型,比如List<Integer ...
  • 一、HashMap概述; 1.HashMap是一個散列表,它存儲的是鍵值對(key-value)映射; 2.HashMap繼承AbstractMap,實現了Map,Cloneable,Serializable介面; 3.HashMap的實現不是同步的,線程不安全,但是效率高; 4.HashMap允許 ...
  • Java基本數據類型 java的基本數據類型可以分為4類8種 布爾型(boolean):true,false 整數類型:byte、short、int、long 浮點數類型:float、double 字元型:char 定義變數時:long,float類型後面要加上字母 8種數據類型的大小 一個漢字占2 ...
  • pythn print格式化輸出。 %r 用來做 debug 比較好,因為它會顯示變數的原始數據(raw data),而其它的符號則是用來向用戶顯示輸出的。 1. 列印字元串 print ("His name is %s"%("Aviad"))效果: 2.列印整數 print ("He is %d ...
  • [TOC] 一、為什麼要重載賦值運算符 ​ 在前面的內容中講解 "拷貝構造函數調用的時機" 時說明瞭初始化和賦值的區別:在定義的同時進行賦值叫做 ,定義完成以後再賦值(不管在定義的時候有沒有賦值)就叫做 。初始化只能有一次,賦值可以有多次。 ​ 當以拷貝的方式初始化一個對象時,會調用拷貝構造函數;當 ...
  • 今天真的是累哭了,周一課從早八點半一直上到晚九點半,整個人要虛脫的感覺,因為時間不太夠鴨所以就回頭看看找了一些比較有知識點的題來總結總結分析一下,明天有空了就開始繼續打題,嘻嘻嘻。 今日興趣電影: 《超能查派》 這是一部關於未來人工智慧的一個故事,感覺特別有思維開拓性,一個程式員寫出了真正的AI智能 ...
  • 代碼基本結構 url.py: views.py: 說明: 1)在authenticate方法的返回值是一個元組,元組中第一個元素是用戶名,第二個元素是認證數據token。這個返回值會在我們的視圖類中通 過request.user 和 request.auth獲取到。具體為什麼是這兩個值,會在後面的源 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...