/
urfu_itis_limits
/
code-review-101-Wiky
Обзор
Документация
Войти
/
urfu_itis_limits
/
code-review-101-Wiky
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
assignment.py
229 строк
9 KB
Wiky
update assignment.py
29 ноя 2025, 00:50
29 ноя 2025, 00:50
abcc5b9
Код
Авторство
О чём код?
""" Задание 6: Анализ датасета Titanic - ШАБЛОН Цель: Анализ данных выживаемости пассажиров Титаника ЗАДАЧИ: 1. Загрузить данные в load_data() 2. Анализировать пропущенные значения в missing_analysis() 3. Анализировать целевую переменную в target_analysis() 4. Вычислить статистику числовых признаков в feature_statistics() 5. Анализировать категориальные признаки в categorical_analysis() 6. Визуализировать целевую переменную в visualize_target() 7. Визуализировать числовые признаки в visualize_numeric_features() 8. Визуализировать категориальные признаки в visualize_categorical_features() 9. Анализировать выживаемость по признакам в survival_by_features() """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rcParams['font.sans-serif'] = ['DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False def load_data(): """Загрузить датасет Titanic через seaborn и привести имя целевой переменной к 'Survived'""" df = sns.load_dataset('titanic') df = df.rename(columns={'survived': 'Survived'}) return df def preprocess_data(df): """Обработка пропусков в данных""" df = df.copy() if 'age' in df.columns: df['age'].fillna(df['age'].median(), inplace=True) if 'embarked' in df.columns: mode_val = df['embarked'].mode() if not mode_val.empty: df['embarked'].fillna(mode_val[0], inplace=True) return df def missing_analysis(df): """Анализ пропущенных значений""" missing = df.isnull().sum() missing_percent = (missing / len(df)) * 100 missing_df = pd.DataFrame({ 'Missing Count': missing, 'Missing %': missing_percent }) missing_df = missing_df[missing_df['Missing Count'] > 0] if not missing_df.empty: print("\nПропущенные значения:") print(missing_df) else: print("\nПропущенных значений нет.") def target_analysis(df): """Анализ целевой переменной (выживаемость)""" counts = df['Survived'].value_counts() percents = df['Survived'].value_counts(normalize=True) * 100 print("\nРаспределение выживаемости:") print("Значение\tКоличество\tПроцент") for val in counts.index: print(f"{val}\t\t{counts[val]}\t\t{percents[val]:.2f}%") def feature_statistics(df): """Вычислить статистику по числовым признакам""" numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist() if 'Survived' in numeric_cols: numeric_cols.remove('Survived') if numeric_cols: print("\nСтатистика числовых признаков:") stats = df[numeric_cols].agg(['mean', 'median', 'std', 'min', 'max']) print(stats.round(2)) else: print("\nНет числовых признаков для анализа.") def categorical_analysis(df): """Анализ категориальных признаков""" cat_features = df.select_dtypes(include=['object', 'category']).columns.tolist() print("\nРаспределение категориальных признаков:") for col in cat_features: print(f"\n{col}:") print(df[col].value_counts(dropna=False)) def visualize_target(df): """Визуализировать распределение целевой переменной""" fig, axes = plt.subplots(1, 2, figsize=(12, 5)) df['Survived'].value_counts().plot(kind='bar', ax=axes[0], color=['#d62728', '#2ca02c']) axes[0].set_title('Распределение выживаемости') axes[0].set_xlabel('Выжил (1) / Не выжил (0)') axes[0].set_ylabel('Количество') axes[0].tick_params(axis='x', rotation=0) counts = df['Survived'].value_counts() axes[1].pie(counts, labels=['Не выжил', 'Выжил'], autopct='%1.1f%%', colors=['#d62728', '#2ca02c'], startangle=90) axes[1].set_title('Процент выживших') plt.tight_layout() plt.savefig('06_titanic_target_distribution.png', dpi=150, bbox_inches='tight') plt.close() def visualize_numeric_features(df): """Визуализировать числовые признаки""" numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist() if 'Survived' in numeric_cols: numeric_cols.remove('Survived') if not numeric_cols: print("Нет числовых признаков для визуализации.") return n_cols = len(numeric_cols) n_rows = (n_cols + 1) // 2 fig, axes = plt.subplots(n_rows, 2, figsize=(12, 5 * n_rows)) if n_rows == 1: axes = [axes] if n_cols > 1 else [[axes]] axes = np.array(axes).flatten() for i, col in enumerate(numeric_cols): df[col].hist(bins=20, ax=axes[i], color='skyblue', edgecolor='black') axes[i].set_title(f'Распределение {col}') axes[i].set_xlabel(col) axes[i].set_ylabel('Частота') for j in range(i + 1, len(axes)): axes[j].set_visible(False) plt.tight_layout() plt.savefig('06_titanic_numeric_distribution.png', dpi=150, bbox_inches='tight') plt.close() def visualize_categorical_features(df): """Визуализировать категориальные признаки""" cat_features = df.select_dtypes(include=['object', 'category']).columns.tolist() if not cat_features: print("Нет категориальных признаков для визуализации.") return fig, axes = plt.subplots(1, len(cat_features), figsize=(5 * len(cat_features), 5)) if len(cat_features) == 1: axes = [axes] for i, col in enumerate(cat_features): value_counts = df[col].value_counts() value_counts.plot(kind='bar', ax=axes[i], color='lightcoral') axes[i].set_title(f'Распределение {col}') axes[i].set_xlabel(col) axes[i].set_ylabel('Количество') axes[i].tick_params(axis='x', rotation=0) plt.tight_layout() plt.savefig('06_titanic_categorical_distribution.png', dpi=150, bbox_inches='tight') plt.close() def survival_by_features(df): """Анализ выживаемости по ключевым признакам: пол и класс""" # Используем реальные имена колонок из датасета seaborn: 'sex' и 'pclass' features = ['sex', 'pclass'] available_features = [col for col in features if col in df.columns] if not available_features: print("Нет признаков для анализа выживаемости.") return fig, axes = plt.subplots(1, len(available_features), figsize=(6 * len(available_features), 5)) if len(available_features) == 1: axes = [axes] # Словарь для красивых подписей label_map = {'sex': 'Пол', 'pclass': 'Класс каюты'} for i, col in enumerate(available_features): survival_rate = df.groupby(col)['Survived'].mean() survival_rate.plot(kind='bar', ax=axes[i], color='mediumseagreen') axes[i].set_title(f'Выживаемость по {label_map.get(col, col)}') axes[i].set_xlabel(col) axes[i].set_ylabel('Доля выживших') axes[i].tick_params(axis='x', rotation=0) for p in axes[i].patches: axes[i].annotate(f'{p.get_height():.2f}', (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='bottom') plt.tight_layout() plt.savefig('06_titanic_survival_by_features.png', dpi=150, bbox_inches='tight') plt.close() def main(): """Главная функция""" print("=" * 60) print("ЗАДАНИЕ 6: EXPLORATORY DATA ANALYSIS - TITANIC DATASET") print("=" * 60) df = load_data() df = preprocess_data(df) 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) survival_by_features(df) print("\n" + "=" * 60) print("Анализ завершен!") print("=" * 60) if __name__ == "__main__": main()