Home / Blog
Method

My Analysis Workflow: From Question to Insight with Validation Checkpoints

A documented, repeatable workflow for turning a business question into a defensible insight: the stages, the checkpoints where I stop and verify, and the mistakes each one prevents.

An analysis without a documented workflow is a one-time event. It produces a result, and nobody can reproduce it, challenge its assumptions, or update it when the data changes. The analysis that runs the same way every time, with checkpoints that surface problems before they reach the conclusion, is the one a business can rely on.

What follows is my personal workflow, written down not because it is the only correct one but because making it explicit forces precision. Every step either earns its place by preventing a real class of error or it comes out. The checkpoints are not formalities: they are the moments where I stop and ask whether the analysis has earned the right to continue.

Stage 0: sharpen the question

The business question arrives in natural language, which means it arrives ambiguous. "Why did sales drop last quarter?" contains at least six analytical questions depending on whether "sales" means units or revenue, "drop" means absolute or relative decline, "last quarter" is compared to the prior quarter or the same quarter last year, and "why" expects a factor ranking, a single root cause, or a list of hypotheses to investigate.

Before touching any data, I write one sentence that would let me confirm or deny the analysis when I am done: a falsifiable statement derived from the business question. "Revenue in Q3 2024 was lower than Q3 2023, and the decline is explained primarily by a reduction in order volume rather than average order value" is a specific claim. I can test it. "Sales dropped because of market conditions" is not.

Checkpoint 0: Can I state the question as a specific, testable claim? If not, I go back to the stakeholder before opening a notebook.

Stage 1: data discovery and profiling

The first thing I do with a new dataset is not analysis: it is reconnaissance. I need to know what I am working with before I interpret any number from it.

Reconnaissance covers: row count, column types, missing value rates per column, value distributions for categorical fields, range and percentile breakdown for numeric fields, and a sample of raw rows. Not because the numbers are interesting yet, but because this is where I learn what the data actually is versus what it was described as. A column described as "transaction date" that is 12% null is a different analytical input from a column described the same way that is 0% null. Finding that difference after building the analysis is more expensive than finding it before.

import pandas as pd

df = pd.read_parquet("sales.parquet")

print(df.shape)
print(df.dtypes)
print(df.isnull().mean().sort_values(ascending=False))
print(df.describe(percentiles=[.01, .05, .25, .5, .75, .95, .99]))

Checkpoint 1: Do the row counts, null rates, and value ranges match what I was told about the data? Any discrepancy is a question to answer before proceeding, not after.

Stage 2: data validation

Profiling tells me what the data looks like. Validation tells me whether it is trustworthy for the specific claim I am trying to test. These are different tests.

Validation for my specific analysis means: Does the data cover the time period the question refers to? Are the identifiers consistent across the tables I need to join? Are the values in the dimensions I plan to group by complete and consistently encoded? Does the total in this dataset reconcile with the total I would get from an independent source?

The reconciliation check is the one most often skipped and most often consequential. If the revenue sum in the analytical dataset does not match the revenue figure in the financial report for the same period, one of them is wrong, and I need to know which before I build any explanation on top of either.

Checkpoint 2: Does the data pass the reconciliation test against an independent source? A dataset that cannot be reconciled to a known reference is not ready for analysis.

Stage 3: exploratory analysis

With a validated dataset, I run the exploration: distributions, time series plots, segment comparisons, correlation matrices. The goal is to generate hypotheses, not to confirm them. Every pattern I notice at this stage is a candidate for testing, not a finding.

The most important discipline in exploration is separating observation from interpretation in the notebook. A cell that plots a time series and a cell that says "this shows that Q3 was affected by seasonality" are two different claims at two different confidence levels. I annotate them differently: observations are labeled as such, interpretations are labeled as hypotheses pending confirmation.

Checkpoint 3: Have I generated at least two competing hypotheses that could explain the pattern I am seeing? An exploration that produces only one explanation is an exploration that stopped too early.

Stage 4: hypothesis testing

Testing is where the hypotheses from exploration get a fair chance to be wrong. A fair chance means: I define the test before running it, I choose the significance threshold before looking at the p-value, and I report what the test can and cannot conclude.

The two failure modes here are running the test and then choosing the threshold based on whether the result is significant (p-hacking), and running a test whose assumptions are violated by the data (normality assumed on a highly skewed distribution, independence assumed on autocorrelated time series). Both produce findings that look rigorous and are not.

Checkpoint 4: Are the assumptions of the statistical test I am using met by the data? If not, what alternative test does meet them?

Stage 5: sanity-check the result

Before reporting anything, I run the finding through three questions. First: does the magnitude make sense? A finding that revenue declined 2.3% due to a pricing change that affected 60% of products should produce an effect size that is consistent with that scope, not one that implies every affected product was reduced to zero. Second: does the direction match what domain knowledge predicts? A result that contradicts established business knowledge is either a genuine discovery or an analytical error, and distinguishing them requires investigation, not just reporting. Third: what would have to be true about the data for this result to be wrong?

A result that survives three rounds of attempted falsification is not proven. It has earned the right to be stated as a finding with appropriate confidence. Those are different things, and the language should reflect the difference.

Checkpoint 5: Have I tried to break the result? A finding I have not tried to disprove is a finding I have not finished analyzing.

Stage 6: communicate with stated uncertainty

The final output is a claim with a confidence level, stated limitations, and a recommendation or next step that is proportionate to the evidence. Not "revenue declined because of X": that implies certainty the analysis does not have. "The data is consistent with X as the primary driver, and two alternative explanations were tested and did not fit the pattern as well" is what the analysis actually shows.

The limitations section is not a disclaimer added to protect the analyst. It is the part of the communication that lets the business stakeholder use the finding correctly. A finding presented without its limits gets used beyond those limits, producing decisions the analysis never supported.

The workflow does not guarantee correct conclusions. It guarantees that incorrect conclusions are harder to reach without noticing, and that when they do reach the output, they are labeled accurately enough for the next person to challenge them.

← Blog
All articles