ab-testing-analyzer
npx skills add https://github.com/majiayu000/claude-skill-registry --skill ab-testing-analyzer
Agent 安装分布
Skill 文档
ABæµè¯åææè½ (AB Testing Analyzer)
ä¸ä¸ªåè½å®æ´çæºè½ABæµè¯åæå·¥å ·ï¼åºäº”æ°æ®åæåå¥å诔çABæµè¯æ¨¡åå¼åã
ð¯ æè½æ¦è¿°
æ¬æè½æä¾ä»å®éªè®¾è®¡å°ç»æåæç宿´ABæµè¯è§£å³æ¹æ¡ï¼æ¯æå¤ç§ç»è®¡æ£éªæ¹æ³ãç¨æ·å群åæåå¯è§åæ¥åçæã
â¨ æ ¸å¿ç¹æ§
-
ð§ª å®æ´çABæµè¯æµç¨
- å®éªè®¾è®¡åæ ·æ¬é计ç®
- éæºåç»éªè¯
- 转åçåçåçåæ
- ç»è®¡æ¾èæ§æ£éª
-
ð å ¨é¢çç»è®¡æ¹æ³
- tæ£éª (ç¬ç«æ ·æ¬ãé å¯¹æ ·æ¬)
- 塿¹æ£éª (æåä¼åº¦ãç¬ç«æ§)
- 置信åºé´ä¼°è®¡
- æåºé计ç®
- å¤éæ¯è¾æ ¡æ£
-
ð¥ æºè½ç¨æ·å群
- ä»·å¼å群 (é«/ä½ä»·å¼å®¢æ·)
- 人å£ç»è®¡å¦å群
- è¡ä¸ºæ¨¡å¼å群
- èªå®ä¹å群çç¥
- äº¤äºæåºåæ
-
ð 丰å¯çå¯è§ååè½
- 转åç对æ¯å¾
- çåçæ²çº¿å¾
- ç¨æ·å群çåå¾
- äº¤äºæåºå¯è§å
- ç»è®¡æ£éªç»æå¾
-
ð§ é«çº§åæåè½
- å¤åéABæµè¯
- è´å¶æ¯ABæµè¯
- æ¶é´åºååæ
- ç¨³å¥æ§æ£æ¥
- å ææ¨ææ¯æ
ð å¿«éå¼å§
1. ç¯å¢è¦æ±
# ä¾èµå
pip install pandas numpy scipy matplotlib seaborn statsmodels
2. åºç¡ä½¿ç¨
from scripts.ab_test_analyzer import ABTestAnalyzer
from scripts.statistical_tests import StatisticalTests
from scripts.visualizer import ABTestVisualizer
# åå§ååæå¨
analyzer = ABTestAnalyzer()
stats_tests = StatisticalTests()
visualizer = ABTestVisualizer()
# å è½½ABæµè¯æ°æ®
data = analyzer.load_data('ab_test_data.csv')
# åºç¡è½¬åçåæ
conversion_results = analyzer.analyze_conversion(
data,
group_col='页é¢çæ¬',
conversion_col='æ¯å¦è´ä¹°'
)
# ç»è®¡æ¾èæ§æ£éª
t_test_result = stats_tests.t_test(
data,
group_col='页é¢çæ¬',
metric_col='æ¯å¦è´ä¹°'
)
# çæå¯è§åæ¥å
fig = visualizer.plot_conversion_comparison(conversion_results)
3. è¿è¡ç¤ºä¾
# å¿«éæµè¯
python quick_test.py
# åºç¡ABæµè¯ç¤ºä¾
python examples/basic_ab_test_example.py
# é«çº§å群åæç¤ºä¾
python examples/advanced_segmentation_example.py
# 综ååæç¤ºä¾
python examples/comprehensive_analysis_example.py
ð 项ç®ç»æ
ab-testing-analyzer/
âââ SKILL.md # æè½è¯¦ç»ææ¡£
âââ README.md # ä½¿ç¨æå (æ¬æä»¶)
âââ quick_test.py # å¿«éåè½æµè¯
âââ test_skill.py # 宿´æµè¯å¥ä»¶
â
âââ scripts/ # æ ¸å¿åè½æ¨¡å
â âââ __init__.py
â âââ ab_test_analyzer.py # ABæµè¯æ ¸å¿åæ
â âââ statistical_tests.py # ç»è®¡æ£éªæ¨¡å
â âââ segment_analyzer.py # ç¨æ·å群åæ
â âââ visualizer.py # å¯è§åçæå¨
â
âââ examples/ # 示ä¾åæ°æ®
âââ sample_data/ # æ ·æ¬æ°æ®
â âââ sample_ab_test_data.csv
â âââ sample_user_segments.csv
âââ basic_ab_test_example.py # åºç¡ABæµè¯ç¤ºä¾
âââ advanced_segmentation_example.py # é«çº§å群åæç¤ºä¾
âââ comprehensive_analysis_example.py # 综ååæç¤ºä¾
ð¡ 主è¦åè½
1. ABæµè¯åºç¡åæ
转åçåæ
# 计ç®åç»è½¬åç
conversion_rates = analyzer.calculate_conversion_rates(
data,
group_col='å®éªç»å«',
conversion_col='转åç¶æ'
)
# è®¡ç®æåçå置信åºé´
lift_analysis = analyzer.calculate_lift(
conversion_rates,
control_group='对ç
§ç»',
test_group='æµè¯ç»'
)
çåçåæ
# 计ç®çåç
retention_rates = analyzer.calculate_retention_rates(
data,
group_col='å®éªç»å«',
retention_col='retention_7'
)
# çåçæ²çº¿å¯è§å
fig = visualizer.plot_retention_curves(retention_rates)
2. ç»è®¡æ¾èæ§æ£éª
tæ£éª
# ç¬ç«æ ·æ¬tæ£éª
t_result = stats_tests.t_test(
data,
group_col='页é¢çæ¬',
metric_col='è´ä¹°éé¢',
test_type='independent'
)
# é
å¯¹æ ·æ¬tæ£éª
paired_t_result = stats_tests.t_test(
before_after_data,
group_col='ç¨æ·ID',
metric_col='è¡ä¸ºææ ',
test_type='paired'
)
塿¹æ£éª
# æåä¼åº¦æ£éª
chi2_goodness = stats_tests.chi_square_test(
observed_data,
expected_data,
test_type='goodness_of_fit'
)
# ç¬ç«æ§æ£éª
chi2_independence = stats_tests.chi_square_test(
data,
group_col='å®éªç»å«',
outcome_col='转åç¶æ',
test_type='independence'
)
æåºé计ç®
# Cohen's d计ç®
cohens_d = stats_tests.cohens_d(
data,
group_col='å®éªç»å«',
metric_col='转åç¶æ'
)
# Cramer's V计ç®
cramers_v = stats_tests.cramers_v(data, group_col, outcome_col)
3. ç¨æ·å群åæ
ä»·å¼å群
from scripts.segment_analyzer import SegmentAnalyzer
segment_analyzer = SegmentAnalyzer()
# åºäºä»·å¼çç¨æ·å群
value_segments = segment_analyzer.value_based_segmentation(
data,
value_col='累计æ¶è´¹éé¢',
n_tiers=3
)
# å群转åçåæ
segment_conversion = segment_analyzer.segment_conversion_analysis(
data,
segment_col='ä»·å¼ç»å«',
group_col='å®éªç»å«',
conversion_col='转åç¶æ'
)
äº¤äºæåºåæ
# 页é¢çæ¬ä¸ç¨æ·ç¹å¾çäº¤äºæåº
interaction_analysis = segment_analyzer.interaction_analysis(
data,
group_col='页é¢çæ¬',
segment_col='ä»·å¼ç»å«',
outcome_col='转åç¶æ'
)
# äº¤äºæåºå¯è§å
fig = visualizer.plot_interaction_effects(interaction_analysis)
4. é«çº§ç»è®¡åæ
è´å¶æ¯ABæµè¯
# è´å¶æ¯ABæµè¯åæ
bayesian_result = analyzer.bayesian_ab_test(
data,
group_col='å®éªç»å«',
conversion_col='转åç¶æ',
prior='jeffreys'
)
# 计ç®è·èæ¦ç
win_probability = analyzer.calculate_win_probability(bayesian_result)
å¤å鿣éª
# å¤åéABæµè¯ (MVT)
mvt_result = analyzer.multivariate_test(
data,
group_cols=['页é¢çæ¬', 'æé®é¢è²', 'æ 颿æ¡'],
conversion_col='转åç¶æ'
)
5. å¯è§åæ¥å
åºç¡å¾è¡¨
# 转åç对æ¯å¾
fig = visualizer.plot_conversion_comparison(
conversion_data,
title='ABæµè¯è½¬åç对æ¯'
)
# 置信åºé´å¾
fig = visualizer.plot_confidence_intervals(
statistical_results,
metric='转åç'
)
# ç¨æ·å群çåå¾
fig = visualizer.plot_segment_heatmap(
segment_data,
title='ç¨æ·å群转åççåå¾'
)
交äºå¼ä»ªè¡¨æ¿
# çæäº¤äºå¼ä»ªè¡¨æ¿
dashboard = visualizer.create_interactive_dashboard(
analysis_results,
output_file='ab_test_dashboard.html'
)
ð æ°æ®æ ¼å¼
ABæµè¯æ°æ®æ ¼å¼ (ab_test_data.csv)
ç¨æ·ID,å®éªç»å«,转åç¶æ,çåç¶æ,累计æ¶è´¹éé¢,æ§å«,å¹´é¾,ä»·å¼ç»å«,设å¤ç±»å
U001,æµè¯ç»,æ¯,TRUE,299.99,ç·,25,é«ä»·å¼,ç§»å¨ç«¯
U002,对ç
§ç»,å¦,FALSE,59.99,女,32,ä½ä»·å¼,PC端
U003,æµè¯ç»,æ¯,TRUE,599.99,ç·,28,é«ä»·å¼,ç§»å¨ç«¯
U004,对ç
§ç»,å¦,FALSE,199.99,女,35,ä¸ä»·å¼,PC端
ç¨æ·åç¾¤æ°æ®æ ¼å¼ (user_segments.csv)
ç¨æ·ID,RFMå群,è¡ä¸ºå群,人å£ç»è®¡å群,综åå群
U001,é«ä»·å¼,æ´»è·ç¨æ·,å¹´è½»ç·æ§,é«ä»·å¼å¹´è½»ç¨æ·
U002,ä½ä»·å¼,æµå¤±ç¨æ·,æç女æ§,éè¦å¤éç¨æ·
ð¯ åºç¨åºæ¯
产åä¼å
- ç½é¡µæ¹çææè¯ä¼°
- åè½ä¸çº¿å½±ååæ
- ç¨æ·çé¢ä¼åæµè¯
- æ§è½æ¹è¿éªè¯
è¥éæ´»å¨
- 广ååææµè¯
- ä¿éçç¥è¯ä¼°
- é®ä»¶è¥éä¼å
- 社交åªä½æ´»å¨åæ
è¿è¥çç¥
- å®ä»·çç¥æµè¯
- æ¨èç®æ³ä¼å
- ç¨æ·æ³¨åæµç¨æ¹è¿
- å®¢æ·æå¡çç¥è¯ä¼°
âï¸ é«çº§é ç½®
ç»è®¡åæ°è®¾ç½®
# 设置æ¾èæ§æ°´å¹³
analyzer.set_significance_level(alpha=0.05)
# 设置ç»è®¡åæ
analyzer.set_statistical_power(power=0.8)
# 设置å¤éæ¯è¾æ ¡æ£æ¹æ³
analyzer.set_multiple_comparison_correction(method='bonferroni')
èªå®ä¹å群çç¥
# å®ä¹èªå®ä¹å群è§å
custom_segments = {
'high_value': {'累计æ¶è´¹éé¢': (500, float('inf'))},
'medium_value': {'累计æ¶è´¹éé¢': (100, 500)},
'low_value': {'累计æ¶è´¹éé¢': (0, 100)}
}
# åºç¨èªå®ä¹å群
segmented_data = segment_analyzer.apply_custom_segments(
data,
segment_rules=custom_segments
)
é«çº§å¯è§åé ç½®
# 设置å¾è¡¨é£æ ¼
visualizer.set_style(style='seaborn', palette='viridis')
# èªå®ä¹å¾è¡¨é
ç½®
chart_config = {
'figsize': (12, 8),
'dpi': 300,
'format': 'png',
'style': 'professional'
}
fig = visualizer.plot_with_config(data, config=chart_config)
ð 常è§é®é¢
Q: å¦ä½ç¡®å®åéçæ ·æ¬éï¼
A: ä½¿ç¨æ ·æ¬é计ç®åè½ï¼èèæåºéãæ¾èæ§æ°´å¹³åç»è®¡åææ¥è®¡ç®æå°æ ·æ¬éã
Q: på¼å°äº0.05æ¯å¦æå³çç»ææ¾èï¼
A: på¼å°äº0.05表示å¨åå设为ççæ åµä¸ï¼è§å¯å°å½åç»æææ´æç«¯ç»æçæ¦çå°äº5%ãéè¦ç»åæåºéåå®é æä¹æ¥è§£éã
Q: å¦ä½å¤çå¤éæ¯è¾é®é¢ï¼
A: 使ç¨Bonferroniæ ¡æ£ãFDRæ ¡æ£çæ¹æ³æ¥è°æ´på¼ï¼é¿å å鳿§ã
Q: 使¶ä½¿ç¨è´å¶æ¯ABæµè¯ï¼
A: å½éè¦å éªä¿¡æ¯ãæ ·æ¬éè¾å°ææ³è¦è·å¾æ¦çæ§ç»è®ºæ¶ï¼èè使ç¨è´å¶æ¯æ¹æ³ã
ð æ§è½ä¼å
- 使ç¨åéåæä½å é计ç®
- å®ç°å¢éç»è®¡æ´æ°
- éç¨å¹¶è¡è®¡ç®å¤çå¤§æ°æ®
- ç¼å计ç®ç»æé¿å éå¤è®¡ç®
- ä¼åå åä½¿ç¨æ¨¡å¼
ð ææ¯åç
ç»è®¡æ£éªåºç¡
åºäºå设æ£éªç论ï¼éè¿è®¡ç®æ£éªç»è®¡éåp弿¥å¤æå®éªç»æçç»è®¡æ¾èæ§ã
ä¸å¿æéå®ç
å¨å¤§æ ·æ¬æ åµä¸ï¼æ ·æ¬åå¼çåå¸è¶è¿äºæ£æåå¸ï¼ä¸ºè®¸å¤ç»è®¡æ¹æ³æä¾ç论åºç¡ã
è´å¶æ¯æ¨æ
ç»åå éªä¿¡æ¯åè§æµæ°æ®ï¼éè¿åéªåå¸è¿è¡åæ°ä¼°è®¡åå设æ£éªã
å¤éæ¯è¾æ ¡æ£
å½åæ¶è¿è¡å¤ä¸ªå设æ£éªæ¶ï¼æ§å¶æ»ä½é误çï¼é¿å å鳿§ç»æçå¢å ã
ð¤ è´¡ç®æå
æ¬¢è¿æäº¤IssueåPull Requestæ¥æ¹è¿è¿ä¸ªæè½ã
ð 许å¯è¯
MIT License
ð å¼å§ä½¿ç¨
ç°å¨ä½ å·²ç»äºè§£äºABæµè¯åææè½çææåè½ï¼å¯ä»¥å¼å§ä½¿ç¨äºï¼
# å¿«ééªè¯åè½
python quick_test.py
# è¿è¡ç¤ºä¾
python examples/basic_ab_test_example.py
享åä½ çABæµè¯åæä¹æ ï¼ð