实验要求:

任务3.1 卡方检验

  1. 复习第四章数据统计中卡方分布及参数检验相关内容,简述卡方检验基本原理与过程。
  2. 假设一次学科竞赛A、B两所学校各有300人参加,工作人员随机取样了两所学校若干同学的成绩情况,如文件夹中scores文件所示。
  3. 将文件夹中所给数据,转化成四格表形式。
    合格 不合格
    A学校
    B学校
  4. 写出原假设与备择假设。
  5. 选择适当的假设检验方法,编程进行数据分析。输出自由度、卡方值、p值和最终检验结果(保留四位小数)。

任务3.2 T检验

  1. 简述T检验基本原理与过程。
  2. 设某工厂生产的一批灯泡服从正态分布,该批灯泡设计寿命为2000小时。现从该批灯泡中随机抽取11只进行测试,得到的最终寿命如下:1789, 1867, 2012, 2134, 1952, 1997, 1840, 1567, 2230, 2403,1777。请问,在显著水平为0.05下,能否认为本批灯泡合格?列出计算方法并编程验证。

任务3.3 方差检验(optional)

  1. 简述方差分析的种类、原理与流程。
  2. 某灯泡制造厂有3条不同的生产线,分别为国产A、德国产B和美国产C,有四班组生产工人,分别为甲、乙、丙、丁班组。经理希望研究不同生产线以及不同生产班组对产量的影响,因此安排生产计划,让甲、乙、丙、丁四班工人操作生产线A、B、C各生产3天,其灯泡产量如下表格所示:
    A B C
    甲 56,55,59 62,61,66 52,50,47
    乙 47,45,49 54,50,55 42,45,48
    丙 47,49,44 56,52,54 44,49,48
    丁 53,57,54 54,61,60 48,51,64
  3. 请选用适合的方差分析方法,分析班组与生产线对灯泡产量是否有显著影响,并说明理由。
  4. 编程验证分析,并得出结论。

    上机实现:

    任务3.1卡方检验

    导入所需要的包

    1. import pandas as pd
    2. import numpy as np
    3. import os
    4. import csv
    5. from scipy.stats import chi2_contingency

    数据预处理

    导入原始数据

    1. file_path = r"D:\DataAnalysis\scores.xlsx"
    2. data = pd.read_excel(file_path,header=0)
    3. print(data)
    ``` 序号 成绩是否合格 所属学校 0 1 合格 A学校 1 2 合格 A学校 2 3 合格 A学校 3 4 合格 B学校 4 5 合格 B学校 .. … … … 234 235 合格 A学校 235 236 不合格 B学校 236 237 不合格 B学校 237 238 不合格 B学校 238 239 不合格 B学校

[239 rows x 3 columns]

  1. <a name="ccf66a03"></a>
  2. #### 转化为四格表
  3. ```python
  4. # 统计出A学校及格、不及格的人数
  5. data2 = data.drop(columns='序号')
  6. data2.groupby('所属学校').value_counts()
  1. 所属学校 成绩是否合格
  2. A学校 合格 86
  3. 不合格 36
  4. B学校 合格 77
  5. 不合格 40
  6. dtype: int64
  1. data3=[[86,36],[77,40]]
  2. data4 = pd.DataFrame(data3,index=['合格','不合格'],columns=['A学校','B学校'])
  3. data4
A学校 B学校
合格 86 36
不合格 77 40

选取备择假设与原假设

原假设:A学校的合格率大于B学校
备择假设:A学校的合格率小于等于B学校

计算卡方等数字特征值

  1. kt = chi2_contingency(data4)
  2. print('卡方值=%.4f, p值=%.4f, 自由度=%i expected_frep=%s'%kt)
  1. 卡方值=0.4066, p值=0.5237, 自由度=1 expected_frep=[[83.20502092 38.79497908]
  2. [79.79497908 37.20502092]]

任务3.2 T检验

导入样本并计算样本均值

  1. sample = np.array([1789, 1867, 2012, 2134, 1952, 1997, 1840, 1567, 2230, 2403, 1777])
  2. m = np.mean(sample)
  3. print("样本均值: %0.4f" % m)
  1. T检验相关结果:
  2. 样本均值: 1960.7273

计算t值和p值

  1. t, p = stats.ttest_1samp(sample, 2000, axis=0) # 单样本检验
  2. print("t值: %0.4f" % t)
  3. print("p值: %0.4f" % p)
  4. print()
  5. print()
  1. t值: -0.5586
  2. p值: 0.5887

结果简述:

根据计算出的p值和t值可知,在显著水平为0.05下,能认为本批灯泡合格。

任务3.3 方差检验

原理简述:

方差分析有以下几种类型:

  1. 单因素方差分析:只涉及一个自变量(也称因素)的情况。
  2. 双因素方差分析:涉及两个自变量的情况,可以考察两个自变量各自对反应变量的影响以及它们之间的交互作用。
  3. 重复测量方差分析:适用于同一受试者在不同时间点或条件下进行多次测量的情况。

方差分析的扩展:包括三因素、四因素及更多因素的方差分析等。

