Share |

среда, 5 июля 2017 г.

Регрессия: Как начать предсказывать

Вот и я решил замахнуться ни на что-то там такое, а на самую, что ни на есть регрессию.

В предыдущих статьях мы вместе с вами уже рассматривали много интересных задач:

·   Мы выявляли различия в уровне исследуемого нами признака (когда сравнивали количество прочитанных книг теми, кто быстро и теми, кто медленно читает):

·        Мы рассчитывали оценку сдвига значений исследуемого признака (когда изучали эффективность учебного мероприятия):

·        Мы искали различия в распределении исследуемого признака (когда исследовали вопрос текучести кадрового резерва и строили Карты Шухарта):

·        Мы проводили анализ изменений признака в различных группах (когда проводили дисперсионный анализ): https://edwvb.blogspot.com/2017/04/blog-post.html

Многое мы уже вместе с вами сделали, но вот до регрессии все дело не доходило. Сегодня именно тот день! J


Об R

Выступая на различных публичных мероприятиях с темой аналитики, я всегда интересуюсь о том, какие инструменты использует бизнес для анализа. И, как бы это печально не звучало, в 99% случаев бизнес использует для этих целей Excel. И это проблема! И дело здесь не только в HR функции. И финансисты, и стратеги, и производственники, и маркетологи, и продавцы… все используют Excel.

Нет, в Excel нет ничего плохого. Просто этот инструмент не для таких задач. Для аналитики каждому бизнесу нужно научиться использовать более продвинутые и более пригодные инструменты – R, Python, Julia.

Я хочу, чтобы бизнес начал осваивать эти новые инструменты. Именно поэтому, начиная с этой статьи, я буду давать в тексте и короткие комментарии о том, как что-то сделать на языке R с использованием RStudio.

Постановка задачи

Идея данной статьи, как и всех предыдущих, учебная. Наша задача состоит в том, чтобы не просто построить регрессию, но и по пути разобраться в том, как устроен весь этот процесс. Разобраться и понять: что это такое и зачем она – регрессия – вообще нужна. Чтобы регрессия не казалась чем-то страшным и пугающим.

Для построения регрессионной модели нам нужны переменные. Одна переменная, которую мы будем предсказывать, называется Зависимой переменной (ЗП). Другая или другие (их может быть несколько) переменные, которые помогают нам предсказывать Зависимую переменную, называются Независимыми переменными (НП).

Справедливости ради стоит сказать, что вся ценность регрессионных моделей именно в их предсказательной способности. Просто так строить регрессионную модель нет никакого большого смысла. А вот построить модель сегодня, чтобы она завтра тебе уже что-то предсказывала, это другое дело.

Давайте уже начнем!

Линейная регрессия с одной независимой переменной

Мы будем работать с данными, которые получены в ходе проведения исследования по скорочтению. Каждый раз, когда я провожу очередной мастер-класс по скорочтению, я собираю все новые и новые данные.

Загрузить данные в R можно следующей командой:
dataset <- read.csv("SpeedReading_3_Groups.csv", sep = ";")

Посмотреть на первые шесть строк нашего датасета можно так: head(dataset)

Мы будем предсказывать Количество прочитанных книг (Сколько.книг). Это будет наша Зависимая переменная. А Скорость чтения (Скорость.чтения) будет Независимой переменной.

Другими словами, мы будем пытаться предсказать, сколько книг человек прочитал за год на основании его скорости чтения (слов в минуту). Для этих целей мы будем использовать простую линейную регрессию.

Начинаем, как всегда с визуализации наших данных. Давайте построим обычный scatter plot, где по Х будет наша НП, а по Y наша ЗП. Такой график поможет нам понять характер взаимосвязи между нашими переменными.

Построить scatter plot в R можно следующим кодом. Предварительно нужно не забыть загрузить библиотеку ggplot2.
library(ggplot2)
ggplot(df_post, aes(x=Скорость.чтения, y=Сколько.книг))+ geom_point(size=3)+
  ggtitle('Скорость чтения & Количество прочитанных книг за год (scatter plot)')+
  xlab('Скорость чтения, слов/мин') +
  ylab('Кол-во прочитанных книг, шт.')

Из графика мы видим, что при увеличении скорости чтения возрастает и количество прочитанных книг.

Давайте попробуем построить простую линейную регрессию с одним предиктором.

Построить простую линейную регрессию с одним предиктором можно следующей строкой кода:
fit_2 <- lm(Сколько.книг  ~ Скорость.чтения, data=dataset)
fit_2

В итоге получим следующий результат:
Давайте немного отвлечемся и вспомним университетскую программу по статистике J.

Уравнение простой линейно регрессии с одним предиктором выглядит так:

y = b0 + b1*x

Идея данного уравнения состоит в следующем. Мы хотим предсказать значение y, на основании значения xy – это количество прочитанных книг. А x – это скорость чтения.

Что же такое b0 и b1?
b0 – называется intercept, а b1 slope.

Не буду вдаваться в более глубокие пояснения, а скажу только, что наша регрессионная модель, как раз и позволяет найти эти самые b0 и b1.

Давайте еще раз взглянем на нашу модель.

Для того чтобы это сделать, достаточно просто в консоле RStudio набрать имя нашей модели: fit_2 и нажать Enter.
Мы видим, что intercept, т.е. b0=1.23343, а b1=0.02485. Следовательно, наше уравнение примет следующий вид:

y = 1.23343 + 0.02485*x

Или

Кол-во книг = 1.23343 + 0.02485*Скорость чтения

