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

Допустим, вам раздали две закрытые карты. Каковы ваши шансы на победу до раздачи флопа? Знайте это, и вы можете делать ставки или планировать ставки соответственно.

Профессор Апу Кападиа из Университета Индианы применил статистический подход к анализу этого, запустив 4 миллиарда смоделированных игр в покер для определения результатов. В результате получилось несколько списков из 169 строк, показывающих процент выигрышей в зависимости от количества игроков, от двух до десяти. Хотя каждый список очень информативен, с таким количеством строк может быть трудно увидеть какой-либо шаблон в числах, кроме показа закрытых карт с высоким рейтингом, которые выигрывают чаще, чем закрытые карты с низким рейтингом.

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

Массаж статистики

Поскольку каждый набор статистики неудобно встроен в HTML, у меня было два варианта:

  1. очистить экран от данных из визуализированной объектной модели документа с помощью программы Cheerio или ее эквивалента;
  2. вырезать и вставить статистику на обработанной HTML-странице в файл, а затем преобразовать ее в формат JSON, используя магию регулярных выражений.

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

const arry = [
  { pair: 'AA', wins: '84.97	 ', ties: '0.57	' },
  { pair: 'KK', wins: '82.10	 ', ties: '0.58	' },
  { pair: 'QQ', wins: '79.63	 ', ties: '0.61	' },
  { pair: 'JJ', wins: '77.16	 ', ties: '0.65	' },
  { pair: 'TT', wins: '74.66	 ', ties: '0.72	' },
  { pair: '99', wins: '71.69	 ', ties: '0.80	' },
  { pair: '88', wins: '68.72	 ', ties: '0.91	' },
  { pair: '77', wins: '65.72	 ', ties: '1.04	' },
  { pair: 'KAs', wins: '65.28	 ', ties: '2.66	' },
  { pair: 'QAs', wins: '64.41	 ', ties: '2.78	' },...

Это все еще не соответствовало формату API jsheatmap, но несколько строк кода позаботились об этом.

Теперь все было готово.

API тепловой карты

Я написал пакет jsheatmap на TypeScript, который принимает следующие параметры конструктора:

type labeledValuesType = [string, number[]]

class Sterno {
  headings: Array<string>
  rows: Array<labeledValuesType>

  constructor(headings: string[], rows: Array<labeledValuesType>) {...

headings - заголовки столбцов, ['A', 'K', ..., '2']; строки имеют формат:

[['A', [51.7, 36.2, 25.1,...], ['K', [...], ..., ['2', [...]]

где первое значение каждого элемента массива - это метка строки, а последующий массив чисел - это значения ячеек для этой строки. Эти значения ячеек будут масштабированы до числа от 0,0 до 1,0, и этим масштабированным значениям будет назначено значение цвета RGB. Все это происходит, когда вызывается метод getData(), который возвращает структуру данных, которая показывает, как необработанные входные данные были масштабированы и каким будет соответствующий градиент цвета для каждого масштабированного значения:

Теперь осталось представить данные карты в красочном формате.

Приложение React

Я использовал create-response-app, чтобы быстро запустить и запустить приложение React. После завершения работы скрипта я просто редактирую сгенерированный код.

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

  1. количество игроков
  2. одномастные или разномастные закрытые карты
  3. включать ли связи

Я уже упоминал о влиянии количества игроков. Если подходят закрытые карты (например, обе червы), то шансы на выигрыш немного увеличиваются. Ничья - это когда банки делятся, потому что два или более игроков имеют одинаковый ранг карт в своей 5-карточной руке (их две закрытые карты плюс три из пяти общих карт).

Далее следуют несколько снимков экрана:

Что заметно на тепловой карте

Вот некоторые вещи, которые легко заметить на тепловой карте, которую вы можете проверить на https://pokermap.netlify.com:

Чем больше игроков, тем меньше шансы

При игре на двоих в левом верхнем углу появляется много зеленого, что указывает на лучшие шансы для закрытых карт более высокого ранга в игре на двоих (около 50% для А-2, примерно так же, как для пары двоек). С 10 игроками это значительно хуже, чем с двумя двойками.

Пары с низким рейтингом мало помогают

При 10 игроках пара шестерок имеет примерно такие же или меньшие шансы на выигрыш, как и любая непарная комбинация лицевых карт.

Одномастные закрытые карты более эффективны, чем больше игроков

K-Q, разомкнутая в игре для двоих, выигрывает в 59% случаев. Подходит, процент увеличивается незначительно до 61,6%. В игре с 10 игроками разномастные K-Q дают 13,6% шансов на победу, но если они одномастные, то этот показатель возрастает до 17,1%.

Этот пост продемонстрировал, что даже простая тепловая карта может быть полезна для поиска закономерностей и корреляций в больших объемах данных. Не стесняйтесь исследовать исходный код для jsheatmap и pokermap на github.

Первоначально опубликовано на https://www.jeffamabob.com.