/
urfu_itis_limits
/
code-review-101-stepik96
Обзор
Документация
Войти
/
urfu_itis_limits
/
code-review-101-stepik96
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
assignment.py
161 строка
6 KB
stepik96
update assignment.py
30 ноя 2025, 19:48
30 ноя 2025, 19:48
b4fca9b
Код
Авторство
О чём код?
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_digits plt.rcParams['font.sans-serif'] = ['DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False def load_data(): """Загрузить датасет Digits и конвертировать в DataFrame""" digits = load_digits() # ИСПРАВЛЕНИЕ ОШИБКИ 1: убран .astype(int), чтобы не портить пиксели и target data = np.hstack([digits.data, digits.target.reshape(-1, 1)]) columns = [f'pixel_{i}' for i in range(64)] + ['target'] df = pd.DataFrame(data, columns=columns) return df def target_analysis(df): """Анализ целевой переменной (цифры 0-9)""" # ИСПРАВЛЕНИЕ ОШИБКИ 2: корректно приводим target к int df['target'] = df['target'].astype(int) target_counts = df['target'].value_counts().sort_index() print("\nРаспределение цифр (0–9):") print(target_counts) print("\nПроцент каждой цифры:") print((target_counts / len(df) * 100).round(2)) def feature_statistics(df): """Вычислить статистику по пиксельным значениям""" pixel_cols = [col for col in df.columns if col.startswith('pixel')] pixel_data = df[pixel_cols] print("\nСтатистика пиксельных значений:") print(f"Среднее: {pixel_data.mean().mean():.4f}") print(f"Минимум: {pixel_data.min().min():.0f}") print(f"Максимум: {pixel_data.max().max():.0f}") print(f"Стандартное отклонение: {pixel_data.std().mean():.4f}") def visualize_target(df): """Визуализировать распределение цифр""" counts = df['target'].value_counts().sort_index() fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) ax1.bar(counts.index, counts.values) ax1.set_xlabel('Цифра') ax1.set_ylabel('Количество') ax1.set_title('Распределение цифр (столбцы)') ax1.set_xticks(range(10)) ax2.pie(counts.values, labels=counts.index, autopct='%1.1f%%', startangle=90) ax2.set_title('Распределение цифр (круговая)') plt.tight_layout() plt.savefig('10_digits_target_distribution.png') plt.show() def sample_digit_images(df): """Визуализировать примеры цифр""" fig, axes = plt.subplots(2, 5, figsize=(10, 5)) axes = axes.flatten() for digit in range(10): sample = df[df['target'] == digit].iloc[0] image = sample[[f'pixel_{i}' for i in range(64)]].values.reshape(8, 8) axes[digit].imshow(image, cmap='gray') axes[digit].set_title(f'Цифра {digit}') axes[digit].axis('off') plt.tight_layout() plt.savefig('10_digits_sample_images.png') plt.close() def pixel_intensity_analysis(df): pixel_cols = [f'pixel_{i}' for i in range(64)] pixel_data = df[pixel_cols] fig, axs = plt.subplots(2, 2, figsize=(12, 10)) axs = axs.flatten() axs[0].hist(pixel_data.values.flatten(), bins=20, color='skyblue', edgecolor='black') axs[0].set_title('Гистограмма всех пиксельных значений') axs[0].set_xlabel('Интенсивность') axs[0].set_ylabel('Частота') mean_intensity = df.groupby('target')[pixel_cols].mean().mean(axis=1) axs[1].bar(mean_intensity.index, mean_intensity.values, color='lightgreen') axs[1].set_title('Средняя интенсивность пикселей по цифрам') axs[1].set_xlabel('Цифра') axs[1].set_ylabel('Средняя интенсивность') var_intensity = df.groupby('target')[pixel_cols].var().mean(axis=1) axs[2].bar(var_intensity.index, var_intensity.values, color='salmon') axs[2].set_title('Средняя дисперсия пикселей по цифрам') axs[2].set_xlabel('Цифра') axs[2].set_ylabel('Средняя дисперсия') nonzero_counts = df[pixel_cols].apply(lambda x: (x > 0).sum(), axis=1) df_with_nonzero = df.copy() df_with_nonzero['nonzero'] = nonzero_counts avg_nonzero = df_with_nonzero.groupby('target')['nonzero'].mean() axs[3].bar(avg_nonzero.index, avg_nonzero.values, color='gold') axs[3].set_title('Среднее количество ненулевых пикселей по цифрам') axs[3].set_xlabel('Цифра') axs[3].set_ylabel('Ненулевые пиксели') plt.tight_layout() plt.savefig('10_digits_pixel_analysis.png') plt.close() def heatmap_mean_images(df): fig, axes = plt.subplots(2, 5, figsize=(12, 6)) axes = axes.flatten() for digit in range(10): avg_img = df[df['target'] == digit][[f'pixel_{i}' for i in range(64)]].mean().values.reshape(8, 8) im = axes[digit].imshow(avg_img, cmap='hot', interpolation='nearest') axes[digit].set_title(f'Цифра {digit}') axes[digit].axis('off') fig.colorbar(im, ax=axes[digit], fraction=0.046, pad=0.04) plt.tight_layout() plt.savefig('10_digits_mean_heatmaps.png') plt.close() def main(): print("=" * 60) print("ЗАДАНИЕ 10: EXPLORATORY DATA ANALYSIS - DIGITS 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) sample_digit_images(df) pixel_intensity_analysis(df) heatmap_mean_images(df) print("\n" + "=" * 60) print("Анализ завершен (с ошибками)!") print("=" * 60) if name == "main": main()