<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Applied Epistemology: Thoughts on Data and Data-Work]]></title><description><![CDATA[Reflections on the practices and problems of data analytics.]]></description><link>https://essays.jacobbishop.com</link><image><url>https://substackcdn.com/image/fetch/$s_!FqXk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3d8ffa-fe34-4e97-937d-831268f10af0_144x144.png</url><title>Applied Epistemology: Thoughts on Data and Data-Work</title><link>https://essays.jacobbishop.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 23 May 2026 05:45:11 GMT</lastBuildDate><atom:link href="https://essays.jacobbishop.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jacob Bishop]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jacobbishop@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jacobbishop@substack.com]]></itunes:email><itunes:name><![CDATA[Jacob Bishop]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jacob Bishop]]></itunes:author><googleplay:owner><![CDATA[jacobbishop@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jacobbishop@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jacob Bishop]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The (Useful) Insanity of Data Tests]]></title><description><![CDATA[All Models are Wrong. Some Models Match the Upstream Engineering Team's]]></description><link>https://essays.jacobbishop.com/p/the-useful-insanity-of-data-tests</link><guid isPermaLink="false">https://essays.jacobbishop.com/p/the-useful-insanity-of-data-tests</guid><dc:creator><![CDATA[Jacob Bishop]]></dc:creator><pubDate>Sun, 08 Dec 2024 00:27:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FqXk!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c3d8ffa-fe34-4e97-937d-831268f10af0_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Anyone who&#8217;s worked in software will tell you that tests are a crucial element of a reliable work-product. Anyone who&#8217;s worked in data will tell you it&#8217;s not quite that simple. Tests in data-land are somewhat uniquely painful for three reasons: (1) the scope of data you&#8217;re responsible for is absurdly broad, (2) you rarely control the abstractions you work with, and (3) the exception handling options for unreliable data are all bad. Unfortunately, not testing isn&#8217;t an option, because the core product of a data team is accurate and trusted insights.</p><p>The first thing to understand about trying to enforce data quality as a data team is that it is <em>insane</em>. Data warehouses draw data from a bunch of different sources in a company: production systems (a relational database if you&#8217;re lucky), a CRM (e.g., Salesforce), a customer support ticket system (e.g., Zendesk), third party data vendors, maybe Grant in Finance&#8217;s quarterly forecast excel workbook, etc. This is part of what makes them so useful &#8211; you can pull together insights across multiple domains, and discover that most of your support volume is coming from your least lucrative customers, or that some customer acquisition channels produce customers that are much less likely to churn than others. At the same time, this means that a data team&#8217;s domain &#8211; the area you&#8217;re responsible for understanding and validating data for &#8211; is effectively all activities that produce data at a company.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> Many of these systems have multiple people responsible just for managing them. For your production system(s), there may be entire teams of engineers devoted to the code that produces data in just a few tables! No data team is staffed with as many people as the entire upstream engineering team, let alone all the people responsible for upstream systems (the idea is laughable) and thus the data team must necessarily focus on a small sliver of that upstream data.</p><p>Another reason data quality tests are hard is that even when they appear to be about universal truths, they often have hidden dependencies on things that are contingently true about reality-as-modeled. Choosing which aspects of reality to model in a database is a hard problem.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> Large parts of this modeling happen upstream of the data team in production systems. As a result, data quality tests will often break as the upstream model changes, and you&#8217;ll find yourself constantly playing catch-up to the modeling changes made by the much larger group of people working on upstream systems. Consider, for example, a customer status column, that determines whether a company is a prospect, a current customer, or churned. To enforce data quality, you might want to write a test to ensure that all companies that have started spending are classified as current customers or churned, to capture the universal truth that someone who&#8217;s started spending is no longer a prospect. Suppose now that upstream decides they want to track resurrected customers separately and adds that as a new status. Now suddenly your test is throwing errors, not because upstream data is wrong, but because they&#8217;ve changed their modeling to capture a new facet of reality. Crucially, however, just because the upstream data isn&#8217;t wrong doesn&#8217;t mean it won&#8217;t wreak havoc with downstream systems &#8211; for example, a dashboard that shows, separately, spend from current and churned customers will no longer show all categories of spend, and so the test existing and throwing errors may be a good thing <em>even though</em> the upstream data isn&#8217;t wrong.</p><p>A third reason data quality tests are hard is that the exception handling options for data systems &#8211; how you handle unreliable data &#8211; are all bad in different ways. When dealing with data systems, you can pick at most two of (a) accuracy, (b) freshness, and (c) completeness. Consider a system that ingests new data from upstream sources daily and rebuilds the derived data warehouse tables (e.g., the default setup for a dbt-based system<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>). Your options are:</p><ul><li><p>Fresh and complete: All data from upstream is passed through even if the numbers are weird. This is the default situation you&#8217;d have with no data tests (and is bad for obvious reasons).</p></li><li><p>Accurate and complete: If any issues are identified with upstream data, the tables aren&#8217;t rebuilt at all until the issues are resolved.</p></li><li><p>Accurate and fresh: If any issues are identified with upstream data, the tables are rebuilt excluding those rows.</p></li></ul><p>Unfortunately, to make things worse, staleness of data (lack of freshness) and incompleteness of data <em>are often forms of inaccuracy</em>. Consider a dashboard tracking lead volume for a business-to-consumer business. Here, some degree of incompleteness is probably fine &#8211; each lead is a relatively small portion of the overall volume &#8211; but lack of data for the last day (staleness) is going to at best make the dashboard not fit for purpose, and at worst (if the viewer doesn&#8217;t know the data is stale) make it look like something is catastrophically wrong with your lead-generation pipelines.</p><p>On the other hand, consider something like loss ratio for an insurance company. Here, you&#8217;re probably not obsessing over the last day&#8217;s numbers, so some degree of staleness is fine, but one large claim can materially impact overall numbers<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>, so incompleteness might result in a materially wrong number (if the loss ratio is understood to include a claim it doesn&#8217;t). More broadly, anywhere you&#8217;re tracking leading indicators, staleness is inaccuracy or not-fit-for-purpose-ness; anywhere you&#8217;re reporting on data with extreme outliers, incompleteness is a form of (material) inaccuracy.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a></p><p>To some degree these bad choices are also a knock-on effect of not controlling the data model. In production systems, you can enforce validations at the system boundaries that actually control whether or not something happens - e.g., you don&#8217;t accept an order for an ecommerce system where the zip code is blank - whereas in data-land the order has already happened, and your only choice is whether or not (and how) to report on it.</p><p>Given all these problems, why worry about data quality at all? You could instead be a data plumber, building tables and dashboards that would give the right answer assuming the inputs were right, and call it a day. There are a couple reasons not to do this.</p><p>First, and most importantly,<strong> a data team&#8217;s output mainly impacts reality though helping people make better and more data-informed decisions</strong>, and this relies on those people trusting the data team&#8217;s output. Unlike other systems where failure is often immediately obvious (e.g., a program crashing), the <em>failure mode of bad input data is (often) silently wrong output</em>. It doesn&#8217;t matter whose fault a data issue is (or even, really, who gets blamed for the issue), if a dashboard or metric isn&#8217;t reliably correct<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>, either people notice and stop relying on it (at which point what&#8217;s the point of having a data team to build and maintain it?), or they don&#8217;t notice and make bad decisions thinking they&#8217;re following the data.</p><p>Second, it&#8217;s often hard to even tell whether logic is correct independent of the upstream data. The basic sanity checks any good analyst instinctively does (do the totals match what I see elsewhere? Does e.g. this gross margin pass the sniff test given what I know about our business? Is it even in the possible range?) break down if the input data can&#8217;t be trusted &#8211; you either stop doing the checks entirely or spend hours hunting down issues that are unrelated to the code at hand.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a></p><p>Lastly, correctness is often a moving target. Logic that&#8217;s correct for one upstream model of reality often becomes disastrously wrong as that upstream model of reality evolves (as in the customer status example above), so the same thing that makes data tests such a painful treadmill makes them crucial.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>When someone asks &#8220;why are these numbers wonky?&#8221;, you need to be able to correctly identify, for any part of the company, whether the data&#8217;s wrong or it&#8217;s reality that&#8217;s weird.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>See longer meditation on this problem <a href="https://essays.jacobbishop.com/p/the-hardest-part-of-data-analysis">here</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Dbt is a standard tool for data modeling and orchestration of same in tech startups.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>I&#8217;m thinking here of something like the Capital One cyberattack, which cost hundreds of millions of dollars. Obviously if an individual auto accident is material for an insurer&#8217;s profitability something has gone very wrong.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>At this point you might be thinking that the right solution is to have different rules for different source data. This is all fine and dandy until you need to join between these tables, or worse, explain to someone else when they can expect the data to be complete and accurate.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>Sometimes it&#8217;s fine to have dashboards/metrics/etc that are explicitly flagged as currently incorrect too - the problem is when things are silently wrong.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>Unit tests help here somewhat, but at some point this requires recreating the entire upstream data model in unit tests and keeping it in sync when upstream changes, at which point you might as well have the data quality tests.</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[The Hardest Part of Data Analysis is Reality]]></title><description><![CDATA[The Eldritch Horror Lurking Under Every Metric]]></description><link>https://essays.jacobbishop.com/p/the-hardest-part-of-data-analysis</link><guid isPermaLink="false">https://essays.jacobbishop.com/p/the-hardest-part-of-data-analysis</guid><dc:creator><![CDATA[Jacob Bishop]]></dc:creator><pubDate>Sun, 08 Dec 2024 00:06:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M1FI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M1FI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 424w, https://substackcdn.com/image/fetch/$s_!M1FI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 848w, https://substackcdn.com/image/fetch/$s_!M1FI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!M1FI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M1FI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg" width="1024" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:608,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M1FI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 424w, https://substackcdn.com/image/fetch/$s_!M1FI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 848w, https://substackcdn.com/image/fetch/$s_!M1FI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!M1FI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a1a0d9e-3a7e-49bd-baaf-aede7d37236f_1024x608.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Data analysis is technically easy. Reality<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> is hard. This is surprising to people who don&#8217;t work with data, because most people have no ability to write SQL and some ability to think about reality, but there&#8217;s nothing novel or interesting about the 17th &#8220;group by&#8221; operation or the 43rd bar chart. Even regressions<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> or neural networks, which sound very fancy, are often 10 lines of code to implement in the toolkit of your choice.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p><p>What, then, makes reality hard? The problem with reality is that it&#8217;s messy and our knowledge of it is incomplete. Some things (the future) are necessarily unknowable, and some things get lopped off in the procrustean process of stuffing reality in nice clean boxes (or database tables).<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> As a wise man once said, &#8220;Categorization is the act of forgetting [differences].&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a> This sounds like armchair philosophizing, but it turns up shockingly frequently in practice in two ways: (1) in handling the unknown and unknowable, what looks like a question of fact often turns into three layers of estimates, and (2) in the process of of matching the nice tidy boxes back up with questions about the underlying reality, it&#8217;s easy to end up calculating the correct answer to a different question than the one you were actually asked (or, than the question the asker should have asked).</p><p>For the former (estimates from incomplete data), consider a set of questions like &#8220;what&#8217;s this business&#8217;s return on investment from a dollar spent on paid search ads? How has that changed as we&#8217;ve invested more in this channel?&#8221; This sounds like (and is!) a question of fact. Unfortunately, some of those facts are unknowable, either fundamentally or in practice. To be able to answer this question, you need to be able to (a) attribute customers to specific channels and (b) calculate their lifetime value to the business.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a></p><p>To determine attribution among performance<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a> advertising categories, you need to make decisions about how to share credit for a customer between multiple channels. Consider the extreme example where 100% of your customers make the final sale by searching for your company&#8217;s name and clicking on the sponsored search result - relying on last touch attribution (i.e., the last ad clicked before the sale gets credit) would lead to some <em>interesting </em>investment decisions that are very different from those counseled by first-touch attribution. Unfortunately, while the marginal effect of different ads a user was exposed to during their buying decision (i.e., how to apportion credit between touches in multi-touch attribution) is a question of fact, it&#8217;s rarely one that can be answered experimentally.</p><p>To determine the lifetime value of a customer, you need to predict all their future spend through the end of time. Assuming this analysis is for a business with recurring revenue, this requires assumptions about churn rate and dollar retention. These are not impossible things to estimate, but depending on how you set up your estimates, you may significantly bias the answer to the original question. For example, if you assume there&#8217;s a single churn rate across time or across customer segments, then you might dramatically understate the difference between customer segments (if, in truth, low-spending customers also churn faster), and overstate the return on incremental spend as you ramp spend in the channel (if, in truth, the marginal customer reached by additional ads is more likely to churn). Again, this is not a argument that things are Unknowable&#8482;, but that in practice the approximations and estimates we make have far-reaching implications.</p><p>For the latter (answering the wrong question), consider a question like &#8220;how much money are we [a business] making from our Widget product line?&#8221; In a sense, this is a question with Right Answers - after all, aren&#8217;t there Generally Accepted Accounting Principles (GAAP)?<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a> It sounds like a data analyst should be able to go to some sales table, subset to the widget business unit, sum amount_usd by month, and Bob&#8217;s your uncle. However, reality is rarely so cooperative. The core problem<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a> is that &#8220;how much money are we making&#8221; is a horribly underspecified question. Depending on what the asker really wants to know (Do we have the cashflow necessary to meet payroll at the end of the month? Does the long-run profitability of the business line justify further investment?), the right answer might be one of several different metrics. Depending on what business you&#8217;re analyzing, (accurately!) pulling the wrong money metric can be anything from no big deal to wildly misleading. For example, in almost every startup, you&#8217;re staffed for and building out systems for the much larger company you hope to become, so looking at your unit economics (whether you make money on an incremental unit sold, irrespective of fixed costs) will paint a very different picture than looking at your cashflows.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-10" href="#footnote-10" target="_self">10</a></p><p>The lesson to take away from this is twofold. First, understanding the data-generating process, both in terms of how reality operates (for a business, this is the sales/manufacturing/support etc. processes) and when and how those processes are reflected in the data, is crucial for doing good data analysis. Second, the key step in translating a question into code is often the step of backing up and figuring out what decision the question-asker is trying to make. Both of these are usually far more important than the tooling (software or otherwise) used to do the analysis.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Or, as it&#8217;s sometimes (pejoratively) referred to, &#8220;business logic.&#8221;</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Yes, picking the right model and interpreting the results is hard, but those are usually questions about reality!</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>This analysis is heavily informed by my experience doing data analysis in corporate environments. It&#8217;s probably less applicable to academic environments: my understanding is that while corporate environments generally have lots of greenfield data where the low-hanging fruit is not yet picked, academic work is often about using ever-more-sophisticated methods to extract additional signal from the same datasets.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Joel Spoelsky famously talks about something similar in <a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/">The Law of Leaky Abstractions</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>I&#8217;d swear this is Nietzsche, but Google Search isn&#8217;t turning up any results for the phrase.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>Attribution and lifetime value are both hard problems - this is just a small sampling of the decisions you have to make to estimate them. For example, it ignores issues like adblockers, discount rates, and attribution for offline brand advertising like bus stops.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>Performance advertising is pay-per-user-action (e.g. per app download, or per click).</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>I am by no means an expert in accounting, but for those who know as little about accounting as I did when I started doing data analysis, there are worse places to start than <a href="https://www.investopedia.com/terms/i/incomestatement.asp">investopedia</a>. Speaking from experience, I don&#8217;t recommend trying to re-derive it from first principles.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>More accurately, <em>a</em> core problem. I&#8217;m ignoring for the moment a host of other problems likely to come up in an exercise like this such as having to combine several different tables from different time periods, each with a different set of business units, different product rollups (and thus cost attribution) and different currencies.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-10" href="#footnote-anchor-10" class="footnote-number" contenteditable="false" target="_self">10</a><div class="footnote-content"><p>This isn&#8217;t just a startup problem, of course. Byrne Hobart briefly touches on another example of this in his <a href="https://www.thediff.co/archive/the-liberty-complex-cash-flow-today">article</a> on Liberty Mutual, where a fast-growing company in an industry with high upfront fixed costs (Cable TV) will look non-profitable even though they could stop expanding at any point and produce a profit.</p><p></p></div></div>]]></content:encoded></item></channel></rss>