应对期末考试,对本学期《Python 数据分析与应用》课程学习的内容进行复习。该文章为本次模拟试卷!


# 一、选择题 20 分

1.以下哪个函数不属于 Pandas 的 DataFrame 对象?

A. dropna()

B. sort_values()

C. mean()

D. plot()

答案: D

2.在 Pandas 中,DataFrame 对象通常用来表示:

A. 一维数组 B. 二维标签化数据结构 C. 图表 D. 统计模型

答案: B

3. 以下哪个不是 Pandas DataFrame 的方法?

A. head() B. tail() C. shape() D. info()

答案: D

4. 下列关于 pandas 支持的数据结构的说法错误的是 ( )

A.pandas 只支持 Series 数据结构

B.pandas 支持 Series 和 DataFrame

C.DataFrame 可与带有标记轴 (行和列) 的二维数组一起使用

D.Series 被定义为能够存储各种类型数据的一维数组

答案: A

5. 下列对 DataFrame 的常用属性说法错误的是 ( )。

A.values 可以获取元素

B.index 可查看索引情况

C.column 可查看 DataFrame 的列名

D.dtypes 可查看各列的数据类型

答案: C

6. 在下列选项中可以进行横向堆叠的是 ( )。

A. merge

B.concat

C. join()

D. combine_first()

答案: B

7. 在下列选项中可以进行重叠合并的是 ( )。

A. merge

B.concat

C. append()

D. combine_first()

答案: D

8. 在下列选项中可以进行缺失值替换的是 ( )。

A.dropna0 方法 B.fllna () 方法

C.isnull0 方法 D.notnull0 方法

答案: B

9. 在下列选项中不属于检测与处理缺失值的方法的是 ( )

A. 插值法

B. 替换法

C. 哑变量处理

D. 删除法

答案: C

10. 下列代码中能够为图形添加图例的是 ( )

A. plt.xticks([0,1,2,3, 4])

B. plt.plot(x,y)

