Мотивация

Индикаторы мирового развития (WDI) - это обширная и исчерпывающая компиляция данных, подготовленная Всемирным банком. WDI включает 1400 показателей для экономик более 200 стран и представляет самые свежие и точные доступные данные о мировом развитии.

Индикатор «Рейтинг легкости ведения бизнеса» сравнивает страны друг с другом, его рейтинг варьируется от 1 до 190 (1 = наиболее благоприятные для бизнеса правила). Моя цель сегодня - разработать модель множественной линейной регрессии, чтобы понять, какие атрибуты повышают рейтинг страны. Итак, приступим.

Данные

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

library(WDI)
indicator1 <- WDI(country="all", indicator=c("NY.GDP.PCAP.CD", "IC.REG.COST.PC.ZS", "IC.REG.PROC", "IC.TAX.TOTL.CP.ZS", "IC.TAX.DURS", "IC.BUS.EASE.XQ"),
start=2016, end=2016)
colnames(indicator1) <- c("code","country","year", "GDP_per_capita", "Cost_start_Bus", "Days_reg_bus", "Bus_tax_rate", "Hours_do_tax", "Ease_Bus")
write.csv(indicator1, file = "indicator1.csv",row.names=FALSE)

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

  • ВВП на душу населения
  • Стоимость процедур запуска бизнеса% от ВНД на душу населения
  • Дней на регистрацию бизнеса
  • Ставка налога на бизнес
  • Часы для уплаты налогов

Переменная прогноза:

  • Легкость ведения бизнеса (1 = наиболее благоприятные для бизнеса правила)

Я выбрал 2016 год, потому что он самый последний и имеет наименьшее количество пропущенных значений. После выбора всех необходимых мне переменных я сохранил его как файл csv.

Допущения множественной линейной регрессии

  1. Линейность
  2. Нет мультиколлинеарности
  3. Гомоскедастичность
  4. Многомерная нормальность
  5. Независимость от ошибок

Мы проверим сделанные выше предположения по мере проведения анализа. Теперь перейдем к Python.

Предварительная обработка данных

%matplotlib inline
import numpy as np
import pandas as pd
np.random.seed(45)
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
indicator = pd.read_csv('indicator1.csv')
indicator.head()

Красиво, именно то, что нам нужно.

Теперь отбросьте столбец «код» и столбец «год».

indicator.drop(indicator.columns[[0, 2]], axis=1, inplace=True)
indicator.info()

Мы имеем дело со 186 наблюдениями (страны) и 7 столбцами (переменные, атрибуты или особенности).

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

indicator.describe()

Строки count, mean, min и max не требуют пояснений. Стандартное отклонение показывает стандартное отклонение. Строки 25%, 50% и 75% показывают соответствующие процентили.

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

indicator.hist(bins=50, figsize=(20, 15))
plt.savefig('numeric_attributes.png')
plt.show()

Две гистограммы смещены вправо, поскольку они простираются гораздо дальше вправо от медианы, чем влево. Однако я рассмотрю их все для регрессионного анализа.

Проверяем корреляцию между атрибутами.

from pandas.plotting import scatter_matrix
attributes = ["GDP_per_capita", "Hours_do_tax", "Days_reg_bus", "Cost_start_Bus", "Bus_tax_rate", "Ease_Bus"]
scatter_matrix(indicator[attributes], figsize=(12, 8))
plt.savefig("scatter_matrix_plot.png")
plt.show()

Похоже, что «ВВП на душу населения» имеет отрицательную корреляцию с «рейтингом легкости ведения бизнеса». Все остальные независимые переменные имеют положительную корреляцию с «рейтингом легкости ведения бизнеса». Давайте выясним наиболее многообещающую переменную для прогнозирования «рейтинга легкости ведения бизнеса».

from sklearn.linear_model import LinearRegression
X = indicator.drop(['country', 'Ease_Bus'], axis=1)
regressor = LinearRegression()
regressor.fit(X, indicator.Ease_Bus)

