# 6.3 方差分析与回归分析

## 6.3.1 方差分析

### 单因素方差分析

例：考虑温度对某一化工厂产品成品率的影响。选定5中不同的温度各做3次试验，测得结果如表【】所示

| <p><br>温度/℃</p>  | <p><br>40</p>    | <p><br>45</p>    | <p><br>50</p>    | <p><br>55</p>    | <p><br>60</p>    |
| ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- |
| <p><br>成品率/%</p> | <p><br>91.42</p> | <p><br>92.75</p> | <p><br>96.03</p> | <p><br>85.14</p> | <p><br>85.14</p> |
| <p><br>92.37</p> | <p><br>94.61</p> | <p><br>95.41</p> | <p><br>83.21</p> | <p><br>87.21</p> |                  |
| <p><br>89.50</p> | <p><br>90.17</p> | <p><br>92.06</p> | <p><br>87.90</p> | <p><br>81.33</p> |                  |

检验温度对某化工厂产品成品率是否有显著影响

解： 本题需要检验假设$$H\_0:\mu\_1=\mu\_2=\mu\_3=\mu\_4=\mu\_5;H\_1:\mu\_1,\mu\_2,\mu\_3,\mu\_4,\mu\_5$$不全等。

本题的关键是要计算$$S\_T, S\_A, S\_E$$以及$$F$$，首先，我们创建关于化工产品成品率的矩阵A，令矩阵的行列数分别为$$m=3$$与$$n=5$$，元素总数为count=9：

\[]:m=3

n=5

counts=15

A=np.array(\[\[91.42, 92.75, 96.03, 85.14, 85.14], \[92.37, 94.61, 95.41, 83.21, 87.21], \[89.50, 90.17, 92.06, 87.90, 81.33]])

Matrix(A)

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-6847eac31e8541c8047021f72ad181b04b8f6ed1%2Fc19ef72f6b62f10ac14ff956d62f4aa5.png?alt=media)

接着，我们计算矩阵$$A$$的列向量之和s0：

\[]: s0=A.sum(axis=0).T

Matrix(s0)

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-aa3098b1e73434e0e27add1b0d52e65a063d3d53%2F2e89ce3ad1c068b2e1847631b2fbe3f9.png?alt=media)

计算矩阵$$A$$的yuansu 之和：

\[]:A\_sum=A.sum()

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-e1b51d5929a974b028416a556507e865ce6834be%2F87a65031cce08cad2f556646c8d40b82.png?alt=media)

为了方便计算，我们预先定义关于以及的计算函数：

\[]:def St(A, A\_sum, counts):

return ((A-A\_sum/counts)\*\*2).sum()

\[]:def Sa(s0, A\_sum, counts, m):

return (((s0/m-A\_sum/counts)\*\*2).sum())\*m

\[]:def Se(se, sa):

return se-sa

\[]:def F(sa, se, n, counts):

return (sa/(n-1))/(se/(counts-n))

带入函数可得以及的值：

\[]:St=((A-A\_sum/n)\*\*2).sum()

St

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-1285b0b9d82fcafd28ea2b8335bfd4c93ac33f74%2Fd110f95680b782b5099a28bf12e79135.png?alt=media)

\[]:Sa=(((s1/3-A\_sum/n)\*\*2).sum())\*3

Sa

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-575de7bae6fbf3c6f9e8b61160a8b0ea5dfb5b02%2Fd828b196ae1bf3be886b55db4389fb62.png?alt=media)

\[]:Se=St-Sa

Se

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-8c5af4b4dba2d25524fddb7a2b935375a05d7127%2Fc9236d58519b76cd2058a178acf3a6c7.png?alt=media)

\[]:F=(Sa/(m-1))/(Se/(n-m))

F

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-96b37ba749f700588ccc657e378044da327a749c%2F9b11f2964b0bc8cb5a2377d3676780be.png?alt=media)

接下来，我们将计算结果记录在表【】 方差分析表中

表【】 化工产品方差分析表

| 方差来源 | 平方和              | 自由度 | 平均平方和                  | F值            | 临界值                                         |
| ---- | ---------------- | --- | ---------------------- | ------------- | ------------------------------------------- |
| 组间   | $$S\_A=232.856$$ | 4   | $$\bar{S\_A}=58.2139$$ | $$F=11.1423$$ | $$F\_0.05 (4,10)=3.45 F\_0.01 (4,10)=5.99$$ |

```
  |
```

\| 组内 | $$S\_E=52.2457$$ | 10 | $$\bar{S\_E}=5.2246$$ | $$F=11.1423$$ | $$F\_0.01 (4,10)=5.99$$ | | 总和 | $$285.102$$ | 14 | | | |

