/
urfu_itis_limits
/
code-review-101-normalChell
Обзор
Документация
Войти
/
urfu_itis_limits
/
code-review-101-normalChell
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
assignment.py
235 строк
9 KB
normalChell
update assignment.py - исправлены недоработки
18 ноя 2025, 16:26
18 ноя 2025, 16:26
8e095b6
Код
Авторство
О чём код?
""" Задание 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 from datasets import load_dataset plt.rcParams['font.sans-serif'] = ['DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False def load_data(): """Загрузить датасет Titanic через pandas напрямую из интернета""" url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv" df = pd.read_csv(url) # Приведём к формату, где 'Survived' — целевая переменная (0/1) 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] print("\nПропущенные значения:") print(missing_df) def target_analysis(df): """Анализ целевой переменной (выживаемость)""" counts = df['Survived'].value_counts() percentages = df['Survived'].value_counts(normalize=True) * 100 print("\nРаспределение выживаемости:") print(f"Умерших (0): {counts[0]} ({percentages[0]:.2f}%)") print(f"Выживших (1): {counts[1]} ({percentages[1]:.2f}%)") def feature_statistics(df): """Вычислить статистику по числовым признакам""" numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist() if 'Survived' in numeric_cols: numeric_cols.remove('Survived') print("\nСтатистика числовых признаков:") for col in numeric_cols: mean_val = df[col].mean() median_val = df[col].median() std_val = df[col].std() min_val = df[col].min() max_val = df[col].max() print(f"\n{col}:") print(f" Среднее: {mean_val:.2f}") print(f" Медиана: {median_val:.2f}") print(f" Стандартное отклонение: {std_val:.2f}") print(f" Минимум: {min_val}") print(f" Максимум: {max_val}") def categorical_analysis(df): """Анализ категориальных признаков""" cat_features = ['Sex', 'Pclass', 'Embarked'] print("\nАнализ категориальных признаков:") for col in cat_features: if col in df.columns: print(f"\n{col}:") print(df[col].value_counts()) def visualize_target(df): """Визуализировать распределение целевой переменной""" fig, axes = plt.subplots(1, 2, figsize=(12, 5)) # Столбчатая диаграмма df['Survived'].value_counts().plot(kind='bar', ax=axes[0], color=['lightcoral', 'lightgreen']) axes[0].set_title('Распределение выживаемости') axes[0].set_xlabel('Выжил (1) / Не выжил (0)') axes[0].set_ylabel('Количество') # Круговая диаграмма df['Survived'].value_counts().plot(kind='pie', ax=axes[1], autopct='%1.1f%%', colors=['lightcoral', 'lightgreen']) axes[1].set_title('Процент выживших и погибших') axes[1].set_ylabel('') plt.tight_layout() plt.savefig('06_titanic_target_distribution.png') 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') n_cols = len(numeric_cols) n_rows = (n_cols + 1) // 2 fig, axes = plt.subplots(n_rows, 2, figsize=(12, 5 * n_rows)) axes = axes.flatten() if n_cols > 2 else [axes] if n_cols == 1 else axes 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].axis('off') plt.tight_layout() plt.savefig('06_titanic_numeric_distribution.png') plt.close() def visualize_categorical_features(df): """Визуализировать категориальные признаки""" cat_features = ['Sex', 'Pclass', 'Embarked'] cat_features = [col for col in cat_features if col in df.columns] 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): df[col].value_counts().plot(kind='bar', ax=axes[i], color='lightsteelblue') axes[i].set_title(f'Распределение {col}') axes[i].set_xlabel(col) axes[i].set_ylabel('Количество') plt.tight_layout() plt.savefig('06_titanic_categorical_distribution.png') plt.close() def survival_by_features(df): """Анализ выживаемости по разным признакам""" fig, axes = plt.subplots(1, 2, figsize=(14, 6)) # Выживаемость по полу sns.barplot(data=df, x='Sex', y='Survived', ax=axes[0]) axes[0].set_title('Выживаемость по полу') axes[0].set_ylabel('Доля выживших') # Выживаемость по классу билета sns.barplot(data=df, x='Pclass', y='Survived', ax=axes[1]) axes[1].set_title('Выживаемость по классу билета') axes[1].set_ylabel('Доля выживших') plt.tight_layout() plt.savefig('06_titanic_survival_by_features.png') plt.close() def save_metrics_table(metrics_dict, filename="06_titanic_metrics.csv"): """ Сохраняет таблицу с метриками в CSV-файл. Параметры: - metrics_dict (dict или pd.DataFrame): словарь вида {'Метрика': 'Значение'} или DataFrame с колонками 'Metric' и 'Value'. - filename (str): имя файла для сохранения (по умолчанию '06_titanic_metrics.csv') """ if isinstance(metrics_dict, dict): df_metrics = pd.DataFrame(list(metrics_dict.items()), columns=["Metric", "Value"]) elif isinstance(metrics_dict, pd.DataFrame): df_metrics = metrics_dict else: raise ValueError("metrics_dict должен быть dict или pd.DataFrame") df_metrics.to_csv(filename, index=False, encoding='utf-8') print(f"Метрики сохранены в файл: {filename}") def main(): """Главная функция""" print("=" * 60) print("ЗАДАНИЕ 6: EXPLORATORY DATA ANALYSIS - TITANIC DATASET") print("=" * 60) df = load_data() print(f"\nДатасет загружен. Размер: {df.shape}") # Пример сбора метрик total_passengers = len(df) survived_rate = df['Survived'].mean() female_survival_rate = df[df['Sex'] == 'female']['Survived'].mean() male_survival_rate = df[df['Sex'] == 'male']['Survived'].mean() avg_age = df['Age'].mean() metrics = { "Total Passengers": total_passengers, "Overall Survival Rate": f"{survived_rate:.2%}", "Female Survival Rate": f"{female_survival_rate:.2%}", "Male Survival Rate": f"{male_survival_rate:.2%}", "Average Age": f"{avg_age:.1f}" } save_metrics_table(metrics) 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()