应对期末考试,对本学期《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 值评价使用决策树和支持向量机构建的模型的效果
# 四、综合应用题 60 分
1.APP 用户群体划分(聚类)
在 App 上架前需要收集测试用户或人员的体验数据,分析反馈的数据,从而对 App 进行相应的调整。某研发团队为调查所设计的 App 是否可以上架,统计了 13 万左右测试用户的 App 使用数据,并存储于 “某 App 用户信息数据.csv” 数据集中,部分某 App 用户信息数据如表 1 所示。通过对数据进行聚类,以区分不同的用户群体,从而对不同的群体确定是否分享 App, 进而创造流量价值用户,同时将聚类结果与 “是否点击分享” 特征数据进行对比,评价聚类分析结果。
表 1 部分某 App 用户信息数据:
用户名 | 在线时 长 (分钟) | 时间所 占比例 | 不愿分 享概率 | 愿意分 享概率 | 是否点 击分享 |
---|---|---|---|---|---|
George | 1495736 | 0.004093442 | NA | 0.02 | T |
Ruth | 832959 | 0.002279593 | 0 | 0.85 | F |
Jack | 1124354 | 0.003532150 | -0.50 | 0.40 | F |
Joy | 342119 | 0.00023350 | 1.50 | -1.50 | T |
Jessica | 1173979 | 0.003212876 | 0.32 | 1.00 | F |
(1) 处理某 App 用户信息数据集。
- 使用 Pandas 库读取 “某 APP 用户信息数据.csv” 数据集。
- 将不愿分享概率与愿意分享概率特征中的缺失值用 0.0 替换。
- 将不愿分享概率与愿意分享概率特征中负值赋值为 0, 并将大于 1 的值改为 1。
- 将是否点击分享特征中的 T 重新赋值为 1, 将 F 重新赋值为 0。
(2) 构建与用户使用信息相关的特征。
- 自定义 to_code 函数,用于对用户名特征首字母进行编码。
- 对在线时长特征进行分段处理后生成分段在线时长新特征。
- 使用 apply 方法构建首字母编码新特征。
(3) 构建 K-Means 聚类模型。
- 读取构建新特征后的数据集,区分标签和数据。
- 构建 K-Means 模型,且聚类数为 2。
- 使用 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) | 尺寸 |
---|---|---|---|
70 | 28 | 172.72 | XL |
65 | 36 | 167.64 | L |
61 | 34 | 165.1 | M |
71 | 27 | 175.26 | L |
62 | 45 | 160.02 | M |
(1) 处理尺码信息数据。
- 利用 read_csv 函数读取 size_data.csv.
- 查看数据集大小,并利用 dropna () 方法删除缺失值。
- 删除年龄、体重异常值 (年龄小于 18 岁,体重低于 30kg)。
- 查看数据异常值和缺失值是否删除成功。
(2) 构建支持向量机、决策树、随机森林几种分类模型预测客户服装尺寸,为改善模型预测效果,根据原有特征构建新特征。使用实训 1 中预处理后的数据,计算 BMI 值并构建 BML_ range 特征。BMI 计算公式下面所示。
- BMI = 体重 (kg)/ 身高 (m2)
- BMI_range 特征的构建规则如下。
- 当 BMI<18.5 时,BMI_range 值为 0。
- 当 18.5≤BMI<24 时,BMI_range 值为 1。
- 当 24≤BMI-28 时,BMI_range 值为 2。
- 当 BMI≥28 时,BMI_range 值为 3。
(3)为了提高客户满意度,需要基于客户基本信息为客户推荐合适的服装尺寸。因此需要使用处理后的数据调用支持向量机、决策树、随机森林分类算法构建模型,预测客户服装尺寸。
- 构建 BMI_range 特征。
- 构建支持向量机、决策树、随机森林分类模型预测服装尺寸。
- 评估支持向量机、决策树、随机森林分类模型效果。
答案:
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) |