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

选择题为课本习题(熟悉题型使用)

简答题为预测

代码题(4 选 2)


# 一、考试题型

1、选择题(不定项,Numpy、Pandas、可视化、Sklearn) 20 分

2、简答题(Numpy、Pandas) 10 分

3、分析题(根据题目要求绘制项目聚类或分类流程图) 10 分

读取 > 预处理(缺)> 划分(横、纵)> 标准化 > 分聚回 > 评价

4、综合应用题(分类、聚类、回归) 60 分

# 二、考试内容

# 1、Numpy

(1)Numpy 两大对象及特点

(2)Series 组成

(3)Numpy 数组的属性

(4)Numpy 生成数组、矩阵的常用函数、矩阵转置

# 2、Pandas

(1)Pandas 作用

(2)重复值、缺失值处理函数及方法

(3)Pandas 数据结构及特点

(4)读写 CSV 数据的相关函数

(5)数据合并

# 3、可视化库

绘制画布、常用图表、坐标轴的函数。

# 4、Sklearn 应用

APP 用户群体划分、二手手机价格预测、客户服装尺寸预测、钻石价格预测。

# 选择题:不定项,Numpy、Pandas、可视化、Sklearn

# 第 1 章 Python 数据分析概述

课后习题

(1) 下面关于数据分析说法正确的是 ( )

A. 数据分析是数学、统计学理论结合科学的统计分析方法

B. 数据分析是一种数学分析方法

C. 数据分析是统计学分析方法

D. 数据分析是大数据分析方法

【解析】 本题考查数据分析的概念。

数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。这一过程也是质量管理体系的支持过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。

【答案】 A

(2) 下列关于数据分析的描述,说法错误的是 ( )

A. 模型优化步骤可以与分析和建模步骤同步进行

B. 数据分析过程中最核心的步骤是分析与建模

C. 数据分析时只能够使用数值型数据

D. 广义的数据分析包括狭义数据分析和数据挖掘

【解析】 本题考查数据分析。

数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。这一过程也是质量管理体系的支持过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。

A 项,模型优化步骤可以与分析和建模步骤同步进行,说法正确。

B 项,数据分析过程中最核心的步骤是分析与建模,说法正确。

C 项,数据分析时只能够使用数值型数据,说法错误。数据分析可以使用分类数据、顺序数据和数值型数据等。

D 项,广义的数据分析包括狭义数据分析和数据挖掘,说法正确。 本题要求选择说法错误选项。

【答案】 C

(3) 下列关于 NumPy 的说法错误的是 ( )

A.NumPy 可快速高效处理多维数组

B.NumPy 可提供在算法之间传递数据的容器

C.NumPy 可实现线性代数运算、傅里叶变换和随机数生成

D.NumPy 不具备将 C++ 代码继承到 Python 的功能

【解析】 本题考查 NumPy。

NumPy 是 Python 的一个库,提供了大量的数学函数和数据结构(特别是数组),用于快速操作数据。

它支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

A 项,表述正确,NumPy 可快速高效处理多维数组。

B 项,表述正确,NumPy 可提供在算法之间传递数据的容器。

C 项,表述正确,NumPy 可实现线性代数运算、傅里叶变换和随机数生成。

D 项,表述错误,NumPy 具备将 C++ 代码继承到 Python 的功能。 本题要求选择说法错误选项。

【答案】 D

(4) 下列关于 pandas 说法错误的是 ( )

A.pandas 是 Python 的数据分析核心库

B.pandas 能够快捷处理结构化数据

C.pandas 没有 NumPy 的高性能数字计算功能

D.pandas 提供复杂精细的索引功能

【解析】

pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas 提供了大量能使我们快速便捷地处理数据的函数和方法,使 Python 成为强大而高效的数据分析环境。

【答案】 C

(5) 下列不属于数据分析的应用场景的是 ( )

A. 一周天气预测

C. 为用户提供个性化服务

B. 合理预测航班座位需求数量

D. 某人一生的命运预测

【答案】 D

(6) 下列不属于 Python 优势的是 ( )。

A. 语法简洁,程序开发速度快

B. 入门简单,功能强大

C. 程序的运行速度在所有计算机语言的程序中最快

D. 开源,可以自由阅读源代码并对其进行改动

【答案】 C

(7) 下列关于 Jupyter Notebook 界面构成说法错误的是 ( )

A.Notebook 主要由两种形式的单元构成

B.Jupyter Notebook 中的代码单元是读者编写代码的地方

C.Jupyter Notebook 编辑界面有两种编辑模式

D.Jupyter Notebook 可以将文件分享给他人

【解析】

Notebook 主要由两种形式的单元构成,分别是代码单元和 Markdown 单元。

代码单元是读者编写代码的地方,而 Markdown 单元可以用来添加注释或者说明。

Jupyter Notebook 编辑界面有两种编辑模式,分别是编辑模式和命令模式。在编辑模式下,可以对单元中的代码或者文本进行编辑;而在命令模式下,可以在键盘上输入一些命令来对整个文件或者单元进行操作。

Jupyter Notebook 可以将文件保存为 ipynb 格式,并分享给他人。他人通过 Jupyter Notebook 打开该文件后,不仅可以看到整个分析过程的代码,还可以看到每段代码运行后的结果。

【答案】 ??答案有待考虑

(8) 下列关于 Python 数据分析常用库的描述错误的是 ( A )

A.NumPy 的在线安装不需要其他任何辅助工具

B.SciPy 主要用于解决科学计算中的各种标准问题