C,plt.legend('y = cos x’)

D. pit.title (散点图”)

答案: C

11. 下列说法不正确的是 ( )

A. 散点图可以用于查看数据中的离释值

B. 折线图可以用于查看数据的数最差和变化趋势

C. 柱形图可以用于查看整体数据的数量分布

D. 箱线图可以用于查看特征间的相关关系

答案: D

12. 下列不是系列配置项的是 ( )。

A. 标记点配置项

B. 标签配置项

C. 文本样式配置项

D. 标题配置项

答案: D

13. 下列说法正确的是 ( )

A. 基本散点图和 3D 散点图的绘制方法相同

B. 热力图可用于了解数据集中的变量的相关关系

C.stripplot 函数接收的数据只能是列表和数据框

D. 使用 stripplot 函数可以绘制线性回归拟合图

答案: B

14.classification_report 函数用于输出分类模型评价报告,其内容不包括 ( )。

A. precision

B. recall

C.fl-score

D. true_postive_rate

答案: D

15. 下列算法中属于分类方法的是 ( )

A.SVC 算法

B.CLIOUE 算法

C.CLARANS 算法

D.K-MEDOIDS 算法

答案: A

16.skleam 中用于对特征进行归一化的函数是 ( )

A.StandardScaler

B, Normalizer

C.Binarizer

D.MinMaxScaler

答案: A

17. 下列图形常用于分析各分组数据在总数据中所占比例的是( )

A. 折线图

B. 饼图

C. 柱形图

D. 箱线图

答案: B

18.skleam 中用于对特征进行归一化的函数是 ( )

A.StandardScaler

B, Normalizer

C.Binarizer

D.MinMaxScaler

答案: B

19. 下列关于回归模型评价指标说法不正确的是 ( )

A. 平均绝对误差的值越接近 0,模型性能越好

B.R 值越接近 1,模型性能越好

C. 可解释方差越接近 0,模型性能越差

D. 均方误差越接近 0,模型性能越差

答案: D

20.skleam 转换器的主要方法不包据 ( )

A. fit()

B. transform()

C:fa_transform()

D, fit_transforms()

答案: D

# 二、简答题 10 分

1. 阐述 Pandas 的作用

Pandas 是一个开源数据分析工具,它提供了高效、易用的数据结构 和数据分析工具。它主要引入了两种新的数据结构:DataFrame 和 Series,通过 Pandas,用户可以方便地进行数据导入、清洗、转 换、聚合等操作,支持多种数据类型和文件格式,并提供了丰富的数据分 析和可视化功能。

2. 列出并解释 Pandas 中用于读写 CSV 数据的相关函数。

Pandas 库提供了 **read_csv () 和 to_csv ()** 两个主要函数,分别用于读取和写入 CSV 数据。

read_csv () 函数:

  • 这个函数用于从 CSV 文件中读取数据,将数据转换为 Pandas 的 DataFrame 对象。

to_csv () 方法:

  • 此方法用于将 DataFrame 对象写入 CSV 文件

# 三、分析题 10 分

1. 熟悉竞赛网站用户行为分析的步骤与流程
通过对竞赛网站用户访问数据进行分析,使用预处理后的数据构建特征,调用 skleam 库的 KMeans 类对用户进行聚类,以便网站运营商得出差异化服务的策略。画出竞赛网站用户行为分析流程:

image-20240623130851953

2. 熟悉企业所得税预测的步骤与流程
画出总体流程,主要包括以下步骤:
(1) 对原始数据进行探索性分析,了解原始特征之间的相关性。
(2) 利用 Lasso 特征选择模型进行特征提取。
(3) 建立单个特征的灰色预测模型 (GM (1,1) 模型) 和支持向量回归预测模型 (SVR
模型 )。
(4) 使用 SVR 预测模型得出 2020 年、2021 年企业所得税的预测值。
(5) 对建立的企业所得税预测模型进行评价。

image-20240623130831415

# 四、综合应用题 60 分

1. 二手手机价格预测

某回收二手手机的公司为了在公司的交易软件中显示预测的二手手机价格,使用用户在交易软件上的交易数据 (phone.csv),预测回收二手手机的价格。交易数据的特征说明如表所示:

特征说明示例
id用户编码1
battery_power电池容量(单位:mA)1520
blue_tooth蓝牙是否正常。其中 0 表示否,1 表示是0
clock_speed开机时间(单位:min)0.5
dual_sim是否双卡双待。其中 0 表示否,1 表示是0
fc前置摄像头像素(单位:px)14
four_g是否支持 4G。其中 0 表示否,1 表示是1
int_memory内存剩余大小(单位:GB)5
m_dep手机厚度(单位:cm)0.5
mobile_wt手机重量(单位:g)192
n_cores处理器内核数4
pc主摄像头像素(单位:px)16
px_height像素分辨率高度(单位:px)1270
px_width像素分辨率宽度(单位:px)1336
ram运行内存(单位:MB)3506
sc_h手机屏幕高度(单位:cm)12
sc_w手机屏幕宽度(单位:cm)7
talk_time充满电耗时(单位:h)2
three_g是否支持 3G。其中 0 表示否,1 表示是0
touch_screen触摸屏是否正常。其中 0 表示否,1 表示是1
wifiWi-Fi 连接是否正常。其中 0 表示否,1 表示是1
price range手机价格等级,其中 0 表示低,1 表示中,2 表示较高,3 表示高0

现需利用交易数据建立分类模型对二手手机价格进行预测,步骤如下。
(1) 删除有异常值的行 (手机厚度小于等于 0cm)。
(2) 建立随机森林分类模型对数据进行训练。
(3) 计算模型准确率,评价分类模型效果。

答案:

# 加载所需的函数
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
data = pd.read_csv('data/phone.csv')  # 读取数据
# 处理异常值
phone_data1 = data[data['m_dep'] > 0]  # 处理手机厚度异常值
phone_data = phone_data1.drop(['price_range'],axis = 1)
phone_target = phone_data1['price_range']
# 将数据划分为训练集测试集
phone_data_train, phone_data_test, \
phone_target_train, phone_target_test = train_test_split(phone_data, 
                                                           phone_target, 
                                                           test_size = 0.3, 
                                                           random_state = 22)
# 数据标准化
stdScaler = StandardScaler().fit(phone_data_train)
phone_trainStd = stdScaler.transform(phone_data_train)
phone_testStd = stdScaler.transform(phone_data_test)
# 建立 RandomForestClassifier 模型 (随机森林)
rfc = RandomForestClassifier().fit(phone_trainStd, phone_target_train)
print('建立的 rfc 模型为:\n', rfc)
# 预测训练集结果
phone_target_pred = rfc.predict(phone_testStd)
print('预测的前 20 个结果为:\n', phone_target_pred[:20])
# 计算准确率
true = np.sum(phone_target_pred == phone_target_test)  # 求出预测和真实一样的数目
print('预测对的结果数目为:', true)
print('预测错的的结果数目为:', phone_target_test.shape[0] - true)
print('预测结果准确率为:', true / phone_target_test.shape[0])

2. 钻石价格预测

某珠宝店新增钻石回收业务,为了对客户提供的钻石更好地进行估价,该店铺收集了行业内近期所售钻石的 4C 等级、尺寸和相应价格等数据,存为钻石价格数据集 (diamond_price.csv), 包括克拉、切工等级、色泽、净度等 9 个特征。钻石价格数据集的特征说明如表 2 所示。

表 2 钻石价格数据集的特征说明:

特征各称特征含义示例
克拉钻石的重量0.23
切工等级包括 5 个等级,其中 1 表示完美;2 表示十分珍贵;3 表示很好;4 表示好;5 表示一般1
色泽钻石色泽从 D 到 J 分为 7 个级别,其中 1 表示 D 级,完全无色;2 表示 E 级,无色;3 表示 F 级,几乎无色;4 表示 G 级,接近无色;5 表示 H 级,接近无色;6 表示 1 级,肉眼可见少量黄色;7 表示 J 级,肉眼可见少量黄色2
净度钻石净度由高到低分为 8 个级别,其中 1 表示 IF, 内无瑕级;2 表示 VVS1, 极轻微内含级 1;3 表示 VVs2, 极轻微内含级 2;4 表示 VS1, 轻微内含级 1; 5 表示 Vs2, 轻微内含级 2;6 表示 SI1, 微含级 1;7 表示 SI2, 微含级 2;8 表示 I1, 内含级7
台宽比钻石桌面的宽度占其平均直径的百分比55
长度钻石的长度3.96
宽度钻石的宽度3.98
高度钻石的高度2.43
价格 (美元)钻石的价格326

使用钻石价格数据集,构建回归模型预测回收的钻石价格,具体步骤如下。

(1) 读取钻石价格数据集。

(2) 经过观察数据发现,长度、宽度、高度特征存在 0 值,删除该 3 个特征中所有出现 0 值的行数据,并对其他数据进行重新索引。

(3) 新增价格 (人民币) 特征,假定 1 美元等于 6.50 人民币。

(4) 拆分特征数据和标签数据,特征数据为克拉、切工等级、色泽、净度、台宽比、长度、宽度、高度,标签数据为价格 (人民币) 特征。

(5) 划分训练集和测试集,并对训练集和测试集进行标准差标准化。

(6) 构建 SVR 等至少两种回归模型进行钻石价格预测,并输出回归模型评价指标,查看模型效果。

答案:

import pandas as pd
# 读取数据集
diamond = pd.read_csv('data/diamond_price.csv', encoding='gbk')
#预处理
diamond = diamond.drop(diamond[(diamond['X(length)'] == 0) |
                              (diamond['Y(width)'] == 0) |
                              (diamond['Z(Depth)'] == 0)].index)
diamond.reset_index(inplace=True, drop=True)
diamond['price_RMB'] =  diamond['Price(in US dollars)'] * 6.50
print(diamond.shape)
# 拆分数据和标签
diamond_data = diamond.iloc[:, :-2]
diamond_target = diamond.iloc[:, -1]
# 特征列选择
# from  sklearn.linear_model import  Lasso
# data_train = (diamond_data-diamond_data.mean())/diamond_data.std()
# lasso = Lasso(alpha=1000).fit(data_train,diamond_target)
# print(lasso.coef_)
# diamond_data = diamond.iloc[:, [0,1,2,3]]
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
diamond_data_train, diamond_data_test, \
diamond_target_train, diamond_target_test = \
train_test_split(diamond_data, diamond_target, test_size=0.2,random_state=2)
#
# # 标准差标准化
from sklearn.preprocessing import StandardScaler
stdScale = StandardScaler().fit(diamond_data_train,diamond_target_train)
diamond_trainScaler = stdScale.transform(diamond_data_train)
diamond_testScaler = stdScale.transform(diamond_data_test)
#定义评价函数
from sklearn.metrics import explained_variance_score,  r2_score
def test(y0,y1):
    print('回归模型的可解释方差值为:',
          explained_variance_score(y0,y1))
    print('回归模型的R方值为:',
          r2_score(y0, y1))
# 构建回归模型
from sklearn.svm import LinearSVR
# 支持向量回归
SVR_diamond = LinearSVR().fit(diamond_data_train, diamond_target_train)
y_pred1 = SVR_diamond.predict(diamond_data_test)
print("支持向量回归:")
test(diamond_target_test, y_pred1)
#梯度提升回归
from sklearn.ensemble import  GradientBoostingRegressor
GBR_diamond = GradientBoostingRegressor().fit(diamond_trainScaler, diamond_target_train)
y_pred2 = GBR_diamond.predict(diamond_testScaler)
print("梯度提升回归:")
test(diamond_target_test, y_pred2)
#回归决策树
from sklearn.tree import  DecisionTreeRegressor
DTR_diamond =  DecisionTreeRegressor().fit(diamond_trainScaler, diamond_target_train)
y_pred3 = DTR_diamond .predict(diamond_testScaler)
print("回归决策树:")
test(diamond_target_test, y_pred3)
#线性回归
from sklearn.linear_model import LinearRegression
LR_diamond =   LinearRegression().fit(diamond_trainScaler, diamond_target_train)
y_pred4 = LR_diamond .predict(diamond_testScaler)
print("线性回归:")
test(diamond_target_test, y_pred4)
#最近邻回归
from sklearn.neighbors import  KNeighborsRegressor
KNR_diamond =  KNeighborsRegressor().fit(diamond_trainScaler, diamond_target_train)
y_pred5 = DTR_diamond .predict(diamond_testScaler)
print("最近邻回归:")
test(diamond_target_test, y_pred5)