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


# 一、选择题 20 分

1.NumPy 中可以获取数组长度的属性是以下的哪个答案( )。

A.dtype

B.shape

C.ndim

D.size

答案: D

2.在 NumPy 中创建一个元素均为 0 的数组可以使用( )函数。

A.zeros() B.arange()

C.linspace() D.logspace()

答案: A

3. 下列用于横向组合数组的函数是 ( )

A. hstack

B. hsplit

C.vstack

D.vsplit

答案: A

4. 使用 Python 进行数据分析时,以下不属于数据可视化模块的是?
A.Matplotlib
B.sklearn
C.seaborn
D.pyecharts

答案: B

5.Python 中用于数据分析和处理的库是: ( )

A. NumPy

B. Pandas

C. Matplotlib

D. Scikit-learn

答案: B

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

A. dropna() B. sort_values() C. mean() D. plot()

答案: D

7. 在 Pandas 中,读取 CSV 文件通常使用哪个函数?

A. pd.read_sql()

B. pd.read_excel()

C. pd.read_csv()

D. pd.read_table()

答案: C

8. 以下哪个函数可以实现画布的创建?( )

A. subplots()

B. add_subplot()

C. figure()

D. subplot2grid()

答案: C

9. 下列关于 apply () 方法说法正确的是 ( )

A.apply () 方法无法应用于分组操作

B.apply () 方法作用范围:pandas 中的 Series 和 DataFrame

C.apply () 方法中不能自定义函数

D.apply () 方法只能对行、列进行操作

答案: B

10. 下列关于分组聚合的说法错误的是 ( )

A. 使用 pandas 的 groupby () 方法进行分组时,只能对列进行操作

B.pandas 分组聚合操作能够实现组内标准化

C.pandas 聚合时能够使用 agg ()、apply ()、transform () 方法

D.pandas 分组方法只有一个 groupby () 方法

答案: D

11. 使用 pivot_table 函数制作透视表时可用下列 ( ) 参数设置行分组键。

A. Index

B. raw

C. values

D. data

答案: A

12. 在下列选项中可以进行主键合并的是 ( )

A. merge

B.concat

C. append()

D. combine_first()

答案: A

13. 在下列选项中可以进行特征删除的是 ( ).

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

C.isnull0) 方法 D.notnull () 方法

答案: A

14. 下列关于插值法的说法错误的是 ( )

A. 常见的插值法有线性插值、多项式插值和样条插值

B. 线性插值通过求解线性方程得到缺失值

C. 常见的线性插值有拉格朗日插值和牛顿插值

D.pandas 中的 interpolate () 法可进行插值操作

答案: C

15. 在下列选项中可以进行哑变量处理的是 ( )

A.cut 函数

B. get_cut 函数

C.dummies 函数

D. get_dummies 函数

答案: D

16.pyplot 使用 re 配置文件来自定义图形的各种默认属性,用于修改线条上点的形状的 rc 参数名称是 ( )

A.lines,linewidth

B.lines.markersize

C. lines.linestyle

D. lines.marker

答案: D

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. 阐述 Numpy 中的两大对象及其特点

NumPy 提供了 两种基本的对象 red: ndarray 和 ufunc

ndarray(N-dimensional Array Object):存储单一数据类型的多维数组。

特点:多维性、数据存储、维度和形状、向量化操作

ufunc(Universal Function Object):能够对数组进行处理的函数。

特点:向量化操作、广播机制、支持多种数据类型

2. 简述 Pandas 的数据结构及其特点。

Pandas 的数据结构有 Series 和 DataFrame

Series(一维数据):是一种类似于一维数组的对象,是由一组数据(各种 NumPy 数据类型)以及一组与之相关的数据标签(即索引)组成,而仅由一组数据也可产生简单的 Series 对象。

DataFrame 是 pandas 中的一个二维的、大小可变的、可以存储多种类型数据的表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame 既有行索引也有列索引,可以被看做是由 Series 组成的字典。

# 三、分析题 10 分

通过对某餐饮企业的数据进行分析,构建客户流失预测模型,对客户的流失进行预测,以便企业及时做出应对措施。画出餐饮企业客户流失预测流程:

(1) 读取本案例所需的客户信息表和订单详情表。
(2) 探索客户信息表中年龄、性别与客户流失的关系。
(3) 查看数据中的重复值情况,并对异常值、缺失值进行处理。
(4) 构建总用餐次数、距观测窗口 (即以 2016 年 7 月 31 日为结束时间,宽度为两年的时间段) 结束时间的天数、人均销售额、总消费金额 4 个客户流失特征。
(5) 将数据划分为训练集和测试集,并使用决策树和支持向量机构建客户流失预测模型,对客户流失进行预测。
(6) 使用精确率、召回率、F1 值评价使用决策树和支持向量机构建的模型的效果

image-20240623115704138

# 四、综合应用题 60 分

1.APP 用户群体划分(聚类)

