Глубокое погружение в исследовательский анализ данных: набор данных о покемонах

Вступление

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

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

Я взял один из самых интересных наборов данных о покемонах для всех людей 90-х годов, но не волнуйтесь, если вы не знаете о покемонах, набор данных довольно прост для понимания.

Итак, поехали!

Готовиться

Сегодня в python присутствует множество библиотек визуализации, которые дают потрясающие графики и графики, некоторые из этих библиотек:

  • Matplotlib: библиотека двухмерных графиков Python.
  • Seaborn: предоставляет интерфейс высокого уровня.
  • Plotly: создание интерактивных графиков.
  • Боке: это очень интерактивная библиотека.
  • ggplot: на основе ggplot R и грамматики графики

В этой статье мы собираемся изучить некоторые из самых замечательных методов визуализации с использованием Matplotlib и Seaborn. Визуализация данных - это первый шаг, после визуализации мы собираемся изучить некоторые важные методы манипулирования данными. Я буду часто использовать pandas и numpy, если вы хотите узнать об этом больше, нажмите здесь.

Установка

#install Matplotlib
pip install matplotlib
#install Seaborn
pip install seaborn

Набор данных

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

Ссылка на набор данных- › https://www.kaggle.com/abcsds/pokemon

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

Начало работы

Прежде чем приступить к работе, необходимо помнить о нескольких вещах:

  • Проверить отсутствующие значения
  • Проверить классовый дисбаланс
  • Проверить наличие избыточных атрибутов
  • Проверить распределение различных атрибутов
  • Проверить выбросы

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

Исправление орфографических ошибок

Как видите, имя мега-покемона неправильное, поэтому исправьте имена для мега-эволюционировавших покемонов. [VenusaurMega Venusaur - ›Mega Venusaur]

Чтобы проверить отсутствующие значения:

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

Прочтите статью Визуализация закономерностей появления пропущенных значений с помощью Python »о визуализации пропущенных значений с использованием двух вышеупомянутых подходов.

Что делать дальше после обнаружения недостающего значения?

Найдя недостающие значения, мы можем сделать следующее:

  1. Удалите строки с пропущенными значениями.
  2. Выберите глобальное значение, чтобы заменить все отсутствующие значения атрибута.
  3. Используйте Среднее значение атрибута и замените все отсутствующие значения этим средним.
  4. Используйте медиану атрибута и замените все отсутствующие значения этой медианой.
  5. Существуют различные прогностические модели для оценки заполняемого значения.

Вы можете перейти к этой замечательной статье для заполнения пропущенного значения: Как обрабатывать отсутствующие данные

Здесь, поскольку атрибут Type2 имеет 386 пропущенных значений, я просто поместил значения Type1 в Type2 из-за того, что у некоторых Pokemon присутствует только 1 тип, и даже если есть 2 типа, обычно Pokemons имеет 1 тип сильнее, чем 2 типа. , поэтому для отсутствующих значений это сработает.

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

Проверьте дисбаланс классов

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

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

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

Проверьте наличие избыточных атрибутов:

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

Есть разные способы выбора лучших функций, некоторые из них:

  1. Одномерный выбор
  2. Важность функции
  3. Матрица корреляции с тепловой картой

Вы можете посетить эту статью Методы выбора функций в машинном обучении с помощью Python для получения дополнительной информации.

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

На данный момент удаление категориальных функций для анализа влияния некатегориальных данных на Type1 и Type2.

Проверить выбросы

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

BoxPlots:

Медиана (Q2 / 50-й процентиль): среднее значение набора данных. Первый квартиль (Q1 / 25-й процентиль): среднее число между наименьшим числом и медианой набора данных.

Третий квартиль (Q3 / 75-й процентиль): среднее значение между медианой и наивысшим значением набора данных. Межквартильный диапазон (IQR): от 25-го до 75-го процентиля. усы (показаны синим цветом ) Выбросы (показаны зелеными кружками) «максимум»: Q3 + 1,5 * IQR «минимум»: Q1 -1,5 * IQR

