<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://shibaprasadb.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://shibaprasadb.github.io/" rel="alternate" type="text/html" /><updated>2026-08-04T05:16:04+00:00</updated><id>https://shibaprasadb.github.io/feed.xml</id><title type="html">Shibaprasad Bhattacharya</title><entry><title type="html">Why AI Will Continue to Be Good at Bad Strategy</title><link href="https://shibaprasadb.github.io/2026/07/23/ai-bad-strategy.html" rel="alternate" type="text/html" title="Why AI Will Continue to Be Good at Bad Strategy" /><published>2026-07-23T00:00:00+00:00</published><updated>2026-07-23T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/07/23/ai-bad-strategy</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/07/23/ai-bad-strategy.html"><![CDATA[<p>In one of the recent episodes of Lenny’s Podcast (with the head of Instagram), Lenny made a comment about AI and strategy. He had expected AI to be good at strategy, but that hasn’t been the case.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/yQ_EWmtfWvQ" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>I never thought AI could be good at strategy. Even though there has been some hype around that, if we go one level deeper into how GenAI models work and what makes a strategy good, we can easily figure out why they will always be suboptimal at strategy.</p>

<p>But, on the other hand, they will always be quite good at bad strategy. The distinction is real.</p>

<p>Let’s first understand the grains of a good strategy. And a bad one.</p>

<h2 id="what-makes-a-strategy-good">What makes a strategy good?</h2>

<p>This is not something that I am spitting out of thin air. I am borrowing the framework of strategy god <a href="https://en.wikipedia.org/wiki/Richard_Rumelt">Richard Rumelt</a>. According to him, a good strategy has three kernels: a diagnosis, a guiding policy and a set of coherent actions.</p>

<p>A diagnosis names or classifies the situation, linking facts into patterns and suggesting that more attention be paid to some issues and less to others. It basically answers: What is going on?</p>

<p>The guiding policy highlights the overall approach for overcoming the obstacles identified by the diagnosis. It creates advantage by anticipating the actions and reactions of others, and by reducing the complexity and ambiguity in the situation.</p>

<p>A set of coherent actions is then designed to carry out the guiding policy.</p>

<p>Rumelt has also defined bad strategy at length. Bad strategies are full of fluff. They are long on goals and vision. But a strategy should give you the tools to face the challenge. And, most importantly, it should identify the challenge at hand. Bad strategies don’t do that.</p>

<h2 id="how-do-llms-work">How do LLMs work?</h2>

<p>Large language models like ChatGPT or Claude are trained on an enormous amount of data: books, websites, articles, code and much more. They learn statistical patterns in language, including how words appear together, how arguments are structured and how concepts relate to one another. From all that data that already existed.</p>

<p>They process text as tokens: small units that may be words, parts of words or even punctuation. The model is autoregressive, generating one token at a time (mostly!) based on everything that came before it. What feels like reasoning therefore emerges from a very sophisticated probabilistic system operating over a vast learned pattern space.</p>

<p>This is, of course, a generalised version of how LLMs work. But it is enough for the argument here.</p>

<h2 id="ill-structured-vs-structured-domains">Ill-structured vs structured domains</h2>

<p>LLMs have seen massive uptake in work related to structured domains, such as software engineering or mathematics. Here, the past training data is quite helpful. The rules of the game don’t change.</p>

<p>The logic for writing a while loop is constant. 2+2 will always be four. The models are trained on that data, so they can produce the output when prompted.</p>

<p>Strategy sits in an ill-structured domain. The real, messy business world. Every case here is different and unique in some way. What helps here is <a href="https://www.sciencedirect.com/topics/psychology/cognitive-flexibility-theory">cognitive flexibility theory</a>. It says that in ill-structured domains, you don’t just learn one rule or framework and apply it everywhere. You learn a set of rules by criss-crossing the same terrain from multiple angles, building a library of cases, and picking the right lens depending on what you’re actually looking at. It’s the opposite of pattern-matching to the nearest precedent, which, awkwardly, is close to the only thing an LLM knows how to do.</p>

<p>And if you look closely at how LLMs are trained, cognitive flexibility is an awkward game for them. Not impossible, but it is not their natural mode either. Their strength lies in finding and recombining patterns from what they have already seen. Good strategy requires a more selective kind of pattern recognition: identifying which previous situations are relevant, where the similarities end and why the current situation may demand a different response.</p>

<p>The same facts can usually support several plausible diagnoses. An LLM tends to preserve many of them and produce a comprehensive answer. (which looks promising!)</p>

<p>Good strategy requires choosing one diagnosis to govern the others. And accepting what that choice leaves out.</p>

<h2 id="connecting-the-dots">Connecting the dots</h2>

<p>Now say you are inside an organisation. Your organisation is facing an issue, and you want to devise a strategy around it. How can AI help in creating that good strategy? Especially with the underlying training logic that we just discussed.</p>

<p>For example, let’s consider a food-delivery app. Their growth has slowed down for the past 2 months. You need to devise a strategy to improve that situation. Now, you give the whole detailed scenario and ask an LLM for a strategy. It will probably suggest something along the lines of improving retention, introducing loyalty awards, new &amp; better recommendations etc. All of these may sound sensible on the superficial level. But none of them is a strategy yet.</p>

<p>Once you investigate, you may find the actual issue, which can be narrower. Maybe the loyal-frequent users of the company are not ordering not because of the price or poor recommendations, but because delivery times have become unpredictable during the weekday office hours. These peak time deliveries contribute ~30% to the total order volume, but the company has not been able to maintain a stable service level during those hours.</p>

<p>Then the guiding policy might be to improve density and reliability in those neighbourhoods rather than chase growth everywhere. The coherent actions would follow: restrict the delivery radius during peak hours, recruit more delivery executives (maybe temps for weekdays) around those clusters and change restaurant incentives to reduce preparation delays.</p>

<p>An LLM can generate those actions once the diagnosis is given - sometimes. You would need to spend time feeding the info about the competitive landscape, business constraints, etc. But identifying the diagnosis is one of the biggest obstacles of Rumelt’s framework. It requires company-specific data, conversations with the ops team, judgement and an understanding of what is changing underneath the averages.</p>

<p>Without that diagnosis, what would the model do? It would generate fluff. And that would be convincing to many people who might not be well versed in what a good strategy should look like.<sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> It would recommend something like customer centricity. Or Operational excellence. Or say sustainable growth. You get the drift.</p>

<p>This is why AI is good at bad strategy. Bad strategy is linguistically impressive, but it lacks the analytical diligence. It resembles the thousands of strategy documents, consulting decks, annual reports and leadership speeches that the model has already seen. And for that reason, it can reproduce those patterns exceptionally well. But more often than not, they would have no intrinsic value.</p>

<p>Is it totally useless? What can it help with instead? Market research, for one, surely. But even there, one needs to be more specific. “How is Paytm different from PhonePe?” might not yield a structured response like “Compare how Paytm and PhonePe make money, using their latest public filings, and separate reported facts from inference”. The latter gives the model a much tighter research task.</p>

<hr />

<p>I like to think that human and GenAI outputs work something like this. To some extent. This is kind of my mental model of their respective defaults:</p>

<p><img src="/images/posts/2026-07-23-ai-bad-strategy/ai_bad_strategy.png" alt="AI &amp; Human" /></p>

<p>Human judgement is volatile. There are peaks and valleys. We produce plenty of terrible ideas, average ideas and occasionally something brilliant. And the path to brilliant ideas is often full of terrible ideas. There is no strict pattern. Expertise makes us more consistent. But even after that, the AI output is much more consistent.</p>

<p>That consistency is useful in many domains. Specially for well-structured domains. You may write suboptimal code one day - miss the ‘;’ or design something with O(N^2) complexity where a simpler solution already exists for that. AI will never make that kind of mistake. But good strategy is different. It sits above a threshold. It needs a diagnosis that cuts through the noise, a choice that excludes other choices and a set of actions built specifically for the challenge at hand.</p>

