Анализ выбросов
Программа для анализа выбросов (метод 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()
Результат работы программы:
