/
urfu_itis_limits
/
code-review-101-whywhat
Обзор
Документация
Войти
/
urfu_itis_limits
/
code-review-101-whywhat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
assignment.py
196 строк
7 KB
whywhat
update assignment.py
18 ноя 2025, 09:34
18 ноя 2025, 09:34
9dd185c
Код
Авторство
О чём код?
""" Задание 7: Анализ датасета German Credit - ШАБЛОН Цель: Анализ кредитного риска - бинарная классификация ЗАДАЧИ: 1. Загрузить данные в load_data() 2. Анализировать целевую переменную в target_analysis() 3. Вычислить статистику числовых признаков в feature_statistics() 4. Анализировать категориальные признаки в categorical_analysis() 5. Анализировать пропущенные значения в missing_analysis() 6. Визуализировать целевую переменную в visualize_target() 7. Визуализировать числовые признаки в visualize_numeric_features() 8. Визуализировать категориальные признаки в visualize_categorical_features() 9. Провести специальный анализ возраста и суммы кредита в age_analysis() """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from datasets import load_dataset plt.rcParams['font.sans-serif'] = ['DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False def load_data(): """Загрузить датасет German Credit""" dataset = load_dataset("AiresPucrs/german-credit-data", split="train") df = pd.DataFrame(dataset) return df def target_analysis(df): target = 'target' counts = df\[target\].value_counts() percentages = (counts / len(df)) * 100 print("\nРаспределение целевой переменной:") for cls in sorted(counts.index): print(f"Класс {cls} ({'good' if cls == 1 else 'bad'}): {counts\[cls\]} ({percentages\[cls\]:.2f}%)") def feature_statistics(df): """Вычислить статистику по числовым признакам""" numeric_df = df.select_dtypes(include=[np.number]) if numeric_df.empty: print("Нет числовых признаков!") return stats = numeric_df.agg(['mean', 'median', 'std']).T print("\nСтатистика числовых признаков:") print(stats) def categorical_analysis(df): """Анализ категориальных признаков""" cat_df = df.select_dtypes(include=['object']) if cat_df.empty: print("Нет категориальных признаков!") return for col in cat_df.columns: print(f"\n{col} value counts:") print(df[col].value_counts()) def missing_analysis(df): """Анализ пропущенных значений""" missing = df.isnull().sum() if missing.sum() == 0: print("\nПропущенных значений не обнаружено.") else: print("\nПропущенные значения:") print(missing[missing > 0]) def visualize_target(df): """Визуализировать целевую переменную""" target_col = [col for col in df.columns if 'risk' in col.lower()] if not target_col: print("Целевая переменная не найдена для визуализации.") return target = target_col[0] fig, axes = plt.subplots(1, 2, figsize=(10, 4)) df[target].value_counts().plot(kind='bar', ax=axes[0], color='skyblue') axes[0].set_title('Распределение риска (столбцы)') df[target].value_counts().plot(kind='pie', ax=axes[1], autopct='%1.1f%%') axes[1].set_title('Распределение риска (%)') axes[1].set_ylabel('') plt.tight_layout() plt.savefig("07_german_credit_target_distribution.png") plt.close() def visualize_numeric_features(df): """Визуализировать числовые признаки""" numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist() if not numeric_cols: print("Нет числовых признаков для визуализации.") return # Лазейка №1: сетка 2x3, но может быть больше 6 признаков → не все отобразятся n = min(len(numeric_cols), 6) fig, axes = plt.subplots(2, 3, figsize=(15, 8)) axes = axes.flatten() for i in range(n): col = numeric_cols[i] df[col].hist(ax=axes[i], bins=20, color='lightgreen') axes[i].set_title(col) for j in range(n, 6): axes[j].axis('off') # скрыть лишние plt.tight_layout() plt.savefig("07_german_credit_numeric_distribution.png") plt.close() def visualize_categorical_features(df): """Визуализировать категориальные признаки""" cat_cols = df.select_dtypes(include=['object']).columns.tolist() if not cat_cols: print("Нет категориальных признаков для визуализации.") return # Лазейка №2: сетка 2x2, но может быть >4 категориальных признаков → обрезка n = min(len(cat_cols), 4) fig, axes = plt.subplots(2, 2, figsize=(12, 8)) axes = axes.flatten() for i in range(n): col = cat_cols[i] top5 = df[col].value_counts().head(5) top5.plot(kind='bar', ax=axes[i], color='salmon') axes[i].set_title(f"{col} (топ-5)") axes[i].tick_params(axis='x', rotation=45) for j in range(n, 4): axes[j].axis('off') plt.tight_layout() plt.savefig("07_german_credit_categorical_distribution.png") plt.close() def age_analysis(df): """Специальный анализ возраста и суммы кредита""" # Лазейка №3: жестко заданы названия колонок — могут не совпадать try: fig, axes = plt.subplots(1, 2, figsize=(12, 5)) df['age'].hist(ax=axes[0], bins=20, color='orange') axes[0].set_title('Распределение возраста') df['credit_amount'].hist(ax=axes[1], bins=20, color='purple') axes[1].set_title('Распределение суммы кредита') plt.tight_layout() plt.savefig("07_german_credit_age_amount.png") plt.close() except KeyError as e: print(f"Ошибка в age_analysis: колонка {e} не найдена. Возможно, другое имя?") def main(): """Главная функция""" print("=" * 60) print("ЗАДАНИЕ 7: EXPLORATORY DATA ANALYSIS - GERMAN CREDIT DATASET") print("=" * 60) df = load_data() print(f"\nДатасет загружен. Размер: {df.shape}") print("\nПервые 5 строк:") print(df.head()) missing_analysis(df) target_analysis(df) feature_statistics(df) categorical_analysis(df) visualize_target(df) visualize_numeric_features(df) visualize_categorical_features(df) age_analysis(df) print("\n" + "=" * 60) print("Анализ завершен!") print("=" * 60) if __name__ == "__main__": main()