<p>The volatility in human output is an asset for strategy work. You need sharper, more coherent minds who can cross the threshold after months of interaction and sitting with other human beings &amp; studying every angle. AI may keep missing it very reliably. Every damn time.</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>I also think good tech &amp; business consultants will be in huge demand. Pretty soon. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><category term="strategy" /><summary type="html"><![CDATA[Good strategy requires a diagnosis and a choice. AI prefers a plausible list.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2026-07-23-ai-bad-strategy/ai_bad_strategy.png" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2026-07-23-ai-bad-strategy/ai_bad_strategy.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Price of Outsourcing Chores</title><link href="https://shibaprasadb.github.io/2026/07/17/househelp-india.html" rel="alternate" type="text/html" title="The Price of Outsourcing Chores" /><published>2026-07-17T00:00:00+00:00</published><updated>2026-07-17T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/07/17/househelp-india</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/07/17/househelp-india.html"><![CDATA[<p>When you leave your country for a certain amount of time, what do you miss the most? Probably your family, friends, and the community you had in your country?</p>

<p>But for many non-resident Indians (NRIs), there is something different.</p>

<p>Recently, I was talking to a colleague who’d just wrapped up a European trip. They were overjoyed to be back in a place with an AQI of 130 from 9. During our conversation, I asked them what they missed the most. And what disappointed them about Europe?</p>

<p>The answer was kind of refreshing; I am not gonna lie. I was expecting the third point they made to be the primary one, like most do. House help &amp; 10-min delivery.</p>

<p>This is something that has been sitting in an uncomfortable middle for me for a long time. I get the point about the <a href="https://simple.wikipedia.org/wiki/The_double_thank-you_of_capitalism">double thank-you moment</a>. You are paying someone for their services. You both are better because of that. The househelp is getting paid, otherwise they wouldn’t be able to. And you are not getting bothered about the chores, and can focus your energy somewhere else.</p>

<p>The other side is this: this is not a glamorous job at any cost. And this is a big bug of the Indian socio-economic scene. This shouldn’t be celebrated as a big feature that we often tend to do. Yes, they are doing better because of the opportunity, because I am paying. But they could’ve done far better if there was a better opportunity.</p>

<p>Anyways. I thought of quantifying my discomfort. And I went down a deep rabbit hole. I have spent a lot of time and tokens on this, more than I would have liked to. This probably needs multiple blog posts to do a proper narrative-driven summary.</p>

<p>In any case, it would be good to summarise a few things.</p>

<p>So the actual question. Is domestic help in India cheap? And Cheap compared to what?</p>

<p>Drawing a line in the sand is often <a href="https://leananalyticsbook.com/tag/line-in-the-sand/">important in analytics</a>. So here is one quick assumption that I made: India’s PLFS data breaks down what Indians earn on average: self-employed workers make about ₹13,279 a month, regular salaried employees about ₹20,702, casual labourers about ₹12,750. I made a weighted average of how much of the workforce falls into each bucket (roughly ~ 56%, 24%, and 20%), and it turned out about ₹15,000 a month.</p>

<p>But that’s everyone. Street vendors, casual construction labour, salaried clerks- everyone is included there. Domestic help is a much narrower and more specific market. Not everyone can buy it, and it’s concentrated in T1 and T2 cities. Ask around in a Mega city, and the number you’ll actually hear for full-time domestic help is somewhere between ₹20,000 and ₹30,000 a month. So that’s what I’m using here: ₹25,000, the midpoint.</p>

<p>The obvious way to check if this is “cheap”: price a full-time domestic worker against the country’s own GDP per capita. And check if you can spot a pattern there.</p>

<p><img src="/images/posts/2026-07-17-househelp-india/chart_gdp_help.png" alt="Chart 1: Domestic help cost vs GDP per capita, 20 countries" /></p>

<p>And the naive answer surprised me. India isn’t the cheapest country on this list. It’s the most expensive, by a wide margin. A full-time domestic worker here costs more than the average Indian’s entire annual income. Not a large share of it. Even if we use the earlier discussed 15k number, the percentage would still be close to or more than 100%.</p>

<p>Nowhere else in the sample gets anywhere close, rich or poor. This holds almost everywhere where labour is priced locally, whether the country is poor or comfortably rich. It only breaks for a handful of places (Singapore, the Gulf, Hong Kong) where they don’t price domestic help off their own wages at all but rather import it from somewhere cheaper. Another country.</p>

<p>So the popular intuition, that help is dirt cheap here because we’re a poor country, goes for a toss if we take a look at GDP per capita numbers.</p>

<p>But comparing cost to GDP per capita has a slight problem. GDP per capita isn’t what a person actually earns. It’s the country’s total economic output divided by literally everyone, including your niece who’s still in school. There’s a sharper, more honest question hiding underneath the naive scatter plot.</p>

<p>How many hours of someone else’s work can an hour of your own work buy?</p>

<p><img src="/images/posts/2026-07-17-househelp-india/chart_final_payoff.png" alt="Chart 2: Hours of domestic help one hour of average work buys" /></p>

<p>This is where it stopped being an interesting fact and started being a bit uncomfortable. Everywhere else in the sample, an hour of average work buys more than an hour of domestic help. In India, it buys less. An average Indian’s hour of work buys less than an hour of a domestic worker’s time, not more. (Singapore’s number is enormous, but for a completely different reason. That’s imported labour, as we have already discussed.)</p>

<p>Also - one thing to keep in mind here. Which is the crux of the matter. We already have established that domestic help is not a glorious job. But for a large section of the Indian social strata, even the opportunity of doing that in a T1 or T2 can feel aspirational.</p>

<p>So that’s the number underneath my discomfort, finally. It’s not that help is a bargain here. It’s that too many people don’t have a better option than to sell an hour of their time for less than it’s worth. This is, for sure, not a feature of how efficiently the Indian state has organised the economy - and that probably shouldn’t be celebrated.</p>

<p>This is just what a very low floor looks like, once you measure it. And the low floor might be lucrative for many.</p>

<p>While writing this post, I randomly remembered something an extremely annoying (he was complaining too much about Kolkata, his ex-wife, parents and many other things) Uber driver once told me: how can you tell if someone is really rich? Just see if they can hire a full-time driver.</p>

<hr />

<p><em>Originally published on <a href="https://www.ordinaryanalysis.com/p/the-price-of-outsourcing-chores">Ordinary Analysis</a>.</em></p>

<hr />

<h2 id="notes-on-the-data">Notes on the data</h2>

<p><strong>Chart 1 — Domestic help cost vs. GDP per capita (20 countries)</strong></p>

<p>GDP per capita: <a href="https://www.imf.org/en/Publications/WEO">IMF World Economic Outlook</a>, nominal 2025, all countries.</p>

<p>Domestic help cost (% of GDP per capita), by source confidence:</p>

<p><em>Stated assumption:</em> India, ₹25,000/month, full-time domestic help in T1/T2 cities (see main text for the PLFS comparison).</p>

<p><em>High confidence, real statutory/government figures:</em> Philippines (DOLE Kasambahay wage order, NCR minimum), South Africa (Sectoral Determination 7 / BCEA minimum wage, R28.79/hr), Hong Kong (Migrant Domestic Helper Minimum Allowable Wage, HK Immigration Department).</p>

<p><em>Medium confidence, aggregator or agency-rate based:</em> China (city-level ayi/cleaner rate estimates), Indonesia (Jakarta live-in ART estimates), Thailand (Bangkok live-in estimates), Mexico (empleada de planta wage estimates), Brazil (mensalista wage estimates), United States (full-time housekeeper/nanny salary aggregators), United Kingdom (housekeeper salary aggregators), Germany (Putzperle/go-quitt minijob-rate sources), Singapore (FDW wage, MOM-adjacent sources).</p>

<p><em>Low confidence, thin sourcing, treat as plus or minus 10 points:</em> Vietnam, Turkey, Nigeria, Egypt (live-in domestic wage estimates from limited sources), Qatar, Saudi Arabia, UAE (migrant domestic worker wage, agency-adjacent sources).</p>

<p><strong>Chart 2 — Hours of domestic help one hour of average work buys (8 countries)</strong></p>

<table>
  <thead>
    <tr>
      <th>Country</th>
      <th>Domestic help pay/month</th>
      <th>Source</th>
      <th>Average wage/month</th>
      <th>Source</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>India</td>
      <td>₹25,000</td>
      <td>Stated assumption (T1/T2 full-time help)</td>
      <td>₹15,000</td>
      <td>PLFS-weighted: self-employed ₹13,279, regular salaried ₹20,702, casual ₹12,750, weighted 56%/24%/20% (<a href="https://www.indiabudget.gov.in/economicsurvey/">Economic Survey 2024-25</a>, p.378)</td>
    </tr>
    <tr>
      <td>China</td>
      <td>¥7,000</td>
      <td>City-level ayi/cleaner rate estimate</td>
      <td>¥9,500</td>
      <td><a href="https://www.stats.gov.cn/english/">National Bureau of Statistics of China</a>, 2026</td>
    </tr>
    <tr>
      <td>United Kingdom</td>
      <td>£2,100</td>
      <td>Housekeeper salary aggregators</td>
      <td>£3,392</td>
      <td>Derived from a secondary salary-comparison site, not primary <a href="https://www.ons.gov.uk/">ONS</a></td>
    </tr>
    <tr>
      <td>Brazil</td>
      <td>R$1,800</td>
      <td>Mensalista wage estimate</td>
      <td>R$3,300</td>
      <td>Rough estimate, not directly sourced</td>
    </tr>
    <tr>
      <td>United States</td>
      <td>$3,500</td>
      <td>Full-time housekeeper/nanny estimate</td>
      <td>$6,800</td>
      <td><a href="https://www.bls.gov/">BLS</a>, average hourly earnings Jan 2026 (~$37/hr, annualised)</td>
    </tr>
    <tr>
      <td>Germany</td>
      <td>€2,200</td>
      <td>Minijob-rate-based estimate</td>
      <td>€4,784</td>
      <td><a href="https://www.destatis.de/">Destatis</a>, average gross monthly wage 2026</td>
    </tr>
    <tr>
      <td>South Africa</td>
      <td>R5,500</td>
      <td>BCEA minimum wage basis</td>
      <td>R18,000</td>
      <td>Rough, formal-sector-skewed estimate, not directly sourced</td>
    </tr>
    <tr>
      <td>Singapore</td>
      <td>S$650</td>
      <td>FDW wage, MOM-adjacent sources</td>
      <td>S$5,500</td>
      <td>Salary-aggregator estimate, not primary <a href="https://www.mom.gov.sg/">MOM</a> data</td>
    </tr>
  </tbody>
</table>

<p>Singapore’s ratio (8.46) reflects imported labour priced below Singapore’s own wages, not local wage compression. It’s structurally different from every other row in this table and shouldn’t be read as “cheap” in the same sense India, Brazil, or Germany are.</p>

<p>The weakest links in this table, flagged plainly: Brazil’s and South Africa’s average-wage figures, and the UK’s, don’t have a primary-source citation behind them. Everything else traces to a named statistical office or government wage order.</p>]]></content><author><name></name></author><category term="data-stories" /><summary type="html"><![CDATA[Is househelp cheap in India? What do the numbers across 20 countries say? It isn't, for most Indians.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2026-07-17-househelp-india/chart_final_payoff.png" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2026-07-17-househelp-india/chart_final_payoff.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Cursorbench Evals: The Effect of Family &amp;amp; Cost</title><link href="https://shibaprasadb.github.io/2026/07/09/cursorbench-analysis.html" rel="alternate" type="text/html" title="Cursorbench Evals: The Effect of Family &amp;amp; Cost" /><published>2026-07-09T00:00:00+00:00</published><updated>2026-07-09T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/07/09/cursorbench-analysis</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/07/09/cursorbench-analysis.html"><![CDATA[<p>I was going through the <a href="https://cursor.com/evals">Cursor Bench</a> evals.</p>

<p>The plot that they had used was a bit deceiving &amp; counter intuitive. It had the X axis starting from 20 (the highest value).</p>

<p><img src="/images/posts/2026-07-09-cursorbench-analysis/cursor_bench_models.png" alt="Cursor Bench - Different AI models" /></p>

<p>So, I thought of cleaning the plot a bit, in order to have a better clarity.</p>

<p>I reversed the X axis, and added all the numbers that they had mentioned in the table but were not included in the plot. After that, it looked like this:</p>

<p><img src="/images/posts/2026-07-09-cursorbench-analysis/cursorbench_revamped.png" alt="Cursor Bench - Revamped " /></p>

<p>Now, this cleaned plot, looked interesting to me.</p>

<ul>
  <li>The cost vs accuracy kinda follow a concave curve. (logarithmic)</li>
  <li>Composer 2.5 (Cursor’s own model) looks like an outlier.</li>
</ul>

<p>So, let’s run two simple linear regressions.</p>

<p>Let’s gather all the outputs in this table:</p>

<table>
  <thead>
    <tr>
      <th>Model characteristics</th>
      <th>n</th>
      <th>R²</th>
      <th>p-value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>score ~ cost, with Composer</td>
      <td>36</td>
      <td>0.593</td>
      <td>3.97e-08</td>
    </tr>
    <tr>
      <td>score ~ cost, without Composer</td>
      <td>34</td>
      <td>0.664</td>
      <td>4.56e-09</td>
    </tr>
    <tr>
      <td>score ~ log(cost), with Composer</td>
      <td>36</td>
      <td>0.545</td>
      <td>2.74e-07</td>
    </tr>
    <tr>
      <td>score ~ log(cost), without Composer</td>
      <td>34</td>
      <td>0.815</td>
      <td>2.79e-13</td>
    </tr>
  </tbody>
</table>

<p>Now, we got some idea about this. Before summarising what is happening, let’s run another type of regression. Linear mixed effects model.</p>

<p>A linear mixed model is a regression that separates two things at once: an overall slope you care about (here, the effect of log(cost) on score), and group-level variation you want to account for but not estimate one-by-one (here, each model family’s own baseline). It’s useful whenever your rows aren’t fully independent, like model variants nested inside families, because it stops that internal correlation from making your effect look more certain than it actually is.</p>

<p>Here is the result:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Random effects:
 Groups   Name        Std.Dev.
 family   (Intercept) 6.843   
 Residual             2.873   
 
Fixed Effects:
(Intercept)    log(cost)  
     45.522        9.666  
</code></pre></div></div>

<p>Now the story time, what this means?</p>

<ol>
  <li>
    <p><strong>Cost does buy score, but the returns are sharply diminishing.</strong></p>

    <p>All the models that we used, roughly agrees with this. Log(cost) beats raw cost if Composer is removed. And the slope of the mixed model also confirms it - doubling cost buys roughly 6.7 points <sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup>, consistently, once you control for which family you’re in.</p>
  </li>
  <li>
    <p><strong>Curios case of Composer</strong></p>

    <p>Composer is developed by Cursor, and it broke the log(cost) structure completely. For the statistical analysis, we filtered it out as an outlier. But the more honest reading might be (if the numbers to be believed) : it is a well optimised cheap model.</p>
  </li>
  <li>
    <p><strong>Family matters</strong></p>

    <p>The mixed model splits the leftover variance (whatever cost doesn’t explain) into two parts: how much comes from which family versus everything else. Squaring the standard deviations and comparing them, family accounts for ~85% of that leftover variation, noise only ~15%. In plain terms: pick two model variants at the same price, and which family they belong to explains most of the score gap between them.</p>
  </li>
</ol>

<hr />

<p>So, putting together, the cost component has two parts. More spending gives you better accuracies, but the family of the model matters too. Family seems to be a coarse lever, you move from one to another, and get a bump in the accuracy. Turning efforts within a family seems like a finer scale.</p>

<p>One analogy I can think of - hiring vs overtime problem. Hiring the right people can yield better results than the wrong people working on weekends. No amount of overtime can fix that hiring gap.</p>

<p>This is where the judgement of the operator using the tool would be very important. You should ideally want to use a “weaker” model for more trivial problems. If you want to optimise the token cost. In data science, it is important to know which model to use when. This translates to that philosophy roughly - one needs to know which API call is needed for a particular problem.</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>The mixed model gives predicted score as f(cost) = 45.522 + 9.666 · ln(cost). To find the effect of doubling cost, compare f(2c) to f(c):</p>

      <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>f(2c) − f(c) = 9.666 · [ln(2c) − ln(c)]
             = 9.666 · ln(2c / c)
             = 9.666 · ln(2)
             = 9.666 × 0.693
             ≈ 6.7
</code></pre></div>      </div>

      <p>The intercept and c cancel out entirely, so this ≈6.7-point gain is constant regardless of starting cost, the defining property of a log-linear relationship. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><category term="product" /><category term="technical" /><summary type="html"><![CDATA[Running some statistical analyses for Cursor Bench evals]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2026-07-09-cursorbench-analysis/cursorbench_revamped.png" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2026-07-09-cursorbench-analysis/cursorbench_revamped.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The New Tap-In, Tap-Out</title><link href="https://shibaprasadb.github.io/2026/04/29/tokenmaxxing-tap-in.html" rel="alternate" type="text/html" title="The New Tap-In, Tap-Out" /><published>2026-04-29T00:00:00+00:00</published><updated>2026-04-29T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/04/29/tokenmaxxing-tap-in</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/04/29/tokenmaxxing-tap-in.html"><![CDATA[<p>Many companies have started doing something unusual. They have started publishing weekly snapshots of how employees use AI. It often comes as a <a href="https://www.moneycontrol.com/news/trends/meta-employee-builds-ai-token-user-leaderboard-but-zuckerberg-doesn-t-crack-top-250-13886621.html">leaderboard where the employees are ranked</a>. Or a personal email telling you how you used AI last week.</p>

<p>There is something very familiar about this whole exercise. Like a cover song you can’t quite remember.</p>

<p>For a long time, the standard unit of employee productivity was presence. Think about factory work, where hours logged were directly proportional to the output. It takes 30 minutes to produce a product. You work for 9 hours, and you produce 18 products that day. You tap in at the beginning of the day, and then tap out when it is time to head home. If the floor manager sees you near your machine, he knows you are working.</p>

<p>The knowledge economy broke that logic completely. When the knowledge economy became the dominant economy, managers (with the old way of thinking) started losing sleep. Your output is no longer directly proportional to your input or hours logged. A developer who stares at the ceiling for 40 mins, then ships a feature in 3 hours, is not less productive than someone who takes 6 hours or a night of coding. This should have forced a harder question: what does productive work actually look like? Most companies don’t have this figured out. So they relied (and still do) on the hours logged metric.</p>

<p>In Hinduism, Vishnu had ten avatars across the yugas (eras). Each one suited to the crisis of its age. Bad management has its own avatar tradition. The factory foreman becomes the incompetent knowledge-work middle manager, who becomes the incompetent AI-adoption evangelist. Same underlying worldview. Different costume.</p>

<p>Now that GenAI has arrived, a similar pattern is emerging. The companies are asking themselves one question: “How to gauge if the employee is actually using GenAI?” and a similar suboptimal solution is being developed. Let’s start counting the tokens consumed. Prompts fired. And let’s put it on a leaderboard to encourage more people.</p>

<p>Jensen Huang <a href="https://www.businessinsider.com/jensen-huang-500k-engineers-250k-ai-tokens-nvidia-compute-2026-3?utm_source=reddit&amp;utm_medium=social&amp;utm_campaign=insider-nvidia-sub-post">recently suggested</a> that if a $500,000 engineer isn’t consuming $250,000 worth of AI tokens annually, something is wrong. There is a version of this argument that makes sense. Powerful tools should be used. Under-leveraging AI is a real problem. But the moment you turn that into a numeric expectation and tracking, you are back in Goodhart territory.</p>

<p>There’s a concept in economics called <a href="https://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart’s Law</a>. The short version: when a measure becomes a target, it stops being a good measure. The moment you tell people that token consumption is what gets rewarded, token consumption is what you’ll get. Not better thinking. Not faster shipping. Not cleaner decisions. Just more prompts. Longer conversations.</p>

<p>Honestly, you can’t blame the people gaming the system. When you set wrong incentives, it is bound to happen. This is a failure that is creeping from the top.</p>

<p>Measuring the real impact of GenAI at work is doable. But it is hard. You have to go back to your boardroom, look at old JIRA tickets, and analyse that. What was the average time to ship features with X degree of complexity in the past? How much time is it taking now? What used to take three weeks, does it take ten days now? What used to need four revisions, does it need two? That kind of measurement is doable. It just requires intellectual rigour and some patience, and most organisations are running low on both.</p>

<p>You can do this outside the engineering work too. Are decisions getting made faster? Are they getting reversed less often? Are first drafts closer to final outputs? Are we spending less time in meetings trying to figure out what to do next? The focus on “Are people using AI more?” is the wrong thing to do. The better question is: is the cost of getting to clarity going down?</p>

<p>Vishnu, at least, had a purpose for each avatar. The form changed because the problem changed. The incompetent manager’s avatars share no such logic. The problem keeps changing. The solution stays the same: find a number, trust the number, reward the number.</p>

<p>The tap-in, tap-out in the knowledge economy never really measured work. It measured the anxiety of managers who didn’t know how else to look. Tokenmaxxing is just the same anxiety, wearing a different UI.</p>]]></content><author><name></name></author><category term="reflections" /><summary type="html"><![CDATA[Many companies have started doing something unusual. They have started publishing weekly snapshots of how employees use AI. It often comes as a leaderboard where the employees are ranked. Or a personal email telling you how you used AI last week. There is something very familiar about this whole exercise. Like a cover song you can’t quite remember. For a long time, the standard unit of employee productivity was presence. Think about factory work, where hours logged were directly proportional to the output. It takes 30 minutes to produce a product. You work for 9 hours, and you produce 18 products that day. You tap in at the beginning of the day, and then tap out when it is time to head home. If the floor manager sees you near your machine, he knows you are working. The knowledge economy broke that logic completely. When the knowledge economy became the dominant economy, managers (with the old way of thinking) started losing sleep. Your output is no longer directly proportional to your input or hours logged. A developer who stares at the ceiling for 40 mins, then ships a feature in 3 hours, is not less productive than someone who takes 6 hours or a night of coding. This should have forced a harder question: what does productive work actually look like? Most companies don’t have this figured out. So they relied (and still do) on the hours logged metric. In Hinduism, Vishnu had ten avatars across the yugas (eras). Each one suited to the crisis of its age. Bad management has its own avatar tradition. The factory foreman becomes the incompetent knowledge-work middle manager, who becomes the incompetent AI-adoption evangelist. Same underlying worldview. Different costume. Now that GenAI has arrived, a similar pattern is emerging. The companies are asking themselves one question: “How to gauge if the employee is actually using GenAI?” and a similar suboptimal solution is being developed. Let’s start counting the tokens consumed. Prompts fired. And let’s put it on a leaderboard to encourage more people. Jensen Huang recently suggested that if a $500,000 engineer isn’t consuming $250,000 worth of AI tokens annually, something is wrong. There is a version of this argument that makes sense. Powerful tools should be used. Under-leveraging AI is a real problem. But the moment you turn that into a numeric expectation and tracking, you are back in Goodhart territory. There’s a concept in economics called Goodhart’s Law. The short version: when a measure becomes a target, it stops being a good measure. The moment you tell people that token consumption is what gets rewarded, token consumption is what you’ll get. Not better thinking. Not faster shipping. Not cleaner decisions. Just more prompts. Longer conversations. Honestly, you can’t blame the people gaming the system. When you set wrong incentives, it is bound to happen. This is a failure that is creeping from the top. Measuring the real impact of GenAI at work is doable. But it is hard. You have to go back to your boardroom, look at old JIRA tickets, and analyse that. What was the average time to ship features with X degree of complexity in the past? How much time is it taking now? What used to take three weeks, does it take ten days now? What used to need four revisions, does it need two? That kind of measurement is doable. It just requires intellectual rigour and some patience, and most organisations are running low on both. You can do this outside the engineering work too. Are decisions getting made faster? Are they getting reversed less often? Are first drafts closer to final outputs? Are we spending less time in meetings trying to figure out what to do next? The focus on “Are people using AI more?” is the wrong thing to do. The better question is: is the cost of getting to clarity going down? Vishnu, at least, had a purpose for each avatar. The form changed because the problem changed. The incompetent manager’s avatars share no such logic. The problem keeps changing. The solution stays the same: find a number, trust the number, reward the number. The tap-in, tap-out in the knowledge economy never really measured work. It measured the anxiety of managers who didn’t know how else to look. Tokenmaxxing is just the same anxiety, wearing a different UI.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2026-04-29-tokenmaxxing-tap-in/token_thumbnail.png" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2026-04-29-tokenmaxxing-tap-in/token_thumbnail.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">West Bengal Data Series: Four Pieces Before the Election</title><link href="https://shibaprasadb.github.io/2026/04/17/wb-data-series.html" rel="alternate" type="text/html" title="West Bengal Data Series: Four Pieces Before the Election" /><published>2026-04-17T00:00:00+00:00</published><updated>2026-04-17T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/04/17/wb-data-series</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/04/17/wb-data-series.html"><![CDATA[<p>A four-part data series examining West Bengal through numbers. Each piece is standalone, building cumulatively toward a synthesis.</p>

<ul>
  <li><a href="https://ordinaryanalysis.substack.com/p/kolkata-a-rank-worth-questioning">Kolkata vs the Metros</a></li>
  <li><a href="https://ordinaryanalysis.substack.com/p/west-bengal-economy-large-by-size-thin-by-structure">West Bengal’s Economy: Large by Size, Thin by Structure</a></li>
  <li><a href="https://ordinaryanalysis.substack.com/p/west-bengal-solved-healthcare-access">Health Outcomes</a></li>
  <li><a href="https://ordinaryanalysis.substack.com/p/west-bengal-welfare-worked-wealth">Welfare Worked. Wealth Didn’t Follow.</a></li>
</ul>

<p><a href="https://ordinaryanalysis.substack.com/p/west-bengal-built-the-floor-not-the">The synthesis</a> contains personal opinions and a summary of the patterns observed across 4 parts.</p>]]></content><author><name></name></author><category term="data-stories" /><summary type="html"><![CDATA[A four-part data series on West Bengal — cities, economy, health, and human development — timed to the state elections.]]></summary></entry><entry><title type="html">GenAI in Product : Means &amp;amp; Ends</title><link href="https://shibaprasadb.github.io/2026/03/25/genai-in-product-means-ends.html" rel="alternate" type="text/html" title="GenAI in Product : Means &amp;amp; Ends" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/03/25/genai-in-product-means-ends</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/03/25/genai-in-product-means-ends.html"><![CDATA[<p>Most productivity debates around GenAI miss a distinction I think matters quite a bit. Using GenAI to write code is not the same as building a product where GenAI is the core feature. The gap is manageable at the prototype stage. Production is where it becomes a different problem entirely.</p>

<p><a href="https://ordinaryanalysis.substack.com/p/genai-in-product-means-ends">Read on Ordinary Analysis</a></p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[The productivity debate has a blind spot. Not all gains are the same.]]></summary></entry><entry><title type="html">Reading the Numbers: How India Reads</title><link href="https://shibaprasadb.github.io/2026/02/18/how-india-reads.html" rel="alternate" type="text/html" title="Reading the Numbers: How India Reads" /><published>2026-02-18T00:00:00+00:00</published><updated>2026-02-18T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/02/18/how-india-reads</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/02/18/how-india-reads.html"><![CDATA[<p>Guardian published an article on 9th Feb 2025. The post titled <a href="https://www.theguardian.com/global-development/2026/feb/09/books-india-literature-festivals-readers">“Most Indians don’t read for pleasure - so why does the country have 100 literature festivals?”</a> garnered a lot of attention (the title was changed later). <a href="https://www.outlookindia.com/culture-society/the-guardian-cant-question-profusion-of-lit-fests-india-reads-writes-and-celebrates-words">Outlook India</a> refuted some of the claims in their own way. And Anurag Minus Verma penned down a brilliant essay on <a href="https://www.theculturecafe.in/p/why-dont-indians-read-for-pleasure">why don’t Indians read for pleasure</a>.</p>

