/
urfu_itis_limits
/
code-review-101-Omnifisans
Обзор
Документация
Войти
/
urfu_itis_limits
/
code-review-101-Omnifisans
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
assignment.py
289 строк
11 KB
Omnifisans
update assignment.py
28 ноя 2025, 23:58
28 ноя 2025, 23:58
b6ed04e
Код
Авторство
О чём код?
""" Задание 1: Анализ датасета Iris Цель: Загрузить датасет Iris, провести анализ целевой переменной и признаков """ import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_iris import sys # Установите русский язык для всех графиков plt.rcParams['font.family'] = 'DejaVu Sans' plt.rcParams['axes.unicode_minus'] = False def load_data(): """Загрузить датасет Iris и конвертировать в DataFrame""" try: # Загружаем данные с помощью scikit-learn iris = load_iris() # Создаем DataFrame с признаками df = pd.DataFrame(iris.data, columns=iris.feature_names) # Добавляем целевую переменную df['target'] = iris.target # Заменяем числовые метки на названия видов df['species'] = df['target'].map( {0: 'setosa', 1: 'versicolor', 2: 'virginica'} ) return df except Exception as e: print(f"Ошибка при загрузке данных: {e}") return None def save_plot(filename): """Сохранить график с обработкой ошибок""" try: plt.savefig(filename, dpi=300, bbox_inches='tight') print(f" Успешно сохранен: {filename}") return True except OSError as e: print(f" Ошибка при сохранении {filename}: {e}") return False except Exception as e: print(f" Неожиданная ошибка при сохранении {filename}: {e}") return False def target_analysis(df): """Анализ целевой переменной (видов цветков)""" print("\nРАСПРЕДЕЛЕНИЕ ВИДОВ ЦВЕТКОВ:") print("-" * 40) # Распределение видов species_counts = df['species'].value_counts() print("Количество по видам:") for species, count in species_counts.items(): print(f" {species}: {count} экземпляров") # Процентное соотношение species_percent = df['species'].value_counts(normalize=True) * 100 print("\nПроцентное соотношение:") for species, percent in species_percent.items(): print(f" {species}: {percent:.1f}%") def feature_statistics(df): """Вычислить статистику по признакам""" print("\nСТАТИСТИКА ПРИЗНАКОВ:") print("-" * 40) # Выбираем только числовые признаки numeric_features = [ col for col in df.columns if col not in ['target', 'species'] ] for feature in numeric_features: print(f"\n{feature}:") print(f" Среднее: {df[feature].mean():.2f}") print(f" Медиана: {df[feature].median():.2f}") print(f" Стандартное отклонение: {df[feature].std():.2f}") print(f" Минимум: {df[feature].min():.2f}") print(f" Максимум: {df[feature].max():.2f}") print(f" 25%-й квартиль: {df[feature].quantile(0.25):.2f}") print(f" 50%-й квартиль: {df[feature].quantile(0.50):.2f}") print(f" 75%-й квартиль: {df[feature].quantile(0.75):.2f}") def visualize_target(df): """Визуализировать распределение целевой переменной""" try: fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # Столбчатая диаграмма species_counts = df['species'].value_counts() colors = ['skyblue', 'lightcoral', 'lightgreen'] ax1.bar(species_counts.index, species_counts.values, color=colors) ax1.set_title('Распределение видов цветков', fontsize=14, fontweight='bold') ax1.set_xlabel('Вид') ax1.set_ylabel('Количество') # Добавляем значения на столбцы for i, count in enumerate(species_counts.values): ax1.text(i, count + 1, str(count), ha='center', va='bottom') # Круговая диаграмма species_percent = df['species'].value_counts(normalize=True) * 100 ax2.pie(species_percent.values, labels=species_percent.index, autopct='%1.1f%%', colors=colors, startangle=90) ax2.set_title('Процентное соотношение видов', fontsize=14, fontweight='bold') plt.tight_layout() save_plot('01_iris_target_distribution.png') plt.show() except Exception as e: print(f"Ошибка при визуализации целевой переменной: {e}") def visualize_features(df): """Визуализировать распределение признаков""" try: # Получаем только числовые признаки numeric_features = [ col for col in df.columns if col not in ['target', 'species'] ] fig, axes = plt.subplots(2, 2, figsize=(12, 10)) axes = axes.ravel() # Преобразуем в 1D массив для удобства for i, feature in enumerate(numeric_features): ax = axes[i] ax.hist(df[feature], bins=15, alpha=0.7, color='skyblue', edgecolor='black') ax.set_title(f'Распределение {feature}', fontweight='bold') ax.set_xlabel(feature) ax.set_ylabel('Частота') ax.grid(alpha=0.3) plt.tight_layout() save_plot('01_iris_features_distribution.png') plt.show() except Exception as e: print(f"Ошибка при визуализации признаков: {e}") def features_by_target(df): """Визуализировать признаки в разрезе целевой переменной""" try: numeric_features = [ col for col in df.columns if col not in ['target', 'species'] ] species_list = df['species'].unique() colors = ['skyblue', 'lightcoral', 'lightgreen'] fig, axes = plt.subplots(2, 2, figsize=(14, 10)) axes = axes.ravel() for i, feature in enumerate(numeric_features): ax = axes[i] # Создаем гистограммы для каждого вида for j, species in enumerate(species_list): species_data = df[df['species'] == species][feature] ax.hist(species_data, bins=10, alpha=0.6, label=species, color=colors[j], edgecolor='black') ax.set_title(f'Распределение {feature} по видам', fontweight='bold') ax.set_xlabel(feature) ax.set_ylabel('Частота') ax.legend() ax.grid(alpha=0.3) plt.tight_layout() save_plot('01_iris_features_by_species.png') plt.show() except Exception as e: print(f"Ошибка при визуализации признаков по видам: {e}") def correlation_analysis(df): """Анализ корреляций между признаками""" try: # Вычисляем матрицу корреляции только для числовых признаков numeric_features = [ col for col in df.columns if col not in ['target', 'species'] ] numeric_df = df[numeric_features] corr_matrix = numeric_df.corr() print("\nМАТРИЦА КОРРЕЛЯЦИИ:") print("-" * 40) print(corr_matrix.round(3)) # Визуализация heatmap plt.figure(figsize=(8, 6)) mask = np.triu(np.ones_like(corr_matrix, dtype=bool)) sns.heatmap(corr_matrix, mask=mask, annot=True, cmap='coolwarm', center=0, square=True, linewidths=0.5, cbar_kws={"shrink": 0.8}) plt.title('Матрица корреляции признаков Iris', fontsize=14, fontweight='bold') plt.tight_layout() save_plot('01_iris_correlation_matrix.png') plt.show() except Exception as e: print(f"Ошибка при анализе корреляций: {e}") def check_missing_values(df): """Проверка на отсутствие пропущенных значений""" print("\nПРОВЕРКА НА ПРОПУЩЕННЫЕ ЗНАЧЕНИЯ:") print("-" * 40) missing_values = df.isnull().sum() total_missing = missing_values.sum() if total_missing == 0: print("✓ Пропущенных значений не обнаружено") return True else: print("⚠ Обнаружены пропущенные значения:") for column, count in missing_values.items(): if count > 0: print(f" {column}: {count} пропущенных значений") print(f" Всего пропущенных значений: {total_missing}") return False def main(): """Главная функция""" try: print("=" * 60) print("ЗАДАНИЕ 1: EXPLORATORY DATA ANALYSIS - IRIS DATASET") print("=" * 60) # Загрузка данных df = load_data() if df is None: print("Не удалось загрузить данные. Программа завершена.") return print(f"\nДатасет загружен. Размер: {df.shape}") print("\nПервые 5 строк:") print(df.head()) # Проверка на пропущенные значения if not check_missing_values(df): print("\n⚠ Внимание: в данных есть пропущенные значения!") print(" Рекомендуется обработать их перед дальнейшим анализом.") # Основной анализ target_analysis(df) feature_statistics(df) visualize_target(df) visualize_features(df) features_by_target(df) correlation_analysis(df) print("\n" + "=" * 60) print("Анализ завершен!") print("Созданы файлы:") print(" 01_iris_target_distribution.png") print(" 01_iris_features_distribution.png") print(" 01_iris_features_by_species.png") print(" 01_iris_correlation_matrix.png") print("=" * 60) except KeyboardInterrupt: print("\n\nПрограмма прервана пользователем.") sys.exit(1) except Exception as e: print(f"\n❌ Произошла непредвиденная ошибка: {e}") print("Пожалуйста, проверьте данные и настройки программы.") sys.exit(1) if __name__ == "__main__": main()