Иерархический агломеративный метод.
Для кластеризации необходимо убрать целевой столбец died (Рис.9).
y = dataframe['died'].values
df = dataframe.drop(columns = ["died"])
df
Рисунок 9 – Целевой столбец died отсутствует
Создаётся объект класса scaler, далее он обучается по текущему набору данных, а после данные стандартизируются (Рис.10).
scaler = StandardScaler() #объект
scaler.fit(df) # обучение
X_sc = scaler.transform(df) # преобразование
X_sc
Рисунок 10 – Стандартизация данных
По этим данным строится дендрограмма (Рис.11).
linked = linkage(X_sc, method = 'ward')
plt.figure(figsize=(15, 10))
dendrogram(linked, orientation='top', truncate_mode = "lastp")
plt.title('Иерархическая кластеризация по сердечным заболеваниям для больницы')
plt.show()
Рисунок 11 – Дендрограмма
Оптимальное число кластеров, судя по дендрограмме - 4. Многие значения встречаются в разных кластерах. Из этого следует, что текущие данные невозможно распределить по однозначно определённым кластерам, а, значит, могут быть получены неверные результаты.
Агломеративная кластеризация, получаем метки (число кластеров задали 4), (Рис.12).
Рисунок 12 – Алгомеративная кластеризация
Далее добавляем столбец, где у каждой строки будет метка кластера (всего 4), (Рис.13).
df["cluster_ag"] = labs
df.head(5)
Рисунок 13 – Добавление столбца с меткой кластера
С помощью сводной таблицы считаем среднее по каждому кластеру и каждому столбцу, на основе этого можно делать выводы, средний возраст в третьем кластере выше, во втором кластере в среднем выше креатинфосфокиназа, в нулевом кластере по большей части некурящие женщины и т.д. (Рис.14).
Рисунок 14 – Свободная таблица средних показателей кластеров
Метод k-средних.
Выбор оптимального количества кластеров.
Посмотрим какое количество кластеров покажет «метод локтя» (Рис.15).
model = AgglomerativeClustering()
visualizer = KElbowVisualizer(model, k=(1,11), timings=False)
visualizer.fit(df)
visualizer.show()
Рисунок 15 – Метод локтя
Метод локтя показал, что оптимальным числом кластеров является 4.
Проверяется, для какого количества кластеров кластеризация будет наиболее качественной.
Задаётся количество кластеров, равное 5, а далее изучается набор данных (Рис.16).
Рисунок 16 – Задаем количество кластеров равное 5
Записывается список того, какие строки из набора данных принадлежат определённому кластеру (Рис.17).
Рисунок 17 – Запись строк
Задаётся походящая метрика (Рис.18).
Рисунок 18 - Метрика
Повторим для количества кластеров 4 и 3 (Рис.19-20).
Рисунок 19 - Проверка количества кластеров, запись строк и метрика
Рисунок 20 - Проверка количества кластеров, запись строк и метрика
По метрикам видно, что кластеризация ни в одном из случаев не может быть проведена качественно, однако деление на 4 кластера показало лучший результат. Именно такое количество кластеров будет задаваться для метода k-средних.
Записывался список того, какие строки из набора данных принадлежат определённому кластеру (Рис.21).
Рисунок 21 - Запись строк для 2 кластеров
Выводим центроиды кластеров (Рис.22).
Рисунок 22 – Вывод центроидов кластеров
В набор данных добавляется ещё один столбец - cluster, который показывает, к какому из двух кластеров принадлежит данная строка. Также выводятся первые 5 строк набора данных, чтобы убедиться, что этот столбец добавлен (Рис.23).
df["cluster"] = label.tolist()
df.head(5)
Рисунок 23 – Добавление столбца cluster
Средние значения по каждому кластеру по сводной таблице (Рис.24).
Рисунок 24 – Сводная таблица
Строится график деления пациентов по столбцу «Умерли» (Рис.25).
sns.pairplot(dataframe, hue="died")
Рисунок 25 – График деления клиентов клиники на классы
Исходя из графика, нельзя точно определить, какие именно признаки оказывают наибольшее влияние на показатели смерти. Однако, можно увидеть, что есть корреляция с возрастом, полом и курением.
Для понимания того, какие значения столбцов есть в нулевом кластере, создаётся набор данных только по строкам, принадлежащим к этому кластеру (Рис.26).
Рисунок 26 – Набор данных по строкам
Строятся графики размаха по каждому из столбцов этого набора данных (Рис.27).
sns.pairplot(df0)
Рисунок 27 – Графики размаха
С помощью метода describe() просматриваются средние значения по каждому из столбцов, а также их средние отклонения (Рис.28).
df0.describe()
Рисунок 28 - Средние значения по столбцам
Видно, что в этом кластере только женщины, которые по больше части не курят, и у примерно половины из них анемия и сахарный диабет.
Т.к. раннее использованный метод метод query() повлиял на количество строк, то стоит прочитать данные из файла ещё раз и обработать их, а после создать ещё один набор данных только по 1 кластеру (Рис.29).
df1 = pd.read_csv(open("4heart2.csv", 'rb'))
for Name, values in df1.items():
df1.rename(columns={Name:Name.lower()},inplace=True)
df1.rename(columns={'death_event':'died'},inplace=True)
df1.rename(columns={'time':'time_since_first_visit'},inplace=True)
df1 = df1.drop(columns = ["died"])
df1["cluster"] = label.tolist()
df1.query('cluster == 1', inplace = True)
df1 = df1.reset_index()
df1.head(5)
Рисунок 29 – Созданный набор данных по 1 кластеру
Строятся графики размаха по каждому из столбцов этого набора данных (Рис.30).
sns.pairplot(df1)
Рисунок 30 -График размаха по 1 кластеру
С помощью метода describe() просматриваются средние значения по каждому из столбцов, а также их средние отклонения (Рис.31).
df1.describe()
Рисунок 31 – Средне значения и отклонения
Вывод
Данные представляли собой набор сведений о пациентах медицинского центра по заболеваниям сердца с указанием следующих параметров: возраста (age), наличия анемии (anaemia), количества креатинфосфокиназы (creatinine_phosphokinase), наличия диабета (diabetes), объема фракции выброса (ejection_fraction), наличия высокого артериального давления (high_blood_pressure), количества тромбоцитов в крови (platelets), креатинина в сыворотке крови (serum_creatinine), натрия в сыворотке крови (serum_sodium), пола (sex), курения (smoking), времени с первого приема (time) и факта смерти (death_event).
Была осуществлена предварительная обработка данных csv-файла, а именно: названия столбцов стали начинаться только со строчных букв, были осуществлены проверки на наличие пропусков и дубликатов, а также их удаление. Был изменён тип данных столбца age, а также столбца platelets с типа данных с плавающей точкой на целочисленный. Для удобства были переименованы столбцы death_event и time.
После этого данные были стандартизированы и разделены на кластеры двумя методами: иерархическим агломеративным методом и методом k средних. Были выявлены признаки, которые оказали наибольшее влияние на выделение кластеров. Исходя из дендрограммы разделения на кластеры, оптимальным количеством кластеров является 4, что также показала метрика силуэта. При таком количестве кластеров метрика составляет около 11,6%. При анализе данных было выявлено, что курение, пол и пожилой возраст значительно влияют на риск смерти от сердечно-сосудистых заболеваний.