<p>I related a lot to the essay by Anurag Verma. He argued that most of our readings are utility driven i.e. we read because we have to.</p>

<p>Among all these debates and discussions, I felt we were missing one point: how is India different from other nations?</p>

<p>I don’t have a lot of foreign associates. But from the little knowledge, it didn’t feel like others were drowning themselves in books while India alone wasn’t reading. It is a contemporary issue that transcends borders, regions and seas.</p>

<p>So the question arose:</p>

<h2 id="how-do-indians-read-compared-to-other-countries">How do Indians read compared to other countries?</h2>

<p>And the only way we can answer this is through data.</p>

<p>I looked at this from two angles:</p>

<ul>
  <li>What is the buying pattern of different countries with respect to genre?</li>
  <li>How much, on average, is an Indian spending on trade books?</li>
</ul>

<p>Let’s dissect the first one:</p>

<p><img src="/images/posts/2026-02-18-how-india-reads/ranked_genres.png" alt="Revenue share for different genres" /></p>

<p>In terms of revenue share, Indians are spending far more on educational books than the US, UK or European countries. So Anurag’s point is not completely wrong. And intuitively, that makes sense.</p>

<p>But now, let’s look at it from another angle: as a percentage of GDP, how much are Indians spending on trade books (i.e. excluding educational books)?</p>

