Выбросы, рычаг и влияние

Введение в регрессию с statsmodels на Python

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

Обыкновенный плотвичный окунь

Введение в регрессию с statsmodels на Python

Какие точки являются выбросами?

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

Точечный график массы плотвы в зависимости от длины с линией тренда. Большинство точек близко следуют тренду.

Введение в регрессию с statsmodels на Python

Экстремальные значения объясняющей переменной

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)

Точечный график массы плотвы в зависимости от длины с линией тренда. Большинство точек синие, но одна очень короткая и одна очень длинная рыба отмечены оранжевым.

Введение в регрессию с statsmodels на Python

Значения отклика, далёкие от линии регрессии

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)

Точечный график массы плотвы в зависимости от длины с линией тренда. Большинство точек синие, одна короткая и одна длинная рыба отмечены оранжевым. Большинство точек — круги, но одна точка с видимой массой ноль обозначена крестиком.

Введение в регрессию с statsmodels на Python

Рычаг и влияние

Рычаг — мера того, насколько экстремальны значения объясняющей переменной.

Влияние показывает, насколько изменилась бы модель, если исключить наблюдение из набора данных при моделировании.

Человек затягивает гайку гаечным ключом

Введение в регрессию с statsmodels на Python

.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
Введение в регрессию с statsmodels на Python

Расстояние Кука

Расстояние Кука — наиболее распространённая мера влияния.

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
Введение в регрессию с statsmodels на Python

Наиболее влиятельные особи плотвы

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 # really short roach
54   Roach   390.0       29.5  0.394740    0.365782 # really long roach
40   Roach     0.0       19.0  0.061897    0.311852 # roach with zero mass
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
Введение в регрессию с statsmodels на Python

Удаление наиболее влиятельной особи

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"})

Точечный график массы плотвы в зависимости от длины с двумя линиями тренда. Одна построена по всем данным, другая — без самой короткой рыбы. Вторая линия заметно круче.

Введение в регрессию с statsmodels на Python

Давайте потренируемся!

Введение в регрессию с statsmodels на Python

Preparing Video For Download...