28 KiB
Загрузка датасетов и вывод информации
import pandas as pd
df = pd.read_csv("datasets_lab2/coffee.csv")
df2 = pd.read_csv("datasets_lab2/Stores.csv")
df3 = pd.read_csv("datasets_lab2/StudentsPerformance.csv")
df.info()
df2.info()
df3.info()
Проблемная область¶
Первый датасет coffee.csv позволяет спрогнозировать будущие показатели акций кофейни Starbucks. Второй датасет Stores.csv - магазины. Третий датасет StudentsPerformance.csv - успеваемость студентов на экзамене
Анализ набора данных¶
Объекты:
- Акции
- Магазины
- Успеваемость студентов Атрибуты:
- Дата; начальная цена за день; максимальная цена; минимальная цена; цена на момент закрытия продаж; скорректированая цена на момент закрытия; объем торговли акций за день.
- Идентификатор магазина; физическая площадь; кол-во доступных товаров; количество покупателей, посетивших магазины в среднем за месяц; продажив магазинах (в долларах США).
- Пол, раса/этническая принадлежность, уровень образования родителей, обед, курс подготовки к тестированию, оценка по математике, оценка по чтению, оценка по письму.
Бизнес цели¶
- Анализ показателей акций Starbucks — прогнозирование будущей стоимости акций для улучшения финансовых решений, предотвращения резких убытков и повышения прибыли.
- Оценка эффективности магазинов — понимание факторов, влияющих на успешность магазинов, включая выручку и посещаемость, что поможет принимать решения о возможном расширении сети или оптимизации текущей стратегии размещения.
- Анализ образовательной успеваемости студентов — выявление факторов, влияющих на академические успехи для разработки программ поддержки студентов.
Примеры целей технического проекта. Что поступает на вход, что является целевым признаком.¶
На входе будут переданы следующие датасеты, целевые признаки для каждого:
- coffee.csv — максимальная цена акций за день.
- Stores.csv — выручка магазина.
- StudentsPerformance.csv — общий средний балл (среднее значение по математике, чтению и письму).
Проблемы набора данных и их решения¶
- Устаревшие данные: Важно проверять актуальность данных, особенно для финансовых временных рядов и данных о магазинах. Для этого старые записи могут быть удалены или обновлены, если доступны более свежие данные.
- Выбросы: Необходимо выявить аномалии, такие как резкие изменения в ценах акций или посещаемости, и принять решение об их удалении или сглаживании, исходя из размера выборки.
Качество набора данных¶
Наборы данных содержат достаточно примеров и признаков для обучения модели. Учтены различные ситуации проблемной области. Данные соответствуют данным, которые будут подаваться в производственной среде. Все метки согласованы.
Поиск аномалий¶
print(df.describe())
print(df2.describe())
print(df3.describe())
При просмотре вывода не было замечено аномалий в столбцах датасетов.
Проблема пропущенных данных¶
print("Первый датасет coffee.csv")
for i in df.columns:
null_rate = df[i].isnull().sum() / len(df)*100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
print("Второй датасет Stores.csv")
for i in df2.columns:
null_rate = df2[i].isnull().sum() / len(df2)*100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
print("Третий датасет StudentsPerformance.csv")
for i in df3.columns:
null_rate = df3[i].isnull().sum() / len(df3)*100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
Во всех трех датасетах пустых значений не найдено, по наполненности датасеты удовлетворительны. Но можно добавить побольше столбцов в датасет магазинов.
В первом датасете coffee.csv удалим строки, где год ниже 2000.
df_filtered = df[df['Date'] > '2000-01-01']
print(df_filtered)
Во втором датасете Stores.csv всем магазинам поставим среднее значение площади.
store_area_mean = df2['Store_Area'].mean()
df2['Store_Area'] = store_area_mean
print(df2)
В третьем датасете StudentsPerformance.csv всем студентам сделаем ланч стандартным.
df3['lunch'] = 'standard'
print(df3)
from sklearn.model_selection import train_test_split
def split_stratified_into_train_val_test(
df_input,
stratify_colname="y",
frac_train=0.6,
frac_val=0.15,
frac_test=0.25,
random_state=None,
):
if frac_train + frac_val + frac_test != 1.0:
raise ValueError(
"fractions %f, %f, %f do not add up to 1.0"
% (frac_train, frac_val, frac_test)
)
if stratify_colname not in df_input.columns:
raise ValueError("%s is not a column in the dataframe" % (stratify_colname))
X = df_input # Contains all columns.
y = df_input[
[stratify_colname]
] # Dataframe of just the column on which to stratify.
# Split original dataframe into train and temp dataframes.
df_train, df_temp, y_train, y_temp = train_test_split(
X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state
)
# Split the temp dataframe into val and test dataframes.
relative_frac_test = frac_test / (frac_val + frac_test)
df_val, df_test, y_val, y_test = train_test_split(
df_temp,
y_temp,
stratify=y_temp,
test_size=relative_frac_test,
random_state=random_state,
)
assert len(df_input) == len(df_train) + len(df_val) + len(df_test)
return df_train, df_val, df_test
from sklearn.model_selection import train_test_split
train_df, temp_df = train_test_split(df, test_size=0.4, random_state=42)
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
train_df2, temp_df2 = train_test_split(df2, test_size=0.4, random_state=42)
val_df2, test_df2 = train_test_split(temp_df2, test_size=0.5, random_state=42)
train_df3, temp_df3 = train_test_split(df3, test_size=0.4, random_state=42)
val_df3, test_df3 = train_test_split(temp_df3, test_size=0.5, random_state=42)
print(f"Train df: {train_df.shape}, Validation df: {val_df.shape}, Test df: {test_df.shape}")
print(f"Train df2: {train_df2.shape}, Validation df2: {val_df2.shape}, Test df2: {test_df2.shape}")
print(f"Train df3: {train_df3.shape}, Validation df3: {val_df3.shape}, Test df3: {test_df3.shape}")
Было сделано разбиение на три выборки: 60%, 20% и 20% при помощи библиотеки scikit-learn и функции train_test_split. На взгляд сбалансированные
Приращение методами выборки с избытком (oversampling) и выборки с недостатком (undersampling)¶
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
df = pd.read_csv("datasets_lab2/coffee.csv")
df['High_category'] = pd.cut(df['High'], bins=[0.1, 20, 60, 105, float('inf')],
labels=['Low', 'Medium', 'High', 'Luxury'])
y = df['High_category']
X = df.drop(columns=['High', 'High_category'])
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X, y)
undersampler = RandomUnderSampler(random_state=42)
X_resampled_under, y_resampled_under = undersampler.fit_resample(X, y)
print("Выборка после oversampling (df):")
print(pd.Series(y_resampled).value_counts())
print("Выборка после undersampling (df):")
print(pd.Series(y_resampled_under).value_counts())
df2 = pd.read_csv("datasets_lab2/Stores.csv")
df2['Sales_category'] = pd.cut(df2['Store_Sales'], bins=[0, 50000, 100000, 200000, float('inf')],
labels=['Low', 'Medium', 'High', 'Luxury'])
y2 = df2['Sales_category']
X2 = df2.drop(columns=['Store_Sales', 'Sales_category'])
oversampler2 = RandomOverSampler(random_state=42)
X_resampled_2, y_resampled_2 = oversampler2.fit_resample(X2, y2)
undersampler2 = RandomUnderSampler(random_state=42)
X_resampled_2_under, y_resampled_2_under = undersampler2.fit_resample(X2, y2)
print("Выборка после oversampling (df2):")
print(pd.Series(y_resampled_2).value_counts())
print("Выборка после undersampling (df2):")
print(pd.Series(y_resampled_2_under).value_counts())
df3 = pd.read_csv("datasets_lab2/StudentsPerformance.csv")
df3['reading_score_category'] = pd.cut(df3['reading score'], bins=[0, 20, 50, 100, float('inf')],
labels=['Low', 'Medium', 'High', 'Luxury'])
y3 = df3['reading_score_category']
X3 = df3.drop(columns=['reading score', 'reading_score_category'])
oversampler3 = RandomOverSampler(random_state=42)
X_resampled_3, y_resampled_3 = oversampler3.fit_resample(X3, y3)
undersampler3 = RandomUnderSampler(random_state=42)
X_resampled_3_under, y_resampled_3_under = undersampler3.fit_resample(X3, y3)
print("Выборка после oversampling (df3):")
print(pd.Series(y_resampled_3).value_counts())
print("Выборка после undersampling (df3):")
print(pd.Series(y_resampled_3_under).value_counts())