C.pandas 能够实现对数据的整理工作

D.scikit-learn 是复杂有效的数据分析工具

【解析】

选项 A “NumPy 的在线安装不需要其他任何辅助工具” 是错误的描述。实际上,

虽然 NumPy 库本身支持在线安装,但在实际操作中,通常需要其他辅助工具如包管理工具 pip 来进行安装。

【答案】 A

(9) 以下选项中关于 Anaconda 描述错误的是 ( C )

A.Anaconda 支持 Linux、Windows 系统

B.Anaconda 支持并集成了 800 多个第三方库

C.Anaconda 是一个集成开发工具

D.Anaconda 是免费的,适合数据分析相关工作人员安装使用

【解析】

Anaconda 是一个强大的 Python 发行版和包管理工具,但它本身不是一个集成开发环境。它提供了丰富的科学计算和数据分析库,以及多种工具和环境管理器,是 Python 开发者和数据科学家的重要工具。

# 第 2 章 NumPy 数组计算基础

1. 选择题

(1) 下列对 Python 中的 NumPy 描述不正确的是 ( )

A.NumPy 是用于数据科学计算的基础模块

B.NumPy 的数据容器能够保存任意类型的数据

C.NumPy 提供了 ndarray 和 array 两种基本的对象

D.NumPy 能够对多维数组进行数值运算

【解析】

NumPy 是 Python 中用于科学计算的一个基础库,它提供了高效的多维数组对象和工具。

A. 正确。NumPy 确实是用于数据科学计算的基础模块。

B. 正确。NumPy 的主要数据结构是 ndarray,它是一个多维数组对象,设计用于存储和处理数值数据。

C. 不正确。NumPy 确实提供了 ndarray 和 ufunc 两种基本的对象,在 NumPy 中, ndarray 是一个多维数组对象,而 array 实际上是 ndarray 的一个别名或者是创建 ndarray 的一种方式。因此,实际上它们指的是同一个概念

D. 正确。NumPy 能够对多维数组进行数值运算,包括基本的算术运算、统计运算等。

【答案】 C

(2) 下列选项中表示数组维度的是 ( )

A. ndim

B. shape

C. size

D. dtype

【解析】

A. ndim:此属性表示数组的维度数量,即轴数。它返回一个整数,表示数组有多少个维度。

B. shape:此属性返回一个元组,描述每个维度中数组的大小。它并不直接给出维度的数量,而是提供了每个维度的长度信息。

C. size:这个属性用于获取数组中元素的总数量,是所有维度大小的乘积。因此,它也不直接代表数组的维度。

D. dtype:这是 NumPy 数组中数据的类型,例如 int、float 等。与数组的维度无关。

综上所述,选项 A 的 ndim 是表示数组维度的属性。

【答案】A

(3) 代码 “np.arange (0,1,0.2)” 的运行结果为 ( A)

A. [0,0.2,0.4,0.6,0.8]

C. [0.2,0.4, 0.6, 0.8]

B. [0,0.2,0.4,0.6,0.8, 1.0]

D. [0.2,0.4,0.6, 0.8, 1.0]

(4) 代码 “np.linspace (0,10,5)” 的运行结果为 ( D)

A. [0 , 2.5 , 5 , 7.5]

B. [0, 2.5 , 5 , 7.5 , 10]

C. [0. , 2.5. , 5. , 7.5.]

D.[0. ,2.5. , 5. , 7.5. , 10.]

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

A. hstack

B. hsplit

C.vstack

D.vsplit

【解析】

在 NumPy 中, hstack 函数用于横向堆叠数组,即沿水平方向合并数组。这里的 “h” 代表水平(horizontal)。因此,如果你想将几个数组水平组合在一起,你应该使用 hstack 函数。

B. hsplit 是用来沿着水平方向分割数组的函数,而不是组合。

C. vstack 用于垂直堆叠数组,即沿竖直方向合并数组。

D. vsplit 是用来沿着垂直方向分割数组的函数。

【答案】 A

# 第 3 章 pandas 统计分析基础

1. 选择题

(1) 下列关于 pandas 数据读 / 写说正确的是 ( )

A.read_csv 函数无法读取文本文档的数据

B.read_sql 函数能够读取所有数据库的数据

C.to_csv () 方法能够将结构化数据写入 CSV 文件

D.to_csv () 方法能够将结构化数据写入 Excel 文件

【解析】

A. 该选项说法错误, read_csv 函数不仅可以读取 CSV 文件,也能通过设置适当的参数读取文本格式的数据,只要数据的结构符合 CSV 格式。

B. 该选项说法过于绝对,错误。 read_sql 函数需要与特定的数据库连接一起使用,并且只能读取支持 SQL 查询的数据源,不是所有数据库。

C. 该选项说法正确, to_csv() 方法确实能够将 DataFrame 等结构化数据写入 CSV 文件中,是 Pandas 中常用的数据导出功能之一。 D. 该选项说法错误,虽然名字类似,但 to_csv() 并不直接支持写入 Excel 文件,要写入 Excel 文件应使用 to_excel() 方法。

【答案】C

(2) 下列关于 pandas 基本操作说法错误的是 ( )

A.drop () 方法可以删除某列的数据

B. 使用 describe () 方法可以对 DataFrame 进行描述性统计

C. 在创建 DataFrame 的过程中可同时设置索引

D. 在创建 DataFrame 后可设置索引

【解析】

A. 该选项说法正确, drop() 方法确实可以用来删除 DataFrame 中的指定列或行。

