Lab 1, 3352, Гареева Карина Радиковна (2)
.docxАнализ датасета «Concrete Compressive Strength»¶
Описание датасета¶
Предметная область: Строительные материалы и инженерия
Источник данных: Данные собраны с помощью лабораторных экспериментов, где измерялась прочность бетона на сжатие через 28 дней для различных комбинаций ингредиентов. Ссылка на источник: Concrete Compressive Strength.
Характер данных: Реальные данные. Таблица содержит числовые признаки состава бетона и метку — прочность на сжатие. Каждая строка — это один экспериментальный образец бетона.
Атрибуты датасета
№ |
Название |
Тип |
Описание |
1 |
Cement |
float |
Количество цемента (кг/м³) |
2 |
Blast Furnace Slag |
float |
Количество шлака (кг/м³) |
3 |
Fly Ash |
float |
Количество золы-уноса (кг/м³) |
4 |
Water |
float |
Количество воды (кг/м³) |
5 |
Superplasticizer |
float |
Количество суперпластификатора (кг/м³) |
6 |
Coarse Aggregate |
float |
Количество крупного заполнителя (кг/м³) |
7 |
Fine Aggregate |
float |
Количество мелкого заполнителя (кг/м³) |
8 |
Age |
float |
Возраст бетона (дни) |
9 |
Concrete Compressive Strength |
float |
Прочность на сжатие (МПа) — целевая переменная |
Цель анализа данных: Определить, как химико-физические характеристики бетона влияют на его прочность на сжатие.
In [46]:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy import statsimport warningswarnings.filterwarnings('ignore')
plt.rcParams['figure.figsize'] = (10, 6)sns.set_style('whitegrid')
In [59]:
df = pd.read_csv('Concrete Compressive Strength.csv')
print("ОСНОВНАЯ ИНФОРМАЦИЯ О ДАТАСЕТЕ")print(f"Размер датасета: {df.shape}")print(f"Количество строк: {df.shape[0]}")print(f"Количество столбцов: {df.shape[1]}")
df.head()
ОСНОВНАЯ ИНФОРМАЦИЯ О ДАТАСЕТЕ
Размер датасета: (1030, 9)
Количество строк: 1030
Количество столбцов: 9
Out[59]:
|
Cement |
Blast Furnace Slag |
Fly Ash |
Water |
Superplasticizer |
Coarse Aggregate |
Fine Aggregate |
Age (day) |
Concrete compressive strength |
0 |
540.0 |
0.0 |
0.0 |
162.0 |
2.5 |
1040.0 |
676.0 |
28 |
79.986111 |
1 |
540.0 |
0.0 |
0.0 |
162.0 |
2.5 |
1055.0 |
676.0 |
28 |
61.887366 |
2 |
332.5 |
142.5 |
0.0 |
228.0 |
0.0 |
932.0 |
594.0 |
270 |
40.269535 |
3 |
332.5 |
142.5 |
0.0 |
228.0 |
0.0 |
932.0 |
594.0 |
365 |
41.052780 |
4 |
198.6 |
132.4 |
0.0 |
192.0 |
0.0 |
978.4 |
825.5 |
360 |
44.296075 |
In [76]:
print("АНАЛИЗ ЧИСЛОВЫХ АТРИБУТОВ\n")
stats_simple = pd.DataFrame({
'Среднее значение': df.mean(),
'Медиана': df.median(),
'Ско': df.std()})
display(stats_simple)
АНАЛИЗ ЧИСЛОВЫХ АТРИБУТОВ
|
Среднее значение |
Медиана |
Ско |
Cement |
281.165631 |
272.900000 |
104.507142 |
Blast Furnace Slag |
73.895485 |
22.000000 |
86.279104 |
Fly Ash |
54.187136 |
0.000000 |
63.996469 |
Water |
181.566359 |
185.000000 |
21.355567 |
Superplasticizer |
6.203112 |
6.350000 |
5.973492 |
Coarse Aggregate |
972.918592 |
968.000000 |
77.753818 |
Fine Aggregate |
773.578883 |
779.510000 |
80.175427 |
Age (day) |
45.662136 |
28.000000 |
63.169912 |
Concrete compressive strength |
35.817836 |
34.442774 |
16.705679 |
In [92]:
fig, axes = plt.subplots(3, 3, figsize=(15, 12))fig.suptitle('ГИСТОГРАММЫ РАСПРЕДЕЛЕНИЯ ЧИСЛОВЫХ АТРИБУТОВ', fontsize=16, fontweight='bold')
for i, col in enumerate(df.columns):
row, col_idx = i // 3, i % 3
axes[row, col_idx].hist(df[col].dropna(), bins=15, alpha=0.7, color='lightgray', edgecolor='black')
axes[row, col_idx].set_title(f'Распределение {col}')
axes[row, col_idx].set_xlabel(col)
axes[row, col_idx].set_ylabel('Частота')
mean_val = df[col].mean()
median_val = df[col].median()
axes[row, col_idx].axvline(mean_val, color='red', linestyle='--', label=f'Среднее: {mean_val:.2f}')
axes[row, col_idx].axvline(median_val, color='green', linestyle='--', label=f'Медиана: {median_val:.2f}')
axes[row, col_idx].legend()
plt.tight_layout()plt.show()
In [69]:
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)
КОЛИЧЕСТВЕННЫЙ АНАЛИЗ ВЫБРОСОВ (МЕТОД IQR)
|
Атрибут |
Количество выбросов |
Процент выбросов |
Нижняя граница |
Верхняя граница |
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 |
In [99]:
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()
In [71]:
print("АНАЛИЗ ПРОПУЩЕННЫХ ЗНАЧЕНИЙ")missing_data = df.isnull().sum()missing_percent = (df.isnull().sum() / len(df)) * 100
missing_info = pd.DataFrame({
'Количество пропусков': missing_data,
'Процент пропусков': missing_percent.round(2)})display(missing_info)
АНАЛИЗ ПРОПУЩЕННЫХ ЗНАЧЕНИЙ
|
Количество пропусков |
Процент пропусков |
Cement |
0 |
0.0 |
Blast Furnace Slag |
0 |
0.0 |
Fly Ash |
0 |
0.0 |
Water |
0 |
0.0 |
Superplasticizer |
0 |
0.0 |
Coarse Aggregate |
0 |
0.0 |
Fine Aggregate |
0 |
0.0 |
Age (day) |
0 |
0.0 |
Concrete compressive strength |
0 |
0.0 |
In [73]:
# Визуализация матрицы корреляцийplt.figure(figsize=(12, 8))sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0,
square=True, fmt='.2f')plt.title('МАТРИЦА КОРРЕЛЯЦИЙ')plt.tight_layout()plt.show()
In [74]:
print("АНАЛИЗ ВЫСОКОКОРРЕЛИРОВАННЫХ ПАР")high_corr_pairs = []
for i in range(len(correlation_matrix.columns)):
for j in range(i+1, len(correlation_matrix.columns)):
corr_value = correlation_matrix.iloc[i, j]
if abs(corr_value) > 0.6:
high_corr_pairs.append({
'Параметры': f"{correlation_matrix.columns[i]} - {correlation_matrix.columns[j]}",
'Коэффициент корреляции': corr_value.round(3),
'Характер корреляции': 'Положительная' if corr_value > 0 else 'Отрицательная',
'Сила корреляции': 'Сильная' if abs(corr_value) > 0.7 else 'Умеренная'
})
high_corr_df = pd.DataFrame(high_corr_pairs)high_corr_df
АНАЛИЗ ВЫСОКОКОРРЕЛИРОВАННЫХ ПАР
Out[74]:
|
Параметры |
Коэффициент корреляции |
Характер корреляции |
Сила корреляции |
0 |
Water - Superplasticizer |
-0.657 |
Отрицательная |
Умеренная |
In [82]:
target_column = df.columns[-1]df_clean = df.rename(columns={target_column: 'Compressive_Strength'})df_clean['Strength_Category'] = pd.qcut(df_clean['Compressive_Strength'],
q=3,
labels=['Низкая', 'Средняя', 'Высокая'])
plt.figure(figsize=(15, 12))sns.pairplot(df_clean, hue='Strength_Category', palette='viridis',
vars=df_clean.columns[:-1], # Все столбцы кроме последнего (категория)
diag_kind='hist',
plot_kws={'alpha': 0.7, 's': 30},
corner=True) plt.suptitle('МАТРИЦА ГРАФИКОВ РАССЕИВАНИЯ С РАСКРАСКОЙ ПО КАТЕГОРИЯМ ПРОЧНОСТИ',
y=1.02, fontsize=16, fontweight='bold')plt.show()
<Figure size 1500x1200 with 0 Axes>
In [2]:
print("ВЫВОДЫ КОРРЕЛЯЦИОННОГО АНАЛИЗА")
print("\n1. КЛЮЧЕВЫЕ ФАКТОРЫ ПРОЧНОСТИ:")key_factors = [
("Цемент", "сильная положительная", 0.5),
("Возраст", "умеренная положительная", 0.33),
("Суперпластификатор", "умеренная положительная", 0.29)]
for factor, relation, corr in key_factors:
print(f"• {factor:20} - {relation:25} (r={corr:.2f})")
print("\n2. ВАЖНЫЕ ВЗАИМОСВЯЗИ:")relationships = [
"Суперпластификатор и Зола-унос: сильная отрицательная",
"Цемент и Вода: умеренная отрицательная",
"Вода и Прочность: умеренная отрицательная"]
for rel in relationships:
print(f"• {rel}")
print("\nВЫВОДЫ:")
conclusions = [
"• Чем больше цемента в смеси - тем прочнее бетон",
"• Чем дольше твердеет бетон - тем он прочнее",
"• Специальные добавки (суперпластификаторы) увеличивают прочность",
"• Лишняя вода в смеси делает бетон менее прочным",
"• Добавки и зола-унос обычно не используются вместе",
"• Все остальные компоненты почти не влияют на прочность"]
for conclusion in conclusions:
print(conclusion)
ВЫВОДЫ КОРРЕЛЯЦИОННОГО АНАЛИЗА
1. КЛЮЧЕВЫЕ ФАКТОРЫ ПРОЧНОСТИ:
• Цемент - сильная положительная (r=0.50)
• Возраст - умеренная положительная (r=0.33)
• Суперпластификатор - умеренная положительная (r=0.29)
2. ВАЖНЫЕ ВЗАИМОСВЯЗИ:
• Суперпластификатор и Зола-унос: сильная отрицательная
• Цемент и Вода: умеренная отрицательная
• Вода и Прочность: умеренная отрицательная
ВЫВОДЫ:
• Чем больше цемента в смеси - тем прочнее бетон
• Чем дольше твердеет бетон - тем он прочнее
• Специальные добавки (суперпластификаторы) увеличивают прочность
• Лишняя вода в смеси делает бетон менее прочным
• Добавки и зола-унос обычно не используются вместе
• Все остальные компоненты почти не влияют на прочность
In [ ]:
