Method

How to tell a result from a shadow.

Every number on this site is either measured or derived from something measured. This page shows the working, including the parts that complicate the story.

A score is a measurement, and measurements have error

The YouCam Skin Analysis API returns a score from 0 to 100 for each of fourteen skin concerns. It is a genuinely good instrument. But like any instrument it has error, and a score reported without its error is a number you cannot make a decision with.

The dermatology imaging literature is blunt about the cause. Variation in illumination produces image differences “not attributable to skin condition, thereby lessening the probative value of digital imaging analysis.” Change the lamp, change the number.

So before Assay measures your skin, it measures how much the instrument moves when your skin has not changed.

The model is deterministic, so all the error is capture

This matters more than it sounds, and it is the first thing worth checking. The noise floor is estimated from the spread across replicate frames taken seconds apart, and that spread is attributed entirely to capture variation. That attribution is only valid if the model itself returns the same answer for the same input.

Perfect Corp does not publish this, so I measured it: the same file, byte for byte, analysed three times.

ConcernRangeSD
Texture0.0000.000
Redness0.0000.000
Hydration0.0000.000
Blemishes0.0000.000
Pores0.0000.000
Radiance0.0000.000
Byte-identical input, three analyses. Standard deviation, in score points.

Zero, everywhere. The model is fully deterministic. Every point of spread between two of your frames is capture variation, and none of it is the model changing its mind. That is what licenses the rest of this page.

The error budget, by source

Because model noise is zero, the remaining error can be pulled apart by cause. Same synthetic face, same framing, one variable changed at a time.

SourceBlemishesHydrationTexturePores
Model (identical bytes)0.000.000.000.00
JPEG quality q80 to q962.910.350.122.55
Brightness plus/minus 8%4.853.871.961.52
Score movement in points, by source of variation. Larger is worse.

Two things fall out of this. Re‑saving the same photograph at a different JPEG quality, pixels a person cannot tell apart, moves the blemish score by 2.91 points. And an eight percent brightness change, roughly a lamp against a window, moves it by 4.86.

That is larger than most genuine one‑week treatment effects. A tracker that compares today’s score against yesterday’s, with no error model, is substantially reporting the weather.

It is also why Assay fixes the capture pipeline: every frame is normalised to the same dimensions and the same JPEG quality before it is ever sent, so that at least those two sources are held constant.

Turning error into a threshold

Two standard quantities from clinical measurement science do the work. The first is the standard error of measurement, estimated directly as the pooled standard deviation across replicate frames within a session, following Bland and Altman’s within‑subject method. Your skin cannot change in the thirty seconds between frames, so all of that spread is instrument error.

SEM = pooled within-session SD

The second is the minimal detectable change: the smallest difference that can be distinguished from that error with 95% confidence.

MDC₅ = 1.96 × √2 × SEM

The √2 is there because two measurements are being compared and each carries its own error. The 1.96 is the 95% point of the normal distribution.

Because each session averages three frames, the error on a session mean is smaller by √3. Capturing three frames instead of one lowers the detection threshold by about 42%, which is the entire reason the app asks for three.

Then the verdict, with two ways of saying no

A change is only reported when it exceeds MDC₅. Below that, the honest answer is not zero and it is not a small improvement. It is “cannot tell yet”, and Assay separates that from a genuine null result, which almost nothing else does.

  • WorkingThe change clears the floor and the trend across every session agrees.
  • Getting worseThe change clears the floor in the wrong direction. Reported early, before the concern’s normal timescale, because an adverse reaction is exactly the thing that shows up fast.
  • Expected flareWorse, but inside the window where this active is known to cause a temporary flare. Retinoids and BHAs purge before they help, and people quit good products over it.
  • Not workingFlat, past the point where this ingredient should have done something, and with enough data to have caught it. A null result, not an early one.
  • No evidence yetFlat, but the study cannot yet resolve an effect this size. Comes with the number of further sessions required.
  • Cannot measureThe concern is pinned against the end of the scale and has no room to move. See below.

The trap in a perfect score

During instrument characterisation the API returned a redness score of 100.00 on a clear face, on every single variant, including the full illumination sweep. Taken at face value that is a noise floor of zero: the most reliable metric on the panel.

It is the opposite. A reading pinned to the top of its range cannot move upward, so it can never show improvement, and its zero variance is a ceiling artefact rather than precision. Reporting a beautifully tight error bar for a measurement that is not measuring anything would be the most misleading thing this app could do.

So Assay detects it and declines. A concern sitting at the boundary of the scale and not moving is marked cannot measure, and no verdict is offered for it.

What this does not do

Assay is a measurement tool, not a medical device. It does not diagnose anything, and persistent or worsening skin problems belong with a dermatologist.

The threshold for “a change worth acting on” is set at five points. That is a product decision, not a clinical constant: there is no published minimal clinically important difference for this scale, because establishing one requires anchor‑based studies against patient‑reported outcomes. It is stated here so it can be argued with.

The error budget was measured on a synthetic face, which holds the subject perfectly constant but is one face. The per‑user noise floor is measured on your own, which is the number that actually gates your verdict.

A single subject cannot tell you what a product does in general. It can tell you what it is doing on you, which is the question you actually have.

The reliability experiment is reproducible: node scripts/experiment-reliability.mjs. Raw output is committed at experiments/reliability.json.

Measure your own noise floor