B. 该选项说法正确, describe() 方法会对 DataFrame 进行基本的描述性统计,包括计数、平均值、标准差、最小值、四分位数、最大值等(对于数值型列)。

C. 该选项说法正确,在创建 DataFrame 时,可以通过指定 index 参数来设置初始索引。

D. 该选项说法也是正确的,即使在 DataFrame 创建之后,也可以使用 set_index() 方法重新设置新的索引。

【答案】按照解析所有选项 A、B、C、D 均为正确描述

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

A.pandas 只支持 Series 数据结构

B.pandas 支持 Series 和 DataFrame

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

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

【解析】

A. 该选项说法错误,pandas 不仅仅支持 Series 数据结构,还支持其他数据结构,最主要的是 Series 和 DataFrame。

B. 该选项说法正确,明确指出了 pandas 支持 Series 和 DataFrame 这两种主要数据结构。

C. 该选项说法正确,DataFrame 是一种二维数据结构,它包含行列标签,可以看作是带有标记轴(行标签和列标签)的二维数组。

D. 该选项说法正确,Series 是 pandas 中一种一维的数据结构,它可以存储任何数据类型(整数、字符串、浮点数等),并且每个元素都有一个唯一的标签(即索引)。

根据以上解析,选项 A 表述错误。

【答案】A

(4) 以下分组操作中不涉及原始对象的是 ( )

A. 分割对象

B. 应用一个函数

C. 结合结果

D. 聚合数据

【解析】

A. 分割对象:根据一个或多个列的值将数据分割成不同的组。这一步直接作用于原始对象,但并不改变原始对象,而是创建了按组划分的新视图。

B. 应用一个函数:对每个分组应用某个函数,比如求和、平均、计数等。这一步确实涉及原始对象的数据,但操作是在分组后的视图上进行的。

C. 结合结果:将各分组应用函数后得到的结果合并成一个新的数据结构。这意味着最终产出一个新的对象,而不是修改原始对象。

D. 聚合数据:这是分组操作的目的之一,通过应用函数来汇总每个组的数据,例如计算每组的平均值、最大值等。此步骤同样生成新的汇总信息,并不直接修改原始数据。

【答案】D

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

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

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

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

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

【解析】

A. 该选项说法错误。实际上, apply() 方法可以非常灵活地应用于分组操作中,是对 DataFrame 或 Series 中的数据进行变换的一种方式,可以在分组后对每个组应用函数。

B. 该选项说法正确。 apply() 方法广泛应用于 pandas 的两种主要数据结构 ——Series 和 DataFrame 中,可以对这些结构中的数据执行自定义函数或内置函数。

C. 该选项说法错误。 apply() 方法的一个强大之处就在于能够接受自定义函数作为参数,这使得用户可以对数据执行复杂或特定的转换。

D. 该选项说法错误。 apply() 方法不仅限于对行或列进行操作,其灵活性在于可以根据需要作用于整个对象、单列、单行,甚至是更复杂的操作,具体取决于函数的定义和传入的参数(如 axis 参数用于指定操作的轴)。

【答案】B

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

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

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

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

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

【解析】

A. 该选项说法错误。 groupby() 方法不仅仅能对列进行操作,它可以根据一个或多个列进行分组,也可以根据行索引进行分组,甚至可以使用函数或映射进行更复杂的分组逻辑。

B. 该选项说法正确。Pandas 的分组聚合功能十分强大,能够实现多种统计分析,包括组内标准化,即在每个组内减去平均值并除以标准差等操作。

C. 该选项说法正确。在 pandas 中,进行分组后的聚合操作确实可以使用 agg()apply()transform() 等方法。 agg() 用于应用汇总统计函数, apply() 提供了更多定制化操作的空间,而 transform() 则会返回一个与原数据形状相同的 DataFrame 或 Series,常用于计算每个分组内部相对值。

D. 该选项说法错误。虽然 groupby() 是 pandas 中最常用的分组方法,但并不是唯一的分组方法。例如,在某些特定场景下,也可以使用 pivot_table() 实现类似分组聚合的功能,尽管它的侧重点在于创建交叉表。

【答案】A 和 D 都是错误的描述。但是,根据题目要求选择一个错误的说法,A 和 D 都符合题意。如果必须选择一个最直接错误的描述,考虑到 D 选项直接说 “只有一个 groupby() 方法” 这种绝对化的表述更容易被识别为错误,因此更倾向于选择 D 作为最终答案。

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

A. Index

B. raw

C. values

D. data

【解析】 pivot_table 是 pandas 库中用于创建透视表的一个强大函数,它允许用户以灵活的方式对数据进行分组、聚合和重塑。根据题目要求,我们需要找出用于设置行分组键的参数。

A. Index - 这个选项正确。在 pivot_table 函数中, index 参数用于指定用作行分组键的列名或列名列表。它是创建透视表时定义行结构的关键参数。(columns 表示列分组键)

B. raw - 这个选项与行分组键无关。 raw 参数是一个布尔值,决定聚合函数是接收原始数据还是经过转化的数据。默认为 False ,意味着聚合函数接收到的是已经经过转化的数据。

C. values - 此参数用于指定要聚合的值的列名。它并不直接控制行分组,而是与聚合计算相关。

D. data - 这是 pivot_table 函数的第一个参数,用于指定要进行透视操作的数据集(DataFrame)。它不直接定义行分组键。

【答案】A

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

A.values 可以获取元素

B.index 可查看索引情况

C.column 可查看 DataFrame 的列名

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

【解析】

