Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в анализ данных.docx
Скачиваний:
0
Добавлен:
16.05.2025
Размер:
1.52 Mб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

Кафедра 41

ПРЕПОДАВАТЕЛЬ

Профессор, д-р техн. наук

Т. М. Татарникова

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

Лабораторная работа №1

Кластеризация данных

по курсу: Введение в анализ данных

СТУДЕНТКА ГР. №

Z0411

23.05.23

М. В. Карелина

номер группы

подпись, дата

инициалы, фамилия

Номер студенческого билета: 2020/3477

Санкт-Петербург

2023

Цель работы:

изучить алгоритмы и методы кластерного анализа на практике.

Задание:

1.Получить у преподавателя набор данных для проведения кластерного анализа, при необходимости провести нормализацию и кодирование данных. Одним из двух методов: иерархическим агломеративным или методом k-средних выполнить кластеризацию объектов, представленных в варианте задания.

Вариант 4. Датасет heart.

Код вместе с описанием и скриншотами:

Для начала загрузим необходимые библиотеки.

import pandas as pd

import csv

import matplotlib.pyplot as plt

import numpy as np

from sklearn.preprocessing import StandardScaler

from sklearn.cluster import KMeans

from scipy.cluster.hierarchy import dendrogram, linkage

from sklearn.metrics import silhouette_score

from scipy.spatial import distance

from sklearn.cluster import AgglomerativeClustering

from yellowbrick.cluster import KElbowVisualizer

import seaborn as sns

Специально для Google Colab загрузим необходимый файл csv.

from google.colab import files

uploaded = files.upload()

Далее на экран выведем первые 10 строк из файла (Рис. 1).

Рисунок 1 - Вывод на экран первых 10 строк

Теперь необходимо было оценить данные. На рисунке 2 видно, что некоторые названия столбцов неправильные, а именно начинаются с большой буквы.

dataframe.info()

Рисунок 2 – Оценка данных

Для того, чтобы, верно, ввести текущие названия столбцов для их последующего исправления, применила метод columns, который выводит названия колонок через запятую (Рис.3).

print(dataframe.columns)

Рисунок 3 – Применения метода columns

С помощью метода rename() столбцы переименовываются, а с помощью метода info() проверяется правильность этого переименования (Рис.4).

for Name, values in dataframe.items():

  dataframe.rename(columns={Name:Name.lower()},inplace=True)

dataframe.rename(columns={'death_event':'died'},inplace=True)

dataframe.rename(columns={'time':'time_since_first_visit'},inplace=True)

print(dataframe.info())

Рисунок 4 – Переименование столбцов

Описание колонок:

age - здесь представлен возраст пациентов. Столбец имеет целочисленный тип данных.

anaemia - здесь представлена информация, есть ли у пациента анемия, где 1 - есть, а 0 - нет. Столбец имеет булев тип данных.

creatinine_phosphokinase - здесь представлена информация о количестве креатинфосфокиназы в крови. Столбец имеет целочисленный тип данных.

diabetes - здесь представлена информация, есть ли у пациента диабет, где 1 - есть, а 0 - нет. Столбец имеет булев тип данных.

ejection_fraction - здесь представлена информация об объеме фракции выброса. Столбец имеет целочисленный тип данных.

high_blood_pressure - здесь представлена информация об артериальном давлении. Столбец имеет целочисленный тип данных.

platelets - здесь представлена информация о количестве тромборцитов. Столбец имеет тип данных: числовой с плавающей точкой.

serum_creatinine - здесь представлена информация о количестве креатинина в сыворотке. Столбец имеет тип данных: числовой с плавающей точкой.

serum_sodium - здесь представлена информация о количестве натрия в сыворотке. Столбец имеет тип данных: числовой с плавающей точкой.

sex - здесь представлен пол посетителя спортзала, где 1 - мужской пол, а 0 - женский. Столбец имеет булев тип данных.

smoking - здесь представлена информация, курит ли пациент, где 1 - да, а 0 - нет. Столбец имеет булев тип данных.

time_since_first_visit - здесь представлена информация о времени с первого визита. Столбец имеет целочисленный тип данных.

died - здесь представлена информация, умер ли пациент, где 1 - да, а 0 - нет. Столбец имеет булев тип данных.

Далее необходимо проверить, есть ли пропуски в данных, с помощью метода df.isna().sum(). Видно, что пропуски отсутствуют, а значит, можно приступать к поиску дубликатов.

Далее проверила, есть ли пропуски в данных, с помощью метода df.isna().sum(). На рисунке 5 видно, что пропуски отсутствуют.

print(dataframe.isna().sum())

#fillna(0)

#dropna

Рисунок 5 – Обнаружение пропусков данных

Явные дубликаты рациональнее удалять уже после устранения неявных, а именно замены, объектов, имеющих немного отличающиеся названия, но при этом являющихся одним и тем же объектом по сути. С помощью метода unique и sort на экран выводятся все, что есть в столбце "пол" по возрастанию. Сортировка нужна, чтобы было легче искать дубликаты. Некорректных значений нигде обнаружено (Рис.6).

dataframe['sex'].unique()

array([1, 0])

for Name, values in dataframe.items():

  print(Name)

  gen = dataframe[Name].unique()

  gen.sort()

  print(gen, '\n')

Рисунок 6 – Поиск некорректных результатов

Далее производится проверка на наличие явных дубликатов. print(dataframe.duplicated().sum())

Явных дубликатов не обнаружено.

С помощью метода df.dtypes производим проверку типов данных столбцов (Рис.7).

print(dataframe.dtypes)

# str - object

Рисунок 7 – Проверка типа данных столбцов

Необходимо поменять тип данных столбца "Возраст" и "Тромбоциты" на целочисленный, а после ещё раз проверить правильность. У столбцов, где ожидается булев тип данных, тип данных не будет изменён с целочисленного, т.к. это помешает дальнейшему построению графиков (Рис.18).

dataframe['age'] = dataframe['age'].astype('int64')

dataframe['platelets'] = dataframe['platelets'].astype('int64')

print(dataframe.dtypes)

Рисунок 8 – Замена age и platelets на int

Далее перейдем непосредственно к самой кластеризации.