В предыдущих постах мы видели сетапы, OLS и простые линейные регрессии. Множественная линейная регрессия похожа на простую линейную регрессию, но главное отличие состоит в том, что мы пытаемся установить линейную связь между одной переменной ответа и более чем одной переменной-предиктором. Например, предположим, что исследователь изучает, как на цены на жилье влияет площадь квартиры и разрыв предложения в этом регионе. Переменная ответа - цена квартиры (Y), а переменные-предикторы - площадь квартиры (X1) и разрыв спроса и предложения (X2).

Общая структура модели линейной регрессии в этом случае будет следующей:

Y = a.X1 + b.X2 + c

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

Начиная с примера

Мы выполним множественную линейную регрессию на выборке данных о продажах определенного сегмента мобильных телефонов различных марок с почти схожими характеристиками в конкретный год. В образце набора данных, упомянутом ниже в таблице 3, у нас есть данные для 15 телефонов с аналогичными техническими характеристиками, и мы будем моделировать продажи (переменная ответа Y) относительно цены телефона (переменная предиктора X1) и расходов на рекламу (переменная предиктора X2). . В реальном сценарии может быть несколько других факторов, влияющих на продажи телефона, но для простоты в этом примере мы рассматриваем только две основные прогностические переменные.

Таблица 3: Входной набор данных о продажах мобильных телефонов за год.

+----------------+--------------+---------------------------+-------
| Handset S.No.  | Unit price$  | Advrt spends in mn | Sales (mn) |
+----------------+--------------+---------------------------+-------
|             1  |         150  |               100  | 0.73       
|             2  |         159  |               200  | 1.39       
|             3  |         170  |               350  | 2.03       
|             4  |         175  |               400  | 1.45       
|             5  |         179  |               500  | 1.82       
|             6  |         180  |               180  | 1.32       
|             7  |         189  |               159  | 0.83       
|             8  |         199  |               110  | 0.53       
|             9  |         199  |               400  | 1.95       
|            10  |         199  |               230  | 1.27       
|            11  |         235  |               120  | 0.49       
|            12  |         239  |               340  | 1.03       
|            13  |         239  |               360  | 1.24       
|            14  |         249  |               145  | 0.55       
|            15  |         249  |               400  | 1.3        
+----------------+--------------+---------------------------+-------

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

>>> import numpy as np
>>> import statsmodels.api as sm
>>> X= [[150,100],[159,200],[170,350],[175,400],[179,500],[180,180],[189,159],[199,110],[199,400],[199,230],[235,120],[239,340],[239,360],[249,145],[249,400]]
>>> Y= [0.73,1.39,2.03,1.45,1.82,1.32,0.83,0.53,1.95,1.27,0.49,1.03,1.24,0.55,1.3]

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

>>> X_1=sm.add_constant(X)
>>> results=sm.OLS(Y,X_1).fit()
>>> results.params
array([ 1.63384178, -0.00637932,  0.00316077])

Здесь мы получили коэффициенты регрессии для уравнения Y = c + a.X1 + b.X2 как c = 1,63384178, a = - 0,00637932 и b = 0,00316077.

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

>>> import pandas as pd
>>> df2=pd.DataFrame(X,columns=['Price','AdSpends'])
>>> df2['Sales']=pd.Series(Y)
>>> df2
     Price  AdSpends  Sales
0     150       100   0.73
1     159       200   1.39
2     170       350   2.03
3     175       400   1.45
4     179       500   1.82
5     180       180   1.32
6     189       159   0.83
7     199       110   0.53
8     199       400   1.95
9     199       230   1.27
10    235       120   0.49
11    239       340   1.03
12    239       360   1.24
13    249       145   0.55
14    249       400   1.30

Мы создали DataFrame с нашими входными данными. А теперь, на шагах ниже, мы вызовем метод ols формулы api.

>>> from mpl_toolkits.mplot3d import Axes3D
>>> import matplotlib.pyplot as plt
>>> import statsmodels.formula.api as smf
>>> model = smf.ols(formula='Sales ~ Price + AdSpends', data=df2)
>>> results_formula = model.fit()
>>> results_formula.params
Intercept    1.633842
Price       -0.006379
AdSpends     0.003161