A. values - 该选项说法正确。 values 属性可以用来获取 DataFrame 中的所有元素,以 NumPy 数组的形式返回。

B. index - 该选项说法正确。 index 属性用于查看 DataFrame 的行索引。

C. column - 该选项说法错误。正确的属性名称应为 columns (复数形式),用于查看 DataFrame 的列名。因此,这里提到的 "column" 是错误的表述。

D. dtypes - 该选项说法正确。 dtypes 属性可以查看 DataFrame 每一列的数据类型。

【答案】C

# 第 4 章 使用 pandas 进行数据预处理

1、选择题

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

A. merge

B.concat

C. append()

D. combine_first()

【解析】

A. merge - 这个选项是正确的。 merge 函数可以用来根据一个或多个键(通常包括主键)来合并两个 DataFrame。这是进行主键合并的典型方法。

B. concat - 这个选项主要用于纵向或横向堆叠 DataFrame,而不是根据主键进行合并。

C. append - 虽然 append 方法可以将一个 DataFrame 添加到另一个 DataFrame 的底部,进行竖直方向上的合并,但它并不根据主键进行合并,也不会解决重复的行问题。

D. combine_first - 这个方法用于填充缺失值,其中一个对象的缺失值由另一个对象对应的值填充,而不是用于基于主键的合并。

【答案】A

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

A. merge

B.concat

C. join()

D. combine_first()

【解析】

A. merge - 这个选项主要用于根据一个或多个键合并 DataFrame,虽然可以实现某种程度上的横向扩展(通过设置 suffixes 处理列名冲突),但其主要目的不是横向堆叠。

B. concat - 正确。 concat 函数是进行 DataFrame 横向或纵向堆叠的主要工具。通过设置参数 axis=1 ,可以实现 DataFrame 的横向堆叠,即将多个 DataFrame 的列并置在一起。

C. join - 这个选项在 pandas 中通常指的是 DataFrame 或 Series 的 join 方法,它可以根据索引进行合并,但直接说 “join ()” 不够精确,因为 join 操作本身可以有多种方式,并且通常不是指横向堆叠的直接操作。

D. combine_first - 这个方法用于用一个对象中的非 NaN 值填补另一个对象中的 NaN 值,与横向堆叠无关。

【答案】B

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

A. merge

B.concat

C. append()

D. combine_first()

【解析】

A. merge - 虽然 merge 可以合并具有共同列(键)的 DataFrame,但它通常涉及到列的匹配和可能的行对行合并,并不专门指重叠合并或数据填补。

B. concat - concat 主要用于简单地堆叠或拼接 DataFrame,而不是重叠合并数据以处理缺失值。

C. append - 类似于 concat,append 主要是进行垂直堆叠,不涉及数据的智能重叠或填补缺失值。

D. combine_first - 正确。 combine_first() 方法允许一个对象中的非空值替换另一个对象中对应位置的空值,实现了数据的重叠合并,特别适用于处理缺失数据的情况。

【答案】D

(4) 下列关于 pandas 中 drop_duplicates () 方法的说法正确的是 ( )

A.drop_duplicates0) 是常用的主键合并方法,能够实现左连接和右连接

B.drop_duplicates () 方法只对 DataFrame 有效

C.drop_duplicatesO 方法仅支持单一特征数据去重

D.drop_duplicatesO 方法不会改变原数据的排列

【解析】

A. drop_duplicates () 是常用的主键合并方法,能够实现左连接和右连接 - 不正确。 drop_duplicates() 方法主要用于删除数据中的重复行,并不是用于数据合并的操作,更不会实现左连接或右连接。

B. drop_duplicates () 方法只对 DataFrame 有效 - 不完全正确。实际上, drop_duplicates() 方法既可以用在 DataFrame 上,也可以用在 Series 上,用于删除其中的重复值。

C. drop_duplicates () 方法仅支持单一特征数据去重 - 不正确。此方法可以基于所有列或特定列进行去重,默认情况下会考虑所有列,也可以通过设置参数 subset 指定根据哪些列进行去重。

D. drop_duplicates () 方法不会改变原数据的排列 - 部分正确。 drop_duplicates() 本身不会改变原数据的排列顺序,但默认情况下它会返回一个新的对象,其中重复项已被删除,而原始数据保持不变。不过,如果设置 inplace=True ,则会在原地修改 DataFrame,但这也并不改变非重复项的原有排列顺序。

【答案】A

(5) 下列关于特征去重的说法错误的是 ( )。

A.cor () 方法可通过相似度矩阵去重

B. 可通过 equals () 方法进行特征去重

C. 相似度矩阵去重可对任意类型的重复特征去重

D. 相似度矩阵去重只能对数值型的重复特征去重

【解析】

A. cor () 方法可通过相似度矩阵去重 - 这个说法不准确。 cor() 方法在 pandas 中并不存在,但如果你是指计算相关系数的函数(如 corr() ),它主要用于衡量变量之间的线性关系强度,并不适合直接用于特征去重。特征去重一般涉及到比较特征值是否完全相同或几乎相同,而不是计算它们之间的相关性。

B. 可通过 equals () 方法进行特征去重 - 这个说法也不太准确。 equals() 方法是用来比较两个 DataFrame 或 Series 是否完全相等(包括数据和结构),通常不直接用于特征去重。特征去重更多是针对 DataFrame 内部的重复行或列,而不是比较两个独立的 DataFrame 是否相等。

