实验要求:
- 创建一个有50个元素的Series对象,其values数组中的数据随机生成,数据总体上满足均值为1000, 标准差为200的正态分布。
- 自定义异常值为:小于QL-1.25IQR或大于QU+1.25IQR的值。绘制箱线图,检测生成的数据中是否包含大于上限和小于下限的异常值,并且要求这两类异常值都要有。如果不满足要求,那么就重新生成数据,直到满足要求为止;
- 利用箱线图获取并输出异常值的索引;
- 编写一个通用函数,其功能为将一个Series对象中大于上限的异常值用QU替换,而小于下限的异常值用QL替换。(原地操作)
- 用该函数处理满足(1)要求的Series对象,输出QU、QL的值。然后,创建一个如下所示的DataFrame对象,其index为异常值的索引,Before列上的数据为替换前的值,After列上的数据为替换后的值。最后,输出该DataFrame对象。
QU = 1153.800, QL= 897.075
Before After
31 518.7 897.075
32 1525.1 1153.800
38 495.0 897.075
47 1657.5 1153.800
注意:由于Series对象中的数据是随机生成的,所以你的运行结果中的数据不会和上面的示例数据相同。此外,DataFrame对象中的某些数据需要在数值替换前去获取。
- 读取通过第九章第1个作业获得的“Scores.xlsx”文件中的数据。编写3个通用函数,分别实现最小-最大标准化、标准差标准化和小数定标标准化的功能。然后,按最小-最大标准化处理“C++成绩”列上的数据,按标准差标准化处理“Java成绩”列上的数据,按小数定标标准化处理“Python成绩”列上的数据。最后,输出处理后的结果。(请自行检验结果的正确性)
- 随机生成20个[50, 100)之间的成绩,分别按下面的要求离散化。
- 指定区间边界为[0, 60, 70, 80, 90, 100],输出分箱结果(左闭右开)并统计各区间数据的个数,然后,依次把各区间的标签改为E、D、C、B、A,再次查看各区间数据的个数。
- 使用等宽法离散化数据,5个区间。查看分箱后的区间间隔并统计各区间数据的个数。
- 使用等频法离散化数据,5个区间。查看分箱后的区间间隔并统计各区间数据的个数。
实验内容和实验结果:
-
- 导入所需库与设置中文显示:
首先,导入numpy,
pandas, 和
matplotlib.pyplot` 这三个库,用于数据分析和绘图。然后设置matplotlib的字体配置,使得图表中的中文能够正常显示。
import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
- 生成随机数据并绘制箱线图直至出现上下界外的异常值:
- 使用
while
循环不断生成一个长度为50、均值为1000、标准差为200的正态分布随机数序列。 - 计算该序列的四分位数Q1(25%分位点)和Q3(75%分位点),以及四分位距IQR(Q3-Q1)。
- 根据IQR定义上下界,超出这上下界的数值被视为异常值。
- 当找到同时有超过上界和下界的数据点时(即存在异常值),退出循环。
- 绘制这个序列的箱线图,并在图中用红色虚线标出异常值界限。
- 使用
while True : s = pd.Series(np.random.normal(1000, 200, 50)) q1, q3 = s.quantile(0.25), s.quantile(0.75) iqr = q3 - q1 lower_bound = q1 - 1.25 * iqr upper_bound = q3 + 1.25 * iqr upout = s[s > upper_bound] downout = s[s < lower_bound] if not upout.empty and not downout.empty: break plt.figure(figsize=(10
- 导入所需库与设置中文显示: