437 KiB
Customer Personality Analysis https://www.kaggle.com/datasets/imakash3011/customer-personality-analysis Набор представляет собой данные о покупателях Пример цели: Узнать, кто больше всего покупает продукцию (вино) Входные данные: год рождения, степень образования, статус отношений, сколько детей, сколько подростков, сколько было потрачено на вино
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv(".//static//csv//ds_salaries.csv")
print(df.columns)
# Визуализация данных - ящик с усами. Как видим - выборка относительно сбалансирована, есть среднее смещение в среднюю сторону, медиана уравновешена
plt.figure(figsize=(10, 6))
sns.boxplot(x=df["salary_in_usd"])
plt.title("Box Plot для salary_in_usd")
plt.xlabel("salary_in_usd")
plt.show()
# Визуализируем отношение размера компании и зарплаты
plt.figure(figsize=(10, 6))
plt.scatter(df["salary_in_usd"], df["experience_level"])
plt.xlabel("salary_in_usd")
plt.ylabel("experience_level")
plt.title("salary in usd vs experience_level")
plt.show()
# Есть шумы, убираем
# Статистический анализ для определения выбросов
Q1 = df["salary_in_usd"].quantile(0.25)
Q3 = df["salary_in_usd"].quantile(0.75)
IQR = Q3 - Q1
# Определение порога для выбросов
threshold = 1.5 * IQR
outliers = (df["salary_in_usd"] < (Q1 - threshold)) | (
df["salary_in_usd"] > (Q3 + threshold)
)
# Вывод выбросов
print("Выбросы:")
print(df[outliers])
# Обработка выбросов
# В данном случае мы уберем выбросы
median_salary = df["salary_in_usd"].median()
df.loc[outliers, "salary_in_usd"] = 0
df = df[df.salary_in_usd != 0]
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df["salary_in_usd"], df["experience_level"])
plt.xlabel("salary_in_usd")
plt.ylabel("experience_level")
plt.title("salary in usd vs experience_level")
plt.show()
Теперь создадим выборки.
from sklearn.model_selection import train_test_split
# Загрузка данных
train_df = pd.read_csv(".//static//csv//train_data.csv")
val_df = pd.read_csv(".//static//csv//val_data.csv")
test_df = pd.read_csv(".//static//csv//test_data.csv")
# Разделение на обучающую и тестовую выборки
train_df, test_df = train_test_split(df, 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["salary_in_usd"].value_counts()
print(f"Распределение salary_in_usd в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
from imblearn.over_sampling import RandomOverSampler
def oversample(df):
X = df.drop("salary_in_usd", axis=1)
y = df["salary_in_usd"]
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
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
check_balance(train_df_oversampled, "обучающей выборке после oversampling")
check_balance(val_df_oversampled, "контрольной выборке после oversampling")
check_balance(test_df_oversampled, "тестовой выборке после oversampling")
Forbes Billionaires Database
https://www.kaggle.com/datasets/surajjha101/forbes-billionaires-data-preprocessed Список биллионеров форбс Использование: Узнать, когда же разбогатеешь Входные данные: Имя, Возраст, Страна, компания, Индустрия
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv(".//static//csv//Forbes Billionaires.csv")
print(df.columns)
Анализируем датафрейм при помощи "ящика с усами". Естьсмещение в сторону меньших значений, это можно исправить при помощи oversampling и undersampling.
import matplotlib.pyplot as plt
import seaborn as sns
# Box plot для столбца Age
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['Age'])
plt.title('Box Plot для Age')
plt.xlabel('Age')
plt.show()
# Имеется смещение в меньшую сторону, в том числе и медианное
df_cleaned = df.dropna()
plt.figure(figsize=(10, 6))
plt.scatter(df["Age"], df["Networth"])
plt.xlabel("Age")
plt.ylabel("Networth")
plt.title("Scatter Plot of Age vs Networth")
plt.show()
# уберем шумы
# Статистический анализ для определения выбросов
Q1 = df["Age"].quantile(0.25)
Q3 = df["Age"].quantile(0.75)
IQR = Q3 - Q1
# Определение порога для выбросов
threshold = 1.5 * IQR
outliers = (df["Age"] < (Q1 - threshold)) | (
df["Age"] > (Q3 + threshold)
)
# Вывод выбросов
print("Выбросы:")
print(df[outliers])
# Обработка выбросов
# В данном случае мы занулим выбросы
median_charge = df["Age"].median()
df.loc[outliers, "Age"] = 0
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df["Age"], df["Networth"])
plt.xlabel("Age")
plt.ylabel("Networth")
plt.title("Scatter Plot of Age vs Networth")
plt.show()
Разбиение набора данных на обучающую, контрольную и тестовую выборки
from sklearn.model_selection import train_test_split
# Разделение на обучающую и тестовую выборки
train_df, test_df = train_test_split(df_cleaned, 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['Age'].value_counts()
print(f"Распределение Age в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Используем oversample
from imblearn.over_sampling import RandomOverSampler
def oversample(df):
X = df.drop('Age', axis=1)
y = df['Age']
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
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
check_balance(train_df_oversampled, "обучающей выборке после oversampling")
check_balance(val_df_oversampled, "контрольной выборке после oversampling")
check_balance(test_df_oversampled, "тестовой выборке после oversampling")
100 Highest-Valued Unicorns¶
https://www.kaggle.com/datasets/ankanhore545/100-highest-valued-unicorns Самые взлетевшие компании. Цель: создать свою супер-компанию Входные данные: Название компании, оценочная стоимость, страна, штат, город, индустрия, год основания, имя основателя, количество работников
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv(".//static//csv//healthcare-dataset-stroke-data.csv", sep=",")
df["age"] = df["age"].astype(int)
print(df)
df["age"].dtype
print(df.columns)
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.boxplot(x=df["bmi"])
plt.title('Box Plot для bmi')
plt.xlabel('')
plt.show()
import matplotlib.pyplot as plt
import seaborn as sns
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df["bmi"], df["avg_glucose_level"])
plt.xlabel("bmi")
plt.ylabel("avg_glucose_level")
plt.title("Scatter Plot of BMI vs avg_glucose_level")
plt.show()
Удаление строк с пустыми значениями
df_cleaned = df.dropna()
df_cleaned = df_cleaned.loc[df_cleaned["bmi"] != "N/A"]
# уберем шумы
# Статистический анализ для определения выбросов
Q1 = df["bmi"].quantile(0.25)
Q3 = df["bmi"].quantile(0.75)
IQR = Q3 - Q1
# Определение порога для выбросов
threshold = 1.5 * IQR
outliers = (df["bmi"] < (Q1 - threshold)) | (df["bmi"] > (Q3 + threshold))
# Вывод выбросов
print("Выбросы:")
print(df[outliers])
# Обработка выбросов
# В данном случае мы занулим выбросы на медиану
median = df["bmi"].median()
df.loc[outliers, "bmi"] = median
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df["bmi"], df["avg_glucose_level"])
plt.xlabel("bmi")
plt.ylabel("avg_glucose_level")
plt.title("Scatter Plot of BMI vs avg_glucose_level")
plt.show()
Разбиение набора данных на обучающую, контрольную и тестовую выборки
Применение методов приращения данных (аугментации)
from imblearn.over_sampling import RandomOverSampler
from sklearn.model_selection import train_test_split
# Разделение на обучающую и тестовую выборки
train_df, test_df = train_test_split(df_cleaned, 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["age"].value_counts()
print(f"Распределение в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
def oversample(df):
X = df.drop("age", axis=1)
y = df["age"]
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
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
check_balance(train_df_oversampled, "обучающей выборке после oversampling")
check_balance(val_df_oversampled, "контрольной выборке после oversampling")
check_balance(test_df_oversampled, "тестовой выборке после oversampling")
from imblearn.over_sampling import RandomOverSampler
def oversample(df):
X = df.drop("age", axis=1)
y = df["age"]
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
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
check_balance(train_df_oversampled, "обучающей выборке после oversampling")
check_balance(val_df_oversampled, "контрольной выборке после oversampling")
check_balance(test_df_oversampled, "тестовой выборке после oversampling")