1.2 MiB
Лабораторная 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()
df_dependence = df.groupby('gdppercent')['unemploymentrate'].mean().reset_index()
plt.figure(figsize=(12, 6))
plt.plot(df_dependence['gdppercent'], df_dependence['unemploymentrate'], marker='.')
plt.title("Диаграмма 2")
plt.xlabel("Уровень ВВП")
plt.ylabel("Уровень безработицы")
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.qcut(target, q=bins, labels=False)
train_df['gdppercent_binned'] = binning(train_df['gdppercent'], bins=2)
val_df['gdppercent_binned'] = binning(val_df['gdppercent'], bins=2)
test_df['gdppercent_binned'] = binning(test_df['gdppercent'], bins=2)
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, "тестовой выборке")
https://www.kaggle.com/datasets/surajjha101/stores-area-and-sales-data - данный датасет содержит информацию о магазинах
df_stores = pd.read_csv(".//static//scv//Stores.csv")
print(df_stores.columns)
Столбцы на русском: Store ID - Айди магазина Store_Area - Доступное пространство магазина Items_Available - Доступные предметы Daily_Customer_Count - Ежедневное количество клиентов Stores_Sales - Продажи в магазинах
df_stores.info()
df_stores.head()
Объект наблюдения - Розничная торговля Атрибуты - содержит набор информации о магазин, такие как: Айди, размер, количество доступных предметов, количество покупателей и выручка
plt.figure(figsize=(10, 6))
plt.scatter(df_stores['Daily_Customer_Count'], df_stores['Store_Sales'], c=df_stores['Daily_Customer_Count'], alpha=0.6)
plt.title("Диаграмма 1")
plt.ylabel("Доход магазина")
plt.xlabel("Количество посетителей")
plt.grid(visible='true')
plt.show()
Присутствует связь между атрибутами, прибыль магазина зависит от количества товаров и количества покупателей. Для примера на графике приведена связь между прибылью и количеством покупателей. Примеры бизнес целей
1.Прогнозирование уровня продаж на основе количества покупателей.
2.Улучшение маркетинговых стратегий.
Эффект для бизнеса: увеличение объема продаж и снижение затрат на хранение непродаваемых товаров, увеличение клиентской базы и повышение лояльности клиентов. Цели технического проекта
Для первой цели:
Вход: площадь магазина Целевой признак: сумма продаж.
Для второй цели:
Вход: количество клиентов за день Целевой признак: сумма продаж
Проверка на выбросы
null_values = df_stores.isnull().sum()
print("Пропущенные значения по столбцам:")
print(null_values)
stat_summary = df_stores.describe()
print("\nСтатистический обзор данных:")
print(stat_summary)
for column in df_stores.select_dtypes(include=[np.number]).columns:
skewness = df_stores[column].skew()
print(f"\nКоэффициент асимметрии для столбца '{column}': {skewness}")
duplicates = df_stores.duplicated().sum()
print(f"\nКоличество дубликатов: {duplicates}")
На основе данных выше можно сказать, что пустых значений и дубликатов нет, выбросы минимальны Очистиим данные от шумов
plt.figure(figsize=(10, 6))
plt.scatter(df_stores['Daily_Customer_Count'], df_stores['Store_Sales'])
plt.xlabel('Количество клиентов за день')
plt.ylabel('Сумма прибыли')
plt.title('Диаграмма рассеивания перед чисткой')
plt.show()
Q1 = df_stores["Daily_Customer_Count"].quantile(0.25)
Q3 = df_stores["Daily_Customer_Count"].quantile(0.75)
IQR = Q3 - Q1
threshold = 1.5 * IQR
lower_bound = Q1 - threshold
upper_bound = Q3 + threshold
outliers = (df_stores["Daily_Customer_Count"] < lower_bound) | (df_stores["Daily_Customer_Count"] > upper_bound)
# Вывод выбросов
print("Выбросы в датасете:")
print(df_stores[outliers])
# Заменяем выбросы на медианные значения
median_score = df_stores["Daily_Customer_Count"].median()
df_stores.loc[outliers, "Daily_Customer_Count"] = median_score
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df_stores['Daily_Customer_Count'], df_stores['Store_Sales'])
plt.xlabel('количество клиентов за день')
plt.ylabel('сумма прибыли')
plt.title('Диаграмма рассеивания после чистки')
plt.show()
Разбиение набора данных на обучающую, контрольную и тестовую выборки
from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(df_stores, 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_stores, name):
counts = df_stores['Store_Sales'].value_counts()
print(f"Распределение суммы продаж в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Применим андерсемплинг и оверсемплинг
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, 'Store_Sales')
val_df_oversampled = oversample(val_df, 'Store_Sales')
test_df_oversampled = oversample(test_df, 'Store_Sales')
train_df_undersampled = undersample(train_df, 'Store_Sales')
val_df_undersampled = undersample(val_df, 'Store_Sales')
test_df_undersampled = undersample(test_df, 'Store_Sales')
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, "тестовой выборке")
https://www.kaggle.com/datasets/aravinii/house-price-prediction-treated-dataset - датасет имеет данные о домах и их ценах
df_houses = pd.read_csv(".//static//scv//df_test.csv")
print(df_houses.columns)
Столбцы на русском date - дата price - цена bedrooms - количество спален grade - оценка has_basement - наличие подвала living_in_m2 - размер в кв метрах renovated - отремонтирован nice_view - наличие хорошего вида perfect_condition - идеальное состояние real_bathrooms - количество ванн has_lavatory - наличие туалета single_floor - один этаж month - месяц quartile_zone - зона квартиля
df_houses.info()
df_houses.head()
Объект наблюдения - недвижимость Атрибуты - содержит набор информации об обучении, такие как: Цена, дата, количествоо спален, оценка, наличие подвала, площадь, состояние восстановления и так далее
plt.figure(figsize=(10, 6))
plt.scatter(df_houses['living_in_m2'], df_houses['price'], c=df_houses['price'], alpha=0.6)
plt.title("Диаграмма 1")
plt.ylabel("Цена")
plt.xlabel("Площадь дома")
plt.grid(visible='true')
plt.show()
Присутствует связь между атрибутами: уровень цены зависит от всех атрибутов дома. Для примера на графике приведена связь между ценой и площадью дома. Примеры бизнес целей
1.Прогнозирование рыночных тенденций.
2.Увеличения доходов от продаж .
Эффект для бизнеса: определение цен на объекты недвижимости, предсказание изменения цен на недвижимость. Цели технического проекта
Для первой цели:
Вход: Площадь Целевой признак: Цена
Для второй цели:
Вход: Дата и месяц Целевой признак: Цена
Проверка на выбросы
null_values = df_houses.isnull().sum()
print("Пропущенные значения по столбцам:")
print(null_values)
stat_summary = df_houses.describe()
print("\nСтатистический обзор данных:")
print(stat_summary)
На основе данных можно сделать вывод об отстутствии нулевых значений
for column in df_houses.select_dtypes(include=[np.number]).columns:
skewness = df_houses[column].skew()
print(f"\nКоэффициент асимметрии для столбца '{column}': {skewness}")
duplicates = df_houses.duplicated().sum()
print(f"\nКоличество дубликатов: {duplicates}")
Дупликаты отстутсвуют, выбросы незначительны
Устранение шумов
plt.figure(figsize=(10, 6))
plt.scatter(df_houses['living_in_m2'], df_houses['price'])
plt.xlabel('Площадь')
plt.ylabel('Цена')
plt.title('Диаграмма рассеивания перед чисткой')
plt.show()
Q1 = df_houses["living_in_m2"].quantile(0.25)
Q3 = df_houses["living_in_m2"].quantile(0.75)
IQR = Q3 - Q1
threshold = 1.5 * IQR
lower_bound = Q1 - threshold
upper_bound = Q3 + threshold
outliers = (df_houses["living_in_m2"] < lower_bound) | (df_houses["living_in_m2"] > upper_bound)
# Вывод выбросов
print("Выбросы в датасете:")
print(df_houses[outliers])
# Заменяем выбросы на медианные значения
median_score = df_houses["living_in_m2"].median()
df_houses.loc[outliers, "living_in_m2"] = median_score
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df_houses['living_in_m2'], df_houses['price'])
plt.xlabel('Площадь')
plt.ylabel('Цена')
plt.title('Диаграмма рассеивания после чистки')
plt.show()
Разбиение набора данных на обучающую, контрольную и тестовую выборки
train_df, test_df = train_test_split(df_houses, 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_houses, name):
counts = df_houses['price'].value_counts()
print(f"Распределение цены в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
также используем oversampling и undersampling
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, 'price')
val_df_oversampled = oversample(val_df, 'price')
test_df_oversampled = oversample(test_df, 'price')
train_df_undersampled = undersample(train_df, 'price')
val_df_undersampled = undersample(val_df, 'price')
test_df_undersampled = undersample(test_df, 'price')
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, "тестовой выборке")