import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy import stats import itertools # === 数据手动整理(略去读取过程,假设已构建DataFrame) === # df: 包含 group 和 hbv_dna 两列 # 示例数据构造(基于你提供的表格) data = { 'group': ['A']*24 + ['B']*26 + ['C']*29 + ['D']*29, 'hbv_dna': [ 614.6, 50, 845.3, 126.8, 50, 50, 50, 357.8, 245.2, 50, 221.2, 232.5, 50, 50, 50, 50, 50, 50, 50, 408, 189.4, 50, 50, 125.6, 707.1, 50, 28.67, 313.3, 50, 50, 885.5, 50, 979.9, 598.1, 50, 50, 657.1, 555.4, 153.1, 319.2, 50, 50, 114.2, 50, 50, 854.3, 50, 50, 50, 50, 50, 50, 594.9, 50, 215.2, 50, 86.5, 875.8, 100, 510.5, 50, 50, 393.6, 50, 50, 104.2, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 871.1, 61.8, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 250.1, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50 ] } df = pd.DataFrame(data) # 对数变换 df['log_hbv'] = np.log10(df['hbv_dna'] + 1) # Kruskal-Wallis检验 groups = [df[df['group'] == g]['hbv_dna'] for g in ['A', 'B', 'C', 'D']] h_stat, p_val = stats.kruskal(*groups) print(f"Kruskal-Wallis H-statistic: {h_stat:.3f}, p-value: {p_val:.4f}") # 箱线图 plt.figure(figsize=(8, 6)) sns.boxplot(x='group', y='hbv_dna', data=df, palette='Set2') plt.yscale('log') plt.ylabel('HBV-DNA (IU/mL, log scale)') plt.xlabel('Group') plt.title('Baseline HBV-DNA by HBsAg Group') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show()