В этой статье мы обсудим, как выполнить исследовательский анализ данных на примере набора данных Iris. Прежде чем продолжить чтение этой статьи, мы использовали две терминологии: EDA и набор данных Iris. Давайте вкратце рассмотрим эти наборы данных.

Что такое предварительный анализ данных?

Исследовательский анализ данных (EDA)— это метод анализа данных с использованием некоторых визуальных техник. С помощью этого метода мы можем получить подробную информацию о статистической сводке данных. Мы также сможем работать с дублирующимися значениями, выбросами, а также выявлять тенденции или закономерности, присутствующие в наборе данных.

Теперь давайте кратко рассмотрим набор данных Iris.

Набор данных Iris

Если вы разбираетесь в науке о данных, то, должно быть, знакомы с набором данных Iris. Если нет, то не волнуйтесь, мы обсудим это здесь.

Набор данных Iris считается «Hello World» для науки о данных. Он содержит пять столбцов: длина лепестка, ширина лепестка, длина чашелистика, ширина чашелистика и тип вида. Ирис — это цветущее растение. Исследователи измерили различные характеристики разных цветков ириса и записали их в цифровом виде.

Вы можете скачать файл Iris.csv по ссылке. Теперь мы будем использовать библиотеку Pandas для загрузки этого CSV-файла и преобразуем его в фрейм данных. Метод read_csv() используется для чтения CSV-файлов.

import pandas as pd

# Reading the CSV file
df = pd.read_csv("Iris.csv")

# Printing top 5 rows
df.head()

Вывод:

прочитать csv eda iris

Получение информации о наборе данных

Мы будем использовать параметр shape, чтобы получить форму набора данных.

Пример:

df.shape

Вывод:

(150, 6)

Мы видим, что фрейм данных содержит 6 столбцов и 150 строк.

Теперь давайте рассмотрим столбцы и их типы данных. Для этого мы воспользуемся методом info().

Пример:

df.info()

Вывод:

iris info EDA

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

Давайте получим краткую статистическую сводку по набору данных с помощью метода describe(). Функция describe() применяет к набору данных базовые статистические вычисления, такие как вычисление крайних значений, количества точек данных, стандартного отклонения и т. д. Любое пропущенное значение или значение NaN автоматически пропускается. Функция describe() даёт хорошее представление о распределении данных.

Пример:

df.describe()

Вывод:

iris описывает EDA

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

Проверка пропущенных значений

Мы проверим, есть ли в наших данных пропущенные значения. Пропущенные значения могут возникать, когда для одного или нескольких элементов или для целого блока не указана информация. Мы будем использовать метод isnull().

Пример:

df.isnull().sum()

Вывод:

отсутствует значение iris EDA

Мы видим, что ни в одном столбце нет пропущенного значения.

Проверка дубликатов

Давайте посмотрим, есть ли в нашем наборе данных дубликаты. Метод Pandas drop_duplicates() помогает удалить дубликаты из фрейма данных.

Пример:

data = df.drop_duplicates(subset ="Species",)
data

Вывод:

iris дублирует EDA

Мы видим, что существует только три уникальных вида. Давайте посмотрим, сбалансирован ли набор данных, то есть все ли виды содержат одинаковое количество строк. Мы будем использовать функцию Series.value_counts(). Эта функция возвращает серию, содержащую количество уникальных значений.

Пример:

df.value_counts("Species")

Вывод:

подсчет значений iris EDA

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

Визуализация данных

Визуализация целевого столбца

Нашим целевым столбцом будет столбец «Вид», потому что в итоге нам понадобится результат только по видам. Давайте посмотрим на диаграмму распределения по видам.

Пример:

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt

sns.countplot(x='Species', data=df, )
plt.show()

Вывод:

графическая диаграмма iris EDA

Связь между переменными

Мы рассмотрим соотношение между длиной и шириной чашелистика, а также между длиной и шириной лепестка.

Пример 1: Сравнение длины и ширины чашелистика

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(x='SepalLengthCm', y='SepalWidthCm',
                hue='Species', data=df, )

# Placing Legend outside the Figure
plt.legend(bbox_to_anchor=(1, 1), loc=2)

plt.show()

Вывод:

Из приведенного выше графика мы можем сделать вывод, что –

  • У вида Setosa длина чашелистиков меньше, но ширина чашелистиков больше.
  • Versicolor Species занимает промежуточное положение между двумя другими видами по длине и ширине чашелистика
  • У вида Virginica длина чашелистиков больше, но ширина чашелистиков меньше.

Пример 2: Сравнение длины и ширины лепестков

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt


sns.scatterplot(x='PetalLengthCm', y='PetalWidthCm',
                hue='Species', data=df, )

# Placing Legend outside the Figure
plt.legend(bbox_to_anchor=(1, 1), loc=2)

plt.show()

Выход:

связь между переменными peta iris EDA

Из приведенного выше графика мы можем сделать вывод, что –

  • Вид Setosa имеет меньшую длину и ширину лепестков.
  • Вид Versicolor занимает промежуточное положение между двумя другими видами по длине и ширине лепестков.
  • Вид Virginica имеет самые большие длину и ширину лепестков.

Давайте построим график всех взаимосвязей столбцов с помощью парного графика. Его можно использовать для многомерного анализа.

Пример:

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt

sns.pairplot(df.drop(['Id'], axis = 1), 
             hue='Species', height=2)

Вывод:

парная диаграмма радужной оболочки глаза EDA

На этом графике мы можем увидеть множество взаимосвязей, например, что у вида Setosa наименьшая ширина и длина лепестков.У него также самая маленькая длина чашечки, но более широкая чашечка.Такую информацию можно собрать в любом другом виде.

