離群值、槓桿值與影響力

使用 Python 中的 statsmodels 進行回歸入門

Maarten Van den Broeck

Content Developer at DataCamp

鯿魚資料集

roach = fish[fish['species'] == "Roach"]
print(roach.head())
   species  mass_g  length_cm
35   Roach    40.0       12.9
36   Roach    69.0       16.5
37   Roach    78.0       17.5
38   Roach    87.0       18.2
39   Roach   120.0       18.6

常見的鯿魚

使用 Python 中的 statsmodels 進行回歸入門

哪些點是離群值?

sns.regplot(x="length_cm",
            y="mass_g",
            data=roach,
            ci=None)
plt.show()

鯿魚質量對長度的散佈圖與趨勢線。多數點緊貼趨勢線。

使用 Python 中的 statsmodels 進行回歸入門

解釋變數的極端值

roach["extreme_l"] = ((roach["length_cm"] < 15) |
                    (roach["length_cm"] > 26))

fig = plt.figure()
sns.regplot(x="length_cm",
            y="mass_g",
            data=roach,
            ci=None)

sns.scatterplot(x="length_cm",
                y="mass_g",
                hue="extreme_l",
                data=roach)

鯿魚質量對長度的散佈圖與趨勢線。多數點為藍色,但一條很短與一條很長的鯿魚為橘色。

使用 Python 中的 statsmodels 進行回歸入門

遠離迴歸線的應變數值

roach["extreme_m"] = roach["mass_g"] < 1

fig = plt.figure()
sns.regplot(x="length_cm",
            y="mass_g",
            data=roach,
            ci=None)

sns.scatterplot(x="length_cm",
                y="mass_g",
                hue="extreme_l",
                style="extreme_m",
                data=roach)

鯿魚質量對長度的散佈圖與趨勢線。多數點為藍色,但一條很短與一條很長的鯿魚為橘色。多數點是圓圈,但代表質量為 0 的魚是一個叉號。

使用 Python 中的 statsmodels 進行回歸入門

槓桿值與影響力

Leverage 衡量解釋變數值有多極端。

Influence 衡量若在建模時把該筆觀測從資料集中拿掉,模型會改變多少。

一個人正在轉動板手

使用 Python 中的 statsmodels 進行回歸入門

.get_influence() 與 .summary_frame()

mdl_roach = ols("mass_g ~ length_cm", data=roach).fit()

summary_roach = mdl_roach.get_influence().summary_frame()
roach["leverage"] = summary_roach["hat_diag"] print(roach.head())
   species  mass_g  length_cm  leverage
35   Roach    40.0       12.9  0.313729
36   Roach    69.0       16.5  0.125538
37   Roach    78.0       17.5  0.093487
38   Roach    87.0       18.2  0.076283
39   Roach   120.0       18.6  0.068387
使用 Python 中的 statsmodels 進行回歸入門

Cook's distance

最常見的影響力度量是 Cook's distance

roach["cooks_dist"] = summary_roach["cooks_d"]
print(roach.head())
   species  mass_g  length_cm  leverage  cooks_dist
35   Roach    40.0       12.9  0.313729    1.074015
36   Roach    69.0       16.5  0.125538    0.010429
37   Roach    78.0       17.5  0.093487    0.000020
38   Roach    87.0       18.2  0.076283    0.001980
39   Roach   120.0       18.6  0.068387    0.006610
使用 Python 中的 statsmodels 進行回歸入門

最具影響力的鯿魚

print(roach.sort_values("cooks_dist", ascending = False))
   species  mass_g  length_cm  leverage  cooks_dist
35   Roach    40.0       12.9  0.313729    1.074015 # 非常短的鯿魚
54   Roach   390.0       29.5  0.394740    0.365782 # 非常長的鯿魚
40   Roach     0.0       19.0  0.061897    0.311852 # 質量為 0 的鯿魚
52   Roach   290.0       24.0  0.099488    0.150064
51   Roach   180.0       23.6  0.088391    0.061209
..     ...     ...        ...       ...         ...
43   Roach   150.0       20.4  0.050264    0.000257
44   Roach   145.0       20.5  0.050092    0.000256
42   Roach   120.0       19.4  0.056815    0.000199
47   Roach   160.0       21.1  0.050910    0.000137
37   Roach    78.0       17.5  0.093487    0.000020
使用 Python 中的 statsmodels 進行回歸入門

移除最有影響力的鯿魚

roach_not_short = roach[roach["length_cm"] != 12.9]

sns.regplot(x="length_cm",
            y="mass_g",
            data=roach,
            ci=None,
            line_kws={"color": "green"})

sns.regplot(x="length_cm",
            y="mass_g",
            data=roach_not_short,
            ci=None,
            line_kws={"color": "red"})

鯿魚質量對長度的散佈圖,含兩條趨勢線。一條用全部資料,另一條排除最短鯿魚。第二條的斜率明顯更陡。

使用 Python 中的 statsmodels 進行回歸入門

一起來練習吧!

使用 Python 中的 statsmodels 進行回歸入門

Preparing Video For Download...