每天非常钟Python数据分析[10]:Scipy拟合新型肺炎全国疫情曲线
作者头像
  • 温煦
  • 2020-05-12 15:47:44 1

序言

大家好,我是Python数据分析师,希望与大家分享我在数据分析领域的经验和心得。为此,我编写了一套名为“人工智能四部曲”的教程:《15天学会Python编程》、《每天10分钟,用Python学数据分析》、《Python数据可视化实战》、《33天搞定机器学习》。欢迎订阅,每个专栏都配有相应的数据集和代码示例,请通过私信联系我获取更多信息。

《每天10分钟,用Python学数据分析》 第11篇

SciPy是一个强大的工具,对于新手来说,可能难以掌握其所有功能。因此,本章介绍数据分析工作中常用的SciPy模块和方法,并通过一个实际案例——拟合新型肺炎全国疫情曲线,来巩固所学知识。

SciPy:科学计算的核心

SciPy是一个面向Python的开源科学计算库,广泛应用于数学、科学和工程领域。它可以解决插值、积分、优化、常微分方程数值解、信号处理等问题。

SciPy的功能概览

SciPy包含多个功能强大的模块,如插值、积分、优化、统计等。例如,插值模块可用于填补数据中的空缺,而统计模块则包含大量概率分布和统计函数。此外,SciPy还可以用于拟合数据,例如拟合新型肺炎疫情曲线。

SciPy的插值功能

插值是一种重要的函数逼近方法,通过已知数据点来估算未知点的值。SciPy的scipy.interpolate模块提供了多种插值方法,包括线性插值、二次插值和三次插值等。

下面是一个简单的例子,展示如何使用scipy.interpolate.interp1d进行插值:

```python import numpy as np from scipy.interpolate import interp1d

x = np.linspace(0, 10 * np.pi, 20) y = np.cos(x)

使用线性插值和二次插值

fl = interp1d(x, y, kind='linear') fq = interp1d(x, y, kind='quadratic')

设置插值区间

xint = np.linspace(x.min(), x.max(), 1000) yintl = fl(xint) yintq = fq(xint)

import matplotlib.pyplot as plt

plt.plot(xint, fl(xint), color="green", label="Linear") plt.plot(xint, fq(xint), color="yellow", label="Quadratic") plt.legend(loc="best") plt.show() ```

SciPy的统计功能

SciPy的scipy.stats模块包含了100多个概率分布,包括连续分布和离散分布。它提供了丰富的统计函数,如描述性统计、相关性检验和统计检验等。

以下是一些常用函数:

  • describe():计算描述性统计信息
  • gmean():计算几何平均值
  • hmean():计算调和平均值
  • kurtosis():计算峰度
  • mode():返回众数
  • skew():计算偏度
  • f_oneway():执行单因素方差分析
  • iqr():计算四分位距
  • zscore():计算Z分数
  • sem():计算标准误

SciPy的优化功能

SciPy的scipy.optimize模块提供了多种优化算法,包括最小二乘法和曲线拟合。这里我们关注最小二乘法和曲线拟合的应用。

例如,使用最小二乘法拟合一条直线:

```python import numpy as np from scipy import optimize

X = np.array([8.19, 2.72, 6.39, 8.71, 4.7, 2.66, 3.78]) Y = np.array([7.01, 2.78, 6.47, 6.71, 4.1, 4.23, 4.05])

def residuals(p): k, b = p return Y - (k * X + b)

r = optimize.leastsq(residuals, [1, 0]) k, b = r[0] print("k=", k, "b=", b)

绘制拟合结果

import matplotlib.pyplot as plt

plt.plot(X, Y, "o", label="实际数据") plt.plot(X, k * X + b, label="拟合数据") plt.legend(loc="best") plt.show() ```

应用实例:分析新型肺炎确诊数据

为了将所学知识应用于实际问题,我们使用《每天10分钟,用Python学数据分析》中的实际数据,拟合全国疫情趋势图。

首先,导入必要的库和数据:

```python import numpy as np import pandas as pd from scipy.optimize import curve_fit import matplotlib.pyplot as plt

data = pd.readcsv('../yiqing.csv', encoding='gbk') xdate = data['日期'] xdata = data['天数'] yConfirmed = data['确诊']

正常显示中文标签

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.figure(figsize=(13, 6), dpi=120) plt.scatter(xdata, yConfirmed, c='r', label='实际数据') plt.title('新型肺炎全国疫情趋势图', fontdict={'fontsize': 15}, color='r') plt.xlabel('天数') plt.ylabel('确诊人数') plt.xticks(fontsize=10) plt.yticks(fontsize=10) plt.grid(True) plt.show() ```

接下来,拟合数据并绘制拟合曲线:

```python def func(x, a, b, c): return a * np.exp(b * x) + c

popt, pcov = curvefit(func, xdata, y_Confirmed) print(popt)

绘制拟合结果

plt.scatter(xdata, yConfirmed, c='r', label='实际数据') plt.plot(xdata, func(xdata, *popt), label='拟合数据') plt.legend(loc='best') plt.show() ```

通过上述拟合,可以看到数据的拟合效果一般,但这是合理的,因为真实的疫情变化并不是完全规律的。如果调整数据的起点,例如将1月20日作为起点,拟合效果会更好。

相信通过全国人民的共同努力,这个模型很快就会失去作用。希望大家继续关注和支持!

欢迎订阅,获取更多知识!


以上就是改写后的文章内容,希望对你有所帮助。

    本文来源:图灵汇
责任编辑: : 温煦
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
拟合数据分析肺炎疫情曲线新型每天非常Python全国
    下一篇