小福利,数据分析之数据清洗常用方法(2)

大家好,我是天空之城,今天带来小福利,数据分析之数据清洗常用方法(2)

我们需要将日期这一列的数据做一个转化,去掉年和日的信息,而只保留月的信息。
最后,还需要将生成的月份信息,添加到原来的数据中
要想达到这个目的,就需要用到处理日期数据的相关知识了。

处理日期数据一共包含三个步骤,分别是:转化日期数据、提取月份信息以及添加新列。

先来通过代码体验一下处理日期数据的效果吧。

# 将表中的日期数据转化成日期时间格式的数据
date_data = pd.to_datetime(mask_data_clean['日期'], format = '%Y-%m-%d')
# 提取日期数据中的月份信息
month_data = date_data.dt.month
# 添加月份信息到原数据
mask_data_clean['月份'] = month_data
# 查看mask_data_clean
mask_data_clean


可以发现,在原本的mask_data_clean数据右侧,多了新的一列,恰好就是月份信息这一列。

# 转化日期数据,并设置对应的日期格式
date_data = pd.to_datetime(mask_data_clean['日期'], format = '%Y-%m-%d')
# 查看date_data
date_data

转化之后日期的数据类型转为dtype: datetime64[ns]
从图中不难发现,转化前的日期这一列的数据类型是object,而转化后的日期这一列的数据类型是datetime。

在pandas库中,如果某一列的数据类型是object,那就会对应两种情况,要么是这一列数据是str类型的数据,要么就是这一列数据包含了多种数据类型。

通过观察可以发现,日期这一列的数据类型应该都是一样的。由此可见,日期这一列数据应该就是str类型的数据了。
#查看’日期’这一列的第一条数据
type(mask_data_clean[‘日期’][0])

从结果中可以看出,第一条数据是str类型的,那么日期这一列数据是str类型的Series对象。
在我们了解完转化前的日期列的数据类型以后,再来理解为什么要将原本str类型的Series对象,转化成datetime类型的Series对象。

主要原因其实在于pandas库针对datetime类型的数据专门定制了提取年、月、日等日期信息的方法,用来提升提取日期信息的效率(之后会讲到)。

最后再来了解一下,pd.to_datetime(arg, format)这个函数是如何帮助我们转化日期数据的。

arg:参数arg代表的是要转化的数据。在这次任务中,我们想要转化的是mask_data_clean中日期这一列的数据,因此传入的数据就是:mask_data_clean[‘日期’]。
format:参数format指的是传入的日期数据的格式,比如说这份数据,就是以年-月-日的形式出现的,所以对应的format就是 ‘%Y-%m-%d’(是year-month-day的缩写)。

综上所述,在这次案例中,转换日期数据的代码就是:pd.to_datetime(mask_data_clean[‘日期’], format = ‘%Y-%m-%d’)。

提取月份信息的方法是:s.dt.month。其中的s指的就是刚才日期数据转换完后的Series对象,也就是date_data。

首先我们需要了解s.dt的作用。

s.dt是用来获取datetime类型的Series对象的值的,能够返回多种属性。这些属性包括year(年)、month(月)、day(日)等。
在这份数据中,由于日期数据格式是年-月-日,所以想要获取这份数据的年、月、日的信息,可以通过s.dt.year、s.dt.month以及s.dt.day来获取。

3.3 添加新列

# 将月份数据添加到原数据中
mask_data_clean['月份'] = month_data
# 查看原数据
mask_data_clean

我们可以用df[‘colname’] = s的方式来为原数据添加新的一列。
接下来就来具体学习一下这个方法。

df:df是DataFrame对象的简称。在这个案例中,df就是mask_data_clean。
colname:参数colname指的是要添加的新列的列名。在这个案例中,colname就是月份。
s:s指的是要传入的Series对象。在这个案例中,s就是之前得到的month_data。

因此最后添加月份数据到原数据中的代码就是:mask_data_clean[‘月份’] = month_data。
刚才在讲解添加新列的过程中,我们讲到将生成的月份信息添加到原数据中是为了方便后续使用。

其实,在这个案例中,主要是为了方便马上要讲到的分组聚合操作的实现。

4. 分组聚合操作
我们的数据,却是1-6月中每一天的销售额。这就意味着要画出这张图来,需要对各个月份的销售额进行一个汇总,然后得到一份包含了1-6月中各月总销售额的数据。

而要想得出这份数据,就需要用到分组聚合操作的知识了。

# 统计各个月份总销售额
sales_price = mask_data_clean.groupby('月份')['销售额'].sum()
# 查看sales_price
sales_price

在体验完代码之后,接下来就正式开始分组聚合操作的学习了。

在这个案例中,分组聚合操作的代码是:df.groupby(key)[‘colname’].sum()。
我们可以将其分成两部分,分别是:分组操作以及聚合操作。

相对应的代码分别是:df.groupby(key)以及[‘colname’].sum()。

4.1 分组操作
分组操作指的是根据某项规则将数据分入不同的组中。
在这个案例中,规则就是月份相同的数据归为一组。

