磐创AI分享
作者 | Pathairush Seeda 编译 | VK 来源 | Towards Data Science
你的日常生活数据分析
作为一名数据科学家/分析师,你的工作是制作一份包含许多商业决策见解的报告。报表可以由几个有用的工具(如microsoftexcel、SAP)生成,也可以使用编程语言(如SAS、R或Python)进行定制。结果可以通过内部电子邮件发送给其他人,也可以通过仪表板发布。
和其他人一样,我也是一名数据分析师,在日常生活中使用python制作报告或演示文稿。我通常的任务是在2-3小时内进行分析,并提交给管理团队。
为了得到我想要的结果,我必须启动我的Jupiter笔记本内核并快速编写代码来生成数字。在那之后,我可以把结果放在微软的PowerPoint上,并在一天结束前附上一些基本的脚注,然后把它们发给我的主管,让他们演示并做出重要的决定。
一个痛点是,由于时间限制,我必须消化信息,编写代码生成结果,并将其以一种漂亮的格式放入Microsoft PowerPoint中呈现。
不幸的是,我使用的编程语言可能不适合管理团队的阅读,例如,在数字中添加逗号或不使用科学符号来显示大数字。
如果你提交报告时没有注意到这些方面,管理团队可能会对你的报告有很多抱怨,有时,他们会把报告扔到垃圾堆里,一眼也不看。那会让你非常恼火,因为你需要时间和精力。
要解决这个问题,你可以将编程语言的结果放入microsoftexcel,然后根据需要手动更改格式。Excel是一个很好的工具。不好的地方是你必须手工做。如果我们能在编程过程中实现自动化呢。那太好了,不是吗?
As-is
下面让我们看一下我为这个示例生成的数据帧。这是公司需要的收入额。如你所见,这是pandas数据帧返回的默认结果。没有任何配置。
我经常从我的主管或首席执行官那里得到的一个评论是。
你能让它更易读,更容易比较吗?”
解决办法可能是把这个数字除以一百万,然后把单位放在表的上方。你要记住的一点是,在你的演讲中应该保持一致。如果有100张表需要复制呢?很难,对吧。
我发现你可以用编程的方式解决它。我花了很多时间从网上收集以下代码片段。非常感谢Stack overflow!
我认为和你们分享这些会让任何像我一样发现这些问题的人受益。你会减少花在这上面的时间,然后把注意力放在内容的有效性上。
如何改进?
可读格式
我收到的最常见的评论是,你能把数字四舍五入,并使用符号,如M表示百万或K表示千?这将使你的表看起来更好,并减少不必要的信息。很多时候,我们不需要这么精确。
下面是一个函数,用于将数据框中的数字转换为所需的格式。
代码语言:javascript复制def human_readable_format(value, pos=None):
'''
将数据帧中的数字转换为可读格式
`pos` 参数与matplotlib ticker格式化程序一起使用。
'''
assign_unit = 0
units = ['', 'K', 'M', 'B']
while value >= 1_000:
value /= 1_000
assign_unit = 1
return f"{value:.2f} {units[assign_unit]}"
这是你将得到的结果。读起来容易多了,对吧?
此函数的缺点是将数字转换为字符串,这意味着你将失去数据帧的排序能力。这个问题可以通过先排序所需的值,然后再应用它们来解决。
你可以将结果保存到excel或CSV文件,并将其放入PowerPoint中。我的方法通常是截图,然后直接放到演示文稿中。
这个代码片段节省了我大量的时间来重新生成多个表,因为当你从你的主管那里得到注释时,你必须刷新所有的表。假设演示文稿中有100个表。对于那些一个一个手工修改的人来说,这是一场噩梦。
同样,格式化后,我们也可以在matplotlib图中使用它。如果你使用pandas库进行数据分析,我认为matplotlib将是你绘制图形的首选。
你可以使用与表格类似的可读格式设置此图形的y轴
代码语言:javascript复制import matplotlib.ticker as mticker
import matplotlib.pyplot as plt
fig , ax = plt.subplots();
df['value_9'].plot(ax=ax);
ax.yaxis.set_major_formatter(
mticker.FuncFormatter(human_readable_format)
)
看起来更有说服力。
突出显示单元格
有时你需要指出表中的重要数字、趋势或信息。你脑子里有一个逻辑规则,比如用收款金额的最大值突出显示月份。数字可以根据数据中的底层事务而变化。如果你想动态地突出显示它,就必须以编程的方式进行。
这是我用来使我的表格看起来更好的第二件事。它能帮助你传达信息,提高你讲故事的能力。从其余部分中强调什么是重要的。
代码语言:javascript复制def highlight_max_value(series):
# 获取序列中每个值的真或假状态
boolean_mask = series == series.max()
# 当布尔掩码为真时,返回颜色为橙色
res = [f"color : orange" if max_val else '' for max_val in boolean_mask]
return res
df.style.apply(highlight_max_value)
有时,你会更容易发现数据内部的潜在趋势。如果不对大量数据进行适当的重新排列,你是不可能从这些数据中发现这些模式的
少就是多
最后一个不是向数据框/图中添加一些有趣的内容,而是将其删除。有时少就是多。数据帧或图形中的组件越少,消息传递就越好。读者或接受者只能吸收他们必须吸收的东西。
你可以在这方面改变很多事情,例如。
代码语言:javascript复制# 准备数据集
revenue = df[['value_9']].copy()
revenue['pct'] = revenue['value_9'] * 100 / revenue['value_9'].sum()
revenue = revenue.sort_values('pct', ascending=False).reset_index(drop=True)
revenue['cumsum_pct'] = revenue['pct'].cumsum()
import matplotlib.ticker as mticker
import matplotlib.pyplot as plt
import seaborn as sns
# 绘制条形图以显示收入金额
sns.set_context('talk')
# 放大图形的字体大小
fig , ax = plt.subplots(figsize=(9,6));
revenue['value_9'].plot.bar(ax=ax);
ax.yaxis.set_major_formatter(mticker.FuncFormatter(human_readable_format))
plt.title('Revenue generated');
# 以百分比绘制累计收入
# 展示前三位客户的影响
ax2 = plt.twinx(ax)
revenue['cumsum_pct'].plot(ax=ax2, color='orange');
ax2.yaxis.set_major_formatter(mticker.PercentFormatter())
sns.despine();
通过排列数据并向其中添加一些信息,可以使用更直观的图表进行决策。例如,我们知道只有前三位客户占我们收入的80%以上。因此,让他们保持良好的关系比其他任何事情都有必要。
摘要
在一个新的时代,数据分析员使用编程语言来生成报告或表示。它减少了很多手动任务的时间,但是还有更复杂的事情要处理,如上所述。这是一种权衡。
我想我今天和你们分享的技巧和窍门在某种程度上会有所帮助。
本文中的所有代码都可以在这里找到:https://colab.research.google.com/drive/1AZQ3kBGmpoherJxOP8yIwUZzyid-1i70?usp=sharing