引言
在当今医学研究中,数据分析已经成为不可或缺的一部分。从临床试验到流行病学调查,从基础研究到临床实践,大量的医学数据需要我们去整理、分析和解读。而Python作为一门强大的编程语言,凭借其丰富的数据分析库和简洁的语法,成为了医学生和医学研究者的理想选择。
今天,我们将通过一个实际案例,教会大家如何使用Python读取CSV格式的医学数据,自动识别不同类型的变量,并进行详细的统计分析。
一、准备工作
1. 安装必要的库
首先,我们需要安装pandas库,它是Python中用于数据分析的核心库:
pip install pandas
2. 准备示例数据
为了演示,我们创建了一个包含15名患者信息的医学数据集medical_data.csv,包含以下字段:
smoking:吸烟状态(逻辑变量,1=吸烟,0=不吸烟)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%
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》
希望这篇文章对大家有所帮助,欢迎在评论区留言交流!