数据分析是数据科学的先决条件。原因如下。
让数据科学家更深入地了解数据分析。
Jefferson Santos 在 Unsplash 上拍摄的照片
目录
- 介绍
- 数据分析
- 数据科学
- 为什么是先决条件?
- 摘要
- 参考
介绍
随着劳动力市场格局的变化,许多人在被解雇后要么改变职业,要么申请不同的公司。其中一些人是希望成为数据科学家的数据分析师,或者一些人是正在改变公司的数据科学家,他们需要花一些时间学习或更新他们的数据分析知识。
你可以假设数据分析已经在数据科学课程中教授了,但根据我的经验,我已经看到了直接跳到数据科学,或者更具体地说,机器学习算法。就像现在很容易假设数据科学家已经知道数据分析一样,一些大学或在线课程也是如此,它们直接进入了常见的机器学习概念。这种假设可能会导致一些数据科学家在数据分析中苦苦挣扎。虽然一开始看起来可能更简单,但数据分析是数据科学的基础。您必须了解您的业务、数据和指标。这些信息最终会为您的统计方法和数据科学模型提供信息。
下面,我将总结数据分析和数据科学,并举例说明为什么数据分析对数据科学如此重要。
数据分析
数据分析通常被称为商业智能、BI 开发或产品分析。这个领域几乎存在于每一家科技企业,也存在于大多数其他企业。在公司实践数据分析是至关重要的,以确保公司财务、客户数据和未来机器学习模型可以应用的改进领域的可见性。可以使用以下工具找到数据分析:
Tableau,Looker,Google Data Studio,SQL,Excel,有时候还有 Python。
数据分析的例子有:
- 寻找产品的顶级用户
- 收集这些用户的关键人口统计数据
- 产品的汇总指标
- 发现用户行为的季节性趋势
- 突出财务异常
从上面的例子可以看出,所有这些都可以以某种方式应用于数据科学过程。这些示例也可以作为输入到模型中的特征或属性。
数据科学
数据科学作为许多人的职业道路越来越受欢迎。从本质上来说,这是一个使用编程语言和统计学来实现自动化的职业。它的基础是基于数据分析和数学。数据科学家可能会用到的常用工具有:
数据分析、SQL、Tableau、Python、R、SAS、Terminal、Jupyter Notebook、AWS、GCP、sklearn 和 TensorFlow 库(以及更多)。
数据科学中的整个过程有几个部分可以包括数据分析,例如数据形成/创建、数据清理、探索性数据分析(尤其是这一部分)、特征工程以及对建议/预测/结果的解释。
数据科学的例子可以是:
- 客户行为聚类
- 服装风格的分类
- 人脸图像检测和分类
- 一个利用自然语言处理(NLP)的聊天机器人
- 欺诈的自动异常检测
这些示例中的大多数(如果不是全部的话)都基于第一手数据分析,以及数据科学过程之后的数据分析。
为什么是 Preqreuisite?
接下来,我们将探讨数据分析是数据科学先决条件的原因。下面我将讨论的主要原因列举出来。
- 商业知识
- 车型特点
- 机器学习结果的解释
- 业务知识
—为了成为一名成功的数据科学家,您需要对您的业务了如指掌。你可以整天高精度地运行算法,但如果你不是在回答一个商业问题,那么你就错过了数据的要点。了解你的企业及其各自产品的主要功能是非常重要的。在你的新工作中运行你的第一个算法可能需要几周时间,因为你需要了解你的数据表、你公司的问题、自动化的可能重点,以及总体而言,数据科学模型的实施。
根据您的业务,一些监督模型可能比非监督模型更适用,反之亦然。例如,利用聚类模型将客户分组到不同的箱中,以便您可以向他们做不同的广告。然而,这个问题的基础不是数据科学,而是数据分析——这意味着您需要开发与客户及其人口统计相关的指标。有时,这些指标在公司中并不容易找到,通常情况下,您需要提出自己的指标,并轻松地分析数据。这种创建将来自 SQL 查询,包括子查询、公共表表达式以及更多有助于在 SQL 环境中立即开发的函数、子分组和聚合。这部分引出了我下面的下一个观点。
- 模型特征
—再说一次,创建数据科学模型并不是从一个神奇的向导开始,向导会为您提供一个开发、清理和组织有序的数据集。您将不得不参考 API、参考业务、与利益相关者以及数据和软件工程师交流,以获得对输入到您的模型中的特性的最佳理解。
通过数据分析技能,您可以为您的机器学习模型开发最有效和最有用的数据集。在数据分析中,聚合和粒度至关重要,因此根据您将要使用的数据科学模型以及您试图解决的问题,数据分析可以帮助您将数据组织到具有正确和相关值的行中。
- 解释机器学习结果
这一点可能会让一些人感到惊讶,但它与数据科学模型或项目的开始过程一样重要,即机器学习对数据科学结果的解释(预测和建议)。在合成数据、清理、训练和评估数据之后,您必须与利益相关者共享您的结果。
在数据科学流程的这一步中,数据分析技能至关重要,因为您需要执行不同的任务,而这些任务并不直接属于数据科学。这些任务包括:
* grouping model results from SQL querying* displaying visual metrics of your model’s accuracy * utilizing tools like Tableau or Looker to visualize* presenting in front of stakeholders* commutating data science model success to non-technical users
摘要
通过阅读这篇文章,我希望您现在已经理解了数据分析对数据科学的重要性,以及它最终如何成为数据科学的先决条件。为了开发您的数据并传达您的结果,作为一名数据科学家,数据分析是必须学习和实践的。
作为一名数据科学家,并不是每天都要使用网格搜索方法优化参数,但这可能需要从数据分析工具和函数中获取数据集。我做的三个要点是:业务知识,模型特征,机器学习结果解读。这些只是在您从事数据科学领域之前或期间学习数据分析的众多原因中的一部分。
我希望你觉得这篇文章既有趣又有用。感谢您的阅读,欢迎在下方评论!
参考
[1]照片由 Jefferson Santos 在 Unsplash 上拍摄,(2017)
数据分析变得简单:Jupyter 笔记本的 text 2 代码
运行中的插件示例
灵感:GPT-3
2020 年 6 月,OpenAI 推出了他们的新模型 GPT-3,它不仅具有未来的 NLP(自然语言处理)能力,还能够生成反应代码并简化命令行命令。
观看这些演示对我们来说是一个巨大的鼓舞,我们意识到在进行数据分析时,很多时候,我们经常忘记不常用的熊猫或 plotly 语法,需要搜索它们。从 StackOverflow 复制代码需要相应地修改变量和列名。我们开始探索能够为人工查询生成现成代码的东西,比如:
在数据帧 df 的热图中显示降雨量和湿度
或者
按州对 df 进行分组,并获取用户年龄的平均值和最大值
Snippets 是我们使用了一段时间的一个扩展,但是在使用了一定数量的 Snippets 之后,UI 变得不直观了。虽然静态模板很好,但是我们需要更多的东西来处理用例的动态特性。
代码段扩展示例
为此,我们决定尝试建造一个新的 jupyter 扩展。不幸的是,我们没有 GPT-3 的测试版,所以使用那个神奇的模型不是一个选项。
简化任务:
我们希望构建一些可以在我们的桌面上运行的东西(使用 GPU)。我们最初试图将该问题视为聊天机器人问题,并从 Rasa 开始,但由于缺乏适当的训练数据,很快就停止了。
由于未能建立一个真正的生成模型,我们决定开发一个监督模型,该模型可以为培训管道中定义的用例工作,并且可以很容易地扩展。受 chatbot 管道的启发,我们决定将问题简化为以下几个部分:
- 生成/收集培训数据
- 意图匹配:用户想要做什么?
- NER(命名实体识别):识别句子中的变量(实体)
- 填充模板:使用固定模板中提取的实体来生成代码
- 在 jupyter 扩展中换行
生成训练数据:
为了模拟最终“用户”将向系统查询什么,我们从一些我们认为自己用来描述英语命令的格式开始。例如:
从 v a r n a m e ∗ ∗ 开始,在 y 轴上显示 ∗ ∗ varname** 开始,在 y 轴上显示 ** varname∗∗开始,在y轴上显示∗∗colname ,在 x 轴上显示 $colname
然后,我们通过使用一个非常简单的生成器替换 c o l n a m e 和 colname 和 colname和varname 来生成变体,以获得训练集中的变体。
一些示例(intent_id、ner 格式)
意图匹配:
在生成数据之后,该数据被映射为特定意图的唯一“intent_id ”,然后我们使用通用语句编码器来获得用户查询的嵌入,并找到与我们预定义的意图查询(生成的数据)的余弦相似性。Universal Sentence Encoder
类似于生成嵌入的word2vec
,但是是针对句子而不是单词。
意图匹配的示例
NER(命名实体识别):
然后,可以使用相同的生成数据来训练定制的实体识别模型,该模型可以检测列、变量、库名称。为此,我们探索了 HuggingFace 模型,但最终使用 Spacy 来训练一个定制模型,主要是因为 HuggingFace 模型是基于变压器的模型,与 Spacy 相比有点重。
实体识别示例
填充模板:
一旦实体被正确识别并且意图被正确匹配,填充模板就非常容易。例如,“显示 df 中的 5 行”查询将产生两个实体:一个变量和一个数字。这方面的模板代码写起来很简单。
df.head()或 df.head(5)
与 Jupyter 集成:
令人惊讶的是,这一个被证明是最复杂的,因为为 Jupyter 编写如此复杂的扩展有点棘手,而且几乎没有可用的文档或示例(与 HuggingFace 或 Spacy 等其他库相比)。经过一些尝试和错误,以及对现有扩展的一些复制粘贴,我们终于能够将所有东西打包成一个 python 包,可以通过pip install
安装
我们必须创建一个前端和一个服务器扩展,当jupyter notebook
被触发时,它就会被加载。前端将查询发送到服务器以获取生成的模板代码,然后将其插入到单元中并执行它。
演示:
演示视频由 Sanyam Bhutani 在 Chai Time 数据科学数据集上制作。
支持的命令的简短视频
局限性:
像许多 ML 模型一样,有时意图匹配和 NER 失败得很惨,即使意图对人眼来说是显而易见的。我们可以尝试改善这种情况的一些领域是:
- 收集/生成更高质量的英语句子训练数据。是一种我们还没有尝试过的技术,可以产生不同的方式来说同一个句子。
- 收集真实世界的变量名、库名,而不是随机生成它们。
- 尝试用基于变压器的模型 NER。
- 有了足够的数据,训练一个语言模型,像 GPT-3 那样直接做英语->代码,而不是在流水线中有单独的阶段。
那都是乡亲们!
我希望你喜欢读这篇文章。这个扩展的全部代码已经准备好安装在本地 GPU 机器上,在这里可以找到。
Deepak 和我一起花了几个周末黑了这个。这些代码还不能用于生产,但是已经足够好了,人们可以自己修改和使用。我们希望听到反馈和改进意见。😃
AppleWatch 锻炼的数据分析
你是一个用 Apple Watch 跟踪锻炼的运动和数据极客吗?那么现在可能是时候了解更多关于你在过去几年中的表现发展了。读完这篇文章后,你会知道如何深入了解你的锻炼和运动模式。如果这还不够,深入数据分析可能是一个不错的第一个项目:你将学习如何从你的跟踪设备(在这种情况下是 Apple watch)中提取数据,如何清理和转换数据集,最后用 Google Data Studio 可视化它。我们开始吧!
你的 Apple Watch 锻炼数据分析。
这篇文章分为三部分。首先,你 iPhone 上的 Apple Watch 数据需要导出。其次,在编程语言 Python 的帮助下,读取、转换和清理接收到的 XML 文件。结果是一个完美的 CSV 文件,可以插入到谷歌数据工作室。如何做到这一点我们将在第三部分解释。
我们使用的工具
正如已经提到的,我们正在使用 Python 和它惊人的开源库。首先,我们使用 Jupyter Notebook,这是一个用于实时编码的开源应用程序,它允许我们讲述一个故事,并使代码可复制。要启动和运行 python,推荐使用 Anaconda。这里的描述了如何设置和运行。对于数据可视化,您可以使用任何想要的工具。根据你的喜好,谷歌数据工作室的替代品是 Tableau、Grafana 或任何数据可视化工具。
用于数据分析的工具
1.从您的 Apple 设备导出数据
首先,我们需要知道你的 Apple Watch 收集的所有数据在哪里可以找到。因此,从主屏幕打开健康应用程序。在右上角,您可以访问您的个人资料。滚动到底部,导出所有数据。不要担心,这可能需要一段时间。
从 Apple 导出您的健康记录。
您将得到一个 XML 文件。XML 代表可扩展标记语言,这意味着您的数据以非预定义的结构和纯文本格式存储。因此,如果您想看一下文件的内容,可以用标准的文本编辑器打开它。XML 在互联网上被广泛用于数据传输。下一步,我们用 python 获取这个文件并处理数据集。
2.使用 Python 进行数据转换和清理
在导出你所有锻炼的 XML 文件后,它现在就在你的笔记本电脑上。我们做的第一件事是将文件加载到 Jupyter 笔记本中(您应该已经安装了 Python 和 Jupyter 笔记本。如果没有,试试 Anaconda,或者看看如何设置你的数据科学环境 mit Docker。)
为了读取 XML 文件,加载了包 xmltodict,并使用它来读取我们的导出。在这种情况下,我们一方面将手表的所有“记录”数据保存在“记录列表”中,另一方面将实际锻炼数据保存在“锻炼列表”中。虽然我们将只处理锻炼数据,但知道还有更多可用的数据仍然是有用的,您可以立即开始处理这些数据。
#Reading the file and converting it as a dict. import pandas as pd
import xmltodictinput_path = '/Users/apple_health_export/export.xml'
with open(input_path, 'r') as xml_file:
input_data = xmltodict.parse(xml_file.read())#Records list for general health data & imported as Pandas Data Frame
records_list = input_data['HealthData']['Record']
df_records = pd.DataFrame(records_list)#Workout list for workout data
workouts_list = input_data['HealthData']['Workout']
df_workouts = pd.DataFrame(workouts_list)
接下来,一些列必须转换成不同的格式。一方面,持续时间、距离和消耗的能量应为数字,日期格式应用于日期
#Convert selected columns to numeric so we can do calcuations
# convert just columns "..." and "..."
df_workouts[["[@duration](http://twitter.com/duration)", "[@totalDistance](http://twitter.com/totalDistance)", "[@totalEnergyBurned](http://twitter.com/totalEnergyBurned)"]] = df_workouts[["[@duration](http://twitter.com/duration)", "[@totalDistance](http://twitter.com/totalDistance)", "[@totalEnergyBurned](http://twitter.com/totalEnergyBurned)"]].apply(pd.to_numeric)
df_workouts.dtypes#convert dates to actual datetime
format = '%Y-%m-%d %H:%M:%S %z'df_workouts['[@creationDate](http://twitter.com/creationDate)'] = pd.to_datetime(df_workouts['[@creationDate](http://twitter.com/creationDate)'],format=format)df_workouts['[@startDate](http://twitter.com/startDate)'] = pd.to_datetime(df_workouts['[@startDate](http://twitter.com/startDate)'], format=format)df_workouts['[@endDate](http://twitter.com/endDate)'] = pd.to_datetime(df_workouts['[@endDate](http://twitter.com/endDate)'],format=format)df_workouts.dtypes
对于我们的锻炼分析,我们不需要所有的列。以游泳为例,我们在最后一栏中分解为 100 米组。如果您想了解详细信息,这可能会很有用,但出于我们的目的,我们只选择前 12 列,并且只保留锻炼活动类型游泳、跑步和骑自行车。
#drop unnecessary columns (all rows and column 1 to 12)
df_workouts = df_workouts.iloc[:,0:12]
df_workouts.head()#Remove HKWorkoutActivityTypeWalking and HKWorkoutActivityTypeSnowSports
df_workouts=df_workouts[df_workouts['[@workoutActivityType](http://twitter.com/workoutActivityType)'] != 'HKWorkoutActivityTypeWalking']
df_workouts=df_workouts[df_workouts['[@workoutActivityType](http://twitter.com/workoutActivityType)'] != 'HKWorkoutActivityTypeSnowSports']
由于健身程序的名称很长,原来的健身程序名称(如“HKWorkoutActivityTypeCycling ”)将替换为简单的“Cycling”。跑步和游泳也是如此。
#Rename Activity Types to Running, Cycling and Swimming
df_workouts["[@workoutActivityType](http://twitter.com/workoutActivityType)"]= df_workouts["[@workoutActivityType](http://twitter.com/workoutActivityType)"].replace("HKWorkoutActivityTypeCycling", "Cycling")
df_workouts["[@workoutActivityType](http://twitter.com/workoutActivityType)"]= df_workouts["[@workoutActivityType](http://twitter.com/workoutActivityType)"].replace("HKWorkoutActivityTypeRunning", "Running")
df_workouts["[@workoutActivityType](http://twitter.com/workoutActivityType)"]= df_workouts["[@workoutActivityType](http://twitter.com/workoutActivityType)"].replace("HKWorkoutActivityTypeSwimming", "Swimming")df_workouts.head(15)
最后但同样重要的是,检查数据帧的头部。如果它看起来像你想要的样子,让我们做一个 CSV 导出,并准备好我们的最终分析数据集插入到 Google Data Studio。
#save as csv (Don't forget to add '.csv' at the end of the path)finalADS = df_workouts.to_csv(r'/Users/finalADS.csv', header=True)
3.使用 Google Data Studio 创建仪表板
最后但同样重要的是,我们正在可视化导出的 CSV 数据集,以探索我们的锻炼数据。Google Data Studio 是首选工具,因为它对每个人都是免费的,并提供了一种快速可视化简单数据的方法。如果你已经有一个谷歌账户,访问 https://datastudio.google.com/,你就可以开始了。Google Data Studio 提供了一些示例报告,但是在这种情况下,我们从头开始,使用“空白报告”并添加我们的 CSV 作为数据源。
在 Data Studio 中创建空白报表
Google Data Studio 中的 CSV 上传
Google Data Studio 将确认您的 CSV 成功上传。在我的例子中,第一列没有被命名为“ID ”,而是被追溯标记。之后,您可以开始创建您想要的图表。下面不会解释每一个图表,但是在 Google Data Studio 中如何创建一个图表的三个基本步骤。
使用 Google Data Studio 创建图表
- 通过单击顶部导航栏上的概述按钮添加新图表。
- 选择所需的图表类型后,接下来选择要显示的数据。首先,选择我们的“finalADS.csv”作为数据源。其次,应该定义“日期范围维度”。在这种情况下,我们想比较这些年来我们的锻炼行为是如何发展的。第三,我们的“分解维度”选择为“@workoutActivityType”。这让我们可以在游泳、骑自行车和跑步中分解我们的训练
- 最后但同样重要的是,我们可以设计图表的样式。对于所有不同的图表,相同的颜色用于相同的锻炼活动类型。这样,我们可以轻松地将锻炼分配到相应的图表中。
谷歌数据工作室——铁人三项仪表板 I
谷歌数据工作室——铁人三项仪表板 II
结论
从运动的角度来看,从 2018 年到 2019 年,训练量几乎翻了一倍,另一方面,这些年来速度增加了,这是很惊人的。看起来运动的事情正朝着正确的方向发展,但你会发现这个项目更大的焦点是处理由 Apple Watch 设备创建的数据集。
虽然提取数据集非常容易,但要适应 XML 文件需要一些时间。但是我保证一旦你掌握了窍门,你会爱上它的。从那时起,这就是一个非常典型的数据分析过程,其中包含清理和转换的部分。最后但并非最不重要的是,我只能向不太复杂的项目推荐使用 Google Data Studio 进行数据可视化。它是免费的,它有大部分的选择,并且很容易共享。对于这个范围内的其他工具,你肯定要付出代价。
如果您有任何问题或需要一些数据分析方面的支持,请随时通过 LinkedIn、Instagram 或其他任何地方联系。
您可能也喜欢阅读的文章:
使用 Docker 设置您的数据环境
数据分析项目—电信客户流失
这个项目的假想背景:我是一名数据分析师,在一家电信公司工作。我的经理让我分析她提供的数据集,以获得可操作的见解,从而留住客户并增加客户的终身价值。
从数据集中提取可行的见解。在评估数据集后,我列出了所有出现在我脑海中的问题,并试图对所有问题进行调查,以找到真知灼见:
1.为服务付费的未订阅用户通常会在服务中停留多长时间?他们的平均 LTV(生命时间价值)是多少?
2.退订和仍在订购的用户中有多少人使用了电话服务?
3.有多少人使用多线路电话服务给那些退订但仍在订购的人?
4.对于那些退订和订阅的人,有多少人使用了互联网服务?
5.对于那些退订和付费的用户,有多少人使用和正在使用互联网服务的每个子集?
6.对于那些仍然在用 LTV 高于泄露客户平均 LTV 的人来说,每个服务互联网服务有什么不同?
7.有多少人订阅了每一种合同,而那些退订的人仍然在为服务付费?
8.在“性别”、“伴侣”、“家属”、“电话服务”、“互联网服务”、“合同”和“支付方式”中,哪个变量对 LTV 的影响最大?
这个数据集是我在 Kaggle 建立的 IBM 样本数据集。
该数据集的简要说明:
每行代表一个客户;每一列都包含列元数据中描述的客户属性。
数据集包括以下信息:
- 上个月内离开的客户—这一列称为流失。
- 每位客户已注册的服务—电话、多条线路、互联网、在线安全、在线备份、设备保护、技术支持以及流媒体电视和电影
- 客户账户信息——他们成为客户的时间、合同、支付方式、无纸化账单、每月费用和总费用
- 客户的人口统计信息—性别、年龄范围,以及他们是否有伴侣和家属
让我们从解释我在这个项目中的整个数据分析步骤开始:
第一步:收集数据
第二步:评估和清理数据
第三步:进行探索性数据分析以回答问题&创建可视化( 最终可视化代码 )
第四步:理解语言障碍
第五步:汇总
第六步:可行的见解
从步骤 1 到步骤 3,你可以在这里看到完整的代码。
第一步:收集数据
对于stats models . API模块,由于我将对第 8 个问题使用多元线性回归分析,所以我包括在这里。
第二步:评估和清理数据
在这里,因为这篇文章的目的是展示我做了什么和我进行数据分析项目的过程,所以我不会重复每个细节。相反,我会选择我做过的最重要的程序。如果你真的想检查我做的每一个细节,请看这里。
评估:
通常,我喜欢一次查看所有的列,所以我使用 pandas.set_option 来做这件事:
****
df.describe()
df.Contract.value_counts()
逐月:一年:两年约为 2.5: 1: 1
*# show the distribution of tenure.*
plt.hist(data = df, x = 'tenure');
这显然不是正态分布。而且有两个高峰,所有客户中有两种极端的人,我会调查是什么服务让入住 70 个月以上的人最多。
评估报告:
这里没有整洁的问题,只有两个问题需要考虑一个非常干净的数据集。以下是 2 个质量问题:
- “TotalCharges”的数据类型应该是 float64 类型,而不是 object 类型。
- 许多行的“总费用”不等于每个月的费用。
首先,我们应该复制原始数据集:
df_copy = df.copy()
清理 1:“总费用”的数据类型应该是 float64 类型,而不是对象类型
操作:为所有行赋予 None 值,然后将其转换为 float64 的数据类型。(稍后我会重新计算)
df_copy.TotalCharges = **None**
df_copy.TotalCharges=df_copy.TotalCharges.astype(float)
测试结果:
df_copy.TotalCharges.dtype
输出:dtype('float64 ')
清洁 2:许多行的“总费用”不等于每个月的费用。
行动:重新计算,让每个任期乘以每月收费
df_copy.TotalCharges = df_copy.tenure * df_copy.MonthlyCharges
测试结果:
df_copy[df_copy.tenure * df_copy.MonthlyCharges != df_copy.TotalCharges].shape
输出:(0,21)
清理过程的最后一步:保存数据。
*# store the clean data*
df_copy.reset_index(drop=**True**)
df_copy.to_csv('Telco-Customer-Churn_clean.csv')
第三步:进行探索性数据分析以回答问题&创建可视化( 最终可视化代码 )
在编写任何可视化之前,我喜欢创建一个可重用的函数,这样我可以节省大量时间,而不必编写相同的代码:
研究问题 1:退订付费服务的人通常会在服务中停留多久?他们的平均 LTV(生命时间价值)是多少?
首先,我提取了那些取消订阅服务的人,并检查了任期的分布。
Churn_df = clean_df.query('Churn=="Yes"')
Churn_df.TotalCharges.describe()
让我们看看它的分布:
plt.hist(data = Churn_df, x = 'TotalCharges');
在查看了分布和 5 个数字的汇总后,我发现 80%左右的数据都非常高,所以我决定将它们分成 80%和剩下的 20%来查看每个数据的分布。(在现实生活中应用 80/20 法则。)
*#find the 80th percentile of the data in total charges*
Churn_df.TotalCharges.quantile(0.8)
产量:25000 万英镑 20000 万英镑 20001
*# Divide the data by the 80th percentile of the data, and show the distribution of its TotalCharges under 80th percentile*
TotalCharges_under80 = Churn_df.query('TotalCharges<=2827.59')
TotalCharges_above80 = Churn_df.query('TotalCharges>2827.59')
让我们想象一下未订阅的客户按 80/20 分组的情况:
好了,现在,让我们来看看这张图,它综合了退订者和付费者。
注意:80%(低 LTV)的泄露客户仅停留在 10 个月以下。80%退订者的平均 LTV 是 750 美元。另一方面,未订阅的前 20%的平均 LTV 是 4750 美元。每组总 LTV 之和的比率为 750*4: 4750 = 1: 1.6,这表明我们应该专注于服务那些 LTV 高的 20%客户,这些客户为我们带来了来自泄露客户的 60%(1.6/2.6)的收入。
研究问题 2:退订和仍然订购的用户中使用电话服务的比例是多少?
注:100%的人带来了高 LTV 使用和正在使用互联网服务。
研究问题 3:对于那些退订并仍然订阅的人,使用多线路电话服务的人占多大比例?
注:81%带来高 ltv 的人倾向于二手线路。那些仍然在为服务付费的人和那些退订的人之间没有太大的区别。
研究问题 4:退订和订阅的人使用互联网服务的比例是多少?
注:那些携带高 ltv 的人喜欢使用光纤(75%-90%)和 DSL(10%-20%),他们中没有人使用互联网服务。而那些带来低 ltv 的人,就目前的客户而言,约 30%的人不使用互联网服务。
现在,让我们更深入地了解每个互联网服务子集的情况。
研究问题 5:对于那些退订并仍在为服务付费的人来说,使用每个互联网服务子集的人的比例是多少?
首先,提取使用互联网服务的 LTV 低的 80%,并将互联网服务子集的每个比例保存在变量“比例 _ 互联网 _ 子服务”中:
然后提取使用互联网服务的 LTV 高的 20%,并将互联网服务子集的每个比例保存在变量“比例 _ 互联网 _ 子服务 _ 高于 80”中
其次,提取使用互联网服务的 LTV 低的 80%,并将互联网服务子集的每个比例保存在变量“paying _ proportion _ internet _ sub _ service _ under 80”
然后 e 提取使用互联网服务的 LTV 高的 20%,并将互联网服务子集的每个比例保存在变量“paying _ proportion _ internet _ sub _ service _ above 80”
让我们想象一下:
注:在当前客户的 80%(低 LTVs)数据中,40%的人平等地使用互联网服务的所有子集。在 80%的现有客户(低 ltv)中,流媒体电影和流媒体电视是人们使用的互联网服务的两大子集,设备保护和在线备份排在第二位,技术支持和在线安全排在第三位,这两者之间的差距接近整个数据的 10%。
研究问题 6:对于那些仍在服务的 LTV 高于泄露客户平均 LTV 的客户,每个服务中的一般当前客户之间有什么差异?
首先,我提取了我想要调查的几组数据:
1.让我们来看看多线路的电话服务:
2.对于互联网服务:
注意:在 80%的当前客户中,LTV 超过 80%泄露客户的平均 LTV 的人使用多条线路和互联网服务的可能性比 80%的当前客户的平均水平高 10%。
研究问题 7:对于泄露且仍在支付服务的两组人,每组的每种合同的比例是多少?
注意:89%的泄露者使用月合同,而只有 42%的当前客户使用月合同。
研究问题 8:在“性别”、“伴侣”、“家属”、“电话服务”、“互联网服务”、“合同”和“支付方式”中,哪个变量对 LTV 的影响最大?
我对这些问题使用了多元线性回归,首先,因为它们大多数是分类变量,所以我需要将它们转换成虚拟变量:
使用多元线性回归:
注:人们是否使用互联网服务是创造高 LTV 的最重要因素,年度合同次之。
注意:在互联网服务的所有子集中,在线备份是创造高 LTV 的最重要因素
第四步:了解局限性
在得出任何结论之前,告知局限性总是更好的。在评估数据和进行探索性数据分析的过程中,我发现了一些局限性:
限制 1:在这个数据集中,我们只能看到每个变量的一种类型,而不是改变不同选项久而久之的真实世界情况,即在真实世界中,人们可能想尝试流媒体服务,但他们可能会改变主意,下个月使用技术支持。
局限性 2:我们不能将所有这些变量都视为客户离开的确切原因,因为他们可能会因为竞争对手提供的更好的价格或某个时候经济不景气等原因而离开。我们看不到他们泄露的时间,所以很难推断那些外部情况。
第五步:总结
- 80%(低 LTV)的泄露客户仅停留在 10 个月以下。他们的平均工资是 750 美元。另一方面,前 20%的泄密者的平均 LTV 是 4750 美元。每组总 LTV 之和的比率为 750*4: 4750 = 1: 1.6,这表明我们应该专注于服务 20%的高 LTV 客户,这些客户为我们带来了 60%(1.6/2.6)的来自泄露客户的收入
- 81%带来高 ltv 的人倾向于二手线路。那些仍然在为服务付费的人和那些退订的人之间没有太大的区别。
- 那些带来高 ltv 的人喜欢使用光纤(75%-90%)和 DSL(10%-20%),他们中没有人使用互联网服务。而那些带来低 ltv 的人,就目前的客户而言,约 30%的人不使用互联网服务。
- 在 80%(低 LTVs)的当前客户中,40%的人平等地使用互联网服务的所有子集。在 80%的现有客户(低 ltv)中,流媒体电影和流媒体电视是人们使用的互联网服务的两大子集,设备保护和在线备份排在第二位,技术支持和在线安全排在第三位,这两者之间的差距接近整个数据的 10%。
- 在 80%的当前客户中,那些 LTV 高于 80%泄露客户的平均 LTV 的人使用多条线路和互联网服务的可能性比 80%的当前客户高 10 %。****
- 89%的泄露者使用月合同,而只有 42%的当前客户使用月合同。
- 人们是否使用互联网服务是创造高 LTV 的最重要因素,年度合同次之。
- 在互联网服务的所有子集中,在线备份是创造高 LTV 的最重要因素。
第六步:可行的见解
为了留住客户:
- 开展营销活动,对目前在我们的其他互联网服务上订购流媒体电影和电视服务的用户进行追加销售。(根据 Q5 的图表,他们支付的互联网服务越多,他们停留的时间就越长。)
为了增加客户的终身价值:
- 增加我们的流媒体电影和电视服务的营销预算,因为这两个领域的差距最大,分别为 80%(低 LTV)和 20%(高 LTV)。(基于 Q5 的图表)
- 增加我们在线备份的营销预算,这是促成高 LTV 的最重要因素。(基于 Q8 的图表)
- 增加我们对那些想使用多条线路的用户的营销预算。(基于 Q6 的图表)
弗兰基·查马基在 Unsplash 上拍摄的照片
最后,数据有更好的想法,但你应该始终怀疑任何洞察力和数据在某种程度上是错误的或有一些偏见,无论谁提供给你的是专家或可信度高的人。
感谢您花时间阅读这篇文章。
如果你是想找数据分析师实习生的雇主,这是我的 LinkedIn 或者通过我的电子邮件(ychen596@insite.4cd.edu)联系我
如果你也在数据科学/商业分析领域工作,请随时通过 IG( @jchen_mmm )、电子邮件或下面的评论给我任何反馈!
数据分析项目——WeRateDogs
许多人都在为他们可爱的狗狗运营社交媒体账户。然而,他们中的大多数人通常不会很好地运营他们的社交媒体账户,因为他们不知道观众喜欢什么,也不知道是什么因素影响了他们的喜爱和转发量。
瓦莱丽·埃拉什在 Unsplash 上拍摄的照片
因此,我试图通过分析著名的狗评级 Twitter 帐户 @weratedog 到来调查以下这 2 个问题,帮助那些拥有或打算拥有狗宠物社交媒体帐户的人通过选择正确类型的狗来吸引更多观众(我有多无聊):
1.哪个阶段/尺寸的狗获得了最高的转发数和最喜欢的数?
2.转发次数最多的前三种狗是什么?
一个简短的介绍@weratedog 是一个推特账户,用一个关于狗的幽默评论给人们的狗打分。该账户由大学生马特·尼尔森于 2015 年创建。从那以后,这个账户已经吸引了 880 万以上的关注者。
让我们从解释我在这个项目中的整个数据分析步骤开始:
第一步:使用 Twitter API 收集数据(这里是完整代码
第二步:评估和清理数据(此处为的完整代码)
第三步:进行探索性数据分析以回答问题并创建可视化效果(完整代码在此处)
第四步:理解局限性
第五步:总结
第六步:可行的见解
步骤 1:使用 Twitter API 收集数据
在这个项目中,我使用了 Tweepy ,一个 Python 库,来查询 Twitter 的 API 以获取 WeRateDogs Twitter 数据。数据将包括转发次数和收藏次数。我将把这两条信息与我在做这个项目时参加的 Udacity 的数据分析师课程提供的额外数据结合起来。
而且,因为这篇文章的目的是展示我所做的,所以这不是一篇教程文章,所以如果你是一个初学者并且对如何使用 Tweepy 感兴趣,这是一篇适合初学者的文章。
Code:**import** **pandas** **as** **pd**
**import** **numpy** **as** **np**
**import** **os**
*#load twitter-archive-enhanced.csv into twitter_archive_df(*twitter-archive-enhanced.csv is the additional data provided by Udacity's course*)*
twitter_archive_df = pd.read_csv('twitter-archive-enhanced.csv')*#using Python's Tweepy library and store each tweet's entire set of JSON*
*#data will be in a file called tweet_json.txt file.*
**import** **tweepy**#for the privacy, I put '...' instead of the real keys heehee
consumer_key = '...'
consumer_secret = '...'
access_token = '...'
access_secret = '...'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth, wait_on_rate_limit=**True**, wait_on_rate_limit_notify=**True**)
**import** **json**
page_no_exist = []
retweet_count_and_favorite_count = []#Writing and Reading Twitter JSON
**with** open('tweet_json.txt', mode="w") **as** file:
**for** i **in** list(twitter_archive_df.tweet_id):
**try**:
tweet = api.get_status(str(i))
file.write(json.dumps(tweet._json))
retweet_count_and_favorite_count.append({
"tweet_id" : str(i),
"retweet_count" : tweet._json['retweet_count'],
"favorite_count" : tweet._json['favorite_count']
})
**except**:
page_no_exist.append(i)retweet_count_and_favorite_count = pd.DataFrame(retweet_count_and_favorite_count, columns=["tweet_id",'retweet_count', 'favorite_count'])
第二步:评估和清理数据(这里是完整代码
在评估过程中,我发现了一些问题,并记录在两个部分:质量问题和整洁问题:
为质量问题:
- 冗余转发行
- 多余的“回复用户推文”行
- tweet_id 883482846933004288,778027034220126208 中的 rating _ 分子错误,给出了小数点后的数字而不是整数。
- 没有名字的狗,取了“a”或“an”而不是“None”
- 有些 rating_denominator 不是 10
- “时间戳”、“tweet_id”的数据类型错误
- 源列中的行有 95%以上是重复的。
为整洁问题
- 同一类别的冗余列,现在分为[“doggo “,” flooter “,” pupper “,” puppo”]列,但是我们只需要一个" stage "列
在这里,我挑选了下面两个我认为最有趣的清洁来展示,但是如果你想看我为这个项目做的整个清洁过程,请在这里查看清洁过程的完整代码。
清洁 1:没有名字的狗,但被赋予“a”或“an”的名字,而不是“None”
操作:查找错误名称列表,并使用 for 循环给出单个名称“无”。
Code:wrong_name_list = list(twitter_clean_df.query('name == "a" or name == "an"').index)**for** i **in** wrong_name_list:
twitter_clean_df.name[i] = "None"
测试结果:
**for** i **in** wrong_name_list:
**if** twitter_clean_df.name[i] != "None":
print("wrong name")(nothing is shown.)
清洁 2。同一类别的冗余列。原始数据集包含“doggo”、“flooter”、“pupper”和“puppo”列,但我们只需要一个“stage”列来包含它们。
动作:将四列(“doggo”、“flooter”、“pupper”、“puppo”)转换为一个“stage”列,然后删除这四列。
Code:twitter_clean_df['stage']=**None** # I try to add all the values from the four columns together, and then drop the "None" after that.twitter_clean_df['stage'] = twitter_clean_df.doggo + twitter_clean_df.floofer + twitter_clean_df.pupper + twitter_clean_df.puppotwitter_clean_df['stage'].value_counts()
好了,现在我要去掉每行中所有的【无】。
twitter_clean_df['stage'] = twitter_clean_df['stage'].map(**lambda** x: x.replace("None",""))twitter_clean_df['stage'].value_counts()
这大概是我想要的,但是我们可以看到一些狗被记录为两个阶段,所以让给他们在两个词之间的“,”符号。
(以“doggopupper”为例。我们应该把它写成“doggo,pupper”)
Code:
twitter_clean_df.loc[twitter_clean_df.stage == 'doggopupper', 'stage'] = 'doggo, pupper'
twitter_clean_df.loc[twitter_clean_df.stage == 'doggopuppo', 'stage'] = 'doggo, puppo'
twitter_clean_df.loc[twitter_clean_df.stage == 'doggofloofer', 'stage'] = 'doggo, floofer'
测试结果:
twitter_clean_df.stage.value_counts()
搞定了。
第三步:进行探索性数据分析,回答问题并创建可视化(完整代码在此)
让我们通过可视化来进行探索性的数据分析,从问题 1、2、3 开始!
研究问题 1:哪种类型的狗获得了最高的转发数和喜爱数?
# we only need the rows with stages
df_stage = df[df["stage"].isnull()==False]#visualization 'Average favorite counts by stages of dogs'by_stages = df_stage.query('stage=="pupper" or stage=="doggo" or stage=="puppo" or stage=="floofer"')favorite_counts_by_stages = pd.DataFrame(by_stages.groupby('stage').favorite_count.mean().sort_values())favorite_counts_by_stages['stages'] = favorite_counts_by_stages.indexfavorite_counts_by_stages.plot(x="stages",y='favorite_count',kind='barh',title="Average favorite counts by stages of dogs",color='r', alpha=0.6)
好了,就在完成所有的可视化之后,我发现 puppo 和 puppy 的意思是一样的 XDDD,都是小狗的意思。(我应该事先研究一下那些奇怪的术语…)而弗洛弗的意思是大狗,和人类一样大。doggo 是狗的正常尺寸。这里,我应该将阶段的名称改为“大小”,而不是使用阶段。
favorite_counts_by_stages.rename(columns={'stages':'size'}, inplace=True)favorite_counts_by_stages.plot(x="size",y='favorite_count',kind='barh',title="Average favorite counts by size of dogs",color='r', alpha=0.6)
#visualization 'Average retweet counts by the size of dogdf_size = df[df["size"].isnull()==False]by_size = df_size.query('size=="pupper" or size=="doggo" or size=="puppo" or size=="floofer"')retweet_count_by_sizes = pd.DataFrame(by_size.groupby('size').retweet_count.mean().sort_values())
retweet_count_by_sizes['size'] = retweet_count_by_sizes.index
retweet_count_by_sizes.plot(x="size",y='retweet_count',kind='barh',title="Average retweetcounts by size of dogs",color='r', alpha=0.6)
注意:它们看起来都像是小狗的转发数和喜爱数是其他狗的两倍。(既然 pupper 和 puppo 应该加在一起。)
研究问题 2:转发次数最多的前三种狗是什么?
由于 Udacity 提供的数据集有一个名为预测品种的列,有人使用了一个机器学习模型来预测每个帖子的狗图片。它包含了每个帖子的一些可能的品种的概率。
我的想法是从每个预测结果中选择最高的概率,看看哪个预测品种的平均转发数最高。
#extract data that has retweet_count and save them into variable "retweet_and_favorite_count"#get the index of ids with retweet_count
#create a column called 'predicted_breed' for putting the predicted breed later on.retweet_and_favorite_count = df[df["retweet_count"].isnull()==False]
id_with_retweet = list(retweet_and_favorite_count.tweet_id)
retweet_and_favorite_count['predicted_breed'] = Noneretweet_and_favorite_count.head()
好的,你可以看到最后一列叫做“预测品种”,包含“无”,用于以后存储预测品种。
我将使用 Udacity 提供的数据集“df_image”来查找包含预测品种的 id。
# find the ids that are also in the df_image, and save the id in has_data.has_data = []for i in id_with_retweet:
if len(list(df_image[df_image['tweet_id']==i].p1_dog.index))!=0:
has_data.append(i)
len(has_data)
输出:1643
我现在将使用 for 循环,通过选择每个预测品种的最高概率来确定它们的预测品种。
顺便说一下,Medium 中的代码格式很难阅读代码,如果你认为下面的结构有点复杂,请在这里查看原始的代码
for i in has_data: index = list(retweet_and_favorite_count[retweet_and_favorite_count['tweet_id']==i].index)[0]
if list(df_image[df_image['tweet_id']==i].p1_dog.values)[0] == True:
retweet_and_favorite_count.predicted_breed[index] = list(df_image[df_image['tweet_id']==i].p1.values)[0]
elif list(df_image[df_image['tweet_id']==i].p2_dog.values)[0] == True:
retweet_and_favorite_count.predicted_breed[index] = list(df_image[df_image['tweet_id']==i].p2.values)[0]
elif list(df_image[df_image['tweet_id']==i].p3_dog.values)[0] == True:
retweet_and_favorite_count.predicted_breed[index] = list(df_image[df_image['tweet_id']==i].p3.values)[0]
测试结果:
retweet_and_favorite_count[retweet_and_favorite_count["predicted_breed"].isnull()==False].sample(5)
*# assess the data*
retweet_and_favorite_count.retweet_count.describe()
通常,如果有一些数据超过平均值± 3*std,意味着有一些异常值。在这种情况下,所有的品种都是预测的,所以我想创建一些标准来过滤掉离群值或不准确的数据。
我决定使用不保守的 3 个标准来提取结果:
1。品种应该至少有 10 个计数,因为数据会更稳定。
2。每个品种的标准差应低于 4447(整个数据集的标准差)
3。其均值大于 2534(整个数据集的均值)。
result_df = retweet_and_favorite_count.groupby('predicted_breed').retweet_count.describe()
result_df = result_df.query('count >= 10.0')
result_df = result_df[result_df['std'] < 4447]
result_df = result_df[result_df['mean'] > 2534]
result_df = result_df.sort_values(by=['mean'], ascending=**False**)
试验
result_df.head(3)
最后,我们来形象化一下。
*#visualization 'Top 3 highest average retweet counts by predicted breeds'*
locations = [1,2,3]
top3 = result_df.head(3)
mean_retweet_counts = list(top3['mean'])
labels = list(top3.index)
plt.bar(locations, mean_retweet_counts, tick_label=labels)
plt.title('Top 3 highest average retweet counts by predicted breeds')
plt.xlabel('Breeds of dogs')
plt.ylabel('retweet counts');
注:大 Pyenees、羊毛衫和金毛寻回犬是预测品种中平均转发次数最高的前 3 名。而且,排名第一的品种比排名第二的品种平均多 600 个计数。
第四步:理解局限性
在得出任何结论之前,最好告知局限性,以及其他人为因素是否会影响数据源的参与。在评估数据和进行探索性数据分析的过程中,我发现我收集的数据和 Udacity 提供的数据集存在一些局限性。
限制:
- 限制 1:只有 15%的数据记录大小。然而,我们没有进行置信区间或假设检验来测试我们对规模的结论是否可信,所以观众应该在某种程度上怀疑我们的见解。
- 限制二:我不确定创造机器学习模型的人是如何预测品种的,所以预测的品种应该会受到观众一定程度的怀疑。我们的结论中没有 100%确定的事情。
第五步:总结
- 与 doggo 和 floofer 相比,Puppy 的转发数和喜爱数是其他尺寸的狗的两倍。(既然 pupper 和 puppo 应该加在一起。)
- 就品种而言,大白熊、羊毛衫和金毛寻回犬是预测品种中平均转发次数最高的前三种。而且,排名第一的品种比排名第二的品种平均多 600 个计数。
第六步:可行的见解
如果你想经营一个宠物社交媒体账户,并且你还没有决定哪种类型的狗是主角(如果你可以选择…),或者如果你已经有一个狗宠物账户,并且你想收养或购买更多的狗,这里有一些见解:
1.去找小狗:)
2.就品种而言,选择大白熊、卡迪根、金毛比其他狗更容易吸引观众的参与。
所以,结合这两个观点:
大白熊犬是你的首选!
克里斯蒂娜·安妮·科斯特洛在 Unsplash 上的照片
感谢您花时间阅读这篇文章。
如果你是想找数据分析师实习生的雇主,这是我的 LinkedIn 或者通过我的电子邮件联系我(ychen596@insite.4cd.edu
如果你也在数据科学/商业分析领域工作,请随时通过 IG( @jchen_mmm )、电子邮件或下面的评论给我任何反馈!
使用 Excel 进行数据分析
学习有用的 Excel 技术,为探索性数据分析创建强大的仪表板
在 Tableau 和 PowerBI 等工具出现之前,Microsoft Excel 是所有行业用来处理数据的最重要的工具。即使在今天,Excel 也因其强大的数据分析功能而被广泛使用。
在本文中,我将向您介绍一些非常有用的 Excel 方法来分析数据,并准备一个视觉上吸引人的仪表板呈现给最终用户。在本节中,我使用了 Kaggle 中共享的空气质量数据。这是数据集的快照,
空气质量数据集
该数据针对印度各邦 2015 年至 2020 年的各种污染物水平,包括空气质量指数(AQI)。AQI 被定义为一个整体方案,该方案将单个空气污染相关参数(SO2、CO 等)的加权值进行转换。)转换成一个数字或一组数字。空气质量指数有助于公众以简单的方式了解空气质量。AQI 类别或桶用于根据值将 AQI 值分为六个类别,即:好(0-50)、满意(51-100)、中等(101-200)、差(201-300)、非常差(301-400)、严重(401-500)。
数据透视表
**Excel 最重要也是最广泛使用的功能之一是数据透视表。**这里我使用了一个数据透视表来根据年份和城市对数据进行分组。您可以选择整个数据,并从 Excel 的“插入”菜单中插入一个数据透视表
数据透视表
我按平均值汇总了值字段,因为我希望我的表显示每年的平均污染物水平。默认情况下,Excel 使用计数。您可以选择根据年、月或日过滤数据。使用数字格式选项减少小数位数或使其成为整数。数据透视表准备就绪后,您可以通过单击数据透视图选项,使用合适的数据透视表对数据进行可视化分析。这里我使用了堆积条形图来绘制数据。
我还尝试在数据透视表中使用不同的值和过滤选项。这些图表非常适合在仪表板中使用,出于演示目的,将在下面讨论这些图表。从图表中可以清楚地看到,由于 Covid19 锁定,印度所有邦的 AQI 在 2020 年都有所下降。
AQI 平均值和 AQI 类别计数
仪表盘
一旦所需的图表准备就绪,就该创建一个有吸引力的、自我解释和交互的仪表板了。在创建仪表板方面,Excel 与 Tableau 等任何其他分析工具一样出色。在一张新的纸上复制所有的图表。您可以从“页面布局”菜单中删除表单上的网格线。要使您的仪表板具有交互性并连接所有图表,您可以添加切片器。选择一个图表,并从“插入”菜单中为任何必填字段选择“切片器”。在这里,我为年份、日期、AQI 桶和城市选择了切片器。将切片器连接到所有图表,以便用户可以轻松地分析数据的各种组合。右键单击切片器并选择报告连接选项。选择所需的数据透视表以建立连接。这必须对所有切片器重复进行。通过这种方式,您可以在 Excel 中在几分钟内创建高度交互式的仪表板。
空气质量仪表板
**接下来,我将向您展示一些真正有用的 Excel 特性,它们将有助于有效地管理大型数据集。**我将使用 Kaggle 的 Covid19 数据集来解释这些特性。该数据探讨了印度各邦的医院数量及其应对 Covid19 的准备情况。这是数据集的快照,
Covid19 数据集
纵向查找函数
当数据集中有许多列和行时,Vlookup 是一个搜索特定数据的便捷功能。此外,该功能的另一个用途是,当许多用户处理特定数据集时,它可以用作一个简洁的查找表单。例如,在给定的数据集中,如果您想要快速找到某个特定州的公共卫生中心的数量,那么可以对该函数进行建模,以便从整个数据集中只提取所需的数据。
您可以从 Excel 的“公式”菜单中插入 vlookup 函数。vlookup()函数的格式如下:
=VLOOKUP(要查找的内容,要查找的位置,包含要返回的值的范围内的列号,返回近似或精确匹配—表示为 1/TRUE,或 0/FALSE)。例如,对于上面给定的数据集,我有下面的 vlookup 函数,=VLOOKUP(G47,B1:I38,8,FALSE)。这是我使用 vlookup 函数对数据创建的输出。
纵向查找函数
我在两个领域使用了 vlookup 函数,即公共卫生设施总量和人口。我使用的搜索字段是 State。因此,无论我想搜索哪个州的数据,我只需在 state 字段中输入,我的 vlookup 函数就会自动获取结果。这适用于任何数据集,如销售、财务等。用户可能希望在海量的行和表中搜索特定的数据。这种定制的数据搜索/查找可以在新的工作表中实现,并锁定公式的任何修改。用户可以像搜索表单一样简单地使用它,而不是搜索数据。
与 Vlookup()类似,Excel 中还有几个其他的查找函数,分别是 Hlookup()、lookup()和 Xlookup()。关于其使用的更多信息可以从微软门户获得。
下拉列表
Excel 的另一个很酷的功能是向分类数据字段添加一个下拉列表。这在多个用户处理数据时会很方便。例如,如果多个用户正在分析同一个工作表,并且他们正在输入一些状态,那么您可以添加一个包含他们所有姓名或状态的字段,他们可以很容易地从下拉列表中进行选择。
下拉列表
我在空气质量数据集中的 AQI 类别列中添加了一个下拉列表。首先,您需要在行或列中复制应该放入下拉列表的值集。接下来,选择要添加下拉列表的单元格,从数据菜单中选择数据有效性选项。在此,为“允许验证标准”选择“列表”,为“来源”选择您已输入要添加到列表中的分类值的行/列。瞧,你的列表准备好了,你可以把它复制到数据集中所有需要的单元格。用户只需从下拉列表中选择值,这反过来有助于您控制表中输入的内容。
重复删除和数据分割
数据清理是任何数据分析过程的关键要素。分析师的一项常见任务是消除数据中的重复值。在 Excel 中处理重复项,首先选择数据区域,然后从“数据”菜单中选择“删除重复项”选项。在这里,您可以选择数据验证要包括哪些列。单击“确定”按钮后,如果数据集中存在重复值,Excel 将显示已删除的重复值的数量。
删除重复项
Excel 中另一个有助于处理由分隔符分隔的数据的有用功能是文本到列。这在处理日期和时间时非常方便。使用它,你可以很容易地根据月、日、年、小时等划分日期和时间。首先,您需要选择要拆分的数据,然后从“数据”菜单中选择“文字到列”选项。拆分为列是一个三步过程。在第一步中,您可以选择分隔符或固定宽度选项。在第二步中,您必须选择分隔符的类型。我选择了拆分日期列,因此指定/作为分隔符。在第三步中,您可以选择希望 Excel 粘贴拆分数据的位置。如下图所示,日期将被分为三列,稍后您可以将其重命名为日、月和年。因此,没有太多的麻烦,数据是根据您的要求分裂。
文字分列
**这些是一些最常用的 Excel 功能,对数据分析有很大帮助,在进行数据预处理和报告时节省了大量时间。**我已经使用相同的数据集通过 Tableau 进行分析,并在 Kaggle 中编写了几个关于空气质量分析和 Covid19 影响的内核。
使用 JHU CSSE 新冠肺炎日报数据集进行数据分析
数据分析使用 JHU CSSE 新冠肺炎数据。照片由 Pexels 的 cottonbro 拍摄
数据科学实践指南
数据科学方法论中的疫情报表数据集查询
免责声明:本文中使用的数据集由约翰霍普金斯大学代表其工程系统科学中心在知识共享署名 4.0 国际版(CC BY 4.0)下授权。版权所有约翰·霍普金斯大学 2020 年
从头开始构建数据框可能有点乏味。因此,您通常要做的不是从一些数据序列创建数据框,而是导入数据。在本文中,您将通过从约翰霍普金斯大学 Github 页面导入新冠肺炎每日报告案例数据框来分析带有熊猫的数据集。
图 1:从 JHU CSSE 新冠肺炎数据导入 CSV 文件。图片作者作者
如图 1 所示,我们调用import pandas as pd
来导入pandas
库。接下来,您可以用read_csv
导入 CSV 文件,并将其赋给一个变量。在这种情况下,我们使用covid_daily_report
作为变量。
令人印象深刻的是,因为它现在在熊猫数据框中,我们可以利用熊猫提供的所有功能,并操纵查看和更改这些数据。
导入数据后,您可能希望修改并导出数据。让我们看看如何导出数据框。导入后,我们没有对数据框进行任何更改,但我们还是要将其导出。
图 2:将数据帧导出到本地磁盘。图片作者作者
如何导出数据帧的过程如图 2 所示。您将调用这个函数,covid_daily_report.to_csv
,然后传递一个字符串名称作为备份文件。接下来,您应该通过创建一个新变量并调用read_csv
函数来调用导出的 CSV 文件,从而尝试导入备份文件。
将数据导入 pandas 的典型方式是读取一个 CSV 文件,然后一旦您对其进行了更改或操作,您就可以将它作为一个修改过的数据集导出为一个 CSV 文件。
描述数据
为了描述数据框中的数据类型,我们可以使用dtypes
属性。你会注意到,有些函数调用后有括号,有些没有。不带括号的是属性,比如dtypes
,而带括号的是函数,比如covid_daily_report.to_csv()
。
图 3: dtypes 属性。图片作者作者
属性和函数的区别在于,函数将执行一些步骤,而属性dtypes
只是存储的关于covid_daily_report
数据帧的一些元信息。关于属性和函数之间的区别,这是需要记住的两件主要事情。
属性会告诉你一些关于基于列的数据的信息。这个属性将告诉我们每一列的类型(图 3)。让我们看看我们可以利用该数据框做些什么。covid_daily_report.columns
,它是一个属性,因为它没有括号。这将告诉我们列名,并以列表的形式返回。
图 4:列属性。图片作者作者
您还可以将该列表存储到一个新的变量中,如图 4 所示,您可以对该列表执行一些操作,然后在以后使用它来操作您的数据框。这只是演示了如何从数据框中访问两种主要类型的属性。索引呢?可以叫covid_daily_report.index
。这将返回索引的范围,从 0 开始,到 58 结束。
接下来,您将使用 describe 函数covid_daily_report.describe()
从数据框中返回一些统计信息。您会注意到这个函数将只返回数字列,这意味着它只返回 float 和 int 数据类型。
图 5:索引和描述。图片作者作者
重要的是要记住,这些类型的描述函数和dtypes
属性是您在开始探索一组新数据时可能会遇到的。
也许我们想从数据框中获取更多信息。您可以通过调用函数covid_daily_report.info()
来完成此操作。它有点像结合了数据类型的索引。你必须开始运行像 info 和 describe 这样的功能,同时探索你的数据并获得一些相关信息。
图 6:数据帧的详细信息。图片由作者
您可以对您的数据框调用另一种统计分析,例如均值。covid_daily_report.mean()
,它会给你你的数值列的平均值。
图 7:熊猫的平均功能。图片作者作者
接下来,covid_daily_report.sum()
。它将对所有不同列的值求和。这实际上是数据框列中内容的组合。在整个数据框上调用它是没有用的,所以也许我们在单个列上这样做,例如:
covid_daily_report["Confirmed"].sum()
covid_daily_report["Deaths"].sum()
covid_daily_report["Recovered"].sum()
covid_daily_report["Active"].sum()
图 8:熊猫的求和函数。图片作者作者
最后,如果您想要关于数据框长度的最后一点信息,您可以通过将它传递给 len 来计算出您当前正在处理的数据框的长度,我们可以看到我们的数据框中有 58 行。
图 9:数据帧的长度。图片由作者
查看和选择数据
您已经了解了描述我们导入到数据框中的数据的几种不同方式。让我们来看看查看和选择数据的一些不同方法。
图 10:熊猫的头部功能。图片作者作者
您要做的第一件事是查看数据框的头部。你可以调用covid_daily_report.head()
,记住这个后面有括号,所以它是一个函数。此函数将返回数据框前五行中的第一行。实际上,您可能会以某种方式操作数据框,然后经常调用 head。我们的数据框仅包含 58 行。因此,调用整个事情不是太糟糕,但想象一下,如果你有成千上万的这些。
head 所做的是在一个很小的空间内给你一个快速的快照,显示你的数据框所包含的内容。如果您在这里或那里进行了一些快速的更改,您可能想要查看前五行,如果五行不够呢?也许你想看看前八名。head 的美妙之处在于,你可以在这里输入一个数字,它会返回那么多行。
图 11:熊猫的尾巴功能。图片作者作者
出于某种原因,如果您需要返回数据框的底部,您可以使用.tail()
,它将返回底部的行。如果您在数据框的底部而不是顶部进行修改,这将非常方便。变化只会出现在底部。
接下来我们要看的两个函数是loc
和iloc
。我们将在这里创建一个系列,以便详细演示loc
和iloc
之间的区别。我们要做一个叫cars
的系列,在这里设置一些索引。默认情况下,如果我们创建了一个序列,索引将从 0 开始递增。然而,我们不会在这里这样做,因为我们想看看loc
和iloc
之间的区别。
图 12:pandas 系列中的 loc 和 iloc 示例。图片作者作者
我们这里有 7 个随机索引列表。如果我们调用cars.loc[6]
,它将返回两个列表,奔驰和福特,因为loc
引用了一个索引号,并且两者的索引号都是 6。另一方面,如果我们调用cars.iloc[6]
,它只会返回马自达,因为它占据了 6 号位置。iloc
指零分度法的位置。
图 13:数据帧中的 loc 和 iloc。图片由作者
关于loc
和iloc
有两个要点你要记住,iloc
是指位置,loc
是指索引。这件事的美妙之处在于,使用loc
和iloc
你可以使用切片。如果您曾经使用过 Python 列表,您可能对切片很熟悉。这和调用 head 函数是一样的。
图 14:在 loc 中切片,和熊猫的头部功能一样。图片作者作者
我们之前已经看到了这一点,但是让我重复一下关于列选择的信息。假设您想要选择一个特定的列。选择列的方法是在数据框名称旁边的方括号中输入其名称。您可能会看到两种方式,我希望您熟悉这两种选择列的方式,括号符号和点符号。
图 15:pandas 中带括号符号的列选择。图片由作者
图 16:pandas 中带点符号的列选择。图片由作者
关于点符号,你应该知道的一件事是,如果你的列名中有一个空格,点符号将不起作用。因此,您可以考虑使用括号符号。
图 17:列选择中的过滤器。图片作者作者
另一个有趣的部分是,您可以在列选择中放置一点过滤器,如图 17 所示。
图 18:熊猫视觉化的例子。图片作者作者
我们将在这里看一些可视化。你要打电话给covid_daily_report[“Active”].plot()
。这将返回城市的活动案例的情节。熊猫的美妙之处在于,你可以通过给定的数据快速获得分析。获得可视化是快速理解正在发生的事情的好方法。
你想看的另一件事是另一种图,叫做直方图。这是观察分布的好方法。分布是一个关于数据传播的奇特词汇,您可以比较图 18 中的可视化。
操纵数据
作为数据科学家或机器学习工程师,研究的一部分是学习如何提出不同的问题。想想我如何利用这些数据,然后试着找出答案。话虽如此,我们还是来看看这里,如何用熊猫操纵数据。
一个真实的数据集通常在某一行包含缺失数据,称为NaN
。只是说明那里没有价值。
如果你想用一些东西来填补这些缺失的值呢?
图 19:重新分配方法和就地参数方法。图片由作者
有一个函数叫做fillna
,它用值填充这些,并且可以传递一些值并填充它。例如,您想用 0 填充“已确认”列中的一些缺失值。在 pandas 中有两种方法做同样的事情,重新赋值方法和就地参数。您可以在图 19 中看到重新分配和就地分配之间的区别。
图 20:熊猫的 dropna 功能。图片作者作者
例如,我们很高兴填写了“Confirmed”列,但是我们想忽略另一行的缺失值,因为缺失值对我们的数据分析没有帮助。事实上,它们可能是有用的,但是我们想知道如何摆脱它们。有一个功能叫dropna
。您可以看到行数从 58 减少到 34 的结果(图 20)。
如果我们想要重新访问丢失的值,该怎么办?
由于我们在这里创建了一个新变量covid_daily_report_drop_missing
,您仍然可以通过调用covid_daily_report
变量来访问原始数据帧。如果您弄乱了真实数据框,也可以重新导入 CSV 文件。向上滚动到文章的开头,查看如何重新导入图 1 中的 CSV。
图 21:从现有的列创建一个新的列。图片作者作者
接下来,我们如何从现有的列创建数据?Pandas 有几种不同的方法来生成数据,比如构建一个新列,或者用计算操作另一列中的现有数据。例如,您想计算出每个城市的恢复案例百分比。您可以创建一个名为“Recovered_Percentage”的新列,并从“Recovered”列进行一些计算,以获得百分比率,如图 21 所示。
图 22:在 pandas 中放置一列。图片由作者
也许你意识到你不再需要“Recovered_Percentage”列了。如果你想删除其中一列,你可以使用drop
功能。它需要轴和原地参数。Axis 等于 1,因为 1 反映列,0 反映行。在这种情况下,您希望消除列,而不是行,所以我们在轴上放置 1。
随机抽样数据
当我们开始将机器学习算法应用于我们的数据时,他们最重要的步骤之一是创建一个训练验证和测试集。做到这一点的一个步骤是随机排列数据的顺序。因此,用一个sample
函数来混合索引是一个很好的方法。
图 23:pandas 中的示例函数。图片作者作者
sample
函数从数据帧中抽取一个样本,其中包含一个参数frac
。参数是整数形式。例如,为了获得 50%的数据,我们将 0.5 放入参数中。因此,如果你想混洗所有东西,100%的数据样本,我们在参数中传递 1。这将返回数据的混排索引。
图 24:从数据帧中只选择 20%的样本。图片作者作者
实际上,您可能只需要 20%的数据。在frac
参数中,可以传入 0.2 的值。这将从数据帧中返回混洗的 20%。这是您将来在项目中处理大量数据时必须考虑的问题。
一个问题是,我们如何让这些索引恢复秩序?有一个函数叫做reset_index
,后面跟着两个参数drop
和inplace
,如图 25 所示。
图 25:重置混洗索引。图片由作者
我们要看的最后一件事是如何对列应用函数。pandas 中的 Apply function 将允许您对特定的列应用一些函数,无论是 NumPy 还是 lambda。在图 26 中,您可以看到我们将 lambda 函数应用于“Active”列。这将把“活动”列的值与“死亡”列的值相加,并将其重新分配到“活动”列。
图 26:对列应用一个函数。图片作者作者
结论
您已经看到了 pandas 可以做的一些事情,特别是使用 Python 从某个数据集进行数据分析。是时候通过访问 Github 中的 analysis Jupyter 笔记本文件来练习您的技能了。
关于作者
Wie Kiang 是一名研究人员,负责收集、组织和分析意见和数据,以解决问题、探索问题和预测趋势。
他几乎在机器学习和深度学习的每个领域工作。他正在一系列领域进行实验和研究,包括卷积神经网络、自然语言处理和递归神经网络。
连接上LinkedIn
**Citation**Dong E, Du H, Gardner L. An interactive web-based dashboard to track COVID-19 in real time. Lancet Inf Dis. 20(5):533-534\. doi: 10.1016/S1473-3099(20)30120-1**References**#1 [COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University](https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_daily_reports_us)#2 [Github repositories for the analysis](https://github.com/wiekiang/covid-jhu-csse)
编者注: 迈向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
金融中的数据分析和可视化—使用 Python 对股票进行技术分析
如何使用 Pandas、Matplotlib 和 Seaborn 等 Python 库从日价量股市数据中获取洞察。
随着分析越来越多地渗透到我们生活的方方面面,金融业无疑是最早抓住这一趋势的行业之一。在本文中,我试图展示如何将数据分析和可视化技术融入金融领域。
1.关于数据
为了进行分析,我使用了在国家证券交易所(NSE) 上市的以下股票从 2018 年 2 月中旬到 2020 年 2 月的两年历史数据
- HDFC 有限公司
- 太阳制药工业有限公司
- 塔塔咨询服务有限公司
- 金达尔钢铁和电力有限公司
- 喜洋洋食品厂有限公司
我之所以选择这些股票,是因为我在最近的实习期间研究过这些股票。你可以选择自己的股票组合和时间周期来进行分析。
我选择的股票来自不同的板块和市值。随着本文的深入,您将会看到它的优势。首先,我们将单独研究 HDFC 股票,然后进行综合分析。对于这一部分,我已经从雅虎财经下载了 HDFC 股票历史数据的 csv 文件。在下一节中,我们将使用一个非常棒的工具直接从网上提取股票价格。
2.了解数据和一般统计
导入必要的库—
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import warnings
warnings.filterwarnings('ignore')
从 csv 文件中读取数据并显示前几行—
HDFC_df = pd.read_csv(“HDFC.csv”)
HDFC_df.head()
输出:
由于我们分析的时间范围很大,我们可以放宽对小数位数的考虑。
HDFC_df = HDFC_df.round(2)
HDFC_df.head(2)
输出:
更好!现在,让我们决定数据集的形状—
HDFC_df.shape
输出: (491,7)
我们的 HDFC 数据集有 491 行 7 列。接下来,我们检查数据集是否有空值—
HDFC_df.isnull().sum()
输出:
从数据集中删除空条目—
HDFC_df.dropna(inplace = True, axis = 0)
现在,让我们检查每一列的数据类型—
HDFC_df.dtypes
输出:
正如我们所看到的,‘日期’列的格式不合适。Pandas 具有以更智能的方式处理时间序列数据的内置功能。但是为了利用 Pandas 的日期功能,我们需要确保’ Date’ 列的类型是’ datetime64(ns)'。
HDFC_df['Date'] = pd.to_datetime(HDFC_df['Date'])
HDFC_df.head(2
为了得到我们进行分析的总持续时间——
HDFC_df[‘Date’].max() — HDFC_df[‘Date’].min()
*输出:*时间增量(’ 729 天 00:00:00 ')
一年大约有 252 个交易日,平均每月 21 天,或每季度 63 天。在可能的 365 天中,有 104 天是周末(周六和周日),证券交易所不营业。
接下来,我们将使用 Pandas 的 describe() 函数来获得关于 HDFC 股票在过去几个月中表现的高级概述
HDFC_df.iloc[-90:].describe().astype(int)
输出:
在过去的 90 天里,HDFC 股票的平均收盘价约为₹2307.大约 75%的时间里,该股在₹2421 下方交易,最高价为₹2492.单日最大交易量为 8808006 股,中位数为 2776142 股。
3.股票价格的总体变化
在我们继续深入研究之前,我们将把*‘Date’*列设置为 dataframe 的索引。它使绘图变得容易。
HDFC_df.index = HDFC_df[‘Date’]
现在画出股票在 2 年期间的收盘价(调整后),以了解股票在给定期间的总体表现。
HDFC_df[‘Adj Close’].plot(figsize = (15,8))
plt.show()
输出:
在上面的图中,如果你注意到,在 2018 年 9 月左右的某个时候,股票价格急剧下降。除了“九月效应”,HDFC 股价的普遍下跌还可以归因于中美之间不断升级的关税战,这场战争对印度金融市场产生了连锁反应。
4.每日百分比变化(每日回报)
股票价格的每日百分比变化是根据连续两天收盘价之间的百分比变化计算的。假设股票昨天的收盘价是₹500,今天的收盘价是₹550.所以,百分比变化是 10%。即((550–500)/500)* 100。这里没有神秘!
因此,我们将引入一个新列’ Day_Perc_Change ',表示股票价格的每日回报。这可以使用 python 中内置的 pct_change() 函数来完成。
HDFC_df[‘Day_Perc_Change’] = HDFC_df[‘Adj Close’].pct_change()*100
HDFC_df.head()
输出:
您会注意到在*‘Day _ Perc _ Change’*列中的第一个值是 NaN。我们将放弃这一行。
HDFC_df.dropna(axis = 0, inplace = True)
以图表的形式展示每日收益—
HDFC_df[‘Day_Perc_Change’].plot(figsize = (12, 6), fontsize = 12)
输出:
可以观察到,在大部分时间里,回报率在-2%到 2%之间,两侧都很少有超过 6%的峰值。
2018 年 9 月 24 日来自 BusinessLine 的新闻文章
同样,你可以找到股票价格大幅上涨/下跌时的类似新闻文章。
绘制每日回报分布直方图—
HDFC_df[‘Day_Perc_Change’].hist(bins = 50, figsize = (10,5))
plt.xlabel(‘Daily returns’)
plt.ylabel(‘Frequency’)
plt.show()#satistics
HDFC_df.Day_Perc_Change.describe()
输出:
日线回报直方图以原点为中心。在过去的两年里,平均日回报率约为 0.072,大部分时间日回报率低于 1%,这意味着 HDFC 股票在此期间波动较小。在此期间,观察到正方向的最高%变化为 6.46%,负方向为 6.56%。显然,我们没有任何“牛市”或“熊市”的例子!
5.趋势分析
接下来,我们添加一个新列’ Trend ',其值基于我们上面计算的每日百分比变化。趋势由以下关系决定——
def trend(x):
if x > -0.5 and x <= 0.5:
return ‘Slight or No change’
elif x > 0.5 and x <= 1:
return ‘Slight Positive’
elif x > -1 and x <= -0.5:
return ‘Slight Negative’
elif x > 1 and x <= 3:
return ‘Positive’
elif x > -3 and x <= -1:
return ‘Negative’
elif x > 3 and x <= 7:
return ‘Among top gainers’
elif x > -7 and x <= -3:
return ‘Among top losers’
elif x > 7:
return ‘Bull run’
elif x <= -7:
return ‘Bear drop’HDFC_df[‘Trend’]= np.zeros(HDFC_df[‘Day_Perc_Change’].count())
HDFC_df[‘Trend’]= HDFC_df[‘Day_Perc_Change’].apply(lambda x:trend(x))HDFC_df.head()
输出:
我们希望看到股票在过去两年的走势。这可以想象成一个饼图,每个扇区代表每个趋势发生的天数百分比。我们将为*‘趋势’*列绘制一个饼图,以可视化每个趋势类别的相对频率。
为此,我们将使用带有趋势列的 groupby() 函数,在绘制饼图之前,将具有相同趋势的所有日期聚合到一个组中。
用饼图可视化趋势频率—
DFC_pie_data = HDFC_df.groupby('Trend')
pie_label = sorted([i for i in HDFC_df.loc[:, 'Trend'].unique()])
plt.pie(HDFC_pie_data['Trend'].count(), labels = pie_label,
autopct = '%1.1f%%', radius = 2)
plt.show()
输出:
从 2018 年 2 月中旬到 2020 年 2 月,HDFC 股票在大约 1.8%的时间里涨幅居前,在 1.6 %的时间里跌幅居前。在大约 12.4%的时间里,该股在某一天表现良好。同样,在大部分时间内(约 29.6%),股票价格变化很小。这些观察结果与我们在上一节看到的日收益率直方图一致。
6.每日回报和交易量
plt.stem(HDFC_df[‘Date’], HDFC_df[‘Day_Perc_Change’])
(HDFC_df[‘Volume’]/1000000).plot(figsize = (15, 7.5),
color = ‘green’,
alpha = 0.5)
输出:
(*每日交易量的规模已缩小,以匹配每日回报规模)
通过将每日交易量(绿色)与每日回报(蓝色)并列,观察到每当股票交易量高时,股票价格就会有相对较高的上涨或下跌,从而导致高回报。因此,在某一天,如果发生非常规的高交易量,那么人们可以预期市场会发生巨大的双向变化。股票交易量与股票价格的涨跌相结合,通常是交易者和投资者对特定公司信心的指标。
7.基于配对图和联合图的股票相关性分析
“永远不要把所有的鸡蛋放在一个篮子里”
每当我们寻求投资组合的多样化时,我们都不希望这些股票相互关联。数学上,任何一对股票之间的皮尔逊相关系数(也叫皮尔逊 R 值)应该接近于 0。背后的想法很简单——假设你的投资组合由高度相关的股票组成,那么如果一只股票下跌,其他股票也可能下跌,你就有可能失去所有投资!
我选择了上述股票进行相关性分析。所有这些股票都来自不同的行业和市值。你可以自由选择你感兴趣的股票。程序保持不变。
在上一节中,我们已经使用了预先下载的 csv 文件进行分析。在这一部分,我们将借助熊猫网络数据阅读器软件包提取股票价格。
# import package
import pandas_datareader.data as web# set start and end dates
start = datetime.datetime(2018, 2, 15)
end = datetime.datetime(2020, 2, 14) # extract the closing price data
combined_df = web.DataReader([‘HDFC.NS’, ‘JINDALSTEL.NS’, ‘JUBLFOOD.NS’,‘SUNPHARMA.NS’, ‘TCS.NS’, ‘^NSEI’],
‘yahoo’, start = start, end = end)[‘Adj Close’]
删除空值并显示前几行—
# drop null values
combined_df.dropna(inplace = True, axis = 0)# display first few rows
combined_df.head()
输出:
(^ NSEI 是国家证券交易所指数——nifty 50 的符号)
接下来,我们将使用 Seaborn pairplot 以成对方式分析不同股票之间的相关性。
# store daily returns of all above stocks in a new dataframe
pct_chg_df = combined_df.pct_change()*100
pct_chg_df.dropna(inplace = True, how = ‘any’, axis = 0)# plotting pairplot
import seaborn as sns
sns.set(style = ‘ticks’, font_scale = 1.25)
sns.pairplot(pct_chg_df)
输出:
请注意,相关性分析是针对股价的每日百分比变化(每日回报)而非股价进行的。
如果仔细观察,下三角形区域中的图与上三角形区域中的图是相同的,只是轴互换了。因此,分析这两组图就足够了。对角线代表直方图,就像上面看到的 HDFC 股票一样。
外卖:
HDFC、金达莱钢铁、喜洋洋食品、太阳医药和 TCS 的股票可以包含在一个投资组合中,因为没有两只股票显示任何显著的相关性。
缺点:
虽然配对图提供了一堆股票之间所有可能组合的非常好的可视化,但它没有提供任何详细的信息,如皮尔逊的 R 值或零假设 p 值来量化相关性。这就是联合阴谋的由来!
虽然 Pair plot 提供了对所有可能相关性的直观了解,但 Seaborn jointplot 提供了每对股票的详细信息,如皮尔逊 R 值(皮尔逊相关系数)。皮尔逊的 R 值范围从-1 到 1。负值表示变量之间的负线性关系,而正值表示正关系。皮尔逊的 R 值越接近 1(或-1)表示强相关,而值越接近 0 表示弱相关。
除了 Pearson 的 R 值之外,联合图还在边缘显示了各自的直方图以及零假设 p 值。
这是一个太阳医药和金达尔钢铁以及金达尔钢铁和 HDFC 股票的联合图表的例子
from scipy.stats import statssns.jointplot(‘SUNPHARMA.NS’, ‘JINDALSTEL.NS’, pct_chg_df, kind = ‘scatter’).annotate(stats.pearsonr)sns.jointplot(‘JINDALSTEL.NS’, ‘HDFC.NS’, pct_chg_df, kind = ‘scatter’).annotate(stats.pearsonr)plt.show()
输出:
外卖:
- 金达尔钢铁公司诉太阳制药公司的皮尔逊 R 值为 0.24,非常小。这表明弱相关性。
- 同样,在 HDFC 诉金达尔钢铁公司一案中,皮尔逊的 R 值为 0.29,表明 HDFC 和金达尔钢铁公司股票之间的相关性较弱。
上述来自联合图的结果为我们提供了数字,以确定我们先前通过目视观察联合图得出的见解。
当心!相关性并不是决定投资组合中包含哪些股票和删除哪些股票的唯一参数。还有其他几个因素在起作用。最好征求专家的意见,做出明智的决定。
9.波动性分析
波动性是金融市场最重要的支柱之一。如果一只股票的价值在短时间内发生剧烈变化,那么这只股票就具有高波动性。另一方面,较低的波动性意味着股票价值在一段时间内趋于相对稳定。这些运动是由几个因素造成的,包括需求和供给、情绪、公司行为、贪婪和恐惧等。从数学上来说,波动性是用一种叫做“标准差”的统计方法来衡量的,这种方法衡量的是资产与其平均值的偏离程度。
我们已经计算了 HDFC 股票和其他几只股票的日内回报。接下来,我们将计算每日回报的 7 天滚动平均值(也称为移动平均值),然后计算标准偏差(即方差的平方根)并绘制数值。放轻松,我们不用手动计算这一切;熊猫的‘rolling()’函数和‘STD()’函数只用一行代码就完成了我们的工作!
HDFC_vol = pct_chg_df[‘HDFC.NS’].rolling(7).std()*np.sqrt(7)
HDFC_vol.plot(figsize = (15, 7))
输出:
接下来我们将看到 HDFC 股票与太阳医药股票和 NIFTY50 指数的比较波动性分析。就像上面一样,我们用一行代码计算 7 天滚动平均值和标准差。熊猫确实使我们的生活变得容易!
volatility = pct_chg_df[['HDFC.NS', 'SUNPHARMA.NS', '^NSEI']].rolling(7).std()*np.sqrt(7)volatility.plot(figsize = (15, 7))
输出:
你可以观察到太阳医药的股票比 HDFC 的股票波动性高,而 Nifty 指数的波动性最小。这是意料之中的,因为阳光医药是一只中型股,与 HDFC 等大盘股相比,中型股通常具有更高的波动性。
许多交易者和投资者寻求更高波动性的投资,以获得更高的利润。如果一只股票不动,不仅波动性低,而且收益潜力低。另一方面,波动性非常高的股票或其他证券可能有巨大的利润潜力,但风险也同样高。
尾注
没有完全可靠的策略可以保证你的投资获利。在现实世界中,交易者在投资前会考虑很多因素。通过使用正确的策略和技术,我们只能增加我们的机会。我期待着在我的后续文章中介绍一些策略技术以及使用 python 的演示。
参考文献:
———————— 免责声明 —本文纯属教育目的,不为任何公司或股票背书。在做任何买卖股票的决定之前,请咨询专家。
————
无需编程的数据分析
如何使用 Excel 分析资产的价格变化
数据分析不一定是硬科学。从业者经常谈论如何看待数据,好像它是精通业务的从业者专有的某种秘密。今天我将向您展示如何使用 Microsoft Excel 来分析价格变化情况。当然,我们可以使用 Python 或其他高级语言,用几行代码来完成。然而,在这里您将了解这些行背后的内容——以及您在那里导入和使用的库。
杰森·斯特鲁尔在 Unsplash 上的照片
你可以阅读这篇文章,也可以把它作为一个教程。不管怎样,我希望它能直观有趣。我将模拟 S&P500 综合指数的价格变化。也就是说,我将向你们展示这些年来间谍百分比变化的分布情况。
用 Excel 分析间谍
首先,我会从雅虎财经下载关于间谍的历史数据。为了准确再现这个实验,你需要使用从 1993 年 1 月 28 日到 2020 年 10 月 3 日的数据,你可以在这里下载数据。如果您使用其他来源或其他时期的数据,您可能会获得稍微不同的结果。
Excel 中的间谍数据截图
打开后。csv 文件,您的数据应该看起来像左边的图像。我们将只使用该数据中的一个字段:Adj Close。通过单击标题并单击删除,可以随意删除列 A、B、C、D、E 和 G。
下一步是计算价格变化百分比®。这样做的公式是 R =(闭-开)/开。
百分比价格变化的 Excel 实现
我已经在左边的图片中包含了 excel 公式。简单地说,我们正在计算从昨天到今天价格变化了多少。
复制整个 B 列的公式,计算我们收集的 6971 天数据的值。接下来,我们将识别包含在我们刚刚计算的变更集合中的唯一值。我们将整个 B 列复制并粘贴到 E 列,我们将使用“数据”菜单下的“删除重复项”工具。
间谍多年来独特的价值观变化。
关于间谍价格的变化,我们已经有了一些有趣的见解。我们知道它在一天内的最大变化是+15%。我们还发现最大贬值幅度为-11%。这些见解带来了一个有趣的问题:“这些变化每隔多久发生一次?”。如果回答了这个问题,我们可以更深入地了解间谍每天的变化模式。
幸运的是,Excel 为我们提供了计算这些值出现次数的公式。=COUNTIF(RANGE,CONDITION)公式计算该范围内满足条件的次数。
计算值-11%发生了多少次
我在左图中演示了 COUNTIF 公式的用法。在那里,我统计了-11%的发生率。
如果我们将该公式应用于所有值,我们将获得刚刚收集的数据中每个值的计数。我们可以计算出每个事件的百分频率。有了这些数据,我们可以制作一个直方图。
价格变化发生概率
现在我们有了更多的见解:
- 有将近 50%的概率价格完全不变。
- 价格上涨 1%的概率高于价格下跌 1%的概率
这个分析有出错的空间:价格上涨 1%的概率是一个 孤立的 概率。这意味着我们刚刚计算了价格增加**1%的变化。更多时候,我们感兴趣的是知道价格会上涨至少 1% 。同样,我们有兴趣知道价格何时会 下降至少 1% 。
为了计算这些合计值,我们可以简单地将相关事件的概率相加。例如,为了计算价格下降至少 10%的概率,我们可以将价格下降 11%的概率和价格下降 10%的概率相加。如果我们用这些计算来填充图表,我们将得到以下结果。
演示孤立概率和聚集概率的电子表格。
我们看到,价格以任何百分比下降的实际概率是 23.3%,而价格以任何百分比上升的概率是 28.4%。我们通过分别将小于零的变化概率和大于零的变化概率相加来获得这些值。为了改进我们的数据可视化,我们还应用了条件格式菜单中的色标。
这个分析可以用来做什么?
像这样简单的分析会非常有用。例如,一些交易者使用潜在的发生概率来运行蒙特卡罗模拟。其他人提供期权,可以奖励他们一个低赔钱概率的溢价。在其他领域,我们可以找到事件发生的潜在概率分布,比如公共汽车通常会晚点多长时间。
如果你喜欢这篇文章,不要忘记关注我,这样当我发布新内容时你会得到通知!你也可以在 Twitter 或 LinkedIn 上关注我。直到下一个帖子!
你能想到上述分析的任何应用吗?你将如何进一步探索它?把它留在下面的回复中吧!
Data Analyst 3.0:数据工作流的下一次变革
随着云原生数据仓库和增强分析的进步,我们正在进入 BI 的第三阶段
像任何好的故事弧一样,自数据分析起源以来,我们已经走过了漫长的道路。BI 的第一阶段始于僵化的 IT 系统。第二阶段随之而来的是一波更加灵活、面向业务的工具,支持更加面向业务的数据分析师思维模式,以及一波漂亮、易于过滤但通常是静态的仪表盘。
如今,随着云原生数据仓库的兴起和可扩展推理方法的进步,我们正处于第三阶段的风口浪尖,这一阶段不仅能提供更好、更快的数据处理,还能让运营数据分析师以前所未有的方式影响业务决策。我把这个阶段称为数据分析师 3.0。
数据分析简史
在我们了解 Data Analyst 3.0 带来的因素之前,让我们先来看看我们已经取得了多大的进步。过去,It 团队中的一个人就可以获得成为“数据专家”所需的所有相关领域和技术技能数据不大也不广,这意味着人们可以获得新的数据技能(Excel、轻量级 SQL、SAS 等。)随着问题的出现,发送一个 CSV 来回答问题的过程运行得很好。
但是,从组织的角度来看,大多数数据请求在 IT 和业务之间的传递中失败了,因为技术人员不知道如何使他们的数据基础结构可供日常 Excel 用户使用。IT 团队提供的查询只能回答关于特定 KPI 的一个问题。这有两个主要问题:
- 一个问题,一个答案。这些问题只有一个答案,避免了大多数业务用户在采取行动前所依赖的那种反复提问。在 1.0 IT 模型中,这意味着每一个新问题都需要排队等待,直到人们完全停止提问。
- **数据和决策之间的鸿沟。**拥有商业知识的人无法参与数据探索过程,而这正是所有发现发生的地方。因此,你得到的只是汇总的 KPI,而不是“啊哈”时刻。
幸运的是,随着更多以业务为中心的数据建模、BI 和可视化工具的兴起,这个系统在过去十年中已经基本消失了。这些现代工具定义了第二波 BI,并帮助 Data Analyst 2.0 成为团队中更加敏捷的成员。
在这些最终用户工具之下,第二波浪潮得到了多个平台的支持,这些平台使从我们存储的大量数据中获取价值变得更加容易。总的来说,这些工具构成了一个现代分析堆栈。
商业智能第二次浪潮的典型分析堆栈
这种分析堆栈的确切演变是一个有趣的话题,但我将把它留到另一篇文章中。
为了有效地导航和维护这个堆栈,企业需要的不仅仅是 IT 团队,因此出现了一些常见的角色:
- 数据工程师负责准备数据。这意味着将不同来源的数据加载到一个数据仓库中,然后将原始数据转换成转换后的表格,以便分析师和数据科学家进行分析。
- 数据分析师负责回答预期(报告)和意外(诊断)的业务问题。
- 数据科学家,他们使用统计算法和 ML 技术来解决重点业务问题(“假设”)。
你可以思考这些角色的区别的一种方式是,他们是在收集数据之前行动还是在收集数据之后行动。数据工程师负责数据收集(和转换)前的运营,分析师和数据科学家负责数据收集后的运营。
你可以思考这些角色的区别的一种方式是,他们是在收集数据之前行动还是在收集数据之后行动。数据工程师负责数据收集(和转换)前的运营,分析师和数据科学家负责数据收集后的运营。
数据分析师是怎么成为二等公民的?
就像谷歌的 Cassie Korzykov 在她的一篇颇有见地的文章中提到的那样,如果你的主要技能最接近数据分析师的技能,那么你很可能会觉得自己的“技术”专长被数据科学同行甩在了后面。就连就业市场也认为数据科学家的角色比你高一级。只有少数人意识到这两种角色完全不同。
数据科学家为特定问题提供高强度的解决方案。如果他们处理的问题不值得解决,企业最终会浪费他们的时间。他们是思想狭隘的工人,所以有必要指出他们需要努力解决的问题。为了确保你很好地利用他们的时间,你需要确定你已经有了正确的问题,或者需要一个广泛而浅显的方法来找到一个。
这就是数据分析师可以帮助企业的地方。数据分析师的主要目标是快速浏览大量数据集,与业务利益相关方保持联系,并挖掘潜在的洞察力。速度是他们的最高美德。结果是:该公司抓住了自己的脉搏,看到了以前未知的未知。这激发了决策者为数据科学家选择最有价值的任务的灵感。
今天的数据分析师工具包:用勺子挖大峡谷
不幸的是,如今许多数据分析师陷入了两难境地。他们坐拥丰富、广泛的数据宝库,但他们经常在总结数据以报告关键指标和深入、全面的指标诊断任务的双重角色之间左右为难。
这些第二波 BI 工具装备精良,可以创建丰富的滚动仪表板来回答“发生了什么”然而,根据我们的经验,在企业需要分析师增加最大价值的精确时刻,这些仪表板往往会出现问题(比如周一早上的会议,销售副总裁问,“为什么上个月 EMEA 的销售额下降了 50%?”).
通常,这是因为这些视图建立在简化的、聚合的数据视图上,这给数据探索和诊断带来了困难。如果只对聚集进行操作,就无法详细探究。创建集合的一部分是预先假定人们会问什么问题——就好像他们是被铸在石头里的一样。因此,数据分析师预先承诺他们希望在仪表板的有限空间中显示的内容。
当然,分析师可以在仪表板上添加“过滤器”或启用“向下钻取”,但随着列和每列中的唯一值的增长,他们可以分割数据的方式也在激增(50 家商店* 100 个 SKUs * 5 个优惠券代码* 20 个城市…你懂的)。这就是为什么自助式分析的梦想被一千个过滤器变成了死亡。
当出现特殊问题时,数据分析师通常会从头开始诊断。这是一个手动过程,涉及 SQL 获取粒度数据,添加相关维度,最后使用 Python/R 挖掘洞察力。这个过程是被动的,每次都需要从头开始,并且阻碍了决策速度。结果:企业最终陷入了与第一波 BI 浪潮相似的境地——企业利益相关者排队买票,这次是为了得到他们“为什么”问题的答案。
Data Analyst 3.0 —自动找到“为什么”
数据分析师需要的是更快、更简单、更全面的方法来构建、监控和诊断精细的高维数据集,这是一种可以快速回答“为什么数据看起来是这样的?”的新范式以及“与上周相比有什么变化?”这种新的范式可以依托两项最新的技术进步:
1。 云原生存储和计算:今天,在云仓库中存储数据不仅比以往任何时候都更便宜,而且从大型平面非规范化表中查询数据的速度比星型模式快 25%-50% *,这要归功于大规模并行处理的进步。基于这一新的现实,分析师需要重新思考他们如何为数据诊断和数据报告建模。
为了快速的数据诊断,每个模型化的表应该绑定到一个值单元。例如,如果企业关心“平均交易值”和“订阅转化率”,那么您会希望分别在交易和用户粒度上创建模型化的表。另一件要记住的事情是数据的多样性。你应该在这些粒度表中包含每一个可能的维度,而不是挑选维度,这会导致人为偏见,并删除数据中可能的丰富信号。作为一名数据分析师,您并不知道您将被要求调查的所有后续问题,并且您希望能够追踪线索到任何地方。即使汇总导出可以回答您今天的顶级问题,相同的导出也不太可能回答您的后续问题。
2。主动分析方面的进步:分析师现在可以依靠【Sisu 等工具中可扩展推理方法的最新算法发展来探索数十亿个组合并确定最具影响力的事实,而不是手动使用仪表板过滤器和钻取来挖掘大表格中的见解。然后,由数据分析师根据他们能够获得的其他信息(如公司战略、业务背景和市场条件)来选择最佳答案。
在上面讨论的功能丰富的大表之上添加这种主动、自动的推理,使数据分析师能够:
- 快速回答因您的综合 BI 数据而产生的特别问题,并以同样的努力多回答 10 倍的问题。
- 让机器监控的智能警报处于自动驾驶状态,让他们高枕无忧,因为他们掌握着业务的脉搏,永远不会错过潜在的有用信息。
重要的是要记住,这个诊断数据层的目标不是取代 BI 工具,而是增强它。诊断数据层是智能“检查引擎”灯,以补充您的“速度表和煤气表”BI 仪表板。
一窥数据分析师的未来
这些进步从根本上改变了数据分析师在公司内部的工作方式。他们参加每周的业务会议,介绍所发生的事情(“照常营业”)和,分享业务的前瞻性解决方案。这个新发现的权威的中心是一个人工智能驱动的工作流程。
我们,Sisu 的,正在利用这些在数据仓库、数据建模和人工智能方面的进步,并为像三星、 Upwork 和 Housecall Pro 这样的公司的分析师工作流程增压。这种转变一开始可能会有点吓人,但问问那些正在取得成功的公司,它们的情况如何。他们会告诉你他们感觉很好。
如果你想分享你对这篇文章的想法,或者想了解更多,请直接给我写信,地址是 sid@sisudata.com。
*five tran,2020。已检索,2020 年 6 月 30 日
本帖原载于 Sisu 数据博客 。
数据分析师墓地——死亡和绝望之谷
这篇文章讲述了为什么数据分析师的工作会失去意义。
数据分析师的坟墓。来自 Unsplash 的肯尼·奥尔的照片。
在我最近的帖子 数据分析师入门 中,我详细阐述了对数据分析师的需求是如何增长的,并强调了你可以采取的步骤,以获得第一份入门级工作。
今天这篇文章的目的是提供一个不同的视角,一个悲观的观点来讨论为什么数据分析师的工作会感觉没有意义。
通常,对理想工作的期望会欺骗我们。分析师不得不承担大量令人不快的责任,将看似理想的职业与实际情况区分开来。
数据分析师的邓宁-克鲁格效应
缺乏技能和意识:难以认识到自己的无能导致自我评估膨胀。
邓宁-克鲁格效应图。图片作者作者。
正如任何让你兴奋的闪亮的新技能或激情一样,通过谷歌搜索和在网上进行广泛的研究,你很容易对一个话题感到自信。新的分析师遇到了这个问题,他们对自己能够在组织中贡献的价值有着极高的期望。
这只是邓宁-克鲁格效应的另一个例子;缺乏工作经验导致对自己产生影响的能力过于自信。
绝望之谷
在埋头苦干并获得工作经验后,他们是否开始明白并不全是彩虹和阳光。无数的障碍出现了;没完没了的数据请求,缺乏分析的严谨性,非技术型的管理者,应有尽有。
新分析师由于粉碎的期望而陷入绝望的低谷,无法爬上开悟的斜坡。一种恐惧感开始袭来。然后你会怀疑这到底是不是适合你的职业。
坠入绝望的山谷。豪尔赫·依班娜在 Unsplash 上拍摄的照片。
你并不孤单。成为一名分析师可能是一份艰难且没有成就感的工作,通常是一个没有太多自主权的初级角色,你要工作 1-2 年才能找到更好的工作。
没有一份工作是没有起伏的,作为一名数据分析师也不例外。会有你喜欢的事情,也会有让你好奇的事情…为什么我会在这里?
组织层次结构
首先,你必须了解你在这个世界上的位置,才能理解为什么会出现这些问题。
**技术领域工作不如意的根本原因通常是职业目标错位。**加入一个不能提供你渴望的成长的错误团队,你会觉得自己的职业停滞不前,很快就会失去目标。
作为分析师,您的职责会有所不同,这取决于: (a) 数据团队是集中的还是分散的 < y 轴> ,以及****(b)**您的团队/经理优先考虑哪些能力 < x 轴>。
数据分析师—四个象限。图片由作者提供。
这些部门并不相互排斥,因此您可能会发现自己同时承担着分析工程师和 XFN 支持分析师的职责。选择一个不适合你职业抱负和技能发展的职位,意味着你在公司的时间会更加痛苦。
跨职能(XFN)支持分析师—集中的支持人员
集中式数据团队雇佣分析师作为集中式资源。分析师作为支持人员跨职能部门或产品团队工作。
到目前为止,这是希望投资数据分析的公司最常见的招聘方式。这并不奇怪,因为这是最具成本效益的选择,尤其是如果数据团队尚未证明其在发现业务洞察力方面的价值。
这个想法是雇佣一个或多个分析师同时接受来自多个团队的请求,如下图所示:
跨职能(XFN)支持分析师。图片来自作者。
集中式数据团队对他们的分析师拥有完全的控制权和治理权,但是将他们分配给组织内的其他团队。因此,这些分析师直接向分析经理报告,同时向他们支持的其他团队成员报告。
一些公司在团队之间轮换他们的分析师,这样工作不会变得乏味,而拥有更多分析师资源的大公司将提供较少的业务职能之间的流动性。
优先考虑的能力包括软技能,如 影响力、讲故事、沟通和数据可视化。
统计知识和编程之类的技术技能很重要,因为它们有助于实现特定的业务目标,例如,找到杠杆来增加 xx%的收入。
出色的 XFN 支持分析师:
拥有商业和技术技能,但不确定自己的职业发展方向?这是最适合你去发现的角色。XFN 支持分析师满足了他们为不同团队分析数据的好奇心。
为商业领袖处理数据,吸收他们在某个特定领域的知识,是你找到自己想要专攻的业务领域的敲门砖。
另一方面,你可能会在探索之后决定更喜欢发展你的技术技能。因为您直接向分析经理汇报,所以有机会获得发展技术技能的机会,并成为高级数据分析师,指导其他初级员工。
就灵活性而言,这个角色是你职业生涯的最佳选择。它允许自由探索,而不会过早地将自己束缚在某个职业轨道上。
导致 XFN 支持分析师失去目标感的场景:
- 领域知识薄弱。分析师对问题的直觉有助于人们在杂乱的数据海洋中找到信号。然而,你的直觉可能不如职能领导发达,任何建议或见解都会被质疑和拒绝。分析师最终会回答业务用户提出的问题。分析师最终成为一只报告猴子 (见第 2 点) 。
- ***举报猴。*报告猴子响应数据请求,编写查询,为技术含量较低的业务用户构建仪表板。他们对 KPI 和部分业务的运行方式没有任何所有权,只是根据需要更改 SQL 或编程逻辑来回答另一个部门抛给他们的问题。
- ***缺乏分析的严谨性。*企业优先考虑快速行动和采取行动。因此,您将不可避免地简化统计概念,以便业务用户理解和接受您的分析。越复杂的分析,即使是完全合理和科学准确的,也很可能作为存档的建议被抛弃,这对于一些人来说是难以接受的。
- ***非技术利益相关者。*当业务领导要求刷新仪表板时,或者由于业务逻辑的变化导致数字不正确时,分析师必须全力以赴,手动强制自动刷新,并充当 IT 支持,完全由业务领导随心所欲。例外的是产品经理,他们通常更擅长技术,了解批处理和实时数据管道的局限性。
- 技术技能停滞。 XFN 支持希望在技术领导力方面有所发展的分析师关心如何利用技术高效地做事。示例包括编写高性能 SQL、版本控制以及使用各种工具和数据库。作为一名年轻的分析师,如果你的分析经理不重视你的技能发展,你可能会也可能不会有这样的机会。
职能分析师——在业务领导的直接领导下工作
不属于集中数据团队的数据分析师直接向职能部门主管报告。职能部门主管或产品经理可以自由聘用他们自己的分析师,并对他们的发展承担全部责任,如下图所示:
功能分析师组织图。图片来自作者。
*如果你发现自己想要发展技能,并且经常使用新工具和新技术,**离开。立刻。*担任这种角色的分析师如果希望提高自己的技术技能,将会经历 XFN 支持分析师的所有痛苦,甚至更多。
这些角色并不强调技术专长,相反,他们的座右铭是快速行动,找到为企业创造最大成功的见解。
像这样的角色优先考虑的能力是类似于 XFN 支持分析师的软技能,但是技术知识可以退居二线。
因此,招聘的技术技能门槛低于 XFN 支持分析师。职能分析师应该是雇用他们的各自业务职能或产品团队的主题专家。
擅长职能分析师的分析师:
功能分析师是他们领域的专家。他们来自各种各样的背景,并在他们选择的领域磨练了他们的直觉,知道在杂乱的数据海洋中去哪里寻找洞察力。
如果你擅长说服和简化复杂问题的艺术,使用普通的结构化框架 (80/20 原则、四象限、公式、维恩图) ,你会觉得在这个角色中如鱼得水。
功能分析师更像艺术家,而不是科学家。他们擅长预测各自的经理会对哪些数据感兴趣,并采取行动。他们很有说服力,让复杂的概念对日常的商业领袖来说很容易理解。
他们还拥有一套特定于其领域的技能,这使他们能够更有效地跟上速度和推动业务影响。例如,营销分析师应该对谷歌分析平台 SEM 有专门的了解,并了解营销团队跟踪的常见 KPI。
导致职能分析师失去目标感的场景:
为了不重复我自己的话,我假设如果你得到了这个职位,你希望磨练自己思考商业的技能,并拥有敏锐的商业思维。
还是那句话,如果你有增长技能的雄心,那就马上离开。
- 集中职能分析师。为了节省成本,组织可以选择为一个业务职能 (如运营) 雇用分析师,并像上一节中描述的集中式数据团队一样运营。然后,功能分析师同时承担支持其他业务功能的责任。在这些场景中,职能分析师将经历 XFN 支持分析师所经历的第 1、3、4 点。**
- 分析麻痹。对于功能分析师来说,数据不是一种完全探索问题空间的方法,而只是一种讲述故事和检查他们直觉的方法。这未必是一件坏事。由于时间限制,检查每一列的洞察力和混杂效应是不切实际的。当分析师的直觉与经理的直觉相差甚远,以至于整个分析需要重新进行,导致多轮返工时,问题就出现了。这可能导致分析瘫痪,特别是如果分析师正在为长期战略规划做研究。
分析工程师—集中的技术专家
当需要一个更加可控的环境来进行数据分析时,专注于技术专业知识的集中团队中的数据分析师就会加入进来。
分析工程师引入工具、技术和代码实践 (数据管道测试、表命名约定、代码评审) 使其他分析师更加高效,他们的输出值得信赖。然而,这些角色并不多见,只是最近才作为 Fishtown Analytics 的革命性开源工具 dbt 出现。
优先考虑的能力包括 dbt、Gitlab、高级 SQL 知识、Python、Airflow、Fivetran、Stitch、ETL。
如果你发现自己厌倦了这样的角色,并希望与业务部门更紧密地合作,你可以成为一名分析经理,或者回到支持业务职能的分析师岗位。
擅长分析工程师的分析师:
如果你有办法让分析师的工作流程更有效率,并且关心自动化、版本控制和良好的文档等概念,你将会在这样的角色中表现出色。
分析工程师通常希望成长为强大的技术领导者,并喜欢使用新的创新工具和技术,而不太关注业务的底线。
导致分析工程师失去目标感的场景:
- ***缺乏商业影响力。*分析工程师在组织中的价值在于,他们能让周围的其他分析师更好、更高效地工作。这可能导致他们远离业务,以至于他们的工作在业务 KPI 上缺乏目的和意义。
- ***没有得到商业利益相关者的认可。*商业领袖通常看不到分析工程师的直接产出,因为他们不是深入分析商业问题的人。这可能会让人觉得分析工程师没有给公司增加任何价值,其他分析师得到了所有的荣誉,而分析工程师在后台默默工作。
数据分析师在组织内没有任何自主权。
数据分析师缺乏自主权。照片由诺亚·布舍尔在 Unsplash 上拍摄。
上述所有角色都有一个共同点,那就是缺乏自主性。
数据分析师很少能够领导数据驱动的变革,他们只是在构建别人认为是必须的分析和仪表盘。
数据分析师所能做出的最令人窒息的行为,就是完全按照更高权威的突发奇想来构建分析和报告。
分析师基本上是处于更高权力位置的人的直接支持人员。因此,他们对他们支持的业务功能的 KPI 没有决策权或所有权,没完没了地响应用户或管理人员的请求。
此外,对于你的分析是否被使用或被执行,你没有发言权。仅仅为了满足别人的好奇心而研究别人提出的问题的答案,可能是分析师所能做出的最没有灵魂的行为。
这就是为什么分析师通常被聘用在初级职位,只需要 1-2 年的经验。把刚从学校毕业的人塑造成你心目中的理想分析师更容易。
避免导致失去目标的场景
数据分析师失去目标。公路旅行照片,Raj 在 Unsplash 上。
尽管掌握了这些知识,我们还是无法避免上述所有情况。我们能做的是通过不担任与我们的职业发展预期不一致的角色,将噩梦场景最小化。
如果你不确定该何去何从,可以在一位关心你的成功、经验丰富的分析领导者手下跨职能工作。
对企业的特定功能感兴趣?寻找你尊敬的商业领袖,作为一名职能分析师跟踪他们。
或者,如果你只是喜欢技术,那么分析工程是你的职业道路。
在你加入任何组织之前,做一些调查,在面试阶段问一些关键问题,让你深入了解你将共事/支持的经理和同事,以及你可以学到的技能。确保它们符合你的职业发展预期。
- 这个职位优先考虑哪些技能?
- 我将与哪些职能团队一起工作/支持哪些职能团队?
- 数据团队结构是什么样的?
- 谁是我的经理和利益相关者?
您会发现,在寻求实施数据战略时,公司会利用我们讨论过的各种结构。
在同意一家公司之前,知道你向谁汇报,你服务的利益相关者,以及你可以向谁学习。如果公司不能提供你想要的成长,你会很痛苦,噩梦似乎永远不会结束。
隧道尽头的光
然而,并非所有的希望都破灭了。如果你坚持几年,你可以进入更高级的职位,在那里你有责任监督其他分析师,拥有数据平台的整个部分,或者如果你成为业务经理/领导者,负责特定的业务 KPI。
在这些角色中,你有空间支持自己的想法,并在组织中发挥杠杆作用,以你认为合适的方式将事情变得更好。
初级分析师在工作几年后,与现实达成妥协,学会妥协,就像邓宁-克鲁格一样,可以从绝望的山谷中崛起,站在美丽的高原上俯瞰地平线。
俯瞰地平线的高原。帕斯卡尔·阿梅兹在 Unsplash 上拍照。
数据分析师、数据科学家和机器学习工程师有什么区别?
以田径运动会为例,探究这些常见职位之间的区别。
本文使用跟踪团队的比喻来区分数据分析师、数据科学家和机器学习工程师的角色。我们将从进行数据科学项目类似于跑接力赛的想法开始。希望这个类比能帮助你在教育、工作申请和项目人员安排方面做出更明智的选择。
🔵数据分析师
数据分析师能够从“起点”获取数据(即从存储中提取数据),进行数据清理和处理,并创建仪表板或报告等最终产品。数据分析师还可能负责转换数据以供数据科学家使用,这是一项我们稍后将探讨的任务。
数据分析师能够跑半圈
你可能会说,数据分析师非常有能力跑完比赛的第一部分,但不会跑得更远。
🔴数据科学家
数据科学家拥有数据分析师的所有技能,尽管他们可能不太精通仪表板,可能在报告写作方面有点生疏。不过,就应用统计方法创建复杂数据产品的能力而言,数据科学家比数据分析师跑得更远。
数据科学家能够跑完整圈…
这位数据科学家能够跑完整圈。这意味着他们拥有查询数据、探索特性以评估预测能力、选择合适的模型进行训练和测试、进行超参数调整,以及最终获得通过分类或预测提供商业价值的统计驱动模型所需的技能。然而,如果组织让数据科学家承担所有这些职责(从数据接收到数据建模),数据科学家将无法像只被要求跑完比赛的第二部分(专注于数据建模)那样跑得很好。
…如果数据科学家只负责跑完后半程,他会跑得更快
总的来说,如果业务分析师执行查询和数据清理步骤,允许数据科学家专注于统计建模,团队的绩效将会提高。
🔶机器学习工程师
机器学习工程师可以被认为是团队的秘密武器。你可能会把 MLE 理解为设计运动鞋的人,这种鞋能让其他跑步者以最高速度比赛。
机器学习工程师是一个多面手,能够开发先进的方法
机器学习工程师也可能专注于为数据科学团队带来最先进的解决方案。例如,与数据科学家的经典统计方法相比,MLE 可能更专注于深度学习技术。
机器学习工程师把它带到了一个新的高度。安德里亚·皮亚卡迪奥(Andrea Piacquadio)在像素上拍摄的照片。
随着统计学成为 Python 和 r 中易于实现的包的领域,这些职位之间的区别越来越模糊。不要误解我——对统计测试的基本理解在这个职业领域仍然是最重要的。然而,随着越来越多的频率,企业数据科学家被要求执行由深度学习驱动的模型。这是指由基于 GPU 的计算支持的数据科学领域,其中典型的模型包括神经网络,如 CNN、RNNs、LSTMs 和 transformers。
谷歌大脑、 OpenAI 和 Deep Mind 等公司的机器学习研究人员设计新的算法方法,以在特定用例上实现最先进的性能,并最终实现构建人工通用智能的目标。
🚌ML 操作
另一个与数据科学相关的职称是 MLOps。这指的是生产模型的责任——换句话说,创建最终用户可以访问的模型版本。MLOps 专注于创建从数据摄取、预处理到模型推断(即,在现实世界中用于进行分类或预测)的强大管道。这个角色的职责与软件开发中 DevOps 从业者的职责密切相关。
MLOps 是公共汽车司机,负责把每个人送到田径运动会
摘要
我们探索了数据分析师、数据科学家和一些与机器学习相关的职位的职称,使用了跟踪团队的比喻。在将干净的数据传递给数据科学家进行建模之前,数据分析师可能会启动中继。机器学习工程师就像一个经验丰富的教练,专门从事深度学习。最后,MLOps 实践者就像负责带领团队参加田径运动会的公共汽车司机。
这是我在数据科学小组会议上笨拙地解释这些想法的一个短片。
关于另一个提升你的数据科学技能的视频,请查看我的关于在 Google Colab 中使用 Python 处理 GIS 数据的教程。
数据分析|大数据|案例研究:大数据的 V
我们来试着理解一下“大数据”中的大是多大!!
卢克·切瑟在 Unsplash 上的照片
大数据
术语“大数据”看起来是非常模糊的相对术语。所以还是用它不是什么来定义比较好。大数据不是常规数据。大数据不是常规业务数据。大数据不是一个经验丰富的数据分析师可以随时处理的事情。大数据不太适合熟悉的分析范式。大数据不适合 Excel 电子表格。大数据可能不适合你的普通电脑硬盘。
Doug Laney 在 2001 年的一篇关于大数据的文章中写道,描述大数据的方法之一是通过查看 的三个 V的量、速度和多样性。
卷
大数据是指那些太大而无法在你的电脑上运行的数据。
摩尔定律的一般观点,计算机科学中一个众所周知的观察结果,即计算机的物理容量和性能大约每两年翻一番。这意味着在某个时间对一个系统来说很重要的东西在另一个时间对另一个系统来说却很平常。
https://www . mental loss . com/article/22332/was-Moores-law-accredible
例如,在 Excel 中,单个电子表格中的最大行数随着时间的推移而增加。之前是 65000。现在超过了一百万,这看起来很多,但是如果你记录的是每秒钟发生数千次的互联网活动,那么一百万行可以很快达到。
另一方面,如果我们考虑照片或视频,我们需要立即将所有信息存储在内存中,这将是一个完全不同的问题。一般来说,手机拍摄照片的速度是每张照片两三兆字节,拍摄视频的速度是每分钟 18 兆字节或每小时 1 千兆字节。对于高质量的摄像机,它可以达到每分钟 18g。很快它就变成了非常大的数据。
现在,有些人称之为大量数据,意思是这和我们通常习惯的数据是一样的,只是多了很多。这就涉及到速度和多样性的问题。
速度
对于速度而言,大数据是指数据以极快的速度流入。
在传统的科学研究中,从 200 个案例中收集数据可能需要几个月的时间,分析数据需要几周的时间,而发表研究则需要几年的时间。这种数据不仅收集起来很费时,而且一旦输入,通常也是静态的,不会改变。
作为一个例子,也许最熟悉的用于教授统计程序聚类分析的数据集是 Edgar Anderson 收集并由罗纳德·费雪分析的 Iris 数据,两人都在 1936 年发表了他们的论文。这个数据集包含四个测量值:三种鸢尾的花瓣和萼片的宽度和长度。它有大约 150 个案例,这个数据集每天都在使用。它是统计编程语言 R 中内置的数据集之一,近 80 年来没有改变过。
在天平的另一端,如果你对使用社交媒体平台的数据感兴趣,比如 Twitter,事实上,现在他们每秒钟在全球范围内处理超过 6000 条推文。这相当于每天大约 500,000,000 条推文,每年大约 200,000,000,000 条推文。事实上,一个简单的方法就是在网上设置一个实时计数器。在互联网直播统计中,它向我们展示了今天到目前为止大约有 355,000,000 条推文被发送,并且它们更新得非常快。即使一个简单的温度传感器通过串行连接连接到 Arduino 微处理器上,一次只发送一位数据,如果运行足够长的时间,最终也会淹没一台计算机。
https://www.internetlivestats.com/twitter-statistics/
现在,这种不断涌入的数据,更好地称为流数据,给分析带来了特殊的挑战,因为数据集本身是一个移动的目标。至少对于静态数据用户来说,流数据的要求和复杂性是非常令人望而生畏的。
品种
Forester Research 最近的一项研究表明,多样性是引领公司采用大数据解决方案的最大因素。
现在我们来看大数据的第三个方面,多样性。例如,多样性在这里的意思是,它不仅仅是电子表格中格式良好的数据集的行和列。相反,我们可以有许多不同格式的数据手册。我们可以有非结构化的文本,比如书籍、博客文章以及新闻文章和推文的评论。一位研究人员估计,80%的企业数据可能是非结构化的,因此这是常见的大多数情况。这也可以包括照片、视频和音频。类似地,数据集包括像网络图数据这样的东西,这就是社会关系数据。或者如果在所谓的 NoSQL 数据库中处理数据集,你可能会有社交关系的图表。它也可能有层次结构和文档。
不适合传统关系数据库或电子表格的行和列的任何数量的数据格式,那么它将面临一些非常严重的分析挑战。
结论
我们必须同时拥有三个 V——数量、速度和多样性,还是只有一个 V,才能拥有大数据?
这可能是真的,如果你同时拥有这三个 V,那么你就拥有了大数据,但其中任何一个都可能超出数据的标准方法。大数据意味着我们不能使用标准方法来处理它。因此,大数据会带来许多特殊的挑战。
参考
[1]兰尼博士,2015 年。大数据的 10 大愿景和战略问题。Gartner 博客。
[2]s . Sagiroglu 和 and Sinanc,2013 年 5 月。大数据:综述。在 2013 年国际协作技术与系统会议(CTS) (第 42–47 页)。IEEE。
数据分析|数据分析|用例研究:投资数据
使用投资数据用例解释许多数据分析项目中涉及的主要阶段之一“数据剖析”。
D 数据概要分析是一个审查数据的过程,目的是更好地理解数据的结构、内容和内部关系,从而实现更高的数据质量。
数据分析在以下方面非常重要:
- 数据仓库和商业智能(DW/BI)项目。
- 数据迁移项目。
- 源系统数据质量项目。
没有正确格式化、标准化或与数据库的其余部分正确集成的数据可能会导致延迟和问题,从而导致错失机会、迷惑客户和错误决策。
让我们试着用通俗的语言来说这个吧!!
现在,让我们假设你正在为你的家人和同事举办一个晚宴。去买杂货,开始为晚餐准备食物。首先,你要试着列出可用的食品杂货,并根据将要到来的客人数量、儿童和成人的数量、素食者和非素食者的数量等来描述所需的食品杂货。这个清单除了数据分析外什么都没有,总可存储杂货是数据存储基础设施,总可用杂货现在将是数据库或数据仓库。
数据分析的类型
1.结构发现
克林特·王茂林在 Unsplash 上拍摄的照片
结构发现有助于确定数据是否一致以及格式是否正确。它使用基本统计数据来提供有关数据有效性的信息(如总和、最大值)。结构发现有助于了解数据的结构化程度,例如,pin 码的位数不正确的比例是多少。
2.内容发现
内容发现关注数据质量。数据需要及时有效地格式化、标准化,并与现有数据正确集成。例如,如果电话号码的格式不正确,这可能意味着无法联系到某些客户。
3.关系发现
裘德·贝克在 Unsplash 上的照片
关系发现识别不同数据集之间的连接。发现数据的各个部分是如何相互关联的。例如,数据库表之间的键关系,电子表格中单元格或表之间的引用。理解关系对于重用数据至关重要。应该通过保留关系来导入相关的数据源。
数据剖析技术
1.列剖析
列分析扫描整个表,并计算每个值在每列中出现的次数。这种方法有助于发现一列数据中的频率分布和模式。
2.跨列剖析
跨列分析由两个过程组成:键分析和依赖性分析。键分析通过搜索可能的主键来检查属性值的集合。相关性分析是一个更复杂的过程,它确定数据集中是否嵌入了关系或结构。这两种技术都有助于分析同一个表中数据属性之间的依赖关系。
3.跨表剖析
跨表分析使用外键分析来检查不同表中列集的关系,外键分析是对孤立记录的识别以及语义和语法差异的确定。这有助于减少冗余,还可以识别可以映射在一起的数据值集。
4.数据规则验证
数据规则验证以主动的方式使用数据分析来验证数据实例和数据集是否符合预定义的规则。这个过程可以通过批量验证或持续验证服务来实现。
数据分析工具
开放源码
- Talend 开放式数据质量工作室
- 聚合分析器
- Quadient 数据清除器
商业
- 信息科学中的数据剖析
- Oracle 企业数据质量
- SAS 数据流
用例
背景
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
股息增长型投资已经存在了很长时间,并且一直是一种广受欢迎的获得被动收入的方式。与任何其他投资一样,需要做出选择股票的详细决策。和其他投资一样,风险越高,潜在回报也越高。这个数据集应该支持由数据驱动的投资组合选择的决策。
数据是使用 API 对 robinhood.com 所有可交易工具的快照。分析数据后可以解决的一些情况可能是“哪些股票确实具有最好的风险/回报比?”
投资数据集列描述
要求
交易经纪公司的数据治理部门希望基于这些数据构建报告和分析。因此,作为第一步,他们希望评估接收数据的质量。
他们想要回答的一些问题如下:
- 数据集的所有列都填充了有效数据吗?
- 特定属性的取值范围是什么?
- 属性中特定值出现的频率是多少?
解决方案设计
我们使用 Talend Open Studio for Data Quality 对 CSV dump 生成的数据集进行数据剖析(您可以按照提供的 GitHub 链接中的步骤生成数据集)。
使用 Talend 可以完成许多不同类型的分析,但是我们将自己限制在这个简单的数据集上,其中大多数分析是柱状的。
我将尽可能用投资数据集的分析来解释每一部分。
Talend Open Studio 提供不同类型的数据质量分析|按作者分类的图片
结构分析
本节中可用的分析返回数据库内容的概述。它们为每个目录和/或模式等计算表的数量和每个表的行数。他们还计算索引和主键的数量,等等。
这将帮助您一目了然地看到哪个数据库包含的数据最多,哪些表是空的等等。
交叉表分析
该分析研究了几个表格。冗余分析是您想要检查两个表之间的关系的一个例子(也可以用作外键发现)。
表格分析
分析颗粒是行。例如,您想知道几行是否相同或相似。这将所有分析分组到“表格分析”文件夹下。行是属于所有列的一组单元格。在这种分析中,行是您分析的不可分割的元素。studio 允许用户选择关注哪些列。这里,您做了一个“部分”表分析,不可分割的元素不是一个完整的行,而是一组单元格(属于几列,但不是所有的列)。这种分析使您能够在选定的表上应用数据质量规则(DQ 规则)。
请注意,您可以创建 DQ 规则,并在稍后的分析准备阶段将它们分配给所创建的分析。
列分析
本节中的分析使您能够以列为基础分析数据。所有指标都是针对单个列计算的。与 excel 文件类似,焦点是一列并分析该列的每个单元格。
您可以从一个空的色谱柱分析开始,在这里您可以手动定义所有的设置,或者您可以使用一些预定义的分析,这些分析使用一组根据焦点选择的指示器。
或者,您可以使用语义感知分析向导,根据语义存储库中收集的信息自动配置列分析。以下是不同类型的列分析:
1.基本列分析
该向导生成一个空列分析,并打开分析编辑器。然后,您可以选择要分析的列,并在每个列上手动分配指标,例如空值数量、频率表、汇总统计、模式匹配指标等。
专栏“符号”|作者图片的基本专栏分析
2.名义值分析
这种分析使您能够分析名义数据。它创建了一个列分析,其中配置了适用于名义数据的指标。这种分析使用频率表和文本相关指标。
专栏“简单名称”|作者图片的标称值分析
3.离散数据分析
这种分析使您能够分析数字数据。它创建一个列分析,其中配置了适用于数字数据的指示器。这种分析使用 Bin 频率指示器,您可以进一步配置该指示器,以便根据您的需要离散化数据。
列“日交易比率”的离散数据分析图片作者
4.汇总统计分析
这种分析使您能够分析数字数据。它创建一个列分析,其中汇总统计指标自动添加到数字列中。这有助于您通过计算范围、四分位数范围以及平均值和中值来了解数值数据的形状。
“pe_ratio”栏的汇总统计分析 |作者图片
关联分析
此文件夹中的分析是探索性分析。它们帮助您探索列之间的关系,并可能帮助您发现数据中的其他质量问题。
结论
通过进行如上所示的分析,可以记录数据分析结果。稍后可以对其进行分析,以实现开发数据分析平台的复杂转换。
参考
Kaggle.com(2020 年)。股息增长投资数据。[在线]请访问:https://www . ka ggle . com/jonnylangefeld/dividend-growth-investment-data【2020 年 1 月 29 日访问】。
洞察,S. (2020)。什么是数据概要分析,它如何让大数据变得更简单?。[在线]Sas.com。可从以下网址获取:https://www . SAS . com/en _ au/insights/articles/data-management/what-is-data-profiling-and-how-it-make-big-data-easy . html【2020 年 1 月 29 日获取】。
电子商务零售中的数据分析
电子商务不是蛋糕上的樱桃,而是新蛋糕
电子商务零售中的分析概念和应用,带有简单的演示和有趣的业务示例
[## 听听这篇文章。
▶](https://app.blogcast.host/embedly/2464)
简介
最近,我帮助高露洁棕榄公司优化了亚马逊网上目录的产品策略。我应用数据科学方法来预测电子商务销售,预测产品的盈利能力,并优化公司的利润。最后,该项目获得了公司电子商务洞察和分析团队的认可。
本文是通过该项目获得的经验和知识的延伸。我将探索数据分析在电子商务零售业中的不同应用途径,尤其是像联合利华、雀巢、P&G 等跨国消费品公司。我会用我标志性的简单易懂、易读的方式来做这件事。
用联合利华全球电子商务副总裁克莱尔·亨纳的话说,
“电子商务不再仅仅是面向未来的渠道。未来就在这里。”
我喜欢数字。所以,我先说一些数字。
2020 年第二季度,美国零售电子商务销售额从第一季度的 1604 亿美元飙升至 2115 亿美元。由新冠肺炎引起的封锁无疑促进了电子商务销售的增长。克莱尔说的很有道理,
“许多人都是第一次来网上购物,这推动了渗透率的上升。”
让我们看看过去 5 年中 Q2 电子商务销售额占美国零售总额的百分比,这样你就能很好地感受到电子商务潜力的增长。
图 1:过去 5 年,Q2 电子商务销售额占美国零售总额的百分比(图片由作者提供)
此外,到 2024 年,美国电子商务销售额将超过 1 万亿美元,占零售总额的 18.1%。
让我们来看看 2020 年迄今为止顶级 CPG 公司的表现,与去年相比,电子商务销售额占零售总额的百分比份额。
图 CPG 公司电子商务销售额占总零售额的百分比(图片由作者提供)
所以,现在你知道公司被赋予促进他们的电子商务销售的重要性。
现在,让我们深入探讨分析在帮助消费品公司扩大电子商务销售方面具有巨大潜力的不同途径。
1。产品推荐
米凯拉·安波洛在 Unsplash 上的照片
你还记得你去百货商店的时候,友好的店主或店员在整个购物过程中帮助你吗?他知道你买的食物,你买的洗衣粉,或者你孩子喜欢的冰淇淋。他知道你的购物预算,并会提出建议。你最终还是买了他多次推荐的东西。不是吗?
这种与客户的关系正是公司所需要的。
产品推荐引擎是解决方案。什么是推荐引擎?
它只是“友好的店主”的自动化形式。它是一种使用机器学习算法向客户推荐他们可能感兴趣的产品的工具。这些建议可以通过以下渠道提出:
- 在网站内
- 电子邮件活动
- 在线广告
推荐引擎有两种类型:
a)非个性化推荐引擎:
这对于在不使用客户数据的情况下通过欢迎电子邮件或批量时事通讯发送建议非常有用。以下是一些有用的类别:
- 新产品,比如最近推出的一款新巧克力冰淇淋
- 潮流产品像一个快速销售的咖啡品牌,以帮助招募新客户
- 滞销产品比如打折的豪华香皂
b)个性化推荐引擎:
这是金子!它使用客户数据来推荐最佳优惠和促销。它使用深度学习算法和自然语言处理(NLP)来使客户体验尽可能个性化。这些算法使用来自以下领域的数据:
- 购买历史
- 最近的活动
- 在线行为
- 社交媒体浏览
这些算法非常强大,可以通过以下方式极大地促进电子商务销售:
- 提高转化率
- 增加客户的平均购买价值
- 降低跳出率和购物车废弃率
以下是目前亚马逊的推荐引擎给我展示的内容。看起来它知道我喜欢锻炼。
图 3 亚马逊推荐引擎(图片由作者提供)
麦肯锡报告称,顾客在亚马逊上购买的东西中,有 35%来自基于这种算法的产品推荐。
2。 购物篮分析
在 Unsplash 上由 Charisse Kenion 拍摄的照片
购物篮分析是一种识别一起购买的一对/一组产品之间关联强度的技术。简而言之,它基于这样一个概念:如果客户购买了一种产品,他们或多或少会购买另一种相关产品。购物篮分析也使用机器学习/深度学习算法,如产品推荐引擎。
我将用我前面提到的高露洁-棕榄公司项目中的一个例子来解释这一点。我将一款儿童牙刷(无利可图的产品)与一款除臭剂、一款爸爸的产品(快消产品)捆绑销售,能够将组合的周总利润提高 8%。
关联规则学习 是一种用于发现产品之间关联的机器学习方法。它不考虑购买产品的顺序。让我用一个演示来解释一下。
该分析是对数百万个篮子进行的,但我将用 7 个篮子进行演示,并解释所使用的 3 个重要指标。让我们探索一下洗发水和护发素之间的联系(第 1 栏):
图 4 CPG 电子商务商店上的七篮子顾客(图片由作者提供)
a)支架
**定义:**包含产品 x 和 y 的交易数量占交易总数的百分比
**业务含义:**表示两种产品一起购买的频率。
The association rule {shampoo} => {conditioner} has a support of 0.71 → Both products are bought together in 71% of the transactions
b)信心
**定义:**包含产品 x 和 y 的交易数与包含产品 x 的交易数之比
**业务含义:**表示关联规则为真的频率,即两种商品一起购买的频率。
The association rule {shampoo} => {conditioner} has a confidence of 0.83 → 83% of the times the customer buys shampoo, conditioner is bought as well
c)提升
**定义:**Lift 是置信度与预期置信度的比值。预期置信度就是产品 y 在篮子里的概率。
**业务含义:**规则的提升表明规则内的关联有多强,即规则在预测结果方面比一开始就假设结果要好多少。提升值越高,关联越强。
Lift = 1 → There’s no relation between the purchase of the products.Lift > 1 → The products are likely to be bought together. Higher the lift, the higher the chances.Lift < 1 → The products are unlikely to be bought together. They are substitutes.
The association rule {shampoo} => {conditioner} has a lift of 1.17 → The probability of buying a conditioner with the knowledge that shampoo is already present in the basket is much higher than the probability of buying a conditioner without the knowledge about the presence of shampoo.The presence of shampoo in the basket increases the probability of buying conditioner.
我知道托举有点棘手。但我希望你现在明白了。
并且在此之后,卡方分析对于确定关联规则的统计显著性是有用的。
3.价格优化
80%的人都说在网上电子商务商店购物最重要的方面是有竞争力的价格。
由 Unsplash 上的 Bermix 工作室拍摄的照片
所以,你知道设定最优价格并在客户满意度和公司利润之间取得平衡是多么重要。现在,让我们探讨与价格优化相关的 3 个重要概念:
图 5 价格优化的概念(图片由作者提供)
a)客户和产品的细分
这是价格优化的第一步,您将对相似的产品和客户进行分组。分类(监督)和聚类(非监督)算法对于这种分割是有用的。最佳技术取决于业务需求和数据类型。
顺便说一下,在我任职高露洁期间,我曾使用 K-均值聚类对具有相似销售趋势的产品进行分组。它帮助我为每个集群建立了一个预测模型,而不是许多模型。
并且,我在我的另一篇文章中已经提到了 RFM 客户细分。快速阅读一下!
在你发现这篇文章之前,你可能忽略了这些
towardsdatascience.com](/a-b-testing-top-4-mistakes-with-business-cases-fixes-85e76767dfde)
b)回归建模
一旦细分完成,围绕销售、转换率、季节性、产品属性、营销渠道等的各种数据点的回归模型。帮助确定产品的最优价格。
让我给你一个假设的 CPG 行业的商业例子。联合利华的分析团队为个人护理产品建立的回归模型可以帮助它预测多芬除臭剂价格下降 5%可以促进 15%的销售。
c)动态定价
你还记得上一次你最喜欢的产品在亚马逊大减价时降价,而其他电子商务商店也降价了吗?
这就是动态定价。它使用竞争对手的数据作为机器学习算法的输入,以确定不同时间的产品价格。这有助于产品在价格频繁波动的竞争市场中保持活力。
A/B 测试可以用来完善定价模型,但它需要大量的技术考虑,是一个完全不同的主题。改天再详细说。与此同时,你可能想看看我写的这篇关于 A/B 测试中出现的 大错误的文章,以及有趣的商业案例&修复 。
在你发现这篇文章之前,你可能忽略了这些
towardsdatascience.com](/a-b-testing-top-4-mistakes-with-business-cases-fixes-85e76767dfde)
4.请求预报
让我们想象一下本杰明·富兰克林和亚伯拉罕·林肯是电子商务商业大亨。
富兰克林似乎警告过不要低估电子商务零售中需求预测的潜力,
“如果你没有计划,你就是在计划失败.”
并且 Lincoln 似乎为你的电子商务公司提供了将需求预测纳入分析场景的完美策略。
“给我六个小时砍树,我会用前四个小时磨斧子。”
需求预测是指使用分析技术来预测产品需求和销售。如果你提前了解销售趋势,你就能在以下几个方面比你的竞争对手更有优势:
a)更好的库存管理
低估库存水平会导致库存缺货,从而引起客户不满。过高估计库存水平会导致库存积压,从而造成不必要的存储成本。
需求预测有助于制定明智的库存计划,避免畅销产品脱销和库存滞销造成的仓库空间浪费。
b)更好的现金流管理
因为这些钱不会被积压在滞销的存货中,所以它可以帮助你合理地计划预算,并最佳地使用现金。因此,它帮助你降低财务风险。
c)更好的定价策略
有效的需求预测也有助于改进定价策略。您可以对具有高需求预测的产品收取更多费用,反之亦然。您可以更好地规划营销预算、广告投资和折扣计划。
d)更好的客户服务
预先了解产品需求及其波动有助于规划更好的客户服务。是时候举个商业例子了。
布莱恩·安杰洛在 Unsplash 上的照片
亚马逊在 2013 年申请了**【预期运输】**专利,利用预测模型在你购买之前将产品运送给你。亚马逊的算法会预测你的购买,并把产品送到离你最近的仓库。然后,亚马逊会等到实际购买。亚马逊认为,这将极大地缩短从购买到实际交付的时间,并促进公司的整体销售。
结论
电子商务零售行业有更多的分析应用,但这些是对电子商务销售收入有直接影响的一些突出应用。我希望你喜欢读它。
以**乔尔·安德森(沃尔玛前首席执行官)**强有力的信息结束,
“你不能只打开一个网站,就指望人们蜂拥而至。如果你真的想成功,你必须创造流量。”
**注:**如果你想看看我最近在高露洁棕榄做的项目,请在 我的 GitHub 账户 中找到代码和演示。根据 NDA 的要求,所有机密数据均已隐藏/匿名。
请随意看看我写的关于 SQL: 的其他文章
是时候开始你的查询游戏了!
towardsdatascience.com](/indexing-for-sql-query-optimization-139b57db9fc6) [## 7 必须知道 SQL 查询错误和修复
避免这些错误,提高你的查询技巧!
towardsdatascience.com](/7-must-know-sql-querying-mistakes-fixes-321ee292a251)
请随时提供反馈,并关注我以获取更多关于数据分析的有趣文章。在 LinkedIn 上与我联系。