475 KiB
Датасет №1 (Использование мобильных устройств и поведение пользователей)¶
Ссылка: https://www.kaggle.com/datasets/valakhorasani/mobile-device-usage-and-user-behavior-dataset
Проблемная область: прогнозирование пользовательского поведения и сегментация пользователей для улучшения работы приложений, оптимизации потребления энергии, анализа пользовательского опыта или рекламы.
Объекты наблюдения: пользователи мобильных устройств, чьи данные об использовании собираются и анализируются.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
df_mobiles = pd.read_csv(".//static//csv//user_behavior_dataset.csv")
print(df_mobiles.columns)
df_mobiles.info()
df_mobiles.head()
Атрибуты объектов:
- User ID — уникальный идентификатор пользователя.
- Device Model — модель устройства.
- Operating System — операционная система устройства.
- App Usage Time (min/day) — время использования приложений в минутах в день.
- Data Usage (MB/day) — время включенного экрана в часах в день.
- Battery Drain (mAh/day) — потребление батареи в мАч в день.
- Number of Apps Installed — количество установленных приложений.
- Screen On Time (hours/day) — объем данных в мегабайтах в день.
- Age — возраст пользователя.
- Gender — пол пользователя.
- User Behavior Class — класс поведения пользователя (категория для классификации).
Связи между объектами: Атрибуты, такие как модель устройства, ОС и время использования приложений, могут быть связаны с классом поведения, представляя зависимости между действиями пользователя и его характеристиками.
Примеры бизнес-целей и эффекты для бизнеса:
Оптимизация энергопотребления устройств:
- Бизнес-цель: Оптимизировать работу приложений для снижения расхода батареи, что увеличит время работы устройства и улучшит пользовательский опыт.
- Эффект: Повышение удовлетворенности клиентов и снижение вероятности перехода на конкурентные приложения.
Сегментация пользователей для рекламы:
- Бизнес-цель: Создание таргетированной рекламы на основе поведения пользователей (классы поведения).
- Эффект: Увеличение конверсий и доходов от рекламных кампаний за счет более точной сегментации.
Примеры целей технического проекта:
Цель: Построение модели для прогнозирования расхода батареи.
- Вход: Модель устройства, ОС, время использования приложений, количество приложений, возраст.
- Целевой признак: Battery Drain (mAh/day).
Цель: Сегментация пользователей для рекламных кампаний.
- Вход: Время использования приложений, возраст, пол, объем данных.
- Целевой признак: User Behavior Class.
Проверка на пустые значения и дубликаты
null_values = df_mobiles.isnull().sum()
print("Пустые значения по столбцам:")
print(null_values)
duplicates = df_mobiles.duplicated().sum()
print(f"\nКоличество дубликатов: {duplicates}")
print("\nСтатистический обзор данных:")
df_mobiles.describe()
Пустых значений и дубликатов нет, проверим на выбросы:
# Выбираем столбцы для анализа
columns_to_check = ['App Usage Time (min/day)', 'Screen On Time (hours/day)', 'Battery Drain (mAh/day)', 'Number of Apps Installed', 'Data Usage (MB/day)', 'User Behavior Class']
# Функция для подсчета выбросов
def count_outliers(data, columns):
outliers_count = {}
for col in columns:
Q1 = data[col].quantile(0.25)
Q3 = data[col].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# Считаем количество выбросов
outliers = data[(data[col] < lower_bound) | (data[col] > upper_bound)]
outliers_count[col] = len(outliers)
return outliers_count
# Подсчитываем выбросы
outliers_count = count_outliers(df_mobiles, columns_to_check)
# Выводим количество выбросов для каждого столбца
for col, count in outliers_count.items():
print(f"Количество выбросов в столбце '{col}': {count}")
# Создаем диаграммы размахов
plt.figure(figsize=(15, 10))
for i, col in enumerate(columns_to_check, 1):
plt.subplot(2, 3, i)
sns.boxplot(x=df_mobiles[col])
plt.title(f'Box Plot of {col}')
plt.tight_layout()
plt.show()
Выбросов нет
Разбиение набора данных на обучающую, контрольную и тестовую выборки
train_df, test_df = train_test_split(df_mobiles, 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['User Behavior Class'].value_counts()
print(f"Распределение \"Класс поведения пользователя\" в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Оверсемплинг и андерсемплинг
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
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, 'User Behavior Class')
val_df_oversampled = oversample(val_df, 'User Behavior Class')
test_df_oversampled = oversample(test_df, 'User Behavior Class')
train_df_undersampled = undersample(train_df, 'User Behavior Class')
val_df_undersampled = undersample(val_df, 'User Behavior Class')
test_df_undersampled = undersample(test_df, 'User Behavior Class')
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, "тестовой выборке")
Датасет №2 (Характеристики автомобиля: данные об экономии топлива)¶
Ссылка: https://www.kaggle.com/datasets/arslaan5/explore-car-performance-fuel-efficiency-data
Проблемная область: производительность и экономичность транспортных средств.
Объекты наблюдения: автомобили, представленные набором характеристик.
df_cars = pd.read_csv(".//static//csv//car_data.csv")
print(df_cars.columns)
df_cars.info()
df_cars.head()
Атрибуты объектов:
- city_mpg — расход топлива в городе (миль на галлон).
- class — класс автомобиля (например, седан среднего размера, малый внедорожник).
- combination_mpg — комбинированный расход топлива (миль на галлон).
- cylinders — количество цилиндров.
- displacement — объем двигателя (в литрах).
- drive — тип привода (например, передний, полный).
- fuel_type — тип топлива (бензин, дизель и др.).
- highway_mpg — расход топлива на шоссе (миль на галлон).
- make — марка автомобиля.
- model — модель автомобиля.
- transmission — тип трансмиссии (автоматическая, механическая).
- year — год выпуска автомобиля.
Связи между объектами: Атрибуты, такие как объем двигателя, тип топлива, количество цилиндров и класс автомобиля, могут быть связаны с комбинированным расходом топлива (combination_mpg). Это позволяет выявлять зависимости между характеристиками автомобиля и его экономичностью.
Примеры бизнес-целей и эффекты для бизнеса:
Оптимизация ассортимента автомобилей:
- Бизнес-цель: Анализировать топливную экономичность различных моделей для оптимизации ассортимента, предлагать более популярные и экономичные модели.
- Эффект: Снижение затрат на производство низкоэффективных моделей и увеличение продаж популярных, экономичных автомобилей.
Снижение углеродного следа:
- Бизнес-цель: Определение моделей с высоким расходом топлива для улучшения их эффективности и снижения выбросов.
- Эффект: Соответствие экологическим стандартам, улучшение репутации компании и соблюдение требований законодательства.
Примеры целей технического проекта:
Цель: Создание модели для прогнозирования топливной эффективности.
- Вход: Объем двигателя, тип топлива, количество цилиндров, класс, тип трансмиссии.
- Целевой признак: combination_mpg.
Цель: Модель для предсказания углеродного следа автомобиля.
- Вход: Тип топлива, объем двигателя, класс автомобиля, тип привода.
- Целевой признак: combination_mpg.
Проверка на пустые значения и дубликаты
null_values = df_cars.isnull().sum()
print("Пустые значения по столбцам:")
print(null_values)
duplicates = df_cars.duplicated().sum()
print(f"\nКоличество дубликатов: {duplicates}")
print("\nСтатистический обзор данных:")
df_cars.describe()
Видим, что есть пустые данные, и дубликаты, удаляем их:
df_cars = df_cars.drop_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
df_cars = drop_missing_values(df_cars, "Cars")
Проверка на выбросы:
# Выбираем столбцы для анализа
columns_to_check = ['combination_mpg', 'cylinders', 'displacement', 'highway_mpg', 'city_mpg']
# Подсчитываем выбросы
outliers_count = count_outliers(df_cars, columns_to_check)
# Выводим количество выбросов для каждого столбца
for col, count in outliers_count.items():
print(f"Количество выбросов в столбце '{col}': {count}")
# Создаем диаграммы размахов
plt.figure(figsize=(15, 10))
for i, col in enumerate(columns_to_check, 1):
plt.subplot(2, 3, i)
sns.boxplot(x=df_cars[col])
plt.title(f'Box Plot of {col}')
plt.tight_layout()
plt.show()
В каждом из выбранных столбцов присутствуют выбросы. Очистим их.
# Выбираем столбцы для очистки
columns_to_clean = ['combination_mpg', 'cylinders', 'displacement', 'highway_mpg', 'city_mpg']
# Функция для удаления выбросов
def remove_outliers(df, columns):
for col in columns:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# Удаляем строки, содержащие выбросы
df = df[(df[col] >= lower_bound) & (df[col] <= upper_bound)]
return df
# Удаляем выбросы
df_cars_clean = remove_outliers(df_cars, columns_to_clean)
# Выводим количество удаленных строк
print(f"Количество удаленных строк: {len(df_cars) - len(df_cars_clean)}")
# Создаем диаграммы размаха для очищенных данных
plt.figure(figsize=(15, 6))
# Создаем диаграммы размахов
plt.figure(figsize=(15, 10))
for i, col in enumerate(columns_to_clean, 1):
plt.subplot(2, 3, i)
sns.boxplot(x=df_cars_clean[col])
plt.title(f'Box Plot of {col}')
plt.tight_layout()
plt.show()
plt.tight_layout()
plt.show()
df_cars = df_cars_clean
Разбиение набора данных на обучающую, контрольную и тестовую выборки
train_df, test_df = train_test_split(df_cars, 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['combination_mpg'].value_counts()
print(f"Распределение \"Комбинированный расход топлива\" в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Оверсемплинг и андерсемплинг
train_df_oversampled = oversample(train_df, 'combination_mpg')
val_df_oversampled = oversample(val_df, 'combination_mpg')
test_df_oversampled = oversample(test_df, 'combination_mpg')
train_df_undersampled = undersample(train_df, 'combination_mpg')
val_df_undersampled = undersample(val_df, 'combination_mpg')
test_df_undersampled = undersample(test_df, 'combination_mpg')
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, "тестовой выборке")
Датасет №3 (Экономика стран)¶
Ссылка: https://www.kaggle.com/datasets/pratik453609/economic-data-9-countries-19802020
Проблемная область: экономический анализ и прогнозирование макроэкономических показателей.
Объекты наблюдения: экономические индексы по странам за определённые годы.
df_countries = pd.read_csv(".//static//csv//Economic Data - 9 Countries (1980-2020).csv")
print(df_countries.columns)
df_countries.info()
df_countries.head()
Атрибуты объектов:
- stock index — индекс акций.
- country — страна.
- year — год.
- index price — цена индекса.
- log_indexprice — логарифм цены индекса.
- inflationrate — уровень инфляции.
- oil prices — цены на нефть.
- exchange_rate — валютный курс.
- gdppercent — процент роста ВВП.
- percapitaincome — доход на душу населения.
- unemploymentrate — уровень безработицы.
- manufacturingoutput — объём производства.
- tradebalance — торговый баланс.
- USTreasury — доходность казначейских облигаций США.
Связи между объектами: Некоторые атрибуты могут быть связаны друг с другом, например, уровень инфляции и процент роста ВВП могут коррелировать с ценами на нефть, уровнем безработицы и торговым балансом.
Примеры бизнес-целей и эффект:
Прогнозирование экономического роста и планирование инвестиций:
- Бизнес-цель: Создать модель прогнозирования роста экономики для стран, чтобы принять стратегические инвестиционные решения.
- Эффект: Повышение точности экономических прогнозов и улучшение прибыльности инвестиционных стратегий.
Анализ и оптимизация торговой политики:
- Бизнес-цель: Изучение влияния изменений торгового баланса и валютных курсов на экономику стран.
- Эффект: Улучшение торговых соглашений и политики, что приведёт к более устойчивому экономическому росту.
Примеры целей технического проекта:
Цель: Построение модели для прогнозирования уровня инфляции.
- Вход: Уровень безработицы, ВВП, доход на душу населения, валютный курс, цены на нефть.
- Целевой признак: inflationrate.
Цель: Построение модели для оценки экономического роста.
- Вход: Торговый баланс, доход на душу населения, валютный курс, инфляция.
- Целевой признак: gdppercent.
Проверка на пустые значения и дубликаты
null_values = df_countries.isnull().sum()
print("Пустые значения по столбцам:")
print(null_values)
duplicates = df_countries.duplicated().sum()
print(f"\nКоличество дубликатов: {duplicates}")
print("\nСтатистический обзор данных:")
df_countries.describe()
Видим, что есть пустые данные, но нет дубликатов. Удаляем их
df_countries = drop_missing_values(df_countries, "Countries")
Проверка на выбросы:
# Выбираем столбцы для анализа
columns_to_check = ['year', 'index price', 'log_indexprice',
'inflationrate', 'oil prices', 'exchange_rate', 'gdppercent',
'percapitaincome', 'unemploymentrate', 'manufacturingoutput',
'tradebalance', 'USTreasury']
# Подсчитываем выбросы
outliers_count = count_outliers(df_countries, columns_to_check)
# Выводим количество выбросов для каждого столбца
for col, count in outliers_count.items():
print(f"Количество выбросов в столбце '{col}': {count}")
# Создаем диаграммы размахов
plt.figure(figsize=(15, 10))
for i, col in enumerate(columns_to_check, 1):
plt.subplot(3, 4, i)
sns.boxplot(x=df_countries[col])
plt.title(f'Box Plot of {col}')
plt.tight_layout()
plt.show()
В большинстве из выбранных столбцов присутствуют выбросы. Очистим их.
# Выбираем столбцы для очистки
columns_to_clean = ['index price', 'log_indexprice',
'inflationrate', 'exchange_rate', 'gdppercent', 'unemploymentrate', 'manufacturingoutput',
'tradebalance', 'USTreasury']
# Удаляем выбросы
df_countries_clean = remove_outliers(df_countries, columns_to_clean)
# Выводим количество удаленных строк
print(f"Количество удаленных строк: {len(df_countries) - len(df_countries_clean)}")
# Создаем диаграммы размаха для очищенных данных
plt.figure(figsize=(15, 6))
# Создаем диаграммы размахов
plt.figure(figsize=(15, 10))
for i, col in enumerate(columns_to_clean, 1):
plt.subplot(3, 3, i)
sns.boxplot(x=df_countries_clean[col])
plt.title(f'Box Plot of {col}')
plt.tight_layout()
plt.show()
plt.tight_layout()
plt.show()
df_countries = df_countries_clean
Разбиение набора данных на обучающую, контрольную и тестовую выборки
train_df, test_df = train_test_split(df_countries, 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['inflationrate'].value_counts()
print(f"Распределение \"Уровень инфляции\" в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Оверсемплинг и андерсемплинг
def binning(target, bins):
return pd.qcut(target, q=bins, labels=False)
train_df['inflationrate_binned'] = binning(train_df['inflationrate'], bins=2)
val_df['inflationrate_binned'] = binning(val_df['inflationrate'], bins=2)
test_df['inflationrate_binned'] = binning(test_df['inflationrate'], bins=2)
train_df_oversampled = oversample(train_df, 'inflationrate_binned')
val_df_oversampled = oversample(val_df, 'inflationrate_binned')
test_df_oversampled = oversample(test_df, 'inflationrate_binned')
train_df_undersampled = undersample(train_df, 'inflationrate_binned')
val_df_undersampled = undersample(val_df, 'inflationrate_binned')
test_df_undersampled = undersample(test_df, 'inflationrate_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, "тестовой выборке")