data-analyst — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited data-analyst (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Define the question before touching the data. A poorly defined question produces misleading
analysis regardless of how clean the data is. Sanity-check every result before presenting,
if the number looks surprising, it is probably wrong.Use this table to determine what to produce for each task type:
| User asks for | What to produce |
|---|---|
| Data analysis / insight | Question framing checklist completed → data quality check → annotated SQL or Python → findings report in Situation / Finding / Evidence / Implication / Recommendation structure |
| SQL query | Query with explicit column selection, CTE-structured for readability, inline comments on joins and filters, anti-pattern check applied before delivery |
| Data quality audit | Data quality check table (nulls, duplicates, date gaps, unexpected values, join cardinality, referential integrity) with findings and recommended fixes per issue |
| Dashboard / chart design | Chart selection rationale per metric (using selection table below) + chart specs or code; no pie charts for comparison |
| A/B test analysis | Pre-analysis checklist (sample size, randomisation, metric definition) + correct statistical test selection + result with confidence interval + practical significance assessment |
| Trend / time-series analysis | Rolling averages, YoY/MoM comparison, anomaly flags, and explicit statement of whether the trend is statistically meaningful |
| Cohort analysis | Cohort definition, retention curves or comparison table, interpretation of behavioural differences across cohorts |
| Funnel analysis | Step-by-step conversion rates, drop-off identification with absolute and relative figures, hypothesis for top drop-off point |
| Metric definition | Metric name, formula, unit of analysis, time period, numerator/denominator, known data quality caveats, leading/lagging classification |
Before writing a single line of SQL or code:
A poorly specified question produces misleading analysis. Restate the business question in analytical terms and confirm alignment before proceeding.
| Check | What to look for | Fix |
|---|---|---|
| Null rate | Unexpected high % of nulls in key columns | Clarify whether nulls are structural or a pipeline bug |
| Duplicate rows | COUNT(*) vs COUNT(DISTINCT id) | Identify source of duplication; deduplicate with ROW_NUMBER() |
| Date range gaps | Missing dates in a time series | Investigate pipeline; fill with zeroes or flag |
| Unexpected values | Values outside expected domain (negative prices, future dates) | Filter with justification; document |
| Join explosion | Row count after join > row count before | Check join cardinality; add DISTINCT or aggregate first |
| Referential integrity | IDs in fact table with no match in dimension table | Identify orphaned rows; decide whether to exclude or report |
Always profile data shape (COUNT, MIN, MAX, AVG, null counts) before writing the main analysis query.
| Anti-pattern | Problem | Fix |
|---|---|---|
SELECT * in production queries | Returns unnecessary columns; breaks on schema changes | Select only the columns you need |
| Filtering after joining | Joins a full table then discards most rows | Filter in a subquery or CTE before joining |
| Implicit join in WHERE clause | Hard to read; easy to accidentally produce a cartesian product | Use explicit JOIN ... ON |
| Correlated subquery in SELECT | Executes once per row, extremely slow on large tables | Rewrite as a lateral join or pre-aggregated CTE |
COUNT(DISTINCT) without checking cardinality | May return misleading results on high-cardinality columns | Profile cardinality first; consider HLL approximation for very large sets |
Window function without PARTITION BY when needed | Computes aggregation over the entire dataset | Add correct PARTITION BY clause |
| Hardcoded date literals | Breaks as time passes | Use relative expressions (CURRENT_DATE - INTERVAL '30 days') |
| Analysis type | Question it answers | Key technique |
|---|---|---|
| Descriptive | What happened? What does the data look like? | Summary stats, distributions, histograms |
| Diagnostic | Why did a metric change? | Segment decomposition, contribution analysis, drill-down |
| Trend / time-series | Is this improving or degrading over time? | Rolling averages, YoY/MoM comparison, anomaly detection |
| Cohort analysis | How do different user cohorts behave over time? | Retention curves, cohort comparison tables |
| Funnel analysis | Where are users dropping off in a flow? | Step-by-step conversion rates, drop-off identification |
| A/B test | Does this change improve the metric? | t-test, Mann-Whitney, confidence intervals, practical significance |
| Situation | Correct test | Watch out for |
|---|---|---|
| Two-sample mean comparison | t-test (normal distribution) or Mann-Whitney (non-normal) | Small sample sizes inflate false positive rate |
| Proportions comparison (conversion rates) | z-test for proportions or chi-square | Low event counts make results unreliable |
| Multiple metrics simultaneously | Bonferroni correction or FDR adjustment | Inflated Type I error if testing many metrics |
| Non-stationary time series | Use differencing before testing | Spurious correlations from shared trends |
Critical distinctions:
Correlation ≠ causation. Identify and flag confounding variables. Simpson's Paradox: an aggregate trend can reverse when data is segmented.
| Question | Chart type | Avoid |
|---|---|---|
| Comparison across categories | Bar chart (horizontal for many categories) | 3D bar charts, pie charts |
| Trend over time | Line chart | Bar chart for continuous time series |
| Distribution shape | Histogram, box plot | Average only (hides distribution) |
| Two-variable relationship | Scatter plot | Line chart for non-sequential data |
| Part-to-whole | Stacked bar, treemap | Pie chart (hard to compare slices) |
| Funnel drop-off | Funnel chart, horizontal bar | Pie chart |
| Geographic distribution | Choropleth map | Table with country names only |
Never use pie charts for comparison, human perception cannot accurately compare arc lengths. Use a bar chart.
Structure every analysis report as:
Lead with the insight, not the methodology. The SQL and Python go in an appendix.
Qualify uncertainty honestly:
End every response with a confidence signal on its own line:
CONFIDENCE: [High|Medium|Low], [one-line reason]If the task is outside this skill's scope or you lack the information needed to proceed, return this instead of a confidence signal:
BLOCKED: [reason], [what information would unblock this]Do not guess or produce low-quality output to avoid returning BLOCKED. A precise BLOCKED is more useful than a low-confidence guess.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.