/
AlexEly
/
Course_proj_ead
Обзор
Документация
Войти
/
AlexEly
/
Course_proj_ead
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
chap1-0.py
130 строк
6 KB
AlexEly
create: chap1-11.py, chap1-10.py, chap1-9.py, chap1-8.py, chap1-7.py, chap1-6.py, chap1-5.py, chap1-4.py, chap1-3.py, chap1-2.py, chap1-1.py, chap1-0.py
19 апр 2026, 14:12
Верифицирован
19 апр 2026, 14:12
feb66de
Код
Авторство
О чём код?
import pandas as pd import matplotlib.pyplot as plt import numpy as np from matplotlib import rcParams # Настройка стиля и шрифтов rcParams['font.family'] = 'DejaVu Sans' rcParams['axes.unicode_minus'] = False plt.style.use('seaborn-v0_8-whitegrid') # Загрузка данных df = pd.read_csv('feature_time_48k_2048_load_1_noisy_categorical.csv') # Список числовых признаков (исключая целевую переменную) numeric_features = ['max', 'min', 'mean', 'sd', 'rms', 'skewness', 'kurtosis', 'crest', 'form'] target_feature = 'fault' # Настройка параметров визуализации n_cols = 3 n_rows_num = (len(numeric_features) + n_cols - 1) // n_cols n_rows_total = n_rows_num + 1 # +1 для целевой переменной fig = plt.figure(figsize=(15, 5 * n_rows_total)) fig.suptitle('Распределение значений признаков датасета вибродиагностики', fontsize=16, fontweight='bold', y=0.98) # === Диаграммы для числовых признаков === for idx, feature in enumerate(numeric_features): ax = fig.add_subplot(n_rows_total, n_cols, idx + 1) # Гистограмма с кривой плотности data = df[feature].dropna() ax.hist(data, bins=50, density=True, alpha=0.7, color='steelblue', edgecolor='black', label='Гистограмма') # Оценка плотности (KDE) from scipy.stats import gaussian_kde if len(data) > 1: kde = gaussian_kde(data) x_range = np.linspace(data.min(), data.max(), 200) ax.plot(x_range, kde(x_range), color='red', linewidth=2, label='KDE') # Статистические линии mean_val = data.mean() median_val = data.median() ax.axvline(mean_val, color='green', linestyle='--', linewidth=1.5, label=f'Среднее: {mean_val:.3f}') ax.axvline(median_val, color='orange', linestyle=':', linewidth=1.5, label=f'Медиана: {median_val:.3f}') # Оформление ax.set_xlabel(f'Значение признака "{feature}"', fontsize=9) ax.set_ylabel('Плотность вероятности', fontsize=9) ax.set_title(f'Распределение: {feature}', fontsize=10, fontweight='bold') ax.tick_params(axis='both', labelsize=8) ax.legend(fontsize=7, loc='best') ax.grid(alpha=0.3) # === Диаграмма для целевой переменной === ax_target = fig.add_subplot(n_rows_total, n_cols, len(numeric_features) + 1) target_counts = df[target_feature].value_counts() colors = plt.cm.Set3(np.linspace(0, 1, len(target_counts))) bars = ax_target.barh(target_counts.index, target_counts.values, color=colors, edgecolor='black') ax_target.set_xlabel('Количество наблюдений', fontsize=10) ax_target.set_title(f'Распределение классов: {target_feature}', fontsize=10, fontweight='bold') ax_target.tick_params(axis='both', labelsize=8) ax_target.grid(axis='x', alpha=0.3) # Добавление значений на столбцы for bar in bars: width = bar.get_width() ax_target.text(width + max(target_counts.values)*0.01, bar.get_y() + bar.get_height()/2, f'{int(width)}', va='center', fontsize=8) # === Боксплоты для сравнения распределений по классам === # Создаём отдельную фигуру для боксплотов fig_bp = plt.figure(figsize=(16, 10)) fig_bp.suptitle('Сравнение распределений признаков по классам дефектов', fontsize=14, fontweight='bold', y=0.98) # Выбираем 6 наиболее информативных признаков для боксплотов selected_features = ['rms', 'kurtosis', 'crest', 'form', 'sd', 'max'] n_bp_cols = 2 n_bp_rows = (len(selected_features) + n_bp_cols - 1) // n_bp_cols for idx, feature in enumerate(selected_features): ax = fig_bp.add_subplot(n_bp_rows, n_bp_cols, idx + 1) # Группировка данных по классам box_data = [df[df[target_feature] == cls][feature].dropna() for cls in df[target_feature].unique()] labels = df[target_feature].unique() # Построение боксплота bp = ax.boxplot(box_data, labels=labels, patch_artist=True, notch=False, showmeans=True, meanline=True) # Раскраска боксов for patch, color in zip(bp['boxes'], colors): patch.set_facecolor(color) patch.set_alpha(0.7) # Оформление ax.set_xlabel('Класс дефекта', fontsize=9) ax.set_ylabel(f'Значение "{feature}"', fontsize=9) ax.set_title(f'{feature} по классам', fontsize=10, fontweight='bold') ax.tick_params(axis='x', rotation=45, labelsize=7) ax.tick_params(axis='y', labelsize=8) ax.grid(axis='y', alpha=0.3) plt.tight_layout() plt.subplots_adjust(top=0.95, hspace=0.35, wspace=0.25) plt.show() # === Вывод сводной статистики === print("=" * 80) print("СВОДНАЯ СТАТИСТИКА ПО ПРИЗНАКАМ") print("=" * 80) print(f"\nОбщее количество записей: {len(df)}") print(f"Количество классов: {df[target_feature].nunique()}") print(f"\nКлассы и их распределение:\n{df[target_feature].value_counts().to_string()}") print(f"\n{'Признак':<12} {'Среднее':>10} {'Медиана':>10} {'Std':>10} {'Min':>10} {'Max':>10}") print("-" * 65) for feature in numeric_features: stats = df[feature].describe() print(f"{feature:<12} {stats['mean']:>10.4f} {stats['50%']:>10.4f} " f"{stats['std']:>10.4f} {stats['min']:>10.4f} {stats['max']:>10.4f}") print("=" * 80)