C. 相似度矩阵去重可对任意类型的重复特征去重 - 这个说法错误。相似度矩阵通常用于量化不同特征或样本间的相似程度,它基于数值计算,因此主要用于数值型数据的比较。对于非数值型数据(如分类数据),直接应用相似度矩阵去重并不合适,除非先进行合适的编码转换。

D. 相似度矩阵去重只能对数值型的重复特征去重 - 相比之下,这个说法更接近实际情况。相似度计算确实主要适用于数值型数据,因为非数值数据需要转换为可以量化的形式才能进行相似度计算。然而,这个选项表述也存在一定的误导性,因为它暗示了 “相似度矩阵去重” 是一个标准操作,实际上在常规的数据处理中,我们通常不直接使用相似度矩阵进行特征去重,而是利用其他方法,如直接比较或利用 pandas 的 drop_duplicates() 方法。

【答案】考虑到所有选项的表述都不够准确或存在误导,如果必须选择一个最不符合实际情况的选项,D 选项尽管在概念上部分正确

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

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

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

【解析】:

A. dropna() 方法:这个方法用于删除包含缺失值(NaN)的行或列,因此它确实可以间接用于特征删除,尤其是当我们基于缺失数据来剔除某些特征时。

B. fillna() 方法:这个方法是用来填充缺失值的,而不是删除特征,因此它不适用于特征删除。

C. isnull() 方法:此方法用于检测数据中的缺失值,返回一个布尔值的数组,指示每个元素是否为 NaN。它不直接进行特征删除。

D. notnull() 方法:与 isnull() 相反,这个方法用于标识非缺失值的位置,同样不执行特征删除操作。

【答案】 A. dropna () 方法

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

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

C.isnull0 方法 D.notnull0 方法

【解析】:

A. dropna() 方法:这个方法是用来删除包含缺失值(NaN)的行或列,并非用来替换缺失值。

B. fillna() 方法:此方法正是用来填充或替换数据中的缺失值。可以指定一个具体值、使用前一个或后一个有效值填充,或者使用一系列值(如列的均值)进行填充,因此是进行缺失值替换的正确选项。

C. isnull() 方法:此方法用于检查 DataFrame 或 Series 中的值是否为 NaN,返回一个布尔型的 Series 或 DataFrame,指示每个值是否为缺失值,并不做任何替换操作。

D. notnull() 方法:与 isnull() 相反,用于检查值是否非 NaN,同样不做任何缺失值的替换。

【答案】 B. fillna() 方法

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

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

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

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

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

【解析】:

A. 描述了常见的几种插值方法类型,包括线性插值、多项式插值和样条插值,这是正确的。

B. 线性插值确实涉及到通过线性方程来估算数据点之间的缺失值或未知值,通常基于最邻近的两个已知数据点进行简单线性拟合,所以这个描述也是准确的。

C. 这里存在一个误区。拉格朗日插值和牛顿插值实际上都是多项式插值的具体形式,而非线性插值。线性插值更简单的形式可能是指两点之间直线的插值,而拉格朗日插值和牛顿插值允许使用更高阶的多项式通过多个数据点来进行插值,因此这个选项说法错误。

D. pandas 库中的 interpolate() 函数确实提供了多种插值方法,包括线性插值、多项式插值等,用于处理时间序列或其它序列数据中的缺失值,描述正确。

答案: C. 常见的线性插值有拉格朗日插值和牛顿插值 (这个说法是错误的,因为拉格朗日插值和牛顿插值属于多项式插值,不是线性插值。)

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

A.cut 函数

B. get_cut 函数

C.dummies 函数

D. get_dummies 函数

【解析】

哑变量处理通常是指将分类变量转换为数值形式,以便在统计分析或机器学习模型中使用。这种转换允许模型理解不同的类别并为它们分配不同的权重。在 Python 的数据分析库 pandas 中,有一个常用的功能就是将分类变量转换为哑变量(又称虚拟变量)。

A. cut 函数主要用于将连续变量离散化,即将连续范围切分成几个区间,不适用于哑变量处理。 B. get_cut 函数并不是 pandas 或任何常见数据分析库中的标准函数,因此它不是用于哑变量处理的。 C. dummies 函数同样并非标准函数,至少不是广泛认知中用于哑变量处理的函数名。 D. get_dummies 函数是 pandas 库中的一个函数,专门用于将分类变量转换成哑变量形式,非常适合于本题目的需求。

【答案】 D. get_dummies 函数

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

A. 插值法

B. 替换法

C. 哑变量处理

D. 删除法

【解析】 处理数据集中缺失值的方法多种多样,但核心目标都是为了应对数据不完整的情况,确保分析或模型构建的有效性。下面是各个选项的简要说明:

A. 插值法:这是一种常见的处理缺失值技术,通过在缺失值处估算一个合适的数值来填补空缺。插值方法有很多种,如线性插值、多项式插值、最近邻插值等。

B. 替换法:也称为 “填补法”,可以直接用一个固定值(如平均值、中位数、众数等)、数据集中的其他值或者基于模型预测的值来替换缺失值。

C. 哑变量处理:这不是用来直接处理缺失值的方法。哑变量(或虚拟变量)处理是用来编码分类特征的一种技巧,以便能在统计模型中使用。它并不涉及填补或删除缺失数据。

D. 删除法:即直接删除含有缺失值的观测记录。这是最直接但可能也是最不理想的处理方式,因为它会导致信息丢失,特别是当缺失值较多时。

【答案】 C. 哑变量处理

# 第 5 章 Matplotib、seaborn、pyecharts 数据可视化基础

1. 选择题

(1) 下列关于绘图的标准流程说法错误的是 ( )

