Python实现视力数据趋势分析:从原始数据到防控建议
前言
近视防控的核心是"早发现、早干预"。但如何从大量的视力检查数据中发现趋势?
本文将用Python实现一个完整的视力数据分析流程。
技术栈:Python 3.x, pandas, matplotlib, scipy
一、数据准备
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
data = {
‘date’: pd.date_range(‘2023-01-01’, periods=12, freq=‘3M’),
‘right_sphere’: [-1.00, -1.25, -1.50, -1.75, -2.00, -2.25, -2.50, -2.75, -3.00, -3.25, -3.50, -3.75],
‘left_sphere’: [-0.75, -1.00, -1.25, -1.50, -1.75, -2.00, -2.25, -2.50, -2.75, -3.00, -3.25, -3.50],
‘right_axis’: [23.5, 23.6, 23.7, 23.8, 23.9, 24.0, 24.1, 24.2, 24.3, 24.4, 24.5, 24.6],
‘left_axis’: [23.4, 23.5, 23.6, 23.7, 23.8, 23.9, 24.0, 24.1, 24.2, 24.3, 24.4, 24.5],
‘outdoor_hours’: [0.5, 0.5, 1.0, 1.0, 1.5, 1.5, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0]
}
df = pd.DataFrame(data)
print(df.head())
二、趋势可视化
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams[‘font.sans-serif’] = [‘SimHei’]
matplotlib.rcParams[‘axes.unicode_minus’] = False
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
axes[0].plot(df[‘date’], df[‘right_sphere’], ‘r-’, label=‘右眼’, linewidth=2, marker=‘o’)
axes[0].plot(df[‘date’], df[‘left_sphere’], ‘b-’, label=‘左眼’, linewidth=2, marker=‘s’)
axes[0].set_title(‘近视度数变化趋势’, fontsize=14, fontweight=‘bold’)
axes[0].set_ylabel(‘球镜度数(D)’)
axes[0].legend()
axes[0].grid(True, alpha=0.3)
axes[0].tick_params(axis=‘x’, rotation=45)
axes[1].plot(df[‘date’], df[‘right_axis’], ‘r-’, label=‘右眼’, linewidth=2, marker=‘o’)
axes[1].plot(df[‘date’], df[‘left_axis’], ‘b-’, label=‘左眼’, linewidth=2, marker=‘s’)
axes[1].set_title(‘眼轴长度变化趋势’, fontsize=14, fontweight=‘bold’)
axes[1].set_ylabel(‘眼轴长度(mm)’)
axes[1].legend()
axes[1].grid(True, alpha=0.3)
axes[1].tick_params(axis=‘x’, rotation=45)
plt.tight_layout()
plt.savefig(‘vision_trend.png’, dpi=150)
plt.show()
三、增长率计算
df[‘right_growth’] = df[‘right_sphere’].diff()
df[‘left_growth’] = df[‘left_sphere’].diff()
df[‘right_axis_growth’] = df[‘right_axis’].diff()
df[‘left_axis_growth’] = df[‘left_axis’].diff()
avg_quarterly_growth = df[‘right_growth’].mean()
avg_annual_growth = avg_quarterly_growth * 4
print(f"右眼平均每3个月增长: {avg_quarterly_growth:.3f}D")
print(f"右眼平均每年增长: {avg_annual_growth:.3f}D")
四、干预效果分析
pre_intervention = df.iloc[:6]
post_intervention = df.iloc[6:]
pre_growth = pre_intervention[‘right_growth’].mean() * 4
post_growth = post_intervention[‘right_growth’].mean() * 4
print(f"干预前年增长率: {pre_growth:.3f}D")
print(f"干预后年增长率: {post_growth:.3f}D")
print(f"减缓比例: {(1 - post_growth/pre_growth)*100:.1f}%")
五、防控建议生成
def generate_recommendations(df):
recommendations = []
avg_growth = df[‘right_sphere’].diff().mean() * 4
if abs(avg_growth) > 0.5:
recommendations.append({
‘priority’: ‘高’,
‘type’: ‘光学干预’,
‘action’: ‘建议配戴离焦防控镜片(星趣控/新乐学)’
})
avg_outdoor = df[‘outdoor_hours’].mean()
if avg_outdoor < 2:
recommendations.append({
‘priority’: ‘高’,
‘type’: ‘行为指导’,
‘action’: f’当前户外{avg_outdoor}h/天,建议增加到2h/天以上’
})
axis_growth = df[‘right_axis’].diff().mean() * 4
if axis_growth > 0.2:
recommendations.append({
‘priority’: ‘中’,
‘type’: ‘视功能训练’,
‘action’: ‘眼轴增长较快,建议增加视功能训练’
})
return recommendations
recs = generate_recommendations(df)
for rec in recs:
print(f"【{rec[‘priority’]}】{rec[‘type’]}: {rec[‘action’]}")
六、总结
本文用Python实现了视力数据的完整分析流程,包括:
数据准备与清洗
趋势可视化
增长率计算
干预效果分析
防控建议生成
代码已整理为完整Jupyter Notebook,可在GitHub获取。
在实际应用中,伽视达眼视光的"一人一档"管理体系正是基于这样的数据分析逻辑。15年经验,10万+服务人次,2万+近视零增长的数据背后,是数据驱动的科学管理。
如果你是开发者或家长,欢迎交流讨论。伽视达在无锡有三个门店(沃尔玛总店、梅村店、经开区旗舰店),提供免费视力筛查
