Введение
Я выбрал данный датасет из-за того, что эта тема мне интересна и сам для себя хотел выявить лучших бойцов.
Датасет был выбран на ресурсе https://www.kaggle.com/datasets.
В проекте использованы такие диаграммы как: -Столбчатая —круговая
На мой взгляд, они наиболее наглядно показывают информацию
Блок 1: Импорт библиотек и загрузка данных
import pandas as pd import matplotlib.pyplot as plt
Загружаем CSV файл
file_path = '/content/UFC_Records.csv' ufc_data = pd.read_csv (file_path)
Просмотр первых строк данных
ufc_data.head ()
Импортируем библиотеки: использую pandas для работы с данными и matplotlib.pyplot для визуализации.
Загружаю данные: CSV файл, содержащий информацию о бойцах UFC.
Просмотр данных: вывожу первые несколько строк таблицы, чтобы убедиться, что данные загружены корректно.
Блок 2: Фильтрация и создание сводной таблицы
Оставляем только нужные строки для каждой метки
ufc_data_filtered = ufc_data[ufc_data['Type of Record'].isin ([…])]
Создаю сводную таблицу, где каждый боец в строках, а метки — в столбцах
ufc_data_pivoted = ufc_data_filtered.pivot_table (index="Name», columns="Type of Record», values="Total», aggfunc="first»)
Просмотр первых строк преобразованных данных
ufc_data_pivoted.head ()
Фильтрация данных: я отобрал только те строки, которые содержат информацию о рекордах бойцов (например, победы, количество боёв, и т. д.).
Создание сводной таблицы: преобразовал данные, чтобы для каждого бойца в строке находились его различные рекорды (в столбцах).
Просмотр данных: вывожу первые строки преобразованных данных, чтобы убедиться, что таблица имеет правильный вид
Блок 3: Проверка данных с пропусками (NaN) после сводной таблицы
Проверка на пропуски (NaN)
ufc_data_pivoted.isna ().sum ()
Заменяем пропущенные значения (NaN) на 0
ufc_data_pivoted_filled = ufc_data_pivoted.fillna (0)
Проверка, что пропуски заменены
ufc_data_pivoted_filled.isna ().sum ()
Проверка на пропуски: проверяю, есть ли пропущенные значения (NaN) в данных.
Заполнение пропусков: если есть пропущенные значения, заменяю их на 0, так как не можем работать с пустыми ячейками.
Блок 4: Нормализация данных и отображение всей таблицы
from sklearn.preprocessing import MinMaxScaler from IPython.display import display
Список столбцов для нормализации
columns_to_normalize = […]
Нормализуем данные
scaler = MinMaxScaler () ufc_data_normalized = ufc_data_pivoted_filled.copy () ufc_data_normalized[columns_to_normalize] = scaler.fit_transform (ufc_data_pivoted_filled[columns_to_normalize])
Отображаем всю таблицу
display (ufc_data_normalized)
Нормализация данных: для того, чтобы сравнивать бойцов по разным меткам (например, победы, нокауты), я нормализовал все числовые данные, чтобы они имели одинаковую шкалу от 0 до 1.
Отображение данных: вывожу нормализованные данные для проверки.
Блок 5: Создание итоговой оценки для каждого бойца
Создаем итоговую оценку для каждого бойца
ufc_data_normalized['Final Score'] = ufc_data_normalized[columns_to_normalize].mean (axis=1)
Сортируем бойцов по итоговому баллу и сбрасываем индекс
best_fighter = ufc_data_normalized.sort_values (by='Final Score', ascending=False).head (1).reset_index ()
Просмотр лучшего бойца
print («Самый лучший боец по всем меткам:») print (best_fighter[['Name', 'Final Score']])
Итоговый балл: для каждого бойца вычислил итоговый балл как среднее значение по всем меткам (например, победы, нокауты, и т. д.).
Сортировка бойцов: сортирую бойцов по итоговому баллу и нахожу бойца с наибольшим баллом — это и есть лучший боец.
Вывод лучшего бойца: показывает имя и итоговый балл лучшего бойца.
Блок 6: Топ-10 бойцов по итоговому баллу
Топ-10 бойцов по итоговому баллу
top_10_fighters = ufc_data_normalized[['Final Score']].sort_values (by='Final Score', ascending=False).head (10).reset_index ()
Отображаем топ-10 бойцов
print («\nТоп-10 бойцов по итоговому баллу:») display (top_10_fighters[['Name', 'Final Score']]) Топ-10 бойцов: вывод 10 лучших бойцов с самыми высокими итоговыми баллами.
Отображение топ-10: вывод имен бойцов и их итоговые баллы.
Блок 7: Гистограмма для лучших 20 бойцов по итоговому баллу
Сортируем бойцов по итоговому баллу и выбираем топ-20
top_20_fighters = ufc_data_normalized[['Final Score']].sort_values (by='Final Score', ascending=False).head (20).reset_index ()
Строим гистограмму
plt.figure (figsize=(12, 6)) plt.barh (top_20_fighters['Name'], top_20_fighters['Final Score'], color='lightblue') plt.xlabel ('Итоговый балл') plt.ylabel ('Бойцы') plt.title ('Топ-20 бойцов по итоговому баллу') plt.gca ().invert_yaxis ()
Инвертирую ось для отображения самых высоких значений сверху
plt.show ()
Строим горизонтальную гистограмму для визуального представления топ-20 бойцов с наивысшими итоговыми баллами.
Блок 8: Количество рекордов у бойцов
Считаем количество уникальных записей (рекордов) для каждого бойца
record_counts = ufc_data.groupby ('Name')['Type of Record'].nunique ()
Строим график распределения количества рекордов у бойцов
plt.figure (figsize=(12, 6)) record_counts.sort_values (ascending=False).head (20).plot (kind='bar', color='salmon') plt.title ('Топ-20 бойцов с наибольшим количеством рекордов') plt.ylabel ('Количество рекордов') plt.xlabel ('Бойцы') plt.xticks (rotation=90) plt.show ()
Распределение рекордов: сколько уникальных типов рекордов (например, количество побед, нокаутов и т. д.) есть у каждого бойца
Строим график, показывающий бойцов с наибольшим количеством рекордов.
Блок 9: Круговая диаграмма для распределения бойцов по количеству боёв
Разделяем бойцов на категории по количеству боёв
bins = [0, 10, 20, 30, 40, 50, 100] labels = ['0-10', '11-20', '21-30', '31-40', '41-50', '50+'] ufc_data['Total Fights Categories'] = pd.cut (ufc_data['Total'], bins=bins, labels=labels)
Считаем количество бойцов в каждой категории
fight_categories = ufc_data['Total Fights Categories'].value_counts ()
Строим круговую диаграмму для распределения по категориям
plt.figure (figsize=(8, 8)) fight_categories.plot (kind='pie', autopct='%1.1f%%', colors=['#FFD700', '#ADFF2F', '#FF4500', '#20B2AA', '#8A2BE2', '#FF6347'], startangle=90) plt.title ('Распределение бойцов по количеству боёв') plt.ylabel ('') # Убираем метку оси Y plt.show ()
Распределение бойцов по количеству боёв: распределение бойцов по категориям в зависимости от того, сколько боёв они провели.
Строим круговую диаграмму, чтобы визуализировать процент бойцов в каждой категории.
Блок 10: Круговая диаграмма для распределения побед по типам (KO/TKO, Submission, Decision)
Суммируем данные для разных типов побед
type_of_wins = ufc_data_normalized[['KO/TKO Wins', 'Submission Wins', 'Decision Wins']].sum ()
Строим круговую диаграмму для распределения побед
plt.figure (figsize=(8, 8)) type_of_wins.plot (kind='pie', autopct='%1.1f%%', colors=['#FF6347', '#90EE90', '#87CEFA'], startangle=90) plt.title ('Распределение побед по типам (KO/TKO, Submission, Decision)') plt.ylabel ('') # Убираем метку оси Y plt.show ()
Суммирую типы побед: для каждого бойца складываем количество побед по каждому из типов: KO/TKO, Submission и Decision.
Создаем круговую диаграмму, чтобы показать, как распределяются победы между этими тремя типами. Каждая доля на диаграмме будет показывать, какой процент побед приходится на нокауты, сабмишены и решения судей.
Зачем это нужно: это позволяет увидеть, какой стиль побед более распространён среди бойцов, и кто чаще выигрывает в том или ином формате.
Блок 11: Сравнение побед и нокаутов (KO/TKO Wins)
Фильтруем бойцов, у которых есть данные по победам и победам нокаутом
ufc_data_filtered = ufc_data_pivoted.dropna (subset=['Wins', 'KO/TKO Wins'])
Сортируем и выбираем топ бойцов по количеству побед
top_fighters_comparison = ufc_data_filtered[['Wins', 'KO/TKO Wins']].sort_values (by='Wins', ascending=False).head (20)
Строим столбчатую диаграмму для сравнения побед и побед нокаутом
top_fighters_comparison.plot (kind='bar', figsize=(12, 6), colormap='Set2') plt.title ('Топ бойцов: Сравнение побед и побед нокаутом (KO/TKO Wins)') plt.ylabel ('Количество побед') plt.xlabel ('Бойцы') plt.xticks (rotation=45) plt.show ()
Фильтрация бойцов: исключаю бойцов, у которых отсутствуют данные о количестве побед или победах нокаутом. Сортировка и выборка: выбор топ-20 бойцов с наибольшим количеством побед.
Столбчатая диаграмма: строим столбчатую диаграмму, которая сравнивает победы с победами нокаутом (KO/TKO) для каждого из топ-20 бойцов.
Зачем это нужно: эта диаграмма помогает увидеть, сколько бойцов выигрывают благодаря нокаутам по сравнению с общим количеством побед
Блок 12: Визуализация распределения итоговых баллов среди всех бойцов (гистограмма)
plt.figure (figsize=(10, 6)) ufc_data_normalized['Final Score'].plot (kind='hist', bins=20, color='skyblue', edgecolor='black') plt.title ('Распределение итоговых баллов среди бойцов') plt.xlabel ('Итоговый балл') plt.ylabel ('Частота') plt.show ()
Строим гистограмму для итоговых баллов бойцов
Зачем это нужно: этот график помогает понять, как распределяются итоговые баллы среди всех бойцов. Можно увидеть, есть ли явные лидеры с очень высокими баллами или если баллы бойцов сосредоточены вокруг одного значения.
Вывод
Мы провели анализ данных о бойцах UFC с целью:
- Вычисления итогового балла для каждого бойца — на основе различных меток, таких как количество побед, побед нокаутом, и других показателей. Это позволило объективно оценить каждого бойца, учитывая все их достижения.
- Определения топ-10 и топ-30 бойцов — выявили самых успешных бойцов по итоговому баллу, что позволяет увидеть лучших бойцов по сравнению с остальными.
- Визуализации данных — использовали различные графики и диаграммы (гистограммы, круговые диаграммы, столбчатые диаграммы), чтобы наглядно продемонстрировать: o Как распределяются итоговые баллы среди всех бойцов. o Какие типы побед (нокауты, сабмишены, решения судей) преобладают среди бойцов. o Сколько бойцов имеют наибольшее количество рекордов. o Как бойцы распределяются по категориям количества боёв. Что мы получили: — Лучшего бойца по итоговому баллу. — Топ-10 бойцов с наивысшими результатами. — Понимание того, какие стили побед (нокауты, сабмишены) преобладают в UFC. — Оценку, как количество боёв влияет на успех бойцов. Этот анализ помогает лучше понять, какие бойцы и в каких аспектах показы
Материалы
https://chatgpt.com/ — для улучшения написанного кода
https://www.kaggle.com/datasets/ustice/ufc-records-dataset — для поиска датасета
обложка -была сделана мной в Photoshop
Блокнот и датасет



