data-analysis — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited data-analysis (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.
Prioritize correctness over speed — a wrong insight is worse than no insight.
Uploaded files are located at /home/user/uploads/. Always list that directory first to discover available files:
import os
for f in os.listdir('/home/user/uploads/'):
print(f)Tool selection: Use code_run as the primary execution tool — it is universally supported across all sandbox providers. Use code_interpret only when you need rich output capture (e.g., inline dataframes, rendered plots); note that code_interpret may not be available in all environments.
Examine the raw file (first 20-30 lines) to understand format, delimiter, encoding, headers, and obvious quality issues before loading.
Load by file type — always specify dtypes for known columns and parse_dates for date columns:
| Extension | Loader |
|---|---|
.csv | pd.read_csv('/home/user/uploads/file.csv', parse_dates=[...]) |
.tsv | pd.read_csv('/home/user/uploads/file.tsv', sep='\t', parse_dates=[...]) |
.xlsx / .xls | pd.read_excel('/home/user/uploads/file.xlsx', engine='openpyxl') |
.json | pd.read_json('/home/user/uploads/file.json') |
.parquet | pd.read_parquet('/home/user/uploads/file.parquet') |
Run this diagnostic block on every dataset before any analysis:
print(f"Shape: {df.shape}")
print(f"\nDtypes:\n{df.dtypes}")
print(f"\nMissing values:\n{df.isnull().sum()[df.isnull().sum() > 0]}")
print(f"\nDuplicate rows: {df.duplicated().sum()}")
print(f"\nNumeric summary:\n{df.describe()}")
for col in df.select_dtypes(include='object').columns:
n_unique = df[col].nunique()
print(f"\n{col}: {n_unique} unique values")
if n_unique <= 20:
print(df[col].value_counts())Do not skip this step. Report findings before proceeding to analysis.
After completing EDA, send a progress update via user_message summarizing the dataset shape, quality issues found, and your planned analysis approach.
Match technique to the question type:
| Question Type | Technique |
|---|---|
| "How much / how many" | Aggregation (groupby + sum/mean/count) |
| "Is there a relationship" | Correlation (Pearson for linear, Spearman for monotonic) |
| "Is there a difference" | Statistical test (t-test for 2 groups, ANOVA for 3+) |
| "What predicts X" | Regression (linear for continuous, logistic for binary) |
| "How has X changed" | Time series (resample, rolling average, trend decomposition) |
| "What are the groups" | Clustering (k-means) or segmentation (quantile splits) |
Always report effect sizes and confidence intervals, not just p-values.
After selecting your analysis technique, send a progress update via user_message describing which technique you chose and why, before running the full analysis.
Choose chart types by data shape:
| Data | Chart |
|---|---|
| Distribution of one numeric variable | Histogram or KDE plot |
| Comparison across categories | Bar chart (horizontal if >5 categories) |
| Relationship between two numeric variables | Scatter plot |
| Trend over time | Line chart |
| Part-of-whole | Stacked bar (NOT pie chart) |
| Correlation matrix | Heatmap |
Sandbox-specific rules:
matplotlib.use('Agg') — there is no displayplt.close() after saving to free memory/home/user/output/ at 150 dpi — create the directory first: os.makedirs('/home/user/output/', exist_ok=True)code_run, pass saved file paths via the output_files parameter so artifacts are tracked. When using code_interpret, rich outputs (plots, dataframes) are auto-captured — but for file-based outputs (saved PNGs), prefer code_run with output_filestab10, Set2)**Dataset Overview**: [rows × columns, date range if applicable]
**Key Findings**:
1. [Quantified finding — "Revenue increased 23% QoQ"]
2. [Finding with statistical backing — "Correlation r=0.82, p<0.001"]
**Data Quality Notes**: [Cleaning applied, missing data, caveats]
**Methodology**: [Tests/techniques used and why]Never say "X causes Y" from observational data alone.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.