解决多重比较问题的方法概述
作为数据科学家,我们处于独特的地位,可以在更大的背景下评估变量之间的关系,并最终用统计数据讲述故事。
简而言之,我们使用假设检验来证明关于我们数据的一些假设。
这是一个相当简单的过程,直到我们想同时测试一组假设。在这篇文章中,我将回顾进行这种多重比较的问题以及如何相应地解决它们。
我们如何首先开始调查我们对一种情况的信念?嗯,我们可以用现有的数据进行所谓的假设检验,以评估我们的主张。
让我们考虑一下目前正在开发的药物 A。我们感兴趣的是,与安慰剂(一种没有治疗效果的“糖丸”)相比,药物 A 是否真正改善了患者的自测疼痛。
Does Drug A actually improve pain more than just the act of taking a drug?
我们如何明显地测量和确定“效果”?仅仅假定药物 A 比安慰剂好是不够的。我们希望在现有数据的基础上,通过具体的测量来实现这一点。出于本例的目的,让我们假设患者使用从 0 到 10 的数值范围报告疼痛。我们可以收集疼痛分数,然后比较两组的平均分数:实验组(服用药物 A)和对照组(服用安慰剂)。值得注意的是,每一组都旨在代表更广泛的患者群体。
对于我们的假设检验,我们必须指定以下内容:
- 零假设:我们寻求反驳的东西,通常是“现状”(即没有影响或差异)。这里,我们的零假设是药物 A 和安慰剂在改善自我报告的疼痛方面没有差异(手段相同)。
- 替代假设:我们的利益效应,或者无效假设的对立面。我们会说,我们的替代假设是,药物 A 和安慰剂在改善自我报告的疼痛方面存在差异(手段不一样)。
- 显著性水平(α):假设假设为真,错误拒绝零假设的概率(假阳性)。这总是在每一个假设检验的开始就被确立。
其中,α可能与多重比较问题最相关。重要的是首先要彻底了解α在假设检验中是如何使用的。
如果我们发现两组的平均疼痛评分有差异,这真的有什么意义吗?我们可以定义界限,允许我们确定任何观察到的差异是否极端到足以反映实际的影响/关系,或者更可能是由于偶然。
因为我们有每个患者的疼痛评分,所以我们可以描述每个组的评分分布。对于这个例子,我们会说,对于两个组,数据大致呈正态分布。
每一个假设检验都是基于所讨论的总体的某种类型的分布。任何给定的分布都以平均值(μ)为中心,并以数据的分布(标准差,σ)为特征。大多数假设检验及其假设都基于正态或高斯分布。
Gaussian (normal) distribution
如上所述,对于我们的患者群体,99.7%的数据应落在平均值的 3 个标准差内。利用这个分布,我们可以确定一个给定的观察值离平均值有多少标准偏差。观察值离平均值越远,就越不寻常。
更专业地说,平均值的标准偏差数可以用一个 z 值来表示。我们使用 z 分数作为一种标准化我们观察到的情况的方法,计算如下:
z-score formula
利用中心极限定理,我们可以假设数据是正态分布的。
然后,我们可以计算数据的检验统计量。我们需要将这个测试统计数据与某个阈值进行比较。如果我们的检验统计量超过了这个阈值,那么我们的发现就具有统计学意义,而不太可能仅仅是由于偶然。
我们使用预先确定的显著性水平(α)来定义阈值。
通常,α被设置为 0.05,尽管这可能因研究领域而异。这是什么意思?这意味着如果你发现了一个效应,你愿意有 95%的信心认为你的结果在统计学上是显著的,并且有 5%的可能性是由于偶然因素。
我们可以再看看我们的标准正态分布,我们用它来通知我们所有的计算。
α定义高斯曲线的拒绝区域。极端结果存在于曲线的末端,离平均值最远。选择拒绝区域,使得当零假设为真时,它包含检验统计量的概率等于α。
因为我们的假设只说明了药物 A 和安慰剂之间的差异,所以我们从两个方向检验了这种关系:药物 A 可能比安慰剂好,也可能比安慰剂差。因此,这是一个双尾假设检验,我们观察高斯曲线的两端。我们在两个尾部之间平均分配α,因此每个尾部将包含 0.025。
在这里, p 值指导我们的决策。如果零假设为真,p 值是至少与样本数据中观察到的结果一样极端的效应的概率。如果检验统计量落在拒绝区域内,那么 p 值将小于α。我们可以说,与安慰剂相比,我们有 95%的信心认为药物 A 显著减少了患者自我报告的疼痛。有 5%的可能性,观察到的效果是由于偶然。因此,我们拒绝零假设。
我们希望从一开始就确定α,因为我们希望控制错误拒绝零假设的概率,或者从一开始就控制我们的 1 型错误。这对于单个假设检验来说相当简单。
但是如果我们想测试多个假设呢?在 AB 测试中,您可能会遇到这种情况,当您想要相互比较一个位点的多个变体,或者在药物测试中治疗的多个症状时。你需要多个零假设,每个“变异”一个。
每个假设都有一个单独的α*,代表该特定测试的 1 类错误率。随着假设数量的增加,测试集的总α也会增加,因为单个α*会累积。对于α=0.05 水平的单一假设检验,1 型错误率仅为 5%。只有 5%的机会错误地拒绝零假设。然而,对于 2 个假设检验,总α变为 0.10。错误地拒绝至少一个无效假设的概率是 0.10。随着每次新比较的增加,总α值迅速增加:
Overall α ≤ 1-(1-α*)
现在,为什么不仅仅局限于一个单一的测试,避免这种混乱的复杂性呢?效率和实际考虑可能需要多次比较。假设我们对药物 A 如何减轻疼痛、减少头痛的发生率**、**等感兴趣。基于多项临床上有意义的测量,进行一系列测试来了解药物 A 的总体疗效是有意义的。
所以,我们想控制我们的 1 型错误。我们可以用两种不同的方法来解决这个问题。
- 控制总体α(也称为家族误差率或 FWER ),这将影响每次测试的α*。也就是说,我们正在控制使至少出现一次错误发现的总体概率。Bonferroni 和 Sidak 校正全部控制 FWER。
- 控制错误发现率 (FDR)。当 FWER 控制发生 1 型错误的概率时,这些程序允许 1 型错误(假阳性),但控制这些假阳性相对于真阳性的比例。这是通过调整与每个单独测试相关的 p 值来决定是否拒绝来实现的。因为这将导致更高的类型 1 错误率,所以它具有更高的功率。这为真正的发现提供了更高的可能性。FDR 的步进程序控制。
下面,我将提供一个多重比较可用校正程序的简要概述。
Bonferroni 校正 Bonferroni 校正是最保守的校正,也可能是最直接的方法。简单的用α除以测试次数( m )。
但是经过多次测试,α*会变得很小。这降低了功率,这意味着我们不太可能做出任何真正的发现。
西达克校正 α* = 1-(1-α)^(1/m
霍尔姆的降压程序 Bonferroni 修正的更新,此程序更强大。霍尔姆的程序不是控制 FMER,而是控制错误发现率 (FDR),并在进行所有假设检验并在集合中找到相关的αp 值后执行。
降压过程最好用一个例子来说明。假设我们有三个假设,每个假设都有相关的 p 值:
H1:0.025
H2:0.003
H3:0.01
步骤 1:从最小到最大排列 p 值
H2:0.003
H3:0.01
H1:0.025
第二步:对排名第一(最小)的 p 值使用 Holm-Bonferroni 公式
α* = α/(n-rank+1)
α* = 0.05/(3–1+1) = 0.0167
步骤 3:将排名第一的 p 值与步骤 2 中计算的α*进行比较
0.003 < 0.0167
因为 H2 的 p 值小于计算出的α*,我们可以拒绝 H2。
移动到下一个等级 p 值并重复步骤 2–3,计算其各自等级的α*并将其与该 p 值进行比较。继续直到你到达第一个未被拒绝的假设。那么你将无法拒绝以下所有假设。
Hochberg 的升压程序
比 Holm 的降压程序更强大,Hochberg 的升压程序也试图控制 FDR,并遵循类似的程序,只是 p 值从最大到最小排列。
对于每个分级 p 值,将其与为其各自等级计算的α*进行比较(公式与 Holm 的程序相同)。测试继续进行,直到你到达第一个未被拒绝的假设。那么你将无法拒绝以下所有假设。
出于这篇博文的目的,我将只简要地提及另外两种众所周知的纠正方法,它们比这篇博文所能容纳的要复杂一些。
图基的程序 图基的程序是单步多重比较测试,仅适用于您对所有可能的均值对进行比较的情况;它同时这样做。它本质上是一个校正 FWER 的 t 测试。
邓尼特校正 邓尼特校正类似于图基的程序,除了它涉及每个平均值与单个控制平均值的比较。
这两个程序都使用了 ANOVA 测试,该测试允许您测试多个组,以查看任何组之间是否有显著差异(零假设:μ1 = μ2=…=μk)。然后,Tukey 的程序或 Dunnet 的校正可以让您识别哪些对显著不同。
当然,进行多重比较并不简单。然而,我希望这篇文章有助于阐明我们作为数据科学家的选择,以减少错误的结论,同时有足够的灵活性做出一些正确的结论。
蒙特卡罗方法综述
蒙特卡罗(MC)方法是计算算法的一个子集,它使用重复随机采样的过程来对未知参数进行数值估计。它们允许对涉及许多随机变量的复杂情况进行建模,并评估风险的影响。MC 的用途非常广泛,并在物理学、博弈论和金融领域导致了许多突破性的发现。蒙特卡洛方法的范围很广,但它们都有一个共同点,即它们都依赖随机数生成来解决确定性问题。我希望概述一下 MC 的一些基本原理,也许会让你对它们可能的应用感到兴奋。
source: mathworks.com
这个概念是由数学家斯坦尼斯劳·乌拉姆发明的,他发明了这些方法,作为他对曼哈顿计划的贡献的一部分。他使用随机抽样和推断统计的工具来模拟结果的可能性,最初应用于纸牌游戏(蒙特卡洛纸牌游戏)。后来,乌拉姆与合作者约翰·冯·诺依曼合作,利用新开发的计算机技术进行模拟,以更好地了解与核项目相关的风险。你可以想象,现代计算技术允许我们用大量随机参数来模拟更复杂的系统,就像我们在日常生活中遇到的许多场景一样。然而,在我们考虑复杂系统之前,让我们先讨论一个简单的例子;二十一点的游戏。
如果我们想知道得到 21 点(一张 a 和一张 10 值的牌)的概率,我们可以简单地计算这种情况下可能的手牌数量,然后除以可能的牌组合总数来得到概率(如果你想知道的话,大约是 1/21)。但是现在想象一下,我们的样本空间很难计算,例如,我们的一副牌有数千张,而不是只有 52 张,或者更好的是,我们甚至不知道有多少张牌。还有一种方法可以求出这个概率。
我们可以蹲在桌子旁玩一百场游戏,一边玩一边记录结果。我们可能得到 19 次、20 次甚至 28 次 21 点,并使用这些值中的任何一个来分配概率。看起来这是一个很糟糕的评估我们在赌场赔率的方法,但是希望我们只是玩着玩着。如果我们再来一次,玩一千次,一万次,几百万次,大数定律说:
“随着同分布、随机生成的变量数量的增加,它们的样本均值接近它们的理论均值。”
除了是统计学最重要的定律之一,这也是蒙特卡罗模拟的基础,允许我们通过统计试验的方法建立随机模型。让我们看看我最喜欢的(可能也是最简单的)MC 估计的例子。
圆周率的蒙特卡罗估计
正如我们在文法学校几何课上所学的那样,圆周率是一个常数,它表示圆的周长与直径之比。它是无理数,这意味着它有无限个没有模式的数字。如果我告诉你,我们可以通过玩一个简单的飞镖游戏来估算任意位数的圆周率,你会相信吗?当然有一定的不确定性,毕竟我们是在玩一场碰运气的游戏!让我们编写一个简短的 python 脚本来看看如何实现。
如你所见,我们在一个盒子里随机生成点,并计算嵌入圆内的点数。为了简单起见,我们只看一下我们的飞镖靶的上象限,半径为 R,安装在一块同样宽度的正方形木头上。如果我们投掷 100 个飞镖,并计算成功击中镖靶的飞镖数量,我们可能会得到以下图形。
如果你在想:“为什么我们这么不擅长这个?”你问对了问题。对于这个例子,我们的飞镖位置必须是均匀分布在整个区域,所以我们在这里肯定不会赢太多游戏。从我们游戏的设置来看,飞镖击中棋盘的概率会是π/4。随着我们继续玩下去,当 n->∞时,我们接近这个真实值(感谢伯努利!).我们可以看到,当 n 增加 10 个数量级时,这种情况会发生在下面。
**
Plots for n= one, ten, and one-hundred-thousand, and finally one million points.
你可能会说:这很好,但我已经知道圆周率是 3.14159…而现实世界中有什么是均匀分布的呢?不要担心,因为当使用 MC 方法来建模更高维度的系统时,我们将需要对各种随机变量进行采样,用不同的概率分布来更准确地表示我们的模型中参数的影响。我能用这个做些什么真实的事情呢?
高能物理学
蒙特卡洛的一个主要应用是粒子物理领域,它与我的心灵息息相关。在量子(非常小的尺度)世界中,事物不容易被观察到,在粒子加速器的碰撞点尤其如此。MC 方法允许物理学家根据标准模型和以前实验中确定的参数来模拟这些事件。像 LHC 这样的大规模项目已经产生了大量的数据,所以在我们开始随机抽样之前,N 就已经很大了。所以 MC 的一个小用处是探索物质本身的基本结构。
金融
如果这对你来说还不够令人兴奋,MC 在金融工程中被广泛用于股票市场预测。这具有直观的意义,因为市场难以建模,具有难以置信的高维度,并且有大量数据可供采样。风险的重要性是金融分析师使用 MC 方法的另一个重要因素。蒙特卡罗在这个领域的一个相对直接的应用是投资组合优化。我强烈推荐这篇关于这个主题的博客文章,它详细阐述了如何为这种类型的分析编写代码,但总结起来:
当选择股票投资组合时,你可能愿意根据你的目标承担不同程度的风险。但是,不管你是否愿意接受风险,你都可以通过蒙特卡罗方法找到股票的最佳组合和比例,从而最大化投资组合的单位波动率收益。利用历史数据,人们可以生成成千上万不同比率的股票组合,以观察在这段时间内每只股票的相对表现。然后,人们可以使用一种称为夏普比率的指标(一种在给定风险的情况下衡量投资回报表现的指标)来选择最佳配置。)
如果财富和知识的承诺不足以激起你的兴趣,马尔可夫链蒙特卡罗方法为训练深度学习算法提供了一个强大的工具。数据科学家和机器学习工程师可以使用这些技术来做各种奇怪而奇妙的事情。如果你有兴趣阅读更多关于蒙特卡洛的资料,我推荐以下资源:
*初学者:【http://www.statisticshowto.com/monte-carlo-simulation/ *
如何使用蒙特卡罗方法估计圆周率的值——生成大量随机点,看看有多少…
academo.org](https://academo.org/demos/estimating-pi-monte-carlo/)
中级:【http://mathforum.org/library/drmath/view/51909.html】T4
"Algorithms like these, which use random numbers to approximate
deterministic outcomes, are called Monte Carlo methods, after the
famous casino city where random numbers produce a deterministic
outcome (the house wins the gambler's money)."
- Doctor Jubal, The Math Forum
高级:http://farside . ph . ute xas . edu/teaching/329/lections/node 109 . html
一个 R-docker hello world 的例子
是的,我变成了那种“我们可以用集装箱装这个!”人们。
我保证我不仅仅是一个趋势追随者——容器技术对于我们为自己和客户构建定制分析应用的团队来说有着惊人的前景。
我们使用 R 统计编程语言/环境来构建从机器学习解决方案到报告仪表板的一切。r 对于分析和快速原型开发来说是一个很好的环境,但是它传统上是一个统计脚本环境,并且缺少一些传统编程语言的“生产就绪”特性。
Docker 为我们提供了一种基于每个应用管理依赖项和库的方法(当在一个服务器上部署多个应用时)。
这也意味着在我的机器上工作的东西有很好的机会在生产中工作。就这样,挽救了许多深夜恐慌。
关于本教程
这篇文章是我去年为我们公司的博客写的一篇博客的更新版本。它将带您完成构建、运行和连接一个运行 r 的 docker 容器的步骤
- 建立一个档案
- 建造一个容器
- 运行容器以服务于 Rstudio 环境
- 连接到该容器并运行脚本
- 将输出写回到主机上装载的数据文件夹中
- 喝一杯好茶来祝贺我们自己(开个玩笑——你可能自己就知道了)
要在家玩,从我们的 github 库克隆或下载目录。代码已经在 Linux 和 Mac 上测试过——你可能需要在 Windows 上做一些小的改动(请在评论中添加任何额外的提示)。
关于 Docker
Docker 是一个使用容器的管理系统/环境。容器建立在主机之上。它们共享相同的内核和硬件控制器,但可能有不同的 Linux 风格或库集。
我们设置容器映像,就像我们想要的容器的快照——所有的库、文件等等。然后我们运行容器来建立一个包含所有工作文件的临时实例。
完成后,我们停止容器,并且所有数据和任何本地更改都将永远丢失。
为了保存容器实例的输出,我们必须将数据写回主机或其他永久的地方。
对于这个例子,我假设你正在一台已经安装了 docker 的机器上工作。
这个例子
从https://github.com/SymbolixAU/r_docker_hello克隆或下载存储库。
使用您使用的命令行终端导航到您的新目录R_docker_hello
。
在这个文件夹中,您会发现:
Dockerfile
:它位于顶层目录中,指定了我们的构建选项。- 分析文件夹:保存一个简单的
hello_world.R
脚本,我们将在我们的容器中运行它 - 数据文件夹:你所见过的最简单的输入数据。我们还将在运行容器时挂载这个文件夹,并将输出写回其中。
- DockerConfig:每个人都喜欢特定的库,所以我做了一个
requirements.R
,它将在你构建容器时运行。
准备好了吗?让我们开始吧…
在 Dockerfile 文件中
Dockerfile 文件包含以下内容:
# Base image https://hub.docker.com/u/rocker/
FROM rocker/rstudio ## Install extra R packages using requirements.R
## Specify requirements as R install commands e.g.
## install.packages("<myfavouritepacakge>") or
## devtools::install("SymbolixAU/googleway") COPY ./DockerConfig/requirements.R /tmp/requirements.R
RUN Rscript /tmp/requirements.R ## uncomment to include shiny server
# RUN export ADD=shiny && bash /etc/cont-init.d/add # create an R user
ENV USER rstudio ## Copy your working files over
COPY ./Analysis /home/$USER/Analysis
COPY ./Data /home/$USER/Data
docker 文件用于构建容器映像。
我们从基础图像的开始**。然后我们复制文件或者运行额外的命令或者设置特定的 ENV 变量。Dockerfile 位于项目的顶部,应该用大写字母 D 来命名 Dockerfile 。**
在本例中,我们从来自 docker hub 的 rocker/rstudio 图像开始。这些是公开的(非官方的),但是它们是可靠的,并且得到了很好的支持。Rocker 也有 r-base (rocker/r-base)的图像和一个地理空间套件(rocker/rstudio-geospatial)。这里安装了所有基本的空间库(sp,sf ),以及所有你需要的 R 之外的东西(比如 GDAL 库)。
为了安装额外的 R 库,我们在requirements.R
中指定它们。在构建时,该脚本被复制到实例上,并运行以安装库。
最后,构建复制我们的文件到Analysis
文件夹和Data
文件夹。我们将它们放在用户的主目录中,名为rstudio
。
建造它
在命令行中键入以下命令。您必须与 docker 文件在同一个目录中。根据您配置服务器的方式,您可能需要在命令前使用sudo
docker build --rm --force-rm -t rstudio/hello-world .
一旦脚本运行或者你注销,这个--rm --force-rm
就强制容器删除它自己。它只是阻止我们用大量的容器填充服务器,而什么也不做。
一旦这已经建立运行
docker image list
看到您的图像被添加到列表中。我们称它为rstudio/hello-world
,但你可以称它为任何东西。
运行它
我们希望使用此映像访问 Rstudio,因此我们希望它作为后台服务运行(即在分离模式下)。我们使用标志-d
来做这件事。如果想访问 bash shell 或其他交互模式,需要指定-it
。
Rstudio 在容器内的端口 8787 上运行。我们需要用一个-p <host port>:<container port>
将它映射到主机上一个未使用的端口,我们将使用 28787,但这可以是任何未使用的端口。
我们将称我们的容器为hello-world
。这是简单的运行命令:
sudo docker run -d --rm -p 28787:8787 --name hello-world rstudio/hello-world
运行这个命令并通过您在<yourhostip:28787>
的 web 浏览器访问容器。用户名和密码都是rstudio
。
在 rstudio 中,键入
source("Analysis/hello.world.R")
您应该能够看到分析和数据文件夹,但是有两个问题。
- 写入本地容器当然很好,但是这个数据不会是永久的。我们可以通过使用
-v /full/path/to/directory
将主机目录挂载为容器上的卷,将输出写回主机目录。这在开发中也很有用,因为您可以在永久主机文件夹中进行更改,这些更改无需重新构建就可以立即在容器中使用。 - 为了写入 Docker 中的文件(通过 rstudio),您需要拥有正确的用户 id 。有了这些摇杆图像,您可以通过在 run 命令中指定
-e USERID=$UID
来实现。然后,您可以编写并更改文件,并将它们保存在容器中。
在我们修复问题之前,我们需要停止正在运行的容器(这对我们没有好处):
sudo docker stop hello-world
现在让我们再试一次。如果您查看run_docker.sh
,您将看到运行命令的更完整版本:
DATA_DIR=${PWD}/Data sudo docker run -d --rm -p 28787:8787 --name hello-world2 -e USERID=$UID -e PASSWORD=SoSecret! -v $DATA_DIR:/home/rstudio/Data rstudio/hello-world
注意,在上面我也手动设置了密码——你可以随意设置。
运行上面的命令,登录<yourhostip:28787>
并尝试获取脚本。
它应该运行并写入数据文件夹。</yourhostip:28787>
最后,再次回到命令行。键入ls Data
,您应该也会在那里看到输出文件。
还有一件事。在 rstudio 窗口中,打开Analysis/hello.world.R
在底部添加一行命令,保存并运行它。
最后一个问题——如果我在命令行上检查
Analysis/hello.world.R
的内容(即回到主机上),它会有你的新行吗?为什么?
最后一个挑战:
(先停旧容器)。
现在再次运行它,但是设置它以便您可以在命令行上对hello_world.R
进行更改,并立即让它们在 Rstudio 中显示和工作。
Azure Data Studio 终极指南
Azure Data Studio 是一个跨平台的数据库工具:如果你是 MacOS 或 Linux 用户,你可以把它看作是 SQL Server Management Studio (SSMS)的迷你版,是我从虚拟机运行 SQL Server 的救星。
Azure DS 配备了 Intellisense(完全智能)、版本控制集成(Git)以及一个非常酷的 T-SQL 编辑器。它可以将您的结果保存为文本、CSV 或 JSON。
让我们开始吧:
装置
正在设置 Azure SQL 数据库:
您将需要一个服务器来链接 Azure DS(在我的例子中,我将其链接到 Azure SQL 数据库)。如果你不熟悉如何创建自己的免费 Azure SQL 数据库,你可以按照这个我之前创建的循序渐进的教程。
下载并安装 Azure Data Studio:
下载你的 Azure DS,并安装它(Mac 用户,只需双击它:D)
Azure Data Studio Connection prompt
设置您与 Azure SQL 数据库的连接:
启动时,Azure DS 会提示您连接到服务器。以下是您将需要的关键输入:
- **连接类型:**微软 SQL Server
- **服务器:**你可以从你的 Azure SQL 数据库中获取这段信息(如果你按照前面提到的教程,它应该类似于sql-test-medium-001.database.windows.net
- 认证类型: SQL 登录
- 用户名: 您为您的服务器设置的服务器登录 (教程)
- 密码: 与用于设置您的服务器的密码相同
- **数据库:**选择您的数据库名称
- **名称(可选)😗*好记的东西
Example of where to find your server name in Azure SQL database
测试您的连接:
停止:在你继续之前,如果你没有设置你的服务器的防火墙来允许连接,你的连接提示会弹出下面这个表格。添加您的客户端 IP 和您的 Azure 帐户,您应该可以开始了。
Firewall prompt
您应该看到您的服务器已连接。您可以通过单击左侧窗格中的下拉菜单来展开服务器中的表。
要测试您的连接,请点击新查询或点击 cmd-N 打开一个新的查询窗口。键入以下 SQL 命令来测试您的连接:
*SELECT * FROM SalesLT。客户;*然后点击运行。您应该会看到如下所示的输出。
你注意到智能感知在起作用吗?—这真的是我最喜欢的部分!
创建存储过程
如果你熟悉 SSMS 的作业调度,这是它的 Azure DS 等价物,只是酷得多!
- 打开新的查询窗口或点击 cmd-N
- 键入 **sql,**应该会显示一个下拉菜单。选择 sqlCreateStoredProc
- 它将为存储过程创建一个模板。让我们把它分成不同的部分:
A.检查是否存在任何其他同名的存储过程,删除它并创建这个存储过程
B.创建此存储过程
C.执行此存储过程
4.让我们更新模板以满足我们的需求:
Example for change all occurences
- 右键单击上的**stored procedure rename,**单击 Change All Occurrences 并将其更改为您想要调用您的过程的名称。我把它命名为 testProc
- 同样,右键单击模式上的,单击更改所有事件,并将其更改为您的模式名称(默认情况下,如果您没有设置它,它应该是 **dbo,**因此将其交换为 dbo )
- 更新存储过程的函数:
- 将
@customerID
作为输入 - 选择与输入具有相同 CustomerID 的所有记录
- 点击运行。这将创建并运行您的存储过程: EXECUTE dbo.testProc 1 将在
@customerID
= 1 的情况下运行testProc
。
如何将输出改为 JSON
从我们刚刚使用的存储过程开始,我们将以 JSON 格式输出数据。现在,这可能在不同的场景中派上用场,但在我的情况下:它非常适合带有 javascript 前端的可视化工具。
*提醒:*在这个存储过程中,我们获取任何具有输入客户 id 的客户的所有数据。
现在,让我们将输出存储在一个 JSON 文件中。您只需在查询后添加这个命令:FOR JSON PATH
et voilà!
让我们看看下面的输出是什么样子的。您甚至可以在任何查询之后添加这个命令,输出将是 JSON 格式。
PS:即使命令下面有一条弯弯曲曲的线——它仍然工作,相信我,我试过了:)
如何创建酷的可视化
这是一件大事——我非常兴奋 Azure Data Studio 允许你创建自己的迷你可视化,而不仅仅是一个表格。您甚至可以将它添加到一个不断刷新的仪表板中(在查询性能、PSI 计算或任何其他方面都会变得很方便)。
让我们开始吧!
创造洞察力
- 编写一个小查询来验证这一点:
SELECT title as Titles,count() as Count
FROM SalesLT。客户
按标题分组*
该查询将为客户获取所有不同的图书,然后对它们进行分组并返回每个图书的数量。
2.您可以点击右侧的图图标,而不是列表结果。
3.这将向您显示一个代表我们数据的条形图。不要忘记在条形图设置中点击使用第一列作为行标签。实际的情节是如此之酷,它向您显示了一个清晰的图例和工具提示功能,以检查实际计数。
Bar plot instead of tabulated data
如何将它变成一个仪表板小部件
- 点击图左上角的创建洞察
- 这将带你到一个包含一些小工具设置的新文件(查看下图)
3.选择所有widget 设置,点击右键,选择**格式文档。**这会帮助你看得更清楚些:)
4.打 CMD+逗号(像这个逗号,
)。这将打开我们希望小部件所在的仪表板设置。只要看看下面的图片,你已经可以看到我们的部件将位于何处。
dashboard.database.widgets
5.搜索dashboard . database . widgets
6.点击dashboard . database . widgets旁边的小铅笔。并选择复制到设置。
您可以看到屏幕右侧出现了一个新的黄色部分。
7.现在让我们集中一点:还记得我们之前固定格式的小部件设置吗?—在上面的步骤 3 中— 返回并复制那些设置。
8.贴在哪里?
看图片看我下面*。* JSON 是精密科学,你需要重点关注这一项。
Image Look at Me
9.将您的设置粘贴到]
之前的最后一个}
之后。看到那个逗号,别忘了在你粘贴的设置前加上它。
10.我们就快完成了,我保证!
点击保存,进入你的服务器主页。
11.双击 sql-test-medium(或您的服务器名称)上的。
瞧啊!看,这并不难。我希望你喜欢我对 Azure Data Studio 的快速浏览!
使用 Tensorflow 对象检测和 OpenCV 分析一场足球比赛
用数据做很酷的事情!
介绍
世界杯赛季已经开始,并有了一个有趣的开端。谁曾想到卫冕冠军德国队会在小组赛中被淘汰
作为数据科学家,让我们利用这个机会对足球片段进行一些分析。通过使用深度学习和 opencv,我们可以从视频剪辑中提取有趣的见解。请看下面澳大利亚和秘鲁比赛的 gif 示例,我们可以识别所有球员+裁判,足球,还可以根据球员球衣的颜色预测球员属于哪个队。所有这些都可以实时完成。
Player detection and team prediction
你可以找到我在我的 Github repo 上使用的代码。
步骤概述
Tensorflow 对象检测 API 是用于快速构建对象检测模型的非常强大的资源。如果你对这个 API 不熟悉,请看下面我写的介绍 API 的博客,教你如何使用 API 构建自定义模型。
使用 Tensorflow 对象检测 API 构建自定义模型
API 提供了预训练的对象检测模型,这些模型已经在 COCO 数据集上进行了训练。COCO 数据集是 90 个常见对象的集合。请参见下图中属于 COCO 数据集的对象。
coco object categories
在这种情况下,我们关心类——人和足球,它们都是 COCO 数据集的一部分。
该 API 还支持大量的模型。请参见下表以供参考。
Small subset of models supported by the API
这些模型在速度和准确性之间进行了权衡。由于我对实时分析感兴趣,我选择了 SSDLite mobilenet v2。
一旦我们使用对象检测 API 识别了球员,为了预测他们属于哪个队,我们可以使用 OpenCV,这是一个强大的图像处理库。如果您不熟悉 OpenCV,请参阅下面的教程:
OpenCV 允许我们识别特定颜色的面具,我们可以用它来识别红色玩家和黄色玩家。请参见下面的示例,了解 OpenCV 蒙版如何检测图像中的红色。
Prediction of red areas in an image
深入探究主要步骤
现在让我们详细研究代码。
如果你是第一次使用 Tensorflow 物体检测 API,请从这个链接下载 GitHub。并使用这些指令安装所有的依赖项。
如果你没有 OpenCV 设置,请使用这个教程从源代码构建它。
我遵循的主要步骤是(请跟随我的 Github 上的 jupyter 笔记本):
- 将 SSDLite mobilenet 模型加载到图中,并加载属于 COCO 数据集的类列表
- 使用 cv2 打开视频。视频捕获(文件名)并逐个读取每一帧
- 对于每一帧,使用加载的图形执行对象检测
- 从 SSDLite 返回的结果是每个已识别的类及其置信度得分和边界框预测。因此,现在识别所有置信度大于 0.6 的人,并将他们剔除。
- 现在你有每个球员提取出来。我们需要阅读他们球衣的颜色来预测他们是澳大利亚球员还是秘鲁球员。这是由代码块检测团队完成的。我们首先定义红色和蓝色的颜色范围。然后我们使用 cv2.inRange 和 cv2.bitwise 来创建该颜色的遮罩。为了检测团队,我计算检测到多少红色像素和黄色像素,以及它们占裁剪图像中像素总数的百分比。
- 最后,将所有代码片段组合起来,同时运行所有代码,并使用 cv2.imshow 显示结果
结论和参考文献
太棒了。所以现在你可以看到深度学习和 OpenCV 的简单结合可以产生有趣的结果。现在您有了这些数据,有许多方法可以从中获得更多的见解:
- 通过澳大利亚球门区的摄像机角度,你可以计算出有多少秘鲁球员在澳大利亚球员的球门区
- 您可以绘制每个团队足迹的热图,例如秘鲁团队入住率较高的区域有哪些
- 你可以画出守门员的路线
对象检测 API 还提供了其他更精确但更慢的模型。你也可以试试那些。
给我一个❤️,如果你喜欢这个职位:)希望你拉代码,并尝试自己。
我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。请到 http://deeplearninganalytics.org/来看看我们吧。
你也可以在 https://medium.com/@priya.dwivedi 的看到我的其他作品
如果你有一个我们可以合作的项目,请通过我的网站或 info@deeplearninganalytics.org 联系我
参考文献
- Tensorflow 对象检测 API
- 关于使用 OpenCV 检测颜色的好教程
用 cleanNLP 分析关于难民的公共话语
继上一篇文章之后,当联合国谈论难民时,它谈论什么?我将分析联合国难民事务高级专员演讲中的行动驱动词,并使用 r 中的 cleanNLP 和 newsflash 包触及新闻媒体中的电视报道
提及政府间组织
我从注释单词的词性开始,并在目标名词不是很常见的单词时提取直接宾语依赖。
放大顶级名词,我们可以看到收容、遣返和流离经常出现,还有庸人自扰迫害、困境和危机。
至于排名靠前的动名对,“Seek 庇护”是出现频率最高的。
UNHCR speeches
接下来,我将调查新闻报道的内容。与印刷新闻不同,我们可以期待文字稿更加口语化。
新闻媒体提及
我利用了非常强大的 GDELT 项目,该项目监控来自世界各国的 100 多种语言的印刷、广播和网络新闻媒体。我在 r 中使用了 Newflash 包,它与GDELTTelevision Explorer 配合使用,因此目前只能捕捉美国电视新闻。
我们可以看到 CNN 对这个话题的报道最多,而更关注商业的频道显然报道较少。
在动词名词对方面,与难民相关的词比其他名词多,因为电视新闻可能会使用许多不同的方式来描述类似困境、流离失所和遣返的情况,而不是直接使用这些词。提到的顶级名词还包括边境、叙利亚、营地。
用 R 进行文本处理
在熟悉了像 tm 这样的经典软件包之后,当 tidytext 出现时,我开始尝试 NLP,这使得语料库到表格的转换很容易,并且在需要做一些简单的事情时很方便。然后我偶然发现了 spacyr ,它惊人地快速和健壮,为命名实体识别提供了简单的语法。今天,我学习了 openNLP(它位于所有其他优秀包的肩膀上)并使用它进行依赖解析。虽然还有很多东西需要探索,但它只会变得更好。
这是我关于数据科学和视觉故事的# 100 日项目的第 41 天。我的 github 上的全部代码。感谢阅读。欢迎新主题的建议和反馈。
分析转发率以确定社会影响力。
Twitter 支持对任何特定推文的两种回应, 转发和引用推文 。引用推文很像转发,除了它们包括新的推文消息。
有一种普遍的看法, **RTs 不是代言。**相反,转发确实表明倾向于该推文。否则为什么会有人转发?
当前对社会影响力的分析基于引用推文与转发推文的比率。为了更深入地挖掘,引用推文的情绪需要分析,并在下一阶段进行规划。
让我们将这一分析放在几个知名人士最近的推特上,看看他们的表现如何。
在最近的 10 条推文中,多达 150 条相关推文(转发和引用推文)被用于分析。
- 首先,让我们看看唐纳德·j·特朗普和巴拉克·奥巴马。
- 让我们邀请一些名人,艾伦·德杰尼勒斯和奥普拉·温弗瑞 T20。
- 印度即将举行大选。所以让我们来看看纳伦德拉·莫迪和他最讨厌的拉胡尔·甘地相比如何。
你可以试着通过三个简单的步骤对其他感兴趣的 twitter 账号进行类似的分析。
- 使用 Twitter API 进行身份验证。
注意:要获得证书,你需要在 Twitter 上注册。
-
根据知名人物或实体的最近的推文,获取 相关推文 。
-
绘制可视化堆积条形图。
分析科研人员的迁移
今天,我根据 ORCID (开放研究者和贡献者 ID)数据调查了科学研究人员的洲际和洲际迁移。由于不是每个人都有 ORCID,该数据集最好被视为所有研究人员的定向样本,并跟踪他们最早/最新开展研究活动的国家以及他们的博士国家。
预处理
为了清理数据,我过滤了 is_migrated=True 和最早的国家与最新的国家不同。然后,我将国家代码转换为国名和洲名,并缩短了一些国家的名称。
按大陆移动
To show directions, the chords without space at the end points to the source and those with space at the end point to the target
我们可以看到:
- 欧洲的流动性很高,有很多区域内的流动。
- 亚洲向外移民较多,主要是美洲,其次是欧洲,然后是大洋洲。
- 美洲有更多来自亚洲、欧洲和同一地区的移民。
洲内移动
对于那些移居到同一个洲的另一个国家的人来说,主要的是什么?
在美洲,涌入美国人数最多是加拿大,其次是墨西哥,古巴和哥伦比亚。
在亚洲,印度几乎完全是出境旅游,沙特阿拉伯/卡塔尔几乎完全是入境旅游。马来西亚实际上入境人数多于出境人数。
Oceania (L) Africa ®
在欧洲,英国、德国、法国、意大利的变化最大。英国以入境游为主,而意大利以出境游为主。
在大洋洲,大多数研究人员从新西兰迁移到澳大利亚。
在非洲,南非吸引了更多来自该地区的研究人员。博茨瓦纳的流入人口也多于流出人口。
洲际运动
我们可以看到,这一运动并不局限于发展中国家和发达国家——来自发达国家的研究人员也可能继续在其他国家工作和生活。
人才流失还是新鲜血液?
为了理解入境与出境,我计算了这 3 个指标:出境/入境比率,迁出一个国家的所有研究人员的百分比和迁入的所有研究人员的百分比。
我们使用高度来表示移民的出境/入境比率,并使用向上/向下三角形的大小来显示出境/入境人数占所有记录的研究人员的百分比,以便对所有人口流动数高于平均水平的国家的人口影响进行标准化。
除了印度,中国拥有第二高的比率,5X 失去的人才比得到的多。希腊研究人员移居国外的比例最高。
就吸引研究人员而言,卡塔尔和沙特阿拉伯吸引了最多的研究人员流入,而很少有人向外流动。亚洲的新加坡和香港吸引的研究人员也比流失的多 2-3 倍。
移居国外的研究人员在哪里攻读博士学位
在迁移的研究人员中,如果我们看看研究人员是在他们最早的附属国家还是在最早的大陆的最新国家获得博士学位,我们可以看到亚洲/非洲的研究人员大多继续在他们获得博士学位的国家进行研究,而美国/欧洲的研究人员在获得博士学位后迁移。
总的来说,49%的移民研究人员在最早的国家获得博士学位,39%在最近的国家,12%在其他地方。
今天我用 circlize 包来绘制弦图,并基于分面 ggplot 制作了 marimekko。也体会到了圆图 vs 桑基的独特优势:
- 由于 Sankey 以排序的方式在不同的轴上显示源和目标,因此很容易看到顶级出站和顶级入站
- 圆形图将入站和出站组合在一起,使其更适合查看每个节点的整体移动。
这是我关于数据科学和视觉故事的# 100 日项目的第 69 天。代码在我的 github 上。感谢阅读。如果喜欢,请分享。欢迎反馈。
分析 IPL 数据,开始使用 Python 进行数据分析
数据科学/分析就是从给定的数据集中发现有价值的见解。简而言之,找到有助于商业的答案。在本教程中,我们将了解如何开始使用 Python 进行数据分析。我们在这个笔记本中使用的 Python 包有:numpy
、pandas
、matplotlib
和seaborn
由于通常这样的教程是基于像iris
这样的内置数据集,学习者更难与分析联系起来,因此学习变得困难。为了克服这一点,我们在本笔记本中使用的数据集是 IPL(印度超级联赛)数据集,发布在来源于 cricsheet 的 Kaggle Datasets 上。IPL 是世界上最受欢迎的板球比赛之一,因此我们试图解决的问题和我们试图回答的问题应该为任何了解板球的人所熟悉。
问题:
- 数据集中有多少匹配项?
- 数据集中有多少个季节?
- 哪个队因得分最多而获胜?
- 哪个队以最大优势获胜?
- 哪个队以最接近的差距(最少的得分)赢了?
- 哪个队以最少的票数获胜?
- 哪个赛季的比赛次数最多?
- 哪个 IPL 队比较成功?
- 掷硬币赢有助于赢得比赛吗?
加载库
让我们从加载上面提到的 Python 模块/包/库开始我们的分析。
import numpy as np # numerical computing
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt #visualization
import seaborn as sns #modern visualization
为了让我们的图看起来更好,让我们为 seaborn (sns)图设置一个主题,并定义打印图的大小。
sns.set_style("darkgrid")
plt.rcParams['figure.figsize'] = (14, 8)
读取输入数据集
为了读取输入数据,让我们首先定义输入文件所在的目录/路径。这是为了确保路径首先存储在一个字符串中,然后使用相同的(连接的)文件名通过pd.read_csv()
函数读取输入 csv。
file_path = 'C:\\Users\\something\\Downloads\\'
matches = pd.read_csv(file_path+'matches.csv')
获取数据的基本信息
首先,让我们检查数据集的基本信息。需要了解的最基本的信息是数据集的维度——行和列——这是我们通过方法shape
得到的信息。
matches.shape
(636, 18)
然后,了解给定数据集中不同类型的数据/变量非常重要。
matches.info()
RangeIndex: 636 entries, 0 to 635
Data columns (total 18 columns):
id 636 non-null int64
season 636 non-null int64
city 629 non-null object
date 636 non-null object
team1 636 non-null object
team2 636 non-null object
toss_winner 636 non-null object
toss_decision 636 non-null object
result 636 non-null object
dl_applied 636 non-null int64
winner 633 non-null object
win_by_runs 636 non-null int64
win_by_wickets 636 non-null int64
player_of_match 633 non-null object
venue 636 non-null object
umpire1 635 non-null object
umpire2 635 non-null object
umpire3 0 non-null float64
dtypes: float64(1), int64(5), object(12)
memory usage: 89.5+ KB
向上移动一级,让我们使用方法describe()
执行一个简单的汇总统计。
matches.describe()
id
season
dl_applied
win_by_runs
win_by_wickets
umpire3
count
636.000000 636.000000 636.000000 636.000000 636.000000 0.0
mean
318.500000 2012.490566 0.025157 13.682390 3.372642 NaN
std
183.741666 2.773026 0.156726 23.908877 3.420338 NaN
min
1.000000 2008.000000 0.000000 0.000000 0.000000 NaN
25%
159.750000 2010.000000 0.000000 0.000000 0.000000 NaN
50%
318.500000 2012.000000 0.000000 0.000000 4.000000 NaN
75%
477.250000 2015.000000 0.000000 20.000000 7.000000 NaN
max
636.000000 2017.000000 1.000000 146.000000 10.000000 NaN
这个基本信息检索的最后一级是查看输入数据集的几个实际行。
matches.head(2)
id
season
city
date
team1
team2
toss_winner
toss_decision
result
dl_applied
winner
win_by_runs
win_by_wickets
player_of_match
venue
umpire1
umpire2
umpire3
0
1 2017 Hyderabad 2017-04-05 Sunrisers Hyderabad Royal Challengers Bangalore Royal Challengers Bangalore field normal 0 Sunrisers Hyderabad 35 0 Yuvraj Singh Rajiv Gandhi International Stadium, Uppal AY Dandekar NJ Llong NaN
1
2 2017 Pune 2017-04-06 Mumbai Indians Rising Pune Supergiant Rising Pune Supergiant field normal 0 Rising Pune Supergiant 0 7 SPD Smith Maharashtra Cricket Association Stadium A Nand Kishore S Ravi NaN
现在,对输入数据集有了基本的了解。我们被提倡用基本的数据分析来回答我们的问题。
数据集中有多少匹配项?
正如我们在上面看到的,id
是一个变量,当每个观察都匹配时,它对数据中的每个观察进行计数。因此,获取数据集中匹配的数量与获取数据集中的行数或变量 id 的最大值是一样的。
matches['id'].max()
636
我们的数据集中有 636 场 IPL 比赛。
数据集中有多少个季节?
IPL 像任何其他体育联盟一样,一年发生一次,因此获得数据集中独特年份的数量将告诉我们数据集中有多少个赛季。
matches['season'].unique()
array([2017, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
dtype=int64)
这给出了年份的列表,但是为了用所需的答案来回答这个问题,让我们计算在上面的步骤中返回的列表的长度。
len(matches['season'].unique())
10
哪个队因得分最多而获胜?
要回答这个问题,我们可以从逻辑上划分这个问题—首先我们需要找到最大跑垒数,然后我们可以找到拥有最大跑垒数的那一行(获胜的队伍)—这确实是以最大跑垒数获胜的队伍。我想在这里强调的是,将您的问题划分为逻辑子问题或模块,然后为这些子模块构建 Python 表达式/代码,最后将它们添加到所需的代码中,从而得到解决方案,这一点始终很重要。
matches.iloc[matches['win_by_runs'].idxmax()]
id 44
season 2017
city Delhi
date 2017-05-06
team1 Mumbai Indians
team2 Delhi Daredevils
toss_winner Delhi Daredevils
toss_decision field
result normal
dl_applied 0
winner Mumbai Indians
win_by_runs 146
win_by_wickets 0
player_of_match LMP Simmons
venue Feroz Shah Kotla
umpire1 Nitin Menon
umpire2 CK Nandan
umpire3 NaN
Name: 43, dtype: object
idxmax
将返回最大值的 id,该值又被输入到iloc
中,后者获取一个索引值并返回该行。
如果我们只对那一行中获胜的队伍感兴趣,那么可以按如下方式检索。
matches.iloc[matches['win_by_runs'].idxmax()]['winner']
'Mumbai Indians'
哪个队以最多的三柱门获胜?
和上一个类似,这个问题回答起来应该比较直白。
matches.iloc[matches['win_by_wickets'].idxmax()]['winner']
'Kolkata Knight Riders'
哪个队以(最接近的差距)最少得分获胜?
要知道以最接近的差距获胜的队,我们必须做与上述步骤相反的事情。但是有一个警告。在板球比赛中,如果击球第二的队赢得了比赛(通过追逐),就会说“第二队通过 x 次击球获胜”,如果保龄球第二队(首先击球)赢得了比赛(通过捍卫他们的得分),就会说“第一队通过 x 次跑垒获胜”。因此,在锦标赛中,跑垒的最小胜率将总是 0,而三柱门的最小胜率也将总是 0,因为有时追赶队或有时先击球的队可能会赢。为了克服这个警告,我们只需应用一个简单的变通方法,如下所示。
matches.iloc[matches[matches['win_by_runs'].ge(1)].win_by_runs.idxmin()]['winner']
'Mumbai Indians'
我们不是只获得最低分数(总是为 0),而是对 win_by_runs 大于或等于 1 的数据进行子集化(通过消除零问题)。
哪个队以最少的三柱门获胜?
按照与上述相同的逻辑:
matches.iloc[matches[matches['win_by_wickets'].ge(1)].win_by_wickets.idxmin()]
id 560
season 2015
city Kolkata
date 2015-05-09
team1 Kings XI Punjab
team2 Kolkata Knight Riders
toss_winner Kings XI Punjab
toss_decision bat
result normal
dl_applied 0
winner Kolkata Knight Riders
win_by_runs 0
win_by_wickets 1
player_of_match AD Russell
venue Eden Gardens
umpire1 AK Chaudhary
umpire2 HDPK Dharmasena
umpire3 NaN
Name: 559, dtype: object
为了进一步理解 Python 中的数据分析过程,让我们用数据可视化来回答进一步的问题,即通过绘制结果。
哪个赛季的比赛次数最多?
我们知道,如果每一行都是匹配的,那么计算每一季的实例/行的数量就可以得到每一季的匹配数。
sns.countplot(x='season', data=matches)
plt.show()
seaborn 中的函数可以立即完成这项工作(不需要显式的 group_by 和 count)
给出这个:
最成功的 IPL 团队
最成功的 IPL 团队是赢得最多次数的团队。这也意味着,回答这个问题和上面的练习一样,除了计算每个赛季的实例数,这里我们要计算每个获胜队的实例数。
#sns.countplot(y='winner', data = matches)
#plt.show
data = matches.winner.value_counts()
sns.barplot(y = data.index, x = data, orient='h');
给出这个:
虽然用countplot()
也可以很容易地做到这一点,但是引入另一个sns plot -barplot()
的变体已经被用来可视化它了。
比赛获胜者的最佳球员
top_players = matches.player_of_match.value_counts()[:10]
#sns.barplot(x="day", y="total_bill", data=tips)
fig, ax = plt.subplots()
ax.set_ylim([0,20])
ax.set_ylabel("Count")
ax.set_title("Top player of the match Winners")
#top_players.plot.bar()
sns.barplot(x = top_players.index, y = top_players, orient='v'); #palette="Blues");
plt.show()
给出这个:
对于那些关注 IPL 的人来说,你现在可能想知道这有多讽刺。克里斯·盖尔,是最成功的 IPL 球员,在第一轮没有被卖掉。
掷硬币赢对赢得比赛有帮助吗?
解决了上面这些并不太难的问题后,我们却无法得出一个关键的见解——那就是——掷硬币赢真的有助于赢得比赛吗?
用我们同样的方法把问题分成几个部分——我们可以把这个问题分成两部分——如果两者相同,比赛获胜者和掷硬币获胜者——那么它就是成功的,如果不是,它就是失败的。在想象结果之前,让我们先看看数字是什么样子的。
ss = matches['toss_winner'] == matches['winner']
ss.groupby(ss).size()
False 311
True 325
dtype: int64
看起来,掷赢实际上有助于赢得比赛——或者从统计学角度来说,我们可以说掷赢和赢得比赛之间存在相关性,因此我们可以假设它有所帮助。
要可视化结果:
#sns.countplot(matches['toss_winner'] == matches['winner'])
sns.countplot(ss);
给出了这个图:
至此,我们已经到了本教程的结尾,正如你可能已经注意到的,它只用了一行就回答了上面的几乎所有问题。这告诉我们两件事:Python 表达式在语法方面非常简洁;第二件事是,不需要几十行或几百行代码就能产生有价值的见解——只要几行代码就能产生神奇的效果——如果你问的问题正确的话!
希望这篇文章能帮助你开始你的 Python 数据分析之旅。如果你有兴趣了解更多,请查看这个免费的数据科学课程的 Python 介绍。这里使用的完整代码可以在我的 github 上找到。
用白板和熊猫分析南非政府的浪费性支出
关于一些数据分析的第一篇文章,着眼于不规则的政府支出,特别是公共实体对偏差和扩张的合同请求。这些数据可以在网上免费获得,我只是解析、探索和呈现它们。
Image source: Southern Vines
南非政府负债累累。这主要是由于不规则的支出,可以追溯到偏差和扩大招标。这些招标原本是为特殊情况准备的,但现在却成了常态。
2018 年 6 月,公共实体和部门 SARS 、 SITA 、国防部、公共工程部、水和卫生局& Trans Caledon 隧道管理局都被提出来解释可疑的偏离和扩大要求。这些包括夸大的 DSTV 订阅合同,价值数百万兰特的视频会议设备,食物和餐饮,等等。所有合同请求由财政部每季度发布一次。
获取数据
与大多数政府记录一样,每个季度的合同都是 PDF 格式的,如下所示:
The nemesis of the internet
为了解析数据进行分析,我尝试了tabula-py——tabula-Java 的 Python 包装器,可以读取和提取 pdf 中的表格。这是公认的,也是我在那里能找到的为数不多的好书之一。在将几个文件转换成?csv,我意识到它的解析没有我想要的那么准确。
所以我最终使用 Tabula GUI 手动选择表格以提高精确度,并导入。csv 喜欢熊猫。我分析了财政部网站上目前可用的所有季度——从 2016 年 Q2 到 2018 年第三季度。以下是其中的一些片段:
ex1 = pd.read_csv('expansions_q2_2016.csv')
ex7 = pd.read_csv('expansions_q3_2018.csv')ex1.head(5)
ex7.head(5)
清洁
为了这篇文章和每个人的健康,我大大简化了清洁过程——这比看起来要辛苦得多。
在上面的“head”示例中,您可能已经注意到桌子需要大量的清理工作。例如,“原始合同价值”列中的值条目在第一次导入时用逗号隔开,在第二次导入时用空格隔开。这是由于两个主要问题:1)财政部的数据输入缺乏一致性,2)缺乏完美的 PDF 解析。
“原始合同价值”栏中的许多条目使用了不同于其他条目的格式,包括:
array(['estimated R95 per\rtransaction', 'various', '168 849 638.40 -ABB\r20 961 068.87- Zest\r54 271 707.30 - Actom', 'Not stated')]
有些包括外币,如€250,455 和 334,908 美元。这些都从数据集中删除了,使我们的数据集超过 1600 行。
列标题的顺序也不同,标签也不同。在对列重新排序并全部重命名之后,我将所有的表连接起来:
ex_all = pd.concat((ex1,
ex2,
ex3,
ex4,
ex5,
ex6,
ex7
), axis=0, ignore_index=True)
df.head(4)
给我们这个人:
df.info()
All the objects…
在进一步清理之后,是时候进行一些探索性分析了。
探索性分析
df.sort_values('Value of Contract', ascending=False)[:6]
I also tokenised the ‘Project Description’ column, with the aim of doing some text analysis a bit later, but never got around to it.
df['Value of Contract'].sum()/1000000000000)[:7]
在过去的 10 个季度中,总共需要价值 19.4539 万亿兰特的合同。
一些合同价值看起来很像打字错误,如果有人只是在一个随机的数字上加了一串零,那么我不得不仔细检查许多条目,以确保这不是解析方面的问题。
查看所有合同没有太多意义,也有点脱离上下文,所以让我们只考虑那些被授予或标记为“受支持”的合同。
df['Support Status'] = df['Support Status'].str.lower()supported_contracts.head()
supported_contracts.info()
我们所有的条目都是对象,这需要一些重新格式化。我将所有数字条目转换为浮点数,将日期条目转换为 Python 的 date.time。
supported_contracts[‘Value of Contract’] = pd.to_numeric(supported_contracts[‘Value of Contract’], errors=’coerce’)supported_contracts['Date Awarded'] = pd.to_datetime(supported_contracts['Date Awarded'], errors='coerce')supported_contracts['Contract Start Date'] = pd.to_datetime(supported_contracts['Contract Start Date'], errors='coerce')supported_contracts['Contract Expiry Date'] = pd.to_datetime(supported_contracts['Date Awarded'], errors='coerce')
现在,只看支持的合同,授予的合同总价值为 9540 亿兰特。
(supported_contracts['Value of Contract'].sum() / 1000000000).round()# in billions contracts awarded
为了更容易地根据日期调用值,我对“授予日期”列进行了索引:
supported_contracts.index = supported_contracts[‘Date Awarded’]del supported_contracts[‘Date Awarded’]supported_contracts.head(2)
(supported_contracts[‘2016’][‘Value of Contract’].sum() / 1000000000).round()# in billions contracts awarded in 2016
2016 年授予 3110 亿兰特。
我清理了数据框架,删除了以下各列,使其更具针对性:
supported_contracts.drop('Reason', axis=1, inplace=True)supported_contracts.drop('Contract Expiry Date', axis=1, inplace=True)supported_contracts.drop('Contract Start Date', axis=1, inplace=True)supported_contracts.drop('Description Tokens', axis=1, inplace=True)
然后我想象了一些我们的发现:
support_contracts = support_contracts['2016':'2019']support_contracts.resample('D').sum().plot()
fig = plt.gcf()legend_label = mpatches.Patch(color='blue', label='Total Value of Contracts')plt.legend(handles=[legend_label])plt.suptitle('Contracts Awarded Over Time', fontsize=16)plt.rcParams.update({'font.size': 9})fig.set_size_inches(15, 8)
看看这些峰值是什么,我将“合同价值”下的所有条目按降序排列:
# top contracts supported ranked in terms of valuesupported_contracts.sort_values('Value of Contract', ascending = False)[:9]
惩教服务和卫生部(或称卫生部)在过去两年中获得支助的最大合同是"提供和管理食品服务"和"为公共部门病人提供替代性慢性药物获取方案"。
为了更好地了解每个实体对总支出的影响,我查看了它们的总合同价值以及与其他实体相关的合同量:
def value_percent(entity):
entity_df = supported_contracts[supported_contracts['Entity'].str.match(entity, na=False)]
entity_value_total = entity_df['Value of Contract'].sum()
percentage = (entity_value_total / supported_contracts['Value of Contract'].sum())*100
return percentage.round(2)def freq_percent(entity):
try:
percentage = (df['Entity'].value_counts()[entity]/len(df))*100
return percentage.round(2)
except KeyError:
pass
并创建一个新的数据帧:
impact_df = {'Entity': supported_contracts['Entity'].str.title(),
'Frequency of Appearance': supported_contracts['Entity'].apply(freq_percent),
'Value of Contracts': supported_contracts['Entity'].apply(value_percent)}# only interested in top 10 for nowimpact_df = pd.DataFrame(data=impact_df).drop_duplicates(subset='Entity')
impact_df.sort_values('Value of Contracts', ascending=False)[:9]
就总“合同价值”而言,南非国家电力公司占 21.42%,南非国家电力公司占 16.20%,南非国家电力公司占 13.88%。
让我们来看看十大最昂贵的实体之间的相互关系:
cmap = plt.get_cmap('Spectral')
colors = [cmap(i) for i in np.linspace(0, 1, 9)]impact_value_df.index = impact_value_df['Entity']plot = impact_value_df.plot.pie(y='Value of Contracts',
autopct='%.0f%%',
figsize=(8, 9),
colors=colors)plt.suptitle('Share of Total Contracts by Value', fontsize=16)plt.show()# the chart only shows the total share of the top ten most 'expensive' entities (it excludes the other)
每卷合同份额也是管理不善的一个有趣指标,如下图所示。为了可视化最常见的合同,我使用了一个 Seaborn 图表:
impact_freq_df = impact_df.sort_values('Frequency of Appearance', ascending=False)[:9]f, ax = plt.subplots(figsize=(15, 5))
sns.set_color_codes("muted")sns.barplot(x = 'Entity',
y = 'Frequency of Appearance',
data = impact_freq_df,
palette='dark',
alpha=.6)plt.suptitle('Share of Total Contracts by Volume', fontsize=16)plt.show()
对于这个数据集,还可以做更多的事情,但目前就这些了。其他一些建议是根据合同量和总价值分析顶级供应商,或者测试可以识别可疑请求的不同公式。
我计划一个月至少做两个数据集,最好是在非洲背景下——如果你有任何数据集、评论、想法或建议,请随时分享。
使用机器学习分析用户的购物行为——第一部分
上周,Instacart 发布了他们第一个公开的数据集。该数据集包含来自 200,000 多名 Instacart 用户的超过 300 万份杂货订单。毫无疑问,有大量的数据可以从中得出真知灼见。所以,我运用我的分析本能。
我读过很多关于美国人对食用有机食品的痴迷。数据讲述了同样的故事。订购最多的 20 种食品中有 15 种是有机食品。对于这些商品,我分析了一天中每个小时的订单。对他们中的大多数人来说,情节看起来是相似的。
Orders Vs Hour of day for 20 most ordered items
在一天的 9 小时左右有一个峰值,在一天的 14 和 15 小时有另一个峰值。结果直观吗?我想是的。大多数人在早上订购食品杂货作为早餐和午餐。或者午饭后的傍晚。这些统计数据可用于库存管理以及调度和优化交付资源。
另一个有趣的分析是重新排序最多的项目。凭直觉,我的答案会是牛奶、鸡蛋或一条面包。这些几乎每天都在消耗,所以你可能会有很多再订购。下图显示了 20 个最常重新订购的数量以及重新订购的百分比。
Count of reorders vs percentage of reorder for 20 most reordered items
从这些有趣的可视化转向复杂的预测分析。根据可用的功能,我们能否预测客户下次来访的订单、再订单和首次订单的数量?
在做任何预测之前,我喜欢问自己这个问题——这个预测有意义吗?好吧,行为经济学家对我们有话要说——“可以预见,人类是不理性的”。
我们重复事情。我分析了我在一个食品订购应用程序上的最后 10 个订单,我可以看到这种模式。回到分析,我将特征缩小到属性,例如订单 _ 星期 _ 日、订单 _ 小时 _ 日、天数 _ 自 _ 前 _ 订单和我的所有部门(冷冻、餐具室、早餐、乳品等)。)转换成数值变量。使用随机森林回归,我可以在预测订单数量时获得 0.93 的 r2_score,在预测再订购数量时获得 0.75 的 R2 _ score。
在第二个分析系列中,我希望对订单执行聚类,以找到不同部门之间的相关性(我们能否回答这样一个问题,“乳制品订单越多,冷冻食品订单越少?”或者也许是“点的酒越高,点的饮料和小吃就越高?”我希望有更广泛的用户级数据,但由于匿名,这些属性没有公布。
我们能否根据订购食品的种类和数量来划分市场。我们能向用户做出预测和推荐以增加销售吗?订单之间是否存在与通道、部门、时间或用户活动相关的模式和相关性。我将在分析的第二部分尝试回答这些问题。
对此有任何想法或建议,请在下面的评论中随意拍摄!
干杯:)
用 Python 中的 fbprophet 包分析股市周期
重要提示:这不是投资建议。
股票市场周期是股票市场的长期价格模式,通常与一般的商业周期有关。它们是技术分析的关键,在技术分析中,投资方法是基于周期或重复的价格模式。如果我们对股票市场的周期有更好的理解,我们总是可以在每个周期中以相对低的价格买入,以相对高的价格卖出,我们总是会有正的回报。多么美好的世界啊!当然,股市中没有永远赚钱的优越策略,但 Python 或 R 中的fbprophet
包可以帮助我们更深入地洞察股市中隐藏的周期。在这个分析中,我们可以看看fbprophet
如何帮助我们做出投资决策,所有代码都可以从这里获得。
fbprophet 简介
bprophet 是脸书发布的开源软件,目的是为大规模的预报提供一些有用的指导。默认情况下,它会将时间序列分为趋势和季节性,可能包含每年、每周和每天。然而,分析师可以定义自己的季节性。为了更好地理解这个包,Prophet 的文档非常有用。
包装的特点之一是它的简单性和灵活性。由于我们想要计算的股票市场周期并不局限于每年、每周或每天,我们应该定义自己的周期,并找出哪个更符合数据。此外,我们不应该使用周季节性,因为周末没有交易。我们也可以通过add_seasonality
函数定义我们的‘自定义循环’。所有的设置只需要两行代码就可以完成。
股票市场周期分析——以好市多为例
我们可以用好市多从 2015/10/1 到 2018/10/1 的接近价格作为例子,来更好地了解我们正在做的事情。用pandas_datareader
我们可以很容易地获得股票价格。这里的文档是。在图 1 中,我们可以看到,从 2015 年开始,价格呈强劲增长趋势。但是,旅途中还是有很多起起落落,或者说循环往复,这些都是我们要赚钱的。
Figure 1: Costco stock price from 2015/10/01 to 2018/10/01
对于预测模型,评估它们的一种方法是样本外均方误差。我们可以使用 2015/10/1 到 2018/3/31 进行训练,并保留最后 6 个月来测试和计算样本外均方误差。在每个周期内,我们可以通过在最低价格买入,在最高价格卖出来优化我们的回报。为了使过程更容易,我们使用自定义函数cycle_analysis.
。输出是一个列表,包含每个周期的预计回报和样本外均方误差。该功能的输入需要:
- **数据:**熊猫数据帧带时间索引
- **拆分日期:**拆分培训和测试数据的日期
- **周期:**每个周期的周期(天数)
- **模式:季节性相加或相乘(可选,默认相加)
- forecast_plot: 是否打印预测图*(可选,默认为 False)*
- print_ind: 是否打印每个周期的预计收益和样本外均方误差*(可选,默认为假)*
在图 2 和图 3 中,我们对好事多股票价格应用了两种不同周期长度的函数,分别为 30 和 300,并将 2018 年 4 月 1 日作为训练和测试的拆分日期。正如我们所看到的,如果我们选择的时间太短(例如 30 天),一个周期内的回报就很小,我们需要频繁地进行交易(图 2;相比之下,如果我们选择一个太长的时间长度(例如 300 天),就会扭曲我们的预测(图 3)。)
Figure 2: Prediction with cycle equal to 30 days
Figure 3: Prediction with cycle equal to 300 days
我们可以在我们的cycle_analysis
函数上应用一个循环来计算不同周期长度的预计回报和样本外均方误差,我们在图 4 中显示了结果。正如我们所看到的,长度越长,每个周期的预计回报和样本外均方误差都会增加。考虑到交易成本,每个周期内的预期收益应该大于 10 美元。在这种约束下,我们可以选择使样本外均方误差最小的周期,它是 252 天。每个周期的预计回报为 17.12 美元,样本外均方误差为 15.936。都挺好的!
Figure 4: Projected Return and Out-Sample Mean Squared Error for different length of cycle
Figure 5: Prediction with cycle equal to 252 days
为了进一步说明投资策略,我们可以看到 2015/10/1 和 2018/10/1 之间的买入和卖出日期。Return_Dates
函数可以返回所有买卖日期作为输出,输入:
- 预测: fbprophet 预测对象
- **股票 _ 数据:**带时间指数的熊猫数据框
- **周期:**周期长度
- **周期名称:**预测对象中周期列的名称
- **时间名称:**预测对象中时间列的名称
在 2015/10/1 和 2018/10/1 期间,我们将买入和卖出好市多四次。总的来说,我们会花 604.56 美元购买,当我们在这些特定的日期出售它们时,会得到 744.78 美元的回报。对于一个简化的回报率(不考虑再投资、时间价值等),3 年是 23.2%。大概不是很吸引人,但至少是正回报。
适用于更多股票
当然,这种方法可以适用于尽可能多的股票。我们列出了好市多、苹果、微软、家得宝和耐克在每个周期内的平均买入价格、平均卖出价格、周期长度、样本外均方误差、买入数量、卖出数量和预期回报。
对于微软和耐克,我们找不到任何周期符合我们的要求,每周期超过 10 美元的回报。对于好市多、苹果和家得宝,我们可以找到 250 天左右的周期,并做出良好的预测和体面的回报。
摘要
借助 Python 和fbprophet
包,我们可以对股票市场有更好的了解。以 Costco 为例,我们可以找到一个 252 天的周期,这样它就可以产生足够的回报,并有很好的数据拟合。按照我们找到的周期,3 年可以有 23%左右的回报。也许这种投资策略不能满足你的需要,但是你可以根据你的知识和经验来设定你自己的方法。强大的fbprophet
软件包可以让你对股市的分析更加深入和简单。
2018 年 Crossfit 公开赛分析
Photo by Victor Freitas on Unsplash
你好,在这篇文章中,我将给出一些关于如何创建网页抓取系统的线索,该系统已被用于从锐步的 Crossfit 游戏网站收集一些数据。
交叉拟合简介
交叉拟合定义为
a strength and conditioning program consisting mainly of a mix of aerobic exercise, calisthenics (body weight exercises), and Olympic weightlifting
这个项目似乎是在 2000 年由 Greg Glassman 和 Lauren Jenai 邀请的,这项运动以 CrossFit,Inc 的名义获得许可。
我邀请你看一下 YouTubeCrossfit Inc 频道上的一些视频,以便更好地了解在一次训练中应该做些什么。
就我而言,我从 2017 年 8 月开始练习 crossfit,每周三次,我真的很喜欢它,当我开始的时候,我把这项运动看做一些高强度的健身房运动。
更严重的是,我有点担心强度的练习,从我的角度来看,可能会严重伤害人,但这项运动是为每个人都没有必要成为超人来练习交叉健身。
优点是每项锻炼都可以根据你的需要(身体状况、受伤情况)来衡量重量和运动量,但唯一的目标是完成锻炼。永不放弃可能是 crossfit 的座右铭。
世界杯冠军的选拔非常简单,过程分为三个阶段:
- 公开赛,每个人都可以参加这个资格赛,分组是按年龄和性别划分的,如果你不在可以验证你表现的附属健身房,你可以拍摄下来发给组织者。
- 地区赛,公开赛中的最佳选手将参加比赛
- 第十三届奥运会第十四届世界杯
对于本文,数据收集将仅是可以在此地址找到的公开的 2018 年数据。开口定义为:
- 为期 5 周,每周公布一个新的 wod(每日锻炼计划)
- 有 4 天时间来争取在世界上取得最好成绩
所以为什么我想用这个案例来介绍网络抓取:
- 我在 Crossfit 游戏网站的 scraping 上读到了一篇很酷的文章
- 我发现排行榜的展示在比较方面非常有限
- 我想做一个网页抓取练习已经很久了
所以让我们开始吧。
网页抓取 101
在这种情况下,我决定删除以下元素:
- 本文的排行榜页面我们将致力于 2018 年的结果,但如果您想要上一年的方法,我邀请您查看关于该主题的这篇文章
- 运动员页面,因为每个运动员都有一个包含一些有趣信息的页面
- 健身房页面包含一些关于健身房位置的细节
为了从这个网站收集数据,我使用了名为 Beautiful Soup 的包,这是 Python 中非常流行的网络抓取工具。在接下来的部分中,将描述收集的数据和相关的代码。
你可以在这个 GitHub 库 中找到本部分解释的所有功能。
排行榜
没有必要删除网页,前端使用的 API 可以通过简单的 get 请求直接调用。感谢 @pedro 注意到这一点。请求中只需要提到:
- 分部的代码
- 如果排行榜涉及按比例增减的运动员或未按比例增减的运动员
- api 的页面(可以从第一页的请求中获得)
这是要执行的请求。
运动员页面
在这种情况下,运动员页面看起来像下图中的屏幕截图
在页面底部,有一些练习的基准。
因此,我决定删除过去 5 年中参加公开赛的所有运动员的页面,这代表了超过 700000 页要删除,为了优化收集,我决定并行处理该过程,并使用以下代码获取一页的数据。
体育版
在健身房页面的情况下,收集的信息量没有运动员重要,下图是健身房页面的截图。
该脚本将重点放在页面标题的细节,这涉及到的位置。在这种情况下,要废弃的页面数量大约为 10000 页,下面的代码用于实现这一点。
过程背后的伦理
如你所知,我的系统收集了大量数据,问题是这是否合法?。
如果我指的是普遍的看法,它在互联网上,所以它是免费的,这很好如果我指的是这篇文章,它似乎比这更复杂,我似乎做了一些非法的事情,因为我不尊重网站的使用条款,所以我决定联系 Crossfit Inc .警告他们我所做的事情,并获得他们的反馈(我通过他们的表格和一些与隐私相关的电子邮件地址等联系了该组织)。
2018 年 4 月 29 日:我没有收到他们关于这个问题的反馈。
从我的角度来看,我认为这是说,直到我没有发布运动员的个人信息和出售数据集,但谁知道呢?
让我们来看看数据集的一些全局见解。
你可以在本 GitHub 库 中找到本部分解释的所有功能。
对 2018 年公开赛的见解
在这一部分,它将主要是一个非常一般的开放事件的概述。分析将从性别再分配开始。
很高兴看到有相当数量的男性(56.8%)和女性(43.2%)(与我在培训期间看到的情况相似)参与公开活动。现在让我们来看看时代的重新划分。
性别之间的年龄分布非常相似,年龄大于 60 岁的运动员被认为是异常值。另一点要注意的是,运动员的平均年龄大于 30 岁,这可能是也许的标志:
- 参加公开赛需要经验(但我不会打赌)
- 成为会员的代价太高了
- 视频分级提升的不是很好
下面的分布图很好地说明了这种年龄划分。
这是与收入相关的年龄划分的例证。现在让我们看看运动员的数据。
运动员分析
为此,我使用了运动员页面中的一部分数据,我过滤了不符合身体质量指数(身体质量指数)的离群数据,这些数据不在 13 到 83 之间,还有一些错误的体重和身高值。有一个形态学的可视化。
运动员的一般物理似乎是:
- 大约 80 公斤的体重
- 180 厘米左右的身高
在国家再分配方面,美国领先。下图统计了美国和其他前 10 个国家参加该项目的运动员人数。
我认为对 crossfit 在美国的流行没有什么可评论的,如果我把更多的注意力放在其他国家,会有一些有趣的见解。在下图中,有更多关于前 10 名国家(就运动员数量而言)的细节,不包括美国。
我们可以看到:
- 美国和第二个国家之间有巨大的差距(比如 20 万名运动员)
- 运动员人数第二多的国家,这不是一个国家,而是所有运动员的协会,他们只是在拍摄他们的世界。
- 巴西和部分英联邦国家的运动员对此明显感兴趣
- 在欧洲参赛的运动员人数不那么重要
现在让我们来看看给运动员打分的体育馆的一些细节。
健身房/拳击数据分析
所以要明确的是,美国有相当数量的健身房/运动员参与这项活动。下面是美国健身房的数量和其他 9 个健身房较多的国家的健身房数量的比较。
美国正在实实在在地压榨其他国家。下图显示了其他国家健身房的数量。
有趣的是看到(运动员号码和体育馆号码之间有很多相似之处,这很正常):
- 巴西有很多健身房
- 英联邦(加拿大、英国、澳大利亚)出席了会议
- 法国在排名中领先欧洲(但意大利很接近)
我可以继续用这些数据制作大量的图表,所以我决定制作一个交互式的仪表板,我可以在任何时候轻松地制作,为此我将使用 Tableau
桌面上的仪表板公共
Tableau Public 是 2003 年由山景城的一家公司基于斯坦福大学(vizQL)的工作开发的一项服务。该公司于 2013 年在纽约证券交易所上市,拥有 2400 名员工(2015 年的数字)。
Tableau 开发了不同的产品,但该工具的目的是通过创建和共享仪表板来促进整个企业的数据信息交换。
我邀请看一看他们的网站上有更多的产品细节,对于这个项目,我使用 Tableau 公共创建以下仪表板。
[## Tableau 公共
编辑描述
public.tableau.com](https://public.tableau.com/shared/M345H9FB7?:display_count=yes)
最后,我想在数据上更进一步,只关注基准测试,试图找到它们之间的联系。
练习之间的关系
为了分析数据,我必须消除异常值,为此我添加了选项:
- 在数据标准化后,使用 dbscan 检测异常值(有效,但将它应用于所有有数据的运动员有点长)
- 使用基于分位数的统计方法,删除低于 5%分位数限制和高于 95%分位数的值
我直观地发现了练习之间的一些关联,如下图所示。
因此,我想将相关性(一种线性关系)的研究应用于所有的练习,我对 1000 名运动员应用了一个线性模型,并对 250 名运动员测试了该模型,以了解该模型是否足够好。我使用 r 分数作为指标来评估模型的效率。
在训练集中,涉及负重的练习彼此高度相关,涉及持续时间的练习显示出不太重要的相关性。当模型应用于测试集时,重量练习的相关性仍然很好,但是随着时间的练习在训练集上绝对是过度拟合的。下图显示了与体重相关的锻炼的线性模型。
为了更好地了解体重改变对一项运动的影响,我创建了一个表格,将一项运动的体重改变转换为另一项运动的体重改变。
结论和下一步措施
这个项目非常有趣,收集网站数据绝对非常实用,从这个数据集中可以获得一些见解(通过快速分析)。
该项目的下一步是:
- 创建一个 Kaggle 数据集(如果锐步可以的话)
- 创建某种 API,使用这些数据给出训练建议
- 根据运动员个人资料上的图片,当年龄和性别正确时,创建一个模型,从某人的面部确定其性别和年龄(年龄范围)
- 在表格上添加更多的历史数据(我收集了过去 5 年的数据,但过去数据的格式有点不同),可能还会添加地区赛和比赛数据
- 改进和构建其他仪表板
原载于 2018 年 3 月 30 日【the-odd-dataguy.com】。
浅析中国新兴社交媒体——红宝书
红宝书(https://www.xiaohongshu.com)已经成为中国发展最快的社交媒体之一。与流行的微信和微博不同,红皮书专注于美容和时尚细分市场,尽管我们确实看到自其早期阶段以来,内容多样化,进入了一般生活方式类别。由于该公司尚未上市,因此几乎没有公开数据。为了了解该平台,我构建了一个爬虫来获取概要信息,并根据爬取的信息进行数据分析。
如何获取数据?
红皮书有一个在网络客户端提供内容的网站。尽管初始主页可供我们抓取的内容有限,但我们可以识别出指向其用户个人资料页面的链接。从那里,我们可以跟进评论者的个人资料以及更多的帖子来继续爬行。我将有一个关于技术细节的单独文章。
数据大小
红皮书有非常严格的反爬虫机制来阻挡爬虫,所以 IP 轮换是获取大规模数据的必须。在 4 天的时间里,我从平台上抓取了 899,519 个个人资料。虽然这只是代表了红皮书庞大用户数据库中的一小部分,但所有这些用户都至少在平台上产生了一些活动(要么是写帖子,要么是创建版块,要么是评论别人的帖子)。因此,这个数据集可以用来识别红皮书最活跃的用户群的特征。
指标解释
红皮书为用户提供了三种参与内容的方式。用户可以喜欢内容,“收集”内容或对内容进行评论。“喜欢”的功能类似于脸书的大拇指按钮,而“收集”意味着将一段内容保存在应用程序的书签系统下,以供进一步参考。一般来说,人们会在感兴趣时喜欢某个内容,并在帖子可以用于进一步参考时“收集”该内容,包括那些稍后重新访问的有用提示和他们最终可能想要购买的产品。第三个指标是“评论”,提供帖子的交互性。不幸的是,Redbook 没有提供一种简单的方法来跟踪评论数量的聚集,所以这个字段不会包含在本文中。
朱庇特笔记本可以在https://github.com/Gravellent/redbook_analysis找到
谁是红皮书上最有影响力的用户?
The top 10 users (excluding the official accounts) are:
范冰冰
林允 Jelly
张韶涵
Ritatawang
时髦小姐姐
凌听雨
江疏影
Irene 林恩如
欧阳娜娜 Nana
美七是我
Although celebrities have been keen on joining this emerging platform, there is a good mix of internet KOLs and true celebrities. Specifically, Ritatawang and 美七是我 did not have much influence before they joined Redbook.
红皮书上的男性用户?
红皮书的一个主要特点是它的用户主要是女性。我们的数据显示,只有 2%的用户是男性。超过 60%的用户没有表明自己是男是女,但是经过一些人工检查后,似乎不明身份的用户跟那些在注册时选择性别的用户有相似的特征。
除去身份不明的,女性贡献了 95%的用户群。这与我们的预期相似,因为平台上生成的大多数内容都是面向女性的,以各种美容产品和时尚相关的内容为特色。
然而,现在说女性是社交电子商务操场上的唯一玩家还为时过早。虽然男性用户仅占用户总数的 5%,但他们对女性用户的影响力更大。在计算每个性别产生的总点赞数后,我们看到男性用户贡献了总点赞数的 8%。在收集的帖子中,男性占 5.9%,略低于总点赞数的比例,但仍高于其人口比例。对这种差距的一种解释是,红皮书上男性的内容通常被认为是“有趣的”,但读者不一定想以后再看这些内容。另一方面,女性内容创作者可以提供有用的信息和进一步的参考
从影响力的角度来看,男性的影响力甚至更大。男性用户在平台上的平均粉丝数要高得多。男性的平均粉丝数超过 2400 人,远远超过女性的 842 人。
有趣的是,中位数和四分位数分析显示了相反的结果。男性用户的粉丝数量中位数为 5,而女性用户的粉丝数量中位数为 11。75%的四分位数结果还表明,大多数男性的活动范围小于女性。那么为什么男性的平均分要高很多呢?
查了粉丝数 1 万+和 10 万+的用户性别分布,原因就清楚了。有一群顶级男 kol,他们在平台上处理的粉丝往往超过 10 万。那些人有很大的影响力,扭曲了统计数据。另一方面,对于少数非 kol 的男性用户,他们与社区的互动并不强烈。
红皮书用户在哪里?
Redbook is known for its high conversion rate to sales. The users on the platform tend to have a strong interest in purchasing high-end beauty and fashion product. Many people refer to the platform as a “种草平台”, which basically means people search for products that interest them and “initiate” the desire to own them eventually. Many of the products discussed on the platform are from major international brands, so the viewers usually process high purchasing power. So where are these users? It’s common knowledge that the majority of the higher-income group locate in Beijing, Shanghai, Shenzhen, and Guangdong. Would the user group fit this demographic?
Again, we start out with analyzing all the data for user location. Since Redbook default a user’s location to “Others”, we see that only 40% of its users input meaningful location information. On top of that, some users stop inputting more information after “China”. For this purpose of this analysis, we will only look at the those who identify themselves in provinces or cities.
用户数量排名前五的省份是广东、上海、北京、浙江和江苏,占整个用户群的 30%以上。红皮书的总部设在上海,说明上海都市圈是其主要的用户群。(注:上海、浙江和江苏可以被认为是一个拥有几个高调城市的大都市圈)广东省的 GDP 总量最高,拥有中国最大的两个城市广州和深圳,因此它是用户最多的省份并不奇怪。
虽然从数量分布来看,广东是第一大省,但从地理上分析其用户群也需要考虑用户的质量。也就是说,我们需要看看用户能产生多少参与度。在用户点赞和收藏方面,上海遥遥领先。由于该公司是在这座城市成立的,他们的许多种子用户来自该地区是可以理解的。我们发现的另一个有趣的趋势是,有一群红皮书 kol 生活在国外,并产生良好的影响。澳大利亚、美国和英国都位列前十。考虑到这些国家的 kol 数量较少,居住在中国以外的用户平均比居住在国内的用户具有更高的影响力。
限制
由于数据不包含整个用户数据库,所以对于所有用户的分布可能是不准确的。此外,对于性别和位置分布分析,由于超过一半的用户没有输入信息,因此很难估计如何将结论推广到整个用户组。此外,由于用户自己输入信息,他们中的一些人可能会使用不准确的信息进行注册(例如,声称他们住在船上,而他们并不在船上)。
结论
平台上最有影响力的用户包括名人和 Redbook 自己的 kol
广东的用户数量最多,但上海的用户产生的影响力最大。
·在美国、英国和澳大利亚有大量用户,他们比其他用户群显示出更强的影响力。
分析师:停止衡量其他一切,开始衡量你的数据项目的价值!!!
TL;速度三角形定位法(dead reckoning)
衡量你的项目的商业价值是非常简单的,并且有很多好处,但是似乎没有人想到要这么做。因此,这里有一种方法。
我有幸在数据和分析领域工作了 5 年——在两家财富 500 强企业,现在在一家初创公司。
我帮助组织聚会,我参加过多次会议,我看过很多在线课程,我向独角兽学习,并和它们一起工作…
基于所有这些经验,我认为分析学作为一门学科,在如何衡量投资回报(ROI)方面有一个 T2 盲点(T3)。具有讽刺意味的是,it 纠结于如何衡量其他一切!
Running an Analytics project without an ROI measure is like merging a semi-trailer without checking your mirrors. Measuring your project’s ROI is easy to do, and saves you (and others) grief.
这一点在最近的悉尼人工智能和机器学习峰会上的一个关于“做出关于自动化的正确决策”的小组中得到了强调。非常聪明、多才多艺的人花了 40 分钟讨论选择问题时所有的技术问题,但甚至没有花一秒钟考虑如何评估解决问题的商业价值——以及你的项目是否值得这个成本。
我明白了——分析师或数据科学家更愿意调整模型,而不是编造商业案例。但是展示你工作的价值非常简单,这是与高级管理层建立信任并为下一个项目争取更多资源的关键。
因此,为了回报我在这个主题上得到的所有帮助,本文包含了我计算数据项目商业价值的方法。
我已经把这个方法分解成了一个等式、一些理论和一些简单的例子。我们希望这些例子能够证明这种方法是多么容易实践,以及这种方法如何能够适应范围极其广泛的项目。我非常乐意在评论中对你的例子进行抨击——出于时间的考虑,我只举了两个例子,但我每天都这样做,而且我确实在盯着一张大约 140 个商业价值计算的表格,我用它来证明我的存在。
最后,这种想法很有卖点。它曾为甲骨文公司直接向企业销售数十万美元的合同。在 Salesforce,它帮助我获得了数十万美元的预算。它在 Jayride 工作…摸木头!这对你有用——或者你可以把我烧死。
方程式:
V = (S + M + R + O) — C
因素:
V =商业价值
储蓄的钱
M =钱 M 阿德
风险降低
O = O 机会被抓住
C =项目总成本 C
理论:
数据科学、BI 或任何东西分析是企业内部的一项职能。一个业务职能通过省钱、赚钱、降低风险或帮助抓住机会向管理层展示价值。
净商业价值就是所有这些因素的总和,减去项目的成本。你也可以除以项目的成本,给出一个“投资回报”比率,这个比率可以被管理层(和你自己)与其他计划进行比较。
你如何衡量所有这些因素?
对于节省的金钱来说,这非常简单——估算一下你为某人节省了多少时间,并知道一小时人工服务的平均价值。一个很好的经验法则是每小时 50 美元——所以节省了 x 个小时,你就节省了 50 倍的钱。
对于金钱(M ),这很简单——你在你的项目(b)之前,对你所帮助的东西的收益表现进行基准测试,然后在你的项目(a)之后,衡量你所帮助的东西的收益表现。绩效之间的差异,M = a-b,是你的项目赚的钱。如果你正在创造一种全新的赚钱方式,你就不必担心标杆管理(即 M = a)。 Avinish Kaushik 在这里为这种测量提供了一种全面的方法。
对于 R isk Reduced ®,你估计最坏情况成本(w),在你的项目(s)之前发生的概率,以及在你的项目(t)之后发生的概率。由于风险是成本和概率的倍数,因此降低的风险就是两者之差,即 R = w(s-t)。
OO 抓住的机会(O)就是 R isk 减少的倒数——您衡量的是最佳情况下的收益(y——为 yay!…我快没信了),在你的项目之前发生这种情况的概率(h),在你的项目之后发生这种情况的概率(e)。O = y(e — h)。
Pro tip: 不要在估算用于降低风险或抓住机会的概率时混淆视听!通常,来自主题专家的粗略估计就足够了。还有如果你真的必须深入研究,找一个精算师,或者看看道格拉斯·哈伯德的《应用信息经济学》(你可以在这里得到关于少犯错的精彩概述,或者买他的书)。
最后,成本就是项目材料清单的总成本。不要忘记估计你的时间成本。永远要知道你的业务成本,并确保你所做的事情比这更有价值!
示例:
- 你在做一个恶心的仪表盘!
这个仪表板将帮助管理人员每月节省 10 个小时(x)的电子表格处理时间。
此外,这种可见性将有助于降低人们过度抱怨您的人力资源系统的风险,从 50% (s)降低到 10% (t),最坏情况下每月成本为 2000 美元(基于历史记录)。
这将花费你一天的工作量——或者大约 8 个小时。
在这个花瓶里,V =(S+R-C)/C =(10 * 50+2000 *(0.5–0.1)-8 * 50)= 900 美元/月
恶心!
A sick dashboard. Credit — https://databear.com/portfolio-items/power-bi-sick-leave-dashboard/
2.你在建立一个很棒的模型!
该模式旨在帮助您的客户支持团队致电高风险客户并保持他们的满意度,并且有机会节省业务,最好的情况是每月节省 10000 美元的资源。客户支持团队目前在交叉销售中每月收入 3000 美元,你认为在你锁定目标后可能会更多。这将花费你大约一周的时间来交付,你和你的团队估计在模型完成后这种收益的可能性大约是 50%,而在模型完成前是 0%。
所以 V = M+O-C = 0+10000 *(0.5–0)-40 * 50 =每月 3000+。
大概不止这些,所以别忘了衡量项目后赚的钱。
太棒了。
I didn’t know this was a thing. Credit — https://en.wikipedia.org/wiki/Apache_Groovy
概括起来
衡量你的项目的商业价值是非常简单的,并且有很多好处,但是似乎没有人想到要这么做。我已经给了你一个方法去做——那就去做吧。
P.S .特别感谢 Verge Labs 的好心人,他们为我找到了一张悉尼人工智能和机器学习峰会的门票——这是一个伟大的事件!
线性回归的解析解
介绍
我们知道像梯度下降这样的优化方法可以用来最小化线性回归的成本函数。但是对于线性回归,存在一个解析解。这意味着我们可以通过使用正确的公式,在一步计算中获得线性回归的变量。在本帖中,我们将探究线性回归及其衍生的解析解。
解析
我们首先给出了线性回归的解析解公式。如果你对导数不感兴趣,你可以用这个公式来计算线性回归变量。解决方案是:
在这个公式中,所有符号都是矢量化的。如果你不熟悉线性代数或者矢量化,可以参考这篇博客。在这个公式中,X 是一个 m 乘 n 的矩阵,这意味着我们有 m 个样本和 n 个特征。符号 y 是代表目标标签的 m 乘 1 向量,θ是代表每个特征所需的所有系数的 n 乘 1 向量。
派生
我们知道线性回归代价函数的矢量化表达式(更多细节请参考博客)可以表示为:
由于 1/(2*m)是一个常数,当我们最小化一个函数时,将成本函数乘以或除以一个非零常数不会影响最小化结果,因此在这种情况下,我们忽略这个常数项。为方便起见,我们的成本函数变为:
这可以进一步简化为:
我们将其扩展为:
现在第二学期需要一些转变。我们知道 X 是一个 m 乘 n 矩阵,θ是 n 乘 1 矩阵,因此 Xθ的维数为 m 乘 1,其转置矩阵的维数为 1 乘 m,由于 y 是 m 乘 1,因此第二项的维数为 1。换句话说,第二项是标量。我们知道标量的转置等于其自身,因此我们取第二项的转置得到:
我们将 is 代入成本函数,得到:
此外,我们可以把它写成:
现在我们需要对成本函数求导。为方便起见,列出了常见的矩阵导数公式作为参考:
使用上述公式,我们可以推导出关于θ的成本函数:
为了求解变量,我们需要使上面的推导等于零,即:
我们可以将其简化为:
因此,我们可以将θ计算为:
结论
在这篇博客中,我们给出了求解线性回归变量的解析解。我们详细介绍了如何从成本函数的推导中得出这个结果的步骤。
分析 4.0:一切都是为了做出更好的决策
Photo credits : artificialisation.com
在一个崇尚新奇、现代和创新的世界里,分析并不是一种短暂的时尚。至少从有记载的历史开始,人类就一直试图了解他周围的世界。大多数科学,如果不是艺术的话,都是基于扫描环境,鉴定手头的数据,选择最佳的前进方法,并将我们的印象转化为个人和集体的行动。这些年来发生变化的是我们可以处理的过多的数据,我们在过去两年中创建的数据比人类诞生以来产生的数据还要多。不管是从经济、政治还是社会的角度来看,我们都有理由质疑我们是否比我们的祖先做出了更好的决定。
商业分析研究所的主旨是发展分析在管理决策中的应用。我们的工作基于分析 4.0 的愿景。不是过去的分析方法的更新和更好的版本,而是由四个基金会支持的行动呼吁,旨在将我们处理的大量数据转化为更有效、更有影响力的决策。在这个物联网、人工智能和神经网络的世界里,我们的最终目标不是让机器更加智能,而是帮助人们做出更好的决策。让我们依次简要探讨一下这些基础:
我们愿景的第一个支柱是围绕数据在现代经济中的作用构建的。如果数据现在似乎是经济活动的命脉,那么数据是什么?数据仅仅是现实的反映,是我们如何与周围世界互动的不完美的镜子。尽管信息技术的进步帮助我们工作得越来越快,但它们常常鼓励我们关注数据,而不是业务挑战和机遇。第四次工业革命的到来邀请人们利用数据来理解我们周围的世界。
我们愿景的第二个基础是围绕人们如何在决策中使用数据而构建的。数据不仅仅是屏幕背后的数字,而是我们眼前不同形式的熵。因为人们从不同的角度看待价值,他们很少从同样的角度看待数据。我们在行为科学领域的工作探索了认知偏见如何影响我们对周围世界的看法。锚定、框架和从众都是影响我们如何解释手头数据的偏见的例子。人类对风险、不确定性和模糊性的认知阻碍了数据驱动的决策实践。
机器学习的每一次创新都奠定了分析的第三个基础。传统方法侧重于在确定性环境中使用有序数据进行回归分析,而今天的机器算法提供了许多概念性工具来解决各种业务挑战。掌握机器学习既需要理解问题的参数,也需要不断练习。在只有一个正确答案的决策环境中,分类算法可以很好地处理有序或分类数据。在我们无法指定所有变量的学术环境中,聚类或降维提供了更相关的结果。
最后,分析的第四个维度将视觉传达纳入关注范围。分析师的工作可能从检查数据开始,但只有在与人共事时才会结束。与电子表格和数据库不同,人类不记录具体的数据或信息,而是记录印象和感觉,当处理这些印象和感觉时,会回忆起主观体验。在一个注意力可能是我们最稀缺资源的经济体中,帮助你的受众专注于信息是一个关键的成功因素。相似性、对称性、接近性、连续性和闭合性的格式塔原则是理解我们如何重建周围现实的基本工具。衡量数据科学家的才能在于他或她将数据转化为行动号召的能力。
因此,分析 4.0 建立在这四个支柱之上:理解数据在现代经济中的作用,研究与人类决策密切相关的认知过程,根据我们试图解决的问题类型应用机器学习,以及将数据转化为可操作的决策。在巴约纳的暑期学校,以及在欧洲的大师班,我们专注于数字经济、数据驱动的决策、机器学习和视觉通信,我们可以帮助您将分析应用于您和您的组织。
Lee Schlenker 是商业分析和数字化转型教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 资料可以在www.linkedin.com/in/leeschlenker.查看,你可以在https://twitter.com/DSign4Analytics的 Twitter 上关注我们
分析最佳实践—敏捷数据科学
这是数据科学家 Anna Godwin 和 Cory Everington 讨论五种分析最佳实践的系列博客中的第二篇,这五种分析最佳实践对于建立数据驱动的文化和从分析中获得价值至关重要。在这一部分中,Anna 讨论了使用敏捷数据科学作为管理数据科学项目的框架的好处。
如果你参与过任何项目,你很可能在项目的生命周期中经历了意想不到的变化。正是这些意外会影响您按照最初的设计完成项目的能力,包括团队、可交付成果和/或时间表的变化。在整个项目中,作为个人和团队的灵活性使你能够快速响应变化。但是项目受益于结构化。为数据科学项目管理适当平衡的最佳框架是什么?
对于我们的项目工作,Elder Research 采用了敏捷数据科学方法。它结合了敏捷软件开发的最佳实践和数据挖掘的最佳实践,正如数据挖掘的跨行业标准过程(CRISP-DM)所体现的那样。
敏捷数据科学具有以下优势:它:
- 提供灵活的团队组织
- 获得利益相关者的早期认同
- 适应不可预见的环境
敏捷数据科学为项目团队带来了组织
虽然单独工作时可以使用敏捷方法,但这种方法是为了帮助团队组织工作而设计的。任何时候团队成员在一个项目的不同方面工作,自然会有混乱,重复工作,或者工作在不关注项目可交付性的任务上。敏捷数据科学有助于缓解这些问题,并通过冲刺规划、每日站立、团队透明度和路障意识创建共同愿景。
敏捷方法的两个主要组成部分控制着项目工作:
Sprint Planning 是一个过程,在这个过程中,项目工作被分解成可以在几个小时或几天内完成的小块工作,并分配给团队成员。它通常在两周的周期内完成,以允许团队成员快速迭代,并在如何完成工作方面提供灵活性。在我们即将发布的关于任务管理的博客文章中,我们将更详细地讨论如何计划冲刺。
每日脱口秀通过为每个团队成员创建一个论坛,让他们简短(2-3 分钟)地介绍他们在分配任务上的进展以及他们遇到的任何可能影响进度的障碍,从而促进沟通和项目成功。每日站立被设计为少于 15 分钟。它们不是一个进行详细讨论的论坛,相反,它们为团队成员提供了一个了解其他人正在做什么的机会,并为项目领导提供了一个必要的调整过程的机会。
敏捷数据科学吸引利益相关者
敏捷方法的迭代性质要求经常与项目涉众进行核对。尽早共享结果,通常可以让项目团队专注于构建快速的解决方案,提供价值并获得最终用户的采用。关注过程早期的部署是 Elder 研究方法的核心。无论交付的是一个完整的软件解决方案还是一个分析算法,从涉众那里获得早期的认同是很重要的——而这是通过在过程的早期获得他们的反馈来实现的。一个解决方案只有在最终用户实施的情况下才是成功的,因此来自关键用户的早期反馈对于形成解决方案的设计是至关重要的。此外,一个很大的附带好处是,关键用户会对该解决方案产生兴趣。
敏捷数据科学能够快速适应变化
项目工作中的变化来自四面八方。例如,一个团队成员转到了另一个项目,或者一个新成员加入了团队。能够快速让新团队成员加入是敏捷的核心优势。团队站立和冲刺计划提供频繁的项目更新和介绍性任务,新成员可以快速完成,直到彻底的知识转移发生。
利益相关者群体也可能发生变化。随着利益相关者的改变,分析项目的愿景也可能改变。当感觉项目目标在不断移动时,敏捷方法的适应性对你有利。在敏捷项目生命周期中发生的迭代提供了一个关键的机会,要么坚持到底,要么转向不同的方向。利益相关者做出多个“是”或“否”的决策点决定了项目完成和成功项目完成之间的差异。
最后一种意想不到的变化可能以技术障碍的形式出现。例如,为项目选择的初始技术栈可能工作得不好。同样,敏捷数据科学的快速迭代允许“快速失败”的现实,即技术限制在项目生命周期中比其他情况下暴露得更快。这种早期的洞察力允许团队在项目时间线内快速发现可以为项目提供更好解决方案的替代方案。
找到适合你的方法
敏捷数据科学的关键词是——你猜对了——敏捷。我们强调了在项目工作中采用灵活结构的好处,最终,每个项目团队都应该采用最适合他们的结构。灵活地设置您的敏捷方法,这样您就可以在项目管理上花费更少的时间,将更多的精力放在完成技术项目工作上,以创建可操作的解决方案,为最终用户提供真正的价值。
请求咨询 与经验丰富的数据分析顾问交谈。
有关系的
阅读本博客系列的第一部分 分析最佳实践—第一部分
查看《挖掘你自己的业务》一书了解更多关于如何利用数据科学和预测分析的力量以及避免代价高昂的错误的最佳实践。
分析对福祉的贡献:大数据和自我技术
米歇尔·福柯(Michel Foucault)曾指出,衡量技术的唯一可行标准是它是否有助于人类潜能。不久的将来,健康分析可能会为这一愿景提供实质性的证明。到 2020 年,大约 25,000 Pb 的患者数据将可供该行业使用。KPMG 最近对医疗保健专业人士的调查显示,56%的受访者认为这些数据将极大地有助于我们的商业智能实践,而 35%的人认为降低了医疗保健成本,32%的人认为改善了健康结果。【ii】随着医疗保健组织大举投资技术和分析以利用这些机会,有抱负的数据科学家有哪些机会?
健康分析涉及从数据的模式和相关性中获得见解,从而在健康和生命科学领域做出更好的决策。根据研究和市场部门最近对“医疗保健分析”的研究,该市场预计将从 2016 年的 73.9 亿美元增长到 2021 年的 245.5 亿美元,CAGR 为 27.1%。【iii】这种非凡的市场增长是由多种因素推动的,包括政府加强电子健康记录采用的举措增多、抑制医疗支出的压力增加、对改善患者疗效的需求增加、行业风险投资的增加以及分析和大数据技术的进步。
通常情况下,数据科学家有很多机会利用描述性、预测性和规范性分析。量化自我运动的繁荣正在推动一个细分市场。来自众多互联设备的关于个人身体和精神状态的持续少量数据流捕捉到了我们的正念、锻炼和饮食的质量。量化自我的支持者声称,这些数据可能会改善我们的睡眠质量、工作方式和娱乐方式。Asthmapolis、Quadio 和 Zepher 等小数据的应用对于面临特定健康挑战(过敏、哮喘、心脏疾病等)的人群尤其有前途。),以及寻找竞争优势的运动员。这种对预防医学的关注不仅会给行业和政府带来好处,也会给全体人民带来好处。
在竞争日益激烈的医疗保健市场,埃森哲采访的 89%的行业高管认为实施大数据分析将是保持市场份额的关键。【iv】医疗提供商和制药行业之间的合作伙伴关系,如 DataSphere、HealthConnect 和 PPC/HealthCore,为健康分析的未来提供了框架。包括指令 2011/24/EU 和法国国家医疗卡计划在内的欧洲和国家计划已经提供了大量关于行业成本和人口统计实践的数据。地方尝试以"区域医疗小组"的形式汇集资源,这使得地方从业人员能够分享资源、知识和最佳做法。
有抱负的数据科学家应该更好地了解这个领域及其机遇。商业分析研究所的 2018 年暑期学校将帮助你探索工业格局的演变,以了解当前的挑战和机遇。我们将研究当今可用的小数据和大数据的来源。我们将回顾数据科学的适当方法,以及它们如何应用于这一领域。最后,我们将探索私人和公共组织如何将这些数据转化为行动,以改善我们未来几代人的身心健康。
在巴约纳的暑期班以及欧洲的大师班中,我们让分析为您和您的组织服务。该研究所专注于管理者数据科学的五个应用:数字经济学、数据驱动的决策、机器学习、社区管理和视觉通信。改善管理决策会对你未来的工作和职业生涯产生影响。
Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 个人资料可以在 www.linkedin.com/in/leeschlenker.查看你可以在 https://twitter.com/DSign4Analytics的 Twitter 上关注我们
【I】Dhamdhere,et。艾尔。,(2016),健康医疗大数据
【ii】t . Walker,(2015),只有 10%的医疗保健组织使用数据分析,管理式医疗保健执行官
【iii】市场和市场(2016 年),医疗保健分析/医疗分析应用市场
【iv】Bresnick,j .(2014), 89%的高管认为大数据分析是市场份额的关键,HealthIT Analytics
简而言之的分析:为 CRO 设置谷歌分析的介绍
Image created by Objeqt.com
你如何改进某事?任何事。任何过程,任何行动。你从了解你的基线开始。你今天可以做 10 个俯卧撑,但是经过一个月的每日俯卧撑,你会做得更多。为电子商务商店设置 CRO 谷歌分析是一种通过设置基线和跟踪指标来进行测量/跟踪的方法,以便进行改进。
**“你不能改进你不能测量的东西”**是一些人的说法。
**“有度量才有管理”**同样如此。
分析只是一种通过设定基线和跟踪改善(或缺乏改善)的指标来衡量的方法。但是当你看谷歌分析仪表板时,突然之间这个简单的概念变得难以置信的复杂。
你需要为你的电子商务网站追踪的转换优化只会使它变得更加复杂。你需要准确及时的数据,而且是大量的数据。
你需要什么样的数据?research XL(conversion XL 使用)将他们的研究领域分为四个主要类别:
- 技术的
- 探索法
- 数量的
- 定性的
Web analytics 是用来衡量 量化数据 的主要工具,比如你网站的访问量、转换率以及新访客或回头客的数量。定量数据都是关于硬数字的,这就是为什么你需要用定性或启发式研究来补充这些信息,这些研究更具描述性(它们依赖于客户调查和反馈),但也更容易产生偏见和误解。
由于定量数据是由计算机程序实时收集的,因此您可以相对确定您没有遗漏任何东西— 前提是分析工具配置正确。
这就是问题所在。你必须配置你的分析程序,包括谷歌分析,以确保收集所有你需要的信息。
配置是 CRO 工作的很大一部分。我们称之为“分析健康检查”,通常将它作为一项服务来提供,以确定客户的分析工具是否正常工作并准确跟踪一切。
在这一点上,我们并没有把重点放在一组数据上,尽管我们稍后会这样做。现在,我们正试图收集尽可能多的数据,从中提取见解,只有在您定制分析程序的现成设置时,您才能做到这一点。
网络分析如何工作
当每个人与内容互动时,Web analytics 会实时记录每个访问者的每个行为。
有许多分析工具可以做到这一点,都有类似的功能,但谷歌分析是最常用的工具,超过 70%的市场使用。
每个分析工具的工作原理都是在网站的每个页面上留下一小段 JavaScript 代码。这段代码被称为“跟踪代码”或“片段”,它收集用户行为数据并将其发送回分析程序,分析程序以可读的形式向您呈现数据。
One of the overview screens in Google Analytics
Google Analytics 之所以受欢迎,不仅仅是因为它是免费的(至少在基本形式上是这样),还因为它不断更新,完全可定制,并且有一个大型社区可以创建免费的定制服务。由于 Google Analytics 足以满足几乎所有用途,它不仅成为首选工具,而且成为分析工具的行业标准。这是那种容易学但很难掌握的东西。非定制版本可供每个人使用,并且非常简单明了,但是真正的数据深度只有在您定制之后才变得可用。你基本上是把普通的菜刀变成了瑞士军刀。
最简单地说,在你可以依靠谷歌分析给你所需的信息来了解你的网站现在做得如何,以及如何改进它之前,你必须教 GA 一些技巧:
- 你想让它跟踪什么
- 如何跟踪它
- 如何举报
跟踪什么:基本指标
指标是数字分析的基础。Google Analytics 中的常见指标有:
- 会议
- 独特的访问者
- 现场时间
- 浏览的页数…
还有很多。
还有我们所说的“维度”,比如位置、页面、语言、性别、产品类别等等。有些指标实际上是两个指标的组合,比如“每页的会话数”或“每页的访问者数”您还可以创建自定义指标。
一旦以度量标准报告了行动,我们就可以从中得出一些结论。
一个很好的起点是简单地统计实际上与任何给定内容互动的访问者的数量。这很好地表明了内容的受欢迎程度。
然而,如果用户点击进入,几秒钟后又点击退出,那么打开一个页面就没有任何意义。这就是所谓的反弹。你希望你的跳出率低。如果很高,意味着访问者没有找到他们希望找到的东西。
我们还可以比较某些类型的操作或内容,以获得更多见解,如找出哪些类型的内容比其他内容更能吸引访问者,或者网站的哪些部分可能会遇到可用性问题。我们还可以比较不同部分游客的行为;例如,不同国家的访问者如何与网站互动。
得出结论的第三种方法是寻找相关性。你在寻找一些东西,比如一部分访问者如何与网站互动,或者什么样的互动顺序通常会导致转化。你可以根据访问者的最大平均订单价值来选择一个类别,然后观察他们与网站的互动情况,从而很好地转化。然后你就可以利用这些信息来优化你的网站——从本质上来说,就是找到调整用户体验的方法,让他们走上与你的成功客户相同的道路。
收集这些数据是 cro 开始创建假设进行测试的方式,这导致了转换的优化。
如何跟踪:细分和事件
包括谷歌分析在内的任何网络分析工具的最佳特性之一就是细分的能力。细分可以让你根据许多特征选择不同类别的访问者——他们来自哪里,他们在寻找什么,他们买了多少,等等。
Sample of a segmented report in Google Analytics
事件跟踪
通过一些定制,任何分析工具都可以跟踪你网站上的单个事件。这将释放更多的数据财富,并允许你利用它来获得更多关于你的访问者与网站互动方式的见解。通过使用事件跟踪,可以跟踪网站上的任何活动,从点击单个链接到播放视频和下载文件。
An example of event goal in Google Analytics
目标和转化等分析类别基于“页面视图”思维模式。事件跟踪则不同,它更关注用户体验。在谷歌分析中,事件基本上是互动,比如下载 PDF 或电子书,播放嵌入的视频,点击外部链接或行动号召(CTA)按钮。
虽然事件跟踪需要定制和额外的 JavaScript 代码,但使用标记管理器实现和维护相对容易。
目标
您的分析工具也可以跟踪您的现场目标——如果您对其进行配置的话。目标是你希望你的用户做的具体的动作,比如浏览某些网页,或者看一个视频,或者在一个页面上花一定的时间。一些最常用的目标是“目的地目标”,它让你检查访问者是否真的到达了你定义为目标的网页。一个例子是“感谢页面”,表示用户在你的网站上完成了购买。
如何报道:谷歌分析中的电子商务
Google Analytics 具有完全可定制的电子商务跟踪功能,可与您的电子商务平台集成,并允许您在 Google Analytics 中查看网站的表现,以收入的形式显示。您可以看到正在销售的产品数量、每位客户的平均收入、客户的购物行为以及其他高度相关和可操作的数据。这也是一个可定制的功能。
是的,这只是为 CRO 设置谷歌分析的一个快速概述!
正如你所看到的,数字分析是任何电子商务商店几乎不可或缺的工具。虽然理论上没有网络分析也可以经营网络商店,但这并不是长期成功或增长的秘诀。
无论你选择什么样的网络分析工具,它都将开启一个充满机遇的新世界,不仅能让你洞察网络商店的表现,还能洞察访问者的想法。学习掌握谷歌分析,你将改善你的网站,并迫使更多的现有访客成为客户。
分析是增加网上商店收入的关键,也可能是最具成本效益的方法。
这篇文章最初发布在 Objeqt 上。访客很棒,顾客更好。是时候将流量转化为收入了。
金融分析
我第一次接触金融分析是在大学四年级的一次招聘活动中,当时我正和朋友聊天。一位最近在一家不知名的投资银行获得博士学位的人的推销引起了我的注意:他的团队使用一种基于布朗运动理论的专有交易算法取得了很好的结果。布莱克-斯科尔斯法案和金融幸存者的触发警告:-)
对于那些在高中物理课上睡着的人来说,布朗运动是悬浮在流体中的粒子的随机运动。他的团队应用随机运动理论来预测股票价格的随机运动。
我不会争论这种交易策略的优点,但我记得普林斯敦经济学家伯顿·马尔基尔所著的《漫步华尔街》一书中的一句话。
“一只被蒙住眼睛的猴子向一份报纸的金融版投掷飞镖,可能会选择一个与专家精心挑选的投资组合一样好的投资组合。”
令人欣慰的是,过去几年,预测分析在金融领域的应用已经不那么晦涩难懂了。我特别喜欢的一个领域是情绪分析——利用数据来确定消费者对产品的感受。
例如,假设你想购买苹果公司的股票,但又担心 iPhone 的销售。你可以选择在苹果店外站一个月,数一数拿着新盒子的顾客数量。然而,一个更有效的方法可能是统计全国范围内提到“iPhone”以及其他关键词(如“已接收”、“拆箱”、“我的新手机”)的公开推文数量。这些自然语言处理技术允许公司外部人员粗略估计产品采用率。公司的客户服务团队使用类似的软件来识别关于错误功能的愤怒推文。机会主义交易者用它们作为卖空股票的触发器。
使用情绪分析进行自动交易并非一帆风顺。2013 年,美联社的推特账户遭到黑客攻击,一条虚假的推特消息称总统在一次袭击中受伤。结果呢?1300 亿美元在几秒钟内就从股市中蒸发了。市场很快恢复,但它有力地提醒了人们,使用这些机器学习技术进行自动化高频交易的影响。
这篇简短的文章仅仅触及了金融分析的冰山一角,主要是关于股票市场的应用。传统公司越来越多地转向分析,以创建更好的收入预测(谁购买什么、何时购买以及如何购买)。在个人理财领域,有几个应用程序可以分析用户的消费模式,并提出省钱的方法。我们很多人都不知道自己在食物、娱乐和公用事业上花了多少钱。猜测你每月的食品开销。如果一款应用可以帮你额外节省 15%,你会怎么做?在下面的评论里告诉我。
分析也是关于解决小问题的——比如在海滩上找一个停车位…
周日法国大选结果出来后,我们决定前往比亚里茨老港口的海滩度周末长假。距离我们在波城的公寓只有短短一个小时的车程,住在比亚里茨的挑战是找到一个靠近海边酒店的停车位。当你开车穿过小镇狭窄的街道时,停车位变得越来越少。任何人看到这些数据(或至少在海滩上)都会有一个永恒的问题:我是应该先找到一个停车位,然后步行几公里去酒店,还是等到找到一个更近的停车位?
如果大数据是媒体狂热的焦点,分析是我们如何看待日常问题以及如何寻找实际结果的心态。简单的问题是那些可以在手边的数据中找到答案的问题,是那些过去的经验让我们相信一种最佳方式的问题。复杂的问题是那些数据不足以找到正确答案的问题,在学术环境中,我们只能在特定的背景下计算更好的解决方案。无论是预测总统选举中的获胜候选人,还是找到尽可能靠近海滩的停车位,复杂的挑战都需要在寻找答案之前思考问题。
人们解决问题的方式不统一,人们看待数据的方式也不一样。丹尼尔·卡内曼建议,在应对日常挑战时,我们基本上使用两种方法。【1】系统 1 思维本质上是直觉,依靠我们过去的经验对环境挑战做出快速自发的反应。系统 2 与批判性思维联系更为紧密,在批判性思维中,我们运用理性思维,或者至少是有限理性,来思考对给定问题的最恰当的反应。Kahneman 的工作继续根据要解决的问题的性质来探索每一个的相关性。
两个“系统”都不意味着人们客观地看待数据。我们看到的数据被几个认知过滤器遮蔽,这些过滤器被下意识地部署来聚合、组织和解释我们看到的东西。例如,框架效应会根据数据呈现的方式影响人们对问题的积极或消极反应。锚定指决策时倾向于优先考虑第一条信息(“锚”)。从众效应描述了因为许多人相信而相信一些事情的倾向。改善决策通常不需要更好或更丰富的数据,而只是考虑人们实际上如何看待他们拥有的数据。
在一个阳光明媚的下午,提高我们在度假小镇找到停车位的几率并不是火箭科学,但它可以从分析中受益。镇上的交通状况对评估海滩停车没有什么帮助,把这个问题框定下来会让我们对自己真正想要的东西有不同的看法(停车位还是尽可能少提行李箱?).加州大学洛杉矶分校的唐纳德·舒普教授对这个非常实际的问题进行了深入的思考。这个问题很复杂,因为可观察到的数据(我们开车去海边时看到的停放的汽车)并没有告诉我们最近的露天停车位在哪里。我们以前的海滩经验可以帮助我们确定,当我们靠近海岸时,我们是否相信 99%或 85%的空间将被占用。假设停放的汽车平均分布;在第一种情况下,当我们距离酒店 400 米(大约 1/4 英里)时,我们最好抓住第一个可用的空间,在第二种情况下,我们可以合理地等到我们距离酒店 15 米(50 英尺)的时候。
商业分析实践是商业分析研究所的核心和灵魂。在巴约纳的暑期学校,以及在欧洲的大师班,我们让分析为您和您的组织服务。该研究所专注于管理者数据科学的五个应用:在数字时代工作、数据驱动的决策、机器学习、社区管理和可视通信。数据驱动的决策会对你未来的工作和职业生涯产生影响。
【1】卡内曼博士(2015)。思考,快与慢。第一版。纽约:法勒,斯特劳斯和吉鲁。
【2】例如,参见 Shoup,D. (2007),巡航停车,访问,n.30,弹簧http://shoup.bol.ucla.edu/CruisingForParkingAccess.pdf
纽约租赁市场分析| ka ggle 排名前 15%的网站!
这是我第一次认真参与 Kaggle 竞赛的文档资料——rent hop 租赁咨询。两个半月, 146 git 提交和 87 提交之后,我站在排行榜的前 15% 之内——一个我引以为豪的位置!
Kaggle 比赛是由 Renthop 组织的,rent hop 是一家专门针对纽约市场的租赁网站。给定各种列表参数,如价格、位置、经理(经纪人)、建筑、图像,我们必须预测每个租赁列表将获得的兴趣(互联网流量)。“兴趣列表”是一个离散变量,分为“高”、“中”和“低”。
这个竞赛的领域引起了我相当大的兴趣——就在 4 个月前,我还在班加罗尔混乱的房地产市场中沮丧地寻找一个像样的地方!再加上竞争激烈的纽约市场,我们有一个现实世界的问题等待解决。
我的旅程 —对我来说,这场比赛真是过山车——我的情绪和我的排行榜位置之间绝对存在正相关关系!不过,我学到了很多,从疯狂的功能工程到实现新算法,从修复验证漏洞到构建我的定制 stacker-ensemble——这种学习为未来的竞争提供了一个很好的跳板。
也就是说,这篇博客有点技术性。可以的话就离开;)
到目前为止,我构建预测模型的标准方法是在标准变量上构建一个随机森林。没有太多的探索或特性工程——这种方法没有给我带来好处。在这次比赛中,我花了前两个月的时间来理解这些特性,并尝试它们的组合。
特征工程
价格 —最明显的特征之一是租赁列表的价格(价格的对数),这导致了一个更好的衡量标准——每间客房的价格。当与邻里或街道等其他变量相结合时,价格可以很好地代表“这是 21 街上最好的公寓吗?”。不过,对于一室公寓来说,这个功能有点棘手,因为根据定义,一室公寓没有卧室。
经理人 —纽约市场将经理人(或经纪人)视为高度可信的来源,这一点从经纪人代理机构的关系中可以看出。由于 manager_id 是一个高度分类的变量,kagglers 的同事们想出了一个巧妙的特性——“manager _ score”!它基本上是该经理的“高兴趣”列表和“中等兴趣”列表的百分比的组合。这是我几乎所有模型中最重要的特征。
我提出了“经理机会”的概念,它表明一个经理的列表相对于通过同一经理的其他列表有多好。基本上,将租金价格与经理的中值价格进行对比——“布朗先生,你有更便宜的 2BHK 公寓吗?”
建筑物——这个特征应该是致命的,因为这是我们在谈论地点时所能得到的最狭窄的范围。我试着映射像“建筑分数”、“建筑机会”、“建筑数量”这样的特征,但是它们都抛弃了我的简历分数。许多 Kagglers 也经历了同样的情况,最可能的原因似乎是坏的数据点-16.8%的建筑物具有 building _ id“0”,尽管它们具有不同的坐标。然而,对建筑物的一个积极认识是,90%的“零建筑物标识”的建筑物是“低兴趣”的,至关重要!
邻域 —普通的旧纬度和经度被证明是相当重要的特征,但我们并没有就此止步:)一个包含 60 个聚类的简单 k-means 给了我广泛的邻域,从而产生了诸如“neighborhood_score”和“neighborhood_opportunity”等特征。最初,我使用 Google API 将坐标映射到广阔的区域(正如 Renthop 网站上提到的)。
随着我构建越来越多的功能,我注意到一个共同的主题——价格和兴趣是核心部分,而“经理”、“邻居”、“建筑”、“街道地址”、“邮寄时间”是外围部分。当外围部分通过中间部分(或计数,或某种一般化)与中心部分整合时,会产生显著的改进。这张图是我接下来几天的必看之物:)
街道/显示地址 —提供了两种地址,街道地址和显示地址,这是街道地址的一种精简形式。我尝试了像“公寓 _ 计数 _ 街道”这样的功能(这条街道的出租有多受欢迎?)和通用的“street_opportunity”。
我对街道地址的另一个想法是,它们是否包含“街道号码”,这应该有助于“地址的准确性”(Renthop 关心的一个变量!).结果没什么帮助。
一个从 kaggler 同事那里借来的想法——String Difference b/w the street _ address 和 display_addres。这是一个相当大的差异,在“高利息”,而不是一个清晰的想法为什么!
发布时间 —当然,作为季节性业务,基于时间的功能派上了用场(mday,wday,hour,minutes)。我们无法探究年度季节性,因为数据集夹在 2016 年 4 月和 2016 年 6 月之间。
据报道,Renthop 上的一个房源停留时间为 5-6 分钟,竞争非常激烈!这促使我查看哪些房源是在同一小时内发布的,结果是“hour_opportunity”(在过去的 30 分钟内是否有更便宜的公寓发布?").这个特性并没有带来改进,尽管一个类似的特性很有用——“hour _ frequency”(那个小时发布的列表数量)。这可能会影响到一天中特定时段的在线消费者数量。
Listing_Id —这只是一个普通的序列号,至少我是这么认为的!结果证明这是一个非常重要的特性,因为它与“创建的”变量惊人地相关。此外,还有一些离群的列表,它们的 listing_id 比同一天发布的租赁的 listing_id 中值要高。而这些离群值中有很大一部分是“低兴趣”,陪审团对为什么会有分歧!
无论如何,这是一个令人难以置信的洞察力——有时,序列 id 可能与其他变量有很大关系!
描述——这应该是关于公寓的微小细节的宝藏,比如“允许携带宠物”、“门卫”、“电梯”等等。许多人尝试了著名的 tfidf 算法,但无济于事——我的假设是,人们最初是根据价格、位置和经理表现出兴趣的。细节在租赁后期考虑(就在最终确定之前?).
我想到的几个功能与识别描述中的垃圾邮件有关——可能,我是第一个公开这些内容的竞争者:)计算了大写字母的百分比和感叹号的数量——“啊!!你喜欢这个描述吗?!!"
我还尝试将电话号码或电子邮件地址作为一个因素变量。虽然没帮上什么忙。
Renthop 评分——在试图提取租户的使用模式时,我发现了一些见解。他们中的大多数人受到了 Renthop 分数的启发(Renthop 根据这个内部计算的分数对列表进行排名)。我也尝试了一些基于主要特征的经验公式,但是几乎总是增加我的对数损失。一个重要的学习——总是组合单调的特征,随机分割或对数不起作用。
高基数特性的基数—Branden Murray 的内核向我们 kagglers 介绍了一个漂亮的特性,用于计算经理的高分、中分或其他分类变量。
让我解释一下。经理 M 有“n”个列表,假设有“M”个经理。如果经理 M 的列表通常具有“高兴趣”,我们想要奖励他。我们如何对此进行量化?经理 X 可能只有两个都是“高兴趣”(100%命中率)的列表,但是经理 Y 可能有 100 个列表,其中 60 个是“高兴趣”(60%命中率)。我们应该倾向于经理 Y,因为他的一致性,而不是经理 X(成功,但短暂的职业生涯)。
要对此进行量化,请计算一个全局高比率(整体高利息百分比)并计算经理的高利息百分比。用λ将它们合并,λ与他的计数的负对数成反比。
经理高分=(经理高百分比)(lambda) +(全局高百分比)(1 — lambda),其中 lambda = 1/(c + e^(-count/d),c 和 d 为经验常数
基本上,当经理的(发布的列表)计数达到最高时,我们看重他的百分比,反之,我们看重他的全球百分比。
主要学习—验证漏洞
在建立我的验证渠道时,我观察到我的本地简历分数一直比我的公开简历分数好。当我往下钻的时候,泄漏的源头让我大吃一惊,那是我的第一手经验;)显然,在计算 manager_score 时,我必须计算高兴趣、中等兴趣和低兴趣列表的百分比。我对整个训练集进行计算,然后对该训练集本身的子集计算 logloss,因此引入了泄漏。后来我做了一个函数,它根据给定的训练集、验证集和测试集分别计算这些百分比。
另一种学习——分层拆分
就兴趣水平而言,数据集非常不平衡——只有 7.8%的列表是“高兴趣”,22.8%是“中等兴趣”。因此,当为了验证而进行分割时,我特意做了分层分割,以保持平衡。
成功的模型
- H2O . GBM——我在整个锦标赛中的主要工作。我已经手动调到接近最佳状态,我希望;)
- XGBoost — XgBoost 是爱。XgBoost 就是生活!在性能方面与 gbm 相当
- H2O . RF——一种易于设置的算法,但结果不如 gbm 和 xgboost。
总的来说,我应该自动调整我的算法。目前是一个非常手动和缓慢的过程。此外,我意识到模型种子相当重要,多次运行平均(用不同的种子)是有益的。虽然放弃了,时间限制:(
不起作用的模型
- H2O.deeplearning 没有给出一个好的结果,可能是一个糟糕的超参数选择的结果。还是那句话,不擅长调音。
- extra trees——一个随机化的随机森林,让它工作了,但是我的系统没有足够好的 ram 来进行适当的测试
- SVM、KNN、Logreg——所有更简单的 ML 模型都存在空值问题,并且没有给出好的结果。
堆叠
这是我第一次学习 stackers,阅读了 MLWave 的不可思议的解释者博客,并着手实施我自己的!最初我失败得很惨,又看了一遍博客,终于明白了堆叠的本质。慢慢;)
所以,我有一个 3 层堆垛机,但没有太多的多样性。前两层由我的 3 个工作模型组成——XGBoost、GBM 和 RF。第三层是第二层模型的简单集合。或许,更关注简单的模型会给我带来更多的多样性——尽管如此,我还是获得了相当不错的 0.01 的跳跃:)
注意:对于我的最终提交,我用一个 出色的公共脚本 对我的提交进行了平均。可能每个人都在这么做。)
魔法特性
在比赛的最后一周,Kaggle 上一位非常慷慨的大师 KazAnova 发布了一个非常强大的漏洞——图像文件夹的时间戳。仅仅插入时间戳就给了大多数人 0.01 的跳跃。我试着挖掘时间戳,它与“创建”变量的关系等等——这很可能是一个内部原因。
一个类似的神奇特性是包含在图像 URL 中的 listing_id——大多数与原始的 listing _ id 相同。那些不同的列表可能是同一套公寓的转贴,这表明它还没有被出售→“低利息”
结论
我从比赛中获得的主要收获是:
- 探索每一个变量。他们每一个人。查看数值的平均值、中值、最大值、异常值,以及类别的分布
- 把大部分时间花在特色上。当你认为你已经拥有了一切,再从头开始。
- 建立一个系统的管道。很容易引入漏洞
- 快速构建和测试。拥有高效、快速、易于调整的算法进行测试。
- 搭建一个模型测试平台,堆叠变得容易。
- 花大量时间在 Kaggle 内核和讨论上。他们太酷了:)
总的来说,这是有趣的几个月!学到了很多,这只是未来比赛的起点。很快就会达到前 10%😃
此文最初发布在我的 博客 上。每周一篇博客
分析——内部人员
如果有一种方法可以让一家公司(姑且称之为这家公司, Hooli )通过在 SaaS 上市为其他上市公司提供种子,这将提供深刻的见解。上市公司会很乐意接受,因为他们可以更好地了解自己的用户群、交易历史,甚至可以利用这些数据为未来目标制定可行的计划。但是,如果胡利决定创建一个基金,并根据收集到的数据进行交易,会怎么样呢?这算不算内幕交易?
分析的历史
1996 — HIT COUNTERS
1996 年,第一个广泛使用的托管点击计数器服务 Web-Counter 诞生了,引发了在每个网站登陆时显示里程表式点击计数器的趋势。在 2004 年,Web analytics 作为 Web 优化的重要工具得到了广泛的认可,它提供了越来越复杂的解决方案,报告了大量的数据。2005 年,谷歌分析收购了海胆,并迅速成为最广泛使用的网络分析服务。它非常注重定量分析,直接与谷歌合作。
今天
在互联网上访问量最大的 10,000 个网站中,谷歌分析服务了其中的 67% 。
2015 Annual e-commerce Revenues
http://fortune.com/2015/11/06/amazon-retailers-ecommerce/
最大的电子商务零售商亚马逊的网上销售额占其总销售额的 100%。因此,很容易看出一只基金是否可以在下一个报告季度访问他们的分析/转换指标,这将是一个巨大的优势。但是亚马逊是一个例外。
大部分大盒子店严重缺乏线上销售部门。全球最大的零售商沃尔玛(Walmart)认为,网上销售额仅占其总销售额的 2.9%。更糟糕的是,他们的在线销售增长正在放缓。2015 年第三季度,同比仅增长 10%。
Williams Sonoma (WSM)是一家有 60 年历史的厨具和家居用品供应商,其在线销售额占总销售额的比例最大。Williams Sonoma 在 2015 年刚刚突破了 50%的在线销售额——25 亿美元
如果你有 Williams Sonoma 的分析,你如何赚钱?
策划这场闹剧
WSM’s Quarterly Revenues
股票市场中的钱是基于:
- 与指导相比,股票的表现如何
- 未来指南看起来有多好。
让我们假设你已经覆盖了#2。你知道,WSM 和大多数零售商一样,是季节性零售商,其大部分收入来自第四季度。通过交叉引用:
- 平均回报率%
- 独立访问者的数量
- 买家的独立访客百分比
- 结帐时平均$篮子大小
- 线下促销
- 与前几年相比的总体经济情绪
你大概知道实际收入数字与指导相比会下降到什么程度。斜体表示如何测量离线分量。
然后你买入多头/空头头寸,坐下来等着看你的侦察有多准确。
“Hooli 作为一家对冲基金”的好处在于,它不必去追逐 WSM,而是任何规模的使用他们的转化跟踪和分析工具的上市零售商。通过以最低的成本向公司提供一些真正有用的东西,为创造者提供了大量的知识,这些知识可以用来做好事或者仅仅是赚钱。
如果你喜欢这篇文章,你可能也会喜欢:
调整资金组合
—对于保持竞争力的大公司来说,Rebalancingmedium.com](https://medium.com/p/a76b02f4aa01) [## 谈判——替代金钱
我们听说人们在构建交易时“跳出框框思考”的故事。当使用一种媒介谈判时(即…
medium.com](https://medium.com/p/127e05e2ad90) [## 理解事物的真正价值
公司
medium.com](https://medium.com/p/fcfc5e9a6d90) [## 销售策略:吓唬你的潜在客户购买(谷歌和人工智能)
去吧 AI
medium.com](https://medium.com/p/16d347e833fe)
如果你喜欢这篇文章的整体信息,请随时与我们联系。我们做演讲约会——
用自组织地图分析气候模式
亮点:
在本文中,我们将了解:
- 自组织映射(SOM ),以及它如何用于维数减少和无监督学习
- 解释用于探索性数据分析的训练 SOM 的可视化
- SOMs 在加拿大不列颠哥伦比亚省气候模式聚类中的应用
链接到我的其他文章:
简介:
当我第一次开始学习神经网络时,我偶然发现了这个被称为 Kohonen 图的奇怪发明,或者在文学中更常见的称为自组织图或 SOM。这个神经网络受人类大脑皮层的感觉激活模式的启发,使用简单的启发式方法进行无监督训练,能够发现高维数据中隐藏的非线性结构。最近我看到一些气候学家写的有趣的文章,他们使用 SOMs 分析和预测天气和气候(这是一项众所周知的困难任务),我想我应该与你分享这项有趣的无人监管的技术。
自组织地图:
基本上,SOM 是离散的平面神经元网格,即隐藏层,有时称为 Kohnen 层,由输入层提供信息:
Overview of the SOM neural network
每个隐藏层神经元都有几个“邻居”神经元(单个单元的邻居的最大直接数量可以是六个,如上面的六边形网格,或者四个正方形网格)。我们将每个神经元与其邻居之间的“距离”定义为每个神经元的输入到隐藏层权重之间的欧几里德距离。每个隐藏神经元的输入-隐藏层权重有时也被称为码本向量。我们定义的距离在以后会变得很重要,因为它对原始数据集的低维信息进行了编码。在上图中,每个隐藏层神经元都有一个带有 n 分量的权重向量(即输入与隐藏层紧密相连)。
那么我们如何训练这个网络呢?训练过程实际上非常简单,不涉及梯度计算:
- 将隐藏神经元权重初始化为小的随机值,或者使用 PCA 权重初始化
- 将数据行x进给到输入层
- 遍历隐藏层中的每个神经元,找到最佳匹配单元(BMU),即与数据行 x ᵢ 具有最小欧氏距离或度量的神经元
- 对 BMU 及其相邻神经元应用权重更新。使用邻域函数φ来计算 BMU 的相邻神经元
- 收缩邻域函数φ
- 重复步骤 2 至 5,直到达到迭代极限或收敛(所有神经元和所有数据之间的平均码本向量距离小于某个阈值)
上述算法被称为竞争学习,在精神上与其他基于启发式的算法(如遗传算法和粒子群方法)非常相似。此处提供了该算法的完整描述。SOM 的基本思想是“填充”底层数据的空间,如下图所示:
Training the SOM to ‘fill’ the dataset
与类似神经元数量的前馈网络上的反向传播相比,竞争学习算法通常更快,但如果 SOM 网格非常大(10⁴或更多神经元),则可能会变慢。
SOMs 属于一类叫做非线性维度缩减(NLDR) 的技术。维数约简技术(主成分分析,t-SNE 等。)通常用于可视化和解释,以及变量选择。som 更适合前一种应用,合适的 som 可以被进一步分析,以获得低维的可视化和可解释的结果,呈现给你的老板、scrum master、营销团队或你的另一半。此外,诸如 K-means 的聚类技术可以应用于拟合的 SOM 网格,并且从该网格可以获得输入的鲁棒聚类。通常,SOM 上的 K-means 比常规 K-means 执行得好得多,并且有时可以发现隐藏的非线性交互模式。现在让我们研究一些气候数据,看看 SOM 能做些什么。
下面的代码示例使用的原始 SOMPY repo 可从这里获得。SOMPY 对于 Python 来说是一个很好的入门包,但是如果你也精通 R,请查看一下 kohonen 包,它有一些非常好的可视化工具(也可以在这里看到关于使用 kohonen 包进行 R 的教程)。
报告包含以下任务的 SOMPY 代码的所有修改和气候数据。 运行代码的 main.py 脚本文件在https://github . com/hhl 60492/SOMPY _ robust _ clustering/tree/master/SOMPY/examples。
气候数据分析:
从http://climate . weather . GC . ca/prods _ servs/cdn _ climate _ summary _ e . html收集加拿大不列颠哥伦比亚省 2009 年 1 月至 2017 年 12 月的历史气候数据(月度汇总)。每个 CSV 文件包含气候数据的每月摘要(如月平均温度、月最低/最高温度、月降雨量)以及记录数据的气象站的纬度和经度。每个唯一的气象站给出一个单行,每个 CSV 中大约有 300 个气象站。
现在我们保持简单,使用纬度、经度、中间温度、最高温度、最低温度和降雨量。这些列被提取并强制转换为浮点类型。包含任何 nan 的行被删除。SOMPY 通过计算数据矩阵的特征值来自动计算 SOM 网格的大小。
对 20621 行数据的训练耗时约 5 秒。首先要注意的可视化是组件平面热图。
Component plane heatmaps for each feature that was fed to the SOM.
每个热图代表 SOM 网格学习到的单个特征或数据列的强度。请注意,热图是离散化的,每个子图中的每个“块”都是唯一的神经元,神经元在所有子图中都具有相同的位置,即纬度子图左上方的块是经度子图和月中值温度子图中的相同神经元,依此类推。通常,不同分量平面中的相似热图表示特征的相关性,相异表示可忽略的相关性,反转表示反相关性。另请注意,拟合的 SOM 将代表整个年份范围内一年中所有月份的特征,即 9 年平均值,因为提供了 9 年中 1 月至 12 月的连续数据。利用前面的事实和经纬度信息,我们可以看到:
- 月最高温度出现在不同的纬度和经度,包括纬度。北纬 49 度以上。120–124 W;这是靠近美加边境的一大片公元前南部地区,包括温哥华岛的南端、温哥华市区、弗雷泽山谷,一直延伸到奥肯那根
- 后者。北纬 49 度以上。西经 120-124°的地区也有最多的降水。
- 纬度和经度分量平面热图中各区域的大小表明,在北纬 49-50°和西经 123-124°区域有大量的气象站,那里的人口密度最高(每个 CSV 文件中所有气象站的纬度和经度的下列图表似乎证实了这一观察结果)
(注意:为了验证地理位置,最好实际提取 lat。而且长。来自 Python 中拟合的 SOM 的数据,并用它们标记其他组件平面热图中的细胞/神经元。)
Location of weather monitoring stations in BC. Seems nobody cares about the weather in Spatsizi Plateau
- 月中值温度与月最高温度相关,在较小程度上与月中值温度相关。
- 降水量似乎与月平均气温和最高气温呈反相关关系(作为当地人,我可以证实,当天气炎热时,我们的降雨量会少得多,反之亦然——太平洋西北部的气候是这样的,在晚秋、冬季和春季气温较低时会有大量降水,而在夏季气温较高时很少或没有降水)。
我们可以做的下一个可视化叫做 U 矩阵。U-matrix 也是一个热图,但可以像我们的 SOM 网格中的地形图(显示一个区域的海拔等高线的地图)一样进行解释。U 矩阵中的“山丘”代表相邻之间的大距离,反之亦然。
Note: The number of neurons and grid layout in the U-matrix and the component plane heatmaps are the same. The component plane plots were stretched veritcally due to matplotlib.
U 矩阵让我们了解了 SOM 网格的景观,以及神经元的邻域。它帮助我们直观地看到 SOM 网格本身中有哪些潜在的聚类,这是对我们将要在网格上运行的 K-means 聚类结果的一个很好的完整性检查。由于 K-means 在最佳聚类数上有点幼稚,我们将使用结合误差平方和(SSE)的“肘”方法来找到最佳聚类数。SSE 计算的算法如下:**
- 对于 k = 2 到 k_end :
- 计算数据集 X 上的 K 均值
- 对于每个集群 n :
- 计算L2*--**簇n 和簇 n 的质心之间的向量差的范数,并将其加到总数***【SSE】中
SSEs vs . differentk的结果图如下所示
通过找到上图一阶差分的最大值的指数,加 1,可以解析地找到肘点。不幸的是,K-means 算法不是太健壮,并且对于不同的运行给出不同的肘曲线,所以在许多引导样本上引导和重复肘/SSE 图分析将给出最佳的更好的估计。所有这样做的代码在下面的要点中,在 SOMFactory 类(在 sompy.py 中)中的 cluster()方法被修改以实现上述内容。
对于这个特定的 SOM,在 20 个引导样本上平均的 SSEs 的一阶差的最大值是 17,因此最优的 k 应该是 18。重复这些运行可以为现在的最优 k 提供一致的结果,这很好。用这个 k 运行最终的 K-均值给出以下聚类:
SOM K-means clustering result.
这有点类似于 U-matrix 图,所以我们离 SOM 网格的真正聚类并不太远。
在我们穿上夹克回家之前,还有几件事要做。让我们看看每个聚类质心的特征(K-表示质心代表一个聚类中的平均特征),预测哪个气象站属于哪个聚类,并将聚类的气象站放在地图上。我们使用 gmplot 和 Google Maps API 进行地图叠加。顺便说一句,gmplot 已经过时了,需要一些补丁来使它与当前的谷歌地图 API 兼容,你还需要一个有效的谷歌地图 API 密钥来访问该 API。gmplot 代码修改的要点在这里。
**Centroid 0[ 51.38661738 -125.27254198 7.51493849 16.8132888 -1.17574106
67.95416645]
Centroid 1[ 50.61259827 -126.25917862 6.32184038 14.17993615 -1.63282112
340.64034668]
Centroid 2[ 50.42396495 -125.2544494 7.2744194 16.09718498 -1.19140013
222.65626168]
Centroid 3[ 50.42534148 -126.39001822 6.72726471 14.53652612 -1.31210139
507.65982791]
Centroid 4[ 49.89467361 -122.37195052 16.63158605 29.73554202 5.95873865
28.06162618]
Centroid 5[ 52.27917741 -121.73550782 -3.83946568 8.19646576 -19.93363911
45.30064963]
Centroid 6[ 50.2945556 -125.21241436 9.15306962 18.32174182 0.93638661
119.43331396]
Centroid 7[ 50.70282538 -125.32884059 8.00965749 17.614526 -0.77992491
151.77106456]
Centroid 8[ 50.31580334 -126.23307623 6.5871719 14.64225657 -1.44068436
660.70782628]
Centroid 9[ 50.28874072 -125.06866063 7.49467144 16.55379438 -0.84254229
251.73801799]
Centroid 10[ 50.4262205 -126.2629756 6.58541814 14.36302394 -1.36671652
399.90931304]
Centroid 11[ 50.35982435 -125.51021147 6.32659523 14.73932271 -1.89873252
294.050496 ]
Centroid 12[ 51.24356927 -121.64231971 6.18712464 18.67948989 -5.48058692
36.06758652]
Centroid 13[ 50.75675998 -125.60116426 7.48408728 16.37144962 -0.95604598
190.18377378]
Centroid 14[ 51.1337961 -124.85444455 7.9966279 17.1295218 -0.56629512
94.65084155]
Centroid 15[ 50.12150383 -126.04955706 6.7603695 14.43437023 -1.13385479
461.59884165]
Centroid 16[ 50.72982522 -126.73419985 6.88866959 14.84315741 -1.12018377
586.45036101]
Centroid 17[ 51.44904147 -122.37356247 12.74453517 26.10130055 1.58123601
50.9674971 ]**
每个质心的分量对应于一年中所有月份的纬度、经度、中间温度、最高温度、最低温度和总降水量。
Cluster centroids map overlay.
你可以在这里玩玩交互式质心图:https://github . com/hhl 60492/SOMPY _ robust _ clustering/blob/master/SOMPY/examples/centroids _ map . html(下载到你的机器上,用浏览器打开)。
可以进一步分析 SOM,并在地图上叠加每个气象站所属的聚类(一种方法是对 2009 年至 2017 年所有气象站的数据进行平均,或者重新拟合 SOM 的年度或月度数据,以查看相应的年度和月度模式。同样,不幸的是,气象站的位置存在严重的分布偏差,因此要考虑的一些其他特征将是,例如,具有较少地理偏差的大气压力测量、雷达数据或物理高程数据。
要了解气候学家如何在他们的模型中使用 som,请看:http://online library . Wiley . com/doi/10.1029/2009 JD 011706/full
结论:
我们已经看到了 SOMs 如何用于数据可视化,发现数据中的相关性和模式,以及执行数据的聚类。要提取更复杂的模式,您可以向 SOM 提供更多的输入特征,或者在某个维度(如时间)上划分特征。另一件要注意的事情是:运行 K-means 聚类应该使用自举集成来完成,并且聚类标签应该与类似于匈牙利算法的东西相匹配,以便找到稳定、一致的聚类。不管怎样,玩得开心点。