熱線電話:13121318867

登錄
首頁數據分析教程數據分析師教程《統計學極簡入門》第7節 相關性分析
數據分析師教程《統計學極簡入門》第7節 相關性分析
2024-10-09
收藏

7. 相關性分析

前面的假設檢驗、方差分析基本上都是圍繞差異性分析,不論是單個總體還是兩個總體及以上,總之都是屬于研究“區別”,從本節開始,我們關注“聯系”,變量之間的關系分為 函數關系和相關關系。 本節這里重點探討的是不同類型變量之間的相關性,千萬記住一點相關性不代表因果性。除表中列出的常用方法外,還有Tetrachoric、相關系數等。

變量類型 變量類型 相關系數計算方法 示例
連續型變量 連續型變量 Pearson(正態)/Spearman(非正態) 商品曝光量和購買轉化率
二分類變量(無序) 連續型變量 Point-biserial 性別和疾病指數
無序分類變量 連續型變量 方差分析 不同教育水平的考試成績
有序分類變量 連續型變量 連續指標離散化后當做有序分類 商品評分與購買轉化率
二分類變量 二分類變量 數學公式: 檢驗 聯合 Cramer's V 性別和是否吸煙
二分類變量(有序) 連續型變量 Biserial 樂器練習時間與考級是否通過
無序分類變量 無序分類變量 數學公式: 檢驗 / Fisher檢驗 手機品牌和年齡段
有序分類變量 無序分類變量 數學公式: 檢驗 滿意度和手機品牌
有序分類變量 有序分類變量 Spearman /Kendall Tau相關系數 用戶等級和活躍程度等級

連續型變量 vs 連續型變量 : Pearson / Spearmanr

Pearson

Pearson相關系數度量了兩個連續變量之間的線性相關程度;

import random 
import numpy as np
import pandas as pd

np.random.seed(10)
df = pd.DataFrame({'商品曝光量':[1233,1333,1330,1323,1323,1142,1231,1312,1233,1123],
     '購買轉化率':[0.033,0.034,0.035,0.033,0.034,0.029,0.032,0.034,0.033,0.031]})
