当前位置: 首页 > 科技观察

探索和可视化Python数据集的实践指南

时间:2023-03-15 22:53:54 科技观察

在今天的文章中,您将学习:如何组合和组织数据,如何探索和分析数据,如何创建漂亮的图表以可视化您的发现适用对象:经常工作数据人员对Python和Pandas有基本了解的人员场景回顾:您的任务是提高销售团队的绩效。在我们的假设场景中,潜在客户有相当自发的需求。发生这种情况时,您的销售团队会在系统中放置一个订单线索。然后,您的代表会尝试安排一次会议,该会议将在注意到订单线索时举行。有时在前面,有时在后面。您的代表有一个支出预算,其中包括会议和餐饮费用。销售代表花费他们的成本并将发票交给会计团队进行处理。在潜在客户决定是否接受您的报价后,销售代表会跟踪订单线索是否转化为销售。对于分析,您可以访问以下三个数据源:订单线索(包含所有订单线索和转换信息)销售团队(包括公司和负责的销售代表)发票(提供有关发票和参与者的信息)导入和安装:需要安装标准库,同时,使用命令!pipinstallseaborn在您的笔记本上安装seaborn下载数据:您可以按照上周的说明下载并合并数据,或者您可以从此处下载文件并将其加载到您的笔记本中。sales_team数据表前两行order_leads数据表前两行invoices数据表前两行开始探索总转化率发展:转化率随时间变化2017年初事情似乎走下坡路。与首席销售官核实后发现,当时有竞争对手进入市场。很高兴知道,但我们现在对此无能为力。_=order_leads.set_index(pd.DatetimeIndex(order_leads.Date)).groupby(pd.Grouper(freq='D'))['Converted'].mean()ax=_.rolling(60).mean().plot(figsize=(20,7),title='ConversionRateOverTime')vals=ax.get_yticks()ax.set_yticklabels(['{:,.0f}%'.format(x*100)forxinvals])sns。despine()我们使用下划线_作为临时变量。我通常对以后不使用的一次性变量执行此操作。我们在order_leads.Date上使用了pd.DateTimeIndex并将结果设置为索引,这样我们就可以使用pd.Grouped(freq='D')按天对数据进行分组。或者,您可以将频率更改为W、M、Q或Y(每周、每月、每季度或每年)我们计算每天“转换”的平均值,这将给出当天订单的转换率。我们使用.roll(60)和.mean()来获得60天的滚动平均值。然后我们格式化yticklables以便它们显示百分号。销售代表的转化率:销售代表之间似乎存在很大差异。让我们再调查一下。就使用的功能而言,这里没有太多新功能。但请注意我们如何使用sns.distplot将数据绘制到轴上。如果我们回顾一下sales_team数据,我们会记得并非所有销售代表都拥有相同数量的客户,这肯定会产生影响!让我们检查。按分配的客户数量划分的转化率我们可以看到,转化率数字似乎与分配给销售代表的客户数量成反比。那些较低的转化率是有道理的。毕竟,销售代表拥有的帐户越多,他在每个帐户上花费的时间就越少。在这里,我们首先创建一个辅助函数,将一条垂直线映射到每个子图,并用数据的均值和标准差对该线进行注释。然后我们设置一些seaborn绘图默认值,例如较大的font_scale和whitegrid设置为样式。MealImpact:MealData看起来我们已经固定了用餐的日期和时间,让我们快速看一下时间分布:invoices['DateofMeal']=pd.to_datetime(invoices['DateofMeal'])invoices['用餐日期']。dt.time.value_counts().sort_index()输出:07:00:00553608:00:00561309:00:00547312:00:00561413:00:00541214:00:00563320:00:00552821:00:00553422:00:005647摘要:发票['TypeofMeal']=pd.cut(invoices['DateofMeal'].dt.hour,bins=[0,10,15,24],labels=['breakfast','lunch','dinner'])请注意这里我们如何使用pd.cut将类别分配给数字数据,这是有道理的,因为毕竟早餐是从8点还是9点开始并不重要。另外,请注意我们如何使用.dt.hour,我们只能这样做,因为我们将invoices['DateofMeal']转换为以前的日期时间。.dt就是所谓的accessor,这里有cat、str、dt三个。如果您的数据类型正确,您可以使用这些访问器及其方法进行直接操作(计算效率高且简洁)。不幸的是,invoices['Participants']是一个字符串,我们必须先将其转换为合法的JSON,这样我们才能提取参与者的数量。defreplace(x):returnx.replace("\n",",").replace("''","','").replace("'",'"')发票['参与者']=invoices['Participants'].apply(lambdax:replace(x))invoices['NumberParticipants']=invoices['Participants'].apply(lambdax:len(json.loads(x)))现在,我们合并数据。为此,我们首先将公司ID上的所有发票左连接到order_leads。但是,合并数据会导致所有餐点都被连接到所有订单。还有古老的餐点和最近的订单。为了缓解这种情况,我们计算了吃饭和点餐的时间差,并且只考虑了订单前后五天的餐点。还有一些订单分配了多餐。当有两个订单同时吃两顿饭时会出现这种情况时间。然后,两顿饭将被分配给两个订单线索。为了删除这些重复项,我们只需要让这顿饭最接近该订单。结合数据的部分我创建了一个绘图栏功能,其中已经包含了一些样式。Plotting通过这个函数可以让目标视觉检查更快。我们将在一秒钟内使用它。膳食类型的影响:orders_with_meals['TypeofMeal'].fillna('nomeal',inplace=True)_=orders_with_meals.groupby('TypeofMeal').agg({'Converted':np.mean})plot_bars(_,x_col='TypeofMeal',y_col='Converted')哇!与用餐相关的订单和与用餐无关的订单之间的转化率差异非常大。尽管如此,午餐的转化率略低于晚餐或早餐。时间的影响(即饭前或饭后进食):_=orders_with_meals.groupby(['Daysofmealbeforeorder']).agg({'Converted':np.mean})plot_bars(data=_,x_col='Daysofmealbeforeorder',y_col='Converted')“订单前就餐天数”的负数表示餐点是在输入订单线索之后制作的。我们可以看到,如果用餐发生在订单线索进来之前,似乎对转化率有积极影响。订单的先验知识似乎让我们的销售代表在这里占据优势。将它们全部结合起来:现在,我们将使用热图同时可视化数据的多个维度。为此,首先创建一个辅助函数。然后,我们与一些最终数据争论,以额外考虑膳食价格与订单价值,并将交货时间分配到“订购前”、“订购前”、“订购后”,而不是从负4天到正4天,因为这是有点繁琐的解释。运行以下代码片段将生成多维热图。draw_heatmap(data=data,outer_row='TimingofMeal',outer_col='TypeofMeal',inner_row='MealPrice/OrderValue',inner_col='NumberParticipants',values='Converted')热图可以在一张图片中可视化四个维度Theheatmap当然是美丽的,虽然一开始有点难以阅读。那么让我们来看看吧。图表总结了4个不同维度的影响:用餐时间:点餐后、点餐前后、点餐前(行外)用餐类型:早餐、晚餐、午餐(列外)菜单价格:最低价、最低价、比例价,MaximumPrice,MaximumPrice(InnerRow)Numberofattendees:1,2,3,4,5(InnerColumn)当然,图表底部的颜色似乎更深/更高,这表明:Conversion在点餐前用餐时价格会下降只有一名参与者时,更高的晚餐转化率似乎更高与订单价值相比,更昂贵的餐点似乎对转化率有积极影响结果:销售代表的帐户不超过9个(转化率会迅速下降)确保每个订单线索都伴随着会议/用餐(因为这会使转化率加倍只有一名员工访问时晚餐效果最好)你的代表应该支付大约8%到10%时间是关键,理想情况下您的销售代表应该知道尽快达成协议。点此查看代码:GitHubRepo/JupyterNotebookNotesasaheatmap:要解决可能出现的格式错误,可以先卸载(然后必须在终端中执行),然后运行以下命令将matplotlib降级到版本3.1.0:!pipinstallmatplotlib==3.1.0