<p><img src="/images/posts/2026-02-18-how-india-reads/trade_book_spending.png" alt="Trade book spending as a % of GDP" /></p>

<p>An average Indian is actually spending more on trade books than an average US and European citizen. But less than the UK.</p>

<p>This shows that when it comes to buying non-educational books, Indians are more intentional compared to more developed nations. When you are spending more of your hard-earned money, especially in a country with a lower per-capita GDP, you need to be more intentional.</p>

<p>One methodological note: this analysis uses nominal GDP per capita as the denominator. Book prices vary across markets. A $10 US paperback might be ₹400-600 in India, depending on the publisher and format - but books are globally traded goods with some price convergence, unlike purely local services. Using nominal figures keeps the comparison straightforward, though a full <a href="https://en.wikipedia.org/wiki/Purchasing_power_parity">PPP adjustment</a> could be explored in future work.</p>

<p>As usual, reality is far from a clean black-and-white thing. It is much more nuanced. On average, Indians tend to read more for utility, but we also tend to spend more on non-utility books.</p>

<p>This also raises an interesting question: what happens when India’s per capita GDP rises? More surplus should lead to more spending on pleasure?</p>

<hr />

<h3 id="notes--sources">Notes &amp; Sources</h3>

<p><strong>Trade books</strong> are commercially published books sold to the general public, excluding educational textbooks, academic journals, and professional reference materials. In this analysis, trade books = Fiction + Non-Fiction.</p>

<p><strong>Data note:</strong> All book market figures reflect 2024 actuals from industry sources (Horizon Databook, FEP, Nielsen). GDP per capita figures are from 2024-2025; US figures use 2025 IMF projections. Year-on-year differences are negligible (&lt;2%) and do not materially affect the conclusions.</p>

<p><strong>Calculation methodology:</strong> Trade book spending per capita was derived by multiplying total market size by the trade book revenue share (Fiction + Non-Fiction %), then dividing by population. This was then expressed as a percentage of nominal GDP per capita.</p>

<table>
  <thead>
    <tr>
      <th>Country</th>
      <th>Market Size</th>
      <th>Trade Share</th>
      <th>Trade Per Capita</th>
      <th>GDP Per Capita</th>
      <th>% of GDP</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>India</td>
      <td>$10.37B</td>
      <td>29–51%</td>
      <td>$2.05–$3.56</td>
      <td>$2,730</td>
      <td>0.08%–0.13%</td>
    </tr>
    <tr>
      <td>US</td>
      <td>$40.44B</td>
      <td>52–56%</td>
      <td>$61.76–$66.47</td>
      <td>$85,000</td>
      <td>0.07%–0.08%</td>
    </tr>
    <tr>
      <td>UK</td>
      <td>$8.94B</td>
      <td>65–75%</td>
      <td>$85.44–$98.53</td>
      <td>$56,000</td>
      <td>0.15%–0.18%</td>
    </tr>
    <tr>
      <td>Europe</td>
      <td>$29.03B</td>
      <td>51%</td>
      <td>$32.89</td>
      <td>$49,000</td>
      <td>0.07%</td>
    </tr>
  </tbody>
</table>

<p>The plot uses the mean of each range as the representative value.</p>

<hr />

<p><strong>India</strong></p>
<ul>
  <li>Market size: $10.37B (Horizon Databook) [1]</li>
  <li>Educational: 60.2% mean revenue share (Horizon [1], IBEF [2])</li>
  <li>Fiction: 17.5% revenue share, +30.7% YoY growth [1][2]</li>
  <li>Children’s: 9.8% revenue share [1]</li>
</ul>

<p><strong>United States</strong></p>
<ul>
  <li>Market size: $40.44B (Horizon Databook) [3]</li>
  <li>Fiction: 32.8% ($3.26B), +12.6% YoY (AAP) [4]</li>
  <li>Children’s: 24.7% [3]</li>
  <li>Educational: 19.8% [3]</li>
  <li>Non-Fiction: 19.2% ($2.88B), +1.3% YoY (AAP) [4]</li>
  <li>Religious/Professional: 3.5% [3]</li>
</ul>

<p><strong>United Kingdom</strong></p>
<ul>
  <li>Market size: £1.82B physical (Nielsen) [5]</li>
  <li>Fiction: 42.5% mean revenue share, record high, +18% YoY [6]</li>
  <li>Non-Fiction: 27.5% [7]</li>
  <li>Educational: 17.4% (Horizon) [8]</li>
  <li>Children’s: 12.6% [5][8]</li>
</ul>

<p><strong>Europe</strong></p>
<ul>
  <li>Market size: €24.9B (FEP) [9]</li>
  <li>Fiction: 27.5% [9]</li>
  <li>Educational: 23.3% mean (FEP [9], Horizon [10])</li>
  <li>Non-Fiction: 22.5% [9]</li>
  <li>Academic/Professional: 16.7% [9]</li>
  <li>Children’s: 14.6% [9]</li>
</ul>

<hr />

<p><strong>Citations</strong></p>

<p>[1] Grand View Research/Horizon Databook. India Books Market Size &amp; Outlook, 2025–2033. https://www.grandviewresearch.com/horizon/outlook/books-market/india</p>

<p>[2] IBEF. India’s Meteoric Rise as a Publishing Hub. https://www.ibef.org/blogs/india-s-meteoric-rise-as-a-publishing-hub</p>

<p>[3] Grand View Research/Horizon Databook. US Books Market Size &amp; Outlook, 2025–2033. https://www.grandviewresearch.com/horizon/outlook/books-market/united-states</p>

<p>[4] AAP via Publishing Perspectives. December StatShot: US Book Market Up 6.5% Year-to-Date. https://publishingperspectives.com/2025/03/aaps-december-statshot-us-market-up-6-5-percent-year-to-date/</p>

<p>[5] Nielsen BookData. Bestsellers &amp; trends in the UK &amp; Ireland in 2024. https://nielseniq.com/global/en/insights/commentary/2025/bestsellers-trends-in-the-uk-ireland-in-2024/</p>

<p>[6] Friedman, Jane. Book sales update: UK market. https://janefriedman.com/book-sales-update-uk-market/</p>

<p>[7] LoveReading. Fiction Book Sales in 2024 Top The Lot. https://www.lovereading.co.uk/blog/fiction-book-sales-in-2024-top-the-lot-while-non-fiction-lags-behind-9226</p>

<p>[8] Grand View Research/Horizon Databook. UK Books Market Size &amp; Outlook, 2025–2033. https://www.grandviewresearch.com/horizon/outlook/books-market/uk</p>

<p>[9] Federation of European Publishers (FEP). European Book Publishing Statistics 2024. https://www.fep-fee.eu/European-Book-Publishing-Statistics-2024</p>

