Основная информация

Подготовлено в рамках курса “Анализ данных в бизнесе”, МГУ им. М.В. Ломоносова.

Авторы: Мирзоян А.Г., Щукина П.О.

1. Линейная регрессия

Линейная регрессия используется для моделирования зависимости между одной зависимой переменной (целевой переменной) и одной или несколькими независимыми переменными (предикторами).

Модель представляет собой уравнение линейной зависимости, которое можно записать как:

1.1. Основные шаги в линейной регрессии

  1. Выбор модели: определить зависимую и независимые переменные.
  2. Подгонка модели: использовать метод наименьших квадратов для оценки коэффициентов.
  3. Проверка модели: оценить качество модели с помощью статистических метрик (R-квадрат, F-тест).
  4. Интерпретация результатов: анализ значимости коэффициентов и их интерпретация.
# Линейная регрессия на mtcars
library(ggplot2)
data(mtcars)

# Модель множественной линейной регрессии: mpg как функция веса автомобиля, мощности и числа цилиндров
model_mtcars <- lm(mpg ~ wt + hp + cyl, data = mtcars)
summary(model_mtcars)
## 
## Call:
## lm(formula = mpg ~ wt + hp + cyl, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.9290 -1.5598 -0.5311  1.1850  5.8986 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 38.75179    1.78686  21.687  < 2e-16 ***
## wt          -3.16697    0.74058  -4.276 0.000199 ***
## hp          -0.01804    0.01188  -1.519 0.140015    
## cyl         -0.94162    0.55092  -1.709 0.098480 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.512 on 28 degrees of freedom
## Multiple R-squared:  0.8431, Adjusted R-squared:  0.8263 
## F-statistic: 50.17 on 3 and 28 DF,  p-value: 2.184e-11
# Визуализация
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  geom_smooth(method = "lm", col = "red") +
  labs(title = "Множественная линейная регрессия: MPG vs Weight, Horsepower, Cylinders",
       x = "Вес автомобиля (1000 lbs)", y = "Расход топлива (MPG)") + theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Линейная регрессия на Boston
library(MASS)
data(Boston)

# Модель множественной линейной регрессии: медв как функция lstat, возраст и rm (количество комнат)
model_boston <- lm(medv ~ lstat + age + rm, data = Boston)
summary(model_boston)
## 
## Call:
## lm(formula = medv ~ lstat + age + rm, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -18.210  -3.467  -1.053   1.957  27.500 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.175311   3.181924  -0.369    0.712    
## lstat       -0.668513   0.054357 -12.298   <2e-16 ***
## age          0.009091   0.011215   0.811    0.418    
## rm           5.019133   0.454306  11.048   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.542 on 502 degrees of freedom
## Multiple R-squared:  0.639,  Adjusted R-squared:  0.6369 
## F-statistic: 296.2 on 3 and 502 DF,  p-value: < 2.2e-16
# Визуализация
ggplot(Boston, aes(x = lstat, y = medv)) +
  geom_point() +
  geom_smooth(method = "lm", col = "blue") +
  labs(title = "Множественная линейная регрессия: MEDV vs LSTAT, Age, Rooms",
       x = "Процент населения низкого социального статуса", y = "Медианная стоимость домов ($1000)") + theme_minimal()

# Линейная регрессия на AirQuality
data(airquality)

# Модель множественной линейной регрессии: Ozone как функция температуры, солнечных часов и ветра
model_airquality <- lm(Ozone ~ Temp + Solar.R + Wind, data = airquality, na.action = na.exclude)
summary(model_airquality)
## 
## Call:
## lm(formula = Ozone ~ Temp + Solar.R + Wind, data = airquality, 
##     na.action = na.exclude)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.485 -14.219  -3.551  10.097  95.619 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -64.34208   23.05472  -2.791  0.00623 ** 
## Temp          1.65209    0.25353   6.516 2.42e-09 ***
## Solar.R       0.05982    0.02319   2.580  0.01124 *  
## Wind         -3.33359    0.65441  -5.094 1.52e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.18 on 107 degrees of freedom
##   (42 пропущенных наблюдений удалены)
## Multiple R-squared:  0.6059, Adjusted R-squared:  0.5948 
## F-statistic: 54.83 on 3 and 107 DF,  p-value: < 2.2e-16
# Визуализация
ggplot(airquality, aes(x = Temp, y = Ozone)) +
  geom_point() +
  geom_smooth(method = "lm", col = "green") +
  labs(title = "Множественная линейная регрессия: Ozone vs Temperature, Solar Radiation, Wind",
       x = "Температура (градусы Фаренгейта)", y = "Уровень озона") + theme_minimal()

