30 KiB
Выбранные наборы данных для анализа:
- Вариант 7. Экономика стран (https://www.kaggle.com/datasets/pratik453609/economic-data-9-countries-19802020)
- Вариант 17. Цены на автомобили (https://www.kaggle.com/datasets/deepcontractor/car-price-prediction-challenge)
- Вариант 21. Данные о клиентах (https://www.kaggle.com/datasets/muhammedtausif/world-population-by-countries)
Анализ и проблемная область¶
1) Вариант 7. Экономика стран¶
Анализ датасета: Набор данных содержит данные по 8 странам и одному особому административному району (Китай, Франция, Германия, Гонконг, Индия, Япония, Испания, Великобритания и Соединенные Штаты Америки) с 1980 по 2020 год. Он включает основные макроэкономические факторы, такие как инфляция, безработица, ВВП, обменный курс (базовый доллар США) и доход на душу населения. Кроме того, он содержит цены акций основного фондового индекса соответствующей страны, что может помочь в анализе набора данных для определения влияния основных макроэкономических переменных на движение цен фондовых индексов.
Проблемная область: Анализ взаимосвязей между макроэкономическими факторами и движением цен на фондовые индексы в разных странах.
2) Вариант 17. Цены на автомобили¶
Анализ датасета: Данные о продажах автомобилей и характеристики проданных автомобилей. Содержит 18 столбцов и 19237 записей.
Проблемная область: Прогнозирование цены продажи автомобилей на основе различных атрибутов.
3) Вариант 21. Данные о клиентах¶
Анализ датасета: Анализ личности клиента — это подробный анализ идеальных клиентов компании. Он помогает бизнесу лучше понять своих клиентов и упрощает для них изменение продуктов в соответствии с конкретными потребностями, поведением и проблемами разных типов клиентов. Анализ личности клиента помогает бизнесу изменять свой продукт на основе своих целевых клиентов из разных типов сегментов клиентов. Например, вместо того, чтобы тратить деньги на маркетинг нового продукта для каждого клиента в базе данных компании, компания может проанализировать, какой сегмент клиентов с наибольшей вероятностью купит продукт, а затем продвигать продукт только на этом конкретном сегменте.
Проблемная область: Определение эффективной и наиболее подходящей маркетинговой стратегии для клиентов.
from src.path_utils import *
from src.notebook_utils import *
from src.calculation_utils import *
from src.data_utils import split_data_info
from imblearn.over_sampling import ADASYN
df_economic = pd.read_csv(ECONOMIC_DATA_CSV_PATH)
df_car_price = pd.read_csv(CAR_PRICE_CSV_PATH)
df_customer_data = pd.read_csv(CUSTOMER_DATA_CSV_PATH)
print_header('Экономические данные')
print(df_economic.info())
print_header('Данные по продажам автомобилей')
print(df_car_price.info())
print_header('Данные о клиентах')
print(df_customer_data.info())
Бизнес-цели, эффект для бизнеса и цели технического проекта¶
1) Вариант 7. Экономика стран¶
Бизнес-цель: определение стран с высокими темпами роста экономики для инвестирования в акции, облигации или другие активы.
Эффект для бизнеса: более быстрое и точное определение стран для инвестиций.
Цель технического проекта: построение модели прогнозирования роста экономики страны по различным показателям.
Входные данные: средний индекс цен в году, цены на топливо, обменный курс валюты.
Целевой признак: предсказание экономики страны.
2) Вариант 17. Цены на автомобили¶
Бизнес-цель: оптимизация ценовой политики компании для перепродажи автомобилей на более выгодных для компании условиях.
Эффект для бизнеса: более точный подбор цены для продажи автомобиля для максимизации выруски с продаж каждого их автомобилей.
Цель технического проекта: построение модели определения оптимальной рыночной цены автомобиля.
Входные данные: технические характеристики автомобиля.
Целевой признак: оптимальная цена для продажи автомобиля.
3) Вариант 21. Данные о клиентах¶
Бизнес-цель: определение эффективной маркетинговой стратегии для создания более целевых и подходящих пользователю предложений.
Эффект для бизнеса: создание более точных рекламных предложений, соответственно, более высокая вероятность продать продукт/услугу и увеличить прибыль компании.
Цель технического проекта: построение модели для подбора оптимального предложения для конкретного клиента.
Входные данные: данные о клиенте: его интересы, пол, возраст и т.д.
Целевой признак: оценка соответствия конкретного предложения клиенту.
Проблемы наборов данных и их решения¶
1) Вариант 7. Экономика стран¶
Зашумленность: возможные некорректные значения, пропуски данных в финансовых показателях.
- Решение: линейная интерполяция или более сложные методы, такие как KNN, для восстановления недостающих значений в финансовых показателях.
Смещение: возможно смещение на рассмотрение стран только с быстрорастущей экономикой, в таком случае могут быть не определены факторы, негативно влияющие на экономику.
- Решение: усреднение данных и рассмотрение стран как с повышением уровня экономики, так и с его понижением.
Актуальность: данные за предыдущие года могут сбить модель, и тенденции в экономике будут просчитаны неверно.
- Решение: удаление старых данных если они неправильно влияют на работу модели.
Выбросы: резкие смены финансовых показателей ввиду кризисов и т.д.
- Решение: постоянное обновление данных за счет регулярной выгрузки актуальных финансовых показателей и исключение записей, относящихся к устаревшим периодам, если они не имеют корреляции с текущими тенденциями.
Просачивание данных: использование будущих значений при обучении модели. Тренды, рассчитанные на основе данных, доступных только после момента прогноза.
- Решение: исключение признаков, которые зависят от будущих значений.
2) Вариант 17. Цены на автомобили¶
Зашумленность: возможные некорректные значения в характеристиках автомобилей.
- Решение: проверка данных на соответствие реальности для определенных автомобилей (можно сравнивать, действительно ли такие показатели у определенных марок и моделей автомобилей).
Смещение: возможное рассмотрение в наборе данных продаж определенного класса автомобилей, что помешает модели корректно спрогнозировать цены для автомобилей другого класса.
- Решение: усреднение данных об автомобилях всех классов, к примеру, удаление части данных об автомобилях самого распространенного класса.
Актуальность: содержание в наборе данных информации о старых продажах, т.е. не учитывается инфляция, курс валюты и т.д.
- Решение: удаление старых данных из набора, или изменение старых цен путем расчета цены на сегодняшний день.
Выбросы: продажа автомобилей в слишком хорошем/плохом состоянии, что сильно отражается на цене продажи.
- Решение: удаление выбросов, или добавление параметра о состояния автомобиля.
Просачивание данных: присутствие одинаковых моделей автомобилей как в тренировочной, так и в тестовой выборке.
- Решение: унификация моделей автомобилей для разных выборок, так чтобы они не повторялись.
3) Вариант 21. Данные о клиентах¶
Зашумленность: возможные неактуальные данные о клиентах, которые они сами ввели неправильно.
- Решение: проверка данных на наличие корректных значений (например, путем сравнения с диапазоном допустимых значений для каждого поля), удаление или сглаживание дублирующихся признаков.
Смещение: сбор данных только о клиентах, покупающих только определенную продукцию из всего ассортимента.
- Решение: усреднение данных о клиентах, к примеру, удаление части данных о клиентах покупающих только определенную часть ассортимента.
Актуальность: введенные данные о клиенте могут не обновляться и устаревать.
- Решение: удаление старых записей о клиентах, или введение метки о последнем обновлении данных, и при слишком долгом простое удалять запись.
Выбросы: содержание в наборе данных сведений о специфичных клиентах.
- Решение: удаление данных специфичных клиентов (удаление выбросов).
Просачивание данных: наличие в наборе данных полей, напрямую указывающих на предпочтения клиента и его покупки, что будет сбивать модель и настраивать ее на данные, которые можно получить только в будущем.
- Решение: удаление полей, напрямую влияющих на целевой признак.
print_header('Данные по экономике стран')
problems_info(df_economic)
print_header('Данные по ценам на автомобили')
problems_info(df_car_price)
print_header('Данные по клиентам')
problems_info(df_customer_data)
Оценка качества наборов данных¶
1) Вариант 7. Экономика стран¶
Информативность:
Положительные стороны: приведено много параметров экономики стран по годам, поэтому подойдет для временного анализа и прогнозирования.
Ограничения: приведены данные ограниченного количества стран.
Степень покрытия:
Положительные стороны: включает данные за значительный временной промежуток, что положительно повлияет на анализ динамики.
Ограничения: не охватывает некоторые макроэкономические факторы, к примеру, геополитические события или данные о процентных ставках.
Соответствие реальным данным:
Положительные стороны: данные легко проверить так как это официальная информация.
Ограничения: устаревшие записи могут не отражать современные тенденции.
Согласованность меток:
Положительные стороны: данные хорошо описывают состояние экономики страны за определенный год.
Ограничения: метки столбца 'country' соответствуют только ограниченному набору стран, а столбца 'stock index' - зависят от столбца 'country'
2) Вариант 17. Цены на автомобили¶
Информативность:
Положительные стороны: содержит много необходимых для покупателя параметров.
Ограничения: может не содержать некоторые дополнительные технические данные.
Степень покрытия:
Положительные стороны: предлагает широкий спектр технической информации об автомобиле.
Ограничения: не содержит информации о нетехнических характеристиках автомобиля (количество владельцев, и т.д.).
Соответствие реальным данным:
Положительные стороны: технические данные об автомобилях легко проверить по официальным источникам, и скорее всего соответствует реальности.
Ограничения: цены представленные в наборе данных трудно проверить в реальности.
Согласованность меток:
Положительные стороны: основной целевой признак представлен четко.
Ограничения: метки столбца 'Engine volume' могли быть представлены числовыми параметрами объема двигателя, и 'Leather interior' мог быть числовым столбцом со значениями 0 и 1, что было бы удобнее.
3) Вариант 21. Данные о клиентах¶
Информативность:
Положительные стороны: набор включает множество характеристик клиентов, что позволит решить широкий спектр задач.
Ограничения: названия столбцов не явно названы, что может усложнить работу с набором.
Степень покрытия:
Положительные стороны: покрывает довольно большое количество характеристик о клиентах.
Ограничения: может не покрывать некоторые системные данные, такие как последний вход в учетную запись, последние изменение аккаунта и т.д.
Соответствие реальным данным:
Положительные стороны: данные хорошо описывают основные характеристики клиентов, по которым можно выстраивать маркетинговую стратегию для конкретного клиента.
Ограничения: устаревшие данные о пользователях могу не отражать текущую актуальную информацию о пользователе.
Согласованность меток:
Положительные стороны: столбцы 'Education' и 'Marital_Status' согласованы и не содержат явных ошибок.
Ограничения: возможны дубликаты в текстовых данных.
'''
Так как пустые значения есть только в наборе данных по экономике стран, то все три метода устранения пропущенных данных будут проведены на данном наборе.
'''
df_deleting_method = df_economic.copy()
df_const_method = df_economic.copy()
df_avg_method = df_economic.copy()
print_header('Устранение пропущенных данных удалением')
df_deleting_method = df_deleting_method.dropna(subset = 'index price')
print(f'Было рядов с пустыми значениями: {df_economic.shape[0]}')
print(f'Стало рядов без пустых значений: {df_deleting_method.shape[0]}')
print_header('Устранение пропущенных данных подстановкой константного значения')
for column in df_const_method.columns:
column_type = df_const_method[column].dtype
if column_type == 'number':
const = 123
elif column_type == 'float64':
const = 123.0
else:
const = '123'
df_const_method.fillna({column: const}, inplace = True)
print('Было:\n')
df_economic.info()
print('\nСтало:\n')
df_const_method.info()
print_header('Устранение пропущенных данных подстановкой среднего значения')
for column in df_avg_method.select_dtypes(include='number').columns.tolist():
mean = df_avg_method[column].mean()
df_avg_method.fillna({column: mean}, inplace = True)
print(f'Среднее значение по столбцу {column} = {mean}')
print('\nБыло:\n')
df_economic.info()
print('\nСтало:\n')
df_avg_method.info()
split_data_info(df = df_customer_data.copy(), stratify_column = 'Education')
split_data_info(df = df_car_price.copy(), stratify_column = 'Fuel type')
split_data_info(df = df_economic, stratify_column = 'country')
ada_customer = ADASYN()
df_train_customer = df_customer_data.drop(columns = ['Education', 'Marital_Status', 'Dt_Customer']).copy()
for column in df_train_customer.select_dtypes(include='number').columns.tolist():
mean = df_train_customer[column].mean()
df_train_customer.fillna({column: mean}, inplace = True)
print_header(f'Обучающая выборка: {df_train_customer.shape}')
print(df_train_customer['Kidhome'].value_counts())
X_resampled_customer, y_resampled_customer = ada_customer.fit_resample(df_train_customer, df_train_customer['Kidhome'].astype('int'))
df_train_adasyn_customer = pd.DataFrame(X_resampled_customer)
print_header(f'Обучающая выборка после oversampling: {df_train_adasyn_customer.shape}')
print(df_train_adasyn_customer['Kidhome'].value_counts())
ada_economic = ADASYN()
df_train_economic = df_economic.drop(columns = ['country', 'stock index']).copy()
for column in df_train_economic.select_dtypes(include='number').columns.tolist():
mean = df_train_economic[column].mean()
df_train_economic.fillna({column: 1}, inplace = True)
df_train_economic = df_train_economic.drop(df_train_economic[df_train_economic['unemploymentrate'] == 0.190000].index)
df_train_economic = df_train_economic.drop(df_train_economic[df_train_economic['unemploymentrate'] == 0.240000].index)
df_train_economic = df_train_economic.drop(df_train_economic[df_train_economic['unemploymentrate'] == 0.25000].index)
df_train_economic = df_train_economic.drop(df_train_economic[df_train_economic['unemploymentrate'] == 0.26000].index)
print_header(f'Обучающая выборка: {df_train_economic.shape}')
print(df_train_economic['unemploymentrate'].value_counts())
X_resampled_economic, y_resampled_economic = ada_economic.fit_resample(df_train_economic, df_train_economic['unemploymentrate'].astype('int'))
df_train_adasyn_economic = pd.DataFrame(X_resampled_economic)
print_header(f'Обучающая выборка после oversampling: {df_train_adasyn_economic.shape}')
print(df_train_adasyn_economic['unemploymentrate'].value_counts())
ada_car = ADASYN()
df_train_car = df_car_price.drop(columns = ['Levy', 'Manufacturer', 'Model', 'Category', 'Leather interior','Fuel type','Engine volume','Cylinders','Gear box type','Drive wheels','Doors','Wheel','Color','Airbags']).copy()
df_train_car['Mileage'] = df_train_car['Mileage'].str.replace(' km', '').astype(int)
df_train_car.loc[(df_train_car['Price'] < 5000) & (df_train_car['Price'] >= 0), 'Price'] = 0
df_train_car.loc[(df_train_car['Price'] < 10000) & (df_train_car['Price'] >= 5000), 'Price'] = 1
df_train_car.loc[df_train_car['Price'] >= 10000, 'Price'] = 2
print_header(f'Обучающая выборка: {df_train_car.shape}')
print(df_train_car['Price'].value_counts())
X_resampled_car, y_resampled_car = ada_car.fit_resample(df_train_car, df_train_car['Price'].astype('int'))
df_train_adasyn_car = pd.DataFrame(X_resampled_car)
print_header(f'Обучающая выборка после oversampling: {df_train_adasyn_car.shape}')
print(df_train_adasyn_car['Price'].value_counts())