当前位置:首页>python>Python数据分析指南:医学生的科研利器

Python数据分析指南:医学生的科研利器

  • 2026-09-16 10:25:26
Python数据分析指南:医学生的科研利器

引言

在当今医学研究中,数据分析已经成为不可或缺的一部分。从临床试验到流行病学调查,从基础研究到临床实践,大量的医学数据需要我们去整理、分析和解读。而Python作为一门强大的编程语言,凭借其丰富的数据分析库和简洁的语法,成为了医学生和医学研究者的理想选择。

今天,我们将通过一个实际案例,教会大家如何使用Python读取CSV格式的医学数据,自动识别不同类型的变量,并进行详细的统计分析。

一、准备工作

1. 安装必要的库

首先,我们需要安装pandas库,它是Python中用于数据分析的核心库:

pip install pandas

2. 准备示例数据

为了演示,我们创建了一个包含15名患者信息的医学数据集medical_data.csv,包含以下字段:

  • patient_id:患者ID
  • age:年龄(连续变量)
  • gender:性别(逻辑变量,1=男,0=女)
  • smoking:吸烟状态(逻辑变量,1=吸烟,0=不吸烟)
  • bmi:体重指数(连续变量)
  • cholesterol:胆固醇水平(连续变量)
  • diabetes:糖尿病状态(逻辑变量,1=有,0=无)
  • hypertension:高血压状态(逻辑变量,1=有,0=无)

二、核心代码解析

1. 读取数据并查看基本信息

import pandas as pd# 读取CSV数据df = pd.read_csv('medical_data.csv')# 打印数据列名print("数据列名:")print(df.columns.tolist())# 打印前几行数据查看结构print("数据前5行:")print(df.head())

这段代码使用pd.read_csv()函数读取CSV文件,并将数据存储为DataFrame对象。然后我们打印出所有列名和前5行数据,以便了解数据的基本结构。

2. 自动识别逻辑变量

# 识别逻辑变量(只包含0和1的变量)logical_vars = []for col in df.columns:# 跳过patient_id这样的标识符列if col == 'patient_id':continue# 获取列的唯一值    unique_vals = df[col].unique()# 检查是否只包含0和1if set(unique_vals).issubset({0, 1}):        logical_vars.append(col)print(f"逻辑变量: {logical_vars}")

这段代码通过遍历每一列,检查其唯一值是否只包含0和1,从而自动识别出逻辑变量。在医学研究中,逻辑变量常用于表示二分类的状态,如性别、疾病状态等。

3. 自动识别连续变量

# 识别连续变量(排除逻辑变量和标识符列)continuous_vars = []for col in df.columns:# 跳过标识符列和逻辑变量if col == 'patient_id'or col in logical_vars:continue# 检查是否为数值型列if pd.api.types.is_numeric_dtype(df[col]):        continuous_vars.append(col)print(f"连续变量: {continuous_vars}")

在排除了逻辑变量和标识符列后,我们将剩余的数值型列识别为连续变量。连续变量在医学研究中非常常见,如年龄、身高、体重、实验室指标等。

4. 统计逻辑变量的特性

# 统计逻辑变量的特性print("逻辑变量统计特性:")for var in logical_vars:    print(f"\n{var}:")    print(f"  均值(比例): {df[var].mean():.4f}")    print(f"  计数: {df[var].count()}")    print(f"  0值数量: {(df[var] == 0).sum()}")    print(f"  1值数量: {(df[var] == 1).sum()}")

对于逻辑变量,我们计算了其均值(在二分类变量中表示比例)、计数以及0和1值的数量。这些统计量可以帮助我们了解样本的基本特征,如性别分布、吸烟比例等。

5. 统计连续变量的特性

# 统计连续变量的特性print("连续变量统计特性:")for var in continuous_vars:    print(f"\n{var}:")    print(f"  均值: {df[var].mean():.4f}")    print(f"  标准差: {df[var].std():.4f}")    print(f"  最小值: {df[var].min():.4f}")    print(f"  最大值: {df[var].max():.4f}")    print(f"  中位数: {df[var].median():.4f}")    print(f"  25%分位数: {df[var].quantile(0.25):.4f}")    print(f"  75%分位数: {df[var].quantile(0.75):.4f}")# 使用describe()函数获取更全面的统计信息print("连续变量详细统计:")print(df[continuous_vars].describe())