1.2. Интерпретация

В линейной регрессии каждый коэффициент показывает ожидаемое изменение зависимой переменной при изменении независимой переменной на одну единицу.

1.2.1 Логарифмические модели

Логлинейная модель (Log-Linear Model)

Описание: Логлинейная модель применяется для моделирования зависимости между логарифмом зависимой переменной и одной или несколькими независимыми переменными.

\(\ln(y)\) = \(\beta _0\) + \(\beta _1\)*\(x\) + \(\epsilon\)

  • Коэффициент \(\beta _1\) в логлинейной модели интерпретируется как процентное изменение зависимой переменной при изменении независимой переменной на одну единицу.
  • Например, если \(\beta _1 = 0.05\), то при увеличении \(x\) на 1 единицу, \(y\) увеличится примерно на 5%.

Пример в R:

# Логлинейная модель на mtcars
model_log_linear <- lm(log(mpg) ~ wt, data = mtcars)
summary(model_log_linear)
## 
## Call:
## lm(formula = log(mpg) ~ wt, data = mtcars)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.210346 -0.085932 -0.006136  0.061335  0.308623 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.83191    0.08396   45.64  < 2e-16 ***
## wt          -0.27178    0.02500  -10.87 6.31e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1362 on 30 degrees of freedom
## Multiple R-squared:  0.7976, Adjusted R-squared:  0.7908 
## F-statistic: 118.2 on 1 and 30 DF,  p-value: 6.31e-12

Линейно-логарифмическая модель (Linear-Logarithmic Model)

Описание: Линейно-логарифмическая модель применяется для моделирования зависимости между зависимой переменной и логарифмом независимой переменной.

\(y\) = \(\beta _0\) + \(\beta _1\)*\(\ln(x)\) + \(\epsilon\)

  • Коэффициент \(\beta _1\) в линейно-логарифмической модели интерпретируется как абсолютное изменение зависимой переменной \(y\) при процентном изменении независимой переменной \(x\).
  • Например, если \(\beta _1=2\), то при увеличении \(x\) на 1%, \(y\) увеличится на 0.02 единицы.

Пример в R:

# Линейно-логарифмическая модель на mtcars
model_linear_log <- lm(mpg ~ log(wt), data = mtcars)
summary(model_linear_log)
## 
## Call:
## lm(formula = mpg ~ log(wt), data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7440 -2.0954 -0.3672  1.0709  6.6150 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   39.257      1.758   22.32  < 2e-16 ***
## log(wt)      -17.086      1.510  -11.31 2.39e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.669 on 30 degrees of freedom
## Multiple R-squared:  0.8101, Adjusted R-squared:  0.8038 
## F-statistic:   128 on 1 and 30 DF,  p-value: 2.391e-12

Логарифмическая модель (Log-Log Model)

Описание: Логарифмическая модель применяется для моделирования зависимости между логарифмами зависимой и независимых переменных.

\(ln(y)\) = \(\beta _0\) + \(\beta _1\)*\(\ln(x)\) + \(\epsilon\)

  • Коэффициент \(\beta _1\) в логарифмической модели интерпретируется как эластичность зависимой переменной \(y\) по отношению к независимой переменной \(x\). Это означает, что коэффициент показывает процентное изменение \(y\) при процентном изменении \(x\).
  • Например, если \(\beta _1=1.5\), то при увеличении \(x\) на 1%, \(y\) увеличится на 1.5%.

Пример в R:

# Логарифмическая модель на mtcars
model_log_log <- lm(log(mpg) ~ log(wt), data = mtcars)
summary(model_log_log)
## 
## Call:
## lm(formula = log(mpg) ~ log(wt), data = mtcars)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.18141 -0.10681 -0.02125  0.08109  0.26930 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.90181    0.08790   44.39  < 2e-16 ***
## log(wt)     -0.84182    0.07549  -11.15 3.41e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1334 on 30 degrees of freedom
## Multiple R-squared:  0.8056, Adjusted R-squared:  0.7992 
## F-statistic: 124.4 on 1 and 30 DF,  p-value: 3.406e-12

2. Логистическая регрессия

Логистическая регрессия используется для моделирования вероятностей наступления определенных событий, особенно когда зависимая переменная является бинарной (например, “да/нет”, “успех/неуспех”). В отличие от линейной регрессии, логистическая регрессия прогнозирует вероятность, что зависимая переменная принимает значение 1 (или “истина”), используя логистическую функцию.

Модель представляет собой уравнение логистической зависимости, которое можно записать как: \[\text{logit}(p) = \ln\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n\]

