24 KiB
Лабораторная работа 2¶
1. Загружаем три датасета
import pandas as pd
df = pd.read_csv(".//datasetlab2//kc_house_data.csv", sep=",")
df2 = pd.read_csv(".//datasetlab2//Stores.csv", sep=",")
df3 = pd.read_csv(".//datasetlab2//Forbes Billionaires.csv", sep=",")
2. Проблемные области:
stores.csv - магазины
kc_house_data.csv - продажа домов
Forber Billionares.csv - миллионеры
3. Объекты:
Объектами наблюдениями явлются магазины, дома и миллионеры.
Связи между объектами нет, единственная схожесть - магазин и дом являются зданиями.
4. Примеры бизнес-целей:
Датасет миллионеров нужны например для сайта forbes - чтобы составить тир лист. В целом, другие датасеты тоже подходят для составления тир листа)
5. Примеры целей технического проекта:
Технический проект - тир лист, на входе датасет
6. Проблемы выбранных наборов данных:
Пункт будем выполнять в коде, оставлю к каждому комменты:
# Проверка на пропущенные значения
print(df.isnull().sum())
print(df2.isnull().sum())
print(df3.isnull().sum())
# Статистика по числовым данным для выявления аномальных распределений
print(df.describe())
print(df2.describe())
print(df3.describe())
7. Примеры решения обнаруженных проблем
После проверки на пропущенные значения выявлено, что все супео.
А дальше обнаружилась аномалию: в датасете миллионеров есть столбец networth - чистое количество денег во всех формах ( в миллиардах ), там минимальное значение = 1, медиана в районе 2.4, а максимальное - 219
8. Оценить качество каждого набора данных:
Наши датасеты довольно информационные. Например у миллионер датасета можно посмотреть фио, сколько у него денег, что он сделал.
Датасет по продаже домов гораздо информационнее, является лидером по наполненности и соответствует реальности.
А вот датасет магазинов слабоват, можно например добавить: количество филлиалов, работников, прибыль
9. Устранить проблему пропущенных данных
Возьмём датасет магазинов, будем удалять столбцы, где площадь ниже 2130
df2_filtered = df2[df2['Store_Area'] >= 2130]
print(df2_filtered)
Теперь в датасете магазнов price заменим у всех на константное значение - 1 500 000
df['price'] = 1500000
print(df)
Теперь у миллионеров в networth подставим среднее по столбцу:
networth_mean = df3['Networth'].mean()
df3['Networth'] = networth_mean
print(df3[['Networth']])
10. Выполнить разбиение каждого набора данных
Делаем разбиение на три выборки: 70%, 15% и 15%.
Подключил библиотеку scikit-learn и использовал функцию train_test_split
from sklearn.model_selection import train_test_split
train_df, temp_df = train_test_split(df, test_size=0.3, 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.3, 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.3, 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}")
11. Оценить сбаланисрованность
Из пункта 15 понимаем что все сбалансированные
12. Выполнить приращение данных
Скачал библиотеку imbalanced-learn, использую разные функции
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
df = pd.read_csv(".//datasetlab2//kc_house_data.csv", sep=",")
df['price_category'] = pd.cut(df['price'], bins=[0, 300000, 600000, 1000000, float('inf')],
labels=['Low', 'Medium', 'High', 'Luxury'])
y = df['price_category']
X = df.drop(columns=['price', 'price_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("Class distribution after oversampling (df):")
print(pd.Series(y_resampled).value_counts())
print("Class distribution after undersampling (df):")
print(pd.Series(y_resampled_under).value_counts())
df3 = pd.read_csv(".//datasetlab2//Forbes Billionaires.csv", sep=",")
df3['AGE_category'] = pd.cut(df3['Age'], bins=[0, 30, 50, 70, float('inf')],
labels=['Young', 'Middle-aged', 'Senior', 'Elderly'])
y3 = df3['AGE_category']
X3 = df3.drop(columns=['Age', 'AGE_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("Class distribution after oversampling (df3):")
print(pd.Series(y_resampled_3).value_counts())
print("Class distribution after undersampling (df3):")
print(pd.Series(y_resampled_3_under).value_counts())
df2 = pd.read_csv(".//datasetlab2//Stores.csv", sep=",")
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("Class distribution after oversampling (df2):")
print(pd.Series(y_resampled_2).value_counts())
print("Class distribution after undersampling (df2):")
print(pd.Series(y_resampled_2_under).value_counts())