对于连续变量,我们计算了一系列统计量,包括均值、标准差、最小值、最大值、中位数以及四分位数。这些统计量可以帮助我们了解变量的分布情况,如年龄的范围、BMI的集中趋势等。

三、完整代码

"""医学数据统计分析工具功能:1. 读取CSV格式的医学数据2. 自动识别逻辑变量(只包含0和1的变量)3. 自动识别连续变量4. 计算逻辑变量的统计特性(比例、计数等)5. 计算连续变量的统计特性(均值、标准差、分位数等)6. 生成详细的统计报告使用方法:1. 确保CSV文件存在且格式正确2. 修改文件路径为你的CSV文件路径3. 运行脚本查看分析结果"""import pandas as pd# 配置部分CSV_FILE_PATH = 'medical_data.csv'# CSV文件路径IDENTIFIER_COL = 'patient_id'# 标识符列名defanalyze_medical_data(csv_path):"""    分析医学数据的主函数    参数:        csv_path: CSV文件路径    """# 读取CSV数据    print("正在读取数据...")    df = pd.read_csv(csv_path)    print(f"成功读取数据,共{len(df)}行,{len(df.columns)}列")    print()# 打印数据列名    print("=== 数据列名 ===")    print(df.columns.tolist())    print()# 打印前几行数据查看结构    print("=== 数据前5行 ===")    print(df.head())    print()# 识别逻辑变量(只包含0和1的变量)    print("=== 识别逻辑变量 ===")    logical_vars = []for col in df.columns:# 跳过标识符列if col == IDENTIFIER_COL:continue# 获取列的唯一值        unique_vals = df[col].unique()# 检查是否只包含0和1if set(unique_vals).issubset({0, 1}):            logical_vars.append(col)    print(f"逻辑变量: {logical_vars}")    print()# 识别连续变量(排除逻辑变量和标识符列)    print("=== 识别连续变量 ===")    continuous_vars = []for col in df.columns:# 跳过标识符列和逻辑变量if col == IDENTIFIER_COL or col in logical_vars:continue# 检查是否为数值型列if pd.api.types.is_numeric_dtype(df[col]):            continuous_vars.append(col)    print(f"连续变量: {continuous_vars}")    print()# 统计逻辑变量的特性    print("=== 逻辑变量统计特性 ===")for var in logical_vars:        print(f"\n{var}:")        print(f"  均值(比例): {df[var].mean():.4f}")        print(f"  计数: {df[var].count()}")        print(f"  0值数量: {(df[var] == 0).sum()}")        print(f"  1值数量: {(df[var] == 1).sum()}")    print()# 统计连续变量的特性    print("=== 连续变量统计特性 ===")for var in continuous_vars:        print(f"\n{var}:")        print(f"  均值: {df[var].mean():.4f}")        print(f"  标准差: {df[var].std():.4f}")        print(f"  最小值: {df[var].min():.4f}")        print(f"  最大值: {df[var].max():.4f}")        print(f"  中位数: {df[var].median():.4f}")        print(f"  25%分位数: {df[var].quantile(0.25):.4f}")        print(f"  75%分位数: {df[var].quantile(0.75):.4f}")    print()# 使用describe()函数获取更全面的统计信息    print("=== 连续变量详细统计 ===")    print(df[continuous_vars].describe())    print()if __name__ == "__main__":    analyze_medical_data(CSV_FILE_PATH)

四、结果分析

让我们运行代码,看看分析结果:

1. 数据基本信息

正在读取数据...成功读取数据,共15行,8列=== 数据列名 ===['patient_id', 'age', 'gender', 'smoking', 'bmi', 'cholesterol', 'diabetes', 'hypertension']=== 数据前5行 ===   patient_id  age  gender  smoking   bmi  cholesterol  diabetes  hypertension0           1   45       1        0  24.5          180         0             11           2   38       0        1  28.7          210         1             02           3   62       1        0  22.3          165         0             13           4   51       0        1  31.2          220         0             14           5   42       1        0  25.8          175         0             0