A. 绘图之前必须先创建画布,不可省略

B. 加图例必须在绘制图形之后进行

C. 图流程的最后部分是保存和显示图形

D. 添加标题、坐标轴标签,绘制图形等步骤没有先后顺序

【解析】:

A. 绘图之前确实必须先创建画布,这是绘图的基础,不可省略。

B. 图例通常是在绘制图形之后添加的,因为图例是对图表中元素的解释,需要在图表内容完成后添加,以便准确对应。

C. 在完成所有绘图元素的设置后,最后一步通常是保存图形到文件以及 / 或者在屏幕上显示图形,这的确是流程的一部分。

D. 虽然在某些灵活的绘图环境中,添加标题、坐标轴标签等操作的先后顺序可能不会影响最终图形的显示,但从标准流程和清晰组织代码的角度考虑,一般建议先设定图形的整体布局(如标题、坐标轴标签),再进行具体图形元素的绘制。这样有利于逻辑清晰和后续的代码维护。

因此,虽然 D 选项不一定在所有情况下都错,但在强调标准流程和良好实践的情境下,它表述得不够准确。

【答案】 D

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

A.lines,linewidth

B.lines.markersize

C. lines.linestyle

D. lines.marker

【解析】:

A. lines.linewidth:这个参数用于设置线条的宽度,与点的样式无关。

B. lines.markersize:这个参数用于设置点的大小,虽然涉及点,但并不改变点的形状。

C. lines.linestyle:这个参数用于设置线条的样式,例如实线、虚线等,同样与点的样式无关。

D. lines.marker:这个参数直接决定了点的形状,如圆形、方形、菱形等。

【答案】 D

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

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

B. plt.plot(x,y)

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

D. pit.title (散点图”)

【解析】:

C. plt.legend('y = cos x') 能够为图形添加图例。这一行代码的作用是添加一个图例到图表中,其中 'y = cos x' 是图例的文本,表明对应的图形代表什么。在 Matplotlib 库中, plt.legend() 函数用于此目的。

A. plt.xticks([0,1,2,3,4]) 用来设置 x 轴刻度标记的位置。

B. plt.plot(x,y) 用来在图表中绘制线或者点,其中 xy 是数据点的坐标。

D. pit.title('散点图') 这里有一个拼写错误,应该是 plt.title('散点图') ,该代码是用于给图表添加标题,而非图例。正确的函数名应该是 plt 而非 pit

【答案】 C

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

A. 折线图

B. 饼图

C. 柱形图

D. 箱线图

【解析】 要分析各分组数据在总数据中所占的比例,最适合的图表类型是能够直观展示各部分占比关系的图形。选项中:

A. 折线图通常用来展示数据随时间变化的趋势;

B. 饼图用于展示各部分所占总体的比例,每个部分的大小代表其在整体中的比例,非常适合回答这类问题;

C. 柱形图显示各个类别之间的比较,虽然也可以通过高度看出比例,但不如饼图直观;

D. 箱线图则主要用于显示一组数据分散情况,特别是异常值、中位数等统计信息,不适合展示比例。

【答案】 B. 饼图

(5) 下列说法不正确的是 ( )

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

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

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

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

【解析】

A. 散点图确实可以帮助识别数据中的离群点,因为它们会显示出与其他数据点不同的模式或位置,这一点是正确的。

B. 折线图非常适合展示数据随时间的变化趋势以及观察最大值和最小值(即数量差异),因此这个描述也是正确的。

C. 柱形图能够有效地展示不同类别的数据量大小,从而反映整体数据的数量分布,这同样是正确的。

D. 箱线图(又称为盒须图)主要用来展示数据的五数概括(最小值、下四分位数、中位数、上四分位数、最大值)以及识别潜在的异常值,但它并不直接用于查看特征间的相关性。相关性通常通过散点图来分析,因此此选项说法不正确。

【答案】 D. 箱线图可以用于查看特征间的关系(不正确)

(6) 下列有关 seabom 库说法正确的是 ( )

A. 在 seabomn 库的主题样式中 dankgrid 表示黑色背最

B. 使用 set_context 函数可以设置主题样式

C. 使用 despine 函数可以设置图形的边框

D.seabom 库是 Matplotlib 库的替代者

【解析】

A. Seaborn 库提供了一系列预设的主题样式,用以改变图表的外观,包括背景颜色。"darkgrid" 是其中一个主题,它确实提供了带有网格线的深色背景,所以此说法是正确的。

B. set_context 函数是用来设置 Seaborn 绘图的上下文 (context),它会影响图表元素的大小,如文字大小、线条宽度等,以适应不同的展示场景(如论文、演讲或笔记)。虽然它间接影响图表的视觉风格,但直接说它可以 “设置主题样式” 可能不够准确,因为它主要不是用来切换颜色方案或背景风格的。Seaborn 中用于改变主题样式的函数主要是 set_style

C. despine 函数用于移除图表中的轴脊(spines),即图表边框的部分,默认通常是顶部和右侧的边框,使得图表看起来更加现代化和简洁。因此,此说法是正确的,尽管它的表述没有提及是移除哪些边框或如何移除,但基于 Seaborn 中 despine 的功能,该描述基本正确。

D. Seaborn 库并不是 Matplotlib 的替代者,而是建立在 Matplotlib 之上的一个高级数据可视化库,它提供了更易于使用的接口来创建统计图形,并且与 Matplotlib 高度兼容,可以用来增强 Matplotlib 的功能。因此,说 Seaborn 是 Matplotlib 的替代者是不准确的,它们更多是互补关系。

