22 KiB
Lab2 Pibd-31 Sagirov M M¶
Загрузка трёх датасетов¶
import pandas as pd
df = pd.read_csv("..//datasets//Lab_2//world-population-by-country-2020.csv", sep=",")
df2 = pd.read_csv("..//datasets//Lab_2//Starbucks Dataset.csv", sep=",")
df3 = pd.read_csv("..//datasets//Lab_2//students_adaptability_level_online_education.csv", sep=",")
Пункты 2-8 представленны далее в виде Markdown:¶
Пункт 2 - Проблемные области:¶
df - Население планеты
df2 - Акции Starbucks
df3 - Эффективность онлайн обучения
Пункт 3 - Объекты, их аттрибуты и связи:¶
df - Объектом наблюдения является Страна. Имеет в себе аттрибуты такие как: место в списке, название, население на 2020 год, изменение за год, процентное изменение, плотность населения, а так же процент мигрантов и рождаемость.
df2 - Объектом наблюдения является Акция. Имеет в себе аттрибуты такие как: дата торговли, цена на открытие биржи, высшая и низшая цена за день, цена на закрытии и объем торговли.
df3 - Объектом наблюдения является Студент. Имеет в себе аттрибуты такие как: Уровень образования, тип обучения (платно/бесплатно), пол, возраст, расположение, финансовое состояние и уровень адаптируемости к онлайн обучению.
Связей между объектами нет.
Пункт 4 - Бизнес-цели:¶
df - Для составления списка приоритетных стран для показа рекламы для миграции.
df2 - Для выявления тенденций Акций Starbucks.
df3 - Для решения о целесообразности введения онлайн обучения в учереждении.
Пункт 5 - Цели проектов:¶
df - Поступает нужны процент мигрантов, а на выходе страны с подходящим числом мигрантов.
df2 - Поступает высшая стоимость сегодняшней акции, а на выходе предполагаемый процент завтра.
df3 - Поступает список студентов с их состояниями, а на выходе вердикт оправдает ли себя ввод онлайн обучения.
Пункт 6 - Проблемы наборов:¶
Проверка на пропущенные значения:¶
print(df.isnull().sum())
print(df2.isnull().sum())
print(df3.isnull().sum())
Как можно заметить, пустых данных почти нет, 34 пустых ячейки есть только в df в столбце с процентами мигрантов
df и df2 - неактуальные, так как в первом используется информация 4-х летней давности, а во втором - с 1992.
Пункт 7 - Примеры решений:¶
Для обоих датасетов решением будет полное обновление данных.
Пункт 8 - Оценка качества:¶
Информативность лучше всего у df и df3, так же как и степень покрытия. Реальным данным соответствует очень хорошо df2. Во всех датасетах метки хорошо согласованны.
Пункт 9 - Устранение пустых данных:¶
Устраним пустые данные в df путем удаления строк, в которых они присутствуют
df['Migrants (net)'] = df['Migrants (net)'].replace('', pd.NA)
df_cleaned = df.dropna(subset=['Migrants (net)'])
df_cleaned.to_csv("..//datasets//Lab_2//World_population_cleaned.csv", index=False)
А теперь просто проведем действия с оставшимися наборами данных:
В df2 поставим у всех записей цену при открытии на 12
df2['Open'] = 12
print(df2)
В df3 установим у всех средний по столбцу возраст
Age_mean = df3['Age'].mean()
df3['Age'] = Age_mean
print(df3[['Age']])
Пункт 10 - Разбиение¶
from sklearn.model_selection import train_test_split
train_df, temp_df = train_test_split(df_cleaned, test_size=0.3, random_state=22)
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=22)
train_df2, temp_df2 = train_test_split(df2, test_size=0.3, random_state=22)
val_df2, test_df2 = train_test_split(temp_df2, test_size=0.5, random_state=22)
train_df3, temp_df3 = train_test_split(df3, test_size=0.3, random_state=22)
val_df3, test_df3 = train_test_split(temp_df3, test_size=0.5, random_state=22)
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 - Проверка на сбалансированность¶
#Проверка на сбалансированность
def check_balance(df, target_column):
distribution = df[target_column].value_counts(normalize=True) * 100
print(f"Распределение по столбцу '{target_column}':\n", distribution)
# Для датасета 1
print("Баланс Train df:")
check_balance(train_df, 'Migrants (net)')
print("\nБаланс Validation df:")
check_balance(val_df, 'Migrants (net)')
print("\nБаланс Test df:")
check_balance(test_df, 'Migrants (net)')
# Для датасета 2
print("\nБаланс Train df2:")
check_balance(train_df2, 'High')
print("\nБаланс Validation df2:")
check_balance(val_df2, 'High')
print("\nБаланс Test df2:")
check_balance(test_df2, 'High')
# Для датасета 3
print("\nБаланс Train df3:")
check_balance(train_df3, 'Flexibility Level')
print("\nБаланс Validation df3:")
check_balance(val_df3, 'Flexibility Level')
print("\nБаланс Test df3:")
check_balance(test_df3, 'Flexibility Level')
Наши выборки сбалансированно распределены.
Пункт 12 - Приращение данных:¶
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
# Функция для выполнения oversampling
def apply_oversampling(X, y):
oversampler = RandomOverSampler(random_state=22)
X_resampled, y_resampled = oversampler.fit_resample(X, y)
print(f"Размер выборки после oversampling: {X_resampled.shape}")
return X_resampled, y_resampled
# Функция для выполнения undersampling
def apply_undersampling(X, y):
undersampler = RandomUnderSampler(random_state=22)
X_resampled, y_resampled = undersampler.fit_resample(X, y)
print(f"Размер выборки после undersampling: {X_resampled.shape}")
return X_resampled, y_resampled
# Пример для первого набора данных (df)
X_1 = train_df.drop(columns=['Migrants (net)'])
y_1 = train_df['Migrants (net)']
print("df - Oversampling:")
X_resampled1, y_resampled1 = apply_oversampling(X_1, y_1)
print("\ndf - Undersampling:")
X_resampled1_under, y_resampled1_under = apply_undersampling(X_1, y_1)
# Пример для второго набора данных (df2)
X_2 = train_df2.drop(columns=['Volume'])
y_2 = train_df2['Volume']
print("\ndf2 - Oversampling:")
X_resampled2, y_resampled2 = apply_oversampling(X_2, y_2)
print("\ndf2 - Undersampling:")
X_resampled2_under, y_resampled2_under = apply_undersampling(X_2, y_2)
# Пример для третьего набора данных (df3)
X_3 = train_df3.drop(columns=['Flexibility Level'])
y_3 = train_df3['Flexibility Level']
print("\ndf3 - Oversampling:")
X_resampled3, y_resampled3 = apply_oversampling(X_3, y_3)
print("\ndf3 - Undersampling:")
X_resampled3_under, y_resampled3_under = apply_undersampling(X_3, y_3)