Давайте попробуем воспользоваться полученной формулой.

Средняя скорость чтения всех участников находящихся в базе составляет 238 слов в минуту. Давайте ее и подставим в формулу:

Кол-во книг = 1.23343 + 0.02485*238 = 7 книг

Т.е. получается, что человек, который читает со скоростью 238 слов в минуту, за год прочитывает около 7 книг.

Давайте посмотрим на фактические данные по Скорости чтения и Количеству прочитанных книг в нашем датасете:

Для этого достаточно просто набрать имя нашего датасета с нужными номерами столбцов:
dataset[,c(4,5)]

Мы видим, что, например, строка 15 очень близка к нашему прогнозу. Т.е. человек со скоростью чтения 250 слов в минуту прочитал за прошлый год 8 книг.

Но при этом мы также видим и другую картинку. Например, строка 8: при скорости чтения 234 слов в минуту мы видим всего лишь 3 книги. Или, интересная строка 17: при скорости чтения 149 слов в минуту мы видим 14 прочитанных книг.

Почему так происходит? Давайте взглянем на более развернутое описание нашей линейной модели с одним предиктором.

Чтобы его получить, следует выполнить следующую команду:
summary(fit_2)

Что мы здесь видим?

Мы видим наши коэффициенты b0=1.23343 и b1=0.02485 (выделено синей линией на рисунке). Также мы видим, что наш коэффициент  значим, т.е. p<0,05 (выделено красной линией на рисунке).

Но самый большой интерес в этом описании вызывает R-squared значение, которое равно 0,1425 (выделено зеленой линией на рисунке). Это означает, что наша модель объясняет только около 14% изменчивости нашей зависимой переменной (т.е. Количество прочитанных книг). А это нам говорит о том, что в модель нужно добавлять другие предикторы (независимые переменные), которые усилят (читай – позволят более точно прогнозировать зависимую переменную) нашу модель.

Именно поэтому (R2 = 0,1425) нашей модели не всегда хватало точности в прогнозе Количества прочитанных книг на основании Скорости чтения, когда мы подставляли значения в формулу и смотрели фактические значения в нашем датасете.

Давайте теперь нарисуем на нашем scatter plot линию регрессии.

Чтобы это сделать нам нужно выполнить следующий код в RStudio:
ggplot(dataset, aes(x=Скорость.чтения , y = Сколько.книг))+
 geom_point(size=3)+
 geom_line(aes(x=Скорость.чтения, y=predict(fit_2, dataset)),col="red",lwd=1)+
 ggtitle('Скорость чтения & Количество прочитанных книг за год (scatter plot)')+
 xlab('Скорость чтения, слов/мин')+
 ylab('Кол-во прочитанных книг, шт.')

На графике мы видим, что наша линия регрессии (т.е. наше уравнение) y = 1.23343 + 0.02485*x не очень точно описывает взаимосвязь. Есть много точек гораздо выше линии регрессии и также есть много точек гораздо ниже нашей линии регрессии.

Давайте теперь попросим нашу модель спрогнозировать Количество прочитанных книг для каждого участника из датасета.

Чтобы это сделать, мы можем использовать следующий код:
y_pred <- predict(fit_2, newdata = dataset)
results <- cbind(y_pred, dataset$Сколько.книг)
colnames(results) <- c("predicted", "actual")
results <- as.data.frame(results)
results

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


В этой таблице мы видим фактические значения (actual) и предсказанные нашей моделью значения (predicted).

Мы можем сравнить полученные пары значений и опять увидеть, что наша модель не очень точно предсказывает Количество прочитанных книг. Мы помним, что R2 нашей модели равен 0,1425. А это очень мало для адекватной модели.

Что мы можем сделать, чтобы улучшить нашу модель? Мы можем добавить в нее другие предикторы (независимые переменные). Например, пол, возраст и т.д. В данном случае, нам нужно будет построить множественную линейную регрессию.

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

Но это уже идеи для будущих статей. J

Работая с простой линейной регрессией с одной независимой переменной, следует также помнить о нескольких условиях ее применения:
         1)    Линейная взаимосвязь между ЗП и НП
         2)    Нормальное распределение остатков
        3)    Очень страшное слово – гомоскедастичность, т.е. постоянная изменчивость остатков на всех уровнях независимой переменной

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

Вывод

Важно отметить для коллег HR-ов, что на месте нашей независимой переменной и зависимой переменной могут быть абсолютно другие данные, которые у вас имеются и которые вы хотели бы предсказывать. Например, уровень заработной платы и эффективность сотрудника, оценка компетенций и результативность, выполнение плана продаж и уровень управленческого потенциала и т.д.

Итак, в данной статье мы:
       1)    рассмотрели, что такое регрессия и для чего она нужна
  2) построили график scatter plot, который отображает взаимосвязь двух переменных
       3)    построили регрессионную модель с одним предиктором
     4)  сделали прогноз нашей зависимой переменной, используя полученную модель, и сравнили наши фактические данные с предсказанными значениями
      5)    наметили, куда двигаться дальше J

3 комментария:

  1. Евгений, а можно попросить сделать дополнение: все тоже самое, но с помощью не линейной регрессии, а KNN?
    и сравнить R^2 для линейной модели и KNN

    ОтветитьУдалить
  2. Эдуард, все сделаю!) я просто эту статью начал писать ещё месяц назад. Вот решил дописать чтобы двигаться дальше.

    ОтветитьУдалить
    Ответы
    1. ок, я понял) извините, тороплюсь проверить, что все ок)

      Удалить

рек