/
urfu_itis_limits
/
code-review-101-nevers
Обзор
Документация
Войти
/
urfu_itis_limits
/
code-review-101-nevers
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
assignment.py
191 строка
7 KB
nevers
update assignment.py
18 ноя 2025, 14:57
18 ноя 2025, 14:57
60c5743
Код
Авторство
О чём код?
""" Задание 4: Анализ датасета Breast Cancer - ШАБЛОН Цель: Анализ данных рака груди - бинарная классификация ЗАДАЧИ: 1. Загрузить данные в load_data() 2. Вычислить распределение диагнозов в target_analysis() 3. Вычислить статистику признаков в feature_statistics() 4. Создать графики распределения целевой переменной в visualize_target() 5. Создать гистограммы первых 6 признаков в visualize_features() 6. Создать boxplots признаков по диагнозам в features_by_diagnosis() 7. Вычислить и визуализировать топ корреляции в correlation_analysis() """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_breast_cancer plt.rcParams['font.sans-serif'] = ['DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False def load_data(): """Загрузить датасет Breast Cancer и конвертировать в DataFrame""" data = load_breast_cancer() feature_df = pd.DataFrame(data.data, columns=data.feature_names) target_series = pd.Series(data.target, name="target") df = feature_df.copy() df["target"] = target_series df["diagnosis"] = df["target"].map({0: "malignant", 1: "benign"}) return df def target_analysis(df): """Анализ целевой переменной (тип опухоли)""" diagnosis_counts = df["diagnosis"].value_counts() print("\nРаспределение диагнозов (количество):") print(diagnosis_counts) diagnosis_percent = diagnosis_counts / len(df) * 100 print("\nРаспределение диагнозов (проценты):") print(diagnosis_percent.round(2)) benign_count = diagnosis_counts.get("benign", 0) malignant_count = diagnosis_counts.get("malignant", 0) print(f"\nДоброкачественных опухолей: {benign_count}") print(f"Злокачественных опухолей: {malignant_count}") def feature_statistics(df): """Вычислить статистику по признакам""" numeric_features = df.select_dtypes(include=[np.number]).columns first_three_features = numeric_features[:3] print("\nСтатистика первых 3 числовых признаков:") for feature in first_three_features: series = df[feature] mean_value = series.mean() std_value = series.std() min_value = series.min() max_value = series.max() print(f"\nПризнак: {feature}") print(f" Среднее: {mean_value:.2f}") print(f" Стандартное отклонение: {std_value:.2f}") print(f" Минимум: {min_value:.2f}") print(f" Максимум: {max_value:.2f}") def visualize_target(df): """Визуализировать распределение целевой переменной""" diagnosis_counts = df["diagnosis"].value_counts() plt.figure(figsize=(10, 4)) plt.subplot(1, 2, 1) sns.barplot(x=diagnosis_counts.index, y=diagnosis_counts.values) plt.title("Распределение диагнозов") plt.xlabel("Диагноз") plt.ylabel("Количество") plt.subplot(1, 2, 2) plt.pie( diagnosis_counts.values, labels=diagnosis_counts.index, autopct="%1.1f%%", startangle=90, ) plt.title("Диагнозы (в процентах)") plt.tight_layout() plt.savefig("04_cancer_target_distribution.png") plt.close() def visualize_features(df): """Визуализировать распределение первых 6 признаков""" numeric_features = df.select_dtypes(include=[np.number]).columns first_six_features = numeric_features[:6] fig, axes = plt.subplots(3, 2, figsize=(12, 10)) axes = axes.flatten() for idx, feature in enumerate(first_six_features): ax = axes[idx] df[feature].hist(ax=ax, bins=30) ax.set_title(feature) ax.set_xlabel("Значение") ax.set_ylabel("Частота") plt.tight_layout() plt.savefig("04_cancer_features_distribution.png") plt.close() def features_by_diagnosis(df): """Boxplot признаков по диагнозам""" numeric_features = df.select_dtypes(include=[np.number]).columns first_six_features = numeric_features[:6] fig, axes = plt.subplots(3, 2, figsize=(12, 10)) axes = axes.flatten() for idx, feature in enumerate(first_six_features): ax = axes[idx] sns.boxplot(x="diagnosis", y=feature, data=df, ax=ax) ax.set_title(feature) ax.set_xlabel("Диагноз") ax.set_ylabel("Значение") plt.tight_layout() plt.savefig("04_cancer_features_by_diagnosis.png") plt.close() def correlation_analysis(df): """Анализ корреляций""" if "diagnosis" in df.columns: corr_df = df.drop(columns=["diagnosis"]) else: corr_df = df.copy() corr_with_target = corr_df.corr()["target"].drop("target") corr_with_target_sorted = corr_with_target.sort_values(ascending=False) top_10 = corr_with_target_sorted.head(10) print("\nТоп 10 признаков по корреляции с целевой переменной:") print(top_10) top_k = corr_with_target_sorted.head(10) plt.figure(figsize=(10, 6)) plt.barh(top_k.index, top_k.values) plt.xlabel("Коэффициент корреляции с target") plt.title("Топ коррелирующих признаков с целевой переменной") plt.gca().invert_yaxis() plt.tight_layout() plt.savefig("04_cancer_correlation_top.png") plt.close() def main(): """Главная функция""" print("=" * 60) print("ЗАДАНИЕ 4: EXPLORATORY DATA ANALYSIS - BREAST CANCER DATASET") print("=" * 60) df = load_data() print(f"\nДатасет загружен. Размер: {df.shape}") print("\nПервые 5 строк:") print(df.head()) target_analysis(df) feature_statistics(df) visualize_target(df) visualize_features(df) features_by_diagnosis(df) correlation_analysis(df) print("\n" + "=" * 60) print("Анализ завершен!") print("=" * 60) if __name__ == "__main__": main()