LinearRegression (copy_X = True, fit_intercept = True, n_jobs = 1, normalize = False)

print('Estimated intercept coefficient:', regressor.intercept_)

Расчетный коэффициент перехвата: 59,9441729113

print('Number of coefficients:', len(regressor.coef_))

Количество коэффициентов: 5

pd.DataFrame(list(zip(X.columns, regressor.coef_)), columns = ['features', 'est_coef'])

Наиболее многообещающей переменной для прогнозирования «простоты ведения бизнеса» является переменная «количество дней до регистрации бизнеса», поэтому давайте увеличим масштаб их корреляционного графика разброса.

indicator.plot(kind="scatter", x="Days_reg_bus", y="Ease_Bus",
             alpha=0.8)
plt.savefig('scatter_plot.png')

Корреляция действительно очень сильная; вы можете ясно увидеть восходящую тенденцию и то, что точки не слишком разнесены.

Разделите данные на обучающий набор и тестовый набор.

from sklearn.cross_validation import train_test_split
y = indicator.Ease_Bus
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Постройте модель линейной регрессии

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

LinearRegression (copy_X = True, fit_intercept = True, n_jobs = 1, normalize = False)

y_pred = regressor.predict(X_test)
regressor.score(X_test, y_test)

0.60703279859102988

Итак, в нашей модели 60,7% изменчивости Y можно объяснить с помощью X.

Рассчитайте среднеквадратичную ошибку (RMSE).

from sklearn.metrics import mean_squared_error
regressor_mse = mean_squared_error(y_pred, y_test)
import math
math.sqrt(regressor_mse)

33.58752374172286

Таким образом, мы отклоняемся в среднем на 33,59 от базового истинного результата по «простоте ведения бизнеса», когда делаем прогнозы по нашему набору тестов.

Средний балл «легкости ведения бизнеса» составляет 95, поэтому типичная ошибка прогноза 33,59 не очень удовлетворительна. Это пример модели, не подходящей для обучающих данных. Когда это происходит, это может означать, что функции не предоставляют достаточно информации, чтобы делать хорошие прогнозы, или что модель недостаточно мощна. Основные способы устранения неполноценного использования - это выбрать дополнительные функции из индикаторов банка слов (например, «получение кредита», «регистрация собственности» и т. Д.).

Остаточный участок

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

plt.scatter(regressor.predict(X_train), regressor.predict(X_train)-y_train, c='indianred', s=40)
plt.scatter(regressor.predict(X_test), regressor.predict(X_test)-y_test, c='b', s=40)
plt.hlines(y=0, xmin=0, xmax=200)
plt.title('Residual plot using training(red) and test(blue) data')
plt.ylabel('Residual')
plt.savefig('residual_plot.png')

Наш остаточный сюжет выглядит нормально.

Заключение

  1. В этом упражнении я загрузил и изучил набор данных показателей, связанных с бизнесом, Всемирного банка. Моя цель состояла в том, чтобы спрогнозировать рейтинг страны по «легкости ведения бизнеса» по выбранным характеристикам.
  2. Я использовал Sklearn, чтобы подогнать линейную регрессию ко всему набору данных и рассчитал коэффициенты.
  3. Я разделил данные на обучающий и тестовый наборы и вычислил R в квадрате и RMSE на тестовом наборе.
  4. Я построил остаточный график для обучающей и тестовой выборки.
  5. Как упоминалось ранее, чтобы получить лучшую оценку RMSE, я мог бы попытаться добавить больше функций или попробовать другую модель, такую ​​как случайный лес или дерево решений.
  6. Страны, которые не включены в этот анализ, - это Северная Корея и Сомали из-за отсутствия информации.
  7. Последний показатель ВВП на душу населения в Сирии был за 2007 год. Следовательно, информация по Сирии не актуальна.

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