← Portfolio

Data Quality & UAT

A validation and UAT layer that tests analytical outputs before publication, with expected result, actual result, severity and PASS/WARN/FAIL controls.

VALIDATED UAT
Decision
Determine whether an analytical output is safe to publish and identify exactly which rule failed when it is not.
Source
Yatify validation outputs across the portfolio analytical models and published public-data case.
Period
Current portfolio validation run
Created by
Nyashadzashe Munyati
BACKGROUND

Why a dashboard can look correct and still be wrong

A chart can be neat, colourful and completely wrong if a duplicate row, missing period, invalid date or broken join entered the model. In reporting work, the question is not only “Can I calculate the KPI?” but “Can I prove the number is safe to publish?”

PROBLEM

The problem I wanted to solve

I wanted a repeatable UAT layer that checks the analytical models before their numbers are shown publicly, and that keeps warnings visible instead of hiding them.

TASK

What I built

I created a catalogue of 22 validation tests covering completeness, uniqueness, allowed values, date logic, keys, ranges and source coverage. Each test has an expected result, actual result, severity and PASS/WARN/FAIL outcome.

TOOLS I USED

What each tool was doing

SQL / Python checks

Run repeatable tests against the analytical datasets.

Data dictionary

Define what fields and valid values should look like.

UAT rules

Separate blocking failures from explainable warnings.

Publication gate

Stop a failed analytical run from silently replacing trusted numbers.

NOW THE ANALYSIS STARTS

With the problem and data purpose clear, the next section shows the result first. The detailed steps below then show exactly how I got there.

HEADLINE FINDING

21 of 22 validation tests pass; the only warning is a documented source-coverage gap, not a failed analytical rule.

The warning remains visible because two historical comparison values are genuinely missing. Replacing them with zero would create a false result.

Yatify UAT validation catalogue
95.5%test pass rate

What I did in this project

01

Defined expected results before running each test.

02

Built completeness, uniqueness, domain, range, date and key checks.

03

Separated PASS, WARN and FAIL and applied publication rules.

04

Kept evidence files linked to each validation result.

Determine whether an analytical output is safe to publish and identify exactly which rule failed when it is not.

A dashboard can be visually correct and still be wrong. Management reporting needs evidence that keys, dates, ranges, source gaps and reconciliations were actually tested before publication.

02 · DATA

The input to UAT is a test catalogue, not a dashboard screenshot

Each of the 22 checks is stored as a controlled record containing the analytical area, the rule being tested, the expected result, the actual result, severity and final status.

TESTareatest
CONTROLexpectedseverity
RUN RESULTactualstatus
AUDITevidence_file
03 · TRANSFORMATION

What I changed before calculating anything

1Group checks into completeness, uniqueness, range/domain, date logic, keys and source coverage.
2Run every test against an expected result defined before the run.
3Convert the test output into PASS, WARN or FAIL without hiding exceptions.
4Attach severity so a cosmetic warning is not treated like a publication-blocking error.
04 · CALCULATION

Worked calculations — not black-box KPIs

PASS RATEPassed tests ÷ Total tests × 100

÷ × 100 = 0.0%.

That does not mean “ignore the other 4.5%”. The one warning remains visible because it affects source coverage.
WARNINGHistorical comparison gaps

Expected: documented source gaps. Actual: 2 missing historical comparison values.

Action: keep them missing. Do not replace them with zero, because zero would mean “no movement”.
PUBLICATION LOGICHigh-severity FAIL → stop publication

Current run: FAIL, WARN, PASS.

A warning can remain only when its limitation is understood and disclosed.
05 · MORE ANALYSIS

What the drill-down adds

The headline chart gives the decision signal. These additional views show whether the same conclusion survives when the data is sliced another way.

06 · INTERPRETATION

What I would say in the management meeting

Overall state PASS · WARN · FAIL

The analytical models pass their blocking tests.

Open issue2 historical source gaps

The correct treatment is to disclose the missing comparison periods, not manufacture values.

PublicationWARN can publish with explanation

A future high-severity FAIL would stop the dashboard update until reconciled.

07 · RECOMMENDATION

What I would do next

TRIGGER / EVIDENCEACTIONWHY
High-severity FAILStop publication and reconcile to source.A dashboard should never overwrite trusted values with a failed run.
WARNPublish only with the limitation visible beside the affected analysis.The reader needs to know what the data cannot support.
New dataset/modelAdd UAT tests before adding it to a public dashboard.Validation should grow with the analytical product.

The current test run covers portfolio datasets, not every future Yatify source. Production API pipelines require additional source-specific reconciliation tests.

Audit trail behind the case study

Every interactive chart above already has a CSV button for its exact plotted numbers. These files are the deeper audit trail: source extract, model, SQL/DAX and validation.