<p>[10] Grand View Research/Horizon Databook. Europe Books Market Size &amp; Outlook, 2025–2033. https://www.grandviewresearch.com/horizon/outlook/books-market/europe</p>]]></content><author><name></name></author><category term="data-stories" /><summary type="html"><![CDATA[Utility, trade books, and what the numbers actually say about Indian reading habits.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2026-02-18-how-india-reads/trade_book_spending.png" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2026-02-18-how-india-reads/trade_book_spending.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Tale of Two Contes</title><link href="https://shibaprasadb.github.io/2026/02/04/tale-of-two-contes.html" rel="alternate" type="text/html" title="The Tale of Two Contes" /><published>2026-02-04T00:00:00+00:00</published><updated>2026-02-04T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/02/04/tale-of-two-contes</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/02/04/tale-of-two-contes.html"><![CDATA[<p>Antonio Conte has just finished his 2025/26 Champions League run with Napoli, and yet again, the “Scudetto King” looked like a “European Novice.” For those who follow football, it’s well known that he has an illustrious record when it comes to league matches, but falls short when it comes to Europe. Or at least there is a strong belief among many that he falls short.</p>

<p>As an Analytics professional, it is our job not to accept whatever is propagated by the belief system blindly. Rather, do our investigation, and then accept, reject, or refine it.</p>

<p>So, I thought, what if we try to see what is actually happening here? In this blogpost, I will discuss my approaches for the same.</p>

<p>But before asking any questions - let’s have a look at the data. What is the gap between the Conte of domestic league and Europe?</p>

<p>For our analysis, we have also taken Pep and Klopp (Liverpool &amp; Dortmund) - so that we can understand how he compares with the other two. This will help us in putting things into more context.</p>

<p><img src="/images/posts/2026-02-04-tale-of-two-contes/tactical_fingerprints.png" alt="Winning percentage for the three managers" /></p>

<p>As we can see, there is a significant difference in the win % for Conte - compared to Klopp &amp; Pep.</p>

<p>So the question arises:</p>

<h2 id="is-this-a-fluke-or-statistically-significant">Is this a fluke or statistically significant?</h2>

<p>A simple Z-test can tell us if the gap in Europe vs Domestic League is just a fluke or if there is some statistical significance.</p>

<p>Turns out - it is highly significant!</p>

<p>The difference is even significant for Pep. Now if you think about it - that is expected. UCL is a tougher competition. So, we would expect to see some reduction in the winning percentage.</p>

<p>For Klopp, though, it is not significant.</p>

<table>
  <thead>
    <tr>
      <th>Manager</th>
      <th>UCL Win Rate</th>
      <th>League Win Rate</th>
      <th>Z-statistic</th>
      <th>P-value</th>
      <th>Interpretation</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Conte</td>
      <td>34.0%</td>
      <td>60.5%</td>
      <td>3.661</td>
      <td>0.000251</td>
      <td>Highly significant difference</td>
    </tr>
    <tr>
      <td>Guardiola</td>
      <td>62.4%</td>
      <td>72.2%</td>
      <td>2.540</td>
      <td>0.011086</td>
      <td>Significant difference</td>
    </tr>
    <tr>
      <td>Klopp</td>
      <td>56.9%</td>
      <td>62.9%</td>
      <td>1.161</td>
      <td>0.245760</td>
      <td>No significant difference</td>
    </tr>
  </tbody>
</table>

<h2 id="how-different-are-the-tactical-profiles">How different are the tactical profiles?</h2>

<p>In the first section, we looked at winning % only. Now, let’s examine the complete tactical profile - how the full distribution of wins, draws, and losses shifts between competitions.</p>

<p>The Chi-square test helps us understand if the entire result pattern changes, not just the win rate. And interestingly, even Klopp shows a significant difference here despite his Z-test being non-significant. This suggests his teams play differently in Europe (fewer draws, more decisive results), even though his overall win rate stays similar.</p>

<table>
  <thead>
    <tr>
      <th>Manager</th>
      <th>χ²</th>
      <th>P-value</th>
      <th>Cramér’s V</th>
      <th>Interpretation</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Conte</td>
      <td>14.136</td>
      <td>0.000852</td>
      <td>0.145</td>
      <td>Highly significant difference</td>
    </tr>
    <tr>
      <td>Guardiola</td>
      <td>6.441</td>
      <td>0.039928</td>
      <td>0.092</td>
      <td>Significant difference</td>
    </tr>
    <tr>
      <td>Klopp</td>
      <td>10.336</td>
      <td>0.005696</td>
      <td>0.127</td>
      <td>Significant difference</td>
    </tr>
  </tbody>
</table>

<p>So far, all three managers show some form of difference between their league and UCL performances. But here’s the key question: <strong>Is the difference abnormal, or is it just the “Elite Tax” of playing in Europe?</strong></p>

<h2 id="the-elite-tax-accounting-for-expected-difficulty">The Elite Tax: Accounting for Expected Difficulty</h2>

<p>Now, let’s switch from a frequentist lens to a Bayesian one.</p>

<p>Here’s the fundamental insight: UCL is harder than domestic leagues. You can’t really treat playing Everton and Real Madrid at the same level. So we should expect some performance drop when managers face Europe’s elite. The question isn’t “is there a difference?” but rather “is the difference larger than expected?”</p>

<h3 id="the-methodology-the-10-rope">The Methodology: The 10% ROPE</h3>
<p>I introduced a <strong>Region of Practical Equivalence (ROPE)</strong>, which I call the “Elite Tax.” I am granting every manager a “pardon” for a <strong>10% drop</strong> in win rate. If their win rate drops by 10% or less, we consider that a normal byproduct of elite competition.</p>

<p>I then ran 100,000 simulations for each manager to calculate the probability that their performance drop is <strong>abnormal</strong> (greater than 10%).</p>

<p>If a manager’s drop is within the 10% zone → <strong>Normal</strong> (performing as expected given increased difficulty)<br />
If a manager’s drop exceeds 10% → <strong>Abnormal</strong> (genuine UCL problem)</p>

<h3 id="the-results">The Results</h3>

<table>
  <thead>
    <tr>
      <th>Manager</th>
      <th>Mean Drop</th>
      <th>P(Exceeds 10% Tax)</th>
      <th>Interpretation</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Conte</td>
      <td>25.9%</td>
      <td>98.76%</td>
      <td>Abnormal UCL underperformance</td>
    </tr>
    <tr>
      <td>Guardiola</td>
      <td>9.9%</td>
      <td>48.36%</td>
      <td>Normal (within expected range)</td>
    </tr>
    <tr>
      <td>Klopp</td>
      <td>6.1%</td>
      <td>23.18%</td>
      <td>Normal (well within range)</td>
    </tr>
  </tbody>
</table>

<p><img src="/images/posts/2026-02-04-tale-of-two-contes/gap_distribution_chart.png" alt="Gap Analysis" /></p>

<h3 id="what-this-means">What This Means</h3>

<p><strong>Pep Guardiola: The Benchmark.</strong> 
Pep’s distribution is centered almost perfectly on our 10% “Elite Tax” line. With a 48% chance of exceeding that threshold, his performance is essentially a coin flip. Mathematically, he is performing exactly how an elite manager should in a tougher competition.</p>

<p><strong>Jürgen Klopp: The Outlier (The Good Kind).</strong> 
Klopp’s entire distribution is tucked safely to the left of the 10% line. There is only a 23% chance that his drop-off is abnormal. But here’s the interesting part: his Z-test showed no significant win rate difference, yet his Chi-square test was significant. Why? Because his <em>tactical approach</em> shifts in Europe - fewer draws, more decisive results - even though his overall win rate stays similar. He doesn’t win less in the Champions League; he just plays differently. More high-stake matches, all-or-nothing football. If anything, Klopp is competition-proof; his tactical identity survives the jump from domestic leagues to Europe better than Pep or Conte.</p>

<p><strong>Antonio Conte: The “Statistical Glitch.”</strong> 
Conte lives in a different zip code. With 98.7% certainty, the model confirms that his European drop-off is abnormal. Even after accounting for his smaller UCL sample size (which makes his curve wider), there is almost zero overlap between his reality and that of Pep or Klopp.</p>

<p><strong>How to read the plot:</strong> Don’t just look at the peaks of the curves. Look at where they don’t overlap. Pep and Klopp’s performance distributions live in the same neighborhood. Conte’s distribution doesn’t even have a view of their street.</p>

<h2 id="the-verdict">The Verdict</h2>

<p>Statistics confirm what the eye test suggested: <strong>Only Conte has a genuine UCL problem.</strong></p>

<p>While all three managers show some performance difference between competitions (as they should - the UCL is harder), only Conte’s gap is abnormal after accounting for the increased difficulty. Pep and Klopp are performing within the expected range for elite managers facing elite opposition.</p>

<p>The “Tale of Two Contes” is a real, quantifiable pattern that has persisted across 50 Champions League matches and 618 league games. Whether it’s tactical inflexibility in knockout rounds, squad depth issues, or something else entirely - the numbers make one thing clear: domestic dominance doesn’t automatically translate to European success.</p>

<hr />