我们可以看到,数据包含15名患者的信息,共8个变量。

2. 变量识别结果

=== 识别逻辑变量 ===逻辑变量: ['gender', 'smoking', 'diabetes', 'hypertension']=== 识别连续变量 ===连续变量: ['age', 'bmi', 'cholesterol']

代码成功识别出4个逻辑变量(性别、吸烟状态、糖尿病状态、高血压状态)和3个连续变量(年龄、BMI、胆固醇)。

3. 逻辑变量统计结果

=== 逻辑变量统计特性 ===gender:  均值(比例): 0.5333  计数: 15  0值数量: 7  1值数量: 8smoking:  均值(比例): 0.4000  计数: 15  0值数量: 9  1值数量: 6diabetes:  均值(比例): 0.3333  计数: 15  0值数量: 10  1值数量: 5hypertension:  均值(比例): 0.4667  计数: 15  0值数量: 8  1值数量: 7

从结果中我们可以看出:

  • 性别比例:男性(1)占53.33%,女性(0)占46.67%
  • 吸烟比例:吸烟者占40%
  • 糖尿病比例:糖尿病患者占33.33%
  • 高血压比例:高血压患者占46.67%

4. 连续变量统计结果

=== 连续变量统计特性 ===age:  均值: 50.6667  标准差: 9.3783  最小值: 35.0000  最大值: 65.0000  中位数: 51.0000  25%分位数: 43.5000  75%分位数: 58.5000bmi:  均值: 26.5533  标准差: 2.7756  最小值: 22.3000  最大值: 31.2000  中位数: 26.7000  25%分位数: 24.3000  75%分位数: 28.4500cholesterol:  均值: 189.0000  标准差: 18.2444  最小值: 160.0000  最大值: 220.0000  中位数: 185.0000  25%分位数: 177.5000  75%分位数: 202.5000

连续变量的统计结果显示:

  • 年龄:平均50.67岁,标准差9.38岁,范围35-65岁
  • BMI:平均26.55,标准差2.78,范围22.3-31.2
  • 胆固醇:平均189.00,标准差18.24,范围160-220

五、应用建议

1. 扩展分析

  • 相关性分析:使用df.corr()函数分析变量之间的相关性,探索危险因素与疾病之间的关系
  • 可视化:使用matplotlib或seaborn库创建直方图、散点图、箱线图等,更直观地展示数据
  • 假设检验:使用scipy库进行t检验、卡方检验等统计检验,验证研究假设

2. 实际应用场景

  • 临床试验数据分析:分析药物疗效、不良反应等
  • 流行病学调查:分析疾病的危险因素、发病率等
  • 医学影像分析:结合其他库进行医学影像的处理和分析
  • 电子病历分析:从大量病历中提取有价值的信息

3. 学习建议

  • 掌握基础库:除了pandas,还要学习numpy、matplotlib、seaborn等基础库
  • 学习统计知识:理解基本的统计学概念,如均值、标准差、假设检验等
  • 实践项目:通过实际项目锻炼数据分析能力,如分析自己的实验数据
  • 参考优秀资源:关注医学数据分析相关的书籍、课程和博客

六、总结

通过本文的学习,我们掌握了如何使用Python读取CSV格式的医学数据,自动识别不同类型的变量,并进行详细的统计分析。这些技能对于医学生的科研工作和未来的医学实践都非常重要。

Python作为一门强大的编程语言,为医学数据分析提供了便捷、高效的解决方案。希望本文能够帮助大家开启医学数据分析的大门,在未来的学习和工作中取得更多的成果。

小贴士:本文的代码可以直接复制使用,只需将CSV文件路径修改为你的数据文件路径即可。如果你的数据结构不同,可能需要对代码进行适当的调整。


延伸阅读:

  • 《Python for Data Analysis》
  • 《医学统计学》
  • 《机器学习在医学中的应用》

希望这篇文章对大家有所帮助,欢迎在评论区留言交流!

最新文章

随机文章