841 KiB
Загрузка и подготовка данных для анализа¶
Cardiovascular Disease dataset https://www.kaggle.com/datasets/sulianova/cardiovascular-disease-dataset
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv("data/cardio_train.csv", sep=";", index_col="id")
df.info()
Описание признаков¶
- age -- возраст в днях;
- gender -- пол (1 - ж, 2 - м);
- height -- рост в см.;
- weight -- вес в кг.;
- ap-hi -- систолическое давление в мм рт. ст.;
- ap_lo -- диастолическое давление в мм рт. ст.;
- cholesterol -- холестерин в крови (1 - в норме, 2 - выше нормы, 3 - сильно выше нормы);
- gluc -- сахар в крови (1 - в норме, 2 - выше нормы, 3 - сильно выше нормы);
- smoke -- курит (0 - нет, 1 - да);
- alco -- употребляет алкоголь (0 - нет, 1 - да);
- active -- ведет активный образ жизни (0 - нет, 1 - да);
- cardio -- риск ССЗ (целевой признак) (0 - нет, 1 - да).
Отображение набора данных¶
df
df.describe().T
Преобразование возраста из дней в годы
df["age"] = df["age"] / 365.24
df.describe().T
Минимальный возраст -- 29.5 лет, максимальный возраст -- 64.9 года.
Минимальный рост -- 55 см, максимальный рост -- 250 см.
Минимальный вес -- 10 кг, максимальный вес -- 200 кг.
Минимальное систолическое давление -- -150 мм рт ст, максимальное систолическое давление -- 16020 мм рт ст.
Минимальное диастолическое давление -- -70 мм рт ст, максимальное диастолическое давление -- 11000 мм рт ст.
Необходима очистка данных от ошибочных значений.
Визуализация признаков попарно для определения корреляции между ними¶
sns.pairplot(df, corner=True, kind="hist")
Визуализация распределения значений признаков¶
sns.displot(
x="value",
data=df.melt(value_vars=df),
col="variable",
kind="hist",
col_wrap=3,
facet_kws={"sharex": False, "sharey": False},
common_bins=False,
)
Визуализация выбросов в данных¶
sns.catplot(
y="value",
data=df.melt(value_vars=df.columns),
col="variable",
kind="box",
col_wrap=3,
sharey=False,
)
Большое количество выбросов в значениях давления, значения роста и веса также требуют некоторой корректировки
Визуализация зависимости значения целевого признака от значения каждого из входных признаков¶
ax = sns.lmplot(
x="value",
y="cardio",
data=df.melt(id_vars="cardio", value_vars=df),
col="variable",
col_wrap=3,
facet_kws={"sharex": False, "sharey": False},
line_kws={"color": "red"},
scatter_kws={"alpha": 0.2},
)
ax.tight_layout()
Из графиков видно, что риск ССЗ возрастает с увеличением возраста, веса, давления и холестерин.
Определение корреляции между признаками¶
plt.figure(figsize=(8, 6))
sns.heatmap(
df.corr(),
annot=True,
cmap="Blues",
fmt=".2f",
)
Существует небольшая прямая корреляция между целевым признаком, возрастом, весом и холестерином.
Определение выброс через расчет межквартильного размаха¶
def calculate_iqr_boundaries(series):
q25 = series.quantile(0.25)
q75 = series.quantile(0.75)
iqr = q75 - q25
boundaries = (q25 - 1.5 * iqr, q75 + 1.5 * iqr)
return boundaries
boundaries_columns = ["ap_hi", "ap_lo", "height", "weight"]
boundaries = pd.DataFrame(calculate_iqr_boundaries(df[boundaries_columns]))
boundaries
Удаление выбросов из данных¶
for column in boundaries_columns:
df.loc[df[column] > boundaries[column][1], column] = boundaries[column][1]
df.loc[df[column] < boundaries[column][0], column] = boundaries[column][0]
df
sns.catplot(
y="value",
data=df.melt(value_vars=df.columns),
col="variable",
kind="box",
col_wrap=3,
sharey=False,
)
df.describe().T