Python 数据分析实战:人工智能医疗影像行业发展研究
发布时间
阅读量:
阅读量
目录
一、案例背景
二、代码实现
2.1 数据收集
2.2 数据探索性分析
2.3 数据清洗
2.4 数据分析
2.4.1 AI 医疗影像技术准确率分析
2.4.2 AI 医疗影像产品功能与市场份额关系分析
2.4.3 AI 医疗影像行业未来发展预测
三、主要的代码难点解析
3.1 数据收集
3.2 数据清洗 - 医疗病例数据处理
3.3 数据分析 - AI 医疗影像技术准确率分析
3.4 数据分析 - AI 医疗影像产品功能与市场份额关系分析
3.5 数据可视化
四、可能改进的代码
4.1 数据收集改进
4.2 数据清洗改进
4.3 数据分析改进
一、案例背景
人工智能(AI)技术的飞速发展为医疗行业带来了深刻变革,尤其是在医疗影像领域。AI 医疗影像技术能够快速、准确地对医学影像进行分析,辅助医生诊断疾病,提高诊断效率和准确性。然而,该行业面临着技术壁垒高、数据质量参差不齐、法规监管不完善等挑战。通过 Python 对 AI 医疗影像行业相关数据进行分析,有助于企业把握市场趋势、优化技术研发、推动行业合规发展。
二、代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import requests
from bs4 import BeautifulSoup
2.1 数据收集
数据来源包括行业报告网站(如艾瑞咨询、艾媒咨询)、医疗机构的临床数据、AI 医疗影像企业的产品信息以及学术文献数据库。
- 从艾瑞咨询网站抓取 AI 医疗影像市场规模数据:
url = 'https://www.iresearch.com.cn/report/ai_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 = []
div = soup.find('div', class_='market - size - box')
items = div.find_all('li')
for item in items:
year = item.find('span', class_='year - value').text.strip()
market_size = float(item.find('span', class_='size - num').text.strip().replace('亿元', ''))
market_size_data.append({'Year': year, 'Market_Size': market_size})
market_size_df = pd.DataFrame(market_size_data)

- 从医疗机构获取 AI 辅助诊断的病例数据(假设通过数据共享协议合法获取,并整理成 CSV 文件后读取):
medical_data = pd.read_csv('ai_medical_diagnosis_data.csv')
2.2 数据探索性分析
# 查看市场规模数据基本信息
print(market_size_df.info())
# 查看医疗病例数据基本信息
print(medical_data.info())
# 分析AI医疗影像市场规模随时间变化趋势
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 AI Medical Imaging Market Size')
plt.xlabel('Year')
plt.ylabel('Market Size (billion yuan)')
plt.show()
# 查看AI辅助诊断的疾病类型分布
disease_count = medical_data['Disease_Type'].value_counts()
plt.figure(figsize=(10, 6))
sns.barplot(x=disease_count.index, y=disease_count.values)
plt.title('Distribution of Diseases Assisted by AI in Diagnosis')
plt.xlabel('Disease Type')
plt.ylabel('Number of Cases')
plt.xticks(rotation=45)
plt.show()

2.3 数据清洗
# 市场规模数据清洗
# 检查并处理缺失值
market_size_df.dropna(inplace = True)
# 去除重复记录
market_size_df = market_size_df.drop_duplicates()
# 医疗病例数据清洗
# 处理异常诊断数据,如诊断结果为空等情况
medical_data = medical_data[medical_data['Diagnosis_Result'].notnull()]
2.4 数据分析
2.4.1 AI 医疗影像技术准确率分析
# 假设医疗病例数据中有AI诊断结果和实际诊断结果
correct_count = (medical_data['AI_Diagnosis_Result'] == medical_data['Actual_Diagnosis_Result']).sum()
total_count = len(medical_data)
accuracy = correct_count / total_count
print(f'AI medical imaging technology accuracy: {accuracy * 100:.2f}%')
2.4.2 AI 医疗影像产品功能与市场份额关系分析
# 假设从企业产品资料中整理出产品功能及市场份额数据
product_data = {
'Product_Function': ['Image Segmentation', 'Abnormality Detection', 'Disease Prediction'],
'Market_Share': [0.3, 0.4, 0.3]
}
product_df = pd.DataFrame(product_data)
plt.figure(figsize=(10, 6))
sns.barplot(x='Product_Function', y='Market_Share', data=product_df)
plt.title('Relationship between AI Medical Imaging Product Functions and Market Share')
plt.xlabel('Product Function')
plt.ylabel('Market Share')
plt.show()

