494 KiB
1) Информация о наборе данных о возрасте¶
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("AgeDataset-V1.csv")
sampled_df = df.sample(frac=0.4)
print(df.columns)
print(df)
Столбцы на русском:¶
Id
- идентификатор - страна
Name
- Полное имя
Short description
- Краткое описание
Gender
- пол
Country
- Страна / исторический регион
Occupation
- Название профессии
Birth year
- Год рождения
Death year
- Год смерти
Manner of death
- Способ смерти
Age of death
- Возраст смерти
df.info()
df.head()
Объект наблюдения жизнь людей содержит такие данные как дата рождения, дата смерти причина смерти профессия и тп
plt.figure(figsize=(10, 6))
df1 = df[df['Birth year'] >= 0]
plt.scatter(df1['Birth year'], df1['Age of death'], c=df1['Age of death'], alpha=0.6)
plt.title("Диаграмма 1")
plt.ylabel("Возраст смерти")
plt.xlabel("Дата рождения")
plt.grid(visible=True)
plt.show()
Анализируем датафрейм при помощи "ящика с усами". Есть смещение в сторону больших значений, это можно исправить при помощи oversampling и undersampling.
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['Birth year'])
plt.title('Box Plot для Birth year')
plt.xlabel('Birth year')
plt.show()
Есть выбросы.
# Статистический анализ для определения выбросов
df = df[df['Birth year'] > 0]
Q1 = df['Birth year'].quantile(0.25)
Q3 = df['Birth year'].quantile(0.75)
IQR = Q3 - Q1
# Определение порога для выбросов
threshold = 1.5 * IQR
outliers = (df['Birth year'] < (Q1 - threshold)) | (df['Birth year'] > (Q3 + threshold))
# Вывод выбросов
print("Выбросы:")
print(df[outliers])
# Обработка выбросов
# В данном случае мы заменим выбросы на медианное значение
median_review_no = df['Birth year'].median()
df.loc[outliers, 'Birth year'] = median_review_no
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['Birth year'])
plt.title('Box Plot для Birth year')
plt.xlabel('Birth year')
plt.show()
import pandas as pd
# Количество пустых значений признаков
print(df.isnull().sum())
print()
# Есть ли пустые значения признаков
print(df.isnull().any())
print()
# Процент пустых значений признаков
for i in df.columns:
null_rate = df[i].isnull().sum() / len(df) * 100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
# Замена пустых данных на медиану
df["Birth year"] = df["Birth year"].fillna(df["Birth year"].median())
df["Death year"] = df["Death year"].fillna(df["Death year"].max())
df["Age of death"] = df["Age of death"].fillna(df["Death year"] - df["Birth year"] + 1)
# Процент пустых значений признаков
for i in df.columns:
null_rate = df[i].isnull().sum() / len(df) * 100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
Manner of death имеет слишком много пустых значений Age of death считается из других полей
в выборке их лучше исключить
# Функция для создания выборок
from sklearn.model_selection import train_test_split
dropna_df = df.dropna()
df_input = dropna_df[["Id", "Gender", "Country", "Birth year", "Death year"]].query('Gender == "Male" or Gender == "Female"')
#[["Gender"] == "Male" or ["Gender"] == "Female"]
train_df, temp_df = train_test_split(df_input, test_size=0.4, random_state=42)
# Разделение остатка на контрольную и тестовую выборки
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
# Сохранение выборок в файлы
train_df.to_csv(".//static//csv//train_data.csv", index=False)
val_df.to_csv(".//static//csv//val_data.csv", index=False)
test_df.to_csv(".//static//csv//test_data.csv", index=False)
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")
# Оценка сбалансированности
def check_balance(df, name):
counts = df['Gender'].value_counts()
print(f"Распределение Gender в {name}:")
print(counts)
print(f"Процент Male: {counts['Male'] / len(df) * 100:.2f}%")
print(f"Процент Female: {counts['Female'] / len(df) * 100:.2f}%")
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Данные не сбалансированы: мужчин больше, чем женщин.
from sklearn.utils import resample
standard_data = df_input[df_input['Gender'] == 'Male']
free_data = df_input[df_input['Gender'] == 'Female']
# Уменьшение количества male до количества female
standard_undersampled = resample(standard_data,
replace=False, # выборка без замены
n_samples=len(free_data), # количество образцов для выборки
random_state=42) # для воспроизводимости
# Объединение данных обратно
df_input = pd.concat([standard_undersampled, free_data])
train_df, temp_df = train_test_split(df_input, test_size=0.4, random_state=42)
# Разделение остатка на контрольную и тестовую выборки
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
2) Образование студентов¶
df = pd.read_csv("StudentsPerformance.csv")
sampled_df = df.sample(frac=0.4)
print(df.columns)
df.info()
print(df.shape)
df.head()
# Количество пустых значений признаков
print(df.isnull().sum())
print()
# Есть ли пустые значения признаков
print(df.isnull().any())
print()
# Процент пустых значений признаков
for i in df.columns:
null_rate = df[i].isnull().sum() / len(df) * 100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['math score'])
plt.title('Box Plot для math score')
plt.xlabel('math score')
plt.show()
Есть выбросы
# Статистический анализ для определения выбросов
Q1 = df['math score'].quantile(0.25)
Q3 = df['math score'].quantile(0.75)
IQR = Q3 - Q1
# Определение порога для выбросов
threshold = 1.5 * IQR
outliers = (df['math score'] < (Q1 - threshold)) | (df['math score'] > (Q3 + threshold))
# Вывод выбросов
print("Выбросы:")
print(df[outliers])
# Обработка выбросов
# В данном случае мы заменим выбросы на медианное значение
median_review_no = df['math score'].median()
df.loc[outliers, 'math score'] = median_review_no
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['math score'])
plt.title('Box Plot для math score')
plt.xlabel('math score')
plt.show()
# Функция для создания выборок
from sklearn.model_selection import train_test_split
dropna_df = df.dropna()
df_input = dropna_df[["math score", "reading score", "writing score", "lunch"]]
train_df, temp_df = train_test_split(df_input, test_size=0.4, random_state=42)
# Разделение остатка на контрольную и тестовую выборки
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
# Сохранение выборок в файлы
train_df.to_csv(".//static//csv//train_data.csv", index=False)
val_df.to_csv(".//static//csv//val_data.csv", index=False)
test_df.to_csv(".//static//csv//test_data.csv", index=False)
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")
def check_balance(df, name):
counts = df['lunch'].value_counts()
print(f"Распределение lunch в {name}:")
print(counts)
print(f"Процент standard: {counts['standard'] / len(df) * 100:.2f}%")
print(f"Процент free/reduced: {counts['free/reduced'] / len(df) * 100:.2f}%")
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
standard_data = df_input[df_input['lunch'] == 'standard']
free_data = df_input[df_input['lunch'] == 'free/reduced']
# Уменьшение количества male до количества female
standard_undersampled = resample(standard_data,
replace=False, # выборка без замены
n_samples=len(free_data), # количество образцов для выборки
random_state=42) # для воспроизводимости
# Объединение данных обратно
df_input = pd.concat([standard_undersampled, free_data])
train_df, temp_df = train_test_split(df_input, test_size=0.4, random_state=42)
# Разделение остатка на контрольную и тестовую выборки
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
train_df.to_csv(".//static//csv//train_data.csv", index=False)
val_df.to_csv(".//static//csv//val_data.csv", index=False)
test_df.to_csv(".//static//csv//test_data.csv", index=False)
- Зарплаты
df = pd.read_csv("ds_salaries.csv")
sampled_df = df.sample(frac=0.4)
print(df.columns)
print(df)
df.info()
print(df.shape)
df.head()
# Количество пустых значений признаков
print(df.isnull().sum())
print()
# Есть ли пустые значения признаков
print(df.isnull().any())
print()
# Процент пустых значений признаков
for i in df.columns:
null_rate = df[i].isnull().sum() / len(df) * 100
if null_rate > 0:
print(f"{i} процент пустых значений: %{null_rate:.2f}")
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['salary_in_usd'])
plt.title('Box Plot для salary_in_usd')
plt.xlabel('math salary_in_usd')
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_review_no = df['salary_in_usd'].median()
df.loc[outliers, 'salary_in_usd'] = median_review_no
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()
# Функция для создания выборок
from sklearn.model_selection import train_test_split
dropna_df = df.dropna()
df_input = dropna_df[["salary_in_usd", "employee_residence", "company_size", "work_year", "company_location"]]
train_df, temp_df = train_test_split(df_input, test_size=0.4, random_state=42)
# Разделение остатка на контрольную и тестовую выборки
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
# Сохранение выборок в файлы
train_df.to_csv(".//static//csv//train_data.csv", index=False)
val_df.to_csv(".//static//csv//val_data.csv", index=False)
test_df.to_csv(".//static//csv//test_data.csv", index=False)
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")
def check_balance(df, name):
counts = df['company_size'].value_counts()
print(f"Распределение company_size в {name}:")
print(counts)
print(f"Процент L: {counts['L'] / len(df) * 100:.2f}%")
print(f"Процент M: {counts['M'] / len(df) * 100:.2f}%")
print(f"Процент S: {counts['S'] / len(df) * 100:.2f}%")
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Данные не сбалансированы