Вы, вероятно, знакомы с Техасским Холдемом, разновидностью покера, где две карты, известные как закрытые карты, раздаются лицом вниз каждому игроку, а затем пять общих карт раздаются лицом вверх в три этапа, в общей сложности четыре этапа. в целом. После каждого этапа у игроков есть возможность делать ставки или повышать ставки.
Допустим, вам раздали две закрытые карты. Каковы ваши шансы на победу до раздачи флопа? Знайте это, и вы можете делать ставки или планировать ставки соответственно.
Профессор Апу Кападиа из Университета Индианы применил статистический подход к анализу этого, запустив 4 миллиарда смоделированных игр в покер для определения результатов. В результате получилось несколько списков из 169 строк, показывающих процент выигрышей в зависимости от количества игроков, от двух до десяти. Хотя каждый список очень информативен, с таким количеством строк может быть трудно увидеть какой-либо шаблон в числах, кроме показа закрытых карт с высоким рейтингом, которые выигрывают чаще, чем закрытые карты с низким рейтингом.
Некоторое время назад я создал простой пакет тепловой карты. В поисках практического применения я наткнулся на статистические данные доктора Кападиа, и они идеально подошли для демонстрации.
Массаж статистики
Поскольку каждый набор статистики неудобно встроен в HTML, у меня было два варианта:
- очистить экран от данных из визуализированной объектной модели документа с помощью программы Cheerio или ее эквивалента;
- вырезать и вставить статистику на обработанной 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. После завершения работы скрипта я просто редактирую сгенерированный код.
Первое, что я хочу сделать, это добавить некоторую интерактивность пользователя с помощью переключателей и флажков. Пользователь может указать три вещи:
- количество игроков
- одномастные или разномастные закрытые карты
- включать ли связи
Я уже упоминал о влиянии количества игроков. Если подходят закрытые карты (например, обе червы), то шансы на выигрыш немного увеличиваются. Ничья - это когда банки делятся, потому что два или более игроков имеют одинаковый ранг карт в своей 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.