特徵選擇的科學方法:如何用皮爾森相關係數找到最關鍵變數?

在資料分析領域當中,我們在最初會探索資料特徵之間的關聯性,而資料特徵的主要類別為連續型資料以及類別型資料,本篇文章當中所提到的皮爾森相關係數(Pearson Correlation Coefficient),是用來估計兩個連續型資料資料之間的線性關係,用以比較它們的關係程度。

連續型與類別型資料差異

在資料分析中,變數的類型對於探索資料與後續模型的選擇都有相當重要的影響。

連續型資料(Continuous Data)是可以測量且有無限可能數值的資料,例如身高、體重、溫度等。這類資料可以進行計算,適合用於回歸分析和統計等相關性的計算,也適合皮爾森相關係數估計。

另外,類別型資料(Categorical Data)則是離散的狀態,主要用來表示有限的類別,例如性別(男性、女性)、顏色(紅、藍、綠)或是產品不同類別,類別型資料沒有數值大小的意義,因此通常使用統計檢定的方式(如卡方檢定)來分析變數間的關聯性。了解這兩者的區別能幫助我們選擇正確的資料分析方法,以確保結果的準確性和解釋性。

皮爾森相關係數原理

皮爾森相關係數(Pearson Correlation Coefficient, 𝑟)用於衡量兩個連續型變數之間的線性關係,數值介於 -1 到 1 之間。當 𝑟 值接近 1,代表兩變數之間具有強正相關;當 𝑟 值接近 -1,則代表強負相關;而 𝑟 值接近 0,表示兩者幾乎無線性關聯。

這個公式的核心概念是衡量兩個變數的共同變異程度,再標準化為 -1 到 1 的範圍內,使其具有可比較性。然而,皮爾森相關係數僅適用於線性關係,若變數間呈現非線性關係,則需考慮其他相關性指標,如斯皮爾曼等級相關係數(Spearman’s Rank Correlation)或肯德爾相關係數(Kendall’s Tau)。

快速呈現皮爾森相關係數的套件

在 Python 或 R 等資料分析工具中,有許多現成的函式庫能夠快速計算皮爾森相關係數。

例如,在 Python 中,可以使用 pandasseaborn 來快速計算並視覺化相關矩陣:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 假設 df 是一個包含數值型資料的 DataFrame
correlation_matrix = df.corr(method='pearson')

# 使用 seaborn 繪製熱圖
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title("Pearson Correlation Heatmap")
plt.show()

應用皮爾森相關係數進行討論與應用

計算完皮爾森相關係數後,如何正確解讀並應用結果,是資料分析中關鍵的一環。

一般來說,若相關係數絕對值超過 0.7,則代表變數間有高度相關性,可能存在因果關係或共變現象;若介於 0.3 至 0.7 之間,則表示中度相關;小於 0.3 則為低相關或幾乎無關聯。

而在討論結果與應用時,會需要注意以下幾點:

  1. 相關不代表因果:即使兩個變數之間有高相關性,並不代表其中一個變數會導致另一個變數改變。例如,冰淇淋銷量與溺水事件的相關性可能很高,但這只是因為夏天這個共同因素的影響。
  2. 資料尺度差異:若變數的尺度不同(如年齡 vs. 收入),可能需要標準化處理,以確保相關係數能正確反映變數間的關係。
  3. 異常值的影響:極端值(outliers)可能會大幅影響相關係數的計算結果,因此在分析前應先檢查並適當處理異常值。
  4. 非線性關係的情況:如果變數之間的關係呈現非線性,例如拋物線型(U 形或倒 U 形),皮爾森相關係數可能會低估其實際的關聯性。

皮爾森相關係數範例

下面的程式碼範例我會提供在我的colab上,使用的資料集是 seaborn 上的 tips,下面會簡單介紹這個資料集的欄位(column)名稱和說明:

tips.csv 包含以下幾個欄位:

  • total_bill: 顧客結帳時的總金額(不包含小費)。
  • tip: 顧客給予的餐廳小費金額。
  • sex: 顧客的性別(Male 或 Female)。
  • smoker: 顧客是否吸煙(Yes 或 No)。
  • day: 用餐的日子,英文縮寫表示日期。
  • time: 就餐的時間段,午餐(Lunch)或晚餐(Dinner)。
  • size: 顧客人數。

首先先載入範例資料集:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 載入範例資料集
df = sns.load_dataset("tips")
df.head(5)
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner
110.341.66MaleNoSunDinner
221.013.50MaleNoSunDinner
323.683.31MaleNoSunDinner
424.593.61FemaleNoSunDinner
# 使用 pd.get_dummies() 將類別型資料轉換為數值型資料
df_encoded = pd.get_dummies(df, drop_first=True)
df_encoded.head(5)
total_billtipsizesex_Femalesmoker_Noday_Friday_Satday_Suntime_Dinner
016.991.012TrueTrueFalseFalseTrue
110.341.663FalseTrueFalseFalseTrue
221.013.503FalseTrueFalseFalseTrue
323.683.312FalseTrueFalseFalseTrue
424.593.614TrueTrueFalseFalseTrue
# 計算皮爾森相關係數
correlation_matrix = df_encoded.corr(method='pearson')

# 使用 seaborn 繪製熱圖
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title("Pearson Correlation Heatmap")
plt.show()

結果討論

正相關變數:

  • ‘total_bill’(結帳時的總金額)與 ‘tip’(小費金額)和 ‘size’(顧客人數)三項特徵有較為相近的正相關,表示顧客在支付金額會與該用餐人數還有小費金額有正相關。
  • 而 ‘time_Dinner’(晚餐時間)會與 ‘day_sat’(星期六)和 ‘day_sun’(星期日)有 0.4 以上的相關性,可以推測更多的顧客會選擇在周末假期的晚餐時段進行消費。

負相關變數:

  • 最高的負相關變數為 ‘day_sat’(星期六)和 ‘day_sun’(星期日)之間的相關性,為 -0.50,表示這兩個不同日期在某些模式或行為呈現出反向的趨勢,意味著在特定時間內,這兩天呈現的數值傾向於相反的變化。但由於該變數原始是類別型特徵,我們是將其強制轉換為連續型,讓它可被皮爾森相關係數估計,所以針對這項負相關的解釋,我們可以保留最終解釋的方式。

可能的解釋:

  • 週六和週日的用餐行為可能有所不同
    • 週六可能是顧客出門聚會或慶祝的高峰期,而週日可能是家庭聚餐或較為休閒的時間。就有可能影響顧客的消費模式,例如: 週六顧客可能傾向於花更多錢,並且有較高的小費支出,而週日的顧客則可能較為節省,或者正如一些文化習慣,週日的消費相對較低。
  • 顧客群體差異:
    • 週六和週日的顧客群體不同,週六通常吸引的是外出社交或聚會的人群,而週日可能更多是家庭聚餐或者偏向早午餐的顧客。這些群體的消費行為和習慣也可能有所不同。

無相關變數:

  • 無相關變數為 ‘sex_Female’(女性)和 ‘smoker_No’(不抽菸),表示這兩個變數之間沒有線性關聯。也就是說,顧客是否為女性與顧客是否吸煙之間的行為或特徵並沒有直接的相關性。 性別與吸煙習慣無顯著關聯:
    • 這可能是因為吸煙習慣並不直接受到性別影響,而是受到其他因素(如年齡、生活方式、社會經濟狀況等)影響。
    • 可能是因為資料集中的女性顧客與吸煙的習慣沒有直接的統計關聯。表示顧客的性別並不能預測他們是否有吸煙。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *