---
id: wiki-2026-0508-reports
title: Reports
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Reporting, Data Reports, Dashboards]
duplicate_of: none
source_trust_level: A
confidence_score: 0.85
verification_status: applied
tags: [reporting, analytics, data, visualization]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: Python
  framework: pandas/Quarto/Streamlit
---

# Reports

## 매 한 줄
> **"매 raw data 매 actionable narrative로"**. 매 reporting은 매 ETL → metric → visualization → narrative pipeline, 매 2026 modern stack은 매 dbt + Quarto/Streamlit/Evidence + LLM-generated narrative + scheduled delivery (Airflow/Dagster) — 매 BI dashboard와 narrative document 매 hybrid가 매 norm.

## 매 핵심

### 매 종류
- **Operational**: real-time KPIs, ops dashboards.
- **Analytical**: deep-dive ad-hoc, hypothesis-driven.
- **Strategic**: monthly/quarterly board, narrative + chart.
- **Regulatory**: audit, compliance (SOX, GDPR).
- **ML model card / eval doc**: 2026 standard for model release.

### 매 design principles
- One question per chart.
- Pre-attentive attributes (color, position) for primary signal.
- Annotate insight, not just data.
- Reproducibility: code + data version pinned.
- Accessibility: alt text, color-blind palette.

### 매 modern pipeline (2026)
1. dbt models (silver → gold tables).
2. Metric layer (Cube / dbt Semantic).
3. Quarto / Evidence / Streamlit render.
4. LLM (Claude Opus 4.7) writes narrative from metrics.
5. Schedule via Dagster, deliver via Slack/email.

### 매 응용
1. Executive monthly review.
2. Marketing campaign retrospective.
3. ML model release card.
4. Financial close package.
5. Customer success QBR.

## 💻 패턴

### Quarto parametrized doc
```python
# ---
# title: "Sales {{ region }} {{ month }}"
# format: pdf
# params:
#   region: NA
#   month: 2026-04
# ---
import pandas as pd
df = pd.read_parquet(f"s3://docs/sales/{params['region']}/{params['month']}.parquet")
```
```bash
quarto render doc.qmd -P region:NA -P month:2026-04
```

### Streamlit dashboard
```python
import streamlit as st, pandas as pd, plotly.express as px
st.set_page_config(page_title="Sales", layout="wide")
region = st.sidebar.selectbox("Region", ["NA","EU","APAC"])
df = load_sales(region)
c1, c2, c3 = st.columns(3)
c1.metric("Revenue", f"${df.rev.sum()/1e6:.1f}M", f"{df.rev_yoy.iloc[-1]:.1%}")
c2.metric("Orders", f"{len(df):,}")
c3.metric("AOV", f"${df.rev.sum()/len(df):.0f}")
st.plotly_chart(px.line(df, x='date', y='rev'), use_container_width=True)
```

### LLM narrative from metrics
```python
def generate_narrative(metrics, llm):
    prompt = f"""You are a senior analyst. Given metrics:
{json.dumps(metrics, indent=2)}
Write a 200-word executive summary covering: trend, drivers, risks, recommended action.
Use precise numbers and avoid filler."""
    return llm(prompt, max_tokens=400)
```

### Scheduled delivery via Dagster
```python
from dagster import asset, ScheduleDefinition, define_asset_job

@asset
def monthly_sales_doc():
    df = extract_sales()
    metrics = compute_metrics(df)
    narrative = generate_narrative(metrics, claude)
    render_quarto("template.qmd", metrics, narrative, out="doc.pdf")
    slack_post("#exec", "doc.pdf")

monthly_job = define_asset_job("monthly_sales", selection=[monthly_sales_doc])
ScheduleDefinition(job=monthly_job, cron_schedule="0 9 1 * *")
```

### Pandas → multi-sheet Excel
```python
with pd.ExcelWriter("Q1.xlsx", engine="xlsxwriter") as w:
    summary.to_excel(w, sheet_name="Summary", index=False)
    by_region.to_excel(w, sheet_name="By Region")
    detail.to_excel(w, sheet_name="Detail")
    wb = w.book
    fmt = wb.add_format({"num_format": "$#,##0"})
    w.sheets["Summary"].set_column("B:B", 12, fmt)
```

### Model card (2026 ML release)
```python
def model_card(model, eval_results, dataset_stats):
    return f"""# Model Card: {model.name}
## Eval
- Accuracy: {eval_results['acc']:.3f}
- Subgroup parity: {eval_results['parity']:.3f}
## Data
- Train n={dataset_stats['n_train']:,}, Test n={dataset_stats['n_test']:,}
## Limitations
{model.known_limits}
## License
{model.license}"""
```

## 매 결정 기준
| 상황 | Approach |
|---|---|
| Real-time ops | Grafana / Streamlit |
| Static periodic narrative | Quarto / Evidence |
| Interactive exec dashboard | Looker / Tableau / Hex |
| One-off ad-hoc | Jupyter + nbconvert |
| ML release | Model card (HF) + eval suite |
| Regulatory | Templated PDF, version-locked |

**기본값**: 매 narrative output = Quarto + LLM summary; 매 dashboard = Streamlit / Hex; 매 ML = HF model card.

## 🔗 Graph
- 변형: [[Dashboards]]
- Adjacent: [[dbt]] · [[Dagster]]

## 🤖 LLM 활용
**언제**: narrative drafting from metrics, anomaly explanation, exec summary, automated commentary.
**언제 X**: 매 numeric computation 자체 (SQL/pandas 매 사용), 매 number-confabulation risk.

## ❌ 안티패턴
- **Chart junk**: 매 3D pie / decorative gradients — 매 remove.
- **No annotation**: 매 reader가 매 insight 매 직접 찾아야 함.
- **LLM hallucinated numbers**: 매 numbers 매 ground in actual data, never let LLM invent.
- **Stale data**: 매 timestamp 매 명시 X — 매 trust 매 erosion.
- **Single-channel delivery**: 매 PDF only — 매 Slack/email + dashboard 매 multi-channel.
- **No versioning**: 매 reproducibility 매 lost — git tag + data snapshot.

## 🧪 검증 / 중복
- Verified (Tufte "Visual Display", Few "Information Dashboard Design", Quarto/Hex 2026 docs).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — modern reporting stack with LLM narrative |