/
desskas
/
course_work_all
Обзор
Документация
Войти
/
desskas
/
course_work_all
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
chapter1
201 строка
6 KB
desskas
Глава1
13 июн 2026, 12:16
Верифицирован
13 июн 2026, 12:16
b809d6e
Код
Авторство
О чём код?
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns #Загрузка данных columns = [ "age", "workclass", "fnlwgt", "education", "education-num", "marital-status", "occupation", "relationship", "race", "sex", "capital-gain", "capital-loss", "hours-per-week", "native-country", "income" ] df = pd.read_csv( "data/adult.data", names=columns, sep=",", skipinitialspace=True, na_values="?" ) numeric_cols = ["age", "fnlwgt", "education-num", "capital-gain", "capital-loss", "hours-per-week"] #1.2.1 Гистограммы df[numeric_cols].hist(figsize=(12, 8)) plt.show() #1.2.2 Seaborn (3 графика) plt.figure() sns.scatterplot(x="age", y="hours-per-week", data=df) plt.show() plt.figure() sns.boxplot(x="income", y="hours-per-week", data=df) plt.show() plt.figure() sns.scatterplot(x="education-num", y="hours-per-week", hue="income", data=df) plt.show() #1.2.3 Pyplot (2 графика) plt.figure() plt.scatter(df["age"], df["hours-per-week"]) plt.xlabel("age") plt.ylabel("hours-per-week") plt.show() plt.figure() plt.scatter(df["education-num"], df["hours-per-week"]) plt.xlabel("education-num") plt.ylabel("hours-per-week") plt.show() #1.2.4 Пропуски print("Пропуски:") print(df.isnull().sum()) #1.2.5 Тепловые карты plt.figure(figsize=(10, 6)) sns.heatmap(df[numeric_cols].corr(), annot=True, cmap="coolwarm") plt.show() plt.figure(figsize=(10, 6)) sns.heatmap(df.isnull(), cbar=False) plt.show() #1.2.6 Дубликаты print("Дубликаты:", df.duplicated().sum()) #1.2.7 Выбросы plt.figure(figsize=(10, 6)) sns.boxplot(data=df[numeric_cols]) plt.xticks(rotation=45) plt.show() #1.2.8 Фильтрация filtered1 = df[df["age"] > 50] filtered2 = df[(df["hours-per-week"] > 40) & (df["income"] == ">50K")] filtered3 = df[(df["education-num"] > 12) & (df["age"] < 30)] print("Filter1:", len(filtered1)) print("Filter2:", len(filtered2)) print("Filter3:", len(filtered3)) #1.2.9 Шум df_noise = df.copy() df_noise["age"] = df_noise["age"] + np.random.normal(0, 2, size=len(df_noise)) df_noise["hours-per-week"] = df_noise["hours-per-week"] + np.random.normal(0, 5, size=len(df_noise)) print(df_noise[["age", "hours-per-week"]].head()) #Визуализация шума (до/после) plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) sns.histplot(df["age"], bins=30) plt.title("До добавления шума") plt.subplot(1, 2, 2) sns.histplot(df_noise["age"], bins=30) plt.title("После добавления шума") plt.show() #1.2.10 Преобразование числовых данных в категориальные df["age_group"] = pd.cut( df["age"], bins=[0, 25, 40, 60, 100], labels=["молодые", "взрослые", "средний возраст", "пожилые"] ) print(df[["age", "age_group"]].head()) print(df["age_group"].value_counts()) sns.countplot(x="age_group", data=df) plt.title("Распределение возрастных групп") plt.show() #1.2.12 Повторная визуализация df_clean = df.dropna() df_clean[numeric_cols].hist(figsize=(12, 8)) plt.suptitle("Распределения после обработки данных") plt.show() #1.3.1 categorical_cols = [ "workclass", "education", "marital-status", "occupation", "relationship", "race", "sex", "native-country", "income" ] for col in categorical_cols: print(f"\n{col}:") print(df[col].unique()) #1.3.2 Диаграммы категориальных данных plt.figure() sns.countplot(x="sex", data=df) plt.title("Распределение по полу") plt.show() plt.figure() sns.countplot(x="income", data=df) plt.title("Распределение по уровню дохода") plt.show() plt.figure(figsize=(10, 5)) sns.countplot(x="education", data=df) plt.xticks(rotation=45) plt.title("Распределение по уровню образования") plt.show() #1.3.3 Преобразование категориальных данных в числовые # 1) Бинарное кодирование (income) df_encoded = df.copy() df_encoded["income_binary"] = df_encoded["income"].map({"<=50K": 0, ">50K": 1}) # 2) One-Hot Encoding (sex) df_encoded = pd.get_dummies(df_encoded, columns=["sex"], drop_first=True) print(df_encoded[["income", "income_binary"]].head()) print(df_encoded.filter(like="sex_").head()) #1.3.4 Агрегация данных # смотрим частоту стран country_counts = df["native-country"].value_counts() print(country_counts.head(10)) print(country_counts.tail(10)) # выделим редкие категории (меньше 100 наблюдений) rare_countries = country_counts[country_counts < 100].index df["country_group"] = df["native-country"].apply( lambda x: "Other" if x in rare_countries else x ) print(df["country_group"].value_counts().head()) #1.3.5 Введение новой категории def workload_category(row): if row["hours-per-week"] < 30: return "низкая занятость" elif row["hours-per-week"] <= 40: return "стандартная занятость" else: return "высокая занятость" df["workload_group"] = df.apply(workload_category, axis=1) print(df["workload_group"].value_counts()) sns.countplot(x="workload_group", data=df) plt.title("Распределение по типу занятости") plt.show()