Изучите основные методы интеллектуального анализа данных

В современном мире набор навыков специалиста по данным требуется сейчас больше, чем когда-либо. Это уже не просто кодирование; он использует огромные объемы данных, которые генерируются каждую секунду, и принимает решения на их основе. Интеллектуальный анализ данных — один из таких процессов; это процесс анализа огромных объемов данных и извлечения значимых идей, которые могут помочь организации проанализировать риски, предсказать будущие тенденции и т. д. По мере изучения данных они обнаруживают новые идеи, и, таким образом, интеллектуальный анализ данных может также называться KDD или Обнаружение знаний в базах данных. Занимаясь интеллектуальным анализом данных, специалист по данным или аналитик должен пройти следующие этапы:

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

Импорт набора данных

# Importing necessary libraries
import pandas as pd
import numpy as np
path = "file_path\healthcare-dataset-stroke-data.csv"
df = pd.read_csv(path)
df
# --- OR ---
#Google Colab users can do the following
# import necessary libraries
from google.colab import files
uploaded = files.upload()
df = pd.read_csv(io.BytesIO(uploaded['healthcare-dataset-stroke-data.csv']))
df

Теперь, когда набор данных импортирован как DataFrame pandas, мы проверяем тип данных всех столбцов с помощью «df.dtypes». Он выводит типы данных как object, int, float и т. д. в зависимости от того, из каких значений состоит столбец.

df.dtypes

Преобразование данных

Мы получаем тип данных столбца с именем «возраст» как число с плавающей запятой, но он должен быть в целочисленном формате. Таким образом, мы преобразуем его тип данных в целочисленный для лучшего анализа.

df.age = df[['age']].astype(int)

Числовые и категориальные значения

Для простоты мы проходим по каждому столбцу и разделяем наш фрейм данных на числовой и категориальный типы данных. Анализ обоих этих типов данных по отдельности является гораздо более эффективным способом анализа.

# numeric data is stored as a subset in another dataframe
df_numeric = df[['id', 'age', 'hypertension', 'heart_disease', 'avg_glucose_level', 'bmi', 'stroke']]
# categorical data is stored as a subset in another dataframe
df_categorical = df[['gender', 'ever_married', 'work_type', 'Residence_type', 'smoking_status']]

Кодирование категорийных данных

При кодировании столбца есть 2 условия; имеет ли он 2 или более 2 категорий. Мы разделяем каждую категорию на отдельный столбец. Кодировщики преобразуют метки в числовые значения для повышения удобочитаемости при применении алгоритма машинного обучения.

Во-первых, мы получаем количество меток в каждом столбце. Это может быть реализовано следующим образом:

# .unique() prints how many unique values does each column have
print(df_categorical['gender'].unique())
print(df_categorical['ever_married'].unique())
print(df_categorical['work_type'].unique())
print(df_categorical['Residence_type'].unique())
print(df_categorical['smoking_status'].unique())

Во-вторых, мы наблюдаем, что 2 столбца, т. е. «ever_married» и «Residence_type», имеют 2 уникальных метки. LabelEncoder используется для преобразования их в числовые категории.

#pip install sklearn
from sklearn.preprocessing import LabelEncoder
# Label Encoding 'ever_married' column
ever_married_encoder = LabelEncoder()
ever_married_values = ever_married_encoder.fit_transform(df_categorical['ever_married'])
# Label Encoding 'Residence_type' column
Residence_type_encoder = LabelEncoder()
Residence_type_values = Residence_type_encoder.fit_transform(df_categorical['Residence_type'])
# To view the output, you can run the following code
# It will return the output as an array
ever_married_values[:10]

В-третьих, мы наблюдаем, что у нас есть большинство столбцов, то есть «пол», «тип работы» и «статус курения» с более чем двумя уникальными значениями, поэтому мы используем OneHotEncoder для преобразования их в числовые категории. Ниже приведен код для того же самого, при реализации его в других столбцах просто измените имена столбцов в коде.

#pip install sklearn
from sklearn.preprocessing import OneHotEncoder
gender_encoder = OneHotEncoder()
gender_reshaped = np.array(df_categorical['gender']).reshape(-1, 1)
gender_values = gender_encoder.fit_transform(gender_reshaped)
# To view the output, you can run the following code
# It will return the output as an array
print(gender_values.toarray()[:10])
# If you want to check the list with the values of the dataframe, run the following
print(df_categorical['gender'].head(10))

Объединение всех категорийных данных