在 App 上架前需要收集测试用户或人员的体验数据,分析反馈的数据,从而对 App 进行相应的调整。某研发团队为调查所设计的 App 是否可以上架,统计了 13 万左右测试用户的 App 使用数据,并存储于 “某 App 用户信息数据.csv” 数据集中,部分某 App 用户信息数据如表 1 所示。通过对数据进行聚类,以区分不同的用户群体,从而对不同的群体确定是否分享 App, 进而创造流量价值用户,同时将聚类结果与 “是否点击分享” 特征数据进行对比,评价聚类分析结果。

表 1 部分某 App 用户信息数据:

用户名在线时 长 (分钟)时间所 占比例不愿分 享概率愿意分 享概率是否点 击分享
George14957360.004093442NA0.02T
Ruth8329590.00227959300.85F
Jack11243540.003532150-0.500.40F
Joy3421190.000233501.50-1.50T
Jessica11739790.0032128760.321.00F

(1) 处理某 App 用户信息数据集。

  1. 使用 Pandas 库读取 “某 APP 用户信息数据.csv” 数据集。
  2. 将不愿分享概率与愿意分享概率特征中的缺失值用 0.0 替换。
  3. 将不愿分享概率与愿意分享概率特征中负值赋值为 0, 并将大于 1 的值改为 1。
  4. 将是否点击分享特征中的 T 重新赋值为 1, 将 F 重新赋值为 0。

(2) 构建与用户使用信息相关的特征。

  1. 自定义 to_code 函数,用于对用户名特征首字母进行编码。
  2. 对在线时长特征进行分段处理后生成分段在线时长新特征。
  3. 使用 apply 方法构建首字母编码新特征。

(3) 构建 K-Means 聚类模型。

  1. 读取构建新特征后的数据集,区分标签和数据。
  2. 构建 K-Means 模型,且聚类数为 2。
  3. 使用 FMI 评价法评价聚类模型性能。

答案:

# (1)    处理某 App 用户信息数据集。
# 1. 使用 Pandas 库读取 “某 APP 用户信息数据.csv” 数据集。
import pandas as pd
user = pd.read_csv(r'F:\3.homework\大三下\数据分析\实验数据data\某APP用户信息数据.csv',encoding='gbk')
# 2. 将不愿分享概率与愿意分享概率特征中的缺失值用 0.0 替换。
user['不愿分享概率'] = user['不愿分享概率'].fillna(0.0)
user['愿意分享概率'] = user['愿意分享概率'].fillna(0.0)
# 3. 将不愿分享概率与愿意分享概率特征中负值赋值为 0, 并将大于 1 的值改为 1。
user['不愿分享概率'][user['不愿分享概率'] < 0] = 0
user['不愿分享概率'][user['不愿分享概率'] > 0] = 1
user['愿意分享概率'][user['愿意分享概率'] < 0] = 0
user['愿意分享概率'][user['愿意分享概率'] > 0] = 1
# 4. 将是否点击分享特征中的 T 重新赋值为 1, 将 F 重新赋值为 0。
user['是否点击分享'][user['是否点击分享'] == 'T'] = 1
user['是否点击分享'][user['是否点击分享'] == 'F'] = 0
# (2) 构建与用户使用信息相关的特征。
user_clean = user
# 1. 自定义 to_code 函数,用于对用户名特征首字母进行编码。
coding = {}
for i in range(26):
    coding[chr(ord('a') + i)] = i
def to_code(s):
    code = 0
    s = s.lower()[0] # 名字全部小写
    if  s in coding.keys():
        code = coding[s]
    return code
# 2. 对在线时长特征进行分段处理后生成分段在线时长新特征。
user_clean['分组后在线时长'] = pd.qcut(user['在线时长'], 4, labels=[4, 3, 2, 1])
# 3. 使用 apply 方法构建首字母编码新特征。
user_clean['用户编码'] = user_clean['用户名'].apply(lambda x: to_code(x))
# (3) 构建 K-Means 聚类模型。
user_feature = user_clean
from sklearn.cluster import KMeans
from sklearn.metrics import fowlkes_mallows_score
# 1. 读取构建新特征后的数据集,区分标签和数据。
X=user_feature[['不愿分享概率', '愿意分享概率',"在线时长", "在线时长占比", "分组后在线时长"]]
y=user_feature['是否点击分享']
# 2. 构建 K-Means 模型,且聚类数为 2。
model=KMeans(n_clusters=2).fit(X)
# 3. 使用 FMI 评价法评价聚类模型性能。
print(fowlkes_mallows_score(y, model.labels_))

2. 客户服装尺寸预测

某淘宝成年女装店铺为了能够给客户推荐合适的成年女装尺寸,构建了相应的尺寸预测模型。目前店铺利用已购买服装客户的数据集 (size_data.csv) 进行模型的训练,其中部分尺寸信息数据如表 1 所示。

表 1 部分尺寸信息数据

体重 (kg)年龄 (岁)身高 (cm)尺寸
7028172.72XL
6536167.64L
6134165.1M
7127175.26L
6245160.02M