因为，拒绝原假设，即认为不同的温度对化工产品成品率有特别显著的影响。

例：某灯泡厂用四种不同配料方案制成灯丝，生产了斯皮灯泡，抽样测得使用寿命如表【】所示：

| <p>   <br>配料方案   </p>       | <p>   <br>1   </p>    | <p>   <br>2   </p>    | <p>   <br>3   </p>    | <p>   <br>4   </p>    | <p><br>60</p>    |
| --------------------------- | --------------------- | --------------------- | --------------------- | --------------------- | ---------------- |
| <p>   <br>实验数据（使用寿命）   </p> | <p>   <br>1600   </p> | <p>   <br>1580   </p> | <p>   <br>1460   </p> | <p>   <br>1510   </p> | <p><br>85.14</p> |
| <p>   <br>1610   </p>       | <p>   <br>1640   </p> | <p>   <br>1550   </p> | <p>   <br>1520   </p> | <p><br>87.21</p>      |                  |
| <p>   <br>1650   </p>       | <p>   <br>1640   </p> | <p>   <br>1600   </p> | <p>   <br>1530   </p> | <p><br>81.33</p>      |                  |
| <p>   <br>1680   </p>       | <p>   <br>1700   </p> | <p>   <br>1520   </p> | <p>   <br>1570   </p> |                       |                  |
| <p>   <br>1700   </p>       | <p>   <br>1750   </p> | <p>   <br>1640   </p> | <p>   <br>1600   </p> |                       |                  |
| <p>   <br>1720   </p>       | <p>   <br>-   </p>    | <p>   <br>1660   </p> | <p>   <br>1680   </p> |                       |                  |
| <p>   <br>1800   </p>       | <p>   <br>-   </p>    | <p>   <br>1740   </p> | <p>   <br>-   </p>    |                       |                  |
| <p>   <br>-   </p>          | <p>   <br>-   </p>    | <p>   <br>1820   </p> | <p>   <br>-   </p>    |                       |                  |

试问不同的配料方案对灯泡的使用寿命有无显著影响

解：本题需要检验假设$$H\_0:\mu\_1=\mu\_2=\mu\_3=\mu\_4;H\_1:\mu\_1,\mu\_2,\mu\_3,\mu\_4$$不全等。

本题的关键是要计算以及，首先，我们创建关于化工产品成品率的矩阵A，矩阵的列数为n=5，元素总数为count=9，除此之外，我们还需要额外定义一个形状为的列表变量mn用来存储各列元素的个数：

\[]:A=np.array(\[\[1600, 1580, 1460, 1510], \[1610, 1640, 1550, 1520], \[1650, 1640, 1600, 1530],

\[1680, 1700, 1520, 1570], \[1700, 1750, 1640, 1600], \[1720, np.nan,1660, 1680],

\[1800, np.nan, 1740, np.nan], \[np.nan,np.nan , 1820,np.nan ]])

Matrix(A)

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-4f261b5fd22fb012826f4a1596f792bf3323fecf%2Ffe7660543a0150eb23c20528ccd04df4.png?alt=media)

\[]:n=4

nm=\[7, 5, 8, 6]

counts=np.sum(\~np.isnan(A))

counts

\[]: 26

为了便于计算矩阵各列向量中元素之和s0，我们一个新的矩阵B用来存储矩阵A中的元素，不同的是，B中的np.nan元素被替换成了0：

\[]:B=A

B\[np.isnan(B)]=0

B

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-556a614be0275bb7a3ea0c0b2f1783c12ae91808%2Fbdfd0c113366171f7bd46b7dcc0279a0.png?alt=media)

\[]:s0=B.sum(axis=0)

s0

\[]:array(\[11760., 8310., 12990., 9410.])

A\_sum用来存储矩阵A中元素之和：

\[]:A\_sum=np.nansum(A)

A\_sum

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-81184f2f28c4a262c56140d64d3cb31253eaa804%2Ff608af3f8cfd993f131dcc66ec712137.png?alt=media)

使用变量s来存储矩阵B的列向量的平方和：

\[]:ss=(B\*\*2).sum(axis=0)

ss

为了方便，我们直接计算$$S\_T, S\_A$$，对于$$S\_E$$和$$F$$，我们代入函数进行计算：

\[]:array(\[19785400., 13828100., 21189700., 14778700.])

\[]:st=ss.sum()-A\_sum\*\*2/counts

st

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-1a81a762675abec7b35d23c313a9f641d5f7df56%2F02cd361422ff6b0642063b8a7b7a87e9.png?alt=media)

