Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab 1, 3352, Гареева Карина Радиковна (2)

.docx
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
1.81 Mб
Скачать

Анализ датасета «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 [ ]: