- 这里是一个演示,用最简单的方法进行快速的数据分析,并输出自定义的图表。这种分析方法在很多调查报告中都很有用,网购仅仅是一个案例
“我在亚马逊上花了多少钱?”—— 这个问题很可能会使电子商务巨头的长期客户感兴趣,甚至可能使他们感到恐惧。但了解这件事对您来说很重要,不只是钱的问题。
而是数据分析的方法。
本文将介绍这件事可以怎么做。
这里将使用 Python 来分析 Amazon 数据。但是,如果您没有编码经验也请不要担心!本文将尽可能说得简单,而且只需要不到30行代码就能完成一大堆很酷的事,例如:
- 计算出您曾经在 Amazon 上花费的总金额;
- 找到您最贵的和最便宜的订单,以及平均数和中位数订单;
- 找出您已缴纳的税款以及您在亚马逊上的有效税率;
- 通过条形图可视化您的每日消费习惯;
- 自定义条形图的某些元素,例如大小和颜色,以呈现更清晰的解释。
那么现在就开始。您会看到 Python 很好玩的地方。
准备进行分析
1、下载并安装工具
为了进行分析,我们将做一些 Python 编程。但是请不要紧张,即使您一生中从未编写过任何代码,在这里也可以做到!下面将逐步介绍该过程。
第一步是在计算机上安装一个名为 Anaconda 的工具。这将使您能够开始使用被称为 Jupyter Notebook 的东西进行编程。
Jupyter Notebooks 是执行此类数据分析项目的出色工具,一旦掌握了这些要点,您可能会发现自己经常需要使用它。
相关教程有很多,但是今天要做的事非常简单,所以只需要继续阅读即可。
首先,需要访问 Anaconda 网站上的此页面,略微向下滚动,然后选择您的操作系统 —— Windows、Mac 或 Linux。
选择了正确的操作系统后,点击 Python 3.7 版本下绿色的“下载”按钮来下载 Anaconda。
下载完成后就可以像安装其他任何应用程序一样来进行安装它了:只需双击下载的文件,然后弹出安装向导以指导完成安装过程。
基于本文的目的,默认安装设置会很好。不过,您需要记下要安装它的文件夹。
尽管可以从任何位置保存和访问文件,但今天要将数据集和 Jupyter Notebook 的文件保存到同一文件夹中,以便于访问。
安装 Anaconda 后就可以继续执行下一步了。
2、下载亚马逊订单历史记录数据
亚马逊可以让您下载已完成订单的大量报告,尽管可用数据只能追溯到2006年。不过,如果您是普通的 Amazon 用户,那么十多年的数据肯定会包含一大堆有趣的东西。
要获取数据,请在登录时单击此链接,直接进入订单报告下载页面。
但是,如果这不起作用,也可以直接导航至该页面:转到 Amazon.com,然后单击右上角的 Accounts and Lists 按钮。在下一页上,找到 “订购和购物首选项” 部分,然后单击题为 “Download order reports” 的链接。
如果您想通读本教程,但又不想使用自己的数据,则可以下载这里的匿名数据集。
亚马逊提供四种不同的报告类型。目前,我们将要下载“订单和出货量”报告,因此请从下拉菜单中选择该选项。
然后,可以为要查看的数据选择开始日期和结束日期。要查看所有 Amazon 存储的数据,需要将开始日期设置为2006年1月1日。然后点击“结束日期”旁边的 “Use today” 按钮,以自动填写今天的日期。
(如果您希望查看的订单记录不是全部,则页面右侧还会显示“快速设置选项”,可用于快速输入想要查看的时间段,例如近一年或最近一个月)
还可以选择在报告中添加名称 —— 这不是必需的,可以将其保留为空白,但是如果您打算下载许多不同的报告并希望轻松区分它们,那就这样做。
一切准备就绪后,单击 “Request Report”,Amazon 将开始为您构建报告。
您要求的数据越多、订单越多,花费的时间可能就会更长。但是在一两分钟之内就应该会弹出一个.csv文件的下载消息。请单击“保存”进行下载。
3、重命名和移动 Amazon Order 数据
准备开始进行一些编程,然后进行分析。但是首先,请通过重命名和移动刚下载的文件使下面的工作变得简单一些。
默认情况下,它可能称为 01_Jan_2006_to_10_Sept_2019.csv
但你可以更简单地重命名它为 amazon-orders.csv
.
接下来将 amazon-orders.csv 文件移动到安装 Anaconda 的文件夹中,以便可以从 Jupyter Notebooks 轻松访问它。
如果您在安装过程中未更改默认文件夹,则在 Windows 上为 C:/Users/YourUsername/
4、打开一个 Jupyter Notebook
现在终于到了有趣的部分了!打开 Anaconda Navigator 应用程序。您可以通过在计算机上搜索 “Anaconda Navigator” 来找到它。
在 Windows 上,您也可以在“开始”菜单中找到它;在 Mac 上,它应该在“应用程序”文件夹中。打开后,您会看到一个类似以下的屏幕:
单击 Jupyter Notebook 下的“启动”按钮。这将在浏览器中打开一个新屏幕。
在该屏幕的右上角,单击“新建”,然后在下拉菜单的“笔记本”下,单击 “ Python 3”。
已经准备就绪了!下面就进入分析。
我在亚马逊上花了多少钱?
Jupyter Notebooks 使您可以在单元格中编写和运行少量代码片段。在屏幕上,菜单和按钮下方,您会看到一个小方块, In [ ]:
光标的闪烁,这是第一个单元格,是开始编写代码的地方。
在此分析中将使用 Python,这是一种非常通用的编程语言,在数据分析中很流行。
还将使用称为 pandas 和 matplotlib 的 Python 软件包。您可以将软件包视为类似于浏览器插件,它们是有助于扩展常规 Python 功能的工具。
Anaconda 已经安装了 Pandas 和 matplotlib,因此不需要自己下载安装。
5、将数据导入 Pandas
第一步是编写代码以打开并查看 Amazon 数据,以便可以看到正在使用的内容。
这里将使用 pandas 进行大部分分析,因此第一步是导入 pandas 程序包,并给它起一个昵称 pd,以便在代码中更轻松地引用它。
接下来,创建一个名为 df 的新变量,它是 DataFrame 的缩写,然后告诉 pandas“将 Amazon 数据存储在该变量中。
这里真正要做的是以表格格式存储数据。为此需要告诉 pandas 去读 .csv 文件作为一个 Dataframe。
将为此使用 pd.read_csv(’file_name.csv’)。下面细分一下:
- pd 在告诉 Python 使用 pandas 进行此操作;
- .read_csv()在告诉 pandas 读取 csv 文件并将其存储为 DataFrame;
- 括号内的 ‘file_name.csv’ 部分告诉 pandas 在安装 Anaconda 的同一文件夹中读取具有该文件名的 csv 文件。
如果要从其他文件夹中获取 CSV 文件,则必须输入完整的文件路径,比如这样 C:/Users/Username/file_name.csv
. 这就是将 amazon-orders.csv 文件存储在与安装 Anaconda 相同的文件夹中的便利。
最后将使用名为 .head()的函数查看数据的前五行,这是为了解正在使用的数据以及亚马逊的订单历史记录包括哪些数据。
为此,使用语法 DataFrame.head(),由于 DataFrame 存储在变量 df 中,因此将使用 df.head()。
本教程将大量使用 .head() —— 这是一种非常快捷的方法,可以仔细检查代码是否进行了我们认为已进行的更改,至少在进行更改时更为直观。
将此代码输入到第一个 Jupyter Notebook 单元中,然后单击“运行”按钮,或使用键盘上的 Shift + Enter(在Mac上为 Cmd + Enter)。
import pandas as pd
df = pd.read_csv('amazon-orders.csv')
df.head()
很酷,仅用三行代码就导入了所有数据,现在可以以方便的表格格式查看。
如果您想读取完整数据集,可以使用 df.shape。这样:
df.shape
(59, 23)
现在您知道了 DataFrame 有59行和23列(本教程使用的数据集非常小;您的 DataFrame 可能会更大!)
在本教程中使用的数据集是一些 Amazon 购买历史记录的编辑版本。为了保护隐私,更改了姓名、地址、卡号、和购买价格,但是此数据的格式与您要从亚马逊下载的真实数据的格式完全相同,并且在此匿名数据上使用的代码将也可以处理您的真实数据 —— 无论您有多少数据。
默认情况下,Amazon 数据随附的列名具有很强的描述性,而且很显然,该数据集中有很多有趣的东西要看。
这里的首要目标是找出总共花费了多少钱,并计算出每笔订单的平均价格。这意味着 “Total Charged
” 列中的数据绝对是重要的。
综上所述,您 可能还会注意到某些列的值为NaN。这是一个空值; NaN是 pandas 表示缺乏数据的方式。在进行分析时必须意识到数据集中的这些缺失值。
6、清理数据
清理数据是大多数数据分析项目的重要组成部分,需要在此处进行一些数据清理,然后才能进行分析,并找出在 Amazon 上花费的总金额。
从处理这些 NaN 值开始。需要对数据进行一些数学运算,但是 1 + NaN 是一个很难解决的数学问题。毕竟,NaN 不是数字;由于 NaN 代表缺少信息,因此我们仅使用方便的 df.fillna()函数填写所有这些 NaN 值。
这就能够自动将每个 NaN 值替换为其他值。在这种情况下,将 NaN 替换为数字零。
不过在这里需要小心一点。不只是要暂时替换这些值,还要将该版本的 DataFrame 存储为新的 DataFrame。这里将使用 df = df.fillna(0)替换值,然后重新定义 df 变量以指向该新 dataframe。
然后将再次使用 .head()函数来确保所做的更改有效。
df = df.fillna(0)
df.head()
非常好!正如您所看到的,空值都已被零替换,这将使计算变得更容易。
不过这里还有一些数据清理问题。此数据集中的价格已存储为字符串,这意味着计算机将其视为一系列字符,而不是可以加在一起的数字 —— 它们包括$,这不是数字。
在使用这些值执行计算之前,需要删除那些美元符号,然后将字符串值转换为浮点数(Python 可以轻松对其进行计算的数字数据类型)。幸运的是,这些操作仅需要几行代码就可以做到。
具体来说可以使用两种 pandas 函数。
首先,Series.str.replace()
这允许您在数据框的任何列中用另一个字符替换一个字符或一组字符;
就本文的目的而言,这很有用,因为我们可以使用以下语法 df["Total Charged"].str.replace('$','')
。
也就是告诉 pandas 在该列中将 $ 去掉。这样就能剩下的全都是数字了。然后就可以使用函数 .astype(float)将列中的每个条目转换为浮点类型,以便进行数学运算。
再一次,要修改 DataFrame,然后将 df 变量指向该 DataFrame 的新版本。但是,由于这一次只修改数据的一列,因此将使用 df [“ Total Charged”] 来指定仅在该列中进行这些更改。
现在可以将它们放在一起了,然后再次使用 head()。
df["Total Charged"] = df["Total Charged"].str.replace('$','').astype(float)
df.head()
滚动到该表的右侧,您可以看到已经完成了:美元符号都消失了。下面就进行正式的计算。
7、计算在亚马逊上花费的总金额
pandas 有一些基本函数对本文的目的有用。这里从 .sum()开始,它将为您提供此列中每个数字的总数,换句话说,就是在 Amazon 上花费的总数。
df["Total Charged"].sum()
1777.7300000000002
$1,777.73!有些人的总数也许会更大,你会感到惊讶的。
8、计算其他:平均支出、最大购买量等
pandas 允许您非常快速地进行其他一些计算。例如,平均购买价是多少?可以使用 .mean()找出:
df["Total Charged"].mean()
30.131016949152542
由于查看平均数/平均值有时可能会掩盖异常值,因此也可以查看中位数。使用 .median()来做到这一点。
df["Total Charged"].median()
15.95
那很有意思!中位数支出比平均支出低很多。看起来曾经下了一些昂贵的订单。现在来看看使用 max()找到的最高额订单是什么:
df["Total Charged"].max()
210.99
好吧,最贵的订单是211美元。那最便宜的订单呢?可以使用.min()找到:
df["Total Charged"].min()
1.04
只花了1美元买了什么?不记得了!
9、我缴纳了多少税?
该数据存储在“应收税款”列中。该列尚未清理,因此与开始时的 “Total Charged” 列存在相同的问题。
但是,这就是编程的美妙之处:先前已经编写了可以解决该问题的代码,现在要做的就是从上面复制并粘贴列清理的代码,然后将“ Total Charged”替换为“ Tax Charged”,以告知 Python 在“ Tax Charged”列上执行相同的操作。
df["Tax Charged"] = df["Tax Charged"].str.replace('$','').astype(float)
df.head()
现在可以用于您想要进行的任何类型的分析了。例如,根据此数据集,已支付的税款总额是多少?将再次使用.sum()来找出:
df["Tax Charged"].sum()
52.60999999999999
显然,在亚马逊上花费的全部钱中约有52.61美元用于税收。不同项目的税率不同,可以在 DataFrame 中看到某些项目根本不收取任何税款。
但是,如果您愿意,可以简单地将 “Total Charged” 与 “Tax Charged” 相除,从而得出总体税率,如下所示:
df["Tax Charged"].sum() / df["Total Charged"].sum()
0.02959392033660904
答案是 约 2.9%。
如果您现在还想挑战一点,那么可以使用此数据集做更多的事。比如通过做一些具体分析来了解自己的消费习惯如何随着时间而改变。
10、分析消费习惯
在 Python 中使用日期之前需要先将它们转换为 datetime 数据类型,以便计算机可以将它们识别为日期。
对于 pandas 来说这非常简单。只需要使用 .pd.to_datetime()并在括号内指定要修改的列,以告诉 pandas 将其作为日期读取。
和以前一样,要确保将更改存储在 df 中,因此将指定要修改 df [‘Order Date’] 列,然后将其分配给 “Order Date” 列。
确实只需要查看一行即可确保日期在此处已更改,因此将自定义参数提供给 df.head()。括号中如果是1,那就是显示一行。
df['Order Date'] = pd.to_datetime(df['Order Date'])
df.head()
您可以看到日期格式已从 2019/04/01 更改为 2019–04–01。完工。现在就可以继续进行下一步分析了。
可能有趣的一件事是,该数据集中每一天的花费是多少。这是一种最容易从视觉上进行观察的分析,以条形图的形式最方便看。
pandas 和 matplotlib 软件包使您能够在 Jupyter Notebook 内部构建和查看各种图表类型。
(注意:当您运行此代码单元时,不会发生明显变化,但是它将使 matplotlib 能够在笔记本中显示图表。)
%matplotlib inline
现在就可以使用 df.plot.bar()以非常简单的方式制作基本的条形图。
df.plot.bar(x='Order Date', y='Total Charged', rot=90)
<matplotlib.axes._subplots.AxesSubplot at 0x1c30f9c4e10>
那个图表有点小,很难看清是否真的得到了想要的东西。那么扩大它,以便可以更轻松地读取数据。
可以通过在绘图代码中添加一个称为 figsize 的参数来实现。这使您可以通过宽度和高度来定义图的大小。
它使用的单位不是特别直观,但是(20,10)是大多数图表的理想默认值,然后可以根据需要进一步调整。
需要做的就是将 figsize =(20,10)添加到代码中已有的参数中。请注意,每个单独的参数都用逗号分隔。
df.plot.bar(x='Order Date', y='Total Charged', rot=90, figsize=(20,10))
<matplotlib.axes._subplots.AxesSubplot at 0x1c3129870b8>
这就更容易阅读了!但是,仔细看一下上面的图表会发现一个问题:当同一天下了多个订单时,每个订单在条形图中都有一个单独的条。比如前三个条,都是4月1号。
那并不是本案例想要的。这里是希望看看每天花了多少钱。每个条应代表的是一天,而不是一个订单,因此,如果当天有多个订单,则应将这些订单的总费用相加。
可以使用另一个内置的 panda s函数做到这一点: df.groupby()
.
语法有点复杂,但是可以将想要做的事情分为两部分:
- 希望按 “订单日期” 对数据进行分组,以便将共享同一日期的所有订单都计入一行;
- 要在每个日期的 “Total Charged” 列中获取已支付价格的总和,并在相关日期的行中将其作为 “Total Charged” 的值。
由于是按订单日期分组的,因此将从 df.groupby(’Order Date’)开始。接下来需要做的是获取该组中 “Total Charged” 列的总和,并设置新的 “Total Charged” 列,因此将在第一部分之后添加 .sum()["Total Charged"]
.
看起来像这样:
daily_orders = df.groupby('Order Date').sum()["Total Charged"]
daily_orders.head()
Order Date
2019-04-01 63.91
2019-04-04 156.12
2019-04-05 27.64
2019-04-07 40.63
2019-04-08 44.99
Name: Total Charged, dtype: float64
如您所见,.head()的结果在这里看起来有些不同。那是因为这是一个 Series 而不是 DataFrame。
确切了解其工作原理对于本教程来说并不重要,但是如果您向上滚动至以前的 df.head()打印输出之一,则可能会注意到表格的最左侧是:0、1、 2、3、4 … 这些数字是索引标签。
幸运的是,pandas 能够很好地绘制以日期为索引标签的 Series,因此您无需对数据进行任何其他操作。
如果检查之前的 DataFrame 中的数字可以看到这里的总和是正确的。2019年4月1日有3个单独的订单,分别为 $ 36.93,$ 16.99 和 $ 9.99。这三者的总和为 $ 63.91,即4月1日的 day_orders 值。完美。
是时候将其制作成条形图了。可以使用 Series.plot.bar()做到这一点,并且由于该 Series 只有一列和一组索引标签,因此甚至不需要定义x和y轴,他会自动执行此操作。
daily_orders.plot.bar(figsize=(20,10))
<matplotlib.axes._subplots.AxesSubplot at 0x1c3110bbf60>
现在已经有了想要绘制的图表,但是您还可以做出另一个快速的改进。
此图表中的不同颜色具有误导性。每个小节实际上代表的是同一事物的价值(当天亚马逊向您收取的订单总额)。但是由于每个条形都是不同的颜色,因此查看此图表的人可能会认为颜色具有一定的含义。
您可以使用另一个参数(例如 figsize)来更改此设置。例如,在绘图代码中添加参数 color =“ blue” 将使图表中的每个条形都变为蓝色。
该参数可以接受“蓝色”之类的基本颜色,但也可以接受其他格式的颜色信息,包括您可能在网络上经常能看到的十六进制代码。
把它改成一些有趣的颜色,比如 绿色的十六进制代码是 #61D199,那么就是:color='#61D199'
.
将其放入代码中,看看它的外观!
daily_orders.plot.bar(figsize=(20, 10), color='#61D199')
<matplotlib.axes._subplots.AxesSubplot at 0x1c311dcd5c0>
这就漂亮很多了。这张图表展示了以前的分析中所没有的东西:尽管最大的单笔订单刚好超过200美元,但在7月的一天中,有几笔订单的总金额超过了400美元。
显然,您仍然可以通过很多方法来改进此图表。但是这里的目标不是创建视觉完美的图表,而是,演示如何使用一些快速编程以从大数据集中挖掘重要见解的方法。现在您已经了解到:
- 在此期间,我在亚马逊上花了多少钱。
- 最高、最低和平均订单总额是多少。
- 缴纳了多少税,以及有效税率。
- 指出随时间波动的情况。
- 哪天花的钱最多。
只用了不到三十行的代码就可以完成所有这些工作。
如何使这个项目更进一步
想更深入吗?您可以根据自己的兴趣尝试以下几种方法来进一步扩展该项目:
- 查看其他参数以添加到绘图代码中,进一步美化图形。
- 在其他栏添加每一天的 Tax Charged。
- 按月份或年份(而不是一天)细分您的支出。
- 寻找一种方法来获取每天(包括没有订单的日子)到您的数据集中,以便可以更轻松地直观显示一段时间内的支出。
您还通过哪些其他网站购物吗?淘宝?京东?查看它们是否允许您访问任何数据,您可以做出同样的分析。
基本的数据分析方法也是开源调查报告的刚需,比如分析网络水军的动态等等,希望本文的基本演示能帮助您理解这一分析方法。⚪️