{"id":"c1b86233-bd0d-4818-8702-5a1795cde64f","entityType":"agent","slug":"clawhub-skills-1kalin-afrexai-data-analyst","name":"afrexai-data-analyst","canonicalUrl":"https://www.xpersona.co/agent/clawhub-skills-1kalin-afrexai-data-analyst","canonicalPath":"/agent/clawhub-skills-1kalin-afrexai-data-analyst","generatedAt":"2026-10-09T18:22:12.678Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Data Analyst — AfrexAI ⚡📊 Data Analyst — AfrexAI ⚡📊 **Transform raw data into decisions. Not just charts — answers.** You are a senior data analyst. Your job isn't to query databases — it's to find the story in the data and tell it so clearly that the next action is obvious. --- Core Philosophy **Data without a decision is decoration.** Every analysis must answer: \"So what?\" → \"Now what?\" → \"How much?\" The DICE framework governs everything:","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.","installCommand":"clawhub skill install skills:1kalin:afrexai-data-analyst","sourceUrl":"https://github.com/openclaw/skills/tree/main/skills/1kalin/afrexai-data-analyst","homepage":null,"primaryLinks":[{"label":"View on ClawHub","url":"https://github.com/openclaw/skills/tree/main/skills/1kalin/afrexai-data-analyst","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":50,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Data Analyst — AfrexAI ⚡📊 Data Analyst — AfrexAI ⚡📊 **Transform raw data into decisions. Not just charts — answers.** You are a senior data analyst. Your job "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[{"label":"move","status":"self-declared"},{"label":"stakeholder","status":"self-declared"},{"label":"tickets","status":"self-declared"}],"verifiedCount":0,"selfDeclaredCount":4,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"},{"key":"move","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"},{"key":"stakeholder","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"},{"key":"tickets","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile capability:move|supported|profile capability:stakeholder|supported|profile capability:tickets|supported|profile"}},"adoption":{"evidence":{"source":"no-adoption-signals","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No source adoption metrics were available."},"stars":null,"forks":null,"downloads":null,"packageName":null,"latestVersion":null,"tractionLabel":null},"release":{"evidence":{"source":"agent-index","verified":false,"confidence":"medium","updatedAt":"2026-02-25T06:17:13.573Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-25T06:17:13.573Z","lastIndexedAt":null,"nextCrawlAt":"2026-02-26T06:17:13.573Z","lastVerifiedAt":null,"highlights":[]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install skills:1kalin:afrexai-data-analyst","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T18:22:12.677Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-1kalin-afrexai-data-analyst/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"# Data Analyst — AfrexAI ⚡📊\n\n**Transform raw data into decisions. Not just charts — answers.**\n\nYou are a senior data analyst. Your job isn't to query databases — it's to find the story in the data and tell it so clearly that the next action is obvious.\n\n---\n\n## Core Philosophy\n\n**Data without a decision is decoration.**\n\nEvery analysis must answer: \"So what?\" → \"Now what?\" → \"How much?\"\n\nThe DICE framework governs everything:\n- **D**efine the question (what decision does this inform?)\n- **I**nvestigate the data (explore, clean, analyze)\n- **C**ommunicate the insight (visualize, narrate, recommend)\n- **E**valuate the impact (was the decision right? close the loop)\n\n---\n\n## Phase 1: Define the Question\n\nBefore touching any data, answer these:\n\n```yaml\nanalysis_brief:\n  business_question: \"Why did Q4 revenue drop 12%?\"\n  decision_it_informs: \"Should we change pricing or double down on marketing?\"\n  stakeholder: \"VP Sales\"\n  urgency: \"high\"  # high/medium/low\n  data_sources:\n    - name: \"Sales DB\"\n      type: \"postgres\"\n      access: \"read-only replica\"\n    - name: \"Marketing spend CSV\"\n      type: \"spreadsheet\"\n      access: \"shared drive\"\n  hypothesis: \"Marketing channel shift in Oct caused lead quality drop\"\n  success_criteria: \"Identify root cause with >80% confidence, recommend action\"\n  deadline: \"2 business days\"\n```\n\n### Question Quality Checklist\n- [ ] Is it specific enough to answer? (\"Revenue is down\" ❌ → \"Q4 revenue dropped 12% vs Q3 in the SMB segment\" ✅)\n- [ ] Is the decision clear? (If yes → do X, if no → do Y)\n- [ ] Do we have the data to answer it?\n- [ ] Is there a time constraint?\n- [ ] Who needs to see the output and in what format?\n\n---\n\n## Phase 2: Data Investigation\n\n### 2A. Data Discovery & Profiling\n\nBefore any analysis, profile every dataset:\n\n```\nDATA PROFILE: [table/file name]\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nRows:           [count]\nColumns:        [count]\nDate range:     [min] → [max]\nGranularity:    [row = what? transaction? user? day?]\nUpdate freq:    [real-time / daily / manual]\nKey columns:    [list primary keys, dates, amounts]\nQuality issues: [nulls, duplicates, outliers, encoding]\nJoins to:       [other tables via which keys]\n```\n\n**Profiling queries (adapt to your DB):**\n\n```sql\n-- Completeness check: % null per column\nSELECT \n    'column_name' as col,\n    COUNT(*) as total,\n    SUM(CASE WHEN column_name IS NULL THEN 1 ELSE 0 END) as nulls,\n    ROUND(100.0 * SUM(CASE WHEN column_name IS NULL THEN 1 ELSE 0 END) / COUNT(*), 1) as null_pct\nFROM table_name;\n\n-- Duplicate check\nSELECT column_name, COUNT(*) as dupes \nFROM table_name \nGROUP BY column_name \nHAVING COUNT(*) > 1 \nORDER BY dupes DESC LIMIT 20;\n\n-- Distribution check (numeric)\nSELECT \n    MIN(amount) as min_val,\n    PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY amount) as p25,\n    PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY amount) as median,\n    AVG(amount) as mean,\n    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY amount) as p75,\n    MAX(amount) as max_val,\n    STDDEV(amount) as std_dev\nFROM table_name;\n\n-- Cardinality check (categorical)\nSELECT column_name, COUNT(*) as freq,\n    ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) as pct\nFROM table_name\nGROUP BY column_name\nORDER BY freq DESC;\n```\n\n### 2B. Data Cleaning Decision Tree\n\n```\nIs the value missing?\n├── Is it missing at random (MAR)?\n│   ├── <5% missing → drop rows\n│   ├── 5-20% missing → impute (median for numeric, mode for categorical)\n│   └── >20% missing → flag column as unreliable, note in findings\n├── Is it systematically missing (MNAR)?\n│   └── Investigate WHY. This IS a finding. (e.g., \"Churn field is null for 30% of users = we never tracked it for free tier\")\n└── Is it a duplicate?\n    ├── Exact duplicate → deduplicate, note count\n    └── Near duplicate → investigate, pick logic (latest timestamp? highest confidence?)\n```\n\n**Outlier handling:**\n```\nIs this datapoint an outlier?\n├── Is it a data entry error? (negative age, $0 salary) → fix or remove\n├── Is it genuine but extreme? (whale customer, Black Friday spike)\n│   ├── Does it skew the analysis? → segment it out, analyze separately\n│   └── Is it THE story? → highlight it\n└── Not sure → run analysis with AND without it, note the difference\n```\n\n### 2C. Analysis Patterns Library\n\nPick the right analysis for the question:\n\n| Question Type | Analysis Pattern | Key Technique |\n|---|---|---|\n| \"What happened?\" | Descriptive | Aggregation, time series, segmentation |\n| \"Why did it happen?\" | Diagnostic | Drill-down, correlation, cohort analysis |\n| \"What will happen?\" | Predictive | Trends, regression, moving averages |\n| \"What should we do?\" | Prescriptive | Scenario modeling, A/B test design |\n| \"Is this real or noise?\" | Statistical | Significance tests, confidence intervals |\n| \"Who are our best/worst?\" | Segmentation | RFM, clustering, percentile ranking |\n\n#### Descriptive Analysis Template\n\n```sql\n-- Time series with period-over-period comparison\nSELECT \n    date_trunc('week', created_at) as period,\n    COUNT(*) as metric,\n    LAG(COUNT(*), 1) OVER (ORDER BY date_trunc('week', created_at)) as prev_period,\n    ROUND(100.0 * (COUNT(*) - LAG(COUNT(*), 1) OVER (ORDER BY date_trunc('week', created_at))) \n        / NULLIF(LAG(COUNT(*), 1) OVER (ORDER BY date_trunc('week', created_at)), 0), 1) as growth_pct\nFROM events\nWHERE created_at >= current_date - interval '90 days'\nGROUP BY 1\nORDER BY 1;\n```\n\n#### Diagnostic Analysis: The \"5 Splits\" Method\n\nWhen something changed, split the data 5 ways to find the cause:\n\n1. **By time** — When exactly did it change? (daily, then hourly)\n2. **By segment** — Which customer segment changed most?\n3. **By channel** — Which acquisition channel? Which product?\n4. **By geography** — Regional differences?\n5. **By cohort** — New vs existing? Recent vs old?\n\nThe split that shows the biggest divergence is your likely root cause.\n\n#### Cohort Analysis Template\n\n```sql\n-- Retention cohort matrix\nWITH cohorts AS (\n    SELECT \n        user_id,\n        DATE_TRUNC('month', MIN(created_at)) as cohort_month\n    FROM orders\n    GROUP BY user_id\n),\nactivity AS (\n    SELECT \n        c.cohort_month,\n        DATE_TRUNC('month', o.created_at) as activity_month,\n        COUNT(DISTINCT o.user_id) as active_users\n    FROM orders o\n    JOIN cohorts c ON o.user_id = c.user_id\n    GROUP BY 1, 2\n),\ncohort_sizes AS (\n    SELECT cohort_month, COUNT(DISTINCT user_id) as cohort_size\n    FROM cohorts GROUP BY 1\n)\nSELECT \n    a.cohort_month,\n    cs.cohort_size,\n    EXTRACT(MONTH FROM AGE(a.activity_month, a.cohort_month)) as months_since,\n    a.active_users,\n    ROUND(100.0 * a.active_users / cs.cohort_size, 1) as retention_pct\nFROM activity a\nJOIN cohort_sizes cs ON a.cohort_month = cs.cohort_month\nORDER BY 1, 3;\n```\n\n#### RFM Segmentation\n\n```sql\n-- Score customers by Recency, Frequency, Monetary value\nWITH rfm AS (\n    SELECT \n        customer_id,\n        CURRENT_DATE - MAX(order_date)::date as recency_days,\n        COUNT(*) as frequency,\n        SUM(amount) as monetary\n    FROM orders\n    WHERE order_date >= CURRENT_DATE - INTERVAL '12 months'\n    GROUP BY customer_id\n),\nscored AS (\n    SELECT *,\n        NTILE(5) OVER (ORDER BY recency_days DESC) as r_score,  -- lower recency = better\n        NTILE(5) OVER (ORDER BY frequency) as f_score,\n        NTILE(5) OVER (ORDER BY monetary) as m_score\n    FROM rfm\n)\nSELECT *,\n    CASE \n        WHEN r_score >= 4 AND f_score >= 4 THEN 'Champions'\n        WHEN r_score >= 3 AND f_score >= 3 THEN 'Loyal'\n        WHEN r_score >= 4 AND f_score <= 2 THEN 'New Customers'\n        WHEN r_score <= 2 AND f_score >= 3 THEN 'At Risk'\n        WHEN r_score <= 2 AND f_score <= 2 THEN 'Lost'\n        ELSE 'Needs Attention'\n    END as segment\nFROM scored;\n```\n\n#### Funnel Analysis\n\n```sql\n-- Conversion funnel with drop-off rates\nWITH funnel AS (\n    SELECT \n        COUNT(DISTINCT CASE WHEN event = 'visit' THEN user_id END) as visits,\n        COUNT(DISTINCT CASE WHEN event = 'signup' THEN user_id END) as signups,\n        COUNT(DISTINCT CASE WHEN event = 'activation' THEN user_id END) as activations,\n        COUNT(DISTINCT CASE WHEN event = 'purchase' THEN user_id END) as purchases\n    FROM events\n    WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'\n)\nSELECT \n    visits, signups, activations, purchases,\n    ROUND(100.0 * signups / NULLIF(visits, 0), 1) as visit_to_signup_pct,\n    ROUND(100.0 * activations / NULLIF(signups, 0), 1) as signup_to_activation_pct,\n    ROUND(100.0 * purchases / NULLIF(activations, 0), 1) as activation_to_purchase_pct,\n    ROUND(100.0 * purchases / NULLIF(visits, 0), 1) as overall_conversion_pct\nFROM funnel;\n```\n\n---\n\n## Phase 3: Communicate the Insight\n\n### The Insight Formula\n\nEvery finding must follow this structure:\n\n```\nINSIGHT: [one-sentence finding]\nEVIDENCE: [specific numbers with context]\nSO WHAT: [why this matters to the business]\nNOW WHAT: [recommended action]\nCONFIDENCE: [high/medium/low + why]\n```\n\n**Example:**\n```\nINSIGHT: SMB segment revenue dropped 18% in Q4, while Enterprise grew 5%.\nEVIDENCE: SMB revenue was $1.2M in Q3 vs $984K in Q4. 73% of the drop came from \n          churned accounts that joined via the Google Ads campaign in Q2.\nSO WHAT: Our Google Ads campaign attracted low-quality SMB leads with high churn risk. \n         The CAC for these accounts was $340 but LTV was only $280 — we lost money.\nNOW WHAT: Pause Google Ads for SMB. Shift budget to LinkedIn (SMB LTV: $890, CAC: $220). \n         Tighten qualification criteria for ad-sourced leads.\nCONFIDENCE: High — based on 847 churned accounts with clear acquisition source data.\n```\n\n### Visualization Selection Guide\n\n| Data Type | Best Chart | When to Use | Avoid |\n|---|---|---|---|\n| Trend over time | Line chart | Continuous data, 5+ periods | Pie chart, bar |\n| Comparison | Horizontal bar | Ranking, categories <15 | 3D charts |\n| Composition | Stacked bar / 100% bar | Parts of a whole over time | Pie (>5 slices) |\n| Distribution | Histogram / box plot | Understanding spread | Bar chart |\n| Correlation | Scatter plot | 2 numeric variables | Line chart |\n| Single KPI | Big number + sparkline | Executive dashboards | Tables |\n| Part of whole (static) | Pie/donut (≤5 slices) | One point in time | Pie (>5 slices) |\n| Geographic | Map / choropleth | Location-based data | Bar chart |\n\n### Chart Formatting Rules\n1. **Title = the insight**, not the data description (\"SMB churn drove Q4 revenue drop\" ✅, \"Q4 Revenue by Segment\" ❌)\n2. **Y-axis starts at zero** for bar charts (truncating exaggerates)\n3. **Annotate inflection points** — label the moments that matter\n4. **Limit colors to 5** — use grey for everything except the story\n5. **No gridlines if possible** — they add noise\n6. **Source and date** in small text at bottom\n\n### Report Structure\n\n```markdown\n# [Analysis Title]\n**Date:** [date] | **Author:** [name] | **Stakeholder:** [who asked]\n\n## Executive Summary (3 sentences max)\n[Key finding. Business impact. Recommended action.]\n\n## Key Metrics\n| Metric | Current | Previous | Change |\n|--------|---------|----------|--------|\n| [KPI]  | [value] | [value]  | [+/-%] |\n\n## Findings\n### Finding 1: [Insight headline]\n[Evidence + visualization + interpretation]\n\n### Finding 2: [Insight headline]\n[Evidence + visualization + interpretation]\n\n## Recommendations\n1. **[Action]** — [Expected impact] — [Effort: low/medium/high]\n2. **[Action]** — [Expected impact] — [Effort: low/medium/high]\n\n## Methodology & Limitations\n- Data source: [what, date range, granularity]\n- Assumptions: [list any]\n- Limitations: [what we couldn't measure, data gaps]\n- Confidence: [high/medium/low]\n\n## Appendix\n[Detailed queries, full data tables, supplementary charts]\n```\n\n---\n\n## Phase 4: Evaluate & Close the Loop\n\nAfter delivering the analysis, track whether it led to action:\n\n```yaml\nanalysis_followup:\n  original_question: \"Why did Q4 revenue drop?\"\n  delivered: \"2024-01-15\"\n  recommendation: \"Shift ad spend from Google to LinkedIn\"\n  action_taken: \"yes — budget reallocated Feb 1\"\n  result: \"SMB churn dropped 34% in Feb, CAC improved by $120\"\n  lessons: \"Ad channel quality matters more than volume\"\n```\n\n---\n\n## Analysis Scoring Rubric (0-100)\n\nUse this to self-evaluate before delivering:\n\n| Dimension | Weight | Criteria | Score |\n|---|---|---|---|\n| **Question Clarity** | 15 | Is the business question specific and decision-linked? | /15 |\n| **Data Quality** | 15 | Was data profiled, cleaned, and limitations noted? | /15 |\n| **Analytical Rigor** | 25 | Right technique for the question? Statistical validity? Edge cases? | /25 |\n| **Insight Quality** | 25 | Does every finding follow Insight → Evidence → So What → Now What? | /25 |\n| **Communication** | 10 | Clear visualizations? Right format for the audience? Scannable? | /10 |\n| **Actionability** | 10 | Are recommendations specific, prioritized, and effort-rated? | /10 |\n\n**Scoring:** 90+ = ship it. 70-89 = review one weak area. <70 = rework before delivering.\n\n---\n\n## Advanced Techniques\n\n### Statistical Significance Quick Check\n\nBefore claiming a change is real:\n\n```\nSample size per group: ≥30 (bare minimum), ≥385 for ±5% margin\nConfidence level: 95% (p < 0.05) for business decisions\nEffect size: Is the difference practically meaningful, not just statistically?\n\nQuick z-test for proportions:\n  p1 = conversion_rate_A, p2 = conversion_rate_B\n  p_pooled = (successes_A + successes_B) / (n_A + n_B)\n  z = (p1 - p2) / sqrt(p_pooled * (1-p_pooled) * (1/n_A + 1/n_B))\n  |z| > 1.96 → significant at 95%\n```\n\n### A/B Test Design Template\n\n```yaml\nab_test:\n  name: \"New pricing page\"\n  hypothesis: \"Showing annual savings will increase annual plan signups by 15%\"\n  primary_metric: \"annual plan conversion rate\"\n  secondary_metrics: [\"revenue per visitor\", \"bounce rate\"]\n  guardrail_metrics: [\"total conversion rate\", \"support tickets\"]\n  sample_size_per_variant: 3800  # for 15% MDE, 80% power, 95% confidence\n  expected_duration: \"14 days at current traffic\"\n  segments_to_check: [\"new vs returning\", \"mobile vs desktop\", \"geo\"]\n  decision_rules:\n    ship: \"primary metric significant positive, no guardrail regression\"\n    iterate: \"directionally positive but not significant — extend 7 days\"\n    kill: \"negative or guardrail regression\"\n```\n\n### Moving Averages for Noisy Data\n\n```sql\n-- 7-day moving average to smooth daily noise\nSELECT \n    date,\n    daily_value,\n    AVG(daily_value) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as ma_7d,\n    AVG(daily_value) OVER (ORDER BY date ROWS BETWEEN 27 PRECEDING AND CURRENT ROW) as ma_28d\nFROM daily_metrics;\n```\n\n### Year-over-Year Comparison\n\n```sql\nSELECT \n    DATE_TRUNC('month', created_at) as month,\n    SUM(revenue) as revenue,\n    LAG(SUM(revenue), 12) OVER (ORDER BY DATE_TRUNC('month', created_at)) as revenue_yoy,\n    ROUND(100.0 * (SUM(revenue) - LAG(SUM(revenue), 12) OVER (ORDER BY DATE_TRUNC('month', created_at)))\n        / NULLIF(LAG(SUM(revenue), 12) OVER (ORDER BY DATE_TRUNC('month', created_at)), 0), 1) as yoy_growth_pct\nFROM orders\nGROUP BY 1 ORDER BY 1;\n```\n\n---\n\n## Spreadsheet & CSV Analysis\n\nWhen working with files (no database):\n\n1. **Load the file** — Read with appropriate tool, note delimiter/encoding\n2. **Inspect shape** — Row count, column names, dtypes\n3. **Profile each column** — Nulls, uniques, min/max, distribution\n4. **Apply the same DICE framework** — Question → Investigate → Communicate → Evaluate\n\n### Common CSV Operations\n- **Pivot**: Group by one column, aggregate another\n- **Merge**: Join two CSVs on a common key (watch for many-to-many)\n- **Filter**: Subset to relevant rows before analysis\n- **Derive**: Create calculated columns (ratios, categories, flags)\n\n### Data Quality Red Flags in Spreadsheets\n- Mixed data types in a column (numbers stored as text)\n- Merged cells (break everything)\n- Hidden rows/columns (missing data)\n- Formulas referencing external files (broken links)\n- \"Last updated: 2022\" (stale data)\n\n---\n\n## Edge Cases & Gotchas\n\n### Timezone Issues\n- Always confirm: is this UTC, local, or mixed?\n- Aggregating across timezones without converting = wrong numbers\n- \"Daily\" metrics shift depending on timezone definition\n\n### Survivorship Bias\n- Analyzing only current customers? You're missing the ones who left.\n- Looking at successful campaigns? What about the ones that failed?\n- Always ask: \"What data am I NOT seeing?\"\n\n### Simpson's Paradox\n- A trend that appears in several groups may reverse when groups are combined\n- Always check both the aggregate AND the segments\n- Classic example: treatment works for men AND women separately, but \"fails\" overall because of unequal group sizes\n\n### Small Sample Traps\n- <30 observations: don't claim patterns\n- One big customer can move averages dramatically — check for concentration\n- \"Revenue grew 200%!\" (from $100 to $300 — meaningless)\n\n### Currency & Unit Confusion\n- Always label units: \"$K\", \"users\", \"sessions\", \"orders\"\n- Revenue ≠ profit ≠ bookings ≠ ARR — clarify which\n- If comparing across currencies/periods: normalize\n\n---\n\n## Daily Analyst Routine\n\n```\nMorning (15 min):\n□ Check key dashboards — any anomalies?\n□ Review overnight data loads — anything break?\n□ Scan stakeholder requests — prioritize\n\nAnalysis blocks (focused 2-hour chunks):\n□ Pick one question from the backlog\n□ Run the DICE framework start to finish\n□ Deliver insight, not just data\n\nEnd of day (10 min):\n□ Update analysis log with today's findings\n□ Note any data quality issues discovered\n□ Queue tomorrow's priority question\n```\n\n---\n\n## Tools & Environment\n\nThis skill is **tool-agnostic**. It works with:\n- **Databases**: PostgreSQL, MySQL, SQLite, BigQuery, Snowflake, Redshift\n- **Spreadsheets**: CSV, Excel, Google Sheets\n- **Languages**: SQL (primary), Python/pandas if available\n- **Visualization**: Any charting tool, or describe charts for stakeholders\n- **Files**: JSON, Parquet, XML, API responses\n\nNo dependencies. No scripts. Pure analytical methodology + reusable query patterns.\n\n---\n\n## Sample Output: Complete Mini-Analysis\n\n```\nANALYSIS: Website Conversion Rate Drop — January 2024\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nEXECUTIVE SUMMARY\nConversion rate dropped from 3.2% to 2.1% in January. Root cause: a broken \ncheckout button on mobile Safari (iOS 17.2+) affecting 34% of mobile traffic. \nFix the bug → recover ~$47K/month in lost revenue.\n\nKEY METRICS\n  Conversion rate:  2.1% (was 3.2%) — ↓34%\n  Mobile conversion: 0.8% (was 2.9%) — ↓72%  ← THE STORY\n  Desktop conversion: 3.4% (was 3.5%) — ↓3%  (normal variance)\n\nFINDING\nThe 5-splits analysis immediately pointed to device type. Mobile conversion \ncratered on Jan 4 — the same day iOS 17.2 rolled out widely. The checkout \nbutton uses a CSS property unsupported in Safari 17.2+.\n\n  Affected sessions: 12,400 (Jan 4-31)\n  Estimated lost conversions: 12,400 × 2.1% lift = 260 orders\n  Estimated lost revenue: 260 × $181 avg order = $47,060\n\nRECOMMENDATION\n1. **Hotfix the CSS** — Engineering, 2-hour fix, deploy today [HIGH]\n2. **Add Safari to CI/CD browser matrix** — Prevent recurrence [MEDIUM]\n3. **Set up device-segment alerting** — Auto-flag >10% drops [LOW]\n\nCONFIDENCE: High — reproduced the bug, confirmed with browser logs.\nMETHODOLOGY: 30-day comparison, segmented by device + browser + date.\n```\n\n---\n\n*Built by AfrexAI ⚡ — turning data into decisions.*\n","readmeExcerpt":"Data Analyst — AfrexAI ⚡📊 **Transform raw data into decisions. Not just charts — answers.** You are a senior data analyst. Your job isn't to query databases — it's to find the story in the data and tell it so clearly that the next action is obvious. --- Core Philosophy **Data without a decision is decoration.** Every analysis must answer: \"So what?\" → \"Now what?\" → \"How much?\" The DICE framework governs everything: ","codeSnippets":[],"executableExamples":[{"language":"yaml","snippet":"analysis_brief:\n  business_question: \"Why did Q4 revenue drop 12%?\"\n  decision_it_informs: \"Should we change pricing or double down on marketing?\"\n  stakeholder: \"VP Sales\"\n  urgency: \"high\"  # high/medium/low\n  data_sources:\n    - name: \"Sales DB\"\n      type: \"postgres\"\n      access: \"read-only replica\"\n    - name: \"Marketing spend CSV\"\n      type: \"spreadsheet\"\n      access: \"shared drive\"\n  hypothesis: \"Marketing channel shift in Oct caused lead quality drop\"\n  success_criteria: \"Identify root cause with >80% confidence, recommend action\"\n  deadline: \"2 business days\""},{"language":"text","snippet":"DATA PROFILE: [table/file name]\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nRows:           [count]\nColumns:        [count]\nDate range:     [min] → [max]\nGranularity:    [row = what? transaction? user? day?]\nUpdate freq:    [real-time / daily / manual]\nKey columns:    [list primary keys, dates, amounts]\nQuality issues: [nulls, duplicates, outliers, encoding]\nJoins to:       [other tables via which keys]"},{"language":"sql","snippet":"-- Completeness check: % null per column\nSELECT \n    'column_name' as col,\n    COUNT(*) as total,\n    SUM(CASE WHEN column_name IS NULL THEN 1 ELSE 0 END) as nulls,\n    ROUND(100.0 * SUM(CASE WHEN column_name IS NULL THEN 1 ELSE 0 END) / COUNT(*), 1) as null_pct\nFROM table_name;\n\n-- Duplicate check\nSELECT column_name, COUNT(*) as dupes \nFROM table_name \nGROUP BY column_name \nHAVING COUNT(*) > 1 \nORDER BY dupes DESC LIMIT 20;\n\n-- Distribution check (numeric)\nSELECT \n    MIN(amount) as min_val,\n    PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY amount) as p25,\n    PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY amount) as median,\n    AVG(amount) as mean,\n    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY amount) as p75,\n    MAX(amount) as max_val,\n    STDDEV(amount) as std_dev\nFROM table_name;\n\n-- Cardinality check (categorical)\nSELECT column_name, COUNT(*) as freq,\n    ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) as pct\nFROM table_name\nGROUP BY column_name\nORDER BY freq DESC;"},{"language":"text","snippet":"Is the value missing?\n├── Is it missing at random (MAR)?\n│   ├── <5% missing → drop rows\n│   ├── 5-20% missing → impute (median for numeric, mode for categorical)\n│   └── >20% missing → flag column as unreliable, note in findings\n├── Is it systematically missing (MNAR)?\n│   └── Investigate WHY. This IS a finding. (e.g., \"Churn field is null for 30% of users = we never tracked it for free tier\")\n└── Is it a duplicate?\n    ├── Exact duplicate → deduplicate, note count\n    └── Near duplicate → investigate, pick logic (latest timestamp? highest confidence?)"},{"language":"text","snippet":"Is this datapoint an outlier?\n├── Is it a data entry error? (negative age, $0 salary) → fix or remove\n├── Is it genuine but extreme? (whale customer, Black Friday spike)\n│   ├── Does it skew the analysis? → segment it out, analyze separately\n│   └── Is it THE story? → highlight it\n└── Not sure → run analysis with AND without it, note the difference"},{"language":"sql","snippet":"-- Time series with period-over-period comparison\nSELECT \n    date_trunc('week', created_at) as period,\n    COUNT(*) as metric,\n    LAG(COUNT(*), 1) OVER (ORDER BY date_trunc('week', created_at)) as prev_period,\n    ROUND(100.0 * (COUNT(*) - LAG(COUNT(*), 1) OVER (ORDER BY date_trunc('week', created_at))) \n        / NULLIF(LAG(COUNT(*), 1) OVER (ORDER BY date_trunc('week', created_at)), 0), 1) as growth_pct\nFROM events\nWHERE created_at >= current_date - interval '90 days'\nGROUP BY 1\nORDER BY 1;"}],"parameters":{},"dependencies":[],"permissions":[],"extractedFiles":[],"languages":["typescript"],"docsSourceLabel":"CLAWHUB","editorialOverview":"Data Analyst — AfrexAI ⚡📊 Data Analyst — AfrexAI ⚡📊 **Transform raw data into decisions. Not just charts — answers.** You are a senior data analyst. Your job isn't to query databases — it's to find the story in the data and tell it so clearly that the next action is obvious. --- Core Philosophy **Data without a decision is decoration.** Every analysis must answer: \"So what?\" → \"Now what?\" → \"How much?\" The DICE framework governs everything:","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":381,"uniquenessScore":66,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T18:22:12.678Z","emptyReason":null},"items":[{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}