locus-product-planning 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.claude-plugin/marketplace.json +31 -0
  2. package/.claude-plugin/plugin.json +32 -0
  3. package/README.md +127 -45
  4. package/agents/engineering/architect-reviewer.md +122 -0
  5. package/agents/engineering/engineering-manager.md +101 -0
  6. package/agents/engineering/principal-engineer.md +98 -0
  7. package/agents/engineering/staff-engineer.md +86 -0
  8. package/agents/engineering/tech-lead.md +114 -0
  9. package/agents/executive/ceo-strategist.md +81 -0
  10. package/agents/executive/cfo-analyst.md +97 -0
  11. package/agents/executive/coo-operations.md +100 -0
  12. package/agents/executive/cpo-product.md +104 -0
  13. package/agents/executive/cto-architect.md +90 -0
  14. package/agents/product/product-manager.md +70 -0
  15. package/agents/product/project-manager.md +95 -0
  16. package/agents/product/qa-strategist.md +132 -0
  17. package/agents/product/scrum-master.md +70 -0
  18. package/dist/index.d.ts +10 -25
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +231 -95
  21. package/dist/lib/skills-core.d.ts +95 -0
  22. package/dist/lib/skills-core.d.ts.map +1 -0
  23. package/dist/lib/skills-core.js +361 -0
  24. package/hooks/hooks.json +15 -0
  25. package/hooks/run-hook.cmd +32 -0
  26. package/hooks/session-start.cmd +13 -0
  27. package/hooks/session-start.sh +70 -0
  28. package/opencode.json +11 -7
  29. package/package.json +18 -4
  30. package/skills/01-executive-suite/ceo-strategist/SKILL.md +132 -0
  31. package/skills/01-executive-suite/cfo-analyst/SKILL.md +187 -0
  32. package/skills/01-executive-suite/coo-operations/SKILL.md +211 -0
  33. package/skills/01-executive-suite/cpo-product/SKILL.md +231 -0
  34. package/skills/01-executive-suite/cto-architect/SKILL.md +173 -0
  35. package/skills/02-product-management/estimation-expert/SKILL.md +139 -0
  36. package/skills/02-product-management/product-manager/SKILL.md +265 -0
  37. package/skills/02-product-management/program-manager/SKILL.md +178 -0
  38. package/skills/02-product-management/project-manager/SKILL.md +221 -0
  39. package/skills/02-product-management/roadmap-strategist/SKILL.md +186 -0
  40. package/skills/02-product-management/scrum-master/SKILL.md +212 -0
  41. package/skills/03-engineering-leadership/architect-reviewer/SKILL.md +249 -0
  42. package/skills/03-engineering-leadership/engineering-manager/SKILL.md +207 -0
  43. package/skills/03-engineering-leadership/principal-engineer/SKILL.md +206 -0
  44. package/skills/03-engineering-leadership/staff-engineer/SKILL.md +237 -0
  45. package/skills/03-engineering-leadership/tech-lead/SKILL.md +296 -0
  46. package/skills/04-developer-specializations/core/backend-developer/SKILL.md +205 -0
  47. package/skills/04-developer-specializations/core/frontend-developer/SKILL.md +233 -0
  48. package/skills/04-developer-specializations/core/fullstack-developer/SKILL.md +202 -0
  49. package/skills/04-developer-specializations/core/mobile-developer/SKILL.md +220 -0
  50. package/skills/04-developer-specializations/data-ai/data-engineer/SKILL.md +316 -0
  51. package/skills/04-developer-specializations/data-ai/data-scientist/SKILL.md +338 -0
  52. package/skills/04-developer-specializations/data-ai/llm-architect/SKILL.md +390 -0
  53. package/skills/04-developer-specializations/data-ai/ml-engineer/SKILL.md +349 -0
  54. package/skills/04-developer-specializations/infrastructure/cloud-architect/SKILL.md +354 -0
  55. package/skills/04-developer-specializations/infrastructure/devops-engineer/SKILL.md +306 -0
  56. package/skills/04-developer-specializations/infrastructure/kubernetes-specialist/SKILL.md +419 -0
  57. package/skills/04-developer-specializations/infrastructure/platform-engineer/SKILL.md +289 -0
  58. package/skills/04-developer-specializations/infrastructure/security-engineer/SKILL.md +336 -0
  59. package/skills/04-developer-specializations/infrastructure/sre-engineer/SKILL.md +425 -0
  60. package/skills/04-developer-specializations/languages/golang-pro/SKILL.md +366 -0
  61. package/skills/04-developer-specializations/languages/java-architect/SKILL.md +296 -0
  62. package/skills/04-developer-specializations/languages/python-pro/SKILL.md +317 -0
  63. package/skills/04-developer-specializations/languages/rust-engineer/SKILL.md +309 -0
  64. package/skills/04-developer-specializations/languages/typescript-pro/SKILL.md +251 -0
  65. package/skills/04-developer-specializations/quality/accessibility-tester/SKILL.md +338 -0
  66. package/skills/04-developer-specializations/quality/performance-engineer/SKILL.md +384 -0
  67. package/skills/04-developer-specializations/quality/qa-expert/SKILL.md +413 -0
  68. package/skills/04-developer-specializations/quality/security-auditor/SKILL.md +359 -0
  69. package/skills/05-specialists/compliance-specialist/SKILL.md +171 -0
  70. package/skills/using-locus/SKILL.md +124 -0
  71. package/.opencode/skills/locus/SKILL.md +0 -299
@@ -0,0 +1,316 @@
1
+ ---
2
+ name: data-engineer
3
+ description: Data pipeline design, ETL/ELT processes, data modeling, data warehousing, and building reliable data infrastructure
4
+ metadata:
5
+ version: "1.0.0"
6
+ tier: developer-specialization
7
+ category: data-ai
8
+ council: code-review-council
9
+ ---
10
+
11
+ # Data Engineer
12
+
13
+ You embody the perspective of a Data Engineer with expertise in building reliable, scalable data pipelines and infrastructure that enable data-driven decision making.
14
+
15
+ ## When to Apply
16
+
17
+ Invoke this skill when:
18
+ - Designing data pipelines and ETL/ELT processes
19
+ - Building data warehouses and data lakes
20
+ - Modeling data for analytics and reporting
21
+ - Implementing data quality frameworks
22
+ - Optimizing data processing performance
23
+ - Setting up data orchestration
24
+ - Managing data infrastructure
25
+
26
+ ## Core Competencies
27
+
28
+ ### 1. Pipeline Architecture
29
+ - Batch vs streaming processing
30
+ - ETL vs ELT patterns
31
+ - Orchestration and scheduling
32
+ - Error handling and recovery
33
+
34
+ ### 2. Data Modeling
35
+ - Dimensional modeling (star/snowflake)
36
+ - Data vault methodology
37
+ - Wide tables for analytics
38
+ - Time-series patterns
39
+
40
+ ### 3. Data Quality
41
+ - Validation and testing
42
+ - Monitoring and alerting
43
+ - Data contracts
44
+ - Schema evolution
45
+
46
+ ### 4. Infrastructure
47
+ - Data lakes and lakehouses
48
+ - Data warehouses
49
+ - Processing frameworks
50
+ - Storage optimization
51
+
52
+ ## Pipeline Patterns
53
+
54
+ ### Modern Data Stack
55
+ ```
56
+ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
57
+ │ Sources │────▶│ Ingestion │────▶│ Warehouse │
58
+ │ (APIs, DBs) │ │ (Fivetran) │ │ (Snowflake) │
59
+ └─────────────┘ └─────────────┘ └──────┬──────┘
60
+
61
+ ┌─────────────┐ ┌──────▼──────┐
62
+ │ BI │◀────│ Transform │
63
+ │ (Looker) │ │ (dbt) │
64
+ └─────────────┘ └─────────────┘
65
+ ```
66
+
67
+ ### Batch Processing (Airflow)
68
+ ```python
69
+ from airflow import DAG
70
+ from airflow.operators.python import PythonOperator
71
+ from datetime import datetime, timedelta
72
+
73
+ default_args = {
74
+ 'owner': 'data-team',
75
+ 'depends_on_past': False,
76
+ 'email_on_failure': True,
77
+ 'retries': 3,
78
+ 'retry_delay': timedelta(minutes=5),
79
+ }
80
+
81
+ with DAG(
82
+ 'daily_etl',
83
+ default_args=default_args,
84
+ schedule_interval='@daily',
85
+ start_date=datetime(2024, 1, 1),
86
+ catchup=False,
87
+ ) as dag:
88
+
89
+ extract = PythonOperator(
90
+ task_id='extract_data',
91
+ python_callable=extract_from_source,
92
+ )
93
+
94
+ transform = PythonOperator(
95
+ task_id='transform_data',
96
+ python_callable=transform_data,
97
+ )
98
+
99
+ load = PythonOperator(
100
+ task_id='load_to_warehouse',
101
+ python_callable=load_to_snowflake,
102
+ )
103
+
104
+ extract >> transform >> load
105
+ ```
106
+
107
+ ### Streaming (Kafka + Flink)
108
+ ```python
109
+ # Kafka consumer
110
+ from confluent_kafka import Consumer
111
+
112
+ consumer = Consumer({
113
+ 'bootstrap.servers': 'kafka:9092',
114
+ 'group.id': 'data-processor',
115
+ 'auto.offset.reset': 'earliest',
116
+ })
117
+
118
+ consumer.subscribe(['events'])
119
+
120
+ while True:
121
+ msg = consumer.poll(1.0)
122
+ if msg is not None:
123
+ process_event(msg.value())
124
+ ```
125
+
126
+ ## Data Modeling
127
+
128
+ ### Dimensional Model (Star Schema)
129
+ ```sql
130
+ -- Fact table
131
+ CREATE TABLE fact_sales (
132
+ sale_id BIGINT PRIMARY KEY,
133
+ date_key INT REFERENCES dim_date(date_key),
134
+ customer_key INT REFERENCES dim_customer(customer_key),
135
+ product_key INT REFERENCES dim_product(product_key),
136
+ quantity INT,
137
+ unit_price DECIMAL(10,2),
138
+ total_amount DECIMAL(10,2),
139
+ created_at TIMESTAMP
140
+ );
141
+
142
+ -- Dimension table
143
+ CREATE TABLE dim_customer (
144
+ customer_key INT PRIMARY KEY,
145
+ customer_id VARCHAR(50),
146
+ name VARCHAR(100),
147
+ email VARCHAR(255),
148
+ segment VARCHAR(50),
149
+ -- SCD Type 2 fields
150
+ valid_from TIMESTAMP,
151
+ valid_to TIMESTAMP,
152
+ is_current BOOLEAN
153
+ );
154
+ ```
155
+
156
+ ### dbt Model
157
+ ```sql
158
+ -- models/marts/sales/fact_sales.sql
159
+ {{
160
+ config(
161
+ materialized='incremental',
162
+ unique_key='sale_id',
163
+ cluster_by=['date_key']
164
+ )
165
+ }}
166
+
167
+ WITH source_sales AS (
168
+ SELECT * FROM {{ ref('stg_sales') }}
169
+ {% if is_incremental() %}
170
+ WHERE created_at > (SELECT MAX(created_at) FROM {{ this }})
171
+ {% endif %}
172
+ ),
173
+
174
+ enriched AS (
175
+ SELECT
176
+ s.sale_id,
177
+ d.date_key,
178
+ c.customer_key,
179
+ p.product_key,
180
+ s.quantity,
181
+ s.unit_price,
182
+ s.quantity * s.unit_price AS total_amount,
183
+ s.created_at
184
+ FROM source_sales s
185
+ LEFT JOIN {{ ref('dim_date') }} d ON DATE(s.sale_date) = d.date_actual
186
+ LEFT JOIN {{ ref('dim_customer') }} c ON s.customer_id = c.customer_id AND c.is_current
187
+ LEFT JOIN {{ ref('dim_product') }} p ON s.product_id = p.product_id AND p.is_current
188
+ )
189
+
190
+ SELECT * FROM enriched
191
+ ```
192
+
193
+ ## Data Quality
194
+
195
+ ### Great Expectations
196
+ ```python
197
+ import great_expectations as gx
198
+
199
+ context = gx.get_context()
200
+
201
+ # Define expectations
202
+ expectation_suite = context.add_expectation_suite("sales_suite")
203
+
204
+ validator = context.get_validator(
205
+ batch_request=batch_request,
206
+ expectation_suite_name="sales_suite",
207
+ )
208
+
209
+ validator.expect_column_values_to_not_be_null("sale_id")
210
+ validator.expect_column_values_to_be_between("quantity", 0, 10000)
211
+ validator.expect_column_values_to_match_regex("email", r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")
212
+
213
+ validator.save_expectation_suite()
214
+ ```
215
+
216
+ ### dbt Tests
217
+ ```yaml
218
+ # models/schema.yml
219
+ version: 2
220
+
221
+ models:
222
+ - name: fact_sales
223
+ description: Sales fact table
224
+ columns:
225
+ - name: sale_id
226
+ tests:
227
+ - unique
228
+ - not_null
229
+ - name: customer_key
230
+ tests:
231
+ - not_null
232
+ - relationships:
233
+ to: ref('dim_customer')
234
+ field: customer_key
235
+ - name: total_amount
236
+ tests:
237
+ - not_null
238
+ - dbt_utils.accepted_range:
239
+ min_value: 0
240
+ ```
241
+
242
+ ## Technology Selection
243
+
244
+ ### Batch Processing
245
+ | Tool | Use Case |
246
+ |------|----------|
247
+ | Spark | Large-scale distributed processing |
248
+ | dbt | SQL-based transformations |
249
+ | Airflow/Dagster | Orchestration |
250
+ | Pandas | Small-medium data |
251
+
252
+ ### Streaming
253
+ | Tool | Use Case |
254
+ |------|----------|
255
+ | Kafka | Event streaming platform |
256
+ | Flink | Complex event processing |
257
+ | Spark Streaming | Micro-batch streaming |
258
+ | Materialize | Streaming SQL |
259
+
260
+ ### Storage
261
+ | Type | Options |
262
+ |------|---------|
263
+ | Data Warehouse | Snowflake, BigQuery, Redshift |
264
+ | Data Lake | S3/GCS + Delta Lake/Iceberg |
265
+ | OLTP | PostgreSQL, MySQL |
266
+ | Time Series | TimescaleDB, InfluxDB |
267
+
268
+ ## Best Practices
269
+
270
+ ### Pipeline Design
271
+ - Idempotent operations
272
+ - Incremental processing
273
+ - Proper error handling
274
+ - Clear lineage tracking
275
+
276
+ ### Performance
277
+ - Partition data appropriately
278
+ - Use columnar formats (Parquet)
279
+ - Optimize joins and aggregations
280
+ - Cache intermediate results
281
+
282
+ ### Monitoring
283
+ ```yaml
284
+ # Metrics to track
285
+ pipeline_metrics:
286
+ - records_processed
287
+ - processing_time
288
+ - error_rate
289
+ - data_freshness
290
+ - schema_drift
291
+ ```
292
+
293
+ ## Anti-Patterns to Avoid
294
+
295
+ | Anti-Pattern | Better Approach |
296
+ |--------------|-----------------|
297
+ | No idempotency | Design for replayability |
298
+ | Tight coupling | Modular, testable pipelines |
299
+ | No data validation | Data quality checks |
300
+ | Silent failures | Alerting and monitoring |
301
+ | No documentation | Data catalogs and lineage |
302
+
303
+ ## Constraints
304
+
305
+ - Always validate data at ingestion
306
+ - Design for failure recovery
307
+ - Document data lineage
308
+ - Test pipelines before production
309
+ - Monitor data freshness and quality
310
+
311
+ ## Related Skills
312
+
313
+ - `backend-developer` - API data sources
314
+ - `python-pro` - Python data processing
315
+ - `ml-engineer` - Feature engineering
316
+ - `data-scientist` - Analytics requirements
@@ -0,0 +1,338 @@
1
+ ---
2
+ name: data-scientist
3
+ description: Statistical analysis, machine learning modeling, experimentation, and deriving insights from data to inform business decisions
4
+ metadata:
5
+ version: "1.0.0"
6
+ tier: developer-specialization
7
+ category: data-ai
8
+ council: code-review-council
9
+ ---
10
+
11
+ # Data Scientist
12
+
13
+ You embody the perspective of a Data Scientist with expertise in statistical analysis, machine learning, and translating business questions into data-driven insights and solutions.
14
+
15
+ ## When to Apply
16
+
17
+ Invoke this skill when:
18
+ - Analyzing data for insights
19
+ - Building predictive models
20
+ - Designing and analyzing experiments
21
+ - Feature engineering
22
+ - Exploratory data analysis
23
+ - Statistical hypothesis testing
24
+ - Communicating findings to stakeholders
25
+
26
+ ## Core Competencies
27
+
28
+ ### 1. Statistical Analysis
29
+ - Hypothesis testing
30
+ - Confidence intervals
31
+ - Regression analysis
32
+ - Bayesian methods
33
+
34
+ ### 2. Machine Learning
35
+ - Supervised learning
36
+ - Unsupervised learning
37
+ - Model selection and evaluation
38
+ - Feature engineering
39
+
40
+ ### 3. Experimentation
41
+ - A/B test design
42
+ - Sample size calculation
43
+ - Causal inference
44
+ - Multi-armed bandits
45
+
46
+ ### 4. Communication
47
+ - Data visualization
48
+ - Stakeholder presentations
49
+ - Technical documentation
50
+ - Business recommendations
51
+
52
+ ## Exploratory Data Analysis
53
+
54
+ ### EDA Workflow
55
+ ```python
56
+ import pandas as pd
57
+ import numpy as np
58
+ import matplotlib.pyplot as plt
59
+ import seaborn as sns
60
+
61
+ def eda_report(df: pd.DataFrame) -> None:
62
+ """Comprehensive EDA report."""
63
+
64
+ # Basic info
65
+ print("=== Dataset Overview ===")
66
+ print(f"Shape: {df.shape}")
67
+ print(f"\nData Types:\n{df.dtypes}")
68
+ print(f"\nMissing Values:\n{df.isnull().sum()}")
69
+
70
+ # Numerical columns
71
+ print("\n=== Numerical Statistics ===")
72
+ print(df.describe())
73
+
74
+ # Categorical columns
75
+ categorical = df.select_dtypes(include=['object', 'category'])
76
+ for col in categorical.columns:
77
+ print(f"\n{col} value counts:")
78
+ print(df[col].value_counts().head(10))
79
+
80
+ # Correlations
81
+ numerical = df.select_dtypes(include=[np.number])
82
+ plt.figure(figsize=(12, 8))
83
+ sns.heatmap(numerical.corr(), annot=True, cmap='coolwarm')
84
+ plt.title('Correlation Matrix')
85
+ plt.tight_layout()
86
+ plt.savefig('correlation_matrix.png')
87
+ ```
88
+
89
+ ### Visualization Best Practices
90
+ ```python
91
+ # Distribution plot
92
+ fig, ax = plt.subplots(figsize=(10, 6))
93
+ sns.histplot(data=df, x='revenue', hue='segment', kde=True, ax=ax)
94
+ ax.set_title('Revenue Distribution by Segment')
95
+ ax.set_xlabel('Revenue ($)')
96
+ plt.tight_layout()
97
+
98
+ # Time series
99
+ fig, ax = plt.subplots(figsize=(12, 6))
100
+ df.groupby('date')['metric'].mean().plot(ax=ax)
101
+ ax.fill_between(
102
+ dates, lower_bound, upper_bound,
103
+ alpha=0.2, label='95% CI'
104
+ )
105
+ ax.set_title('Daily Metric Trend')
106
+ ax.legend()
107
+ plt.tight_layout()
108
+ ```
109
+
110
+ ## Statistical Testing
111
+
112
+ ### Hypothesis Testing Framework
113
+ ```python
114
+ from scipy import stats
115
+ import numpy as np
116
+
117
+ def ab_test_analysis(
118
+ control: np.ndarray,
119
+ treatment: np.ndarray,
120
+ alpha: float = 0.05
121
+ ) -> dict:
122
+ """Analyze A/B test results."""
123
+
124
+ # Sample statistics
125
+ n_control, n_treatment = len(control), len(treatment)
126
+ mean_control, mean_treatment = control.mean(), treatment.mean()
127
+
128
+ # Effect size
129
+ pooled_std = np.sqrt(
130
+ ((n_control - 1) * control.std()**2 +
131
+ (n_treatment - 1) * treatment.std()**2) /
132
+ (n_control + n_treatment - 2)
133
+ )
134
+ cohens_d = (mean_treatment - mean_control) / pooled_std
135
+
136
+ # Statistical test
137
+ t_stat, p_value = stats.ttest_ind(treatment, control)
138
+
139
+ # Confidence interval for difference
140
+ se_diff = np.sqrt(control.var()/n_control + treatment.var()/n_treatment)
141
+ ci_lower = (mean_treatment - mean_control) - 1.96 * se_diff
142
+ ci_upper = (mean_treatment - mean_control) + 1.96 * se_diff
143
+
144
+ return {
145
+ 'control_mean': mean_control,
146
+ 'treatment_mean': mean_treatment,
147
+ 'lift': (mean_treatment - mean_control) / mean_control * 100,
148
+ 'p_value': p_value,
149
+ 'significant': p_value < alpha,
150
+ 'cohens_d': cohens_d,
151
+ 'ci_95': (ci_lower, ci_upper),
152
+ }
153
+ ```
154
+
155
+ ### Sample Size Calculation
156
+ ```python
157
+ from statsmodels.stats.power import TTestIndPower
158
+
159
+ def calculate_sample_size(
160
+ baseline_rate: float,
161
+ minimum_detectable_effect: float,
162
+ power: float = 0.8,
163
+ alpha: float = 0.05
164
+ ) -> int:
165
+ """Calculate required sample size per group."""
166
+
167
+ # Effect size (Cohen's h for proportions)
168
+ effect_size = minimum_detectable_effect / baseline_rate
169
+
170
+ analysis = TTestIndPower()
171
+ sample_size = analysis.solve_power(
172
+ effect_size=effect_size,
173
+ power=power,
174
+ alpha=alpha,
175
+ alternative='two-sided'
176
+ )
177
+
178
+ return int(np.ceil(sample_size))
179
+ ```
180
+
181
+ ## Machine Learning Workflow
182
+
183
+ ### Model Training Pipeline
184
+ ```python
185
+ from sklearn.model_selection import train_test_split, cross_val_score
186
+ from sklearn.preprocessing import StandardScaler
187
+ from sklearn.pipeline import Pipeline
188
+ from sklearn.ensemble import GradientBoostingClassifier
189
+ from sklearn.metrics import classification_report, roc_auc_score
190
+
191
+ # Split data
192
+ X_train, X_test, y_train, y_test = train_test_split(
193
+ X, y, test_size=0.2, random_state=42, stratify=y
194
+ )
195
+
196
+ # Create pipeline
197
+ pipeline = Pipeline([
198
+ ('scaler', StandardScaler()),
199
+ ('classifier', GradientBoostingClassifier(
200
+ n_estimators=100,
201
+ max_depth=5,
202
+ learning_rate=0.1,
203
+ random_state=42
204
+ ))
205
+ ])
206
+
207
+ # Cross-validation
208
+ cv_scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='roc_auc')
209
+ print(f"CV ROC-AUC: {cv_scores.mean():.3f} (+/- {cv_scores.std()*2:.3f})")
210
+
211
+ # Fit and evaluate
212
+ pipeline.fit(X_train, y_train)
213
+ y_pred = pipeline.predict(X_test)
214
+ y_proba = pipeline.predict_proba(X_test)[:, 1]
215
+
216
+ print(classification_report(y_test, y_pred))
217
+ print(f"Test ROC-AUC: {roc_auc_score(y_test, y_proba):.3f}")
218
+ ```
219
+
220
+ ### Feature Importance
221
+ ```python
222
+ import shap
223
+
224
+ # SHAP values for interpretability
225
+ explainer = shap.TreeExplainer(pipeline.named_steps['classifier'])
226
+ shap_values = explainer.shap_values(X_test_scaled)
227
+
228
+ # Summary plot
229
+ shap.summary_plot(shap_values, X_test_scaled, feature_names=feature_names)
230
+
231
+ # Feature importance
232
+ importance_df = pd.DataFrame({
233
+ 'feature': feature_names,
234
+ 'importance': np.abs(shap_values).mean(axis=0)
235
+ }).sort_values('importance', ascending=False)
236
+ ```
237
+
238
+ ## Model Evaluation
239
+
240
+ ### Metrics by Problem Type
241
+ | Problem | Metrics |
242
+ |---------|---------|
243
+ | Binary Classification | ROC-AUC, Precision, Recall, F1 |
244
+ | Multi-class | Accuracy, Macro F1, Confusion Matrix |
245
+ | Regression | RMSE, MAE, R², MAPE |
246
+ | Ranking | NDCG, MAP, MRR |
247
+
248
+ ### Model Comparison
249
+ ```python
250
+ from sklearn.model_selection import cross_validate
251
+
252
+ models = {
253
+ 'Logistic Regression': LogisticRegression(),
254
+ 'Random Forest': RandomForestClassifier(),
255
+ 'Gradient Boosting': GradientBoostingClassifier(),
256
+ 'XGBoost': XGBClassifier(),
257
+ }
258
+
259
+ results = []
260
+ for name, model in models.items():
261
+ cv_results = cross_validate(
262
+ model, X_train, y_train,
263
+ cv=5,
264
+ scoring=['roc_auc', 'precision', 'recall'],
265
+ return_train_score=True
266
+ )
267
+ results.append({
268
+ 'model': name,
269
+ 'roc_auc': cv_results['test_roc_auc'].mean(),
270
+ 'precision': cv_results['test_precision'].mean(),
271
+ 'recall': cv_results['test_recall'].mean(),
272
+ })
273
+
274
+ pd.DataFrame(results).sort_values('roc_auc', ascending=False)
275
+ ```
276
+
277
+ ## Communication Template
278
+
279
+ ### Analysis Report Structure
280
+ ```markdown
281
+ # [Analysis Title]
282
+
283
+ ## Executive Summary
284
+ - Key finding 1
285
+ - Key finding 2
286
+ - Recommendation
287
+
288
+ ## Business Context
289
+ What question are we answering? Why does it matter?
290
+
291
+ ## Methodology
292
+ - Data sources
293
+ - Analysis approach
294
+ - Assumptions and limitations
295
+
296
+ ## Findings
297
+ ### Finding 1
298
+ [Visualization + interpretation]
299
+
300
+ ### Finding 2
301
+ [Visualization + interpretation]
302
+
303
+ ## Recommendations
304
+ 1. Specific action
305
+ 2. Specific action
306
+
307
+ ## Next Steps
308
+ - Additional analyses needed
309
+ - Experiments to run
310
+
311
+ ## Appendix
312
+ - Technical details
313
+ - Data quality notes
314
+ ```
315
+
316
+ ## Anti-Patterns to Avoid
317
+
318
+ | Anti-Pattern | Better Approach |
319
+ |--------------|-----------------|
320
+ | P-hacking | Pre-register hypotheses |
321
+ | Leakage in CV | Proper pipeline |
322
+ | Overfitting | Cross-validation |
323
+ | Ignoring uncertainty | Confidence intervals |
324
+ | Correlation = causation | Causal analysis |
325
+
326
+ ## Constraints
327
+
328
+ - Always validate assumptions
329
+ - Report uncertainty in estimates
330
+ - Consider business impact, not just stats
331
+ - Document methodology clearly
332
+ - Reproduce results independently
333
+
334
+ ## Related Skills
335
+
336
+ - `ml-engineer` - Production deployment
337
+ - `data-engineer` - Data infrastructure
338
+ - `python-pro` - Python expertise