<p>Link to the notebook: https://github.com/shibaprasadb/datasignal/blob/main/conte_record/conte_record.ipynb</p>]]></content><author><name></name></author><category term="data-stories" /><summary type="html"><![CDATA[Antonio Conte has just finished his 2025/26 Champions League run with Napoli, and yet again, the “Scudetto King” looked like a “European Novice.” For those who follow football, it’s well known that he has an illustrious record when it comes to league matches, but falls short when it comes to Europe. Or at least there is a strong belief among many that he falls short. As an Analytics professional, it is our job not to accept whatever is propagated by the belief system blindly. Rather, do our investigation, and then accept, reject, or refine it. So, I thought, what if we try to see what is actually happening here? In this blogpost, I will discuss my approaches for the same. But before asking any questions - let’s have a look at the data. What is the gap between the Conte of domestic league and Europe? For our analysis, we have also taken Pep and Klopp (Liverpool &amp; Dortmund) - so that we can understand how he compares with the other two. This will help us in putting things into more context. As we can see, there is a significant difference in the win % for Conte - compared to Klopp &amp; Pep. So the question arises: Is this a fluke or statistically significant? A simple Z-test can tell us if the gap in Europe vs Domestic League is just a fluke or if there is some statistical significance. Turns out - it is highly significant! The difference is even significant for Pep. Now if you think about it - that is expected. UCL is a tougher competition. So, we would expect to see some reduction in the winning percentage. For Klopp, though, it is not significant. Manager UCL Win Rate League Win Rate Z-statistic P-value Interpretation Conte 34.0% 60.5% 3.661 0.000251 Highly significant difference Guardiola 62.4% 72.2% 2.540 0.011086 Significant difference Klopp 56.9% 62.9% 1.161 0.245760 No significant difference How different are the tactical profiles? In the first section, we looked at winning % only. Now, let’s examine the complete tactical profile - how the full distribution of wins, draws, and losses shifts between competitions. The Chi-square test helps us understand if the entire result pattern changes, not just the win rate. And interestingly, even Klopp shows a significant difference here despite his Z-test being non-significant. This suggests his teams play differently in Europe (fewer draws, more decisive results), even though his overall win rate stays similar. Manager χ² P-value Cramér’s V Interpretation Conte 14.136 0.000852 0.145 Highly significant difference Guardiola 6.441 0.039928 0.092 Significant difference Klopp 10.336 0.005696 0.127 Significant difference So far, all three managers show some form of difference between their league and UCL performances. But here’s the key question: Is the difference abnormal, or is it just the “Elite Tax” of playing in Europe? The Elite Tax: Accounting for Expected Difficulty Now, let’s switch from a frequentist lens to a Bayesian one. Here’s the fundamental insight: UCL is harder than domestic leagues. You can’t really treat playing Everton and Real Madrid at the same level. So we should expect some performance drop when managers face Europe’s elite. The question isn’t “is there a difference?” but rather “is the difference larger than expected?” The Methodology: The 10% ROPE I introduced a Region of Practical Equivalence (ROPE), which I call the “Elite Tax.” I am granting every manager a “pardon” for a 10% drop in win rate. If their win rate drops by 10% or less, we consider that a normal byproduct of elite competition. I then ran 100,000 simulations for each manager to calculate the probability that their performance drop is abnormal (greater than 10%). If a manager’s drop is within the 10% zone → Normal (performing as expected given increased difficulty) If a manager’s drop exceeds 10% → Abnormal (genuine UCL problem) The Results Manager Mean Drop P(Exceeds 10% Tax) Interpretation Conte 25.9% 98.76% Abnormal UCL underperformance Guardiola 9.9% 48.36% Normal (within expected range) Klopp 6.1% 23.18% Normal (well within range) What This Means Pep Guardiola: The Benchmark. Pep’s distribution is centered almost perfectly on our 10% “Elite Tax” line. With a 48% chance of exceeding that threshold, his performance is essentially a coin flip. Mathematically, he is performing exactly how an elite manager should in a tougher competition. Jürgen Klopp: The Outlier (The Good Kind). Klopp’s entire distribution is tucked safely to the left of the 10% line. There is only a 23% chance that his drop-off is abnormal. But here’s the interesting part: his Z-test showed no significant win rate difference, yet his Chi-square test was significant. Why? Because his tactical approach shifts in Europe - fewer draws, more decisive results - even though his overall win rate stays similar. He doesn’t win less in the Champions League; he just plays differently. More high-stake matches, all-or-nothing football. If anything, Klopp is competition-proof; his tactical identity survives the jump from domestic leagues to Europe better than Pep or Conte. Antonio Conte: The “Statistical Glitch.” Conte lives in a different zip code. With 98.7% certainty, the model confirms that his European drop-off is abnormal. Even after accounting for his smaller UCL sample size (which makes his curve wider), there is almost zero overlap between his reality and that of Pep or Klopp. How to read the plot: Don’t just look at the peaks of the curves. Look at where they don’t overlap. Pep and Klopp’s performance distributions live in the same neighborhood. Conte’s distribution doesn’t even have a view of their street. The Verdict Statistics confirm what the eye test suggested: Only Conte has a genuine UCL problem. While all three managers show some performance difference between competitions (as they should - the UCL is harder), only Conte’s gap is abnormal after accounting for the increased difficulty. Pep and Klopp are performing within the expected range for elite managers facing elite opposition. The “Tale of Two Contes” is a real, quantifiable pattern that has persisted across 50 Champions League matches and 618 league games. Whether it’s tactical inflexibility in knockout rounds, squad depth issues, or something else entirely - the numbers make one thing clear: domestic dominance doesn’t automatically translate to European success. Link to the notebook: https://github.com/shibaprasadb/datasignal/blob/main/conte_record/conte_record.ipynb]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2026-02-04-tale-of-two-contes/gap_distribution_chart.png" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2026-02-04-tale-of-two-contes/gap_distribution_chart.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">From 75% to 99.6%: The Math of LLM Ensembles</title><link href="https://shibaprasadb.github.io/2026/01/20/llm-ensemble.html" rel="alternate" type="text/html" title="From 75% to 99.6%: The Math of LLM Ensembles" /><published>2026-01-20T00:00:00+00:00</published><updated>2026-01-20T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2026/01/20/llm-ensemble</id><content type="html" xml:base="https://shibaprasadb.github.io/2026/01/20/llm-ensemble.html"><![CDATA[<p>The last project I worked on involved a lot of LLM API calls. One subtask seemed simple: count elements from a specific list. Straightforward, right? Not quite.</p>

<p>This needed production-level accuracy. But the simple API approach wasn’t cutting it. After testing 50 cases, I was only hitting around ~75% accuracy (37 out of 50). For production, that’s a non-starter.</p>

<h2 id="the-problem-with-single-api-calls">The Problem with Single API Calls</h2>

<p>The LLM was doing the task correctly for some instances but missing elements in others. Sometimes it would catch all 10 items, other times only 7 or 8. The pattern was clear: when it failed, it undercounted. It never hallucinated extra elements or went above the true count. It just missed things.</p>

<p>This directional bias turned out to be the key insight.</p>

<h2 id="so-i-random-forest-it">So I “Random Forest” It</h2>

<p>I decided to apply the “wisdom of crowds” principle. The same concept that makes Random Forest work. Instead of relying on a single API call, use multiple calls and aggregate intelligently.</p>

<p>The evaluation rule was simple: <strong>Max(API_call_1, API_call_2, …, API_call_n)</strong></p>

<p>Example: If there are 10 elements and three API calls return [7, 10, 3], the final output is 10.</p>

<p>Why this works: The undercounting errors get filtered out. The max function naturally finds the correct answer as long as at least one call succeeds. Since the LLM never overcounts, the highest value is almost always the right one.</p>

<p>Here’s how the two approaches compare:</p>

<p><img src="https://shibaprasadb.github.io/images/posts/2026-01-20-llm-ensemble/flow_LLM_Ensemble.jpg" alt="LLM Ensemble Flow" /></p>

<h2 id="the-math-behind-it">The Math Behind It</h2>

<p>With a single API call, the question is: What’s the probability of success?</p>

<p>With ensemble, it becomes: What’s the probability of at least one success?</p>

<p>The math changes drastically:</p>

<p><strong>P(at least one correct) = 1 - P(all calls wrong)</strong></p>

<p>For n=3 calls with p=0.75 success rate:</p>
<ul>
  <li>P(all wrong) = (1-p)ⁿ = 0.25³ = 0.015625</li>
  <li>P(at least one correct) = 1 - 0.015625 = <strong>98.4%</strong></li>
</ul>

<p>Going from 75% to 98.4% with just 3 calls? Not bad at all.</p>

<h2 id="finding-the-sweet-spot">Finding the Sweet Spot</h2>

<p>But I couldn’t just pick any number. Each API call costs money and adds latency. I needed to balance accuracy against cost.</p>

<p>Here’s how the numbers break down:</p>

<table>
  <thead>
    <tr>
      <th>n calls</th>
      <th>Accuracy</th>
      <th>Cost Multiplier</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>75.0%</td>
      <td>1x</td>
    </tr>
    <tr>
      <td>2</td>
      <td>93.8%</td>
      <td>2x</td>
    </tr>
    <tr>
      <td>3</td>
      <td>98.4%</td>
      <td>3x</td>
    </tr>
    <tr>
      <td>4</td>
      <td>99.6%</td>
      <td>4x</td>
    </tr>
    <tr>
      <td>5</td>
      <td>99.9%</td>
      <td>5x</td>
    </tr>
  </tbody>
</table>

<p><img src="https://shibaprasadb.github.io/images/posts/2026-01-20-llm-ensemble/APICall_success_rate.png" alt="Success Rate" /></p>

<p><img src="https://shibaprasadb.github.io/images/posts/2026-01-20-llm-ensemble/APICall_cost_accuracy.png" alt="Cost vs Accuracy" /></p>

<p>The diminishing returns kick in hard after n=3. Going from 98.4% to 99.6% costs an entire extra API call for just 1.2 percentage points. But for production-level reliability, I decided that extra margin was worth it.</p>

<p><strong>I settled on n=4: 99.6% accuracy at 4x the cost.</strong></p>

<h2 id="when-this-breaks">When This Breaks</h2>

<p>This approach only works because my LLM had a directional bias (like undercounting - in this case). The evaluation function must match your error pattern:</p>

<ul>
  <li><strong>Undercounting errors</strong> → Use Max()</li>
  <li><strong>Overcounting errors</strong> → Use Min()</li>
  <li><strong>Random errors</strong> (sometimes high, sometimes low) → Use majority voting with odd n (3, 5, 7) to avoid ties</li>
</ul>

<p>The key is understanding <em>how</em> your model fails, not just <em>that</em> it fails. Directional biases can take many forms - summarization models that are consistently too brief, classifiers that favor certain categories, extractors that miss edge cases. Each needs its own aggregation strategy.</p>

<p>If you don’t understand your failure mode, you’re just burning money on redundant calls.</p>

<p>(Now that I think about it, we can dedicate a separate blog post on designing Eval functions)</p>

<h2 id="the-takeaway">The Takeaway</h2>

<p>Sometimes the best solution isn’t a better prompt or a bigger model. It’s understanding your failure mode and exploiting it mathematically.</p>

<p>A single API call gave me 75% accuracy. Four calls with a simple Max() aggregator got me to 99.6%. Same model, same prompt. Just a smarter approach.</p>