Все данные, которые мы только что закодировали, хранятся в виде списков. Чтобы объединить его в комбинированный фрейм данных, мы сначала преобразуем их все в фреймы данных panda, а затем проведем дальнейший анализ.

# Creating each column as a data frame
is_married = pd.DataFrame(ever_married_values, columns=['is_married'])
residence_type = pd.DataFrame(Residence_type_values, columns=['residence_type'])
gender = pd.DataFrame(gender_values.toarray(), columns=['Female', 'Male', 'Other'])
moking_status = pd.DataFrame(smoking_status_values.toarray(), columns=['Unknown', 'formerly smoked', 'never smoked', 'smokes'])
work_type = pd.DataFrame(work_type_values.toarray(), columns=['Private', 'Self-employed', 'Govt_job', 'children', 'Never_worked'])
# Combining all the above data frames into one
df_categorical_combined = pd.concat([is_married, residence_type, gender, smoking_status, work_type], axis=1) # axis=1 -> column
# Displaying the data frame
df_categorical_combined

Объединение категорийных и числовых данных

Теперь, когда мы предварительно обработали категориальные данные, мы можем объединить как числовые, так и категориальные данные, чтобы получить окончательный набор данных.

df_final = pd.concat([df_numeric, df_categorical_combined], axis=1)
df_final # displays the data frame

Работа со значениями NaN

df_final['bmi'].isna().sum()
# Output: 201

При проверке значений NaN мы обнаруживаем, что в столбце «ИМТ» имеется 201 значение NaN. Несмотря на то, что этот набор данных может быть недействительным, но он обрабатывает его как набор данных из реального мира, мы не можем игнорировать эти значения NaN, отбрасывать их или заполнять эти отсутствующие значения. Итак, мы заменяем это значение либо режимом, либо средним значением этого столбца.

# Finding the standard deviation of the column
df_final['bmi'].std()
# Output: 7.854066729680164
# Finding the mean of the column
df_final['bmi'].mean() 
# Output: 28.893236911794666
# Finding the mode of the column 
df_final['bmi'].mode()
# Output: 0    28.7

Поскольку оба значения примерно одинаковы, мы выбираем моду, поскольку она ближе к центральному значению.

df_final['bmi'] = df_final['bmi'].replace(np.nan, 28.7)

Теперь мы полностью обработали и очистили данные. Теперь мы можем делать выводы из визуализации данных.

Визуализация

Возраст и ИМТ

# pip install matplotlib
import matplotlib.pyplot as plot
plt.scatter(df_final['age'], df_final['bmi'])
plt.title("Scatter Plot")
plt.xlabel('Age')
plt.ylabel('BMI')
plt.xlim(40, 60)
plt.show()

Вывод: наблюдается, что люди в возрасте от 40 до 60 лет, как правило, имеют более высокий ИМТ, чем другие возрастные группы, что означает очень очевидный факт, что чем старше возраст, тем меньше физическая активность, что приводит к более высокому ИМТ. .

Возраст vs Никогда не работал

# pip install seaborn
import seaburn as sns
sns.histplot(x='age', data=df_final, kde=True, hue='Never_worked')
plt.show()

Вывод: замечено, что люди моложе 18 лет (приблизительно) никогда не работали, но есть совпадение, которое означает зашумленные или неверные данные.

Средний уровень глюкозы в зависимости от возраста и ИМТ

sns.scatterplot(x='avg_glucose_level', y='age', data=df_final, hue='bmi')
plt.xlim(130, 150)
plt.show()

Вывод: видно, что большая часть образца имеет средний уровень глюкозы от низкого до среднего. С возрастом средний уровень глюкозы и ИМТ увеличиваются. Это можно предположить как увеличение веса из-за меньшей физической активности и/или большего потребления пищи.

Возраст против дыма

sns.histplot(x='age', data=df_final, kde=True, hue='smokes')
plt.show()

Вывод.В данном наборе данных число людей, которые регулярно курят, меньше.

Женаты и инсульт

sns.histplot(x='is_married', data=df_final, kde=True, hue='stroke')
plt.show()

Вывод. Люди, состоящие в браке, как правило, имеют более высокий риск инсульта.

Это некоторые из визуализаций, которые я выполнил, вы можете выполнить некоторые из них, следуя некоторым из приведенных ниже диаграмм визуализации.

Вы также можете попробовать одномерный, двумерный и многомерный анализ, изучив документацию библиотеки seaborn и библиотеки matplotlib. Вот ссылка на мой блокнот Google-Colab. Смело обращайтесь к нему и ознакомьтесь с дополнительными исследованиями того же набора данных.