df
pd.Series.corr(df['商品曝光量'], df['購買轉化率'],method = 'pearson'# pearson相關系數
# 0.885789300493948
import scipy.stats as stats

# 假設有兩個變量X和Y
X = df['商品曝光量']
Y = df['購買轉化率']

# 使用spearmanr函數計算斯皮爾曼相關系數和p值
corr, p_value = stats.pearsonr(X, Y)

print("Pearson相關系數:", corr)
print("p值:", p_value)
# Pearson相關系數: 0.8857893004939478
# p值: 0.0006471519603654732

Spearman等級相關系數

Spearman等級相關系數可以衡量非線性關系變量間的相關系數,是一種非參數的統計方法,可以用于定序變量或不滿足正態分布假設的等間隔數據;

import random 
import numpy as np
import pandas as pd

np.random.seed(10)
df = pd.DataFrame({'品牌知名度排位':[9,4,3,6,5,8,1,7,10,2],
     '售后服務質量評價排位':[8,2,5,4,7,9,1,6,10,3]})
df
pd.Series.corr(df['品牌知名度排位'], df['售后服務質量評價排位'],method = 'spearman'# spearman秩相關
# 0.8787878787878788
import scipy.stats as stats

# 假設有兩個變量X和Y
X = df['品牌知名度排位']
Y = df['售后服務質量評價排位']

# 使用spearmanr函數計算斯皮爾曼相關系數和p值
corr, p_value = stats.spearmanr(X, Y)

print("斯皮爾曼相關系數:", corr)
print("p值:", p_value)
# 斯皮爾曼相關系數: 0.8787878787878788
# p值: 0.0008138621117322101

結論:p = 0.0008<0.05,表明兩變量之間的正向關系很顯著。

二分類變量(自然)vs 連續型變量 :Point-biserial

假設我們想要研究性別對于某種疾病是否存在影響。我們有一個二元變量“性別”(男、女)和一個連續型變量“疾病指數”。我們想要計算性別與疾病指數之間的相關系數,就需要用到Point-biserial相關系數。

import scipy.stats as stats

# 創建一個列表來存儲數據
gender = [0, 1, 0, 1, 1, 0]
disease_index = [3.2, 4.5, 2.8, 4.0, 3.9, 3.1]

# 使用pointbiserialr函數計算Point-biserial相關系數和p值
corr, p_value = stats.pointbiserialr(gender, disease_index)

print("Point-biserial相關系數:", corr)
print("p值:", p_value)
# Point-biserial相關系數: 0.9278305692406299
# p值: 0.007624695507848026

結論:p = 0.007<0.05,表明兩變量之間的正向關系很顯著。即性別與疾病指數正相關

無序分類變量 vs 連續型變量 : ANOVA

假設我們想要比較不同教育水平的學生在CDA考試成績上是否存在顯著差異。我們有一個無序分類變量“教育水平”(高中、本科、研究生)和一個連續型變量“考試成績”。

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

# 創建一個DataFrame來存儲數據
data = pd.DataFrame({
    '教育水平': ['高中''本科''本科''研究生''高中''本科''研究生'],
    '考試成績': [80, 90, 85, 95, 75, 88, 92]
})

# 使用ols函數創建一個線性模型
model = ols('考試成績 ~ C(教育水平)', data=data).fit()

# 使用anova_lm函數進行方差分析
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table

結論:p = 0.0102<0.05,拒絕原假設,表明兩變量之間的正向關系很顯著。教育水平與考試成績正相關

有序分類變量 vs 連續型變量

連續型變量離散化后當做有序分類,然后用 有序分類變量 VS 有序分類變量的方法

二分類變量 vs 二分類變量 :檢驗 聯合 Cramer's V

一項研究調查了不同性別的成年人對在公眾場合吸煙的態度,結果如表所示。那么,性別與對待吸煙的態度之間的相關程度

- 贊同 反對
15 10
10 26
import numpy as np
from scipy.stats import chi2_contingency

observed = np.array([[15, 10],
                     [10, 26]])
observed

chi2, p, dof, expected = chi2_contingency(observed,correction =False) # correction =False
# 卡方值 
# P值 
# 自由度: 
# 與原數據數組同維度的對應期望值

chi2, p
#(6.3334567901234555, 0.011848116168529757)

結論:p = 0.0118<0.05,拒絕原假設,表明兩變量之間的正向關系很顯著。

phi = np.sqrt(chi2/n)
print("phi's V:", phi)
# phi's V: 0.3222222222222222

卡方檢驗時有多種指標可表示效應量,可結合數據類型交叉表格類型綜合選擇

  • 第一:如果是2*2表格,建議使用 指標
  • 第二:如果是33,或 44表格,建議使用列聯系數;
  • 第三:如果是n*n(n>4)表格,建議使用 校正列聯系數;
  • 第四:如果是m*n(m不等于n)表格,建議使用 Cramer V指標;
  • 第五:如果X或Y中有定序數據,建議使用 指標;

這里只列出 指標Cramer V指標 的計算,其他計算方式請讀者自行研究。

# 計算Cramer's V
contingency_table = observed
n = contingency_table.sum().sum()
phi_corr = np.sqrt(chi2 / (n * min(contingency_table.shape) - 1))
v = phi_corr / np.sqrt(min(contingency_table.shape) - 1)

print("Cramer's V:", v)
# Cramer's V: 0.22878509151645754

二分類變量(有序) 連續型變量: Biserial

import numpy as np
from scipy.stats import pearsonr

# 生成隨機的二元變量
binary_variable = np.random.choice([0, 1], size=100)

# 生成隨機的連續變量
continuous_variable = np.random.normal(loc=0, scale=1, size=100)


# 注:此處的代碼未經嚴格考證,請謹慎使用
def biserial_correlation(binary_variable, continuous_variable):
    binary_variable_bool = binary_variable.astype(bool)
    binary_mean = np.mean(binary_variable_bool)
    binary_std = np.std(binary_variable_bool)
    
    binary_variable_norm = (binary_variable_bool - binary_mean) / binary_std
    
    corr, _ = pearsonr(binary_variable_norm, continuous_variable)
    biserial_corr = corr * (np.std(continuous_variable) / binary_std)
    
    return biserial_corr

# 計算Biserial相關系數
biserial_corr = biserial_correlation(binary_variable, continuous_variable)

print("Biserial相關系數:", biserial_corr)
Biserial相關系數: -0.2061772328681707

無序分類變量 vs 無序分類變量

參考 檢驗

有序分類變量 vs 無序分類變量

參考 檢驗

有序分類變量 vs 有序分類變量

Kendall秩相關系數

Kendall秩相關系數也是一種非參數的等級相關度量,類似于Spearman等級相關系數。

import random 
import numpy as np
import pandas as pd

np.random.seed(10)
df = pd.DataFrame({'品牌知名度排位':[9,4,3,6,5,8,1,7,10,2],
     '售后服務質量評價排位':[8,2,5,4,7,9,1,6,10,3]})
df
pd.Series.corr(df['品牌知名度排位'], df['售后服務質量評價排位'],method = 'kendall'# Kendall Tau相關系數
# 0.7333333333333333
from scipy.stats import kendalltau

# 兩個樣本數據
x = df['品牌知名度排位']
y = df['售后服務質量評價排位']

# 計算Kendall Tau相關系數
correlation, p_value = kendalltau(x, y)

print("Kendall Tau相關系數:", correlation)
print("p值:", p_value)
# Kendall Tau相關系數: 0.7333333333333333
# p值: 0.002212852733686067

浮生皆縱,恍如一夢,讓我們只爭朝夕,不負韶華!

下期將為大家帶來《統計學極簡入門》之 再看t檢驗、F檢驗、檢驗

推薦學習書籍

CDA一級教材》適合CDA一級考生備考,也適合業務及數據分析崗位的從業者提升自我。完整電子版已上線CDA網校,累計已有10萬+在讀~

免費加入閱讀:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