926 KiB
926 KiB
Бизнес-цель¶
Анализ ключевых факторов, влияющих на диабет. Предсказание вероятности развития диабета на основе медданных. Актуальность для планирвоания лечения.
- Уровень давления(BloodPressure) и возраст(Age) - с возрастом артериальное давление может увеличиться, что является фактором риска для диабета.
- Уровень инсулина(Insulin) и уровень глюкозы(Glucose) - уровень инсулина напрямую влияет на уровень сахара в крови.
- Индекс массы тела(BMI) и возраст(Age) - с повышением возраста зачастую увеличивается индекс массы тела.
- Уровень глюкозы(Glucose) и индекс массы тела(BMI) - как индекс массы тела влияет на уровень глюкозы.
In [12]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
df = pd.read_csv("data/diabetes.csv")
df = df.head(1500)
print(df.head())
Очистка данных¶
In [13]:
df_cleaned = df.drop(columns=['Pregnancies', 'DiabetesPedigreeFunction'], errors='ignore').dropna()
print(df_cleaned.head())
Визуализация парных взаимодействий¶
In [14]:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")
plt.figure(figsize=(16, 12))
# Визуализация взаимосвязи уровня давления и возраста
plt.subplot(2, 2, 1)
sns.scatterplot(x=df_cleaned['BloodPressure'], y=df_cleaned['Age'], alpha=0.6)
plt.title('BloodPressure_Age')
# Визуализация взаимосвязи уровня инсулина и уровня глюкозы
plt.subplot(2, 2, 2)
sns.scatterplot(x=df_cleaned['Insulin'], y=df_cleaned['Glucose'], alpha=0.6)
plt.title('Insulin_Glucose')
# Визуализация взаимосвязи индекса массы тела и возраста
plt.subplot(2, 2, 3)
sns.scatterplot(x=df_cleaned['BMI'], y=df_cleaned['Age'], alpha=0.6)
plt.title('BMI_Age')
# Визуализация взаимосвязи уровня глюкозы и индекса массы тела
plt.subplot(2, 2, 4)
sns.scatterplot(x=df_cleaned['Glucose'], y=df_cleaned['BMI'], alpha=0.6)
plt.title('Glucose_BMI')
plt.tight_layout()
plt.show()
Стандартизация данных для кластеризации¶
In [15]:
scaler = StandardScaler()
data_scaled = scaler.fit_transform(df_cleaned)
Агломеративная (иерархическая) кластеризация¶
In [17]:
linkage_matrix = linkage(data_scaled, method='ward')
plt.figure(figsize=(10, 7))
dendrogram(linkage_matrix)
plt.title('Дендрограмма агломеративной кластеризации')
plt.xlabel('Индекс образца')
plt.ylabel('Расстояние')
plt.show()
# Получение результатов кластеризации с заданным порогом
result = fcluster(linkage_matrix, t=10, criterion='distance')
print(result)
Визуализация распределения кластеров¶
In [ ]:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")
plt.figure(figsize=(16, 12))
# Визуализация взаимосвязи уровня давления и возраста
plt.subplot(2, 2, 1)
sns.scatterplot(x=df_cleaned['BloodPressure'], y=df_cleaned['Age'], hue=df_cleaned['Outcome'], palette='Set1', alpha=0.6)
plt.title('BloodPressure_Age')
# Визуализация взаимосвязи уровня инсулина и уровня глюкозы
plt.subplot(2, 2, 2)
sns.scatterplot(x=df_cleaned['Insulin'], y=df_cleaned['Glucose'], hue=df_cleaned['Outcome'], palette='Set1', alpha=0.6)
plt.title('Insulin_Glucose')
# Визуализация взаимосвязи индекса массы тела и возраста
plt.subplot(2, 2, 3)
sns.scatterplot(x=df_cleaned['BMI'], y=df_cleaned['Age'], hue=df_cleaned['Outcome'], palette='Set1', alpha=0.6)
plt.title('BMI_Age')
# Визуализация взаимосвязи уровня глюкозы и индекса массы тела
plt.subplot(2, 2, 4)
sns.scatterplot(x=df_cleaned['Glucose'], y=df_cleaned['BMI'], hue=df_cleaned['Outcome'], palette='Set1', alpha=0.6)
plt.title('Glucose_BMI')
plt.tight_layout()
plt.show()
KMeans (неиерархическая кластеризация) для сравнения¶
In [ ]:
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Масштабирование данных
scaler = StandardScaler()
data_scaled = scaler.fit_transform(df_cleaned[['Glucose', 'BMI', 'BloodPressure', 'Age']])
# Обучение K-Means
random_state = 17
kmeans = KMeans(n_clusters=4, random_state=random_state)
labels = kmeans.fit_predict(data_scaled)
centers = kmeans.cluster_centers_
# Обратная стандартизация центров кластеров
centers = scaler.inverse_transform(centers)
print("Центры кластеров:\n", centers)
# Визуализация кластеризации
plt.figure(figsize=(16, 12))
# Взаимосвязь Glucose и BMI
plt.subplot(2, 2, 1)
sns.scatterplot(x=df_cleaned['Glucose'], y=df_cleaned['BMI'], hue=labels, palette='Set1', alpha=0.6)
plt.scatter(centers[:, 0], centers[:, 1], s=300, c='red', label='Centroids')
plt.title('KMeans Clustering: Glucose vs BMI')
plt.legend()
# Взаимосвязь Glucose и Age
plt.subplot(2, 2, 2)
sns.scatterplot(x=df_cleaned['Glucose'], y=df_cleaned['Age'], hue=labels, palette='Set1', alpha=0.6)
plt.scatter(centers[:, 0], centers[:, 3], s=300, c='red', label='Centroids')
plt.title('KMeans Clustering: Glucose vs Age')
plt.legend()
# Взаимосвязь BloodPressure и BMI
plt.subplot(2, 2, 3)
sns.scatterplot(x=df_cleaned['BloodPressure'], y=df_cleaned['BMI'], hue=labels, palette='Set1', alpha=0.6)
plt.scatter(centers[:, 2], centers[:, 1], s=300, c='red', label='Centroids')
plt.title('KMeans Clustering: BloodPressure vs BMI')
plt.legend()
# Взаимосвязь BloodPressure и Age
plt.subplot(2, 2, 4)
sns.scatterplot(x=df_cleaned['BloodPressure'], y=df_cleaned['Age'], hue=labels, palette='Set1', alpha=0.6)
plt.scatter(centers[:, 2], centers[:, 3], s=300, c='red', label='Centroids')
plt.title('KMeans Clustering: BloodPressure vs Age')
plt.legend()
plt.tight_layout()
plt.show()