(1) 处理尺码信息数据。

  1. 利用 read_csv 函数读取 size_data.csv.
  2. 查看数据集大小,并利用 dropna () 方法删除缺失值。
  3. 删除年龄、体重异常值 (年龄小于 18 岁,体重低于 30kg)。
  4. 查看数据异常值和缺失值是否删除成功。

(2) 构建支持向量机、决策树、随机森林几种分类模型预测客户服装尺寸,为改善模型预测效果,根据原有特征构建新特征。使用实训 1 中预处理后的数据,计算 BMI 值并构建 BML_ range 特征。BMI 计算公式下面所示。

  1. BMI = 体重 (kg)/ 身高 (m2)
  2. BMI_range 特征的构建规则如下。
  3. 当 BMI<18.5 时,BMI_range 值为 0。
  4. 当 18.5≤BMI<24 时,BMI_range 值为 1。
  5. 当 24≤BMI-28 时,BMI_range 值为 2。
  6. 当 BMI≥28 时,BMI_range 值为 3。

(3)为了提高客户满意度,需要基于客户基本信息为客户推荐合适的服装尺寸。因此需要使用处理后的数据调用支持向量机、决策树、随机森林分类算法构建模型,预测客户服装尺寸。

  1. 构建 BMI_range 特征。
  2. 构建支持向量机、决策树、随机森林分类模型预测服装尺寸。
  3. 评估支持向量机、决策树、随机森林分类模型效果。

答案:

import pandas as pd
import  warnings
warnings.filterwarnings('ignore')
# 读取数据
size_data = pd.read_csv('../data/size_data.csv')
print(size_data.shape)  # 查看数据大小
# 删除缺失值
size_data.isnull().sum()  # 查看是否存在缺失值
size_data = size_data.dropna()  # 删除缺失值
size_data.isnull().sum()  # 查看缺失值是否删除成功
# 处理异常值
size_data_age = size_data[size_data['age'] > 18]  # 处理年龄异常值
size_data_weight = size_data_age[size_data_age['weight'] > 30]  # 处理体重异常值
size_data_weight = size_data_weight.reset_index(drop=True)  # 重新生成索引
size_data_end = size_data_weight
size_data_end['age'].min()  # 查看年龄异常值是否删除成功
size_data_end['weight'].min()  # 查看体重异常值是否删除成功
# 构建 BMI 特征 (体重 / 身高 **2)
size_data_end['BMI'] = size_data_end['weight'] / ((
    size_data_end['height'] / 100) ** 2)
# 自定义 BMI 段函数
def bmi_range(data):
    for i in range(len(data)):
        if data[i] < 18.5:
            data[i] = 0
        elif data[i] >= 18.5 and  data[i] < 24:
            data[i] = 1
        elif data[i] >= 24 and  data[i] < 28:
            data[i] = 2
        elif data[i] >= 28:
            data[i] = 3
# 创建 BMI 分段特征列
size_data_end['BMI_range'] = size_data_end['BMI']
bmi_range(size_data_end['BMI_range'])
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# data 与 target 划分
size_target = size_data_end['size']
size_data = size_data_end.drop(['size'], axis=1)
# 训练集与测试集划分
size_data_train, size_data_test, size_target_train, size_target_test = \
train_test_split(size_data, size_target, test_size = 0.2, random_state = 22,shuffle=True,stratify=size_target)
from sklearn.metrics import confusion_matrix,precision_score,recall_score,f1_score
# 自定义评价函数
def test_pre(y_te,pred):
    print('混淆矩阵:\n', confusion_matrix(y_te, pred,labels=['S','M','L','XL']))# 混淆矩阵
    print('精确率:', precision_score(y_te,pred,average='macro'))  # 精确率
    print('召回率:', recall_score(y_te,pred,average='macro'))  # 召回率
    print('F1值:', f1_score(y_te,pred,average='macro')) # F1 值
# 数据标准化
stdScaler = StandardScaler().fit(size_data_train)
size_train_std = stdScaler.transform(size_data_train)
size_test_std = stdScaler.transform(size_data_test)
# 构建 SVM 模型
from sklearn.svm import SVC
svm = SVC().fit(size_train_std, size_target_train)
# 预测训练集结果
svc_pred = svm.predict(size_test_std)
print('SVM 模型预测结果:')
test_pre(size_target_test,svc_pred)
# 构建 决策树 模型
from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC().fit(size_train_std, size_target_train)  # 训练模型
dtc_pred = dtc.predict(size_test_std)
# 评价模型
print('决策树 模型预测结果:')
test_pre(size_target_test,dtc_pred)
# 构建 随机森林 模型
from sklearn.ensemble import RandomForestClassifier as RFC
rfc = RFC().fit(size_train_std, size_target_train)  # 训练模型
rfc_pred = rfc.predict(size_test_std)
# 评价模型
print('随机森林 模型预测结果:')
test_pre(size_target_test,rfc_pred)