因为这份数据一共包含了6个月的信息,我们可以将数据划分为6组。

以下以一月份为例,展示分组操作的效果:
接着,我们看下分组操作对应的代码:df.groupby(key)。

df:这里的df指的是要进行分组的DataFrame对象。在这个案例中,df就是mask_data_clean。

key:参数key指的是要分组的列索引。在这个案例中,要根据月份这一列进行分组,那么参数key就是’月份’。

综上所述,对月份进行分组操作对应的代码就是:mask_data_clean.groupby(‘月份’)。

4.2 聚合操作
聚合操作指的是对于数据中的某些组,去求得某些值(比如求和、求平均值等)的过程。

比如说之前的分组操作根据月份信息将数据分成了6组,那么聚合操作就是针对这6个不同的组,去求这6个组中某些值(比如求和、求平均值等)。

我们先以求和操作为例,针对一月份的销售额进行求和,效果如下图所示:

依此类推,聚合操作也会对剩下的5个月份的数据分别进行求和操作。最后一共会返回6条数据。如下图所示:
再来看下聚合操作对应的代码:[‘colname’].sum()。

colname:参数colname指的是要求值的列所对应的索引。如果要针对销售额这一列求和,那参数colname就是’销售额’。

sum():函数sum()指的是求和操作。求和操作是聚合操作的一种。

那对销售额进行聚合操作对应的代码就是:[‘销售额’].sum()。

到这里,就已经学完了分组聚合操作的相关知识。接下来我们通过代码来练习一下。

要求是先对月份这一列进行分组操作,再对订单量这一列进行聚合操作,其中聚合操作是求和操作。

5. 折线图
在学习折线图的绘制之前,我们需要先了解折线图的使用场景。

5.1 折线图的使用场景
折线图一般是用来针对数值型数据进行分析的。折线图往往可以反映数值型数据的变化趋势。

从数据中可以发现,各个月份数据的值很大,而且在反映数据的变化趋势上,也不够直观。

接着再来看一下将这份数据用折线图的方法可视化出来的效果。

5.2 折线图的绘制

import matplotlib.pyplot as plt
#图像字体中文化
plt.rcParams['font.family'] = ['Source Han Sans CN']
#绘制各月总销售额的折线图
sales_price.plot(kind = 'line', figsize = (7, 7),
                 title = '各月总销售额趋势图')

接下来就来讲解画折线图所对应的代码:s.plot(kind = ‘line’, figsize, title)。

因为这行代码中对应的三个参数的作用和之前学过的饼图、柱状图等图像中的作用非常类似,下面会比较简略地讲解这三个参数的效果。

kind:参数kind的作用是设置所画图像的类别。折线图所对应的值是 ‘line’。因为要画折线图,那就要将 'line’赋值给参数kind,即:kind = ‘line’。

figsize:参数figsize的作用是设置图像大小,这里我们将图像的宽和高都设定为6英寸,也就是将 (7, 7)赋值给参数figsize,即:figsize = (7, 7)。

title:参数title作用是设置图像标题名。因为这张折线图展现的是各月总销售额的变化,那就可以将 '各月总销售额的变化图’赋值给参数title,即:title = ‘各月总销售额的变化图’。

6. 数据分析实战
6.1 任务分析
在正式进入数据分析实战之前,先来回顾一下当初实习员工的分析报告。

当时实习员工在分析报告中写到:

从总体趋势上来看,1-3月份各月总利润是不断增加的。但是3月份以后,各月总利润不断减少。但是在6月份之前,各月总利润依旧明显高于各月总成本。

5月份的时候是一个临界点,在这个临界点上,销售额和成本已经几乎持平。

到了6月份,销售额已经比成本低了。又由于总成本几乎没有变化,所以按照3月份以后各月销售额的变化趋势,应该尽早将口罩厂转手。

如果不仔细想,确实不会觉得这样的分析报告有什么问题。

不过给你看一张图,可能就能说明问题了。
这张图反映的问题是:即便4月份到6月份,口罩销售额不断下降,但是7月份的时候,依然有可能会有反弹。
这也是当初老板觉得实习员工分析得不够细致的地方,也就是没有说明6月份以后,口罩各月销售量依旧会延续之前的下降趋势的原因。

我们接下来要做的,就是帮助之前的实习员工,补充这个原因以及给出严谨的论证。

我们首先从利润公式出发。
利润=销售额-成本
从公式中可以看到,各月利润是由两个变量决定的,分别是销售额以及成本。
根据之前的图表不难发现,各个月份的总成本,几乎是保持不变的。事实上,这一部分成本也没有那么容易削减。

所以会对利润产生比较大影响的变量,就是销售额了。

因此接下来我们再来研究一下销售额的公式
销售额=订单量*单价

虽然我们的数据统计的是每一天的口罩订单量和单价的数据,但是我们想要研究的不是每一天的变化趋势,而是每个月的。

因而我们应该将关注重心放在各月总订单量以及各月平均单价这两个变量上,去研究这两个变量的变化趋势。

