Python 数据分析实战:人工智能医疗影像诊断行业剖析

目录

一、案例背景

二、代码实现

2.1 数据收集

2.2 数据探索性分析

2.3 数据清洗

2.4 数据分析

2.4.1 AI 诊断产品性能影响因素分析

2.4.2 医疗机构对 AI 医疗影像诊断技术的应用情况分析

2.4.3 人工智能医疗影像诊断行业未来发展预测

三、主要的代码难点解析

3.1 数据收集

3.2 数据清洗 - AI 诊断产品性能数据处理

3.3 数据分析 - AI 诊断产品性能影响因素分析

3.4 数据分析 - 医疗机构对 AI 医疗影像诊断技术的应用情况分析

3.5 数据可视化

四、可能改进的代码

4.1 数据收集改进

4.2 数据清洗改进

4.3 数据分析改进


一、案例背景

人工智能在医疗领域的应用正深刻改变着传统医疗模式,尤其是在医疗影像诊断方面,展现出巨大潜力。医疗影像作为疾病诊断的关键依据,涵盖 X 光、CT、MRI 等多种类型,然而传统人工读片不仅耗时费力,且受医师经验水平影响,存在一定误诊、漏诊率。人工智能医疗影像诊断技术借助深度学习算法,能够快速、精准地分析影像数据,辅助医生发现病变,提高诊断效率与准确性。不过,该行业发展面临诸多挑战,如算法模型的准确性提升、医疗数据的质量与隐私保护、临床验证的复杂性以及医疗监管政策的适配等。通过运用 Python 对该行业相关数据进行深度挖掘与分析,有助于企业优化算法、提升产品性能,助力医疗机构合理引入技术、改善医疗服务,为行业的健康发展提供有力的数据支持与决策参考。

二、代码实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import requests
from bs4 import BeautifulSoup
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
import statsmodels.api as sm
from statsmodels.tsa.arima.model import ARIMA

2.1 数据收集

数据来源广泛,包括行业研究报告网站(如艾媒咨询、动脉网)、医疗影像设备厂商数据、医疗机构临床影像诊断数据以及政府卫生健康部门统计数据。

