/
urfu_itis_limits
/
code-review-101-tx0
Обзор
Документация
Войти
/
urfu_itis_limits
/
code-review-101-tx0
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
assignment.py
239 строк
9 KB
tx0
[r] improve docs
18 ноя 2025, 13:39
18 ноя 2025, 13:39
4ae1d6b
Код
Авторство
О чём код?
""" Задание 5: Анализ датасета California Housing - ШАБЛОН Цель: Анализ стоимости жилья в Калифорнии - регрессионная задача ЗАДАЧИ: 1. Загрузить данные в load_data() 2. Вычислить статистику целевой переменной в target_analysis() 3. Вычислить статистику всех признаков в feature_statistics() 4. Создать гистограмму и KDE график в visualize_target() 5. Создать гистограммы всех признаков в visualize_features() 6. Создать scatter plots всех признаков vs целевой переменной в scatter_features_vs_target() 7. Вычислить и визуализировать корреляции в correlation_analysis() """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import fetch_california_housing plt.rcParams['font.sans-serif'] = ['DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False # Константы для путей к изображениям """ Константы определяют пути к файлам изображений, создаваемым при анализе: - TARGET_DISTRIBUTION_PATH: гистограмма и KDE целевой переменной - FEATURES_DISTRIBUTION_PATH: гистограммы всех признаков - FEATURES_VS_TARGET_PATH: scatter plots признаков vs целевой переменной - CORRELATION_BARS_PATH: барплот корреляций признаков с целевой переменной """ TARGET_DISTRIBUTION_PATH = "05_housing_target_distribution.png" FEATURES_DISTRIBUTION_PATH = "05_housing_features_distribution.png" FEATURES_VS_TARGET_PATH = "05_housing_features_vs_target.png" CORRELATION_BARS_PATH = "05_housing_correlation_bars.png" def load_data(): """Загрузить датасет California Housing и конвертировать в DataFrame. Returns: pd.DataFrame: DataFrame с признаками и целевой переменной MedHouseVal """ data = fetch_california_housing() df = pd.DataFrame(data.data, columns=data.feature_names) # добавляем целевую переменную с именем MedHouseVal df['MedHouseVal'] = data.target return df def target_analysis(df): """Анализ целевой переменной (стоимость жилья). Вычисляет и выводит в консоль основные статистики целевой переменной: среднее, медиану, стандартное отклонение, минимум, максимум и квартили. Args: df (pd.DataFrame): DataFrame с колонкой MedHouseVal """ s = df['MedHouseVal'] mean = s.mean() median = s.median() std = s.std() minv = s.min() maxv = s.max() q25 = s.quantile(0.25) q50 = s.quantile(0.5) q75 = s.quantile(0.75) print("\nСтатистика целевой переменной (MedHouseVal):") print(f" mean : {mean:.4f}") print(f" median : {median:.4f}") print(f" std : {std:.4f}") print(f" min : {minv:.4f}") print(f" max : {maxv:.4f}") print(f" 25% : {q25:.4f}") print(f" 50% : {q50:.4f}") print(f" 75% : {q75:.4f}") def feature_statistics(df): """Вычислить статистику по признакам. Вычисляет и выводит в консоль статистики (mean, std, min, max) для всех признаков, исключая целевую переменную. Args: df (pd.DataFrame): DataFrame с признаками и целевой переменной """ features = [c for c in df.columns if c != 'MedHouseVal'] stats = df[features].agg(['mean', 'std', 'min', 'max']).T stats = stats.rename( columns={'mean': 'mean', 'std': 'std', 'min': 'min', 'max': 'max'}) print("\nСтатистика по признакам (mean, std, min, max):") print(stats) def visualize_target(df): """Визуализировать распределение целевой переменной. Создает фигуру с двумя графиками: - гистограмма с линией среднего значения - KDE (Kernel Density Estimation) график с линией среднего Сохраняет результат в файл TARGET_DISTRIBUTION_PATH. Args: df (pd.DataFrame): DataFrame с колонкой MedHouseVal """ s = df['MedHouseVal'] fig, axes = plt.subplots(1, 2, figsize=(12, 5)) # гистограмма + линия среднего sns.histplot(s, bins=30, ax=axes[0], color='skyblue', kde=False) axes[0].axvline(s.mean(), color='red', linestyle='--', label=f"mean={s.mean():.3f}") axes[0].legend() axes[0].set_title("Histogram of MedHouseVal") # KDE график sns.kdeplot(s, ax=axes[1], fill=True, color='skyblue') axes[1].axvline(s.mean(), color='red', linestyle='--') axes[1].set_title("KDE of MedHouseVal") plt.tight_layout() plt.savefig(TARGET_DISTRIBUTION_PATH, dpi=150) plt.close(fig) def visualize_features(df): """Визуализировать распределение признаков. Создает сетку 2x4 гистограмм для всех признаков датасета. Сохраняет результат в файл FEATURES_DISTRIBUTION_PATH. Args: df (pd.DataFrame): DataFrame с признаками """ features = [c for c in df.columns if c != 'MedHouseVal'] fig, axes = plt.subplots(2, 4, figsize=(16, 8)) axes = axes.flatten() for i, col in enumerate(features): sns.histplot(df[col], bins=30, ax=axes[i], color='skyblue') axes[i].set_title(col) # удалить пустые оси если признаки < 8 (на этот датасет их ровно 8) for j in range(len(features), len(axes)): fig.delaxes(axes[j]) plt.tight_layout() plt.savefig(FEATURES_DISTRIBUTION_PATH, dpi=150) plt.close(fig) def scatter_features_vs_target(df): """Scatter plots признаков относительно целевой переменной. Создает сетку 2x4 scatter plots, показывающих зависимость целевой переменной от каждого признака. Сохраняет результат в файл FEATURES_VS_TARGET_PATH. Args: df (pd.DataFrame): DataFrame с признаками и целевой переменной MedHouseVal """ features = [c for c in df.columns if c != 'MedHouseVal'] fig, axes = plt.subplots(2, 4, figsize=(16, 8)) axes = axes.flatten() for i, col in enumerate(features): axes[i].scatter(df[col], df['MedHouseVal'], alpha=0.5, s=10) axes[i].set_xlabel(col) axes[i].set_ylabel('MedHouseVal') for j in range(len(features), len(axes)): fig.delaxes(axes[j]) plt.tight_layout() plt.savefig(FEATURES_VS_TARGET_PATH, dpi=150) plt.close(fig) def correlation_analysis(df): """Анализ корреляций. Вычисляет корреляцию Пирсона между каждым признаком и целевой переменной. Выводит результаты в консоль и создает горизонтальный барплот. Сохраняет график в файл CORRELATION_BARS_PATH. Args: df (pd.DataFrame): DataFrame с признаками и целевой переменной MedHouseVal """ features = [c for c in df.columns if c != 'MedHouseVal'] corrs = df[features].corrwith(df['MedHouseVal']).sort_values() print("\nКорреляции признаков с целевой переменной (MedHouseVal):") print(corrs) fig, ax = plt.subplots(figsize=(8, 6)) corrs.plot(kind='barh', ax=ax, color='teal') ax.set_xlabel("Pearson correlation") ax.set_title("Feature correlations with MedHouseVal") plt.tight_layout() plt.savefig(CORRELATION_BARS_PATH, dpi=150) plt.close(fig) def main(): """Главная функция для выполнения полного анализа датасета. Последовательно выполняет: 1. Загрузку данных 2. Анализ целевой переменной 3. Анализ признаков 4. Визуализацию распределений 5. Анализ корреляций """ print("=" * 60) print("ЗАДАНИЕ 5: EXPLORATORY DATA ANALYSIS - CALIFORNIA HOUSING 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) scatter_features_vs_target(df) correlation_analysis(df) print("\n" + "=" * 60) print("Анализ завершен!") print("=" * 60) if __name__ == "__main__": main()