Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab1_3352_ГарееваКР.docx
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
1.17 Mб
Скачать

Анализ выбросов

Программа для анализа выбросов (метод IQR)

print("КОЛИЧЕСТВЕННЫЙ АНАЛИЗ ВЫБРОСОВ (МЕТОД IQR)")outliers_info = []

for col in df.columns:

data_without_na = df[col].dropna()

Q1 = data_without_na.quantile(0.25)

Q3 = data_without_na.quantile(0.75)

IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR

upper_bound = Q3 + 1.5 * IQR

# Ищем выбросы только в данных без пропусков

outliers = data_without_na[(data_without_na < lower_bound) | (data_without_na > upper_bound)]

outliers_count = len(outliers)

outliers_percent = (outliers_count / len(data_without_na)) * 100

outliers_info.append({

'Атрибут': col,

'Количество выбросов': outliers_count,

'Процент выбросов': round(outliers_percent, 2),

'Нижняя граница': round(lower_bound, 2),

'Верхняя граница': round(upper_bound, 2)

})

outliers_df = pd.DataFrame(outliers_info)display(outliers_df)

Результат работы программы:

Атрибут

Количество выбросов

Процент выбросов

Нижняя граница

Верхняя граница

0

Cement

0

0.00

-44.06

586.44

1

Blast Furnace Slag

2

0.19

-214.42

357.38

2

Fly Ash

0

0.00

-177.40

295.68

3

Water

9

0.87

124.25

232.65

4

Superplasticizer

10

0.97

-15.24

25.40

5

Coarse Aggregate

0

0.00

785.90

1175.50

6

Fine Aggregate

5

0.49

591.38

963.58

7

Age (day)

59

5.73

-66.50

129.50

8

Concrete compressive strength

4

0.39

-9.94

79.78

Наблюдения:

Наиболее проблемный атрибут — Age (day):

Имеет 59 выбросов (5.73%) — это значительно больше, чем у других атрибутов

Возможные причины: в экспериментах присутствуют образцы очень большого возраста (более 129.5 дней). Возраст бетона может изучаться в широком диапазоне (от нескольких дней до нескольких месяцев)

Физический смысл: Отрицательная нижняя граница (-66.5 дней) не имеет физического смысла, что подтверждает, что распределение возраста сильно смещено вправо

Атрибуты с умеренным количеством выбросов:

Superplasticizer: 10 выбросов (0.97%) - некоторые смеси содержат аномально высокое количество пластификатора

Water: 9 выбросов (0.87%) - возможны образцы с аномально низким или высоким водоцементным отношением

Fine Aggregate: 5 выбросов (0.49%) - вариации в содержании мелкого заполнителя

Атрибуты без выбросов:

Cement, Fly Ash, Coarse Aggregate — имеют нормальное распределение без аномальных значений

Это важные компоненты бетона, которые обычно дозируются с высокой точностью.

Прочность бетона (Concrete compressive strength):

Всего 4 выброса (0.39%)

Верхняя граница 79.78 МПа — это очень высокая прочность, но возможная для специальных бетонов.

Важно: удаление этих выбросов может привести к потере информации о высокопрочных составах.

Программа для создания графиков выбросов:

fig, axes = plt.subplots(3, 3, figsize=(18, 15))fig.suptitle('ВЫБРОСЫ', fontsize=16, fontweight='bold')

for i, col in enumerate(df.columns):

row, col_idx = i // 3, i % 3

boxplot = axes[row, col_idx].boxplot(df[col].dropna(), patch_artist=True,

labels=[col], showmeans=True)

boxplot['boxes'][0].set_facecolor('lightgray')

boxplot['boxes'][0].set_alpha(0.7)

boxplot['medians'][0].set_color('orange')

boxplot['means'][0].set_color('red')

boxplot['means'][0].set_marker('D')

data = df[col].dropna()

Q1 = data.quantile(0.25)

Q3 = data.quantile(0.75)

median = data.median()

mean = data.mean()

IQR = Q3 - Q1

axes[row, col_idx].text(0.7, 0.95, f'Медиана: {median:.2f}', transform=axes[row, col_idx].transAxes,

bbox=dict(boxstyle="round,pad=0.3", facecolor="orange", alpha=0.7))

axes[row, col_idx].text(0.7, 0.85, f'Среднее: {mean:.2f}', transform=axes[row, col_idx].transAxes,

bbox=dict(boxstyle="round,pad=0.3", facecolor="green", alpha=0.7))

axes[row, col_idx].text(0.7, 0.75, f'Q1: {Q1:.2f}', transform=axes[row, col_idx].transAxes)

axes[row, col_idx].text(0.7, 0.65, f'Q3: {Q3:.2f}', transform=axes[row, col_idx].transAxes)

axes[row, col_idx].set_title(f'Распределение {col}', fontweight='bold')

axes[row, col_idx].set_ylabel('Значение')

plt.tight_layout()plt.show()

Результат работы программы: