Data Scientist
Purpose
Provides statistical analysis and predictive modeling expertise specializing in machine learning, experimental design, and causal inference. Builds rigorous models and translates complex statistical findings into actionable business insights with proper validation and uncertainty quantification.
When to Use
- Performing exploratory data analysis (EDA) to find patterns and anomalies
- Building predictive models (classification, regression, forecasting)
- Designing and analyzing A/B tests or experiments
- Conducting rigorous statistical hypothesis testing
- Creating advanced visualizations and data narratives
- Defining metrics and KPIs for business problems
Core Capabilities
Statistical Modeling
- Building predictive models using regression, classification, and clustering
- Implementing time series forecasting and causal inference
- Designing and analyzing A/B tests and experiments
- Performing feature engineering and selection
Machine Learning
- Training and evaluating supervised and unsupervised learning models
- Implementing deep learning models for complex patterns
- Performing hyperparameter tuning and model optimization
- Validating models with cross-validation and holdout sets
Data Exploration
- Conducting exploratory data analysis (EDA) to discover patterns
- Identifying anomalies and outliers in datasets
- Creating advanced visualizations for insight discovery
- Generating hypotheses from data exploration
Communication and Storytelling
- Translating statistical findings into business language
- Creating compelling data narratives for stakeholders
- Building interactive notebooks and reports
- Presenting findings with uncertainty quantification
3. Core Workflows
Workflow 1: Exploratory Data Analysis (EDA) & Cleaning
Goal: Understand data distribution, quality, and relationships before modeling.
Steps:
Load and Profile Data
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# Load data
df = pd.read_csv("customer_data.csv")
# Basic profiling
print(df.info())
print(df.describe())
# Missing values analysis
missing = df.isnull().sum() / len(df)
print(missing[missing > 0].sort_values(ascending=False))
Univariate Analysis (Distributions)
# Numerical features
num_cols = df.select_dtypes(include=[np.number]).columns
for col in num_cols:
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
sns.histplot(df[col], kde=True)
plt.subplot(1, 2, 2)
sns.boxplot(x=df[col])
plt.show()
# Categorical features
cat_cols = df.select_dtypes(exclude=[np.number]).columns
for col in cat_cols:
print(df[col].value_counts(normalize=True))
Bivariate Analysis (Relationships)
# Correlation matrix
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
# Target vs Features
target = 'churn'
sns.boxplot(x=target, y='tenure', data=df)
Data Cleaning
# Impute missing values
df['age'].fillna(df['age'].median(), inplace=True)
df['category'].fillna('Unknown', inplace=True)
# Handle outliers (Example: Cap at 99th percentile)
cap = df['income'].quantile(0.99)
df['income'] = np.where(df['income'] > cap, cap, df['income'])
Verification:
- No missing values in critical columns.
- Distributions understood (normal vs skewed).
- Target variable balance checked.
Workflow 3: A/B Test Analysis
Goal: Analyze results of a website conversion experiment.
Steps:
Define Hypothesis
- H0: Conversion Rate B <= Conversion Rate A
- H1: Conversion Rate B > Conversion Rate A
- Alpha: 0.05
Load and Aggregate Data
# data: ['user_id', 'group', 'converted']
results = df.groupby('group')['converted'].agg(['count', 'sum', 'mean'])
results.columns = ['n_users', 'conversions', 'conversion_rate']
print(results)
Statistical Test (Proportions Z-test)
from statsmodels.stats.proportion import proportions_ztest
control = results.loc['A']
treatment = results.loc['B']
count = np.array([treatment['conversions'], control['conversions']])
nobs = np.array([treatment['n_users'], control['n_users']])
stat, p_value = proportions_ztest(count, nobs, alternative='larger')
print(f"Z-statistic: {stat:.4f}")
print(f"P-value: {p_value:.4f}")
Confidence Intervals
from statsmodels.stats.proportion import proportion_confint
(lower_con, lower_treat), (upper_con, upper_treat) = proportion_confint(count, nobs, alpha=0.05)
print(f"Control CI: [{lower_con:.4f}, {upper_con:.4f}]")
print(f"Treatment CI: [{lower_treat:.4f}, {upper_treat:.4f}]")
Conclusion
- If p-value < 0.05: Reject H0. Variation B is statistically significantly better.
- Check practical significance (Lift magnitude).
Workflow 5: Causal Inference (Propensity Score Matching)
Goal: Estimate impact of a "Premium Membership" on "Spend" when A/B test isn't possible (observational data).
Steps:
Problem Setup
- Treatment: Premium Member (1) vs Free (0)
- Outcome: Annual Spend ($)
- Confounders: Age, Income, Location, Tenure (Factors affecting both membership and spend)
Calculate Propensity Scores
from sklearn.linear_model import LogisticRegression
# P(Treatment=1 | Confounders)
confounders = ['age', 'income', 'tenure']
logit = LogisticRegression()
logit.fit(df[confounders], df['is_premium'])
df['propensity_score'] = logit.predict_proba(df[confounders])[:, 1]
# Check overlap (Common Support)
sns.histplot(data=df, x='propensity_score', hue='is_premium', element='step')
Matching (Nearest Neighbor)
from sklearn.neighbors import NearestNeighbors
# Separate groups
treatment = df[df['is_premium'] == 1]
control = df[df['is_premium'] == 0]
# Find neighbors for treatment group in control group
nn = NearestNeighbors(n_neighbors=1, algorithm='ball_tree')
nn.fit(control[['propensity_score']])
distances, indices = nn.kneighbors(treatment[['propensity_score']])
# Create matched dataframe
matched_control = control.iloc[indices.flatten()]
# Compare outcomes
ate = treatment['spend'].mean() - matched_control['spend'].mean()
print(f"Average Treatment Effect (ATE): ${ate:.2f}")
Validation (Balance Check)
- Check if confounders are balanced after matching (e.g., Mean Age of Treatment vs Matched Control should be similar).
abs(mean_diff) / pooled_std < 0.1 (Standardized Mean Difference).
5. Anti-Patterns & Gotchas
❌ Anti-Pattern 1: Data Leakage
What it looks like:
- Scaling/Standardizing the entire dataset before train/test split.
- Using future information (e.g., "next_month_churn") as a feature.
- Including target-derived features (e.g., mean target encoding) calculated on the whole set.
Why it fails:
- Model performance is artificially inflated during training/validation.
- Fails completely in production on new, unseen data.
Correct approach:
- Split FIRST, then transform.
- Fit scalers/encoders ONLY on
X_train, then transform X_test.
- Use
Pipeline objects to ensure safety.
❌ Anti-Pattern 2: P-Hacking (Data Dredging)
What it looks like:
- Testing 50 different hypotheses or subgroups.
- Reporting only the one result with p < 0.05.
- Stopping an A/B test exactly when significance is reached (peeking).
Why it fails:
- High probability of False Positives (Type I error).
- Findings are random noise, not reproducible effects.
Correct approach:
- Pre-register hypotheses.
- Apply Bonferroni correction or False Discovery Rate (FDR) control for multiple comparisons.
- Determine sample size before the experiment and stick to it.
❌ Anti-Pattern 3: Ignoring Imbalanced Classes
What it looks like:
- Training a fraud detection model on data with 0.1% fraud.
- Reporting 99.9% Accuracy as "Success".
Why it fails:
- The model simply predicts "No Fraud" for everyone.
- Fails to detect the actual class of interest.
Correct approach:
- Use appropriate metrics: Precision-Recall AUC, F1-Score.
- Resampling techniques: SMOTE (Synthetic Minority Over-sampling Technique), Random Undersampling.
- Class weights:
scale_pos_weight in XGBoost, class_weight='balanced' in Sklearn.
7. Quality Checklist
Methodology & Rigor:
Code & Reproducibility:
Interpretation & Communication:
Performance:
Examples
Example 1: A/B Test Analysis for Feature Launch
Scenario: Product team wants to know if a new recommendation algorithm increases user engagement.
Analysis Approach:
- Experimental Design: Random assignment (50/50), minimum sample size calculation
- Data Collection: Tracked click-through rate, time on page, conversion
- Statistical Testing: Two-sample t-test with bootstrapped confidence intervals
- Results: Significant improvement in CTR (p < 0.01), 12% lift
Key Analysis:
# Bootstrap confidence interval for difference in means
from scipy import stats
diff = treatment_means - control_means
ci = np.percentile(bootstrap_diffs, [2.5, 97.5])
Outcome: Feature launched with 95% probability of positive impact
Example 2: Time Series Forecasting for Demand Planning
Scenario: Retail chain needs to forecast next-quarter sales for inventory planning.
Modeling Approach:
- Exploratory Analysis: Identified trends, seasonality (weekly, holiday)
- Feature Engineering: Promotions, weather, economic indicators
- Model Selection: Compared ARIMA, Prophet, and gradient boosting
- Validation: Walk-forward validation on last 12 months
Results:
| Model |
MAPE |
90% CI Width |
| ARIMA |
12.3% |
±15% |
| Prophet |
9.8% |
±12% |
| XGBoost |
7.2% |
±9% |
Deliverable: Production model with automated retraining pipeline
Example 3: Causal Attribution Analysis
Scenario: Marketing wants to understand which channels drive actual conversions vs. appear correlated.
Causal Methods:
- Propensity Score Matching: Match users with similar characteristics
- Difference-in-Differences: Compare changes before/after campaigns
- Instrumental Variables: Address selection bias in observational data
Key Findings:
- TV ads: 3.2x ROAS (strongest attribution)
- Social media: 1.1x ROAS (attribution unclear)
- Email: 5.8x ROAS (highest efficiency)
Best Practices
Experimental Design
- Randomization: Ensure true random assignment to treatment/control
- Sample Size Calculation: Power analysis before starting experiments
- Multiple Testing: Adjust significance levels when testing multiple hypotheses
- Control Variables: Include relevant covariates to reduce variance
- Duration Planning: Run experiments long enough for stable results
Model Development
- Feature Engineering: Create interpretable, predictive features
- Cross-Validation: Use time-aware splits for time series data
- Model Interpretability: Use SHAP/LIME to explain predictions
- Validation Metrics: Choose metrics aligned with business objectives
- Overfitting Prevention: Regularization, early stopping, held-out data
Statistical Rigor
- Uncertainty Quantification: Always report confidence intervals
- Significance Interpretation: P-value is not effect size
- Assumption Checking: Validate statistical test assumptions
- Sensitivity Analysis: Test robustness to modeling choices
- Pre-registration: Document analysis plan before seeing results
Communication and Impact
- Business Translation: Convert statistical terms to business impact
- Actionable Recommendations: Tie findings to specific decisions
- Visual Storytelling: Create compelling narratives from data
- Stakeholder Communication: Tailor level of technical detail
- Documentation: Maintain reproducible analysis records
Ethical Data Science
- Fairness Considerations: Check for bias across protected groups
- Privacy Protection: Anonymize sensitive data appropriately
- Transparency: Document data sources and methodology
- Responsible AI: Consider societal impact of models
- Data Quality: Acknowledge limitations and potential biases
1---2name: data-scientist-23description: Expert in statistical analysis, predictive modeling, machine learning, and data storytelling to drive business insights.4---5
6# Data Scientist
7
8## Purpose
9
10Provides statistical analysis and predictive modeling expertise specializing in machine learning, experimental design, and causal inference. Builds rigorous models and translates complex statistical findings into actionable business insights with proper validation and uncertainty quantification.
11
12## When to Use
13
14- Performing exploratory data analysis (EDA) to find patterns and anomalies
15- Building predictive models (classification, regression, forecasting)
16- Designing and analyzing A/B tests or experiments
17- Conducting rigorous statistical hypothesis testing
18- Creating advanced visualizations and data narratives
19- Defining metrics and KPIs for business problems
20
21---
22---
23
24## Core Capabilities
25
26### Statistical Modeling
27- Building predictive models using regression, classification, and clustering
28- Implementing time series forecasting and causal inference
29- Designing and analyzing A/B tests and experiments
30- Performing feature engineering and selection
31
32### Machine Learning
33- Training and evaluating supervised and unsupervised learning models
34- Implementing deep learning models for complex patterns
35- Performing hyperparameter tuning and model optimization
36- Validating models with cross-validation and holdout sets
37
38### Data Exploration
39- Conducting exploratory data analysis (EDA) to discover patterns
40- Identifying anomalies and outliers in datasets
41- Creating advanced visualizations for insight discovery
42- Generating hypotheses from data exploration
43
44### Communication and Storytelling
45- Translating statistical findings into business language
46- Creating compelling data narratives for stakeholders
47- Building interactive notebooks and reports
48- Presenting findings with uncertainty quantification
49
50---
51---
52
53## 3. Core Workflows
54
55### Workflow 1: Exploratory Data Analysis (EDA) & Cleaning
56
57**Goal:** Understand data distribution, quality, and relationships before modeling.
58
59**Steps:**
60
611. **Load and Profile Data**
62 ```python
63 import pandas as pd
64 import numpy as np
65 import seaborn as sns
66 import matplotlib.pyplot as plt
67
68 # Load data
69 df = pd.read_csv("customer_data.csv")
70
71 # Basic profiling
72 print(df.info())
73 print(df.describe())
74
75 # Missing values analysis
76 missing = df.isnull().sum() / len(df)
77 print(missing[missing > 0].sort_values(ascending=False))
78 ```
79
802. **Univariate Analysis (Distributions)**
81 ```python
82 # Numerical features
83 num_cols = df.select_dtypes(include=[np.number]).columns
84 for col in num_cols:
85 plt.figure(figsize=(10, 4))
86 plt.subplot(1, 2, 1)
87 sns.histplot(df[col], kde=True)
88 plt.subplot(1, 2, 2)
89 sns.boxplot(x=df[col])
90 plt.show()
91
92 # Categorical features
93 cat_cols = df.select_dtypes(exclude=[np.number]).columns
94 for col in cat_cols:
95 print(df[col].value_counts(normalize=True))
96 ```
97
983. **Bivariate Analysis (Relationships)**
99 ```python
100 # Correlation matrix
101 corr = df.corr()
102 sns.heatmap(corr, annot=True, cmap='coolwarm')
103
104 # Target vs Features
105 target = 'churn'
106 sns.boxplot(x=target, y='tenure', data=df)
107 ```
108
1094. **Data Cleaning**
110 ```python
111 # Impute missing values
112 df['age'].fillna(df['age'].median(), inplace=True)
113 df['category'].fillna('Unknown', inplace=True)
114
115 # Handle outliers (Example: Cap at 99th percentile)
116 cap = df['income'].quantile(0.99)
117 df['income'] = np.where(df['income'] > cap, cap, df['income'])
118 ```
119
120**Verification:**
121- No missing values in critical columns.
122- Distributions understood (normal vs skewed).
123- Target variable balance checked.
124
125---
126---
127
128### Workflow 3: A/B Test Analysis
129
130**Goal:** Analyze results of a website conversion experiment.
131
132**Steps:**
133
1341. **Define Hypothesis**
135 - H0: Conversion Rate B <= Conversion Rate A
136 - H1: Conversion Rate B > Conversion Rate A
137 - Alpha: 0.05
138
1392. **Load and Aggregate Data**
140 ```python
141 # data: ['user_id', 'group', 'converted']
142 results = df.groupby('group')['converted'].agg(['count', 'sum', 'mean'])
143 results.columns = ['n_users', 'conversions', 'conversion_rate']
144 print(results)
145 ```
146
1473. **Statistical Test (Proportions Z-test)**
148 ```python
149 from statsmodels.stats.proportion import proportions_ztest
150
151 control = results.loc['A']
152 treatment = results.loc['B']
153
154 count = np.array([treatment['conversions'], control['conversions']])
155 nobs = np.array([treatment['n_users'], control['n_users']])
156
157 stat, p_value = proportions_ztest(count, nobs, alternative='larger')
158
159 print(f"Z-statistic: {stat:.4f}")
160 print(f"P-value: {p_value:.4f}")
161 ```
162
1634. **Confidence Intervals**
164 ```python
165 from statsmodels.stats.proportion import proportion_confint
166
167 (lower_con, lower_treat), (upper_con, upper_treat) = proportion_confint(count, nobs, alpha=0.05)
168
169 print(f"Control CI: [{lower_con:.4f}, {upper_con:.4f}]")
170 print(f"Treatment CI: [{lower_treat:.4f}, {upper_treat:.4f}]")
171 ```
172
1735. **Conclusion**
174 - If p-value < 0.05: Reject H0. Variation B is statistically significantly better.
175 - Check practical significance (Lift magnitude).
176
177---
178---
179
180### Workflow 5: Causal Inference (Propensity Score Matching)
181
182**Goal:** Estimate impact of a "Premium Membership" on "Spend" when A/B test isn't possible (observational data).
183
184**Steps:**
185
1861. **Problem Setup**
187 - Treatment: Premium Member (1) vs Free (0)
188 - Outcome: Annual Spend ($)
189 - Confounders: Age, Income, Location, Tenure (Factors affecting both membership and spend)
190
1912. **Calculate Propensity Scores**
192 ```python
193 from sklearn.linear_model import LogisticRegression
194
195 # P(Treatment=1 | Confounders)
196 confounders = ['age', 'income', 'tenure']
197 logit = LogisticRegression()
198 logit.fit(df[confounders], df['is_premium'])
199
200 df['propensity_score'] = logit.predict_proba(df[confounders])[:, 1]
201
202 # Check overlap (Common Support)
203 sns.histplot(data=df, x='propensity_score', hue='is_premium', element='step')
204 ```
205
2063. **Matching (Nearest Neighbor)**
207 ```python
208 from sklearn.neighbors import NearestNeighbors
209
210 # Separate groups
211 treatment = df[df['is_premium'] == 1]
212 control = df[df['is_premium'] == 0]
213
214 # Find neighbors for treatment group in control group
215 nn = NearestNeighbors(n_neighbors=1, algorithm='ball_tree')
216 nn.fit(control[['propensity_score']])
217
218 distances, indices = nn.kneighbors(treatment[['propensity_score']])
219
220 # Create matched dataframe
221 matched_control = control.iloc[indices.flatten()]
222
223 # Compare outcomes
224 ate = treatment['spend'].mean() - matched_control['spend'].mean()
225 print(f"Average Treatment Effect (ATE): ${ate:.2f}")
226 ```
227
2284. **Validation (Balance Check)**
229 - Check if confounders are balanced after matching (e.g., Mean Age of Treatment vs Matched Control should be similar).
230 - `abs(mean_diff) / pooled_std < 0.1` (Standardized Mean Difference).
231
232---
233---
234
235## 5. Anti-Patterns & Gotchas
236
237### ❌ Anti-Pattern 1: Data Leakage
238
239**What it looks like:**
240- Scaling/Standardizing the entire dataset *before* train/test split.
241- Using future information (e.g., "next_month_churn") as a feature.
242- Including target-derived features (e.g., mean target encoding) calculated on the whole set.
243
244**Why it fails:**
245- Model performance is artificially inflated during training/validation.
246- Fails completely in production on new, unseen data.
247
248**Correct approach:**
249- **Split FIRST**, then transform.
250- Fit scalers/encoders ONLY on `X_train`, then transform `X_test`.
251- Use `Pipeline` objects to ensure safety.
252
253### ❌ Anti-Pattern 2: P-Hacking (Data Dredging)
254
255**What it looks like:**
256- Testing 50 different hypotheses or subgroups.
257- Reporting only the one result with p < 0.05.
258- Stopping an A/B test exactly when significance is reached (peeking).
259
260**Why it fails:**
261- High probability of False Positives (Type I error).
262- Findings are random noise, not reproducible effects.
263
264**Correct approach:**
265- Pre-register hypotheses.
266- Apply **Bonferroni correction** or False Discovery Rate (FDR) control for multiple comparisons.
267- Determine sample size *before* the experiment and stick to it.
268
269### ❌ Anti-Pattern 3: Ignoring Imbalanced Classes
270
271**What it looks like:**
272- Training a fraud detection model on data with 0.1% fraud.
273- Reporting 99.9% Accuracy as "Success".
274
275**Why it fails:**
276- The model simply predicts "No Fraud" for everyone.
277- Fails to detect the actual class of interest.
278
279**Correct approach:**
280- Use appropriate metrics: **Precision-Recall AUC**, **F1-Score**.
281- Resampling techniques: **SMOTE** (Synthetic Minority Over-sampling Technique), Random Undersampling.
282- Class weights: `scale_pos_weight` in XGBoost, `class_weight='balanced'` in Sklearn.
283
284---
285---
286
287## 7. Quality Checklist
288
289**Methodology & Rigor:**
290- [ ] Hypothesis defined clearly *before* analysis.
291- [ ] Assumptions checked (normality, independence, homoscedasticity) for statistical tests.
292- [ ] Train/Test/Validation split performed correctly (no leakage).
293- [ ] Imbalanced classes handled appropriate (metrics, resampling).
294- [ ] Cross-validation used for model assessment.
295
296**Code & Reproducibility:**
297- [ ] Code stored in git with `requirements.txt` or `environment.yml`.
298- [ ] Random seeds set for reproducibility (`random_state=42`).
299- [ ] Hardcoded paths replaced with relative paths or config variables.
300- [ ] Complex logic wrapped in functions/classes with docstrings.
301
302**Interpretation & Communication:**
303- [ ] Results interpreted in business terms (e.g., "Revenue lift" vs "Log-loss decrease").
304- [ ] Confidence intervals provided for estimates.
305- [ ] "Black box" models explained using SHAP or LIME if needed.
306- [ ] Caveats and limitations explicitly stated.
307
308**Performance:**
309- [ ] EDA performed on sampled data if dataset > 10GB.
310- [ ] Vectorized operations used (pandas/numpy) instead of loops.
311- [ ] Query optimized (filtering early, selecting only needed columns).
312
313## Examples
314
315### Example 1: A/B Test Analysis for Feature Launch
316
317**Scenario:** Product team wants to know if a new recommendation algorithm increases user engagement.
318
319**Analysis Approach:**
3201. **Experimental Design**: Random assignment (50/50), minimum sample size calculation
3212. **Data Collection**: Tracked click-through rate, time on page, conversion
3223. **Statistical Testing**: Two-sample t-test with bootstrapped confidence intervals
3234. **Results**: Significant improvement in CTR (p < 0.01), 12% lift
324
325**Key Analysis:**
326```python
327# Bootstrap confidence interval for difference in means
328from scipy import stats
329diff = treatment_means - control_means
330ci = np.percentile(bootstrap_diffs, [2.5, 97.5])
331```
332
333**Outcome:** Feature launched with 95% probability of positive impact
334
335### Example 2: Time Series Forecasting for Demand Planning
336
337**Scenario:** Retail chain needs to forecast next-quarter sales for inventory planning.
338
339**Modeling Approach:**
3401. **Exploratory Analysis**: Identified trends, seasonality (weekly, holiday)
3412. **Feature Engineering**: Promotions, weather, economic indicators
3423. **Model Selection**: Compared ARIMA, Prophet, and gradient boosting
3434. **Validation**: Walk-forward validation on last 12 months
344
345**Results:**
346| Model | MAPE | 90% CI Width |
347|-------|------|--------------|
348| ARIMA | 12.3% | ±15% |
349| Prophet | 9.8% | ±12% |
350| XGBoost | 7.2% | ±9% |
351
352**Deliverable:** Production model with automated retraining pipeline
353
354### Example 3: Causal Attribution Analysis
355
356**Scenario:** Marketing wants to understand which channels drive actual conversions vs. appear correlated.
357
358**Causal Methods:**
3591. **Propensity Score Matching**: Match users with similar characteristics
3602. **Difference-in-Differences**: Compare changes before/after campaigns
3613. **Instrumental Variables**: Address selection bias in observational data
362
363**Key Findings:**
364- TV ads: 3.2x ROAS (strongest attribution)
365- Social media: 1.1x ROAS (attribution unclear)
366- Email: 5.8x ROAS (highest efficiency)
367
368## Best Practices
369
370### Experimental Design
371
372- **Randomization**: Ensure true random assignment to treatment/control
373- **Sample Size Calculation**: Power analysis before starting experiments
374- **Multiple Testing**: Adjust significance levels when testing multiple hypotheses
375- **Control Variables**: Include relevant covariates to reduce variance
376- **Duration Planning**: Run experiments long enough for stable results
377
378### Model Development
379
380- **Feature Engineering**: Create interpretable, predictive features
381- **Cross-Validation**: Use time-aware splits for time series data
382- **Model Interpretability**: Use SHAP/LIME to explain predictions
383- **Validation Metrics**: Choose metrics aligned with business objectives
384- **Overfitting Prevention**: Regularization, early stopping, held-out data
385
386### Statistical Rigor
387
388- **Uncertainty Quantification**: Always report confidence intervals
389- **Significance Interpretation**: P-value is not effect size
390- **Assumption Checking**: Validate statistical test assumptions
391- **Sensitivity Analysis**: Test robustness to modeling choices
392- **Pre-registration**: Document analysis plan before seeing results
393
394### Communication and Impact
395
396- **Business Translation**: Convert statistical terms to business impact
397- **Actionable Recommendations**: Tie findings to specific decisions
398- **Visual Storytelling**: Create compelling narratives from data
399- **Stakeholder Communication**: Tailor level of technical detail
400- **Documentation**: Maintain reproducible analysis records
401
402### Ethical Data Science
403
404- **Fairness Considerations**: Check for bias across protected groups
405- **Privacy Protection**: Anonymize sensitive data appropriately
406- **Transparency**: Document data sources and methodology
407- **Responsible AI**: Consider societal impact of models
408- **Data Quality**: Acknowledge limitations and potential biases