283 KiB
Лабораторная 2
Информация об экономике стран
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
df = pd.read_csv(".//static//scv//Economic Data - 9 Countries (1980-2020).csv")
print(df.columns)
Столбцы на русском: 'stock index' - индекс акций 'country' - страна 'year'- год 'index price' - индекс стоимости 'log_indexprice' - индексная цена журнала 'inflationrate' - ставка инфляции 'oil prices' - цена на нефть 'exchange_rate' - ставка обмена 'gdppercent' - процент ВВП 'percapitaincome' - доход на душу населения 'unemploymentrate' - уровень безработицы 'manufacturingoutput' - объем производства 'tradebalance' - торговый баланс 'USTreasury' - UST казначейство
df.info()
df.head()
Объект наблюдения - экономика Атрибуты - содержит набор информации об обучении, такие как: Фондовый рынок, ВВП, страна, год, стоимость топлива, уровень инфлции,уровень безработицы и так далее
plt.figure(figsize=(10, 6))
plt.scatter(df['inflationrate'], df['percapitaincome'], c=df['percapitaincome'], alpha=0.6)
plt.title("Номер 1")
plt.ylabel("Доход на душу населения")
plt.xlabel("Уровень инфляции")
plt.grid(visible='true')
plt.show()
year_condition = df.groupby('gdppercent')['unemploymentrate'].mean().reset_index()
plt.figure(figsize=(12, 6))
plt.plot(year_condition['gdppercent'], year_condition['unemploymentrate'], marker='.')
plt.title("Диаграмма 2")
plt.xlabel("GDP percent")
plt.ylabel("Unemployent Rate")
plt.show()
Присутствует связь между атрибутами, уровень инфляции влияет и зависит от многих атрибутов. Для примера на графике приведена связь между инфляцией и доходом на душу населения. На втором графике показана связь уровня ВВП и безработицы Примеры бизнес целей
1.Прогнозирование уровня инфляции на основе уровня ВВП.
2.Наблюдение за изменениями уровня безработицы с уровнем ВВП.
Эффект для бизнеса: влияние на инвестиции индекса акций и цен на нефть, исследование влияния фондового индекса на инвестиции, исследования инфляции и покупательской способности. Цели технического проекта
Для первой цели:
Вход: Доход на душу населения Целевой признак: Уровень инфляции.
Для второй цели:
Вход: Уровень безработицы Целевой признак: Уровень ВВП
Проверка на выбросы
null_values = df.isnull().sum()
print("Пропущенные значения по столбцам:")
print(null_values)
stat_summary = df.describe()
print("\nСтатистический обзор данных:")
print(stat_summary)
На основе данных выше можно выделить большое количество столбцов с пропущенными значениями Также проверим данные на выбросы и дубликаты:
for column in df.select_dtypes(include=[np.number]).columns:
skewness = df[column].skew()
print(f"\nКоэффициент асимметрии для столбца '{column}': {skewness}")
duplicates = df.duplicated().sum()
print(f"\nКоличество дубликатов: {duplicates}")
На основе данных выше можно сказать, что для столбца объем производства присутствует выброс. Удаляем все найденные пустые значения.
def drop_missing_values(dataframe, name):
before_shape = dataframe.shape
cleaned_dataframe = dataframe.dropna()
after_shape = cleaned_dataframe.shape
print(f"В наборе данных '{name}' было удалено {before_shape[0] - after_shape[0]} строк с пустыми значениями.")
return cleaned_dataframe
cleaned_df = drop_missing_values(df, "Economic")
Очистка данных от шумов:
plt.figure(figsize=(10, 6))
plt.scatter(cleaned_df['manufacturingoutput'], cleaned_df['gdppercent'])
plt.xlabel('Объем производства')
plt.ylabel('ВВП')
plt.title('Диаграмма рассеивания перед чисткой')
plt.show()
Q1 = cleaned_df["manufacturingoutput"].quantile(0.25)
Q3 = cleaned_df["manufacturingoutput"].quantile(0.75)
IQR = Q3 - Q1
threshold = 1.5 * IQR
lower_bound = Q1 - threshold
upper_bound = Q3 + threshold
outliers = (cleaned_df["manufacturingoutput"] < lower_bound) | (cleaned_df["manufacturingoutput"] > upper_bound)
# Вывод выбросов
print("Выбросы в датасете:")
print(cleaned_df[outliers])
# Заменяем выбросы на медианные значения
median_score = cleaned_df["manufacturingoutput"].median()
cleaned_df.loc[outliers, "manufacturingoutput"] = median_score
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(cleaned_df['manufacturingoutput'], cleaned_df['gdppercent'])
plt.xlabel('Объем производства')
plt.ylabel('ВВП')
plt.title('Диаграмма рассеивания после чистки')
plt.show()
Разбиение набора данных на обучающую, контрольную и тестовую выборки
from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(cleaned_df, test_size=0.2, random_state=42)
train_df, val_df = train_test_split(train_df, test_size=0.25, random_state=42)
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
Видим недостаток баланса
def check_balance(df, name):
counts = df['gdppercent'].value_counts()
print(f"Распределение ВВП в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
также используем oversampling и undersampling
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
def binning(target, bins):
return pd.cut(target, bins=bins, labels=False)
train_df['gdppercent_binned'] = binning(train_df['gdppercent'], bins=3)
val_df['gdppercent_binned'] = binning(val_df['gdppercent'], bins=3)
test_df['gdppercent_binned'] = binning(test_df['gdppercent'], bins=3)
def oversample(df, target_column):
X = df.drop(target_column, axis=1)
y = df[target_column]
oversampler = RandomOverSampler(random_state=42)
x_resampled, y_resampled = oversampler.fit_resample(X, y) # type: ignore
resampled_df = pd.concat([x_resampled, y_resampled], axis=1)
return resampled_df
def undersample(df, target_column):
X = df.drop(target_column, axis=1)
y = df[target_column]
undersampler = RandomUnderSampler(random_state=42)
x_resampled, y_resampled = undersampler.fit_resample(X, y) # type: ignore
resampled_df = pd.concat([x_resampled, y_resampled], axis=1)
return resampled_df
train_df_oversampled = oversample(train_df, 'gdppercent_binned')
val_df_oversampled = oversample(val_df, 'gdppercent_binned')
test_df_oversampled = oversample(test_df, 'gdppercent_binned')
train_df_undersampled = undersample(train_df, 'gdppercent_binned')
val_df_undersampled = undersample(val_df, 'gdppercent_binned')
test_df_undersampled = undersample(test_df, 'gdppercent_binned')
print("Оверсэмплинг:")
check_balance(train_df_oversampled, "обучающей выборке")
check_balance(val_df_oversampled, "контрольной выборке")
check_balance(test_df_oversampled, "тестовой выборке")
print("Андерсэмплинг:")
check_balance(train_df_undersampled, "обучающей выборке")
check_balance(val_df_undersampled, "контрольной выборке")
check_balance(test_df_undersampled, "тестовой выборке")