\[]:sa=((s0\*\*2)/nm).sum()-(A\_sum\*\*2)/counts

sa

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-b8325ab6d5ae360656804dda3feb9a991287c81a%2Fe71833b35d230c1304e5117832492976.png?alt=media)

\[]:se=Se(st, sa)

se

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-ca9f5a99a389a0caf5e7a69a444b11b815c3dbc8%2F6e1377ab39f4f8f1337b179464301053.png?alt=media)

\[]:f=F(sa, se, n, counts)

f

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-dba862ebdb5747ba6ea815be9b79e105dacbfe2a%2Fb9d5a3afcfdde7884dee78e2434b09ff.png?alt=media)

接下来，我们将计算结果记录在表【】 灯泡使用方差分析表中

表【】 灯泡使用方差分析表

| 方差来源 | 平方和             | 自由度 | 平均平方和                | F值           | 临界值                     |
| ---- | --------------- | --- | -------------------- | ------------ | ----------------------- |
| 组间   | $$S\_A=45438$$  | 3   | $$\bar{S\_A}=15146$$ | $$F=2.3984$$ | $$F\_0.05 (3,22)=3.05$$ |
| 组内   | $$S\_E=163351$$ | 22  | $$\bar{S\_E}=7425$$  | $$F=2.3984$$ |                         |
| 总和   | $$S\_T=208788$$ | 25  |                      |              |                         |

因为，所以接受，即认为4种配料方案的使用寿命没有显著影响。

### 双因素方差分析

例：对木材进行抗压强度的试验，选择三种不同比重$$(g/cm^3 )$$的木材

$$A1:0.34~~0.47;A2:0.48~~0.52;A3:0.53\~0.56$$

及三张不同的加荷速度$$(kg/cm^2 \dot min)$$

测得木材的抗压强度$$(kg/cm^2 )$$

| Value | B1   | B2   | B3   |
| ----- | ---- | ---- | ---- |
| A1    | 3.72 | 3.90 | 4.05 |
| A2    | 5.22 | 5.24 | 5.08 |
| A3    | 5.28 | 5.74 | 5.54 |

检验木材比重及加禾速度对木材的抗压强度是否有显著影响

解： 本题需要检验假设 $$H\_{0A}: \mu\_A1= \mu\_A2= \mu\_A3; H\_1A: \mu\_A1, \mu\_A2, \mu\_A3$$ 不全等；$$H\_{0B}: \mu\_B1= \mu\_B2= \mu\_B3; H\_1B: \mu\_B1, \mu\_B2, \mu\_B3$$ 不全等。*。*

本题的关键是要计算以及，首先，我们创建关于木材抗压强度的矩阵A，令矩阵的行列数分别为m=3与n=3，元素总数为count=9：

\[]counts=9

m=3

n=3

nm=\[3, 3, 3, 3]

A=np.array(\[\[3.72, 3.90, 4.05], \[5.22, 5.24, 5.08], \[5.28, 5.74, 5.54]])

Matrix(A)

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-47cc1900f7d23f4a27741f8ed77e0c1f8dd8cff6%2F94d1730591d39c361d003e942109247b.png?alt=media)

令s0为矩阵A行元素之和，s1为列元素之和：

\[]:s0=A.sum(axis=0)

s1=A.sum(axis=1)

Matrix(s0), Matrix(s1)

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-aff1470a5d6dcb4d7ce6d673c09fee7d031dcaf9%2Fc0eb226b84e3d9ac2894b5ea3f85f730.png?alt=media)

矩阵元素之和为A\_sum：

```python
[]:A_sum=A.sum()

A_sum
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-92372469638b1686590975647b07655af294c8fc%2Ffb945ec5818362f3e1076cd2ce98bfb6.png?alt=media)

接下来我们来定义Sb，Se2，Fa2，Fb2函数对应：

```python
[]:def Sb(s1, A_sum, counts, n):

return (((s1/n-A_sum/counts)\*\*2).sum())\*n

[]:def Se2(se, sa, sb):

return se-sa-sb

[]:def Fa2(sa, se, m, n):

return (sa/(m-1))/(se/((m-1)\*(n-1)))

[]:def Fb2(sb, se, m, counts):

return (sb/(m-1))/(se/((m-1)\*(n-1)))
```

带入函数可得值：

```python
[]:st=St(A, A_sum, counts)

st
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-5b74c12eab112f5fdeb0f85c7e44fd563e0c5f04%2F34065ee0c806c0d04cf504753b305a38.png?alt=media)

