{"id":1862,"date":"2025-01-06T07:30:55","date_gmt":"2025-01-06T13:30:55","guid":{"rendered":"https:\/\/wollen.org\/blog\/?p=1862"},"modified":"2025-01-06T15:45:47","modified_gmt":"2025-01-06T21:45:47","slug":"how-much-does-a-nintendo-console-cost","status":"publish","type":"post","link":"https:\/\/wollen.org\/blog\/2025\/01\/how-much-does-a-nintendo-console-cost\/","title":{"rendered":"How much does a Nintendo console cost?"},"content":{"rendered":"<p>It&#8217;s been nearly eight years since Nintendo launched their wildly successful Switch console. By most standards, its successor is overdue. While it hasn&#8217;t arrived yet, the company has <a href=\"https:\/\/www.ign.com\/articles\/nintendo-confirms-it-will-announce-switch-successor-console-within-this-fiscal-year\" target=\"_blank\" rel=\"noopener\">promised to reveal it<\/a> by the end of their fiscal year (March 31, 2025). An announcement of an announcement, if you will.<\/p>\n<p>Of course people have speculated about the new console&#8217;s price. We&#8217;ve seen around 30% cumulative inflation since the Switch launched in March 2017, so it&#8217;s a safe bet that we&#8217;ll see a higher price tag when it arrives (most likely) later this calendar year.<\/p>\n<p>I stumbled onto a <a href=\"https:\/\/x.com\/Stephen_Georg\/status\/1419820603683614737\">Twitter\/X post from 2021<\/a> that edited inflation-adjusted prices onto a sales flyer from 1995.<\/p>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/snes_95-21_twitter.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-1866\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/snes_95-21_twitter-272x300.png\" alt=\"\" width=\"272\" height=\"300\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/snes_95-21_twitter-272x300.png 272w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/snes_95-21_twitter.png 671w\" sizes=\"auto, (max-width: 272px) 100vw, 272px\" \/><\/a><\/p>\n<p>It&#8217;s remarkable when you stop and think about it\u2014video game MSRPs have hardly budged in 30 years despite all the inflation since then. But that&#8217;s true of a lot of consumer electronics. 60-inch TVs, for example, are much more affordable than they were in the 1990s. Development and manufacturing advancements have largely canceled out the dollar&#8217;s rising tide.<\/p>\n<p>At least that&#8217;s true of video game software (cartridges or discs). Hardware (console) prices have varied a bit more. I think it would be interesting to see how Nintendo consoles prices, from NES to Switch, compare when adjusted for inflation. It&#8217;s possible they can help us predict the price of the Switch&#8217;s successor.<\/p>\n<hr \/>\n<h4>1. Prepare the data.<\/h4>\n<p>I tracked down launch dates and prices from Wikipedia and dropped them into a CSV file. Let&#8217;s load it into a pandas DataFrame and take a look.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">import pandas as pd\r\n\r\ndf = pd.read_csv(\"nintendo_consoles_prices.csv\", parse_dates=[\"release_date\"])\r\n\r\nprint(df.head(50))<\/pre>\n<p>The output:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">     console release_date  nominal_price\r\n0        NES   1985-10-18         179.00\r\n1   Game Boy   1989-07-31          89.99\r\n2       SNES   1991-08-23         199.00\r\n3        N64   1996-09-29         199.99\r\n4        GBC   1998-11-18          79.95\r\n5        GBA   2001-06-11          99.99\r\n6   Gamecube   2001-11-18         199.00\r\n7         DS   2004-11-21         149.99\r\n8        Wii   2006-11-19         249.99\r\n9        3DS   2011-03-27         249.99\r\n10     Wii U   2012-11-18         299.00\r\n11    Switch   2017-03-03         299.99<\/pre>\n<p>The Nintendo Entertainment System might sound like a bargain at $179 but that was a lot of money in 1985! We&#8217;ll see later that Nintendo hasn&#8217;t charged that much again.<\/p>\n<p>Let&#8217;s create a new column with inflation-adjusted modern prices. I like to use Ben Welsh&#8217;s <a href=\"https:\/\/palewi.re\/docs\/cpi\/\" target=\"_blank\" rel=\"noopener\">cpi library<\/a>.<\/p>\n<p>The whole process can be done by applying <code>cpi.inflate<\/code>. Pass the nominal price, original date, and final date. At the time of this post, November 2024 is the most recent available month, so we&#8217;ll use that.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">from cpi import inflate\r\nfrom datetime import date\r\n\r\ndf.loc[:, 'nov_2024_price'] = df.apply(lambda row: inflate(row['nominal_price'],\r\n                                                           row['release_date'],\r\n                                                           date(2024, 11, 1)\r\n                                                           ),\r\n                                       axis=1)<\/pre>\n<p>This new column will be the only variable represented on our plot. My plan is to do a scatter plot with dots stacked vertically. That way we can easily label each console&#8217;s dot with horizontal text.<\/p>\n<p>That means every data point will have the same x-coordinate. We&#8217;ve already created our y-axis data, so let&#8217;s make an <em>x<\/em> column as well.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">df.loc[:, 'x'] = 0<\/pre>\n<p>We should also sort the DataFrame by price. Later it will be easier to iterate through rows and label the data.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">df = df.sort_values(\"nov_2024_price\", ascending=False)<\/pre>\n<p>At this point, <code>df.head(50)<\/code> looks like this:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">     console release_date  nominal_price  nov_2024_price  x\r\n0        NES   1985-10-18         179.00      519.533091  0\r\n2       SNES   1991-08-23         199.00      459.612789  0\r\n10     Wii U   2012-11-18         299.00      409.747186  0\r\n3        N64   1996-09-29         199.99      399.844392  0\r\n8        Wii   2006-11-19         249.99      391.414864  0\r\n11    Switch   2017-03-03         299.99      388.204909  0\r\n6   Gamecube   2001-11-18         199.00      353.907029  0\r\n9        3DS   2011-03-27         249.99      352.938443  0\r\n7         DS   2004-11-21         149.99      247.752854  0\r\n1   Game Boy   1989-07-31          89.99      228.225202  0\r\n5        GBA   2001-06-11          99.99      177.225534  0\r\n4        GBC   1998-11-18          79.95      153.802838  0<\/pre>\n<p>Now we can see every console&#8217;s price in November 2024 dollars. These prices will define the y-axis and every point will be located at x=0, creating a vertical stack.<\/p>\n<p>We have everything we need. Let&#8217;s plot the data.<\/p>\n<hr \/>\n<h4>2. Plot the data.<\/h4>\n<p>I&#8217;ll use a custom mplstyle meant to emulate <a href=\"https:\/\/www.nintendo.co.jp\/ir\/en\/index.html\" target=\"_blank\" rel=\"noopener\">Nintendo&#8217;s Investor Relations web site<\/a>. It&#8217;s about as interesting as it sounds: a white background, lots of gray, and a few splashes of red.<\/p>\n<p>I usually name my Axes instances <code>ax<\/code>, but this plot will have two Axes, so let&#8217;s call the first one <code>ax0<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">plt.style.use(\"wollen_nintendo.mplstyle\")\r\n\r\nfig, ax0 = plt.subplots()<\/pre>\n<p>Create the scatter plot on <code>ax0<\/code>. Remember our x and y arguments are the columns we created before. Adjust dot size and border.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax0.scatter(df['x'], df['nov_2024_price'], s=80, edgecolor=\"#333\", linewidth=0.5)<\/pre>\n<p>I want a vertical grid line behind the dots but no x-axis labels. It may seem unnecessary but we should set x-limits so that text is spaced correctly within the window.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax0.set_xticks([0], labels=[])\r\nax0.set_xlim(-100, 100)<\/pre>\n<p>The y-axis is a little more interesting. Each integer value of <code>y_ticks<\/code> is replaced by a dollar string in <code>y_tick_labels<\/code>. Save the lists as variables because we&#8217;ll also place them on the right-hand side of the plot.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">y_ticks = range(150, 600, 50)\r\nax0.set_yticks(y_ticks)\r\ny_tick_labels = [f\"${n}\" for n in y_ticks]\r\nax0.set_yticklabels(y_tick_labels)\r\ny_tick_range = y_ticks[-1] - y_ticks[0]\r\ny_bottom, y_top = y_ticks[0] - y_tick_range * 0.02, y_ticks[-1] + y_tick_range * 0.01\r\nax0.set_ylim(y_bottom, y_top)<\/pre>\n<p>This is where we create a second Axes instance, <code>ax1<\/code>, to occupy the right-hand side of the plot. In general it&#8217;s a good idea to avoid dual y-axis graphs because they can be confusing, but in this case there is only one data series present. The second axis exists only for symmetry.<\/p>\n<p>Pass the previously defined <code>y_ticks<\/code> and <code>y_tick_labels<\/code> to the appropriate methods. Hide <code>ax1<\/code> grid lines by setting their <code>linewidth<\/code> to 0. They&#8217;re identical to <code>ax0<\/code> grid lines so they can only get in the way.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax1 = ax0.twinx()\r\nax1.set_yticks(y_ticks)\r\nax1.set_yticklabels(y_tick_labels)\r\nax1.set_ylim(y_bottom, y_top)\r\nax1.grid(which=\"both\", linewidth=0)<\/pre>\n<p>Next we want to label each data point. Because the points tend to crowd each other, we can space things out by alternating labels on left and right. I use a bool named <code>align_toggle<\/code> to accomplish this. When it&#8217;s True, text is placed on the right side. When it&#8217;s False, text goes on the left. And the bool switches as we step through each row of the DataFrame. This is why we sorted prices from highest to lowest. If we hadn&#8217;t, the alignments would be all over the place.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">align_toggle = True\r\nfor r, row in df.iterrows():\r\n    ax0.text(x={True: 5, False: -5}[align_toggle],\r\n             y=row['nov_2024_price'],\r\n             s=f\"{row['console']}  (${row['nominal_price']:.0f}, {row['release_date'].strftime('%b %Y')})\",\r\n             ha={True: \"left\", False: \"right\"}[align_toggle],\r\n             va=\"center\")\r\n    align_toggle = not align_toggle<\/pre>\n<p>Call <code>text<\/code> one more time to create a source message at the bottom of the plot.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax0.text(x=-100,\r\n         y=y_bottom - y_tick_range * 0.008,\r\n         s=\"Console data: Wikipedia\\nAdjusted using CPI Inflation Calculator\",\r\n         size=8,\r\n         ha=\"left\",\r\n         va=\"top\")<\/pre>\n<p>Finally, set a title and save the figure.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">ax0.set_title(\"Nintendo Consoles\\nUSA Inflation-Adjusted Launch Price\\nNovember 2024 Prices\")\r\n\r\nplt.savefig(\"nintendo_console_prices.png\", dpi=150)<\/pre>\n<hr \/>\n<h4>3. The output.<\/h4>\n<p><a href=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/nintendo_console_prices.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1872\" src=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/nintendo_console_prices-512x1024.png\" alt=\"\" width=\"512\" height=\"1024\" srcset=\"https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/nintendo_console_prices-512x1024.png 512w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/nintendo_console_prices-150x300.png 150w, https:\/\/wollen.org\/blog\/wp-content\/uploads\/2025\/01\/nintendo_console_prices.png 750w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/p>\n<p>As I mentioned above, Nintendo&#8217;s first console, the NES, was its most expensive when adjusted for inflation. Their cheapest was the Game Boy Color, which isn&#8217;t surprising because it was a handheld device and an iteration on the original 1989 Game Boy.<\/p>\n<p>So how much will Nintendo&#8217;s next console cost? When I look at this plot I notice handheld devices have generally occupied the lower-end $150 to $250 range. And home consoles, while originally priced above $500, have since settled around $400. That includes the Nintendo Switch, which when adjusted for inflation launched at just under $400.<\/p>\n<p>With <a href=\"https:\/\/www.polygon.com\/nintendo\/23899504\/nintendo-switch-2-release-date-power-name-games\" target=\"_blank\" rel=\"noopener\">rumors<\/a> that the new console will position itself as a more capable piece of hardware than its predecessor, it&#8217;s difficult to imagine a less-expensive $300 or $350 price tag. I would expect Nintendo&#8217;s next console to be priced at $400. That makes the most sense to me given how they&#8217;ve priced consoles in the past.<\/p>\n<p>That is, of course, pure speculation. Its possible that Nintendo will change course and target a lower- or higher-end customer in the next generation.<\/p>\n<hr \/>\n<p><a href=\"https:\/\/wollen.org\/misc\/nintendo_prices_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\nfrom cpi import inflate\r\nfrom datetime import date\r\nimport matplotlib.pyplot as plt\r\n\r\n\r\ndf = pd.read_csv(\"nintendo_consoles_prices.csv\", parse_dates=[\"release_date\"])\r\n\r\ndf.loc[:, 'nov_2024_price'] = df.apply(lambda row: inflate(row['nominal_price'],\r\n                                                           row['release_date'],\r\n                                                           date(2024, 11, 1)\r\n                                                           ),\r\n                                       axis=1)\r\n\r\ndf.loc[:, 'x'] = 0\r\n\r\ndf = df.sort_values(\"nov_2024_price\", ascending=False)\r\n\r\nprint(df.head(50))\r\n\r\nplt.style.use(\"wollen_nintendo.mplstyle\")\r\n\r\nfig, ax0 = plt.subplots()\r\n\r\nax0.scatter(df['x'], df['nov_2024_price'], s=80, edgecolor=\"#333\", linewidth=0.5)\r\n\r\nax0.set_xticks([0], labels=[])\r\nax0.set_xlim(-100, 100)\r\n\r\ny_ticks = range(150, 600, 50)\r\nax0.set_yticks(y_ticks)\r\ny_tick_labels = [f\"${n}\" for n in y_ticks]\r\nax0.set_yticklabels(y_tick_labels)\r\ny_tick_range = y_ticks[-1] - y_ticks[0]\r\ny_bottom, y_top = y_ticks[0] - y_tick_range * 0.02, y_ticks[-1] + y_tick_range * 0.01\r\nax0.set_ylim(y_bottom, y_top)\r\n\r\nax1 = ax0.twinx()\r\nax1.set_yticks(y_ticks)\r\nax1.set_yticklabels(y_tick_labels)\r\nax1.set_ylim(y_bottom, y_top)\r\nax1.grid(which=\"both\", linewidth=0)\r\n\r\nalign_toggle = True\r\nfor r, row in df.iterrows():\r\n    ax0.text(x={True: 5, False: -5}[align_toggle],\r\n             y=row['nov_2024_price'],\r\n             s=f\"{row['console']}  (${row['nominal_price']:.0f}, {row['release_date'].strftime('%b %Y')})\",\r\n             ha={True: \"left\", False: \"right\"}[align_toggle],\r\n             va=\"center\")\r\n    align_toggle = not align_toggle\r\n\r\nax0.text(x=-100,\r\n         y=y_bottom - y_tick_range * 0.008,\r\n         s=\"Console data: Wikipedia\\nAdjusted using CPI Inflation Calculator\",\r\n         size=8,\r\n         ha=\"left\",\r\n         va=\"top\")\r\n\r\nax0.set_title(\"Nintendo Consoles\\nUSA Inflation-Adjusted Launch Price\\nNovember 2024 Prices\")\r\n\r\nplt.savefig(\"nintendo_console_prices.png\", dpi=150)<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>It&#8217;s been nearly eight years since Nintendo launched their wildly successful Switch console. By most standards, its successor is overdue. While it hasn&#8217;t arrived yet, the company has promised to reveal it by the end of their fiscal year (March<\/p>\n","protected":false},"author":1,"featured_media":1881,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[239],"tags":[262,22,122,365,263,368,24,371,364,369,30,46,370,25,372,367,366],"class_list":["post-1862","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entertainment","tag-cpi","tag-data","tag-dataset","tag-inflate","tag-inflation","tag-launch-price","tag-matplotlib","tag-msrp","tag-nintendo","tag-nintendo-switch","tag-pandas","tag-plot","tag-price","tag-python","tag-successor","tag-video-game-consoles","tag-video-games"],"_links":{"self":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/1862","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=1862"}],"version-history":[{"count":20,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/1862\/revisions"}],"predecessor-version":[{"id":1885,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/posts\/1862\/revisions\/1885"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media\/1881"}],"wp:attachment":[{"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/media?parent=1862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/categories?post=1862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollen.org\/blog\/wp-json\/wp\/v2\/tags?post=1862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}