方差分析的原理基于总离差平方和的分解,将其分解为组内离差平方和和组间离差平方和,并通过比较组间离差平方和和组内离差平方和的大小,判断因素变量是否对反应变量有显著影响。

方差分析的流程大致如下:

  1. 确定问题并收集数据
  2. 建立假设并确定显著性水平
  3. 进行方差分析,计算组间

代码实现:

导入需要的数据和包

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns
  5. from statsmodels.formula.api import ols
  6. from statsmodels.stats.anova import anova_lm
  7. from statsmodels.stats.multicomp import pairwise_tukeyhsd

将表中数据转换为如下的DataFrame对象

  1. dfdata = {
  2. 'line':['A','A','A','B','B','B','C','C','C','A','A','A','B','B','B','C','C','C','A','A','A','B','B','B','C','C','C','A','A','A','B','B','B','C','C','C'],
  3. 'people':['甲','甲','甲','甲','甲','甲','甲','甲','甲','乙','乙','乙','乙','乙','乙','乙','乙','乙','丙','丙','丙','丙','丙','丙','丙','丙','丙', '丁','丁','丁','丁','丁','丁','丁','丁','丁'] ,
  4. 'value':[56,55,59,62,61,66,52,50,47,47,45,49,54,50,55,42,45,48,47,49,44,56,52,54,44,49,48,53,57,54,54,61,60,48,51,64]
  5. }
  6. df = pd.DataFrame(dfdata)
  7. df

运行结果:

line people value
0 A 56
1 A 55
2 A 59
3 B 62
4 B 61
5 B 66
6 C 52
7 C 50
8 C 47
9 A 47
10 A 45
11 A 49
12 B 54
13 B 50
14 B 55
15 C 42
16 C 45
17 C 48
18 A 47
19 A 49
20 A 44
21 B 56
22 B 52
23 B 54
24 C 44
25 C 49
26 C 48
27 A 53
28 A 57
29 A 54
30 B 54
31 B 61
32 B 60
33 C 48
34 C 51
35 C 64

描述性分析:

  1. df.describe()
value
count 36.000000
mean 52.444444
std 6.058969
min 42.000000
25% 48.000000
50% 52.000000
75% 56.000000
max 66.000000
  1. sns.boxplot(x = 'line', y = 'value', data = df)
  2. sns.boxplot(x = 'people', y = 'value', data = df)
  3. model = ols('value ~C(line) + C(people) + C(line):C(people)', data = df).fit()
  4. anova_table = anova_lm(model, type = 2)
  5. pd.DataFrame(anova_table)
  6. print(pairwise_tukeyhsd(df['value'], df['people']))
  7. print(pairwise_tukeyhsd(df['value'], df['line']))
  1. print('方差检验相关结果:')
  2. print()
  3. df = pd.DataFrame(np.array([
  4. [56, 55, 59, 62, 61, 66, 52, 50, 47],
  5. [47, 45, 49, 54, 50, 55, 42, 45, 48],
  6. [47, 49, 44, 56, 52, 54, 44, 49, 48],
  7. [53, 57, 54, 54, 61, 60, 48, 51, 64]
  8. ]))
  9. df.index = pd.Index(['甲', '乙', '丙', '丁'], name='班组')
  10. df.columns = pd.Index(['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], name='生产线')
  11. df = df.stack().reset_index().rename(columns={0: '产量'})
  12. # print(df)
  13. model = ols('产量~C(班组) + C(生产线) + C(班组):C(生产线)', df).fit()
  14. print(anova_lm(model))

运行结果如下:

  1. Multiple Comparison of Means - Tukey HSD, FWER=0.05
  2. =====================================================
  3. group1 group2 meandiff p-adj lower upper reject
  4. -----------------------------------------------------
  5. -6.5556 0.0417 -12.9229 -0.1882 True
  6. -7.4444 0.0169 -13.8118 -1.0771 True
  7. 0.6667 0.9919 -5.7007 7.034 False
  8. -0.8889 0.9812 -7.2563 5.4785 False
  9. 7.2222 0.0213 0.8548 13.5896 True
  10. 8.1111 0.0082 1.7437 14.4785 True
  11. -----------------------------------------------------
  12. Multiple Comparison of Means - Tukey HSD, FWER=0.05
  13. =====================================================
  14. group1 group2 meandiff p-adj lower upper reject
  15. -----------------------------------------------------
  16. A B 5.8333 0.0232 0.6981 10.9685 True
  17. A C -2.25 0.5359 -7.3852 2.8852 False
  18. B C -8.0833 0.0014 -13.2185 -2.9481 True
  19. -----------------------------------------------------

image.png

  1. 方差检验相关结果:
  2. df sum_sq mean_sq F PR(>F)
  3. C(班组) 3.0 489.555556 163.185185 13.412481 0.000024
  4. C(生产线) 2.0 417.722222 208.861111 17.166667 0.000024
  5. C(班组):C(生产线) 6.0 85.611111 14.268519 1.172755 0.353370
  6. Residual 24.0 292.000000 12.166667 NaN NaN

结果说明:

如上图所示,不同车间组,不同的生产线对产量有显著的影响。