Обратитесь к этой статье Понимание коробчатых графиков, чтобы узнать больше о коробчатых графиках.

Визуализация различных атрибутов

Полосовая диаграмма, Коробчатая диаграмма и Гистограмма, Ройные диаграммы, Факторные диаграммы , и Радарная диаграмма - отличный способ визуализировать различные атрибуты в наборе данных.

Функция принимает Тип1 или Тип2 (цель) и рисует полосовую диаграмму и прямоугольную диаграмму, соответствующие атрибуту, выбранному в функции, кроме того, прямоугольная диаграмма также строится с использованием среднего взятого атрибута, сгруппированного по Type1 или Type2 (Target).

Проверка категориальных атрибутов: атрибуты «Генерация» и «Легендарный» влияют на набор данных.

Участки роя

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

Кроме того, мы должны увидеть, как количество покемонов каждого типа зависит от поколения, как показано ниже:

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

Теперь мы увидим влияние Легендарного на различные атрибуты. Я использовал Фактор-график, чтобы четко различать легендарного и нелегендарного покемона.

Из приведенного выше графика видно, что легендарный покемон (оранжевый) имеет более высокое общее количество, чем нелегендарный покемон (синий ).

Сравнение разных покемонов

  • Гистограмма для каждого атрибута для сравнения двух разных покемонов.

  • Радарная диаграмма для сравнения двух разных покемонов.

#Code for Radar Chart
pok1=daily_Data.loc[pokemon1]
pok2=daily_Data.loc[pokemon2]
# Libraries
import matplotlib.pyplot as plt
import pandas as pd
from math import pi
fig = plt.figure(figsize=(10, 10))
# Set data
df = pd.DataFrame({
'group': ['A','B'],
'HP': [pok1["HP"], pok2["HP"]],
'Attack': [pok1["Attack"], pok2["Attack"]],
'Defense': [pok1["Defense"], pok2["Defense"]],
'Sp. Atk': [pok1["Sp. Atk"], pok2["Sp. Atk"]],
'Sp. Def': [pok1["Sp. Def"], pok2["Sp. Def"]],
'Speed': [pok1["Speed"], pok2["Speed"]]
})
#maximum among all
maximum=max([pok1["Attack"], pok2["Attack"],pok1["Defense"], pok2["Defense"],pok1["Sp. Atk"], pok2["Sp. Atk"],
pok1["Sp. Def"], pok2["Sp. Def"],pok1["Speed"], pok2["Speed"]])
 
# ------- PART 1: Create background
 
# number of variable
categories=['HP', 'Attack', 'Defense', 'Sp. Atk',
       'Sp. Def', 'Speed']
N = len(categories)
#to select the range, means till where the graph can go for a variable.
aa=[]
aaa=[]
for i in range(maximum):
    aa.append(i*10)
    aaa.append(str(i*10))
# What will be the angle of each axis in the plot? (we divide the plot / number of variable)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]
 
# Initialise the spider plot
ax = plt.subplot(111, polar=True)
 
# If you want the first axis to be on top:
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)
 
# Draw one axe per variable + add labels labels yet
plt.xticks(angles[:-1], categories,size=15,color="black")
# Draw ylabels
ax.set_rlabel_position(0)
plt.yticks(aa, aaa, color="black", size=15)
plt.ylim(0,maximum)
# ------- PART 2: Add plots
 
# Plot each individual = each line of the data 
# Ind1
values=df.loc[0].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=4, linestyle='solid', label=pokemon1,color=color1)
ax.fill(angles, values, color1, alpha=0.1)
 
# Ind2
values=df.loc[1].drop('group').values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=4, linestyle='solid', label=pokemon2,color=color2)
ax.fill(angles, values, color2, alpha=0.1)
 
# Add legend
plt.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))

Код для всей статьи можно найти на https://www.kaggle.com/ayush01/complete-pokemon-stats-visualization