CtrlK
BlogDocsLog inGet started
Tessl Logo

data-quality

Quality dimensions quick reference and remediation decision tree for tabular data assessment

57

Quality

65%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Fix and improve this skill with Tessl

tessl review fix ./.claude/skills/skills/data-quality/SKILL.md
SKILL.md
Quality
Evals
Security

Data Quality Assessment with qsv

For the full step-by-step profiling workflow, use the /data-profile command. This skill provides quick-reference guidance for quality assessment and remediation decisions.

Quality Dimensions (Quick Reference)

DimensionKey QuestionPrimary CheckRed Flag
CompletenessMissing values?statsnullcount, sparsitySparsity > 0.5
UniquenessUnwanted duplicates?stats --cardinality vs row countKey column cardinality < row count
ValidityCorrect formats/types?statstype; validate schema.jsonString type on numeric column
ConsistencyUniform formats?frequency — case variants; sniff — encodingSame value in different cases
AccuracyPlausible values?stats — min/max/stddevValues > 3 stddev from mean
Column Name QualityHeaders safe & descriptive?safenames --verifySpaces, special chars, or duplicates in headers
ConformityValues follow standards?searchset with domain regexNon-standard codes (country, state, zip, phone)
Referential IntegrityForeign keys valid?joinp --left-antiOrphaned references across related files
Injection SafetyMalicious payloads?searchset with injection regexFormula/SQL injection patterns in cells
DocumentationDataset described?describegpt --allNo Data Dictionary or Description

Remediation Decision Tree

When a quality issue is found, choose the right fix:

ProblemSeverityFix CommandWhen to Skip
Ragged rowsHighfixlengthsNever — breaks downstream tools
Wrong encodingHighinputFile is already UTF-8 (check with sniff)
Unsafe column namesMediumsafenamesHeaders already safe (no spaces/special chars)
Leading/trailing whitespaceMediumsqlp with TRIM(col)Stats show no difference between min/max lengths and trimmed values
Duplicate rowsMediumdedup (or extdedup for >1GB)stats --cardinality on key columns shows all unique
Inconsistent caseLowsqlp with UPPER(col) or LOWER(col)frequency shows no case variants
Empty valuesLowsqlp with COALESCE(NULLIF(col, ''), 'N/A')Nulls are semantically meaningful
Non-conforming valuesMediumsearchset + search --flagNo domain standard applies
Orphaned foreign keysMediumjoinp --left-antiSingle-file dataset with no references
Injection payloadsHighsearchset with injection regex + sanitizeData is internal-only and never opened in spreadsheets or loaded into databases
Invalid rowsLowvalidate schema.json + filterNo schema available

Fix Ordering

Always apply fixes in this order to avoid cascading issues:

1. input          (encoding — must be UTF-8 before anything else)
2. safenames      (headers — fixes names before column references)
3. fixlengths     (structure — ensures consistent field counts)
4. sqlp with TRIM()    (whitespace — clean values before dedup)
5. dedup          (duplicates — remove after trimming so "foo " and "foo" match)
6. validate       (validation — check against schema last)

Stats Cache as Quality Dashboard

After running stats --cardinality --stats-jsonl (basic moarstats auto-runs), read the .stats.csv cache to assess quality in one pass:

Cache ColumnQuality Signal
nullcountCompleteness — 0 is ideal
sparsityCompleteness — ratio of nulls (0.0–1.0)
cardinalityUniqueness — compare to row count
typeValidity — check expected types
min / maxAccuracy — plausible range?
mean / stddevAccuracy — outlier detection (>3σ)
outliers_total_cntAccuracy — from moarstats; outlier count per column
modeConsistency — dominant value expected?

Advanced Stats (via moarstats --advanced)

Run moarstats --advanced to enrich the cache with distribution shape metrics:

Cache ColumnQuality Signal
kurtosis>3 heavy tails (outlier-prone), <3 light tails; >10 = extreme outliers
bimodality_coefficient>=0.555 suggests bimodal distribution (possible mixed populations)
jarque_bera_pvalue<0.05 = NOT normally distributed; flag analyses assuming normality
gini_coefficientNear 1 = extreme concentration; near 0 = uniform
shannon_entropyLow = concentrated values; high = diverse
winsorized_meanCompare to mean — large difference signals outlier influence
median_mean_ratio<0.8 or >1.2 = significantly skewed; mean may be misleading
range_stddev_ratioVery high = extreme outliers relative to variability
cv>100% = high relative variability; data is highly spread relative to mean
mad_stddev_ratio>0.8 = stddev is reliable; <<0.8 = outliers inflating stddev
mode_zscoreFar from 0 = mode is atypical; possible mixed populations
trimeanRobust central tendency: (Q1 + 2*median + Q3)/4; compare to mean for skew detection
midhingeMidpoint of middle 50%: (Q1+Q3)/2; robust center measure
robust_cvMAD/abs(median); outlier-resistant coefficient of variation
theil_indexInequality measure (0=equal); decomposable into within/between group; only for positive values
mean_adAverage absolute distance from mean; less sensitive to outliers than stddev
simpsons_diversity_indexProbability two random values differ (0-1); more intuitive than entropy
Repository
dathere/qsv
Last updated
First committed

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.