【答案】 A 和 C 的描述是正确的。

(7) HS 颜色空间中的 H 表示为 ( )

A. 亮度

B. 色调

C. 饱和度

D. 空间大小

HS 颜色空间通常指的是 HSV(Hue, Saturation, Value)或 HSL(Hue, Saturation, Lightness)颜色空间的误写。在这些颜色空间中,各字母代表的意义为:

  • H(Hue):色调,表示色彩种类,如红、绿、蓝等。
  • S(Saturation):饱和度,表示颜色的纯度或者强度,饱和度越高颜色越鲜明,低饱和度则偏向灰色。
  • VL(Value/Lightness):明度 / 亮度,表示颜色的明暗程度。

根据这一解释,HS 中的 "S" 代表的是:

C. 饱和度

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

A. 标记点配置项

B. 标签配置项

C. 文本样式配置项

D. 标题配置项

A. 标记点配置项 - 通常指图表中数据点的样式设定,如颜色、形状、大小等,是常见的配置项。 B. 标签配置项 - 包括轴标签、图例标签等,用于定义图表中各种标签的显示方式,也是一个标准配置选项。 C. 文本样式配置项 - 涉及图表中所有文本的样式,比如字体、大小、颜色等,属于常见的配置范畴。 D. 标题配置项 - 虽然每个选项看起来都合理,但如果必须选出一个 “不是系列配置项” 的,从字面上理解,“系列” 可能指向数据系列(如柱状图中的不同分类、折线图的不同线条等),标题配置项(如图表的大标题)通常不直接关联到数据系列的展示细节,而是整个图表的高级设置。

基于上述分析,如果问题旨在区分那些直接关联到数据表现形式的配置项与图表整体设置的话,那么:

【答案】 D. 标题配置项(如果这里的 “系列配置项” 特指针对数据系列的详细配置,标题则更多关乎整个图表而非特定数据系列。)