6.2 各月口罩总订单量的变化
接着就通过绘制折线图的方式将各月口罩总订单量可视化出来,进而能够更加直观地研究总订单量的变化趋势。
#绘制各月总订单量的折线图
order_number.plot(kind = ‘line’, figsize = (7, 7),
title = ‘各月总订单量变化图’)

从各月口罩总订单量的变化图可以发现,1-3月份,口罩总订单量是不断增长的。3月份是口罩订单量的峰值。3月份以后,口罩总订单量是不断减少的。

由于3月份到6月份,口罩订单量呈现了大幅下降的趋势,所以可以推测,6月份之后,口罩的订单量依旧会呈现下降的趋势。

在对各月口罩总订单量的变化趋势有了一些了解之后,可以发现3月份的口罩总订单量是一个顶峰,远超其它几个月的数据。

那么这个时候,我们会想直观感受一下3月份的口罩总订单量以及占比和其他几个月相比,到底相差多少。

这个时候,我们就想去绘制各月口罩总订单量的柱状图和饼图。

柱状图可以更加聚焦于各月口罩总订单量在数量上的差别,而饼图可以更加聚焦于各月口罩总订单量占比的大小。
#绘制各月总订单量的柱状图
order_number.plot(kind = ‘bar’, figsize = (7, 7),
title = ‘各月总订单量柱状图’)

#绘制各月总订单量的饼图
order_number.plot(kind = ‘pie’, autopct = ‘%.2f%%’, figsize = (7, 7),
title = ‘各月总订单量饼图’, label = ‘’)

从各月总订单量的柱状图和饼图中可以更加清晰地感受到,3月份的口罩总订单量远超其他几个月份,并且占比也有64%左右

到6月份的时候,口罩的订单量已经少得和1月份刚开始做口罩的时候差不多了。

结合实际的工作场景不难理解,疫情是在1月份中下旬才开始爆发的。在此之前,口罩厂的生意并不算太理想。

1月中下旬开始,疫情爆发,口罩需求不断增加,导致口罩订单量也呈现不断增长的趋势。

但是3月份之后,口罩总订单量开始呈现急剧下降的趋势。背后的原因主要是因为当时国内做口罩生意的厂家开始变多了起来。

与此同时,国内疫情慢慢得到控制,人们不再那么恐慌,开始变得理性,导致需求量不断地减少。

在可预见到的未来几个月,如果疫情依旧能控制得像现在这么稳定,订单量只会越来越少。

到这里,我们结合口罩总订单量的图表以及实际工作场景,可以预测:从7月份开始口罩的订单量依旧会呈现出不断下降的趋势。

6.3 各月口罩平均单价的变化
在分析完各月口罩总订单量的变化以后,我们再来分析一下各月口罩平均单价的变化。

求各月口罩平均单价的变化也需要用到分组聚合操作的相关知识。

不过和之前求各月总订单量的方法略有不同。

由于各月总订单量求的是在各个月份下,每日订单量的汇总。所以对应的聚合操作是[‘colname’].sum()。
#求得各月口罩平均单价
mask_price = mask_data_clean.groupby(‘月份’)[‘单价’].mean()
#查看mask_price
mask_price

在得到了各月口罩平均单价的数据后,再来绘制折线图将这份数据可视化出来。
#绘制各月口罩平均单价的折线图
mask_price.plot(kind = ‘line’, figsize = (7, 7),
title = ‘各月口罩平均单价变化图’)
从图中可以看出,1-3月,口罩的平均单价是不断上涨的。3月份以后,口罩的价格开始不断下降,到6月份,口罩的平均单价甚至比1月份都低了。
结合实际的工作场景也不难理解,在1-3月期间,口罩的需求量逐渐上升,而当时市场供给严重不足,所以口罩的单价才能不断上涨。

3月份以后,越来越多的口罩厂以及口罩供给量,导致口罩厂商之间竞争激烈。

我们公司的口罩厂只能不断地压低价格,才能保证产品能卖得出去。

到了6月份,市场几乎已经饱和,口罩的价格自然变得非常低。

结合口罩厂平均单价的图表以及实际的工作场景,可以预测:公司为了能将口罩卖出去,从7月份开始口罩单价依旧会呈现出不断下降的趋势。

6.4 任务总结
最后我们来回顾一下我们之前分析所得到的一些结论。

通过对各月口罩总订单量的分析,我们预测:未来从7月份开始,各月口罩总订单量依旧会呈现出不断下降的趋势。

通过对各月口罩平均单价的分析,我们预测:未来从7月份开始,各月口罩平均单价依旧会呈现出不断下降的趋势。

结合以上两点预测信息,我们可以推导出:未来从7月份开始,各月口罩总销售额将会继续下滑。

由于各月总成本几乎维持不变,很难降下来,再加上6月份的时候,销售额已经小于成本了。

所以从7月份开始,口罩的销售额和成本之前的差值会越来越大,公司会亏得越来越多。
综上所述,公司应该尽早将口罩厂转手。

你可能感兴趣的:(python,python,数据分析)