1.8 MiB
1.8 MiB
In [1]:
import pandas as pd
df = pd.read_csv("..//static//csv//heart_2020_cleaned.csv")
print(df.columns)
display(df.head(10))
Сегментация пациентов по рискам сердечно-сосудистых заболеваний Цель: Определить группы пациентов с различными уровнями риска развития сердечно-сосудистых заболеваний на основе их демографических данных, образа жизни и состояния здоровья.
Пример:
Кластер 1: Пациенты с высоким риском (курение, высокий ИМТ, низкая физическая активность).
Кластер 2: Пациенты со средним риском (умеренное курение, средний ИМТ, средняя физическая активность).
Кластер 3: Пациенты с низким риском (отсутствие вредных привычек, нормальный ИМТ, высокая физическая активность).
Бизнес-применение:
Разработка персонализированных программ профилактики и лечения для каждой группы пациентов.
Таргетированная реклама медицинских услуг и продуктов для улучшения образа жизни.
In [71]:
import pandas as pd
## почистила данные чут чут
df = pd.read_csv("..//static//csv//heart_2020_cleaned.csv").head(1000)
df = df.dropna()
from scipy import stats
# Вычисление z-score для числовых столбцов
z_scores = stats.zscore(df[['BMI', 'PhysicalHealth', 'MentalHealth', 'SleepTime']])
abs_z_scores = abs(z_scores)
filtered_entries = (abs_z_scores < 3).all(axis=1)
df = df[filtered_entries]
from sklearn.preprocessing import LabelEncoder
# Инициализация LabelEncoder
label_encoders = {}
# Кодирование категориальных переменных
for column in df.select_dtypes(include=['object']).columns:
le = LabelEncoder()
df[column] = le.fit_transform(df[column])
label_encoders[column] = le
from imblearn.over_sampling import RandomOverSampler
# Инициализация RandomOverSampler
ros = RandomOverSampler(random_state=42)
# Выбор признаков и целевой переменной
X = df.drop('HeartDisease', axis=1)
y = df['HeartDisease']
# Применение RandomOverSampler
X_resampled, y_resampled = ros.fit_resample(X, y)
# Создание нового датасета с балансированными данными
df_balanced = X_resampled.copy()
df_balanced['HeartDisease'] = y_resampled
df = df_balanced
In [72]:
## стандартизация
scaler = StandardScaler()
df_encoded[numeric_features] = scaler.fit_transform(df_encoded[numeric_features])
In [73]:
import matplotlib.pyplot as plt
import seaborn as sns
# Визуализация данных с учетом понимания их особенностей
plt.figure(figsize=(16, 12))
# Взаимодействие между BMI и PhysicalHealth
plt.subplot(2, 2, 1)
sns.scatterplot(x='BMI', y='PhysicalHealth', hue='HeartDisease', data=df)
plt.title('BMI vs PhysicalHealth')
# Взаимодействие между MentalHealth и SleepTime
plt.subplot(2, 2, 2)
sns.scatterplot(x='MentalHealth', y='SleepTime', hue='HeartDisease', data=df)
plt.title('MentalHealth vs SleepTime')
# Взаимодействие между PhysicalHealth и SleepTime
plt.subplot(2, 2, 3)
sns.scatterplot(x='PhysicalHealth', y='SleepTime', hue='HeartDisease', data=df)
plt.title('PhysicalHealth vs SleepTime')
# Сравнение зависимости BMI и MentalHealth
plt.subplot(2, 2, 4)
sns.scatterplot(x='BMI', y='MentalHealth', hue='HeartDisease', data=df)
plt.title('BMI vs MentalHealth')
plt.tight_layout()
plt.show()
In [74]:
# Визуализация данных без учета понимания их особенностей
plt.figure(figsize=(16, 12))
# Взаимодействие между BMI и PhysicalHealth
plt.subplot(2, 2, 1)
sns.scatterplot(x='BMI', y='PhysicalHealth', data=df)
plt.title('BMI vs PhysicalHealth')
# Взаимодействие между MentalHealth и SleepTime
plt.subplot(2, 2, 2)
sns.scatterplot(x='MentalHealth', y='SleepTime', data=df)
plt.title('MentalHealth vs SleepTime')
# Взаимодействие между PhysicalHealth и SleepTime
plt.subplot(2, 2, 3)
sns.scatterplot(x='PhysicalHealth', y='SleepTime', data=df)
plt.title('PhysicalHealth vs SleepTime')
# Сравнение зависимости BMI и MentalHealth
plt.subplot(2, 2, 4)
sns.scatterplot(x='BMI', y='MentalHealth', data=df)
plt.title('BMI vs MentalHealth')
plt.tight_layout()
plt.show()
In [75]:
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# Выбор признаков для кластеризации
X = df[['BMI', 'PhysicalHealth', 'MentalHealth', 'SleepTime']]
# Применение агломеративной кластеризации
agg_clustering = AgglomerativeClustering(n_clusters=3)
clusters = agg_clustering.fit_predict(X)
# Добавление результатов кластеризации в датасет
df['Cluster'] = clusters
# Визуализация дендрограммы
linked = linkage(X, 'ward')
plt.figure(figsize=(10, 7))
dendrogram(linked,
orientation='top',
distance_sort='descending',
show_leaf_counts=True)
plt.title('Dendrogram')
plt.show()
In [76]:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.cluster import MiniBatchKMeans
import matplotlib.pyplot as plt
# Определение функции draw_data_2d
def draw_data_2d(data, feature_x, feature_y, labels, subplot):
subplot.scatter(data.iloc[:, feature_x], data.iloc[:, feature_y], c=labels, cmap='viridis')
subplot.set_xlabel(data.columns[feature_x])
subplot.set_ylabel(data.columns[feature_y])
# Загрузка данных
df = pd.read_csv("..//static//csv//heart_2020_cleaned.csv").head(1000)
# Инициализация LabelEncoder
label_encoders = {}
# Кодирование категориальных переменных
for column in df.select_dtypes(include=['object']).columns:
le = LabelEncoder()
df[column] = le.fit_transform(df[column])
label_encoders[column] = le
# Выбор признаков для кластеризации
X = df[['BMI', 'PhysicalHealth', 'MentalHealth', 'SleepTime']]
# Применение MiniBatchKMeans
kmeans = MiniBatchKMeans(n_clusters=3, random_state=0, batch_size=100)
result = kmeans.fit_predict(X)
# Визуализация результатов кластеризации и истинных меток
plt.figure(figsize=(16, 24))
# Визуализация кластеров на основе признаков 0 и 1
plt.subplot(4, 2, 1)
draw_data_2d(X, 0, 1, result, plt.subplot(4, 2, 1))
plt.title('Clusters (BMI vs PhysicalHealth)')
# Визуализация истинных меток на основе признаков 0 и 1
plt.subplot(4, 2, 2)
draw_data_2d(X, 0, 1, df['HeartDisease'], plt.subplot(4, 2, 2))
plt.title('True Labels (BMI vs PhysicalHealth)')
# Визуализация кластеров на основе признаков 2 и 3
plt.subplot(4, 2, 3)
draw_data_2d(X, 2, 3, result, plt.subplot(4, 2, 3))
plt.title('Clusters (MentalHealth vs SleepTime)')
# Визуализация истинных меток на основе признаков 2 и 3
plt.subplot(4, 2, 4)
draw_data_2d(X, 2, 3, df['HeartDisease'], plt.subplot(4, 2, 4))
plt.title('True Labels (MentalHealth vs SleepTime)')
# Визуализация кластеров на основе признаков 0 и 2
plt.subplot(4, 2, 5)
draw_data_2d(X, 0, 2, result, plt.subplot(4, 2, 5))
plt.title('Clusters (BMI vs MentalHealth)')
# Визуализация истинных меток на основе признаков 0 и 2
plt.subplot(4, 2, 6)
draw_data_2d(X, 0, 2, df['HeartDisease'], plt.subplot(4, 2, 6))
plt.title('True Labels (BMI vs MentalHealth)')
# Визуализация кластеров на основе признаков 1 и 3
plt.subplot(4, 2, 7)
draw_data_2d(X, 1, 3, result, plt.subplot(4, 2, 7))
plt.title('Clusters (PhysicalHealth vs SleepTime)')
# Визуализация истинных меток на основе признаков 1 и 3
plt.subplot(4, 2, 8)
draw_data_2d(X, 1, 3, df['HeartDisease'], plt.subplot(4, 2, 8))
plt.title('True Labels (PhysicalHealth vs SleepTime)')
plt.tight_layout()
plt.show()
In [89]:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
def run_kmeans(data, n_clusters, random_state):
kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)
labels = kmeans.fit_predict(data)
centers = kmeans.cluster_centers_
return labels, centers
def print_cluster_result(data, n_clusters, labels):
for i in range(n_clusters):
cluster_indices = [index for index, label in enumerate(labels) if label == i]
print(f"Cluster {i+1} ({len(cluster_indices)}):")
print(", ".join(map(str, cluster_indices)))
print("--------")
def draw_cluster_results(data, feature_x, feature_y, labels, centers, subplot):
subplot.scatter(data.iloc[:, feature_x], data.iloc[:, feature_y], c=labels, cmap='viridis')
subplot.scatter(centers[:, feature_x], centers[:, feature_y], marker='x', s=200, linewidths=3, color='r')
subplot.set_xlabel(data.columns[feature_x])
subplot.set_ylabel(data.columns[feature_y])
# Применение K-means
random_state = 9
n_clusters = 3
labels, centers = run_kmeans(X, n_clusters, random_state)
print_cluster_result(X, n_clusters, labels)
display(centers)
display(df['HeartDisease'])
# Визуализация результатов кластеризации
plt.figure(figsize=(16, 12))
draw_cluster_results(X, 0, 1, labels, centers, plt.subplot(2, 2, 1))
draw_cluster_results(X, 2, 3, labels, centers, plt.subplot(2, 2, 2))
draw_cluster_results(X, 0, 2, labels, centers, plt.subplot(2, 2, 3))
draw_cluster_results(X, 1, 3, labels, centers, plt.subplot(2, 2, 4))
plt.tight_layout()
plt.show()
In [ ]:
from sklearn.decomposition import PCA
# Понижение размерности до n=2 с использованием PCA
reduced_data = PCA(n_components=2).fit_transform(X)
# Вывод результатов понижения размерности
print(reduced_data)
In [90]:
import matplotlib.pyplot as plt
import pandas as pd
# Визуализация данных после понижения размерности
plt.figure(figsize=(16, 6))
# Визуализация данных без учета истинных меток
draw_data_2d(
pd.DataFrame({"Column1": reduced_data[:, 0], "Column2": reduced_data[:, 1]}),
0,
1,
labels=[0] * len(reduced_data), # Добавляем метки для визуализации
subplot=plt.subplot(1, 2, 1),
)
plt.title('PCA Data (Without True Labels)')
# Визуализация данных с учетом истинных меток
draw_data_2d(
pd.DataFrame({"Column1": reduced_data[:, 0], "Column2": reduced_data[:, 1]}),
0,
1,
df['HeartDisease'],
plt.subplot(1, 2, 2),
)
plt.title('PCA Data (With True Labels)')
plt.tight_layout()
plt.show()
In [93]:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# Определение функции fit_kmeans
def fit_kmeans(data, n_clusters, random_state):
kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)
kmeans.fit(data)
return kmeans
# Определение функции draw_clusters
def draw_clusters(data, kmeans):
labels = kmeans.labels_
centers = kmeans.cluster_centers_
plt.figure(figsize=(10, 6))
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', alpha=0.6)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('K-means Clustering (2 Clusters) with PCA')
plt.show()
# Применение K-means для двух кластеров на пониженных данных
kmeans = fit_kmeans(reduced_data, 2, random_state)
draw_clusters(reduced_data, kmeans)
In [95]:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# Определение функции fit_kmeans
def fit_kmeans(data, n_clusters, random_state):
kmeans = KMeans(n_clusters=n_clusters, random_state=random_state)
kmeans.fit(data)
return kmeans
# Определение функции draw_clusters
def draw_clusters(data, kmeans):
labels = kmeans.labels_
centers = kmeans.cluster_centers_
plt.figure(figsize=(10, 6))
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', alpha=0.6)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='white')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('K-means Clustering (PCA-reduced data)')
plt.show()
# Применение K-means для трех кластеров на пониженных данных
kmeans = fit_kmeans(reduced_data, 3, random_state)
draw_clusters(reduced_data, kmeans)
In [96]:
import matplotlib.pyplot as plt
import pandas as pd
# Преобразование меток кластеров
labels = [2 if val == 1 else 1 if val == 2 else val for val in kmeans.labels_]
# Визуализация результатов кластеризации и истинных меток
plt.figure(figsize=(16, 12))
# Визуализация кластеров на основе признаков 0 и 1
draw_data_2d(
pd.DataFrame({"Column1": reduced_data[:, 0], "Column2": reduced_data[:, 1]}),
0,
1,
labels,
plt.subplot(2, 2, 1),
)
plt.title('Clusters (PCA-reduced data)')
# Визуализация истинных меток на основе признаков 0 и 1
draw_data_2d(
pd.DataFrame({"Column1": reduced_data[:, 0], "Column2": reduced_data[:, 1]}),
0,
1,
df['HeartDisease'],
plt.subplot(2, 2, 2),
)
plt.title('True Labels (PCA-reduced data)')
# Визуализация результатов кластеризации и истинных меток
draw_data_2d(
pd.DataFrame({"Column1": reduced_data[:, 0], "Column2": reduced_data[:, 1]}),
0,
1,
df['HeartDisease'],
plt.subplot(2, 2, 3),
)
plt.title('True Labels (PCA-reduced data)')
plt.tight_layout()
plt.show()