2.1. Основные шаги в логистической регрессии

  1. Выбор модели: определить бинарную зависимую переменную и независимые переменные.
  2. Подгонка модели: использовать метод максимального правдоподобия для оценки коэффициентов.
  3. Проверка модели: оценить качество модели с помощью статистических метрик (AIC, ROC-кривая).
  4. Интерпретация результатов: анализ значимости коэффициентов и их интерпретация, преобразование коэффициентов логитов в вероятность.
# Логистическая регрессия на Titanic
library(titanic)
library(dplyr)
data("titanic_train")

# Преобразование данных
titanic_clean <- titanic_train %>%
  select(Survived, Pclass, Sex, Age, Fare) %>%
  na.omit()
titanic_clean$Sex <- factor(titanic_clean$Sex, levels = c("male", "female"))

# Модель логистической регрессии: Survived как функция Pclass, Sex, Age и Fare
model_titanic <- glm(Survived ~ Pclass + Sex + Age + Fare, data = titanic_clean, family = binomial)
summary(model_titanic)
## 
## Call:
## glm(formula = Survived ~ Pclass + Sex + Age + Fare, family = binomial, 
##     data = titanic_clean)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  2.4698435  0.5246627   4.707 2.51e-06 ***
## Pclass      -1.2697410  0.1586252  -8.005 1.20e-15 ***
## Sexfemale    2.5181969  0.2078562  12.115  < 2e-16 ***
## Age         -0.0367073  0.0076795  -4.780 1.75e-06 ***
## Fare         0.0005373  0.0021821   0.246    0.805    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 964.52  on 713  degrees of freedom
## Residual deviance: 647.23  on 709  degrees of freedom
## AIC: 657.23
## 
## Number of Fisher Scoring iterations: 5
# Интерпретация коэффициентов
exp(coef(model_titanic))
## (Intercept)      Pclass   Sexfemale         Age        Fare 
##  11.8205962   0.2809044  12.4062063   0.9639582   1.0005375
# Логистическая регрессия на Default
library(ISLR)
data(Default)

# Преобразование данных
default_clean <- Default

# Модель логистической регрессии: default как функция balance, income и student
model_default <- glm(default ~ balance + income + student, data = default_clean, family = binomial)
summary(model_default)
## 
## Call:
## glm(formula = default ~ balance + income + student, family = binomial, 
##     data = default_clean)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.087e+01  4.923e-01 -22.080  < 2e-16 ***
## balance      5.737e-03  2.319e-04  24.738  < 2e-16 ***
## income       3.033e-06  8.203e-06   0.370  0.71152    
## studentYes  -6.468e-01  2.363e-01  -2.738  0.00619 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2920.6  on 9999  degrees of freedom
## Residual deviance: 1571.5  on 9996  degrees of freedom
## AIC: 1579.5
## 
## Number of Fisher Scoring iterations: 8

2.2. Интерпретация

В логистической регрессии коэффициенты интерпретируются с точки зрения логитов; для преобразования в вероятности можно использовать экспоненцию \(exp(\beta)\).

Если \(\beta_1 = 0.5\), то \(e^{\beta_1} = e^{0.5} \approx 1.65\) означает, что при увеличении \(x\) на одну единицу, шансы того, что зависимая переменная примет значение 1, увеличиваются в 1.65 раза.

2.3. ROC-кривая (дополнительно)

ROC-кривая (Receiver Operating Characteristic curve) — это графический способ оценки качества бинарного классификатора, такого как логистическая регрессия. ROC-кривая показывает соотношение между чувствительностью (sensitivity, также известной как полнота или true positive rate) и специфичностью (specificity, также известной как 1 - false positive rate) при различных пороговых значениях.

  1. Чувствительность (Sensitivity) / Полнота (Recall) / True Positive Rate (TPR):
  1. Специфичность (Specificity):
  1. False Positive Rate (FPR):

Построение ROC-кривой

Пороговые значения:

График:

library(pROC)

# Построение ROC-кривой для модели Titanic
roc_titanic <- roc(titanic_clean$Survived, fitted(model_titanic))
plot(roc_titanic, col = "blue", main = "ROC-кривая для модели Titanic")

# Оценка точности модели Titanic
pred_titanic <- ifelse(fitted(model_titanic) > 0.5, 1, 0)
confusion_matrix_titanic <- table(pred_titanic, titanic_clean$Survived)
accuracy_titanic <- sum(diag(confusion_matrix_titanic)) / sum(confusion_matrix_titanic)
print(paste("Точность модели Titanic:", accuracy_titanic))
## [1] "Точность модели Titanic: 0.792717086834734"