Прогнозирование ВВП на душу населения с помощью потребления энергии на душу населения на языке Python

RedDeveloper
31.12.2022 18:54
Прогнозирование ВВП на душу населения с помощью потребления энергии на душу населения на языке Python
Photo by David Thielen on Unsplash

Введение

Это один из моих карьерных артефактов для курса Data Science and Machine Learning в BloomTech. Если вы хотите перейти к коду, он находится внизу этой статьи.

Меня интересует связь, если таковая существует, между потреблением энергии на душу населения и ВВП на душу населения. Вот как я настроил этот анализ:

Целевая переменная: ВВП на душу населения

Мы хотим узнать, можем ли мы предсказать ВВП на душу населения на основе потребления энергии на душу населения.

Метрика оценки: Значение R²

Это даст нам оценку точности нашей регрессионной модели.

XY-... 7-WZ

Линия, имеющая такую форму:

Y = ВВП на душу населения

X = энергопотребление на душу населения

M = (средний ВВП на душу населения) / (среднее энергопотребление на душу населения)

B = 0

Окончательная базовая линия: y = mx

Это очень базовый предиктор ВВП на душу населения на основе среднего энергопотребления.

Как я избежал утечки

Я импортировал функцию `model_selection.train_test_split` из библиотеки `sklearn`, чтобы разделить данные на обучающий и тестовый наборы. Функция 'train_test_split' предотвращает утечку данных благодаря полному разделению между обучающим и тестовым наборами, а также между независимыми и зависимыми переменными в каждом наборе.

Результаты

Показатель точности (квадрат коэффициента корреляции Пирсона) составляет 0,64. Это указывает на наличие определенной связи между энергопотреблением на душу населения и ВВП на душу населения. Эта модель может быть использована в качестве грубого индикатора уровня экономического развития страны. Это может быть полезно, если вам нужно быстро сгруппировать страны по уровню экономического производства на человека без использования ВВП на душу населения.

Код

Хранилище можно найти здесь

.
# Import libraries
import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as np
from math import sqrt
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error as mse
from sklearn.model_selection import train_test_split
from statsmodels.formula.api import ols
from scipy.stats import pearsonr
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

# Load data
# Make sure 'World_Energy_Consumption.csv' is in the directory
df = pd.read_csv('World_Energy_Consumption.csv')
columns = [
    'population',
    'gdp',
    'energy_per_capita',
    'energy_per_gdp'
]

# Feature Engineering / Data Wrangling
df = df[columns].dropna()
df['gdp_per_capita'] = df['gdp'] / df['population']
# Remove outliers
gdp_top = df['gdp_per_capita'].quantile(0.95)
gdp_bottom = df['gdp_per_capita'].quantile(0.05)
energy_top = df['energy_per_capita'].quantile(0.95)
energy_bottom = df['energy_per_capita'].quantile(0.05)
df = df[(gdp_bottom < df['gdp_per_capita']) & (df['gdp_per_capita'] < gdp_top)]
df = df[(energy_bottom < df['energy_per_capita']) & (df['energy_per_capita'] < energy_top)]
# Average GDP per capita divided by average energy use per capita
baseline = np.average(df['gdp_per_capita'])
baseline /= np.average(df['energy_per_capita'])
df['baseline'] = range(df.shape[0]) * baseline

# Make independent (X) and dependent (y) variables
X = np.array(df['energy_per_capita'])[:, np.newaxis]
y = df['gdp_per_capita']

# Split data into training and testing sets.
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=123)
# print(X_train.shape)

# Set up Linear Regression
model = LinearRegression()
model.fit(X=X_train, y=y_train)
slope = model.coef_
intercept = model.intercept_
print(f'Predicted GDP per capita = (Energy use per capita)*{slope} + {intercept}')

# Predict GDP per capita
y_pred = model.predict(X_test)
print(f'      LR r^2 = {r2_score(y_test, y_pred)}')
baseline_predict = [baseline*x for x in y_pred]
print(f'baseline r^2 = {r2_score(baseline_predict, y_pred)}')
print(f'        rmse = {sqrt(mse(y_test, y_pred))}')

# Data Visualization
sns.regplot(x=X_train, y=y_train, line_kws = {"color": "red"})
energy_range = range(int(max(df['energy_per_capita'])))
sns.lineplot(
    x=energy_range,
    y=[int(baseline*i) for i in energy_range],
    color='black'
)
plt.xlabel('Energy use per capita')
plt.ylabel('GDP per capita')
black_patch = Patch(color='black', label='baseline')
red_patch = Patch(color='red', label='regression')
plt.legend(handles=[black_patch, red_patch], loc=(0.02, 0.8))
plt.show()
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

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