Рубрики
Без рубрики

RCB GM Simulator: Запуск EDA на DataSet IPL

Помните, как в фильме Moneyball (2011), Окленд А генерал-менеджер A Billy Beane нанимает экономист PE … Tagged с наукой о данных, Python.

Помните, как в кино Moneyball (2011), Окленд А, что генеральный менеджер Billy Beane нанимает экономист Peter Brand использовать данные для изменения в игры? (Серьезно, хотя, если вы на самом деле не наблюдали, я настоятельно рекомендую вам сделать это и вернуться!) Ну, мы собираемся сделать то же самое – хотя и работаю в сфере крикета на этот раз.

То, что мы собираемся сделать, называется анализом исследования данных – EDA для краткости – процесс анализа наборов данных для суммирования их основных характеристик. Для этого мы будем использовать Этот набор данных IPL Отказ Во-первых, давайте посмотрим, что мы имеем нам?

import pandas as pd 
import numpy as np
df=pd.read_csv("matches.csv")
df.head()

Хорошо, это много информации! Давайте сломаем его с помощью метода PandaS DataFrame INFO ():

df.info()

Как генеральный менеджер RCB, ваша задача состоит в том, чтобы извлечь столько информации, которую вы можете из доступных данных. И это включает в себя задание правильных вопросов. Приближаясь на нашем наборе данных, сколько данных действительно полезно? Конечно, не сумасшедшие. Давайте упадем им?

df.drop(["umpire1", "umpire2", "umpire3"], inplace=True, axis=1)
df.head()

Теперь это то, с чем мы можем работать! Тем не менее, дело в том, чтобы быть ГМ (и наукой данных в общем), заключается в том, что никто не говорит вам, какие вопросы вы должны спросить. И задавать правильные вопросы, которые часто могут быть более жесткими, чем отвечать на них. Вот список из пяти вопросов, которые я думаю, этот набор данных может иметь возможность ответить:

  1. Это более выгодна для летучей мыши или сначала поля в данном месте?
  2. Каждая проведение каждая команда наиболее сильна?
  3. На самом деле гонкая команда имеет преимущество в матче, пострадавшем дождем?
  4. Насколько важно выигрывает бросок в данном месте?
  5. Как наша трековая запись по сравнению с разными командами?

Теперь, давайте рассмотрим наши данные по вопросу по вопросу по вопросам! (хотя не обязательно в том, что точный порядок 👻)

Прохладная вещь о Pands – это то, что вы можете объединить логику вместе, чтобы получить желаемый выход в менее многословие, чем сказать SQL. Наш набор данных дает нам победитель каждого матча. Мы также знаем, кто выиграл бросок на каждом матче. Вместе 2 и 2 вместе, эти две вещи должны быть равны, если команда, которая выиграла, тоже выиграл матч. Наконец, нам нужны эти данные на базовом месте. Другой момент – это то, что процент будет более полезным для нас, чем необработанное число.

df[df["toss_winner"]==df["winner"]].value_counts("venue")/df.value_counts("venue")*100

Увидеть, как было легко? Обратите внимание, что мы использовали метод value_counts () для группировки наших данных после фильтрации, а затем разделить его на общие матчи, сыгранные в этом месте. Это еще одна интуитивная особенность Panads – в том, что она может обнаружить аналогичные объекты данных с использованием индексов.

Мы видим, что определенные места дают 100-процентную зависимость от броска. Однако, если мы посмотрим на то, сколько матчей было сыграно в этих местах, у нас есть гораздо ясная картина. Чем больше матчей сыграны, тем ближе, что число представляется адекесом 50.

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

fielding_wins=df[((df["toss_winner"]==df["winner"]) & (df["toss_decision"]=="field")) | ((df["toss_winner"]!=df["winner"]) & (df["toss_decision"]=="bat"))].value_counts("venue")
fielding_wins.sort_index(inplace=True)

batting_wins=df[((df["toss_winner"]==df["winner"]) & (df["toss_decision"]=="bat")) | ((df["toss_winner"]!=df["winner"]) & (df["toss_decision"]=="field"))].value_counts("venue")
missing_rows=pd.Series([0,0],index=["Green Park", "Holkar Cricket Stadium"])
batting_wins=batting_wins.append(missing_rows)
batting_wins.sort_index(inplace=True)

choices=fielding_wins>batting_wins

encoder={True:"Field", False:"Bat"}
choices.map(encoder)

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

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

И, наконец, мы сопоставляли ценности правды в «Bat» и «поле», чтобы облегчить нашу жизнь. (Признание: я не делал ни одного из этого за один. Все, что вы видите здесь, упакованные в один аккуратный блок кода, предшествовал много предупреждений, много почесывания головы и множество испытаний и ошибок)

Давайте использовать Power Pandas, чтобы ответить на этот вопрос в одной строке кода! Если вы следуете наряду с кодом до сих пор, это должен быть тэквальком!

df[(((df["toss_winner"]==df["winner"]) & (df["toss_decision"]=="field")) | ((df["toss_winner"]!=df["winner"]) & (df["toss_decision"]=="bat")))& (df["dl_applied"]==1)].size/df[df["dl_applied"]==1].size*100

Ну, там мы идем – головная команда выигрывает в 81 процентных дождевых матчей!

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

team_venue_counts=df.groupby(["winner", "venue"]).agg("count")["id"]
team_venue_counts=team_venue_counts.sort_values(ascending=False)
team_venue_counts.head(9)

Мы видим, что команды действительно имеют наибольшее количество побед на своем домашнем стадионе. Однако процент будет гораздо лучшим показателем того, насколько сильными командами работают дома. Это потребует некоторого сплайсинга, добавления и перестройки – как с парами, занимающимися победителем, так и количеством места. К сожалению, сложность этого процесса заключается за пределами цели этого поста. Двигаюсь!

Этот включает в себя несколько запутанных шагов – в основном потому, что наша команда появляется как в столбцах «Team1», так и «Team2». Но все вообще, код снова довольно простой:

as_team1_wins=df[(df["team1"]=="Royal Challengers Bangalore") & (df["winner"]=="Royal Challengers Bangalore")].value_counts("team2")
as_team1_games=df[(df["team1"]=="Royal Challengers Bangalore")].value_counts("team2")

as_team2_wins=df[(df["team2"]=="Royal Challengers Bangalore") & (df["winner"]=="Royal Challengers Bangalore")].value_counts("team1")
as_team2_games=df[(df["team2"]=="Royal Challengers Bangalore")].value_counts("team1")

(as_team1_wins+as_team2_wins)/(as_team1_games+as_team2_games)*100

Теперь я должен признать, что это было немного взлома. Различные переменные, используемые для хранения данных, не были точно такими же размером – приводят к тем нежамым назам. Тем не менее, это все еще впечатляет, что Пандас знал, что делать с остальными!

Во-вторых, мы видим, что есть два отдельных записями для «восстания супергианта Пуны» и «поднимающиеся супергиаты Пуны» соответственно. Это, безусловно, заслуживает некоторой уборки!

Теперь твоя очередь! Думаю, вы можете исправить эти ошибки? Как GM, какие другие идеи могут получить с этим набором данных? Какие еще данные вам могут потребоваться увеличить его, чтобы получить лучшее понимание? И последнее, но не менее важное, что могут быть лучшими методами для визуализации наших выводов?

Любые вопросы? Все, что вы думаете, я мог бы сделать по-другому? Не стесняйтесь, дайте мне знать И я буду более чем рад ответить!

Оригинал: “https://dev.to/ucscmozilla/rcb-gm-simulator-running-an-eda-on-the-ipl-dataset-57jb”