=================================== 数据分析例子 =================================== 现在就开始文章开始说的数据分析例子,即从一份公司财富数据中分析公司的利润变化情况。 命名 notebooks ================================================== 首先,给 notebook 命名一个有意义的名字,比如 jupyter-notebook-tuorial, 可以直接在 notebook 界面直接点击上方文件名,如果未命名,那就是 ``Untitle.ipynb`` , 当然也可以返回管理界面进行命名,如下所示,选择 notebook 后,上方会出现一行选项,包括: - Duplicate:复制 - Shutdown:停止该 notebook 的 kernel - View:查看 notebook 内容 - Edit :编辑其 metadata 内容 以及还有一个删除文件的选项。如 :numref:`选项界面` 所示。 .. figure:: image28.png :alt: 选项界面 :align: center :name: 选项界面 选项界面 注意,关闭 notebook 的界面并不会关掉 notebook 的 kernel,它会一直在后台运行, 在管理界面看到 notebook 还是绿色状态,就表明其在运行,这需要选择 Shutdown 选项, 或者命令行里关掉 Jupyter notebook 的命令。 准备工作 ================================================== 首先导入一些需要用的第三方库: :: %matplotlib inline import pandas as pd import matplotlib.pyplot as plt import seaborn as sns sns.set(style="darkgrid") pandas 用于处理数据,Matplotlib 用于绘制图表,而 seaborn 可以让图表更加漂亮。 通常也需要导入 Numpy ,不过在本例中我们将通过 pandas 来使用。此外, %matplotlib inline 这并不是 python 的命令,它是 Jupyter 中独有的魔法命令, 它主要是让 Jupyter 可以捕获 Matplotlib 的图片,并在单元输出中渲染。 接着就是读取数据: :: df = pd.read_csv('fortune500.csv') 保存和检查点(checkpoint) ================================================== 在开始前,要记得定时保存文件,这可以直接采用快捷键 Ctrl + S 保存文件, 它是通过一个命令--“保存和检查点”实现的,那么什么是检查点呢? 每次创建一个新的 notebook,同时也创建了一个 checkpoint 文件, 它保存在一个隐藏的子文件夹 ``.ipynb_checkpoints`` 中,并且也是一个 ``.ipynb`` 文件。 默认 Jupyter 会每隔 120 秒自动保存 notebook 的内容到 checkpoint 文件中, 而当你手动保存的时候,也会更新 notebook 和 checkpoint 文件。 这个文件可以在因为意外原因关闭 notebook 后恢复你未保存的内容, 可以在菜单中 File->Revert to Checkpoint 中恢复。 对数据集的探索 ================================================== 现在开始处理我们的数据集,通过 pandas 读取后得到的是称为 DataFrame 的数据结构, 首先就是先查看下数据集的内容,输入以下两行代码,分别表示输出数据的前五行,和最后五行的内容。 :: df.head() df.tail() 如 :numref:`输出内容` 所示: .. figure:: image29.png :alt: 输出内容 :align: center :name: 输出内容 输出内容 通过查看,我们了解到每行就是一个公司在某一年的数据,然后总共有 5 列, 分别表示年份、排名、公司名字、收入和利润。 接着,为了方便,可以对列重命名: :: df.columns = ['year', 'rank', 'company', 'revenue', 'profit'] 然后,还可以查看数据量,如下所示: :: len(df) 如 :numref:`数据量` 所示, 总共有 25500 条数据,刚好就是 500 家公司从 1955 到 2005 的数据量。 .. figure:: image30.png :alt: 数据量 :align: center :name: 数据量 数据量 接着,我们再查看数据集是否和我们希望导入的一样, 一个简单的检查方法如 :numref:`查看数据类型` 是否正确: .. figure:: image31.png :alt: 查看数据类型 :align: center :name: 查看数据类型 查看数据类型 这里可以发现 profit 数据类型居然是 object 而不是和收入 revenue 一样的float64 类型, 这表示其中可能包含一些非数字的数值,因此我们需要检查如 :numref:`非数字的数值` : .. figure:: image32.png :alt: 非数字的数值 :align: center :name: 非数字的数值 非数字的数值 输出结果表明确实存在非整数的数值,而是 N.A,然后我们需要确定是否包含如 :numref:`其他类型的数值` : .. figure:: image33.png :alt: 其他类型的数值 :align: center :name: 其他类型的数值 其他类型的数值 输出结果表示只有 N.A ,那么该如何处理这种缺失情况呢,这首先取决有多少行数据缺失了 profit : 如 :numref:`数据缺失情况` : .. figure:: image34.png :alt: 数据缺失情况 :align: center :name: 数据缺失情况 数据缺失情况 369 条数据缺失,相比于总共 25500 条数据,仅占据 1.5% 左右。 如果缺失的数据随着年份的变化符合正态分布,那么最简单的方法就是直接删除这部分数据集, 如 :numref:`删除数据集代码` 所示。 .. figure:: image35.png :alt: 删除数据集代码 :align: center :name: 删除数据集代码 删除数据集代码 从结果看,缺失数据最多的一年也就是 25 条也不到,相比每年 500 条数据,最多占据 4%, 并且只有在 90 年代的数据缺失会超过 20 条,其余年份基本在 10 条以下, 因此可以接受如 :numref:`删除缺失值的数据代码` 所示。 .. figure:: image36.png :alt: 删除缺失值的数据代码 :align: center :name: 删除缺失值的数据代码 删除缺失值的数据代码 删除数据后,profit 就是 float64 类型了。 简单的数据探索完成了,接下来进行图表的绘制。 采用 matplotlib 进行绘制图表 ================================================== 首先绘制随着年份变化的平均利润表,同时也会绘制如 :numref:`收入随年份的变化情况` 。 .. figure:: image37.jpeg :alt: 收入随年份的变化情况 :align: center :name: 收入随年份的变化情况 收入随年份的变化情况 结果看起来有点类似指数式增长,但出现两次巨大的下降情况,这其实和当时发生的事件有关系, 接下来可以看看如 :numref:`收入的变化情况` : .. figure:: image38.jpeg :alt: 收入的变化情况 :align: center :name: 收入的变化情况 收入的变化情况 从收入看,变化并没有像利润一样出现两次波动。 参考 https://stackoverflow.com/a/47582329/604687, 我们添加了利润和收入的标准差情况, 用于反馈同一年不同公司的差异情况, 如 :numref:`收入或者利润差距` : .. figure:: image39.jpeg :alt: 收入或者利润差距 :align: center :name: 收入或者利润差距 收入或者利润差距 结果表明了不同公司的差距还是很大的,存在有收入几十亿,也有亏损几十亿的公司。 其实还有很多问题可以深入探讨,但目前给出的例子已经足够入门 Jupyter notebook, 这部分例子展示了如何分析探索数据,绘制数据的图表。