手把手教你用Python和Pandas分析自贡ICU感染数据集(附完整代码)
手把手教你用Python和Pandas分析自贡ICU感染数据集附完整代码医疗数据分析正成为临床研究的重要工具。当我在去年参与一个脓毒症预测项目时发现高质量、结构化的临床数据集非常珍贵。自贡ICU感染数据集作为国内少有的开放医疗数据库为数据科学爱好者提供了难得的实践机会。本文将带你从数据导入到可视化分析完整复现一个真实的医疗数据分析流程。1. 环境准备与数据加载在开始分析前我们需要配置合适的Python环境。推荐使用Anaconda创建独立环境conda create -n medical_analysis python3.8 conda activate medical_analysis pip install pandas numpy matplotlib seaborn jupyter数据集包含多个CSV文件我们需要先理解数据结构文件名称描述关键字段dtBaseline.csv患者基线特征PATIENT_ID, AGE, GENDERdtLab.csv实验室检查结果TEST_NAME, TEST_VALUEdtOutcome.csv治疗结果STATUS_DISCHARGE, SF36_SCORE加载数据时需特别注意中文编码问题import pandas as pd def load_data(file_path): try: return pd.read_csv(file_path, encodinggb18030) except: return pd.read_csv(file_path, encodingutf-8) baseline load_data(dtBaseline.csv) outcome load_data(dtOutcome.csv)提示该数据集的时间字段均为相对于入院时间的小时偏移量分析时需特别注意时间基准2. 数据清洗与特征工程医疗数据常存在缺失值和异常值。我们先检查数据质量def check_missing(df): missing df.isnull().sum() return missing[missing 0].sort_values(ascendingFalse) print(check_missing(baseline))常见的数据清洗操作包括年龄大于89岁的数据已被随机化处理90-120实验室检查结果中的异常值处理中文诊断描述的标准化构建关键特征示例# 合并基线数据和结果数据 merged pd.merge(baseline, outcome, onPATIENT_ID) # 创建是否死亡标志 merged[DEATH_FLAG] merged[STATUS_DISCHARGE].apply( lambda x: 1 if x 死亡 else 0)3. 探索性数据分析(EDA)让我们先观察整体死亡率情况import matplotlib.pyplot as plt death_rate merged[DEATH_FLAG].mean() print(f整体死亡率: {death_rate:.1%}) # 性别与死亡率的关系 gender_death merged.groupby(GENDER)[DEATH_FLAG].mean()可视化不同年龄段的死亡率分布import seaborn as sns plt.figure(figsize(10,6)) sns.boxplot(xDEATH_FLAG, yAGE, datamerged) plt.title(不同结局患者的年龄分布) plt.xlabel(是否死亡) plt.ylabel(年龄) plt.show()感染部位分析需要从诊断描述中提取信息# 从中文诊断描述中提取感染部位 def extract_infection_site(desc): if 肺 in desc: return 肺部 elif 尿 in desc: return 泌尿系统 elif 血 in desc: return 血液 else: return 其他 merged[INFECTION_SITE] merged[DIAGNOSIS].apply(extract_infection_site)4. 深入分析与可视化比较不同感染部位的死亡率site_mortality merged.groupby(INFECTION_SITE)[DEATH_FLAG].agg([mean, count]) print(site_mortality.sort_values(mean, ascendingFalse))实验室指标与死亡率的关系分析# 合并实验室数据 labs load_data(dtLab.csv) analysis_df pd.merge(merged, labs, onPATIENT_ID) # 选取关键指标分析 key_tests [白细胞计数, C反应蛋白, 降钙素原] for test in key_tests: test_data analysis_df[analysis_df[TEST_NAME] test] plt.figure() sns.boxplot(xDEATH_FLAG, yTEST_VALUE, datatest_data) plt.title(f{test}与死亡率关系)时间序列分析需要特别注意时间偏移量# 将小时偏移量转换为天 merged[ICU_DAYS] merged[ICU_LENGTH_HOURS] / 24 # 住院天数与死亡率关系 sns.lmplot(xICU_DAYS, yDEATH_FLAG, datamerged, logisticTrue, height6) plt.title(住院天数与死亡概率关系)5. 高级分析与建模准备在基础分析完成后我们可以进一步构建预测模型。首先需要准备特征矩阵from sklearn.preprocessing import LabelEncoder # 分类变量编码 le LabelEncoder() merged[GENDER_CODE] le.fit_transform(merged[GENDER]) # 选择建模特征 features [AGE, GENDER_CODE, INFECTION_SITE_CODE] X merged[features] y merged[DEATH_FLAG]构建简单的逻辑回归模型from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42) model LogisticRegression() model.fit(X_train, y_train) print(f模型准确率: {model.score(X_test, y_test):.2f})注意真实医疗场景中的模型开发需要更严谨的特征选择和验证流程6. 分析报告生成使用Jupyter Notebook可以方便地生成交互式分析报告。以下是一个报告生成模板from IPython.display import HTML def create_report(): html h2ICU感染数据分析报告/h2 html fp分析数据集包含 {len(merged)} 条患者记录/p html h3关键发现/h3ul html fli整体死亡率: {death_rate:.1%}/li html /ul return HTML(html) create_report()对于需要导出为PDF的报告可以使用以下方法from IPython.display import display from IPython.core.pylabtools import print_figure fig plt.figure() # ... 绘图代码 ... display(HTML(print_figure(fig, pdf)))在实际项目中我发现将分析过程模块化非常重要。每个分析步骤都应该有清晰的输入输出定义方便后续维护和复现。例如可以将数据加载、清洗、分析等步骤封装成独立函数甚至创建专门的Python模块来组织代码。