Как вы можете использовать данные, чтобы открыть секреты бейсбола

1656669490 kak vy mozhete ispolzovat dannye chtoby otkryt sekrety bejsbola

от ?? Антон де Регт

1*t6bdAIXvBropF4AMwTP9Jg

Данные могут рассказать многие истории, и поиск скрытых секретов похож на поиск иглы в стоге сена.

После окончания моего первого курса анализа данных на Udacity пришло время для реального проекта.

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

Мой процесс:

  1. Первый взгляд на данные
  2. Придумайте вопрос
  3. Спорите с данными
  4. Изучите данные
  5. Сделайте выводы/прогнозы
  6. Сообщить мои выводы

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

antonderegt/data-baseball
data-baseball — Окончательный проект Udacitygithub.com

Сначала посмотрите на данные

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

import matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport seaborn as sns%matplotlib inline
# Reading the batting datafilename="Batting.csv"batting_df = pd.read_csv(filename)
# Printing the first five entriesbatting_df.head()
# Getting some metrics on the home runs, number of games, runs batted in and the number of strikeoutsbatting_df[['HR','G', 'RBI', 'SO']].describe()

Глядя на таблицу выше, кажется, что бьют в среднем 2,8 хоумрана за сезон со средней игрой в 51.

batting_df_groupedby_year = batting_df.groupby(['yearID']).sum()homeruns_per_year = batting_df_groupedby_year[['HR']]
# Plotting the heatmap in reverse order to make it easier to see the increasesns.heatmap(homeruns_per_year.iloc[::-1])
1*a-xusvHac4NFo_4FVWzYew
Построение тепловой карты

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

Вопрос

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

  1. Какие команды имеют самые эффективные удары?
  2. Существует ли корреляция между вычеркиваниями и хоумранами?
  3. Кто лучший вор в истории (Caught Stealing vs. Stolen Bases)?
  4. Какой регион производит самое лучшее тесто (для этого нужно объединить с другим столом)?
  5. Какая связь между разными показателями эффективности? Кто имеет сильные негативные или положительные отношения?
  6. Какие характеристики бейсболистов с самыми высокими зарплатами?

Вопрос, на котором я собираюсь сосредоточиться: какие показатели коррелируют, а какие нет?

Ссора

# Displaying the batting data for the last ten yearsbatting_last_ten_years = batting_df.groupby(['yearID'], as_index=False).sum().sort_values(by='yearID', ascending=False).head(10)batting_last_ten_years

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

исследование

В следующем блоке кода я рассчитаю корреляцию между Хоумранами и всеми другими показателями. Таким образом, мы можем увидеть, какие метрики способствуют хоум-ранам, а какие плохие для хоум-ранов. К примеру, я ожидаю, что отбивающие, которые сыграют больше игр, убьют больше хоумранов. Я также ожидаю, что отражатели с высоким RBI убьют больше всего хоумранов.

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

Корреляция –1 является отрицательной корреляцией. Это означает, что когда одно значение увеличивается, другое уменьшается.

Если значение корреляции равно 0, корреляция очень мала или отсутствует. Я буду называть положительную корреляцию++, + или +- в зависимости от силы корреляции. Ни одна корреляция не будет равна 0, а отрицательные корреляции будут колебаться от -+, — или — сильная отрицательная корреляция.

def standardize(data):    return (data - data.mean()) / data.std(ddof=0)
def pearsons_r(x, y):    return (standardize(x) * standardize(y)).mean()
# It doesn't make sense to calculate the correlation between these values and home runsleave_out = ['playerID', 'yearID', 'teamID', 'lgID', 'HR']
# Meaning of the column names in the datadictionary = {'playerID':'Player', 'yearID':'Year', 'teamID':'Team', 'lgID':'League', 'HR':'Home Runs','stint':'Stints', 'G':'Games', 'AB': 'At Bats', 'R': 'Runs', 'H':'Hits', '2B':'Doubles', '3B':'Triples', 'RBI':'Runs Batted In', 'SB':'Stolen Bases', 'CS':'Caught Stealing', 'BB':'Base on Balls', 'SO':'Strikeouts', 'IBB':'Intentional Walks', 'HBP':'Hit by pitch', 'SH':'Sacrifice hits', 'SF':'Sacrifice flies', 'GIDP':'Grounded into double plays'}
strong_positive_correlation = []strong_negative_correlation = []
def correlations_for_hr(df):    columns = list(df)    for x in columns:        if x not in leave_out:            name_of_metric = dictionary[x]            r = pearsons_r(df['HR'], df[x])                        # Calculating the strenth of the correlation            correlation = ''            if r > 0.7:                correlation = '++'                strong_positive_correlation.append(name_of_metric)            elif r > 0.5:                correlation = '+ '            elif r > 0.3:                correlation = '+-'            elif r >= -0.3:                correlation = 'O '            elif r > -0.5:                correlation = '-+'            elif r > -0.7:                correlation = '- '            elif r > -1:                correlation = '--'                strong_negative_correlation.append(name_of_metric)                            print('{} Correlation between Home runs and {}:{}'.format(correlation, name_of_metric, "%.3f"%r))            print('-----------------------------------------')            print('Correlations:')print('-----------------------------------------------------')print(correlations_for_hr(batting_df))print('\n')
print('Positive correlations: {}'.format(strong_positive_correlation))print('\n')
print('Negative correlations: {}'.format(strong_negative_correlation))

Выход:

