В предыдущих постах мы видели сетапы, 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