<p>The real lesson? When you can’t improve the model’s performance, improve how you use it. In a constrained space, solving a problem becomes more interesting.</p>]]></content><author><name></name></author><category term="technical" /><summary type="html"><![CDATA[The last project I worked on involved a lot of LLM API calls. One subtask seemed simple: count elements from a specific list. Straightforward, right? Not quite. This needed production-level accuracy. But the simple API approach wasn’t cutting it. After testing 50 cases, I was only hitting around ~75% accuracy (37 out of 50). For production, that’s a non-starter. The Problem with Single API Calls The LLM was doing the task correctly for some instances but missing elements in others. Sometimes it would catch all 10 items, other times only 7 or 8. The pattern was clear: when it failed, it undercounted. It never hallucinated extra elements or went above the true count. It just missed things. This directional bias turned out to be the key insight. So I “Random Forest” It I decided to apply the “wisdom of crowds” principle. The same concept that makes Random Forest work. Instead of relying on a single API call, use multiple calls and aggregate intelligently. The evaluation rule was simple: Max(API_call_1, API_call_2, …, API_call_n) Example: If there are 10 elements and three API calls return [7, 10, 3], the final output is 10. Why this works: The undercounting errors get filtered out. The max function naturally finds the correct answer as long as at least one call succeeds. Since the LLM never overcounts, the highest value is almost always the right one. Here’s how the two approaches compare: The Math Behind It With a single API call, the question is: What’s the probability of success? With ensemble, it becomes: What’s the probability of at least one success? The math changes drastically: P(at least one correct) = 1 - P(all calls wrong) For n=3 calls with p=0.75 success rate: P(all wrong) = (1-p)ⁿ = 0.25³ = 0.015625 P(at least one correct) = 1 - 0.015625 = 98.4% Going from 75% to 98.4% with just 3 calls? Not bad at all. Finding the Sweet Spot But I couldn’t just pick any number. Each API call costs money and adds latency. I needed to balance accuracy against cost. Here’s how the numbers break down: n calls Accuracy Cost Multiplier 1 75.0% 1x 2 93.8% 2x 3 98.4% 3x 4 99.6% 4x 5 99.9% 5x The diminishing returns kick in hard after n=3. Going from 98.4% to 99.6% costs an entire extra API call for just 1.2 percentage points. But for production-level reliability, I decided that extra margin was worth it. I settled on n=4: 99.6% accuracy at 4x the cost. When This Breaks This approach only works because my LLM had a directional bias (like undercounting - in this case). The evaluation function must match your error pattern: Undercounting errors → Use Max() Overcounting errors → Use Min() Random errors (sometimes high, sometimes low) → Use majority voting with odd n (3, 5, 7) to avoid ties The key is understanding how your model fails, not just that it fails. Directional biases can take many forms - summarization models that are consistently too brief, classifiers that favor certain categories, extractors that miss edge cases. Each needs its own aggregation strategy. If you don’t understand your failure mode, you’re just burning money on redundant calls. (Now that I think about it, we can dedicate a separate blog post on designing Eval functions) The Takeaway Sometimes the best solution isn’t a better prompt or a bigger model. It’s understanding your failure mode and exploiting it mathematically. A single API call gave me 75% accuracy. Four calls with a simple Max() aggregator got me to 99.6%. Same model, same prompt. Just a smarter approach. The real lesson? When you can’t improve the model’s performance, improve how you use it. In a constrained space, solving a problem becomes more interesting.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2026-01-20-llm-ensemble/flow_LLM_Ensemble.jpg" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2026-01-20-llm-ensemble/flow_LLM_Ensemble.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Curious Case of West Bengal’s Disappearing Class 12 Students</title><link href="https://shibaprasadb.github.io/2025/10/04/class12-dropouts.html" rel="alternate" type="text/html" title="The Curious Case of West Bengal’s Disappearing Class 12 Students" /><published>2025-10-04T00:00:00+00:00</published><updated>2025-10-04T00:00:00+00:00</updated><id>https://shibaprasadb.github.io/2025/10/04/class12-dropouts</id><content type="html" xml:base="https://shibaprasadb.github.io/2025/10/04/class12-dropouts.html"><![CDATA[<p>Recently, I came across some surprising statistics. In West Bengal, for the final exam of Class 12, this year (2025) almost <strong>3 lakhs fewer students</strong> appeared compared to previous years. The figure sounded mind-bogglingly shocking to me. The <a href="https://timesofindia.indiatimes.com/city/kolkata/hs-numbers-drop-by-1/3rd-from-last-year/articleshow/118586088.cms">board secretary</a> highlighted that this happened because they brought in a rule in 2017 - that mandated students need to be 10 years old in Class 5.</p>

<p>Still, the 3 lakh number is huge. Especially when we are far from hitting below the replacement level TFR. In any case, I got curious and wanted to explore what is happening with other states.</p>

<hr />

<h2 id="state-selection">State Selection</h2>

<p>Taking a look at 28 states would increase the noise more than the signal. And I don’t intend to publish a comprehensive comparative study of all the states. So, I cherry-picked a few, just to see how they’re doing:</p>

<ul>
  <li><strong>Tamil Nadu</strong>: Often cited as a model state for educational outcomes. Good to have them as a benchmark.</li>
  <li><strong>Bihar</strong>: Eastern Indian state, West Bengal’s neighbor. Most populous state in the East. The lowest per capita income in the country.</li>
  <li><strong>Maharashtra</strong>: Western Indian state. Highest state GDP. Mix of urban and rural demographics.</li>
  <li><strong>Haryana</strong>: Northern Indian state. 7th richest in terms of per capita income.</li>
  <li><strong>Uttar Pradesh</strong>: Bihar’s neighbor. 2nd most populous state overall. Similar socio-economic profile to Bihar in many ways.</li>
</ul>

<p>This selection gives us a mix of geographical regions, economic profiles, and educational performance levels - enough to see if West Bengal’s trend is an outlier or part of a broader pattern.</p>

<p>Let’s have a look at the absolute numbers - and their trends.</p>

<p><em>(Note: the numbers are quite decentralized. So I had to collate them from several sources. Directionally, this should be quite accurate.)</em></p>

<hr />

<h2 id="absolute-numbers-trends-from-20212025">Absolute Numbers: Trends from 2021–2025</h2>

<p><img src="/images/posts/2025-10-04-class12-droput/students_by_state_facets.png" alt="Students by State" /></p>

<p><strong>What stands out:</strong></p>

<p>For Haryana and West Bengal, there has been a decline for 2 consecutive years. But others have shown a consistent pattern overall. For UP, the pattern is interesting - there’s some volatility, but it is still stable. No sharp decline like West Bengal.</p>

<p>The West Bengal drop is particularly dramatic: from approximately 800K students in 2021 to around 470K in 2025. That’s a <strong>41% decline</strong>. Haryana shows a similar downward trend, though less severe - from about 230K to 195K (a 15% drop).</p>

<p>Maharashtra, Tamil Nadu, Bihar, and Uttar Pradesh remain relatively stable, with only minor fluctuations around their baseline numbers.</p>

<hr />

<h2 id="summary-year-on-year-changes">Summary: Year-on-Year Changes</h2>

<table>
  <thead>
    <tr>
      <th>State/Board</th>
      <th>2021</th>
      <th>2022</th>
      <th>2023</th>
      <th>2024</th>
      <th>2025</th>
      <th>Change (2021–2025)</th>
      <th>% Change</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Uttar Pradesh (UPMSP)</td>
      <td>26,10,000</td>
      <td>24,10,971</td>
      <td>27,69,000</td>
      <td>24,53,000</td>
      <td>26,91,000</td>
      <td>+81,000</td>
      <td>+3.1%</td>
    </tr>
    <tr>
      <td>Maharashtra (MSBSHSE)</td>
      <td>15,75,752</td>
      <td>15,68,977</td>
      <td>15,29,096</td>
      <td>15,49,326</td>
      <td>15,98,553</td>
      <td>+22,801</td>
      <td>+1.4%</td>
    </tr>
    <tr>
      <td>Bihar (BSEB)</td>
      <td>13,40,000</td>
      <td>13,56,000</td>
      <td>13,04,000</td>
      <td>12,91,000</td>
      <td>12,92,000</td>
      <td>-48,000</td>
      <td>-3.6%</td>
    </tr>
    <tr>
      <td>Tamil Nadu (TNBSE)</td>
      <td>8,18,000</td>
      <td>8,06,000</td>
      <td>8,00,000</td>
      <td>7,61,000</td>
      <td>7,92,000</td>
      <td>-26,000</td>
      <td>-3.2%</td>
    </tr>
    <tr>
      <td>West Bengal (WBCHSE)</td>
      <td>8,00,000</td>
      <td>7,21,000</td>
      <td>8,25,000</td>
      <td>7,55,000</td>
      <td>4,74,000</td>
      <td>-3,26,000</td>
      <td>-40.8%</td>
    </tr>
    <tr>
      <td>Haryana (HBSE)</td>
      <td>2,28,000</td>
      <td>2,46,000</td>
      <td>2,63,000</td>
      <td>2,14,000</td>
      <td>1,94,000</td>
      <td>-34,000</td>
      <td>-14.9%</td>
    </tr>
  </tbody>
</table>

<p>The table makes it clear: <strong>West Bengal’s decline is not just steep, it’s an outlier.</strong> No other state comes close to this magnitude of drop.</p>

<hr />

<h2 id="normalizing-by-population">Normalizing by Population</h2>

<p>Let’s take a look at the number of exam takers per 1,000 population:</p>

<p><img src="/images/posts/2025-10-04-class12-droput/12students_per1k.png" alt="Students per 1,000 Population" /></p>

<p><strong>Data Signals:</strong></p>

<p>Maharashtra maintains the highest rate throughout (around 12–13 students per 1,000 population), suggesting either better retention rates or favorable demographics. West Bengal’s rate drops dramatically from about 8 to under 5 per 1,000 population - confirming that this isn’t just a population effect, but a real decline in participation rates.</p>

<p>This chart reveals interesting patterns, but comes with a caveat. This has an implicit assumption: the proportion of the eligible age group (16-18 year-olds) within the total population is uniform across states. Which, obviously, is not true. States with younger populations will have proportionally more children under 10 and fewer teenagers, while states further along in demographic transition will have a higher share of the 16-18 cohort. But we don’t have more granular data readily available. At least, I couldn’t find one. Ideally, we should be looking at the base of 16-20 or 15-19 age cohorts. That would give us a better idea about the “eligible” group.</p>

<hr />

<h2 id="another-proxy-youth-population-base">Another Proxy: Youth Population Base</h2>

<p>The closest we can get to the ideal metric is the population of the 0–14 age group in 2021, which was published by <a href="https://www.dataforindia.com/age-distribution-states/#:~:text=As%20of%202021%2C%20Kerala%20was,Age-groups%20in%20Indian%20states">Data for India</a>. This can serve as a reasonable proxy for the eligible age group in 2025.</p>

<p>What if we try to see the number of students appearing per 1,000 youth?</p>

<p><img src="/images/posts/2025-10-04-class12-droput/12students_1000youth.png" alt="Students per 1,000 Youth Population" /></p>

<p>What this reveals:</p>

<p>It looks far worse for West Bengal. But this is a total guesstimation - at best. Here, ‘Youth’ is proxied by the 0–14 population share in 2021. By 2025, this group spans roughly ages 4–18. It’s not a perfect match to the Class 12 eligible cohort (≈17–18 years), but directionally it reflects the size of the feeder base.</p>

<p>Maharashtra leads with 58.0 students per 1,000 youth, followed by Tamil Nadu (50.0) and Uttar Pradesh (37.7). West Bengal sits at just 22.6 - trailing behind Haryana (26.7).</p>

<p>This stark difference (58.0 for Maharashtra vs 22.6 for West Bengal) suggests one of two things:</p>

<ul>
  <li>Massive dropout rates between lower and upper secondary levels in West Bengal</li>
  <li>Demographic differences - West Bengal might have a younger age structure with proportionally more children in the 0–10 range than the 10–14 range</li>
</ul>

<p>Most likely, it’s a combination of both.</p>

<hr />

<h2 id="what-could-be-happening">What Could Be Happening?</h2>

<h3 id="the-2017-policy-and-the-overage-bulge">The 2017 Policy and the Overage Bulge</h3>

<p>If the age mandate was introduced in 2017, requiring students to be 10 years old in Class 5, those students would hit Class 12 around 2024–2025. The timing checks out perfectly.</p>

<p>But here’s a critical question: Was there a bulge of overage students in earlier years that’s now correcting?</p>

<p>In many Indian states, particularly in rural areas, it’s not uncommon for children to start school late or repeat grades. If West Bengal had a significant population of unqualified students in the system pre-2017, the 2021–2023 cohorts might have represented this bulge working its way through. The 2024–2025 drop could then be the system “normalizing” to age-appropriate enrollments.</p>

<p>This would explain why the drop is so dramatic - it’s not just one year’s worth of students, but potentially 2–3 years’ worth of overage students who would have been in the system under the old regime.</p>

<hr />

<h3 id="why-haryana">Why Haryana?</h3>

<p>Haryana’s decline is notable but less discussed. I haven’t found evidence of a similar age-mandate policy there. This warrants investigation. Possible factors could include:</p>

<ul>
  <li>Migration patterns (families moving for work)</li>
  <li>Shift to private schooling or alternative examination boards (CBSE, ICSE)</li>
  <li>Economic factors affecting school retention</li>
</ul>

<hr />

<h2 id="future-work">Future Work</h2>

<p>This exploratory analysis raises more questions than it answers (which has been my goal anyways for this newsletter):</p>

<ul>
  <li><strong>Granular age-cohort data</strong>: Getting actual 15–19 or 16–20 population data by state would dramatically improve the accuracy of per-capita calculations.</li>
  <li><strong>Covid’s shadow</strong>: Does the pandemic have something to do with this? The 2024-2025 cohort would have been in Classes 9-10 during 2020-2021 (peak Covid years). If the pandemic disproportionately affected rural schooling (due to a lack of digital infrastructure), we might see this reflected in the numbers. Breaking down the data by urban-rural divide would help determine if Covid-induced dropouts are part of the story.</li>
  <li><strong>Pre-2017 enrollment patterns</strong>: Analyzing the age distribution of students in West Bengal’s secondary schools from 2015–2020 would reveal if there was indeed an overage bulge.</li>
  <li><strong>Dropout analysis</strong>: Where exactly are students dropping out? Between Class 8–10? Or 10–12? State-level progression ratios would be illuminating.</li>
  <li><strong>Cross-board comparison</strong>: Many students in urban areas take CBSE/ICSE boards instead of state boards. Are West Bengal’s numbers declining while CBSE enrollment is rising?</li>
  <li><strong>Haryana deep-dive</strong>: Understanding what’s driving Haryana’s decline could reveal factors beyond policy changes - economic trends, migration patterns, or shifts in educational preferences.</li>
  <li><strong>Long-term tracking</strong>: Will West Bengal’s numbers stabilize at this new lower level, or continue to decline? Data from 2026–2027 will be crucial.</li>
</ul>

<hr />

<h2 id="conclusion">Conclusion</h2>

<p>West Bengal’s ~37% decline in Class 12 exam takers from 2024 to 2025 is unprecedented among major Indian states. While the 2017 age-mandate policy provides a plausible explanation - a correction after years of unqualified students in the system - the sheer magnitude demands deeper investigation.</p>

<p>As someone from West Bengal, these numbers are both surprising and worrying. They point to deeper structural issues in educational access, retention, or migration that go beyond a single policy change. Whether this is a one-time correction or the beginning of a longer-term trend will become clearer in the years ahead.</p>

<hr />

<p><em>If you found this worth your time, please subscribe to <strong>The Data Signal</strong> - it’s free. I explore data, AI, analytics, and strategy, tackling interesting questions that don’t have obvious answers. It would mean the world to me, knowing that someone is finding value in my work.</em></p>]]></content><author><name></name></author><category term="data-stories" /><summary type="html"><![CDATA[Recently, I came across some surprising statistics. In West Bengal, for the final exam of Class 12, this year (2025) almost 3 lakhs fewer students appeared compared to previous years. The figure sounded mind-bogglingly shocking to me. The board secretary highlighted that this happened because they brought in a rule in 2017 - that mandated students need to be 10 years old in Class 5. Still, the 3 lakh number is huge. Especially when we are far from hitting below the replacement level TFR. In any case, I got curious and wanted to explore what is happening with other states. State Selection Taking a look at 28 states would increase the noise more than the signal. And I don’t intend to publish a comprehensive comparative study of all the states. So, I cherry-picked a few, just to see how they’re doing: Tamil Nadu: Often cited as a model state for educational outcomes. Good to have them as a benchmark. Bihar: Eastern Indian state, West Bengal’s neighbor. Most populous state in the East. The lowest per capita income in the country. Maharashtra: Western Indian state. Highest state GDP. Mix of urban and rural demographics. Haryana: Northern Indian state. 7th richest in terms of per capita income. Uttar Pradesh: Bihar’s neighbor. 2nd most populous state overall. Similar socio-economic profile to Bihar in many ways. This selection gives us a mix of geographical regions, economic profiles, and educational performance levels - enough to see if West Bengal’s trend is an outlier or part of a broader pattern. Let’s have a look at the absolute numbers - and their trends. (Note: the numbers are quite decentralized. So I had to collate them from several sources. Directionally, this should be quite accurate.) Absolute Numbers: Trends from 2021–2025 What stands out: For Haryana and West Bengal, there has been a decline for 2 consecutive years. But others have shown a consistent pattern overall. For UP, the pattern is interesting - there’s some volatility, but it is still stable. No sharp decline like West Bengal. The West Bengal drop is particularly dramatic: from approximately 800K students in 2021 to around 470K in 2025. That’s a 41% decline. Haryana shows a similar downward trend, though less severe - from about 230K to 195K (a 15% drop). Maharashtra, Tamil Nadu, Bihar, and Uttar Pradesh remain relatively stable, with only minor fluctuations around their baseline numbers. Summary: Year-on-Year Changes State/Board 2021 2022 2023 2024 2025 Change (2021–2025) % Change Uttar Pradesh (UPMSP) 26,10,000 24,10,971 27,69,000 24,53,000 26,91,000 +81,000 +3.1% Maharashtra (MSBSHSE) 15,75,752 15,68,977 15,29,096 15,49,326 15,98,553 +22,801 +1.4% Bihar (BSEB) 13,40,000 13,56,000 13,04,000 12,91,000 12,92,000 -48,000 -3.6% Tamil Nadu (TNBSE) 8,18,000 8,06,000 8,00,000 7,61,000 7,92,000 -26,000 -3.2% West Bengal (WBCHSE) 8,00,000 7,21,000 8,25,000 7,55,000 4,74,000 -3,26,000 -40.8% Haryana (HBSE) 2,28,000 2,46,000 2,63,000 2,14,000 1,94,000 -34,000 -14.9% The table makes it clear: West Bengal’s decline is not just steep, it’s an outlier. No other state comes close to this magnitude of drop. Normalizing by Population Let’s take a look at the number of exam takers per 1,000 population: Data Signals: Maharashtra maintains the highest rate throughout (around 12–13 students per 1,000 population), suggesting either better retention rates or favorable demographics. West Bengal’s rate drops dramatically from about 8 to under 5 per 1,000 population - confirming that this isn’t just a population effect, but a real decline in participation rates. This chart reveals interesting patterns, but comes with a caveat. This has an implicit assumption: the proportion of the eligible age group (16-18 year-olds) within the total population is uniform across states. Which, obviously, is not true. States with younger populations will have proportionally more children under 10 and fewer teenagers, while states further along in demographic transition will have a higher share of the 16-18 cohort. But we don’t have more granular data readily available. At least, I couldn’t find one. Ideally, we should be looking at the base of 16-20 or 15-19 age cohorts. That would give us a better idea about the “eligible” group. Another Proxy: Youth Population Base The closest we can get to the ideal metric is the population of the 0–14 age group in 2021, which was published by Data for India. This can serve as a reasonable proxy for the eligible age group in 2025. What if we try to see the number of students appearing per 1,000 youth? What this reveals: It looks far worse for West Bengal. But this is a total guesstimation - at best. Here, ‘Youth’ is proxied by the 0–14 population share in 2021. By 2025, this group spans roughly ages 4–18. It’s not a perfect match to the Class 12 eligible cohort (≈17–18 years), but directionally it reflects the size of the feeder base. Maharashtra leads with 58.0 students per 1,000 youth, followed by Tamil Nadu (50.0) and Uttar Pradesh (37.7). West Bengal sits at just 22.6 - trailing behind Haryana (26.7). This stark difference (58.0 for Maharashtra vs 22.6 for West Bengal) suggests one of two things: Massive dropout rates between lower and upper secondary levels in West Bengal Demographic differences - West Bengal might have a younger age structure with proportionally more children in the 0–10 range than the 10–14 range Most likely, it’s a combination of both. What Could Be Happening? The 2017 Policy and the Overage Bulge If the age mandate was introduced in 2017, requiring students to be 10 years old in Class 5, those students would hit Class 12 around 2024–2025. The timing checks out perfectly. But here’s a critical question: Was there a bulge of overage students in earlier years that’s now correcting? In many Indian states, particularly in rural areas, it’s not uncommon for children to start school late or repeat grades. If West Bengal had a significant population of unqualified students in the system pre-2017, the 2021–2023 cohorts might have represented this bulge working its way through. The 2024–2025 drop could then be the system “normalizing” to age-appropriate enrollments. This would explain why the drop is so dramatic - it’s not just one year’s worth of students, but potentially 2–3 years’ worth of overage students who would have been in the system under the old regime. Why Haryana? Haryana’s decline is notable but less discussed. I haven’t found evidence of a similar age-mandate policy there. This warrants investigation. Possible factors could include: Migration patterns (families moving for work) Shift to private schooling or alternative examination boards (CBSE, ICSE) Economic factors affecting school retention Future Work This exploratory analysis raises more questions than it answers (which has been my goal anyways for this newsletter): Granular age-cohort data: Getting actual 15–19 or 16–20 population data by state would dramatically improve the accuracy of per-capita calculations. Covid’s shadow: Does the pandemic have something to do with this? The 2024-2025 cohort would have been in Classes 9-10 during 2020-2021 (peak Covid years). If the pandemic disproportionately affected rural schooling (due to a lack of digital infrastructure), we might see this reflected in the numbers. Breaking down the data by urban-rural divide would help determine if Covid-induced dropouts are part of the story. Pre-2017 enrollment patterns: Analyzing the age distribution of students in West Bengal’s secondary schools from 2015–2020 would reveal if there was indeed an overage bulge. Dropout analysis: Where exactly are students dropping out? Between Class 8–10? Or 10–12? State-level progression ratios would be illuminating. Cross-board comparison: Many students in urban areas take CBSE/ICSE boards instead of state boards. Are West Bengal’s numbers declining while CBSE enrollment is rising? Haryana deep-dive: Understanding what’s driving Haryana’s decline could reveal factors beyond policy changes - economic trends, migration patterns, or shifts in educational preferences. Long-term tracking: Will West Bengal’s numbers stabilize at this new lower level, or continue to decline? Data from 2026–2027 will be crucial. Conclusion West Bengal’s ~37% decline in Class 12 exam takers from 2024 to 2025 is unprecedented among major Indian states. While the 2017 age-mandate policy provides a plausible explanation - a correction after years of unqualified students in the system - the sheer magnitude demands deeper investigation. As someone from West Bengal, these numbers are both surprising and worrying. They point to deeper structural issues in educational access, retention, or migration that go beyond a single policy change. Whether this is a one-time correction or the beginning of a longer-term trend will become clearer in the years ahead. If you found this worth your time, please subscribe to The Data Signal - it’s free. I explore data, AI, analytics, and strategy, tackling interesting questions that don’t have obvious answers. It would mean the world to me, knowing that someone is finding value in my work.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://shibaprasadb.github.io/images/posts/2025-10-04-class12-dropout/students_by_state_facets.png" /><media:content medium="image" url="https://shibaprasadb.github.io/images/posts/2025-10-04-class12-dropout/students_by_state_facets.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>