Correlations:--------------------------------------------------------------------O  Correlation between Home runs and Stints: -0.065--------------------------------------------------------------------+  Correlation between Home runs and Games: 0.668--------------------------------------------------------------------+  Correlation between Home runs and At Bats: 0.695--------------------------------------------------------------------++ Correlation between Home runs and Runs: 0.729--------------------------------------------------------------------++ Correlation between Home runs and Hits: 0.703--------------------------------------------------------------------++ Correlation between Home runs and Doubles: 0.725--------------------------------------------------------------------+- Correlation between Home runs and Triples: 0.348--------------------------------------------------------------------++ Correlation between Home runs and Runs Batted In: 0.837--------------------------------------------------------------------O  Correlation between Home runs and Stolen Bases: 0.265--------------------------------------------------------------------+- Correlation between Home runs and Caught Stealing: 0.409--------------------------------------------------------------------++ Correlation between Home runs and Base on Balls: 0.731--------------------------------------------------------------------++ Correlation between Home runs and Strikeouts: 0.822--------------------------------------------------------------------++ Correlation between Home runs and Intentional Walks: 0.753--------------------------------------------------------------------+- Correlation between Home runs and Hit by pitch: 0.497--------------------------------------------------------------------O  Correlation between Home runs and Sacrifice hits: 0.064--------------------------------------------------------------------++ Correlation between Home runs and Sacrifice flies: 0.792--------------------------------------------------------------------++ Correlation between Home runs and Grounded into double plays: 0.767--------------------------------------------------------------------
Positive correlations: ['Runs', 'Hits', 'Doubles', 'Runs Batted In', 'Base on Balls', 'Strikeouts', 'Intentional Walks', 'Sacrifice flies', 'Grounded into double plays']
Negative correlations: []

Просмотр первых ожиданий

Помните мои ожидания? Я ожидал, что количество игр и рейтинг RBI будут иметь положительную корреляцию с хоумранами. Согласно моим расчетам, приведенным выше, количество игр имеет положительную корреляцию с R Пирсоном 0,668. Следовательно, игроки, сыгравшие больше игр за сезон, имеют большее количество хоумранов. Это звучит очень логично, поскольку у тех, кто играет больше игр, есть больше шансов забить хоумран.

Другое мое ожидание заключалось в том, что высокий RBI будет означать большое количество хоумранов. Корреляция между хоум-ранами и RBI большая из .837! Это опять же вполне логично, поскольку хоумраны могут вознаградить игрока наибольшим количеством очков RBI.

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

# HOME RUNS vs. RUNS BATTED INsns.lmplot(size=10, data=batting_df[['HR', 'RBI']], x='HR', y='RBI', x_estimator=np.mean)
1*OgrJ3wEmh75BYlyu71Pn4A
ХОУМ-РАНСы против БОНЯЩИХСЯ РАНОВ

На диаграмме выше показано, как хоум-раны соотносятся с RBI. Вы можете увидеть количество хоум-ранов на оси х и количество точек RBI на оси у.

# HOME RUNS vs. STRIKEOUTSsns.lmplot(size=10, data=batting_df[['HR', 'SO']], x='HR', y='SO', x_estimator=np.mean)
1*imXXUHBOTge6FRDyCyYPpw
ХОУМ-РАНЫ против СТРАЙК-АУТОВ

Сюжет выше возвращает интересную корреляцию. Это соотношение между хоум-ранами и забастовками. Корреляция R Пирсона составляет 0,822, почти столь же высока, как корреляция между хоумранами и RBI.

Эта корреляция была более интересна для меня, потому что RBI является прямым результатом хоумранов. Не считая того, забастовки-ауты имеют прямую связь с утратой шансов на хоум-ран. Как на земле забастовки приведут к увеличению количества хоумранов?

Чтобы разгадать эту тайну, я начал думать… Возможно, у тех, кто бьет, кто больше рискует, больше шансов забить хоумран. Потому что они раскачиваются даже на мяче, который, кажется, тяжело ударить. Итак, если больший риск дает вам больше хоумранов, то я посмотрел на показатели риска. Рискованные показатели – это показатели, предусматривающие принятие риска, таких как кража баз. Давайте посмотрим на корреляцию.

# HOME RUNS vs. CAUGHT STEALINGsns.lmplot(size=10, data=batting_df[['HR', 'CS']], x='HR', y='CS', x_estimator=np.mean)
1*F6UO9ZsBNxHxcsM9mGs9Xg
ХОУМ-РАН против пойманного на краже

Выше можно увидеть корреляцию (0,409) между хоум-ранами (ось X) и количеством раз, когда раннера поймали на краже (ось Y). Существует нечеткая корреляция, но этого недостаточно, чтобы заключить. Возможно, рискующие хорошо научились похищать базы и не попадают на кражу? Давайте посмотрим на украденные базы.

# HOME RUNS vs. STOLEN BASESsns.lmplot(size=10, data=batting_df[['HR', 'SB']], x='HR', y='SB', x_estimator=np.mean)
1*6MsW8r0ef2wXT-sz_2Eicw
HOME RANS против КРАДЕННЫХ БАЗ

Выше можно увидеть корреляцию 0,265 между хоумранами (ось X) и украденными базами (ось Y). Эта корреляция не существует. Следовательно, рисковать не имеет ничего общего с ушибом хоумрана.

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

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

Выводы/Прогнозы

У меня есть несколько предложений бьющим, пытаясь улучшить свою статистику гоумрана. Шаг первый, чтобы получить больше хоумранов: играйте больше игр, без оправданий – играйте! Шаг второй: получите несколько вычеркиваний. Это звучит неинтуитивно, но это увеличивает ваше количество хоумранов. Как это работает: он задувает кувшин и дает тесту больше времени ждать, пока лучшая подача попадет в этот GRAND SLAM.

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

Или это о рисках усталого питчера

Чтобы узнать больше, посетите ditisAnton.com и ПОДПИШИТЕСЬ на мой еженедельный информационный бюллетень.

Добавить комментарий

Ваш адрес email не будет опубликован.