До сих пор мы изучили коэффициенты регрессии. Но для построения регрессионной модели нам нужно нарисовать плоскость в 3D вместо линии. Обратите внимание, что для построения трехмерных изображений мы будем использовать стандартный mpl_toolkit.

>>> x_surf, y_surf = np.meshgrid(np.linspace(df2.Price.min(), df2.Price.max(), 100),np.linspace(df2.AdSpends.min(), df2.AdSpends.max(), 100))
>>> onlyX = pd.DataFrame({'Price': x_surf.ravel(), 'AdSpends': y_surf.ravel()})
>>> fittedY=results_formula.predict(exog=onlyX)

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

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111, projection='3d')
>>> ax.scatter(df2['Price'],df2['AdSpends'],df2['Sales'],c='blue', marker='o', alpha=0.5)
>>> ax.plot_surface(x_surf,y_surf,fittedY.reshape(x_surf.shape), color='None', alpha=0.01)
>>> ax.set_xlabel('Price')
>>> ax.set_ylabel('AdSpends')
>>> ax.set_zlabel('Sales')
>>> plt.show()

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

Прогнозирование с использованием модели множественной линейной регрессии

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

>>> X_new= [[180,100],[199,200],[170,370],[195,400],[279,400],[280,280]]
>>> df2_new= pd.DataFrame(X_new,columns=['Price','AdSpends'])
>>> results_formula.predict(df2_new)
array([ 0.80164183,  0.99651183,  1.71884293,  1.65418312,  1.11832054,0.7326488 ])

Прогнозируемые значения для новой выборки перечислены в таблице 5 ниже.

Таблица 5: Прогнозируемые продажи в количестве единиц для данной выборки цен за единицу и расходов на рекламу.

+-------------+--------------------+------------------+
| Unit Prices | Advertising Spends | Predicted Sales  |
+-------------+--------------------+------------------+
|         180 |                100 | 0.80164183       |
|         199 |                200 | 0.99651183       |
|         170 |                370 | 1.71884293       |
|         195 |                400 | 1.65418312       |
|         279 |                400 | 1.11832054,      |
|         280 |                280 | 0.7326488        |
+-------------+--------------------+------------------+

Сделай сам

Вы можете попробовать линейную регрессию на следующих открытых наборах данных, чтобы поиграть со статистическими моделями в Python.

Данные переписи

· Http://censusindia.gov.in/2011-common/CensusDataSummary.html

· Http://dataferrett.census.gov/TheDataWeb/

· Http://www.census.gov/apsd/www/statbrief/

Web Intelligence

· Поведение пользователей при оценке фильмов: http://www.cs.uic.edu/~liub/Netflix-KDD-Cup-2007.html

· Книжные рейтинги, выставленные разными пользователями: http://www2.informatik.uni-freiburg.de/~cziegler/BX/

· Информация об интернет-трафике на разных серверах: http://ita.ee.lbl.gov/index.html

Жилье / недвижимость

· Цены на жилье и демографические данные населенного пункта https://archive.ics.uci.edu/ml/datasets/Housing

· Данные о жилье: http://www.econ.yale.edu/~shiller/data/csreadme.html

Спорт

· Данные о скачках: http://data.betfair.com/

· Данные по крикетным матчам: http://cricsheet.org/

· Данные по бейсболу: http://www.seanlahman.com/baseball-archive/statistics/

· Футбольные данные: http://api.football-data.org/index

Финансы

· Курсы акций NASDAQ: https://data.nasdaq.com/

· Финансовые данные ОГУ: http://fisher.osu.edu/fin/fdf/osudata.htm

· Финансы Yahoo: http://finance.yahoo.com

Здравоохранение

· Данные Medicare: http://data.medicare.gov

· Данные о покрытии Medicare: http://www.cms.gov/medicare-coverage-database/

· Наборы данных о состоянии здоровья EHDP: http://www.ehdp.com/vitalnet/datasets.htm