2.4.3 AI 医疗影像行业未来发展预测
# 使用时间序列分析方法预测AI医疗影像市场规模(以ARIMA模型为例)
import statsmodels.api as sm
# 假设market_size_df中Year为时间,Market_Size为市场规模
market_size_df.set_index('Year', inplace = True)
market_size_df.index = pd.DatetimeIndex(market_size_df.index)
# 确定ARIMA模型参数
p, d, q = 1, 1, 1
model = sm.tsa.ARIMA(market_size_df['Market_Size'], order=(p, d, q))
model_fit = model.fit(disp = 0)
# 预测未来3年市场规模
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 AI Medical Imaging 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')
- 难点 :行业报告网站可能设置反爬虫机制,如验证码、IP 限制等。医疗机构数据涉及患者隐私,获取难度大,且数据格式可能不统一。学术文献数据库访问通常需要权限,数据提取复杂。
- 解决思路 :设置合理请求间隔,使用代理 IP 池,若遇验证码,考虑 OCR 技术或第三方识别服务。与医疗机构签订严格的数据共享协议,规范数据格式。仔细研究学术文献数据库 API,按要求申请权限并编写数据提取程序。
3.2 数据清洗 - 医疗病例数据处理
medical_data = medical_data[medical_data['Diagnosis_Result'].notnull()]
- 难点 :医疗病例数据存在大量缺失值,可能因数据录入失误、设备故障等原因导致。数据还可能存在错误标注,如疾病类型错误、诊断结果错误等。
- 解决思路 :对于缺失值,若关键信息缺失,可考虑删除记录;若非关键信息缺失,根据数据特点采用均值、中位数填充或基于机器学习算法预测填充。对于错误标注,结合医学知识和其他相关数据进行人工审核和修正。
3.3 数据分析 - AI 医疗影像技术准确率分析
correct_count = (medical_data['AI_Diagnosis_Result'] == medical_data['Actual_Diagnosis_Result']).sum()
total_count = len(medical_data)
accuracy = correct_count / total_count
- 难点 :医疗数据的准确性验证本身难度大,实际诊断结果也可能存在误诊情况。不同疾病类型、病例复杂程度对 AI 诊断准确率影响不同,单一准确率指标难以全面反映技术性能。
- 解决思路 :建立多专家审核机制,对实际诊断结果进行复查。按疾病类型、病例难度分组计算准确率,综合评估 AI 技术在不同场景下的性能。
3.4 数据分析 - AI 医疗影像产品功能与市场份额关系分析
sns.barplot(x='Product_Function', y='Market_Share', data=product_df)
- 难点 :产品功能的界定可能存在模糊性,不同企业对相似功能的描述可能不同。市场份额受多种因素影响,如品牌知名度、营销策略等,单纯分析功能与份额关系可能不够全面。
- 解决思路 :建立统一的产品功能分类标准,对企业产品功能描述进行规范化处理。引入其他相关变量,如品牌影响力、研发投入等,构建多元回归模型,综合分析各因素对市场份额的影响。
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 数据收集改进
# 从多个行业报告网站收集AI医疗影像市场规模数据
report_urls = [
'https://www.iresearch.com.cn/report/ai_medical_imaging.html',
'https://www.iimedia.cn/report/ai_medical.htm'
]
all_market_size_data = []
for url in report_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')
div = soup.find('div', class_='market - size - box')
items = div.find_all('li')
for item in items:
year = item.find('span', class_='year - value').text.strip()
market_size = float(item.find('span', class_='size - num').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 数据清洗改进
# 使用随机森林算法填充医疗病例数据中的缺失值
from sklearn.ensemble import RandomForestRegressor
from sklearn.impute import SimpleImputer
# 分离特征和目标变量
X = medical_data.drop('Diagnosis_Result', axis = 1)
y = medical_data['Diagnosis_Result']
# 处理特征中的缺失值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)
# 训练随机森林模型
model = RandomForestRegressor()
model.fit(X_imputed, y)
# 预测缺失值
missing_indices = medical_data['Diagnosis_Result'].isnull()
X_missing = X_imputed[missing_indices]
y_pred = model.predict(X_missing)
# 填充缺失值
medical_data.loc[missing_indices, 'Diagnosis_Result'] = y_pred

4.3 数据分析改进
# 使用LSTM模型预测AI医疗影像市场规模,提高预测精度
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
# 数据预处理
market_size = market_size_df['Market_Size'].values
scaled_market_size = (market_size - np.min(market_size)) / (np.max(market_size) - np.min(market_size))
X = []
y = []
for i in range(len(scaled_market_size) - 3):
X.append(scaled_market_size[i:i + 3])
y.append(scaled_market_size[i + 3])
X = np.array(X)
y = np.array(y)
X = np.reshape(X, (X.shape[0], X.shape[1], 1))
# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, return_sequences = True, input_shape=(3, 1)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X, y, epochs = 50, batch_size = 32)
# 预测未来3年市场规模
future_data = []
last_three = scaled_market_size[-3:]
for _ in range(3):
input_data = np.array(last_three).reshape(1, 3, 1)
prediction = model.predict(input_data)[0][0]
future_data.append(prediction)
last_three = np.roll(last_three, -1)
last_three[-1] = prediction

全部评论 (0)
还没有任何评论哟~
