介绍两个数据分析思路,三个数据分析方法和一个数据可视化工具:
1)分析思路
2)统计值分析法
3)分布分析法
4)对比分析法
5)Seaborn 绘图
做数据分析,最主要的目标是为了发现问题,定位原因,然后解决问题,最后验证效果。
整体趋势分析,它的主要目的是为了发现问题。
不管是已知的问题,还是并未知的问题,都需要在解决问题之前,研究一下现状,看看事实上到底是哪里存在问题,存在什么样的问题,我要分析的问题到底是不是真的是一个问题。
我们研究现状、发现问题时,采用同一个逻辑和方法,可以让我们的分析思路更加清晰流畅,不会东一筢西一扫帚,无头苍蝇一般地一股脑扎到一个漩涡里。
三、分析思路
这里,给大家介绍两个常用而且好用的思路:
1)从整体到局部
2)从单变量到多变量
3.1 从整体到局部
从整体到局部,就是我们先看看大局是什么样的。
比如对于我们这个项目来说,我们的数据具有这样几个字段:订单号、顾客ID、订单时间、付款金额、商品ID、商品描述,由订单号
我们能得出交易数
,由顾客ID
我们能得出顾客数
,由付款金额
我们能得出销售额
,由商品ID
我们能得出销售量
。
那我们接下来就可以先从大局出发,看看宏观关键指标的情况如何,像销售额,顾客数,交易数,销售量这几个指标就是既直观又关键的指标。
当我们在分析这些指标的状态和趋势时,就会有一些发现,接着就可以进一步去研究局部的变量,层层深入地去挖掘问题背后的原因,这就是从整体到局部。
3.2 从单变量到多变量
从单变量到多变量,是指最开始分析的时候,我们先只看一个变量的情况。
当我们把所有的单个变量了解清楚后,再增加到两个变量之间的关系。
比如研究完销售额,顾客数,交易数,销售量这几个单个变量后,我想看看销售额和顾客数之间是什么样的关系等等。
有了分析思路了,我们还需要采用一些分析方法。
在对单变量分析的过程中,我们可以进一步采用的分析方法有:
1)统计值分析
2)分布分析
3)对比分析
四、统计值分析
统计值分析法就是用统计值探索数据的特征。
4.1 df.mode()
当我们想要求取 dataframe 中的众数时可以用 df.mode()
方法,所谓众数是指数据集中出现次数最多的数值,一个集合的众数可能只有一个也可能有多个。它的使用方法是:
df.mode()
import pandas as pd
# 建立一个 dataframe
df = pd.DataFrame({"A":[4,4,5,4],
"B":[5,5,3,2],
"C":[10,10,10,3]})
# 找到每一列的众数
df.mode()
可以看到我们得到了 df 中的每一列的众数。
此外还需要注意一点,当一个 Series 对象中含有多个众数的时候,mode()
会将所有的众数连带其索引一起返回,这个时候如果我们需要提取其中的某一个众数,就要用结果的索引去提取,请看下面这个例子:
import pandas as pd
s = pd.Series([1, 1, 1, 1, 3, 3, 3, 3, 5, 5, 5, 5])
x = s.mode()
print('x 是\n {}'.format(x))
print('第一个众数是 {}'.format(x[0]))
其实,不管 Series 对象中是包含多个众数,还是只包含一个众数,mode()
返回的结果都会是 索引 值
的格式,所以,即使是只有一个众数,当我们只想获取这个众数的值
时,就需要用到 mode()[0]
的方式,来将第一个众数的值提取出来,
4.2 df.std()
当我们想要求出 dataframe 中数值类型字段的标准差时可以用 df.std()
,使用方法是:
import pandas as pd
# 建立一个 dataframe
df = pd.DataFrame({"A": [10, 18, 11],
"B": [13, 15, 8],
"C": [9, 20, 3]})
# 计算每一列的标准差
df.std()
可以看到我们得到了 df 中的每一列的标准差。
小结一下:
导入所需要的包和数据集。
# 导入所需要的库
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
# 设置中文字体
plt.rcParams['font.family'] = ['Source Han Sans CN']
# 读取数据集
df = pd.read_csv('./工作/clean_data.csv')
# 取 2017 年和 2018 年的数据
df = df[(df['年份'] == 2017) | (df['年份'] == 2018)]
df.head(2)
现在我们已经有了一个通过第一步清理好的数据集 clean_data.csv,我们在这个数据集中根据日期字段生成了一个新的字段,即最后一个字段星期几,它代表的是付款日期是星期几,生成方法是:
df['星期几'] = df['订单时间'].dt.weekday
根据上面代码块中的方法,直接生成的数字是从 0 到 6 的,0表示星期一,6表示星期日,如果大家觉得理解不直观,还可以在后面+1
。
# 1. 计算'付款金额'字段的平均数
avg = df['付款金额'].mean()
print('付款金额的平均数是{}'.format(avg))
# 2. 计算'付款金额'字段的众数
most = df['付款金额'].mode()[0]
print('付款金额的众数是{}'.format(most))
# 3. 计算'付款金额'字段的标准差
st = df['付款金额'].std()
print('付款金额的标准差是{}'.format(st))
# 4. 计算'付款金额'字段的值域
ran = df['付款金额'].max() - df['付款金额'].min()
print('付款金额的值域是{}'.format(ran))
五、分布分析法
分布分析法是指以某个条件对数据进行分组,研究各组的频数或者占比的,并且了解了几个可以表现分布情况的可视化形式,我们还将项目中数据集的字段进行组合并且找到了合适的展现方式:
# 数一数'星期几'中每一类出现了几次,即'星期几'中每一类卖出了多少件商品
weekday_count = df['星期几'].value_counts()
# 求出商品的总件数
sum_count = df['星期几'].value_counts().sum()
# 用每一类包含的商品件数 / 商品的总件数,得出一个 list,其中每个元素代表各类销售量所占的比例
weekday_count_ratio = weekday_count / sum_count
# 画出饼图
weekday_count_ratio.plot(kind='pie', autopct='%.2f%%', figsize=(7, 7), label='')
plt.show()
通过前面的两种分析方法,我们已经能够提炼出一些我们关心并且很重要的指标了,有了指标之后,我们接下来要用到一个特别常用的分析方法:对比分析法,它可以让这些指标真正地反映出问题。
六、对比分析法
对比分析法可以帮我们更准确地发现问题,还了解了两种对比对象,和三种对比方式:
并且用项目数据的字段与对比对象和对比方式进行了各种组合得到了多种分析的维度:
# 分组聚合得到每年每月的付款金额的平均值
df_mean = df.groupby(['年份', '月份'])['付款金额'].mean()
# 将上面得到的多级索引 Series 对象转换成 DataFrame 对象
year_month_sales_mean = df_mean.unstack(level=0)
# 画出折线图
year_month_sales_mean.plot(kind='line', figsize=(10, 10))
# 设置x轴标签
plt.xlabel('月份')
# 设置y轴标签
plt.ylabel('消费金额')
# 设置图片标题
plt.title('2017-2018年每月平均消费金额线性对比图')
plt.show()
以上提到的三种分析方法,都离不开数据可视化,我们已经了解了可视化的工具 Matplotlib,这里我们再看一种也很好用的库:Seaborn
七、Seaborn 绘图
Seaborn 与 Matplotlib 的对比和它的优势:
下面来总结一下它的使用方法: 在使用时需要先导入 seaborn 包,即 import seaborn as sns
。
想要画柱形图时,可以先使用最简单的语法 sns.barplot(x, y, data)
,其中 : x
是作为横坐标的字段, y
是作为纵坐标的字段, data
是我们要作图的 dataframe 名称。
也可以在此基础之上添加更多的参数 sns.barplot(x, y, data, ci, hue, palette)
,其中: ci = None
可以将图形中的误差区间去掉,
hue
设置为某个字段就可以根据这个字段进行分类,
palette
可以设置图形的颜色风格。
做出 2017 年与 2018 年每个月的顾客数的柱状对比图。
# 导入 seaborn 库
import seaborn as sns
# 1. 分组聚合得到 2017 年各个月份的消费用户数和消费金额总和
# 先挑出数据集中年份是 2017 年的数据
df_2017 = df[df['年份'] == 2017]
# 分组聚合得到每个月中每个顾客的付款金额总和,并对年份求平均
df_2017_month_customer = df_2017.groupby(['月份','顾客ID']).agg({'付款金额':'sum', '年份':'mean'})
# 对上述结果进行行索引重置,转换成 dataframe
df_2017_month_customer = df_2017_month_customer.reset_index()
# 在 df_2017_month_customer 的基础上,分组聚合得到每个月的顾客数、付款金额总和,并对年份求平均
df_2017_month = df_2017_month_customer.groupby('月份').agg({'顾客ID':'count','付款金额':'sum', '年份':'mean'})
# 对上述结果进行行索引重置,转换成 dataframe
customers_payment_2017 = df_2017_month.reset_index()
# 2. 用和上面同样的步骤,分组聚合得到 2018 年各个月份的消费用户数和消费金额总和
# 先挑出数据集中年份是 2018 年的数据
df_2018 = df[df['年份'] == 2018]
# 分组聚合得到每个月中每个顾客的付款金额总和,并对年份求平均
df_2018_month_customer = df_2018.groupby(['月份','顾客ID']).agg({'付款金额':'sum', '年份':'mean'})
# 对上述结果进行行索引重置,转换成 dataframe
df_2018_month_customer = df_2018_month_customer.reset_index()
# 在 df_2018_month_customer 的基础上,分组聚合得到每个月的顾客数、付款金额总和,并对年份求平均
df_2018_month = df_2018_month_customer.groupby('月份').agg({'顾客ID':'count','付款金额':'sum', '年份':'mean'})
# 对上述结果进行行索引重置,转换成 dataframe
customers_payment_2018 = df_2018_month.reset_index()
# 用 append 将 2017 年和 2018 年数据整合到一个 dataframe 里
customers_payment_all = customers_payment_2017.append(customers_payment_2018).reset_index(drop=True)
# 设置画布大小
plt.rcParams['figure.figsize'] = 10, 6
# 作柱状图表示 2017-2018 年各个月份顾客数的趋势
sns.barplot(x='月份', y='顾客ID', data=customers_payment_all, palette='Blues', hue='年份')
# 设置 x 轴标签
plt.xlabel('月份')
# 设置 y 轴标签
plt.ylabel('顾客数')
# 设置图片标题
plt.title('2017-2018年每月顾客数柱状对比图')
如果在绘制 Seaborn 图形时想要更改颜色风格,可以将 palette='Blues'
设置成其他的参数,具体可以参考官方文档 palette颜色选择,常用的简单设置模式可以参考下图,比如设置成 palette='bright'
,颜色就会变成明亮色系的。
总结一下
标签:消费,df,整体,month,付款,2018,众数,2017,趋势 From: https://blog.51cto.com/u_15888443/5879773