```python
[]:sa=Sa(s1, A_sum, n)

sa
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-f056c78c3018117cc91f6d1a6ccd3b82189eb0b6%2Ffba55c1564cf886ead59da0bed50bef9.png?alt=media)

```python
[]:sb=Sb(s0, A_sum, n)

sb
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-c952c2c6fd0f82922eb9f9dbb8849f790e8bbc47%2Faa8079aa07cb6c89b830a8d7585cba42.png?alt=media)

```python
[]:se=Se2(st, sa, sb)

se
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-d8277f8ada3b834b2acb0c773fa9763223fd955e%2F78a28a6282499d1c520258d4156b1a39.png?alt=media)

```python
[]:fa2=Fa2(sa, se, m, n/m)

fa2
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-23e28b563c7a5417a1b8af5cd773571f63a4e3ee%2F4acb8159de7b7534aa158113ce6812a9.png?alt=media)

```python
[]:fb2=Fb2(sb, se, m, n/m)

fb2
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-68d51062d6d3868f1af585b9158f5bd01be50bc9%2F997a937a0f0d05d717fcb656500e3f2e.png?alt=media)

接下来，我们将计算结果记录在表【】 木材抗压强度方差分析表：

表【】 木材抗压强度方差分析表

| 方差来源 | 平方和             | 自由度 | 平均平方和                   | F值                | 临界值                     |
| ---- | --------------- | --- | ----------------------- | ----------------- | ----------------------- |
| 因素A  | $$S\_A=4.4366$$ | 2   | $$\bar{S\_{A}}=2.2183$$ | $$F\_A=88.37848$$ | $$F\_{A\_0.01}=18.00$$  |
| 因素B  | $$S\_B=0.0758$$ | 2   | $$\bar{S\_{B}}=0.0379$$ | $$F\_B=1.50996$$  | $$F\_{B\_{0.05}}=6.94$$ |
| 误差   | $$S\_E=0.1004$$ | 4   | $$\bar{S\_{E}}=0.0251$$ |                   |                         |
| 总和   | $$S\_T=4.6128$$ | 8   |                         |                   |                         |

因为，所以接受，即认为4种配料方案的使用寿命没有显著影响。

## 6.3.2 回归分析

例：在某种商品表面进行腐蚀刻线的实验，测得腐蚀深度y与腐蚀时间x之间对应的一组数据如表【】所示

| $$x/s$$     | 5 | 10 | 15 | 20 | 30 | 40 | 50 | 60 | 70 | 90 | 108 | 120 |
| ----------- | - | -- | -- | -- | -- | -- | -- | -- | -- | -- | --- | --- |
| $$y/\mu m$$ | 6 | 10 | 10 | 13 | 16 | 17 | 19 | 23 | 25 | 29 | 38  | 46  |

试给出腐蚀深度y对腐蚀时间x的回归直线方程。

解：在本例中，我们使用np.poly()函数来对数值进行拟合：

```python
[]:x=[6, 10, 11, 13, 16, 17, 19, 23, 25, 29, 38, 46]

y=[5, 10, 15, 20, 30, 40, 50, 60, 70, 90, 108,120]

[]:param=np.polyfit(y, x, 1)

f=np.poly1d(param)

print(f)
```

\[]: ![](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-9c5376bfa51bdaea227797f0e434cc931415ecfd%2F0f68d6b1819fd63788d86c78bddf2413.png?alt=media)

因此，对数值进行一次多项式拟合的结果为：。

接下来，我们使用matplobli来观测拟合效果，matplotlib的使用方法详见第10章。

```python
[]:from matplotlib import pyplot as plt

%matplotlib inline

[]:plt.rcParams['font.sans-serif']=['SimHei'] \#正常显示正文标签

plt.rcParams['axes.unicode_minus']=False \#正常显示负号

plt.xlabel("时间")

plt.ylabel("腐蚀深度")

plt.title("腐蚀刻度与时间关系图")

axes = plt.gca()

axes.set\_xlim([0,50])

axes.set\_ylim([0,120])

plt.scatter(x, y)

m=np.linspace(0, 50, 100)

n=m\*f[0]+f[1]

plt.plot(n)

plt.show()
```

\[]: ![C:\Users\Johan\AppData\Local\Microsoft\Windows\INetCache\Content.MSO\DFB09325.tmp](https://3607972777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mjx-9CYfSlrNPw45CMh%2Fuploads%2Fgit-blob-3cccaf33a2a4d3ff4663d0368d078a1694bcf2a2%2F263811d4fd3a83e66ce828d1f2570075.png?alt=media)

由matplotlib绘制可以看出函数基本对腐蚀刻线趋势变换进行拟合。
