在做专题分析或者业务汇报时,数据分析师不仅要取数分析,还要产出完整的PPT报告。报告做到什么程度,主要看领导风格。有的不在乎报告美观度,正确的数据、科学的分析、可落地的结论和建议、有逻辑的报告框架这4点达成了就差不多了,报告不丑就行。有的比较在乎报告美观度,除了以上4点,数据分析师还要在报告美化上下功夫。而报告美化的技巧之一就是使用高大上的图表来展示数据,本文就总结下一些高大上的图表的具体应用场景和Python绘图过程。
1. 地图
应用场景:
主要用于展示各国家数据、各省份数据、各城市数据等
Python绘图过程:
# 假设我们有一份2021年全国各省GDP的数据
df = pd.read_excel(r'.\2021年全国各省GDP.xlsx')
df.head()
# 绘制GDP地图
# 创建数据对
data_pair = [list(z) for z in zip(df['省份'], df['GDP(亿元)'])]
# 创建地图
c = (
Map()
.add(
series_name='GDP(亿元)',
data_pair=data_pair,
maptype='china',
)
.set_global_opts(
title_opts=opts.TitleOpts('2021年全国各省GDP'),
visualmap_opts=opts.VisualMapOpts(
min_=min(df['GDP(亿元)']),
max_=max(df['GDP(亿元)']),
range_text=['高', '低'],
pos_top='center',
is_piecewise=True,
pieces=[
{'min':0, 'max':10000, 'label':'0-1W', 'color':'#dae8ff'},
{'min':10000, 'max':50000, 'label':'1W-5W', 'color':'#b6d2ff'},
{'min':50000, 'max':80000, 'label':'5W-8W', 'color':'#aacbff'},
{'min':80000, 'max':100000, 'label':'8W-10W', 'color':'#6da6ff'},
{'min':100000, 'max':150000, 'label':'10W-15W', 'color':'#3d89ff'},
]
),
)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=True),
showLegendSymbol=False,
)
)
c.render("2021年全国各省GDP地图.html") #保存到本地
c.render_notebook() #在notebook中显示
源数据:
图表:
2. 桑基图
应用场景:
主要用于展示页面流转数据、用户迁移数据、构成数据等
Python绘图过程:
# 假设我们有一份用户等级迁移数据
customer_level = pd.DataFrame({
'cst_grp_from': ['1月_M0','1月_M0','1月_M0','1月_M1','1月_M1','1月_M1','1月_M1','1月_M1','1月_M2','1月_M2','1月_M2','1月_M2','1月_M2','1月_M2','1月_M3','1月_M3','1月_M3','1月_M3','1月_M3','1月_M3'],
'cst_grp_to': ['2月_M0','2月_M1','2月_M2','2月_M0','2月_M1','2月_M2','2月_M3','2月_M4','2月_M0','2月_M1','2月_M2','2月_M3','2月_M4','2月_M5','2月_M0','2月_M1','2月_M2','2月_M3','2月_M4','2月_M5'],
'cnt': np.random.randint(10000, 50000, 20)
})
customer_level.head()
# 绘制用户等级迁移桑基图
# 创建nodes
node_contents = sorted(list(set(customer_level['cst_grp_from'].tolist() + customer_level['cst_grp_to'].tolist())))
nodes = [{'name': x} for x in node_contents]
# 创建links
links = [{'source': x, 'target': y, 'value': z} for x, y, z in zip(customer_level['cst_grp_from'], customer_level['cst_grp_to'], customer_level['cnt'])]
links
# 创建桑基图
c = (
Sankey()
.add(
series_name='数量',
nodes=nodes,
links=links,
linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.4, color="source"),
label_opts=opts.LabelOpts(position="right"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="用户等级迁移"))
)
c.render("用户等级迁移桑基图.html") #保存到本地
c.render_notebook() #在notebook中显示
源数据:
图表:
3. 漏斗图
应用场景:
主要用于展示转化数据等
Python绘图过程:
# 假设我们有一份按月的贷款转化数据
df = pd.DataFrame({
'月份': ['2022-10', '2022-11', '2022-12'],
'注册': np.random.randint(low=5000, high=6000, size=3),
'申请': np.random.randint(low=4000, high=5000, size=3),
'通过': np.random.randint(low=3000, high=4000, size=3),
'放款': np.random.randint(low=2000, high=3000, size=3),
})
df
# 绘制12月的贷款转化漏斗图
data = df[df['月份']=='2022-12'].drop('月份', axis=1)
data_pair = [list(z) for z in zip(list(data.columns), list(map(int, list(data.iloc[0, :].values))))]
c = (
Funnel()
.add(
series_name="人数",
data_pair=data_pair,
gap=2,
tooltip_opts=opts.TooltipOpts(formatter="{a} <br/>{b} : {c}"),
label_opts=opts.LabelOpts(is_show=True, position="inside"),
itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1),
)
.set_global_opts(title_opts=opts.TitleOpts(title="12月贷款转化漏斗"))
)
c.render("12月的贷款转化漏斗.html") #保存到本地
c.render_notebook() #在notebook中显示
源数据:
图表:
4. 词云图
应用场景:
主要用于展示商品评论数据、新闻话题热度数据等
Python绘图过程:
# 假设我们有一份苹果iPhone13的用户评价数据
df = pd.DataFrame({
'评价': ['外观', '续航', '服务', '清晰度', '手感', '散热', '系统', '游戏', '重量', '音效', '拍照'],
'数量': np.random.randint(low=10000, high=1000000, size=11)
})
df.head()
# 绘制评价数据的词云图
words = list(zip(df['评价'], df['数量']))
c = (
WordCloud()
.add(
series_name="数量",
data_pair=words,
word_size_range=[10, 100],
shape=SymbolType.DIAMOND
)
.set_global_opts(title_opts=opts.TitleOpts(title="iPhone13评价"))
)
c.render("iPhone13评价词云图.html") #保存到本地
c.render_notebook() #在notebook中显示
源数据:
图表:
5. 热力图
应用场景:
主要用于展示相关度数据、同级比较数据等
Python绘图过程:
# 假设我们有一份产品销售数据
df = pd.DataFrame({
'日期': pd.date_range(start='2022-12-01', end='2022-12-31'),
'产品A': np.random.randint(low=100, high=1000, size=31),
'产品B': np.random.randint(low=100, high=1000, size=31),
'产品C': np.random.randint(low=100, high=1000, size=31),
'产品D': np.random.randint(low=100, high=1000, size=31),
'产品E': np.random.randint(low=100, high=1000, size=31),
})
df.head()
# 计算产品之间的相关系数
corr = df.corr()
# 绘制相关系数热力图
plt.figure(figsize=(8, 6), dpi=100)
heatmap = sns.heatmap(
data=corr,
vmin=-1,
vmax=1,
cmap=sns.diverging_palette(0, 230, 90, 60, as_cmap=True), #网上找的一个比较清晰好看的配色方案
annot=True,
fmt='.2f',
annot_kws={'size':10},
linewidths=2,
cbar_kws={'shrink': .8},
square=True,
mask=np.triu(np.ones_like(corr, dtype=bool)), #只显示对脚线下面部分图
)
heatmap_fig = heatmap.get_figure()
heatmap_fig.savefig('产品相关系数热力图.png')
源数据:
图表:
6. 箱线图
应用场景:
主要用于展示数据分布,比单一的平均值好
Python绘图过程:
# 假设我们有某3家公司的员工工资数据
fk = Faker(locale='zh-CN') #用于构造虚假数据
df = pd.DataFrame({
'公司': np.random.choice(['华为', '腾讯', '阿里'], size=100),
'姓名': [fk.name() for i in range(100)],
'工资': np.random.randint(low=5000, high=50000, size=100)
})
df.head()
# 绘制3家公司的员工工资的箱线图
box = sns.boxplot(data=df, x='公司', y='工资', palette='Set2')
box_fig = box.get_figure()
box_fig.savefig('员工工资箱线图.png')
源数据:
图表:
7. 其他图表
还有一些在特定场景下很适合的图表,比如帕累托图(柱线组合图)、瀑布图、字母饼图、复合条饼图、雷达图、旭日图等,这些用Excel就能很容易画出来,不需要借助诸如Python等工具,如下图所示,这里就不一一展示了。
题外话
话说回来,现在一些大厂已经开始反内卷了,反对在PPT上耗费时间,只产出了一点有价值的结论,却花费了更多的时间在展示它上面,不如将时间投入到分析和挖掘上,获得更多有价值的结论和建议,用PPT还不如用Excel来的快速高效。不过,具体怎么做,可能还要看领导看场景。