Гистограммы

Гистограммы позволяют просматривать данные при различных состояниях.Их можно использовать как для одномерного, так и для двумерного анализа.

Пример:

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt


fig, axes = plt.subplots(2, 2, figsize=(10,10))

axes[0,0].set_title("Sepal Length")
axes[0,0].hist(df['SepalLengthCm'], bins=7)

axes[0,1].set_title("Sepal Width")
axes[0,1].hist(df['SepalWidthCm'], bins=5);

axes[1,0].set_title("Petal Length")
axes[1,0].hist(df['PetalLengthCm'], bins=6);

axes[1,1].set_title("Petal Width")
axes[1,1].hist(df['PetalWidthCm'], bins=6);

Вывод:

гистограмма ириса ЭДА

Из приведенного выше графика мы можем видеть, что –

  • Максимальная длина чашелистиков составляет от 30 до 35 мм, то есть от 5,5 до 6.
  • Максимальная ширина чашелистиков составляет около 70 мм, то есть от 3,0 до 3,5.
  • Максимальная длина лепестков составляет около 50, то есть от 1 до 2.
  • Максимальная ширина лепестков составляет от 40 до 50, то есть от 0,0 до 0,5.

Гистограммы с диаграммой Distplot

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

Пример:

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt

plot = sns.FacetGrid(df, hue="Species")
plot.map(sns.distplot, "SepalLengthCm").add_legend()

plot = sns.FacetGrid(df, hue="Species")
plot.map(sns.distplot, "SepalWidthCm").add_legend()

plot = sns.FacetGrid(df, hue="Species")
plot.map(sns.distplot, "PetalLengthCm").add_legend()

plot = sns.FacetGrid(df, hue="Species")
plot.map(sns.distplot, "PetalWidthCm").add_legend()

plt.show()

Вывод:

distplot ирис EDAотобразить iris EDA

Из приведенных выше графиков мы можем видеть, что –

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

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

Обработка аналогий

Панды dataframe.корр() используется для поиска попарной корреляции всех столбцов в рамках данных.Любые значения NA автоматически проверяются.Для столбцов нечислового типа в рамке данных это игнорируется.

Пример:

data.select_dtypes(include=['number']).corr(method='pearson')

# This code is modified by Susobhan Akhuli

Вывод:

ирис корр EDA

Тёплые карты

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

Пример:

# importing packages 
import seaborn as sns 
import matplotlib.pyplot as plt 


sns.heatmap(df.select_dtypes(include=['number']).corr(method='pearson').drop( 
['Id'], axis=1).drop(['Id'], axis=0), 
            annot = True); 

plt.show()

# This code is modified by Susobhan Akhuli

Выход:

тепловая карта радужной оболочки глаза EDA

Из приведенного выше графика мы видим, что –

  • Ширина и длина лепестка имеют высокую корреляцию.
  • Длина лепестка и ширина чашелистика имеют хорошую корреляцию.
  • Ширина лепестка и длина чашелистика имеют хорошую корреляцию.

Диаграммы ящиков

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

Пример:

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt

def graph(y):
    sns.boxplot(x="Species", y=y, data=df)

plt.figure(figsize=(10,10))
    
# Adding the subplot at the specified
# grid position
plt.subplot(221)
graph('SepalLengthCm')

plt.subplot(222)
graph('SepalWidthCm')

plt.subplot(223)
graph('PetalLengthCm')

plt.subplot(224)
graph('PetalWidthCm')

plt.show()

Вывод:

boxplot iris EDA

Из приведенного выше графика мы можем видеть, что –

  • Вид Сетоза имеет наименьшие признаки и менее распространен, с некоторыми выбросами.
  • Вид Versicolor имеет средние характеристики.
  • Вид Virginica обладает самыми высокими характеристиками

Обработка выбросов

Выброс — это элемент данных/объект, который значительно отличается от остальных (так называемых нормальных) объектов. Они могут быть вызваны ошибками измерения или выполнения. Анализ для выявления выбросов называется поиском выбросов. Существует множество способов выявления выбросов, а процесс их удаления аналогичен удалению элемента данных из фрейма данных pandas.

Давайте рассмотрим набор данных «Ирис» и построим диаграмму размаха для столбца SepalWidthCm.

Пример:

# importing packages
import seaborn as sns
import matplotlib.pyplot as plt

# Load the dataset
df = pd.read_csv('Iris.csv')

sns.boxplot(x='SepalWidthCm', data=df)

Вывод:

На приведённом выше графике значения выше 4 и ниже 2 являются выбросами.

Удаление выбросов

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

Пример: мы обнаружим выбросы с помощью IQR, а затем удалим их. Мы также построим диаграмму размаха, чтобы проверить, удалены ли выбросы.

# Importing
import numpy as np

# Load the dataset 
df = pd.read_csv('Iris.csv') 

# IQR 
Q1 = np.percentile(df['SepalWidthCm'], 25, 
                interpolation = 'midpoint') 

Q3 = np.percentile(df['SepalWidthCm'], 75, 
                interpolation = 'midpoint') 
IQR = Q3 - Q1 

print("Old Shape: ", df.shape) 

# Upper bound 
upper = np.where(df['SepalWidthCm'] >= (Q3+1.5*IQR)) 

# Lower bound 
lower = np.where(df['SepalWidthCm'] <= (Q1-1.5*IQR)) 

# Removing the Outliers 
df.drop(upper[0], inplace = True) 
df.drop(lower[0], inplace = True) 

print("New Shape: ", df.shape) 

sns.boxplot(x='SepalWidthCm', data=df)

# This code is modified by Susobhan Akhuli

Вывод:

удаление выбросов EDA