引言
“科学素质”一次译自英文“Scientific Literacy”,由美国教育家、化学家、哈佛大学前校长柯南特(Conant)于1952年提出。在此基础上,芝加哥大学教授J.D.米勒于20世纪60年代创立了公民科学素质测评体系,即“米勒”体系,并得到了广泛的应用。
2016年4月,科技部发布《中国公民科学素质基准》,即中国公民应具备的基本科学技术知识和能力的标准,在网上引发了一定的争议。大家关于“什么是科学素质”、“如何评价公民科学素质”、“中美公民科学素质差距”等有一些的讨论。
今天,我在这里做了一个不算特别严谨的估计,来看一下中美公民科学素质的差距,并对2025年中国公民科学素质进行了估计。
问题描述
由相关资料可知,中美两国的公民科学素质如下:
显然,美国公民科学素质领先于中国,但是美国近年来的增长已经趋缓,而中国公民科学素质则进入快速增长阶段。
那么,中美之间差距有多少年呢?到2025年,中国公民科学素质会达到多少水平呢?
基本假设
要回答这两个问题,前提是我们有些基本且合理的假设:
- 公民科学素质的提高路径具有相似性;
- 公民科学素质的提高符合“S-曲线”。
由于公民科学素质的提高与公民的受教育水平、社会发展水平密切相关,所以不同国家的国民科学素质提高具有相似性,尤其是对于中美这种经济、人口体量相似的国家,所以第一个假设成立。
S型曲线在生态学、社会学、经济增长、城市化等领域广泛应用,从实证数据来看采用S-曲线描述公民科学素质是合理的,所以第二个假设成立。
此外,美国之前的结果都是基于“米勒体系”得到的(现在已经更新),我国的测评体系基本也是参照“米勒体系”,所以两者在测量上可以看作是一致的。
建模与分析
基于美国数据建模
根据网上的公开资料,我们找到了美国1988年的公民科学素质约为10%,那么我们首先以美国的数据作为基准,建立模型(代码为Python 3):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import numpy as np import matplotlib.pyplot as plt from scipy import stats from scipy.optimize import curve_fit import matplotlib as mpl font_name = "SimHei" mpl.rcParams['font.family']=font_name mpl.rcParams['axes.unicode_minus']=False mpl.rcParams['figure.figsize']=(15,9) mpl.style.use('ggplot')
year_us = np.asarray([1988, 1995, 1997, 1999, 2004, 2005, 2008, 2015, 2020]) sciq_us = np.asarray([10, 12, 14.7, 17.3, 24.5, 27.3, 28.2, 28.5, 29.5]) year_cn = np.asarray([2001, 2005, 2007, 2010, 2013, 2015, 2018, 2020]) sciq_cn = np.asarray([1.44, 1.6, 2.25, 3.27, 4.48, 6.2, 8.47, 10])
def func(x, a, b, c,d): return a / (1+np.exp(-b*(x-c)))+d
|
我们选用的模型为最经典的Logistic函数,标准Logistic函数如下图所示:
由于我们x-y坐标的特殊性,需要进行平移和缩放,所以模型为
f(x)=1+e−b(x−c)a+d
接下来,我们针对美国数据,估计a、b、c、d。
1 2 3 4 5 6 7 8 9
| mean_year_us = np.mean(year_us) std_year_us = np.std(year_us) year_us_normalized = stats.zscore(year_us)
params_us, pcov = curve_fit(func, year_us_normalized,sciq_us, p0=[1,0,0,0]) print(f'a: {params_us[0]}\n' f'b: {params_us[1]}\n' f'c: {params_us[2]}\n' f'd: {params_us[3]}\n')
|
a: 19.387495709028222
b: 3.490582791206227
c: -0.3462142933009988
d: 9.761449947006334
1 2 3 4 5 6 7 8 9 10 11 12
| xx = np.linspace(1987,2021, 100) xx_normalized = (xx-mean_year_us)/std_year_us yy=func(xx_normalized,params_us[0],params_us[1], params_us[2], params_us[3])
plt.figure(figsize=(20,10)) plt.plot(xx, yy, label='拟合曲线') plt.plot(year_us, sciq_us, 'r.', label='美国公民素质实际值') plt.xlabel('年 份', fontsize=20) plt.ylabel('公民素质', fontsize=20) plt.title('基于美国数据建模', fontsize=40) plt.legend(loc='upper left', fontsize=15) plt.show()
|
上图为基于美国数据的拟合结果,可以看出曲线拟合的效果较好,说明了假设和拟合模型的合理性。假设我们只使用美国数据建模,然后根据我国2020年达到1988年美国的水平(10.0),那么以美国模型外推5年,即美国模型1993年即为我国2025年水平,那么,可以估计我国2025年的公民科学素质为11.04。计算代码如:
1 2 3
| year_to_est = 1993 year_to_est_normalized = (year_to_est -mean_year_us)/std_year_us func(year_to_est_normalized, params_us[0],params_us[1], params_us[2], params_us[3])
|
11.037206824972879
基于中美数据联合建模
上面的做法只考虑了美国的数据,而忽视了我国的实际国情以及在科普方面的发展情况,所以更为合理的方式是同时利用中国和美国的数据进行联合建模,也就是用中国数据修正美国模型。但是,考虑到美国数据是中国数据的未来(即红色曲线是蓝色曲线向右延伸),其中最大的问题是中国2020年的“10”,与美国1988年的“10”,是两者对应的,还是两者有交错(中国2020已经超过美国1988),或者是两者有间隔(中国2020尚未达到美国2020)?
为了解决这一问题,我们假设美国1988与中国2020之间的间隔为i,当i>0时,说明两者有间隔;当i<0时,说明两者有交错。显然,我们不断改变n的取值,当模型拟合误差最小时,就是正确的间隔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| mse=[]
year_us_mod = year_us + 32 intervals = np.arange(-10,10) for i in intervals: x = np.append(year_cn, year_us_mod+i) y = np.append(sciq_cn, sciq_us) x_n = stats.zscore(x) mean_x = np.mean(x) std_x = np.std(x) popt, pcov = curve_fit(func, x_n, y, p0=[10,4,-0.5,10]) residuals = y - func(x_n, popt[0], popt[1], popt[2], popt[3]) mse.append(np.sum(residuals**2))
interval_min = intervals[np.argmin(mse)] mse_min = min(mse)
plt.figure(figsize=(20,10)) plt.plot(intervals,mse, label='拟合误差MSE') plt.plot(interval_min, mse_min, 'ro', label='最小值点') plt.xlabel('间隔年份', fontsize=20) plt.ylabel('MSE', fontsize=20) plt.title('拟合误差随间隔变化', fontsize=40) plt.legend(loc='upper right', fontsize=15) plt.show()
|
由上可知,间隔为-4时拟合误差最小,也就是说美国公民科学素质发展水平领先中国32-4=28年,我们看一下这时候整个S曲线的形状:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| i = interval_min x = np.append(year_cn, year_us_mod[1:]+i) y = np.append(sciq_cn, sciq_us[1:]) x_n = stats.zscore(x) mean_x = np.mean(x) std_x = np.std(x) params_all, pcov = curve_fit(func, x_n, y, p0=[20,4,-0.5,10])
xx = np.linspace(min(x)-1,max(x)+1, 100) xx_normalized = (xx-mean_x)/std_x yy=func(xx_normalized,params_all[0],params_all[1], params_all[2], params_all[3])
plt.figure(figsize=(20,10)) plt.plot(xx, yy, label='拟合曲线') plt.plot(year_cn, sciq_cn, 'r.', label='中国公民素质实际值') plt.plot(year_us_mod+i, sciq_us, 'g*', label='美国公民素质实际值\n(领先28年)') plt.xlabel('年 份', fontsize=20) plt.ylabel('公民素质', fontsize=20) plt.title('基于中美数据联合建模', fontsize=40) plt.legend(loc='upper left', fontsize=15) plt.show()
|
此时,估计中国2025年的公民科学素质为15.75。具体代码如下:
1 2 3
| year_to_est = 2025 year_to_est_normalized = (year_to_est -mean_x)/std_x func(year_to_est_normalized, params_all[0],params_all[1], params_all[2], params_all[3])
|
15.752431913031105
结论
根据美国数据推断公民科学素质发展规律,结果中国实际发展情况,我们可以得到如下结论:
-
中国与美国在公民科学素质上还有较大的差距,从过往来看,可能接近30年;
-
中国的公民科学素质正在快速提高,未来中美差距将逐步缩小;
-
中国公民科学素质加速提高可能有两方面原因:一是社会发展的客观规律,二是中国政府在此方面的支持;
-
2025年,中国公民科学素质可达到约15.75。
最后,想说一下,中美关系的温度大家都能感受到。封面那张图是《经济学人》2019年1月某一期的封面,5月《美国国家地理》里面也有文章讨论了中国在科技领域的投入,上图:
参考文献
-
2018世界公众科学素质促进大会 http://www.wcsl.org.cn/index.php?m=content&c=index&a=lists&catid=190
-
中国公民科学素质提高 与美国相差30年? http://news.creaders.net/china/2018/09/27/1999036.html
-
美国米勒公民科学素养测评指标体系的形成与演变 http://kpyj.crsp.org.cn/ch/reader/create_pdf.aspx?file_no=200902006&flag=1&journal_id=kepuyj&year_id=2009
-
制定公民科学素质发展目标 快速提升我国公民科学素质水平 http://www.xml-data.cn/KXYSH/html/ef4d192b-e982-4776-a708-375566d605f7.
-
公民科学素质测评国际新进展及对我国的启示 http://www.sohu.com/a/218919148_686936
-
中国公民科学素质基准 http://appweblogic.most.gov.cn/wsdc/zggmkxszjz/inc/1.doc
-
Scientific research is booming in China - National Geographic https://www.nationalgeographic.com/magazine/2019/05/data-show-why-china-science-research-is-booming/
-
Red moon rising https://www.economist.com/leaders/2019/01/12/how-china-could-dominate-science