{"id":2155,"date":"2025-07-08T07:00:06","date_gmt":"2025-07-08T12:00:06","guid":{"rendered":"https:\/\/wollen.org\/blog\/?p=2155"},"modified":"2025-07-12T05:31:17","modified_gmt":"2025-07-12T10:31:17","slug":"wsop","status":"publish","type":"post","link":"https:\/\/wollen.org\/blog\/2025\/07\/wsop\/","title":{"rendered":"The World Series of Poker Main Event"},"content":{"rendered":"<p>I&#8217;m a week later than usual on this post because I wanted to wait for the World Series of Poker (WSOP) to finalize Main Event payouts. Registration is closed and this year&#8217;s tournament is the third-largest to date. The final player standing in this year&#8217;s 9,735-person field will receive an even $10 million. 9th place\u2014the player who barely squeezes into the final table\u2014will take home $1 million.<\/p>\n<p>In this post I want to look at how the prize pool is distributed among final table participants. Typically as fields grow, top finishers receive a larger prize in dollar terms but a smaller share of the overall prize pool. That allows tournament directors to spread the cash around and keep everyone happy.<\/p>\n<p>The $10,000 Main Event buy-in hasn&#8217;t budged in over 50 years. With inflation, that means the entry fee becomes more affordable every year. So it&#8217;s no surprise that fields have been hitting all-time highs recently.<\/p>\n<p>What does that mean for the prize pool distribution? Let&#8217;s take a look at the data and find out.<\/p>\n<figure id=\"attachment_3245\" aria-describedby=\"caption-attachment-3245\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/moneymaker-farha-2003.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3245 size-medium\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/moneymaker-farha-2003-300x203.jpg\" alt=\"\" width=\"300\" height=\"203\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/moneymaker-farha-2003-300x203.jpg 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/moneymaker-farha-2003-768x518.jpg 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/moneymaker-farha-2003.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-3245\" class=\"wp-caption-text\">Chris Moneymaker beats Sammy Farha in the final hand of the 2003 Main Event. Photo credit: Eric Harkins, Image Masters.<\/figcaption><\/figure>\n<hr \/>\n<h4>1. Prepare the data.<\/h4>\n<p>Download <a href=\"https:\/\/www.kaggle.com\/datasets\/cviaxmiwnptr\/wsop-main-event-results-1971-2024\" target=\"_blank\" rel=\"noopener\">this Main Event results dataset<\/a> from Kaggle and read it into a Pandas DataFrame. I put the dataset together a few months ago thinking I could continue updating it every year, but the WSOP has since migrated all results onto their new app. It makes scraping much more difficult. So the dataset may be frozen at 2024 but we can still tack on the 2025 final table and analyze what&#8217;s there.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">df = pd.read_csv(\"wsop_main_event_results_1971-2024.csv\")<\/pre>\n<p>Columns include:<\/p>\n<ul>\n<li><em>year<\/em><\/li>\n<li><em>place<\/em><\/li>\n<li><em>name<\/em><\/li>\n<li><em>prize<\/em><\/li>\n<li><em>city<\/em><\/li>\n<li><em>state<\/em><\/li>\n<li><em>country<\/em><\/li>\n<li><em>entries<\/em><\/li>\n<li><em>prizepool<\/em><\/li>\n<li><em>buyin<\/em><\/li>\n<li><em>start<\/em><\/li>\n<li><em>finish<\/em><\/li>\n<\/ul>\n<p>Let&#8217;s append the 2025 final table to the bottom of the DataFrame. We don&#8217;t yet know who will be there but we know prize amounts, which is enough to plot the prize pool distribution.<\/p>\n<p>The proper way to append is to create a new DataFrame and concatenate it (<code>concat<\/code>) with the original. Not all columns need to be present in the temporary DataFrame, so it won&#8217;t matter that we don&#8217;t know city, state, etc. Those columns will simply contain NaNs.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">df2 = pd.DataFrame({\"year\": [2025 for _ in range(9)],\r\n                    \"place\": range(1, 10),\r\n                    \"prize\": [10e6, 6e6, 4e6, 3e6, 2.4e6, 1.9e6, 1.5e6, 1.25e6, 1e6],\r\n                    \"entries\": [9735 for _ in range(9)],\r\n                    \"prizepool\": [90.5355e6 for _ in range(9)]})\r\n\r\ndf = pd.concat([df, df2])<\/pre>\n<p>We&#8217;re analyzing how payouts are distributed, i.e. how top-heavy is the structure. Divide the payout column by overall prize pool to create a percentage column.<\/p>\n<p>Of course, you don&#8217;t have to multiply by 100. You could leave the values as proportions. Or later multiply y-ticks labels by 100.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">df.loc[:, 'pct_of_pool'] = df['prize'] \/ df['prizepool'] * 100<\/pre>\n<p>Filter the DataFrame to begin with 2003, the year <a href=\"https:\/\/en.wikipedia.org\/wiki\/Chris_Moneymaker\" target=\"_blank\" rel=\"noopener\">Chris Moneymaker<\/a> stole the show. His win single-handedly reinvented the WSOP so it doesn&#8217;t really make sense to compare earlier years.<\/p>\n<p>Also limit rows to final table positions, 1st through 9th.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">df = df[df['year'] &gt;= 2003]\r\n\r\ndf = df[df['place'] &lt;= 9]<\/pre>\n<p><code>df.head(15)<\/code> looks like this:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">653  2003      1  Chris Moneymaker  2500000.0      Lakeland    TN      US      839   7802700.0  10000.0  2003-05-19  2003-05-23    32.040191\r\n654  2003      2       Sammy Farha  1300000.0       Houston    TX      US      839   7802700.0  10000.0  2003-05-19  2003-05-23    16.660899\r\n655  2003      3    Dan Harrington   650000.0  Santa Monica    CA      US      839   7802700.0  10000.0  2003-05-19  2003-05-23     8.330450\r\n656  2003      4      Jason Lester   440000.0      Aventura    FL      US      839   7802700.0  10000.0  2003-05-19  2003-05-23     5.639074\r\n657  2003      5  Tomer Benvenisti   320000.0     Las Vegas    NV      US      839   7802700.0  10000.0  2003-05-19  2003-05-23     4.101144\r\n658  2003      6       Amir Vahedi   250000.0             -     -      IR      839   7802700.0  10000.0  2003-05-19  2003-05-23     3.204019\r\n659  2003      7         Young Pak   200000.0    Bainbridge    WA      US      839   7802700.0  10000.0  2003-05-19  2003-05-23     2.563215\r\n660  2003      8        David Grey   160000.0     Henderson    NV      US      839   7802700.0  10000.0  2003-05-19  2003-05-23     2.050572\r\n661  2003      9      David Singer   120000.0     Las Vegas    NV      US      839   7802700.0  10000.0  2003-05-19  2003-05-23     1.537929\r\n716  2004      1       Greg Raymer  5000000.0       Raleigh    NC      US     2576  24224400.0  10000.0  2004-05-22  2004-05-28    20.640346\r\n717  2004      2    David Williams  3500000.0     Las Vegas    NV      US     2576  24224400.0  10000.0  2004-05-22  2004-05-28    14.448242\r\n718  2004      3        Josh Arieh  2500000.0    Alpharetta    GA      US     2576  24224400.0  10000.0  2004-05-22  2004-05-28    10.320173\r\n719  2004      4    Dan Harrington  1500000.0  Santa Monica    CA      US     2576  24224400.0  10000.0  2004-05-22  2004-05-28     6.192104\r\n720  2004      5      Glenn Hughes  1100000.0    Scottsdale    AZ      US     2576  24224400.0  10000.0  2004-05-22  2004-05-28     4.540876\r\n721  2004      6           Al Krux   800000.0  Feyetteville    NY      US     2576  24224400.0  10000.0  2004-05-22  2004-05-28     3.302455<\/pre>\n<p>You can see that Moneymaker&#8217;s $2.5 million prize was about 32% of the prize pool. The next year, Greg Raymer won a much bigger tournament but his $5 million was just 21% of the prize pool. All else equal, larger field sizes produce a flatter (less top-heavy) payout structure.<\/p>\n<hr \/>\n<h4>2. Plot the data.<\/h4>\n<p>To visualize the distribution and how it&#8217;s changed over time, we&#8217;ll create a <a href=\"https:\/\/matplotlib.org\/3.1.1\/gallery\/lines_bars_and_markers\/stackplot_demo.html\" target=\"_blank\" rel=\"noopener\">stack plot<\/a> (example from the documentation below). A stack plot allows you to quickly see how the total has changed, e.g. how much money is reserved for final table participants. As well as how components have changed relative to each other, e.g. how steep is the drop from 1st place to 2nd and so on.<\/p>\n<p>Stack plots aren&#8217;t perfect. It can be difficult to judge whether an individual component&#8217;s share has risen or fallen from year to year. One might stay constant while neighboring sections change erratically. All the movement can play tricks on your eyes. But as always, use with caution.<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/stackplot_example.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3202\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/stackplot_example.jpg\" alt=\"\" width=\"543\" height=\"412\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/stackplot_example.jpg 543w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/stackplot_example-300x228.jpg 300w\" sizes=\"auto, (max-width: 543px) 100vw, 543px\" \/><\/a><\/p>\n<p>A good stack plot approach is to create a pivot table. A pivot table takes two categorical variables\u2014in this case <em>year<\/em> and <em>finishing position<\/em>\u2014and generates a grid to display the values for every combination of the two variables.<\/p>\n<p>We have 23 years in our DataFrame with 9 places each, so <code>pivot_table<\/code> will create a 23-by-9 grid with 23*9=207 <em>pct_of_pool<\/em> values.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">df = df.pivot_table(index=\"year\", columns=\"place\", values=\"pct_of_pool\").reset_index()<\/pre>\n<p>It&#8217;s a little tricky but we call\u00a0<code>reset_index<\/code> to avoid <em>year<\/em> becoming the DataFrame&#8217;s index. That will be important when we hand <code>df<\/code> to Matplotlib in a moment.<\/p>\n<p>The new pivot table&#8217;s <code>df.head()<\/code> is shown below. You can safely ignore the left-most column, <em>place<\/em>. Finishing positions are organized in columns. For example, 1st place received 32% of the prize pool in 2003, 21% in 2004, and so on, just as we observed above. The same goes for 2nd through 9th place. If you squint you can see this starting to become a stack plot.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">place  year          1          2          3         4         5         6         7         8         9\r\n0      2003  32.040191  16.660899   8.330450  5.639074  4.101144  3.204019  2.563215  2.050572  1.537929\r\n1      2004  20.640346  14.448242  10.320173  6.192104  4.540876  3.302455  2.786447  2.373640  1.941844\r\n2      2005  14.199541   8.046406   4.733180  3.786544  3.313226  2.839908  2.461254  2.177263  1.893272\r\n3      2006  14.543311   7.395878   4.997215  4.397549  3.897828  3.398106  2.898385  2.398663  1.898942\r\n4      2007  13.799459   8.097323   5.098315  3.098975  2.099306  1.599471  1.179610  0.979676  0.879710<\/pre>\n<p>I&#8217;ll use a custom WSOP-themed mplstyle that will be linked at the bottom of this post.<\/p>\n<p>Create Figure and Axes objects for plotting.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">plt.style.use(\"wollen_wsop.mplstyle\")\r\n\r\nfig, ax = plt.subplots()<\/pre>\n<p>With Matplotlib&#8217;s <code>stackplot<\/code>, you can either pass a bunch of individual lists or pass one list along with a 2-D type, like a pandas DataFrame, and let the library handle it. If you pass a DataFrame, Matplotlib expects the data to be arranged in rows. Our pivot table is arranged in columns so we need to transpose it with <code>.T<\/code>. This method swaps rows and columns and essentially rotates the DataFrame 90 degrees.<\/p>\n<p>Notice that the first argument is the year column. The second argument is everything <strong>except<\/strong> year.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax.stackplot(df['year'],\r\n             df.drop(\"year\", axis=1).T,\r\n             alpha=0.8)<\/pre>\n<p>That takes care of the substance. Now we can deal with style.<\/p>\n<p>x-ticks and y-ticks can be hard-coded. I hate doing it but we already typed 2025 figures above. For the y-ticks, pass in a list of strings with percentage signs.<\/p>\n<p>Yearly x-ticks will be a little cramped on the horizontal axis so let&#8217;s rotate them. The easiest way is to call <code>plt.setp()<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax.set(xticks=range(2003, 2026),\r\n       xlim=(2002.6, 2025.4),\r\n       yticks=range(0, 90, 10),\r\n       yticklabels=[f\"{n}%\" for n in range(0, 90, 10)],\r\n       ylim=(0, 80.5))\r\n\r\nplt.setp(ax.xaxis.get_majorticklabels(), rotation=60, ha=\"right\", rotation_mode=\"anchor\")<\/pre>\n<p>I want to label each layer of the stack plot. The loop below steps through and calculates the middle y value of each. It calls <code>ax.text<\/code> and labels the finishing position immediately to its right at x=2025.1.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">total = 0\r\nfor ordinal, place in zip([\"1st\", \"2nd\", \"3rd\", \"4th\", \"5th\", \"6th\", \"7th\", \"8th\", \"9th\"],\r\n                          range(1, 10)):\r\n    ax.text(x=2025.1,\r\n            y=total + df[place].iloc[-1] \/ 2,\r\n            s=ordinal,\r\n            size=8,\r\n            va=\"center\")\r\n    total += df[place].iloc[-1]<\/pre>\n<p>I&#8217;ve been trying to be a little more creative with my titles. It&#8217;s popular to have a title and subtitle left-aligned above the plot. Let&#8217;s call <code>ax.text<\/code> twice, making the main title bolder and slightly larger than the subtitle.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax.text(x=2003,\r\n        y=83,\r\n        s=\"World Series of Poker  \u2022  Main Event\",\r\n        weight=\"bold\",\r\n        size=11)\r\n\r\nax.text(x=2003,\r\n        y=81.2,\r\n        s=\"Final Table payouts as a percentage of overall prize pool\",\r\n        size=10)<\/pre>\n<p>As a final touch, include the WSOP logo at the top-right corner. I find <code>AnnotationBbox<\/code> is the cleanest way to draw an image. You can easily specify <code>zoom<\/code> and <code>alpha<\/code> (transparency). <code>box_alignment<\/code> locates the image relative to <code>xy<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ab = AnnotationBbox(OffsetImage(plt.imread(\"wsop_logo.png\"), zoom=0.25, alpha=0.05),\r\n                    xy=(2024.9, 78.8),\r\n                    box_alignment=(1, 1),\r\n                    frameon=False)\r\nax.add_artist(ab)<\/pre>\n<p>Save the figure with a bumped <code>dpi<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">plt.savefig(\"wsop_ft_stackplot.png\", dpi=200)<\/pre>\n<hr \/>\n<h4>3. The output.<\/h4>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-scaled.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3218\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-scaled.png\" alt=\"\" width=\"2560\" height=\"1969\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-scaled.png 2560w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-300x231.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-1024x788.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-768x591.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-1536x1182.png 1536w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/wsop_ft_stackplot-2048x1575.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<p>In this case, I think it&#8217;s okay to use two alternating colors. If we were comparing nine different types of fruit, for example, it would be better to assign each a different color.<\/p>\n<p>There are no big surprises in 2025. The field is slightly smaller and the winner is set to earn a slightly larger percentage of the prize pool. But generally speaking, the payout structure has become flatter over the last 20 years, which is what we expected to see.<\/p>\n<p>Peter Eastgate&#8217;s 2008 win really stands out. Field size was about 20% off its 2006 peak. I wonder if WSOP officials sensed the Moneymaker Boom slipping away and reached to try and manufacture some excitement. Whatever the reason, great fortune for Eastgate.<\/p>\n<hr \/>\n<h4>4. Further reading.<\/h4>\n<p>That&#8217;s cool and stack plots are technically interesting, but there&#8217;s more to learn about the Main Event by looking at straightforward line graphs and adjusting for inflation. Below are a few slices of the data presented without code.<\/p>\n<p>In 1972, the Main Event entry fee was about $77,000, adjusted for inflation. $10,000 is nothing to sneeze at. It&#8217;s a bigger tournament than most people will play in their lives. But it&#8217;s less nosebleed stakes than it was a couple generations ago. Chris Moneymaker paid nearly twice as much to enter in 2003.<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-scaled.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3226\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-scaled.png\" alt=\"\" width=\"2560\" height=\"1378\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-scaled.png 2560w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-300x162.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-1024x551.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-768x414.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-1536x827.png 1536w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/1_wsop_buyin-2048x1103.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<hr style=\"width: 60%;\" \/>\n<p>In this plot you can see the Main Event reflect the broader economy. Entry count spun its wheels for several years following the Great Recession. Then it took off like a rocket in the late 2010s, only to be interrupted by COVID-19. The field had mostly gotten back on trend by 2023.<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-scaled.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3228\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-scaled.png\" alt=\"\" width=\"2560\" height=\"1378\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-scaled.png 2560w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-300x162.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-1024x551.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-768x414.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-1536x827.png 1536w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/2_wsop_entries-2048x1103.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<hr style=\"width: 60%;\" \/>\n<p>Here it gets interesting. There&#8217;s a lot of movement but it seems that overall prize pool, adjusted for inflation, has trended down since its mid-2000s peak. Growing field sizes and inflation are nearly a wash, but not quite. At best, prize pool has been flat.<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-scaled.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3231\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-scaled.png\" alt=\"\" width=\"2560\" height=\"1378\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-scaled.png 2560w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-300x162.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-1024x551.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-768x414.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-1536x827.png 1536w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/4_wsop_prize_pool-2048x1103.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<hr style=\"width: 60%;\" \/>\n<p>1st place money, adjusted for inflation, has <em>clearly<\/em> trended down. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Jamie_Gold\" target=\"_blank\" rel=\"noopener\">Jamie Gold<\/a>&#8216;s 2006 win remains just as ridiculous as it was back then\u2014over $18 million. Stack it up against the $10 million someone will win next week. Not that I would complain.<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-scaled.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3230\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-scaled.png\" alt=\"\" width=\"2560\" height=\"1378\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-scaled.png 2560w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-300x162.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-1024x551.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-768x414.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-1536x827.png 1536w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/3_wsop_first_prize-2048x1103.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<hr style=\"width: 60%;\" \/>\n<p>Last and perhaps most revealing, I plotted the rake (tournament fees) collected by the WSOP. Despite overall prize pools trending down since 2006, the people running the tournament are making more money.<\/p>\n<p>When the Main Event returned to normal form in 2021, <a href=\"https:\/\/www.reviewjournal.com\/sports\/poker\/excitement-builds-for-return-of-in-person-wsop-at-rio-2450001\/\" target=\"_blank\" rel=\"noopener\">Caesars expected<\/a> entry count to fall. They compensated by increasing their cut from 6% to 6.75%. Call it a pandemic premium to ensure safety, fine. But when entries rocketed to an all-time high in 2023, they didn&#8217;t reverse course. They hiked it again to an even 7%. That was Caesars&#8217; final year running the WSOP before selling to NSUS, so maybe they took a little extra on their way out the door.<\/p>\n<p>Unsurprisingly, NSUS has maintained the same 7% rake. I won&#8217;t hold my breath for it to fall.<!-- HFCM by 99 Robots - Snippet # 15: endmark-python -->\n<span class=\"endmark-python\"><\/span>\n<!-- \/end HFCM by 99 Robots -->\n<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-scaled.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3234\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-scaled.png\" alt=\"\" width=\"2560\" height=\"1674\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-scaled.png 2560w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-300x196.png 300w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-1024x670.png 1024w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-768x502.png 768w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-1536x1004.png 1536w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/07\/5_wsop_rake-2048x1339.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<hr \/>\n<p><a href=\"https:\/\/wollen.org\/misc\/wsop_2025.zip\"><strong>Download the data.<\/strong><\/a><\/p>\n<p><strong>Full code:<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pandas as pd\r\nimport matplotlib.pyplot as plt\r\nfrom matplotlib.offsetbox import OffsetImage, AnnotationBbox\r\n\r\n\r\npd.set_option(\"display.expand_frame_repr\", False)\r\n\r\ndf = pd.read_csv(\"wsop_main_event_results_1971-2024.csv\")\r\n\r\ndf2 = pd.DataFrame({\"year\": [2025 for _ in range(9)],\r\n                    \"place\": range(1, 10),\r\n                    \"prize\": [10e6, 6e6, 4e6, 3e6, 2.4e6, 1.9e6, 1.5e6, 1.25e6, 1e6],\r\n                    \"entries\": [9735 for _ in range(9)],\r\n                    \"prizepool\": [90.5355e6 for _ in range(9)]})\r\n\r\ndf = pd.concat([df, df2])\r\n\r\ndf.loc[:, 'pct_of_pool'] = df['prize'] \/ df['prizepool'] * 100\r\n\r\ndf = df[df['year'] &gt;= 2003]\r\n\r\ndf = df[df['place'] &lt;= 9]\r\n\r\ndf = df.pivot_table(index=\"year\", columns=\"place\", values=\"pct_of_pool\").reset_index()\r\n\r\nplt.style.use(\"wollen_wsop.mplstyle\")\r\n\r\nfig, ax = plt.subplots()\r\n\r\nax.stackplot(df['year'],\r\n             df.drop(\"year\", axis=1).T,\r\n             alpha=0.8)\r\n\r\nax.set(xticks=range(2003, 2026),\r\n       xlim=(2002.6, 2025.4),\r\n       yticks=range(0, 90, 10),\r\n       yticklabels=[f\"{n}%\" for n in range(0, 90, 10)],\r\n       ylim=(0, 80.5))\r\n\r\nplt.setp(ax.xaxis.get_majorticklabels(), rotation=60, ha=\"right\", rotation_mode=\"anchor\")\r\n\r\ntotal = 0\r\nfor ordinal, place in zip([\"1st\", \"2nd\", \"3rd\", \"4th\", \"5th\", \"6th\", \"7th\", \"8th\", \"9th\"],\r\n                          range(1, 10)):\r\n    ax.text(x=2025.1,\r\n            y=total + df[place].iloc[-1] \/ 2,\r\n            s=ordinal,\r\n            size=8,\r\n            va=\"center\")\r\n    total += df[place].iloc[-1]\r\n\r\nax.text(x=2003,\r\n        y=83,\r\n        s=\"World Series of Poker  \u2022  Main Event\",\r\n        weight=\"bold\",\r\n        size=11)\r\n\r\nax.text(x=2003,\r\n        y=81.2,\r\n        s=\"Final Table payouts as a percentage of overall prize pool\",\r\n        size=10)\r\n\r\nab = AnnotationBbox(OffsetImage(plt.imread(\"wsop_logo.png\"), zoom=0.25, alpha=0.05),\r\n                    xy=(2024.9, 78.8),\r\n                    box_alignment=(1, 1),\r\n                    frameon=False)\r\nax.add_artist(ab)\r\n\r\nplt.savefig(\"wsop_ft_stackplot.png\", dpi=200)<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m a week later than usual on this post because I wanted to wait for the World Series of Poker (WSOP) to finalize Main Event payouts. Registration is closed and this year&#8217;s tournament is the third-largest to date. The final<\/p>\n","protected":false},"author":1,"featured_media":2807,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[239],"tags":[642,643,638,648,135,22,122,589,641,263,647,123,645,640,24,126,639,30,646,636,650,25,649,644,141,637,635],"class_list":["post-2155","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entertainment","tag-buy-in","tag-buyin","tag-caesars","tag-chris-moneymaker","tag-csv","tag-data","tag-dataset","tag-distribution","tag-final-table","tag-inflation","tag-jamie-gold","tag-kaggle","tag-las-vegas","tag-main-event","tag-matplotlib","tag-mplstyle","tag-nsus","tag-pandas","tag-peter-eastgate","tag-poker","tag-prize-pool","tag-python","tag-stack-plot","tag-stackplot","tag-visualization","tag-world-series-of-poker","tag-wsop"],"_links":{"self":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/2155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/comments?post=2155"}],"version-history":[{"count":65,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/2155\/revisions"}],"predecessor-version":[{"id":3251,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/2155\/revisions\/3251"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media\/2807"}],"wp:attachment":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media?parent=2155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/categories?post=2155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/tags?post=2155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}