# 从艾媒咨询网站抓取人工智能医疗影像诊断市场规模数据
url = 'https://www.iimedia.cn/research/artificial_intelligence_medical_imaging.html'
headers = {
    'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers = headers)
soup = BeautifulSoup(response.text, 'html.parser')
market_size_data = []
table = soup.find('table', class_='market - size - table')
rows = table.find_all('tr')
for row in rows[1:]:
    cols = row.find_all('td')
    year = cols[0].text.strip()
    market_size = float(cols[1].text.strip().replace('亿元', ''))
    market_size_data.append({'Year': year, 'Market_Size': market_size})
market_size_df = pd.DataFrame(market_size_data)
# 从某医疗影像设备厂商获取其AI诊断产品的性能数据(假设通过数据合作获取CSV文件)
ai_diagnosis_performance_data = pd.read_csv('ai_diagnosis_performance.csv')

2.2 数据探索性分析

# 查看市场规模数据基本信息
print(market_size_df.info())
# 查看AI诊断产品性能数据基本信息
print(ai_diagnosis_performance_data.info())

# 分析人工智能医疗影像诊断市场规模随时间变化趋势
market_size_df['Year'] = pd.to_numeric(market_size_df['Year'])
plt.figure(figsize=(12, 6))
sns.lineplot(x='Year', y='Market_Size', data=market_size_df)
plt.title('Trend of Artificial Intelligence Medical Imaging Diagnosis Market Size')
plt.xlabel('Year')
plt.ylabel('Market Size (billion yuan)')
plt.show()

# 查看AI诊断产品对不同疾病的诊断准确率分布
plt.figure(figsize=(10, 6))
sns.boxplot(x='Disease_Type', y='Diagnosis_Accuracy', data=ai_diagnosis_performance_data)
plt.title('Distribution of Diagnosis Accuracy of AI Diagnosis Products for Different Diseases')
plt.xlabel('Disease Type')
plt.ylabel('Diagnosis Accuracy (%)')
plt.xticks(rotation=45)
plt.show()

2.3 数据清洗

# 市场规模数据清洗
# 检查并处理缺失值
market_size_df.dropna(inplace = True)
# 去除重复记录
market_size_df = market_size_df.drop_duplicates()
# AI诊断产品性能数据清洗
# 处理异常诊断准确率数据,如准确率超过100%或小于0%
ai_diagnosis_performance_data = ai_diagnosis_performance_data[(ai_diagnosis_performance_data['Diagnosis_Accuracy'] >= 0) & (ai_diagnosis_performance_data['Diagnosis_Accuracy'] <= 100)]
# 处理缺失值,对于关键信息缺失的记录可考虑删除
ai_diagnosis_performance_data = ai_diagnosis_performance_data.dropna(subset=['Disease_Type', 'Diagnosis_Accuracy'])

2.4 数据分析

2.4.1 AI 诊断产品性能影响因素分析
# 假设AI诊断产品性能数据中包含影响诊断准确率的特征,如算法类型、数据量等
X = ai_diagnosis_performance_data.drop('Diagnosis_Accuracy', axis = 1)
y = ai_diagnosis_performance_data['Diagnosis_Accuracy']
X = pd.get_dummies(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)
model = RandomForestClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1 - score: {f1:.4f}')
2.4.2 医疗机构对 AI 医疗影像诊断技术的应用情况分析
# 假设从医疗机构调研数据中获取其对AI医疗影像诊断技术的应用率、满意度等信息
hospital_survey_data = pd.read_csv('hospital_ai_usage_survey.csv')
usage_rate = hospital_survey_data['AI_Usage_Rate'].mean()
satisfaction_score = hospital_survey_data['Satisfaction_Score'].mean()
print(f'Average AI usage rate in hospitals: {usage_rate:.2f}%')
print(f'Average satisfaction score of hospitals with AI technology: {satisfaction_score:.2f}')
2.4.3 人工智能医疗影像诊断行业未来发展预测
# 使用时间序列分析方法预测人工智能医疗影像诊断市场规模(以ARIMA模型为例)
market_size_df.set_index('Year', inplace = True)
market_size_df.index = pd.DatetimeIndex(market_size_df.index)
p, d, q = 1, 1, 1
model = ARIMA(market_size_df['Market_Size'], order=(p, d, q))
model_fit = model.fit(disp = 0)
n_steps = 3
forecast = model_fit.get_forecast(steps = n_steps)
forecast_mean = forecast.predicted_mean
conf_int = forecast.conf_int()
plt.figure(figsize=(12, 6))
plt.plot(market_size_df.index, market_size_df['Market_Size'], label='Actual')
plt.plot(pd.date_range(start = market_size_df.index[-1], periods = n_steps + 1, freq = 'Y')[1:], forecast_mean, label='Predicted', linestyle='--')
plt.fill_between(conf_int.index, conf_int.iloc[:, 0], conf_int.iloc[:, 1], color='k', alpha = 0.1)
plt.title('Prediction of Artificial Intelligence Medical Imaging Diagnosis Market Size with ARIMA')
plt.xlabel('Year')
plt.ylabel('Market Size (billion yuan)')
plt.legend()
plt.show()

三、主要的代码难点解析

3.1 数据收集

response = requests.get(url, headers = headers)
soup = BeautifulSoup(response.text, 'html.parser')

  • 难点:行业研究报告网站为保护数据,常设有复杂反爬虫机制,如频繁检测请求频率、验证请求来源合法性、采用动态页面加载技术等。医疗数据因涉及患者隐私,医疗机构和厂商对数据的共享极为谨慎,获取临床影像诊断数据和设备性能数据需经过严格审批流程与法律协议签订。不同数据源的数据格式差异极大,从结构化的表格数据到非结构化的医学影像数据描述文本,整合难度高。
  • 解决思路:针对反爬虫,利用 Selenium 库模拟真实用户在浏览器中的操作,设置合理的请求间隔时间,使用代理 IP 池避免 IP 被封禁。若遇到验证码,可借助 OCR 技术或第三方验证码识别服务解决。在获取医疗数据时,与医疗机构和厂商充分沟通,明确数据使用目的、范围和安全保障措施,签订详细的数据保密协议与合作合同。对于数据格式差异,编写专门的数据解析与转换脚本,将不同格式数据统一为适合分析的结构,例如将非结构化文本中的关键医学信息提取出来,转换为结构化表格数据。

3.2 数据清洗 - AI 诊断产品性能数据处理

ai_diagnosis_performance_data = ai_diagnosis_performance_data[(ai_diagnosis_performance_data['Diagnosis_Accuracy'] >= 0) & (ai_diagnosis_performance_data['Diagnosis_Accuracy'] <= 100)]

  • 难点:AI 诊断产品性能数据中可能存在由于数据采集误差、算法异常等原因导致的异常诊断准确率值,且判断异常值需结合医学领域知识与实际临床应用情况。缺失值处理棘手,不同影响因素特征的缺失可能由不同原因造成,简单填充方法可能无法准确反映数据真实情况,影响后续分析准确性。
  • 解决思路:通过结合医学领域专业知识与大量历史数据,设定合理的诊断准确率范围筛选异常值。对于缺失值,针对不同特征,采用不同处理方式。对于数值型特征,若数据分布近似正态,可考虑使用均值填充;若分布偏态,采用中位数填充。对于类别型特征,使用最频繁出现的值填充。或者构建基于机器学习的缺失值预测模型,如使用 K 近邻算法,利用其他完整数据样本的特征信息预测缺失值。

3.3 数据分析 - AI 诊断产品性能影响因素分析

X = pd.get_dummies(X)
model = RandomForestClassifier()
model.fit(X_train, y_train)

  • 难点:AI 诊断产品性能影响因素众多且相互关联复杂,存在非线性关系,传统线性模型难以准确刻画。特征工程复杂,如算法类型、数据量等特征需进行合理编码与转换,同时要避免因特征过多产生维度灾难,影响模型训练效率与泛化能力。随机森林模型超参数众多,如何通过调优找到最优参数组合,以提升模型对 AI 诊断产品性能预测与影响因素分析的准确性,是一个挑战。
  • 解决思路:运用随机森林、梯度提升树等非线性模型捕捉诊断准确率与影响因素之间的复杂关系。在特征工程阶段,采用独热编码对类别型特征进行处理,利用主成分分析(PCA)、互信息法等技术进行特征降维与筛选,去除冗余特征。通过交叉验证与网格搜索、随机搜索等调优算法,遍历超参数空间,寻找模型的最佳超参数组合,提高模型性能。

3.4 数据分析 - 医疗机构对 AI 医疗影像诊断技术的应用情况分析

usage_rate = hospital_survey_data['AI_Usage_Rate'].mean()
satisfaction_score = hospital_survey_data['Satisfaction_Score'].mean()

  • 难点:医疗机构调研数据可能存在样本偏差,不同地区、规模的医疗机构对 AI 技术的应用和评价存在差异,若样本不能很好覆盖各类医疗机构,分析结果可能不准确。满意度评分等主观数据受多种因素影响,如医院信息化基础、医生对新技术的接受程度等,如何准确解读这些数据并挖掘背后的影响因素是难点。
  • 解决思路:在数据收集阶段,采用分层抽样方法,按照地区、医院规模、医院等级等因素对医疗机构进行分层,确保样本能够全面代表各类医疗机构。对于满意度评分等主观数据,构建多元回归模型,将医院信息化投入、医生培训时长、AI 技术应用时长等作为自变量,满意度评分为因变量,分析各因素对满意度的影响程度,从而更深入理解医疗机构对 AI 医疗影像诊断技术的应用情况。

3.5 数据可视化

plt.plot(market_size_df.index, market_size_df['Market_Size'], label='Actual')
plt.plot(pd.date_range(start = market_size_df.index[-1], periods = n_steps + 1, freq = 'Y')[1:], forecast_mean, label='Predicted', linestyle='--')
plt.fill_between(conf_int.index, conf_int.iloc[:, 0], conf_int.iloc[:, 1], color='k', alpha = 0.1)

  • 难点:在展示市场规模预测结果时,要清晰呈现实际值、预测值和预测区间,同时保证图表在不同时间尺度和数据量级下的可读性与美观性。对于多组复杂数据(如不同医疗机构应用情况对比、不同疾病诊断性能对比等)的可视化,如何选择合适的图表类型与布局,以突出数据特征和差异,是一个挑战。
  • 解决思路:选择对比鲜明且具有辨识度的颜色区分实际值、预测值和预测区间,如使用鲜艳的蓝色表示实际值,橙色表示预测值,灰色半透明填充预测区间,并添加详细清晰的图例说明。根据数据特点和分析目的选择合适图表类型,对于时间序列数据,采用折线图展示趋势;对于多组分类数据对比,采用柱状图或箱线图。合理安排图表布局,利用子图、颜色映射、标签注释等手段,使图表信息丰富且易于理解,准确传达数据背后的信息。

四、可能改进的代码

4.1 数据收集改进

# 从多个行业研究机构网站收集人工智能医疗影像诊断市场规模数据
research_urls = [
    'https://www.iimedia.cn/research/artificial_intelligence_medical_imaging.html',
    'https://www.vingta.com/report/artificial - intelligence - in - medical - imaging - market'
]
all_market_size_data = []
for url in research_urls:
    headers = {
        'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    response = requests.get(url, headers = headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    table = soup.find('table', class_='market - size - table')
    rows = table.find_all('tr')
    for row in rows[1:]:
        cols = row.find_all('td')
        year = cols[0].text.strip()
        market_size = float(cols[1].text.strip().replace('亿元', ''))
        all_market_size_data.append({'Year': year, 'Market_Size': market_size})
all_market_size_df = pd.DataFrame(all_market_size_data)

4.2 数据清洗改进

# 使用随机森林算法填充AI诊断产品性能数据中的缺失值(以数据标注质量为例)
from sklearn.ensemble import RandomForestRegressor
from sklearn.impute import SimpleImputer
# 分离特征和目标变量
X = ai_diagnosis_performance_data.drop('Data_Annotation_Quality', axis = 1)
y = ai_diagnosis_performance_data['Data_Annotation_Quality']
# 处理特征中的缺失值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)
# 训练随机森林模型
model = RandomForestRegressor()
model.fit(X_imputed, y)
# 预测缺失值
missing_indices = ai_diagnosis_performance_data['Data_Annotation_Quality'].isnull()
X_missing = X_imputed[missing_indices]
y_pred = model.predict(X_missing)
# 填充缺失值
ai_diagnosis_performance_data.loc[missing_indices, 'Data_Annotation_Quality'] = y_pred

4.3 数据分析改进

# 使用XGBoost模型进行AI诊断产品性能影响因素分析,提升模型效率与准确性
from xgboost import XGBClassifier
X = ai_diagnosis_performance_data.drop('Diagnosis_Accuracy', axis = 1)
y = ai_diagnosis_performance_data['Diagnosis_Accuracy']
X = pd.get_dummies(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)
xgb_model = XGBClassifier()
xgb_model.fit(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)
accuracy_xgb = accuracy_score(y_test, y_pred_xgb)
precision_xgb = precision_score(y_test, y_pred_xgb)
recall_xgb = recall_score(y_test, y_pred_xgb)
f1_xgb = f1_score(y_test, y_pred_xgb)
print(f'XGBoost - Accuracy: {accuracy_xgb:.4f}, Precision: {precision_xgb:.4f}, Recall: {recall_xgb:.4f}, F1 - score: {f1_xgb:.4f}')

猜你喜欢

转载自blog.csdn.net/daqsdfas/article/details/146798529
今日推荐