(9) 下列有关全局配置项说法错误的是 ( C

A. 全局配置项可以对标题、图例、坐标轴等的配置项进行配置

B. 使用 TitleOpts 类配置标题配置项

C.TitleOpts 类和 AxisOpts 类的参数设置完全相同

D. 使用 LegendOpts 类配置图例配置项

【解析】

A. 全局配置项确实可以用来设置图表的多个基础元素,如标题、图例、坐标轴等的外观和行为,这是正确的描述。

B. TitleOpts 类通常用于配置图表的标题,包括标题文本、位置、字体样式等,符合全局配置项的用途,此描述正确。

C. TitleOpts 类和 AxisOpts 类虽然都是配置项的类,但是它们设置的参数并不完全相同。 TitleOpts 主要关注标题的配置,如文本、位置、样式等;而 AxisOpts 则侧重于坐标轴的配置,包括刻度、标签、标题、网格线等。因此,这个说法是错误的。

D. LegendOpts 类用于配置图表的图例,包括图例的位置、是否显示、图例项的样式等,这也是正确的描述。

【答案】 C. TitleOpts 类和 AxisOpts 类的参数设置完全相同(错误)

(10) 下列说法正确的是 ( )

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

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

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

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

【解析】

A. 基本散点图和 3D 散点图的绘制方法不相同。基本散点图一般在二维平面上展示,而 3D 散点图则是在三维空间中展示,两者需要不同的函数或者参数来实现,比如在 Matplotlib 中,基本散点图使用 scatter() 函数,而 3D 散点图则使用 scatter3D()Axes3D.scatter() 方法,故该选项错误。

B. 热力图(Heatmap)通过颜色的深浅变化展示数据矩阵,常用于展示数据集中变量间相关性,颜色越深通常表示相关性越强(正相关或负相关),是探索变量间关系的有效工具,故此选项正确。

C. stripplot 是 Seaborn 库中的一个函数,用于创建简单的散点图,可以接收多种类型的数据输入,包括 Pandas 的 DataFrame、Series 以及 NumPy 数组等,并不仅限于列表和数据框,因此该选项错误。

D. stripplot 函数主要用于创建分组散点图,并不直接用于绘制线性回归拟合图。在 Seaborn 中,通常使用 regplot()lmplot() 函数来绘制带有线性回归线的图表,故此选项错误。

【答案】 B. 热力图可用于了解数据集中的变量的相关关系(正确)

# 第 6 章 使用 scikit-learn 构建模型

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

A. fit()

B. transform()

C:fa_transform()

D, fit_transforms()

答案是

D, fit_transforms() 。在 Scikit-learn 库中,转换器(Transformer)的主要方法包括:

A. fit() : 用于学习数据的统计属性(如均值、方差),该方法不会改变数据,只是拟合模型。

B. transform() : 应用 fit() 所学到的统计属性对数据进行转换或处理。

C. fit_transform() : 这是一个组合方法,先调用 fit() 学习数据特性,然后立即调用 transform() 对同一数据应用变换。这个方法常用于训练阶段。

但是,没有名为 fit_transforms() 的方法。因此,选项 D 是不正确的。

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

A.StandardScaler

B, Normalizer

C.Binarizer

D.MinMaxScaler

答案是

B, Normalizer 。在 Scikit-learn 库中,用于对特征进行归一化的函数确实包括 Normalizer 。它通过将每个样本的各个特征缩放到单位范数来实现归一化,这意味着每个样本的欧几里得范式(即各特征值的平方和的平方根)将会变为 1,这通常用于文本数据或任何其他需要向量规范化的情况。

而其他选项: A. StandardScaler 是用于标准化特征,即将特征调整为具有零均值和单位方差的高斯分布,而不是简单的归一化。 C. Binarizer 用于二值化特征,根据阈值将连续型特征离散化为二元状态。 D. MinMaxScaler 用于缩放特征到一个指定的最小值和最大值之间,通常是 0 和 1,这也是一种归一化方法,但更具体的是最小 - 最大缩放。

如果问题是特指 “归一化” 到单位范数,那么正确答案是 B, Normalizer 。但如果问题意图更广泛地指 “标准化 / 归一化”,则 D, MinMaxScaler 也是一个常见的选择,尽管它不符合严格的数学定义下的 “归一化”。因此,请根据上下文判断题目意图。

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

A.SVC 算法

B.CLIOUE 算法

D.K-MEDOIDS 算法

A. SVC 算法 —— 支持向量机(Support Vector Classifier)是一种常用的分类方法,它能够处理线性和非线性可分数据,通过寻找最优超平面来完成分类任务。

B. CLIOUE 算法 —— 此选项可能指的是 CLIQUE 算法,通常用于图的社区结构发现,不是一种标准的分类方法,但若为笔误或特殊上下文中的分类应用,则需具体分析。然而,直接从名称看,它不直接对应于典型的分类算法。

D. K-MEDOIDS 算法 —— 是聚类算法的一种,用于将数据集划分成 K 个簇,每个簇由一个中心对象(medoid)代表,与 K-Means 算法相似,但选择实际数据点作为中心,而不是均值点。这不属于分类方法,而是无监督学习中的聚类方法。

基于上述分析,如果仅从分类方法的角度考虑,正确答案应是 A.SVC 算法。但请注意,选项列表似乎缺少了 C 选项,且 B 选项的描述可能需要具体情境来精确解读其是否涉及分类。

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

A. precision

B. recall

C.fl-score

D. true postive rate

答案是 D. true positive rate(真正率 / 灵敏度)

classification_report 函数是 Scikit-learn 库中的一个功能,用于输出多类分类模型的性能评估报告。这个报告通常包含以下指标:

A. Precision(精确率):衡量被分类器预测为正例的样本中实际为正例的比例。 B. Recall(召回率):衡量所有实际正例中被分类器正确识别出来的比例,也就是真正率。 C. F1-score(F 分数):是 Precision 和 Recall 的调和平均值,用于综合评估模型的精确度和召回率。

而 D. True Positive Rate(真正率)实际上是 Recall 的另一种说法,所以在 classification_report 中是直接提供的,并不意味着它不被包含在内。

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

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

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

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

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

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

这是不正确的说法。实际上,均方误差(Mean Squared Error, MSE)越接近 0,表示模型预测值与真实值之间的差距越小,也就是说模型的性能越好。因此,正确的描述应该是均方误差越接近 0,模型性能越好。

# 分析题:根据题目要求绘制项目聚类或分类流程图

4e51ba49091c481fbed4dfc7a23be5d

f261e966cada56fb4a6663378821c71

1fdd8a4002ca1c5b768f527483eec13

# 简答题:Numpy、Pandas

# 1:阐述 Numpy 中的两大对象及其特点

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

  • ndarray:存储单一数据类型的多维数组。
  • 特点:多维数组,内存连续,数据同质,支持广播和高效数学运算
  • ufunc:能够对数组进行处理的函数。
  • 特点:执行元素级操作,矢量化处理,具备广播能力,优化计算效率

# 2:阐述 Pandas 的作用

pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。

在 Python 中,pandas 库的功能十分强大,它可提供高性能的矩阵运算。

  • 可用于数据挖掘和数据分析,同时也提供数据清洗功能;
  • 支持类似 SQL 的数据增、删、查、改,并且带有丰富的数据处理函数;
  • 支持时间序列分析功能;支持灵活处理缺失数据等。

# 3:介绍 Pandas 的数据结构及其特点。

pandas 有两个强大的利器

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

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

  • 特点:支持异构数据类型,提供强大索引机制,实现数据对齐与自动广播,无缝整合 NumPy,高效处理表格型数据,为复杂数据分析任务提供便利。

# 4:列出并解释 Pandas 中用于读写 CSV 数据的相关函数。

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

read_csv () 函数:

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

to_csv () 方法:

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

# 代码题:Sklearn 应用

# 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, 并将大于 0 的值改为 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
# coding = {'a':0, 'b':1, 'c':2, 'd':3, 'e':4, 'f':5,'g':6,'h':7,'i':8,'j':9,
#           'k':10,'l':11, 'T':12,'n':13,'o':14,'p':15,'q':16,'r':17,'s':18,
#           't':19,'u':20,'v':21,'w':22, 'x':23,'y':24,'z':25}
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_))

# 二手手机价格预测

某回收二手手机的公司为了在公司的交易软件中显示预测的二手手机价格,使用用户在交易软件上的交易数据 (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])

# 客户服装尺寸预测

某淘宝成年女装店铺为了能够给客户推荐合适的成年女装尺寸,构建了相应的尺寸预测模型。目前店铺利用已购买服装客户的数据集 (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。

为了提高客户满意度,需要基于客户基本信息为客户推荐合适的服装尺寸。因此需要

使用处理后的数据调用支持向量机、决策树、随机森林分类算法构建模型,预测客户服装尺寸。

  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)

# 钻石价格预测

某珠宝店新增钻石回收业务,为了对客户提供的钻石更好地进行估价,该店铺收集了行业内近期所售钻石的 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)