数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

前面出了好几个系列,今天带大家去看看有关条件格式的一些个人分享。今天我们来看看数据条。
什么是数据条?展示一下在excel中的位置:
数据条可以直观的反应数据表中的一些基本概况,方便读者阅读数据。例如下表:
如何使用数据条:
第一:选中数据区域:C5:H17
第二:选择开始选项卡中的条件格式下的数据条。
第三:修饰一下,原始状态下的美观度都是有待于改进的。



接下来点击确定就OK,我们来看看效果图,是不是感觉比默认的要相对好看一些呢!当然了,萝卜青菜各有所爱,你可以根据自己的所爱去修改您的条件格式。
如果仅仅显示数据条的又是个什么样的呢,看下图吧!
数据条相关的内容就描述这些,相关的练习附件,你可以关注公众号,并且回复“条件格式”获得文中所述的练习文件。
本文为专栏文章,来自:Excelky,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/16441.html 。
数据分析
2016-05-16 13:31:00
摘要: Python 以其清晰简洁的语法、易用和可扩展性以及丰富庞大的库深受广大开发者喜爱。其内置的非常强大的 机器学习 代码库和数学库,使Python理所当然成为 自然语言处理 的开发利器。
那么使用Python进行自然语言处理,要是不知道这8个工具就真的Out了。
NLTK
NLTK是使用Python处理语言数据的领先平台。它为像WordNet这样的词汇资源提供了简便易用的界面。它还具有为文本分类(classification)、文本标记(tokenization)、词干提取(stemming)、词性标记(tagging)、语义分析(parsing)和语义推理(semantic reasoning)准备的文本处理库。
Pattern
Pattern具有用于词性标注(part-of-speech taggers)、n-gram搜索、情感分析和WordNet的一系列工具。它还支持矢量空间建模、聚类分析以及支持向量机。
TextBlob
TextBlob是处理文本数据的一个Python库。它为深入挖掘常规自然语言处理提供简单易用的API,例如词性标注(part-of-speech tagging)、名词短语提取(noun phrase extraction)、情感分析、文本分类、机器翻译等等。
Gensim
Gensim是一个用于主题建模、文档索引以及使用大规模语料数据的相似性检索。相比于RAM,它能处理更多的输入数据。作者称它是“根据纯文本进行非监督性建模最健壮、最有效的、最让人放心的软件”。
PyNLPl
PyNLPl:Python Natural Language Processing Library(发音为:pineapple)是一个用于自然语言处理的Python库。它由一系列的相互独立或相互松散独立的模块构成,用于处理常规或不太常规的NLP任务。PyNLPl可用于n-gram计算、频率列表和分布、语言建模。除此之外,还有更加复杂的数据模型,例如优先级队列;还有搜索引擎,例如波束搜索。
spaCy
spaCy是一个商业化开源软件,是使用Python和Cython进行工业级自然语言处理的软件。它是目前最快的、水平最高的自然语言处理工具。
Polyglot
Polyglot是一个支持海量多语言的自然语言处理工具。它支持多达165种语言的文本标记,196种语言的语言检测,40种语言的命名实体识别,16种语言的词性标注,136种语言的情感分析,137种语言的字根嵌入,135种语言的形态分析以及69种语言的音译。
MontyLingua
MontyLingua是一个免费的、常识丰富的、端对端的英语自然语言理解软件。用户只需要将原始英文文本输入MontyLingua,就能输出文本的语义解释。该软件完美适用于信息提取、需求处理以及问答。从给定的英语文本,它能提取主语/动词/形容词对象元组、名词短语和动词短语,并提取人的名字、地点、事件、日期和时间,以及其他语义信息。 作者:董志南
来源:NLP自然语言处理
本文为专栏文章,来自:编程派,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/16691.html 。
数据分析
2016-05-14 16:42:00
摘要: 时间序列 模型利用历史资料进行延伸预测,也称历史引伸预测法。是以时间序列所能反映的社会经济现象的发展过程和规律性,进行引伸外推,预测其发展趋势的方法。
时间序列建模步骤:
1. 时间序列平稳性检验:如果一个时间序列的概率分布与时间无关,则成为平稳序列。
2. 时间序列平稳化和零均值化:时间序列预测模型是建立在平稳序列的基础上的,由于日常所见的数据序列大多是非平稳序列,故需要转换为平稳序列,转换后需要进行零均值化处理。
3. 自回归模型(AR模型)、移动平均模型(MA模型)和自回归移动平均模型(ARMA模型)阶数识别,确定模型阶数p和q值: AR模型:某个观测值Xt与其滞后p期的观测值的线性组合再加上随机误差项。即:Xt= φ1Xt-1+φ2Xt-2+……+φpXt-p+at; MA模型:某个观测值Xt与先前t-1,t-2,t-q个时刻进入系统的q个随机误差项即at,at-1,……,Xt-q的线性组合。即:Xt=at-θ1at-1-θ2at-2-……-θqXt-q; ARMA模型:即观测值不仅与其以前p个时刻的自身观测值有关,而且还与其以前时刻进入系统的q个随机误差存在一定的依存关系。即Xt= φ1Xt-1+φ2Xt-2+……+φpXt-p+at-θ1at-1-θ2at-2-……-θqXt-q。
4. 参数估计:确定p、q值后,运用最大似然、最小二乘法等算法估计模型参数(φi 和θj,i=1,2,…,p;j=1,2,……,q)值。
5. 模型预测:利用显著的模型对时间序列进行预测。
以下就使用 sashelp.air 这份时间序列数据集进行预测模型的建立。
1. 平稳性识别 proc gplot data=sashelp.air;
plot air*date;
symbol c=red i=spline v=dot;
run;
通过趋势图不难发现其存在长期趋势并且随着季节存在周期性的变动。
2. 时间序列平稳化和零均值化 观察发现使用一阶差分可得平稳化和零均值化时间序列。
proc arima data=sashelp.air;
identify var=air(1) nlag=30;
run;

白噪声检验原假设:一阶差分值是白噪声。
1阶差分和1阶差分的ACF(自相关系数)、PACF(偏自相关系数)和IACF(逆自相关系数)。
3. 模型识别
通过图像我们可以发现ACF拖尾,PACF12阶截尾,故选择AR模型。
模型参数的确定主要有三种方法: ESACF(延伸自相关系数法) SCAN(最小典型相关法) MINIC(最小信息准则法)
这里以MINIC为例:
proc arima data=sashelp.air;
identify var=air(1) nlag=30 minic p=(0:12) q=(0:12);
/*还可以添加选项minic, esacf, scan*/
run;

4. 参数估计和检验proc arima data=sashelp.air;
identify var=air(1) nlag=30;
estimate p=12 q=0 ML;
/*还可以添加选项method=ML(极大似然)、ULS(非条件最小二乘法)、CLS(最小二乘法)*/
run;

结果:
1 + 0.18266 B**(1) + 0.2696 B**(2) + 0.22644 B**(3) + 0.26291 B**(4) + 0.19729 B**(5) + 0.26238 B**(6) + 0.21259 B**(7) + 0.31246 B**(8) + 0.17541 B**(9) + 0.29835 B**(10) + 0.16218 B**(11) – 0.64715 B**(12)
5. 模型预测 proc arima data=sashelp.air plots(only)=forecast(forecast);
identify var=air(1) nlag=30;
estimate p=12 q=0 ML;
forecast lead=10out=out;
run;

参考资料:《深入解析 SAS :数据处理、分析优化与商业分析》
来源:SAS建模
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-05-10 13:00:00
在实际工作中,每个数据科学项目各不相同,但基本都遵循一定的通用流程。具体如下:
数据科学工作流程 数据导入 数据整理 反复理解数据 数据可视化 数据转换 统计建模 作出推断(比如预测) 沟通交流 自动化分析 程序开发
下面列出每个步骤最有用的一些R包:
数据导入
以下R包主要用于数据导入和保存数据 feather :一种快速,轻量级的文件格式。在R和python上都可使用 readr :实现表格数据的快速导入。中文介绍可参考 这里 readxl :读取Microsoft Excel电子表格数据 openxlsx :读取Microsoft Excel电子表格数据 googlesheets :读取google电子表格数据 haven :读取SAS,SPSS和Stata统计软件格式的数据 httr :从网站开放的API中读取数据 rvest :网页数据抓取包 xml2 :读取HTML和XML格式数据 webreadr :读取常见的Web日志格式数据 DBI :数据库管理系统通用接口包 RMySQL :用于连接MySQL数据库的R包 RPostgres :用于连接PostgreSQL数据库的R包 bigrquery 用于连接 Google BigQuery 的R包 PivotalR :用于读取Pivitol(Greenplum)和HAWQ数据库中的数据 dplyr :提供了一个访问常见数据库的接口 data.table :data.table包的 fread() 函数可以快速读取 大数据 集 git2r :用于访问git仓库
数据整理
以下R包主要用于数据整理,以便于你后续建模分析: tidyr :用于整理表格数据的布局 dplyr :用于将多个数据表连接成一个整齐的数据集 purrr :函数式编程工具,在做数据整理时非常有用。 broom :用于将统计模型的结果整理成数据框形式 zoo :定义了一个名zoo的S3类型对象,用于描述规则的和不规则的有序的时间序列数据。
数据可视化
以下R包用于数据可视化: ggplot2 及其 扩展 :ggplot2包提供了一个强大的绘图系统,并实现了以下扩展 ggthemes :提供扩展的图形风格主题 ggmap :提供Google Maps,Open Street Maps等流行的在线地图服务模块 ggiraph :绘制交互式的ggplot图形 ggstance :实现常见图形的横向版本 GGally :绘制散点图矩阵 ggalt :添加额外的坐标轴,geoms等 ggforce :添加额外geoms等 ggrepel :用于避免图形标签重叠 ggraph :用于绘制网络状、树状等特定形状的图形 ggpmisc :光生物学相关扩展 geomnet :绘制网络状图形 ggExtra :绘制图形的边界直方图 gganimate :绘制动画图 plotROC :绘制交互式ROC曲线图 ggspectra :绘制光谱图 ggnetwork :网络状图形的geoms ggradar :绘制雷达图 ggTimeSeries :时间序列数据可视化 ggtree :树图可视化 ggseas :季节调整工具 lattice :生成栅栏图 rgl :交互式3D绘图 ggvis :交互式图表多功能系统 htmlwidgets :一个专为 R语言 打造的可视化JS库 leaflet :绘制交互式地图 dygraphs :绘制交互式时间序列图 plotly :交互式绘图包,中文介绍详见 这里 rbokeh :用于创建交互式图表和地图,中文 介绍 Highcharter :绘制交互式Highcharts图 visNetwork :绘制交互式网状图 networkD3 :绘制交互式网状图 d3heatmap :绘制交互式热力图,中文 介绍 DT :用于创建交互式表格 threejs :绘制交互式3d图形和地球仪 – rglwidget :绘制交互式3d图形 DiagrammeR :绘制交互式图表 MetricsGraphics :绘制交互式MetricsGraphics图 rCharts :提供了对多个javascript数据可视化库(highcharts/nvd3/polychart)的R封装。 coefplot :可视化统计模型结果 quantmod :可视化金融图表 colorspace :基于HSL的调色板 viridis :Matplotlib viridis调色板 munsell :Munsell调色板 RColorBrewer:图形调色板 igraph :用于网络分析和可视化 latticeExtra :lattice绘图系统扩展包 sp :空间数据工具
数据转换
以下R包用于将数据转换为新的数据类型 dplyr :一个用于高效数据清理的R包。视频学习 课程 magrittr :一个高效的管道操作工具包。 tibble :高效的显示表格数据的结构 stringr :一个字符串处理工具集 lubridate :用于处理日期时间数据 xts :xts是对时间序列数据(zoo)的一种扩展实现,提供了时间序列的操作接口。 data.table :用于快速处理大数据集 vtreat :一个对预测模型进行变量预处理的工具 stringi :一个快速字符串处理工具 Matrix :著名的稀疏矩阵包
统计建模与推断
下述R包是统计建模最常用的几个R包,其中的一些R包适用于多个主题。 car :提供了大量的增强版的拟合和评价回归模型的函数。 Hmisc :提供各种用于 数据分析 的函数 multcomp :参数模型中的常见线性假设的同时检验和置信区间计算,包括线性、广义线性、线性混合效应和生存模型。 pbkrtest 用于线性混合效应模型的参数Bootstrap检验 MatrixModels :用于稠密矩阵和稀疏矩阵建模 mvtnorm :用于计算多元正态分布和t分布的概率,分位数,随机偏差等 SparseM :用于稀疏矩阵的基本线性代数运算 lme4 :利用C++矩阵库 Eigen进行线性混合效应模型的计算。 broom :将统计模型结果整理成数据框形式 caret :一个用于解决分类和回归问题的数据训练综合工具包 glmnet :通过极大惩罚似然来拟合广义线性模型 gbm :用于实现随机梯度提升算法 xgboost :全称是eXtreme Gradient Boosting。是Gradient Boosting Machine的一个c++实现。目前已制作了xgboost工具的R语言接口。详见统计之都的一篇 介绍 randomForest :提供了用随机森林做回归和分类的函数 ranger :用于随机森林算法的快速实现 h2o :H2O是0xdata的旗舰产品,是一款核心数据分析平台。它的一部分是由R语言编写的,另一部分是由Java和Python语言编写的。用户可以部署H2O的R程序安装包,之后就可以在R语言环境下运行了。 ROCR :通过绘图来可视化分类器的综合性能。 pROC :用于可视化,平滑和对比ROC曲线
沟通交流
以下R包用于实现数据科学结果的自动化报告,以便于你跟人们进行沟通交流。 rmarkdown :用于创建可重复性报告和动态文档 knitr :用于在PDF和HTML文档中嵌入R代码块 flexdashboard :基于rmarkdown,可以轻松的创建仪表盘 bookdown :以R Markdown为基础,用于创作书籍和长篇文档 rticles :提供了一套R Markdown模板 tufte :用于实现Tufte讲义风格的R Markdown模板 DT :用于创建交互式的数据表 pixiedust :用于自定义数据表的输出 xtable :用于自定义数据表的输出 highr :用于实现R代码的LaTeX或HTML格式输出 formatR :通过 tidy_source 函数格式化R代码的输出 yaml :用于实现R数据与 YAML 格式数据之间的通信。
自动化分析
以下R包用于创建自动化分析结果的数据科学产品: shiny :一个使用R语言开发交互式web应用程序的工具。中文 教程 shinydashboard :用于创建交互式仪表盘 shinythemes :给出了Shiny应用程序的常用风格主题 shinyAce :为Shiny应用程序开发者提供 Ace代码编辑器 。 shinyjs :用于在Shiny应用程序中执行常见的JavaScript操作 miniUI :提供了一个UI小部件,用于在R命令行中集成交互式应用程序 shinyapps.io :为创建的Shiny应用程序提供托管服务 Shiny Server Open Source :为Shiny应用程序提供开源免费的服务器 Shiny Server Pro :为企业级用户提供一个Shiny应用程序服务器 rsconnect :用于将Shiny应用程序部署到 shinyapps.io plumber :用于将R代码转化为一个web API rmarkdown :用于创建可重复性报告和动态文档 rstudioapi :用于安全地访问RStudio IDE的API
程序开发
以下这些包主要用于开发自定义的R包: RStudio Desktop IDE :R的IDE。大家都懂,不用解释。 RStudio Server Open Source :开源免费的RStudio服务器 RStudio Server Professional :商业版RStudio服务器 devtools :一个让开发R包变得简单的工具集 packrat :创建项目的特定库,用于处理包的版本问题,增强代码重现能力。 drat :一个用于创建和使用备选R包库的工具 testthat :单元测试,让R包稳定、健壮,减少升级的痛苦。 roxygen2 :通过注释的方式,生成文档,远离Latex的烦恼。 purrr :一个用于 提供函数式编程方法的工具 profvis :用于可视化R代码的性能分析数据 Rcpp :用于实现R与C++的无缝整合。详见统计之都 文章 R6 :R6是R语言的一个面向对象的R包,可以更加高效的构建面向对象系统。 htmltools :用于生成HTML格式输出 nloptr :提供了一个 NLopt非线性优化库 的接口 minqa :一个二次近似的优化算法包 rngtools :一个用于处理随机数生成器的实用工具 NMF :提供了一个执行非负矩阵分解的算法和框架 crayon :用于在输出终端添加颜色 RJSONIO :rjson是一个R语言与json进行转的包,是一个非常简单的包,支持用 C类库转型和R语言本身转型两种方式。 jsonlite :用于实现R语言与json数据格式之间的转化 RcppArmadillo :提供了一个Armadillo C++ Library(一种C++的线性代数库)的接口
实验数据
以下R包给出了案例实战过程中可用的训练数据集: babynames :包含由美国社会保障局提供的三个数据集 neiss :2009-2014年期间提供给美国急诊室的所有事故报告样本数据 yrbss :美国疾病控制中心2009-2013年期间青年危险行为监测系统数据 hflights : USAboundaries :2011年全年休斯顿机场的所有航班数据 rworldmap :国家边界数据 usdanutrients :美国农业部营养数据库 fueleconomy :美国环保署1984-2015年期间的燃油经济数据 nasaweather :包含了一个覆盖中美洲的非常粗糙的24*24格地理位置和大气测量数据。 mexico-mortality :墨西哥死亡人数数据 data-movies 和 ggplotmovies :来自互联网电影数据库 imdb.com 的数据 pop-flows :2008年全美人口流动数据 data-housing-crisis :经过清洗后的2008美国房地产危机数据 gun-sales :纽约时报提供的有关枪支购买的每月背景调查统计分析数据 stationaRy :从成千上万个全球站点收集到的每小时气象数据 gapminder :摘自 Gapminder 的数据 janeaustenr :简·奥斯丁小说全集数据
更多R包介绍查看 CRAN任务视图
参考文章 RStartHere http://blog.fens.me/ 本文由雪晴数据网负责翻译整理,原文请参考RStartHere。
本文链接: http://www.xueqing.tv/cms/article/198
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-05-09 23:47:00
在Python中调用R或在R中调用Python,为什么是“和”而不是“或”?
在互联网中,关于“R Python”的文章,排名前十的搜索结果中只有2篇讨论了一起使用R和Python的优点,而不是把这两种语言对立起来看。这是可以理解的:这两种语言从一开始都具有非常显著的优缺点。从历史上看,尽管把两者分割开来是因为教育背景:统计学家们倾向用R,而程序员则选择了Python语言。然而,随着数据科学家的增加,这种区别开始变得模糊起来:
数据科学家就是这样一种人:软件工程师中最懂统计学,统计学家中最会编程的人。 – josh_wills在推特上这样说到。
由于这两种语言各自提供大量独特的库资源,对能够利用这两种语言的相对优势的数据科学家的需求正在不断增长。
Python与R的对比
在以下领域中,Python 比R 更有优势: 网络爬虫和数据抓取:虽然R中的rvest已经简化了网页抓取, Python的beautifulsoup和Scrapy更加成熟,并提供更多的功能。 数据库连接:虽然R有大量的用于连接到数据库的选项, Python的sqlachemy只用了一个程序包就提供了所有的数据库连接功能,并可广泛用于生产环境。
而在以下领域中,R比Python更有优势: 统计分析选项:尽管Python的SciPy和 Pandas以及 statsmodels的组合提供了很大的一套统计分析工具,而R是专门围绕着统计分析应用等创建的,因此提供了更多的相关工具。 交互式图像或控制板:bokeh, plotly和intuitics最近都把Python的图形使用扩展到了Web浏览器,但是举个使用shiny的例子,R中的shiny 控制面板运行速度更快,而且往往需要更少的代码。

此外,由于数据科学团队现在拥有一个比较广泛的技能库,任何应用程序所选择的编程语言都可能用到以前的知识和经验。对于一些应用,特别是原型设计和开发应用,人们使用他们已知的工具则速度会更快。
纯文本 的“Air Gap(网闸)”策略
指在完全断开网络物理连接的基础上,实现合法信息的共享。本文中指用纯文本文件实现两种语言间代码的共享——译者注。
使用纯文本作为两种语言之间的物理隔离,你需要按如下步骤进行。 从命令行中重构你的R和Python脚本,并接受命令行参数。 输出共享数据到公共文件格式。 在一种语言中执行另一种语言,按要求传递参数。
优势:
最简单的方法,通常最快 可以轻松查看中间输出结果 已有常见文件格式,如:CSV , JSON , YAML的解析器
劣势: 需要事先商定一个共同的模式或文件格式 如果流程变长的话,难以管理中间输出结果和路径 如果数据量变大,本地磁盘读写将成为瓶颈
命令行脚本
通过Windows 或Linux终端环境命令行运行R和Python脚本类似。要运行的命令被分解成以下部分:

其中 是可执行的命令 (R代码中是 Rscript, Python代码中是Python) 是执行脚本所在的完整或相对文件路径。需要注意的是,如果在路径名中有空格,整个文件路径必须用双引号括起来。 这是空格分隔的参数列表用来解析脚本本身。请注意,这些不能作为字符串传递。
例如,打开一个终端环境并运行R脚本,命令如下:
Rscript path/to/myscript.R arg1 arg2 arg3

请注意以下问题: 对于Rscript 和Python 命令必须在你所在的路径中执行,否则你需要提供文件的完整路径。 含有空格符的路径名会产生问题,尤其是在Window系统中,因此必须用双引号括起来,这样才被认为是一个单独的文件路径。
R语言 中访问命令行参数
上面的例子中,arg1,arg2 和 arg3是用来解析可执行R脚本的参数,可以使用commandArgs函数访问 ##myscript.py
#获取命令行参数
myArgs <- commandArgs(trailingOnly = TRUE)
#myArgs是所有参数的特征向量
print(myArgs) print(class(myArgs))
通过设置trailingOnly 为TRUE,myArgs向量中只包含添加到命令行的参数。如果默认设置为FALSE ,myArgs向量中还包含其它参数,比如刚被执行的脚本路径。
Python语言中访问命令行参数
通过下面的命令行执行Python脚本:
python path/to/myscript.py arg1 arg2 arg3
通过在Python脚本中导入sys模块访问arg1, arg2 和arg3参数。 sys模块包含了系统具体的参数和函数,在这里,我们只对argv的属性感兴趣。这个argv属性是所有被传递到当前正在执行脚本的参数列表。表中的第一个元素是正在被执行的脚本的完整路径。 # myscript.py
import sys
# 获取命令行参数
my_args = sys.argv
# my_args 是一个列表,其中的第一个元素是执行的脚本
print(type(my_args))
print(my_args)
如果你只希望保留传递到脚本的参数,你可以使用列表切片来选择除了第一个元素以外的所有参数。
# 使用切片,选择除第一个以外的所有元素
my_args = sys.argv[1:]
回顾一下上面的R语言例子,所有的参数需要以字符串的形式传递,因此有必要转换为所期望的数据类型。
将输出结果写入文件
通过中间文件共享R和Python之间的数据有几种选择。通常,对于普通文本文件,CSVs是很好的表格数据格式,而处理可变长字段或许多嵌套数据结构的非结构化数据(或元数据)形式时,JSON 或YAML是最好的数据格式。
这些都是很常见的数据序列化格式,在R和Python中已存在相应的语法解析器。
在R语言中推荐下面的程序包: 对于CSV文件,使用readr
对于JSON文件,使用jsonlite 对于YAML文件,使用yaml
Python中推荐: 对于CSV文件,使用csv 对于JSON文件,使用json 对于YAML文件,使用PyYAML
csv 和json模块是Python标准的库文件,是Python内置模块,而PyYAML需要额外安装程序包。所有的R程序包均需要安装。
总结
R 和Python之间的数据传递可以通过单一传递途径进行: 使用命令行传递参数 使用常见的结构化文本文件传递数据
然而,在某些实例中,需要将文本文件作为中间文件存储在本地,这不仅很麻烦而且还影响性能。接下来,我们将讨论如何在R和Python中直接调用并在内存中输出。
命令行执行和执行子进程
为了更好地理解在执行子进程的时候发生了什么,值得重新考虑当命令行运行一个Python 或 R进程中更多的细节。在运行下面的命令时,启动了一个新的 Python 进程执行该脚本。
在执行过程中,任何被输出到标准输出和标准错误流的数据会返回到控制台显示。最常见的实现方式是通过Python中的一个内置函数print()或是 R中的函数cat()和 print(),它们将给定字符串的写入标准输出流。一旦脚本执行完毕,Python进程随即关闭。
在这种方式下运行命令行脚本是有用的,但如果希望用这个方法执行多个连续却相互独立脚本时,就变得繁琐,并且容易出错。然而,这可能让一个Python或R进程直接去执行另一个类似的命令。这样有好处,即从一个Python父进程启动一个R中的子进程去运行特定的脚本,进而完成分析。一旦R脚本运行完毕,R中子进程的输出不是被传到控制台,而是返回到父进程中。使用这种方法除去了手动单独执行命令行的步骤。
实例
为了说明一个进程的执行是由另一个进程引起的,我们将会用两个简单的例子:一个是Python调用R,另一个是R调用Python。我们人为降低了每个案例中分析结果的重要性,以便把重点放在机器是如何的实现的过程上。
R脚本范例

我们简单的R脚本例子要从命令行获取一系列数字并返回最大值。 # max.R
# 获取命令行参数
myArgs <- commandArgs(trailingOnly = TRUE)
# 转换成数字类型
nums = as.numeric(myArgs)
# cat将把结果写入标准输出流
cat(max(nums))
在Python中执行R脚本
我们需要利用子进程的模块,也就是标准库的一部分,来实现从Python中进行调用。我们将使用函数check_output 来调用 R 脚本,执行命令并存储标准输出的结果。
想要在Python中调用R来执行 max.R脚本,首先要建立要运行的命令。在Python中的形式以一个字符串列表表示,其相应的元素如下所示:
[‘’, ‘’, ‘arg1’ , ‘arg2’, ‘arg3’, ‘arg4’]
下面代码是运行在Python中调用R的一个例子: # run_max.py
import subprocess
# 定义命令和参数
command = ‘Rscript’
path2script = ‘path/to your script/max.R’
# args变量的值是一个列表
args = [’11’, ‘3’, ‘9’, ’42’]
#建立子进程命令
cmd = [command, path2script] + args
# check_output会执行命令并存储结果
x = subprocess.check_output(cmd, universal_newlines=True)
print(‘The maximum of the numbers is:’, x)
参数 universal_newlines=True 告诉 Python 把返回的输出结果解释为文本字符串,并处理 Windows 和 Linux 的换行字符。如果省略了这个,则输出结果会被作为一个字节的字符串返回,同时在进行任何字符串进一步操作之前必须调用x.decode()来解码成文本。
Python 脚本范例
在我们简单的 Python 脚本中,我们将给定的字符串(第一个参数)拆分为基于所提供的字符串模式的多个子字符串 (第二个参数)。然后,结果以每行一个子字符串的形式输出到控制台。 # splitstr.py
import sys
# 获取传入的参数
string = sys.argv[1]
pattern = sys.argv[2]
#执行分割
ans = string.split(pattern)
#把所产生的元素列表合成一个新命令行
# 分割字符串并打印
print(‘n’.join(ans))
在R中调用Python
当用R执行子进程时,建议使用 R 的system2函数来执行并获取输出。这是因为内置的系统函数跨平台不兼容,非常难使用。
建立要执行的命令是类似于上面的 Python 例子,然而system2 期望命令根据它的参数被分解开来。此外,这些参数首先必须总是正在执行的脚本的路径。
最后一个困难可能是R脚本路径名称中的空格处理引起的。解决这一问题最简单的方法是为全路径名称加上双引号,然后用单引号封装此字符串,这样,R保留参数本身的双引号。
下面的代码中,给出在R 中执行 Python 脚本的实例。 # run_splitstr.R
command = “python”
#注意在字符串中的单引号和双引号(如果路径名中有空格,这是必须的)
path2script='”path/to your script/splitstr.py”‘
# 设置args成向量
string = “3523462—12413415—4577678—7967956—5456439”
pattern = “—“
args = c(string, pattern)
# 把脚本路径加入,成为第一个arg参数
allArgs = c(path2script, args)
output = system2(command, args=allArgs, stdout=TRUE)
print(paste(“The Substrings are:n”, output))
为了获取标准输出中的特征向量(每个元素一行),stdout=TRUE 必须在system2中具体说明,不然返回的只是退出状态。当stdout=TRUE时,退出状态存储在一个名为“状态”的属性中。
总结
通过子进程调用,可以将Python和R整合到一个应用程序中。这允许一个父进程调用另一个进程作为子进程,并获取任何输出到标准输出的结果。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-05-08 14:23:00
大数据 是具有海量、高增长率和多样化的信息资产,它需要全新的处理模式来增强决策力、洞察发现力和流程优化能力。
Big data is high volume, high velocity, and/or high variety information assets that require new forms of processing to enable enhanced decision making, insight discovery and process optimization.









大数据 通常都拥有海量的数据存储。仅根据2013年的统计,互联网搜索巨头百度已拥有数据量接近EB级别、阿里、腾讯声明自己存储的数据总量都达到了百PB以上。此外,电信、医疗、金融、公共安全、交通、气象等各个方面保存的数据量也都达到数十或者上百PB级别。
面对这样规模的数据存储量,依靠单台数据库服务器显然是不够的,需要以分布式文件系统(例如 HDFS)作为基石。

在传统的关系型数据库中,所存储的数据都是 结构化 的,例如:
但是在现实生活中,信息往往并没有严格的结构限制。比如一个电商网站需要记录如下用户行为:
用户张三, 于某某时间在商品搜索栏搜索了“苹果手机”一词,然后进入 XXX 商铺进行浏览,经过与店家沟通,讨价还价,最终以6000元的价格购买了 iPhone 7 “钢琴黑”款式手机一部。
诸如此类的用户行为数据属于 非结构化数据 ,很难用关系型数据库存储。因此诸多No-SQL数据库(例如 HBase)成为了存储大数据的更好选择。


如果没有更加快速有效的海量数据解决方案,那么如此大量多样的数据不但没有带来更多价值,反而成为了系统的负担。关于这一点,谷歌公司率先提出的MapReduce模型为我们带来了新的道路。
MapReduce可以简单的理解成一种分治方法:把庞大的任务分成若干小任务,交给多个节点进行并行处理,然后再把所有节点的处理结果合并起来,从而大大提升了数据处理效率。(关于MapReduce的详细流程,将会在以后的文章中进行讲解。)


人工智能 :

以大数据作为机器学习的训练集,从而训练出拥有一定决策能力的人工智能。典型的代表案例就是谷歌的AlphaGo, 通过大量围棋棋局的学习,最终拥有了打败围棋世界冠军的能力。
商业分析:

从大量的用户行为数据中挖掘出有价值的商业信息。典型代表是著名社交公司LinkedIn,他们通过用户之间的关联关系,绘画出学校、公司、人才之间庞大而复杂的信息网络。不仅如此,LinkedIn还通过大量求职者和招聘方的信息,分析出哪些公司正在迅速扩张,哪些公司正在流失人才,哪些公司之间正在展开人才市场的争夺。这些对于客户公司来说,都是无价之宝。
犯罪预测:

洛杉矶警察局曾经借助一套原本用于预测地震后余震的大数据模型,把过去80年内的130万个犯罪记录数据输入进去,结果发现其预测出的犯罪高发地点与现实惊人的吻合。后来该预测算法经过改进,已经成为了当地警局重要的参考依据,大大降低了当地的犯罪率。

这里所介绍的相关知识,只是作者对于大数据领域的浅层次理解。通过这篇漫画,希望没有从事过IT行业,或者不了解大数据的朋友们能够对大数据有一些初步的认知。
希望有经验的朋友们对本文提出宝贵意见,指出其中的纰漏和不足,非常感谢! 作者:梦见 ,互联网公司的码农一枚,喜欢算法和面向对象设计。个人微信号:13522239721 个人订阅号:dreamsee321,欢迎一起交流讨论!
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-11-03 22:36:00
译者注:原文写于2011年末,虽然文中关于 Python 3的一些说法可以说已经不成立了,但是作为一篇面向从其他语言转型到Python的程序员来说,本文对Python的生态系统还是做了较为全面的介绍。文中提到了一些第三方库,但是Python社区中强大的第三方库并不止这些,欢迎各位Pytonistas补充。
开发者从PHP、Ruby或其他语言转到Python时,最常碰到的第一个障碍,就是缺乏对Python生态系统的全面了解。开发者经常希望能有一个教程或是资源,向他们介绍如何以大致标准的方式完成大部分的任务。
本文中的内容,是对我所在公司内部维基百科的摘录,记录了面向网络应用开发的Python生态系统基础知识,目标受众则是公司实习生、培训人员以及从其他语言转型到Python的资深开发者。
文中所列的内容或资源是不完整的。我也打算把它当成一项 一直在进行中的工作 (work in perpetual progress)。希望经过不断的增补修订,本文会成为Python生态系统方面的一篇详尽教程。
目标受众
本文的目的,不是教大家Python编程语言。读完这篇教程,你也不会瞬间变成一名Python高手。我假设大家已经有一定的Python基础。如果你是初学者,那么别再继续读下去了。先去看看Zed Shaw所写的 《笨办法学Python》 ,这是本质量很高的免费电子书,看完之后再回头阅读这篇教程吧。
我假设你们使用的是Linux(最好是Ubuntu/Debian)或是类Linux操作系统。为什么?因为这是我最熟悉的系统。我在Windows平台或Mac OS X平台上,没有专业的编程经验,只是测试过不同浏览器的兼容性。如果你用的是这两个平台,那么请参考下面的资料安装Python。 Python 101: Setting up Python on Windows Official documentation for Python on Windows Official documentation for Python on Mac OS X
你还可使用搜索引擎,查找你使用的操作系统中安装Python的最好方法。如果你有什么疑问,我强烈建议你去 Stack Overflow 平台上提问。
该选择哪个版本?
Python 2.x是目前的主流;Python 3是崭新的未来。如果你不关心这个问题,可以直接跳到下面的 Python安装 部分。(译者注:原文作者写这篇文章时是2011年,当时Python 3才发展没几年。)
刚接触Python的话,安装3.x版本看上去是很自然的第一步,但是这可能并不是你想要的。
目前有两个积极开发中的Python版本——2.7.x与3.x(也被称为Python 3, Py3K和Python 3000)。Python 3是一个不同于Python 2的语言。二者在语义、语法上,既存在细微的区别,又有着截然不同的一面。截至今天,Python2.6/2.7是安装数量和使用度最高的版本。许多主流的Python库、框架、工具都没有做到100%兼容Python 3。
因此,最稳妥的选择就是使用2.x版(更准确的说,即2.7.x)。务必只在你需要或者完全了解情况的前提下,才选择Python 3。
Python 3 Wall of Shame网站记录了Python 3对各种库的兼容情况。在使用Python 3之前,仔细查阅下这个网站的内容。 译者注:现在,主流第三方库和框架对Python 3的支持度已经很高。根据py3readiness网站的统计,360个最受欢迎的Python包中已经有315个支持Python 3。具体的支持情况,可以查看 这个网站 。一定程度上说,Python 3已经成为新的主流。
使用哪种虚拟机
Python的解释器,又叫做Python虚拟机,它有多种不同的实现。其中,主流实现方式是CPython,装机量也最高,同时也是其他虚拟机的参考实现。
PyPy是利用Python语言实现的Python;Jython则使用Java实现,并运行在Java虚拟机之上;IronPython是用.NET CLR实现的Python。
除非真的有重大理由,否则应该选择CPython版本的实现,避免出现意外情况。
如果这些有关版本和虚拟机的唠叨话让你读了头疼,那你只需要使用CPython 2.7.x即可。
Python安装
大部分Linux/Unix发行版和Mac OS X都预装了Python。如果你没有安装或者已有的版本比较旧,那么你可以通过下面的命令安装2.7.x版:
Ubuntu/Debian及其衍生系统
$ sudo apt-get install python2.7
sudo 是类Unix系统中的一个程序,可以让用户以其他用户的权限(通常是超级用户或root用户)运行程序。
Fedora/Red Hat及类似系统
sudo yum install python2.7
在RHEL(Red Hat Enterprise Linux的缩写)平台上,你可能需要启用EPEL软件源(repositories),才能正常安装。
在本文后面的示例中,我会使用 sudo 程序;你应将其替换为自己版本中的相应命令或程序。
理解Python的包(package)
首先你需要了解的是,Python没有默认的包管理工具。事实上,Python语言中包的概念,也是十分松散的。
你可能也知道,Python代码按照模块(module)划分。一个模块,可以是只有一个函数的单个文件,也可以是包含一个或多个子模块的文件夹。包与模块之间的区别非常小,每个模块同时也可以视作一个包。
那么模块与包之间,到底有什么区别?要想解答这个问题,你首先要了解Python是如何查找模块的。
与其他编程环境类似,Python中也有一些函数和类(比如 str , len 和 Exception )是存在于全局作用域(global scope,在Python中被称为builtin scope)的,其他的函数和类则需要通过 import 语句进行引用。例如:
>>> import os >>> from os.path import basename , dirname
这些包就在你的文件系统中的某处,所以能被 import 语句发现。那么Python是怎么知道这些模块的地址?原来,在你安装Python虚拟机的时候,就自动设置了这些地址。当然平台不同,这些地址也就不一样。
你可以通过 sys.path 查看系统中的包路径。这是我的笔记本运行该命令之后的输出结果,系统是Ubuntu 11.10 Oneric Ocelot。
>>> import sys >>> print sys . path [ '' , '/usr/lib/python2.7' , '/usr/lib/python2.7/plat-linux2' , '/usr/lib/python2.7/lib-tk' , '/usr/lib/python2.7/lib-old' , '/usr/lib/python2.7/lib-dynload' , '/usr/local/lib/python2.7/dist-packages' , '/usr/lib/python2.7/dist-packages' , '/usr/lib/python2.7/dist-packages/PIL' , '/usr/lib/python2.7/dist-packages/gst-0.10' , '/usr/lib/python2.7/dist-packages/gtk-2.0' , '/usr/lib/pymodules/python2.7' , '/usr/lib/python2.7/dist-packages/ubuntu-sso-client' , '/usr/lib/python2.7/dist-packages/ubuntuone-client' , '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel' , '/usr/lib/python2.7/dist-packages/ubuntuone-couch' , '/usr/lib/python2.7/dist-packages/ubuntuone-installer' , '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol' ]
这行代码会告诉你Python搜索指定包的所有路径,这个路径就存储在一个Python列表数据类型中。它会先从第一个路径开始,一直往下检索,直到找到匹配的路径名。这意味着,如果两个不同的文件夹中包含了两个同名的包,那么包检索将会返回其遇到的第一个绝对匹配地址,不会再继续检索下去。
你现在可能也猜到了,我们可以轻松地修改(hack)包检索路径,做到你指定的包第一个被发现。你只需要运行下面的代码:
>>> sys.path.insert(0, '/path/to/my/packages')
尽管这种做法在很多情况下十分有用,但是你必须牢记 sys.path 很容易被滥用。 务必在必要时才使用这种方法,并且不要滥用。
site 模块控制着包检索路径设置的方法。每次Python虚拟机初始化时,就会被自动引用。如果你想更详细地了解整个过程,可以查阅 官方文档 。
PYTHONPATH环境变量
PYTHONPATH 是一个可以用来增强默认包检索路径的环境变量。可以把它看作是一个 PATH 变量,但是一个只针对Python的变量。它只是一些包含有Python模块的文件路径列表(不是 sys.path 所返回的Python列表),每个路径之间以:分隔。设置方法很简单,如下:
export PYTHONPATH=/path/to/some/directory:/path/to/another/directory:/path/to/yet/another/directory
在某些情况下,你不用覆盖已有的 PYTHONPATH ,只需要在开头或结尾加上新的路径即可。
export PYTHONPATH= $ PYTHONPATH :/path/to/some/directory # Append export PYTHONPATH=/path/to/some/directory: $ PYTHONPATH # Prepend
PYTHONPATH、 sys.path.insert`和其他类似的方法,都是hack小技巧,一般情况下最好不要使用。如果它们能够解决本地开发环境出现的问题,可以使用,但是你的生产环境中不应该依赖这些技巧。要取得同样的效果,我们还可以找到更加优雅的方法,稍后我会详细介绍。
现在你明白了Python如何查找已安装的包,我们就可以回到一开始的那个问题了。Python中,模块和包的区别到底是什么?包就是一个或多个模块/子模块的集合,一般都是以经过压缩的tarball文件形式传输,这个文件中包含了:1. 依赖情况(如果有的话);2.将文件复制到标准的包检索路径的说明;3. 编译说明——如果文件中包含了必须要经过编译才能安装的代码。就是这点区别。
第三方包(Third Party packages)
如果想利用Python进行真正的编程工作,你从一开始就需要根据不同的任务安装第三方包。
在Linux系统上,至少有3种安装第三方包的方法。 使用系统本身自带的包管理器(deb, rpm等) 通过社区开发的类似 pip , easy_install 等多种工具 从源文件安装
这三种方法做的几乎是同一件事情,即安装依赖包,视情况编译代码,然后把包中模块复制到标准包检索路径。
尽管第二种和第三种方法在所有操作系统中的实现都一致,我还是要再次建议你查阅Stack Overflow网站的问答,找到你所使用系统中其他安装第三方包的方法。
去哪找第三方包?
在安装第三方包之前,你得先找到它们。查找包的方法有很多。 你使用的系统自带的包管理器 Python包索引(也被称为PyPI) 各种源码托管服务,如 Launchpad , Github , Bitbucket 等。
通过系统自带的包管理器安装
使用系统自带的包管理器安装,只需要在命令行输入相应命令,或是使用你用来安装其他应用的GUI应用即可。举个例子,要在Ubuntu系统上安装 simplejson (一个JSON解析工具),你可以输入下面的命令:
$ sudo apt-get install python-simplejson
通过pip安装
easy_install 已经不太受开发者欢迎。本文将重点介绍 easy_install 的替代者—— pip 。
pip 是一个用来安装和管理Python包的工具。它并不是一个Python虚拟机自带的模块,所以我们需要先安装。在Linux系统中,我一般会这样操作:
$ sudo apt-get install python-pip
在安装其他包之前,我总是会把 pip 升级到PyPI中的最新版本,因为Ubuntu默认源中的版本比PyPI的低。我这样升级 pip 。
$ sudo pip install pip --upgrade
现在,你可以通过运行 run pip install package-name ,安装任何Python包。所以,要安装 simplejson 的话,你可以运行以下命令:
$ sudo pip install simplejson
移除包也一样简单。
$ sudo pip uninstall simplejson
pip 默认会安装PyPI上最新的稳定版,但是很多时候,你会希望安装指定版本的包,因为你的项目依赖那个特定的版本。要想指定包的版本,你可以这样做:
$ sudo pip install simplejson == 2.2.1
你还会经常需要升级、降级或者重装一些包。你可以通过下面的命令实现:
$ sudo pip install simplejson --upgrade # Upgrade a package to the latest version from PyPI $ sudo pip install simplejson == 2.2.1 --upgrade # Upgrade/downgrade a package to a given version
接下来,假设你想安装某个包的开发版本,但是代码没有放在PyPI上,而是在版本控制仓库中,你该怎么办? pip 也可以满足这个需求,但是在此之前,你需要在系统上安装相应的版本控制系统(VCS)。在Ubuntu平台,你可以输入下面的命令:
$ sudo apt-get install git-core mercurial subversion
安装好VCS之后,你可以通过下面的方式从远程仓库中安装一个包:
$ sudo pip install git+http://hostname_or_ip/path/to/git-repo#egg = packagename $ sudo pip install hg+http://hostname_or_ip/path/to/hg-repo#egg = packagename $ sudo pip install svn+http://hostname_or_ip/path/to/svn-repo#egg = packagename
从本地仓库中安装也同样简单。注意下面文件系统路径部分的三个斜杠(///)。
$ sudo pip install git+file:///path/to/local/repository
通过 git 协议安装时,请注意,你要像下面这样使用 git+git 前缀:
$ sudo pip install git+git://hostname_or_ip/path/to/git-repo#egg = packagename
现在,你可能在纳闷这些命令中的 eggs 是什么东西?目前你只需要知道,一个 egg 就是经zip压缩之后的Python包,其中包含了包的源代码和一些元数据。 pip 在安装某个包之前,会构建相关的egg信息。你可以打开代码仓库中的 setup.py 文件,查看egg的名字(几乎都会注明)。找到 setup 部分,然后看看有没有一行类似 name="something" 的代码。你找到的代码可能会和下面这段代码类似(来自simplejson包中的 setup.py 文件)。
setup( name="simplejson", # <--- This is your egg name version=VERSION, description=DESCRIPTION, long_description=LONG_DESCRIPTION, classifiers=CLASSIFIERS, author="Bob Ippolito", author_email="bob@redivi.com", url="http://github.com/simplejson/simplejson", license="MIT License", packages=['simplejson', 'simplejson.tests'], platforms=['any'], **kw)
假如没有 setup.py 文件呢?你该怎么查找egg的名字?答案是,你根本不用去找。只要把包的源代码拷贝到你的项目文件夹,之后就可以和你自己写的代码一样引用和使用啦。
–user参数
以上所有的例子,都是在系统层面安装指定的包。如果你使用 pip install 时,加上 --user 这个参数,这些包将会安装在该用户的’~/.local`文件夹之下。例如,在我的机器上,运行效果是这样的:
$ pip install --user markdown2Downloading/unpacking markdown2 Downloading markdown2-1.0.1.19.zip ( 130Kb ) : 130Kb downloaded Running setup.py egg_info for package markdown2Installing collected packages: markdown2 Running setup.py install for markdown2 warning: build_py: byte-compiling is disabled, skipping. changing mode of build/scripts-2.7/markdown2 from 664 to 775 warning: install_lib: byte-compiling is disabled, skipping. changing mode of /home/mir/.local/bin/markdown2 to 775Successfully installed markdown2Cleaning up...
注意markdown2这个Python包的安装路径( /home/mir/.local/bin/markdown2 )
不在系统层面安装所有的Python包有很多理由。稍后在介绍如何为每个项目设置单独、孤立的Python环境时,我会具体说明。
从源文件安装
从源文件安装Python包,只需要一行命令。将包文件解压,然后运行下面的命令:
cd /path/to/package/directorypython setup.py install
尽管这种安装方法与其他的方法没什么区别,但是要记住: pip 永远是安装Python包的推荐方法,因为 pip 可以让你轻松升级/降级,不需要额外手动下载、解压和安装。从源文件安装时如果其他方法都行不通时,你的最后选择(一般不会存在这种情况)。
安装需要编译的包
虽然我们已经介绍了大部分与包安装相关的内容,仍有一点我们没有涉及:含有C/C++代码的Python包在安装、使用之前,需要先编译。最明显的例子就是数据库适配器(database adapters)、图像处理库等。
尽管 pip 可以管理源文件的编译,我个人更喜欢通过系统自带的包管理器安装这类包。这样安装的就是预编译好的二进制文件。
如果你仍想(或需要)通过 pip 安装,在Ubuntu系统下你需要执行下面的操作。
安装编译器及相关工具:
$ sudo apt-get install build-essential
安装Python开发文件(头文件等):
$ sudo aptitude install python-dev-all
如果你的系统发行版本中没有提供 python-dev-all ,请查找名字类似 python-dev 、 python2.X-dev 的相关包。
假设你要安装 psycopg2 (PostgreSQL数据库的Python适配器),你需要安装PostgreSQL的开发文件。
$ sudo aptitude install postgresql-server-dev-all
满足这些依赖条件之后 ,你就可以通过 pip install 安装了。
$ sudo pip install psycopg2
这里应该记住一点: 并非所有这类包都兼容pip安装方式。 但是,如果你自信可以成功编译源文件,并且(或者)已经有目标平台上的必要经验和知识,那么你完全可以按照这种方式安装。
开发环境
不同的人设置开发环境的方法也不同,但是在几乎所有的编程社区中,肯定有一种方法(或者超过一种)比其他方法的接受度更高。尽管开发环境设置的与别人不同没有问题,一般来说接受度更高的方法经受住了高强度的测试,并被证实可以简化一些日常工作的重复性任务,并且可以提高可维护性。
virtualenv
Python社区中设置开发环境的最受欢迎的方法,是通过 virtualenv 。Virtualenv是一个用于创建孤立Python环境的工具。那么现在问题来了:为什么我们需要孤立的Python环境?要回答这个问题,请允许我引用virtualenv的官方文档。 我们要解决的问题之一,就是依赖包和版本的管理问题,以及间接地解决权限问题。假设你有一个应用需要使用LibFoo V1,但是另一个应用需要V2。那么你如何使用两个应用呢?如果你把需要的包都安装在 /usr/lib/python2.7/site-packages (或是你的系统默认路径),很容易就出现你不小心更新了不应该更新的应用。
简单来说,你的每一个项目都可以拥有一个单独的、孤立的Python环境;你可以把所需的包安装到各自孤立的环境中。
还是通过 pip 安装virutalenv。
$ sudo pip install virtualenv
安装完之后,运行下面的命令,为你的项目创建孤立的Python环境。
$ mkdir my_project_venv $ virtualenv --distribute my_project_venv # The output will something like: New python executable in my_project_venv/bin/pythonInstalling distribute.............................................done.Installing pip.....................done.
那么这行代码都做了些什么呢?你创建了一个名叫 my_project_venv 的文件夹,用于存储新的Python环境。 --distribute 参数告诉virtualenv使用基于 distribute 包开发的新的、更好的打包系统,而不是基于 setuptools 的旧系统。你现在只需要知道, --distribute 参数将会自动在虚拟环境中安装 pip ,免去了手动安装的麻烦。随着你的Python编程经验和知识增加,你会慢慢明白这个过程的具体细节。
现在查看 my_project_venv 文件夹中的内容,你会看到类似下面的文件夹结构:
# Showing only files/directories relevant to the discussion at hand.|-- bin| |-- activate # <-- Activates this virtualenv| |-- pip # <-- pip specific to this virtualenv| `-- python # <-- A copy of python interpreter`-- lib `-- python2.7 # <-- This is where all new packages will go
通过下面的命令,激活虚拟环境:
$ cd my_project_venv $ source bin/activate
使用 source 命令启动 activate 脚本之后,你的命令行提示符应该会变成这样:
( my_project_venv ) $
虚拟环境的名称会添加在$提示符的前面。
现在运行下面的命令,关闭虚拟环境:
( my_project_venv ) $ deactivate
当你在系统层面安装virtualenv时(如果激活了虚拟环境,请先关闭),可以运行下面的命令帮助自己理解。
首先,我们来看看如果我们在终端输入 python 或者 pip ,系统会使用哪个执行文件。
$ which python/usr/bin/python $ which pip/usr/local/bin/pip
现在再操作一次,但是首先要激活virtualenv,注意输出结果的变化。在我的机器上,命令的输出结果时这样的:
$ cd my_project_venv $ source bin/activate ( my_project_venv ) $ which python/home/mir/my_project_venv/bin/python ( my_project_venv ) $ which pip/home/mir/my_project_venv/bin/pip
virtualenv 所做的,就是拷贝了一份Python可执行文件,然后创建了一些功能脚本以及你在项目开发期间用于安装、升级、删除相关包的文件夹路径。它还施展了一些包检索路径/PYTHONPATH魔法,确保实现以下几点:1. 在你安装第三方包时,它们被安装在了当前激活的虚拟环境,而不是系统环境中;2. 当在代码中引用第三方包时,当前激活的虚拟环境中的包将优先于系统环境中的包。
这里有很重要的一点要注意:系统Python环境中安装的所有包,默认是可以在虚拟环境中调用的。这意味着,如果你在系统环境中安装了 simplejson 包,那么所有的虚拟环境将自动获得这个包的地址。你可以在创建虚拟环境时,通过添加 --no-site-packages 选项,取消这个行为,就像这样:
$ virtualenv my_project_venv --no-site-packages
virtualenvwrapper
virtualenvwrapper 是 virtualenv 的封装器(wrapper),提供了一些非常好的功能,便捷了创建、激活、管理和销毁虚拟环境的操作,否则将会是件琐事。你可以运行如下命令安装 virtualenvwrapper :
$ sudo pip install virtualenvwrapper
安装结束之后,你需要进行一些配置。下面是我的配置:
if [ `id -u` != '0' ]; then export VIRTUALENV_USE_DISTRIBUTE=1 # <-- Always use pip/distribute export WORKON_HOME= $ HOME /.virtualenvs # <-- Where all virtualenvs will be stored source /usr/local/bin/virtualenvwrapper.sh export PIP_VIRTUALENV_BASE= $ WORKON_HOME export PIP_RESPECT_VIRTUALENV=true
这些配置中,唯一必须的是 WORKON_HOME 与 source /usr/local/bin/virtualenvwrapper.sh 。其他的配置则是根据我的个人偏好进行的。
将上面的配置添加到 ~/.bashrc 文件的最后,然后在你当前打开的终端界面中运行下面的命令:
$ source ~/.bashrc
关掉所有打开的终端窗口和Tab窗口,也能取得同样地效果。当你再次打开终端窗口或Tab窗口时, ~/.bashrc 将会被执行,自动设置好你的 virtualenvwrapper 。
现在如果想创建、激活、关闭或是删除虚拟环境,你可以运行下面的代码:
$ mkvirtualenv my_project_venv $ workon my_project_venv $ deactivate $ rmvirtualenv my_project_venv
virtualenvwrapper还支持tab自动补全功能。
你可以前往 virtualenvwrapper项目主页 查看更多命令和配置选项。
通过pip和virtualenv进行基本的依赖包管理
pip 与 virtualenv 结合使用,可以为项目提供基本的依赖包管理功能。
你可以使用 pip freeze 导出目前安装的包列表。例如,下面就是我用来开发这个博客网站所用的Python包:
$ pip freeze -l Jinja2 == 2.6 PyYAML == 3.10 Pygments == 1.4 distribute == 0.6.19 markdown2 == 1.0.1.19
注意,我使用了-l选项。它告诉 pip 只导出当前激活的虚拟环境中安装的包,忽略全局安装的包。
你可以将导出的列表保存至文件,并把文件添加到版本控制系统(VCS)。
$ pip freeze -l > requirements.txt
通过 pip ,我们可以从写入了 pip freeze 命令结果的文件中,安装相应的包。
其他重要工具
前面我们介绍了有关Python版本、虚拟机和包管理的基础知识,但是日常工作中还有其他任务需要使用专门的工具来完成。虽然我无法详细介绍每一个工具,我会尽量做一个大概的介绍。
提前说声对不起,因为下面介绍的大部分工具都是与网络应用开发相关的。
编辑器
提供在Python中进行编程的优秀编辑器有很多。我个人倾向于Vim,但是我不想引发一场 编辑器优劣大战 。
对Python编程支持较好地编辑器和集成开发环境(IDEs),主要有Vim/GVim, Emacs, GNOME主题下的GEdit, Komodo Edit, Wing IDE, PyCharm 等。还有其他编辑器,但是上面列举的这些应该是最受欢迎的。你应该选择最适合自己的工具。
Pyflakes:源码检查
Pyflakes是一个简单的程序,通过分析文件的文本内容,检查Python源文件中的错误。它可以检查语法和部分逻辑错误,识别被引用但没有使用的模块,以及只使用了一次的变量,等等。
你可以通过 pip 安装:
$ pip install pyflakes
然后像下面那样,在命令行调用pyflakes,传入Python源文件作为参数:
$ pyflakes filename.py
Pyflakes还可以嵌入到你的编辑器中。下面这张图显示的是嵌入了Vim之后的情况。注意出现了红色的波浪线。
你可以在Stack Overflow上咨询如何在你使用的编辑器重添加Pyflakes支持。
Requests:为人类开发的HTTP库
Requests库让你轻轻松松使用HTTP协议。
首先通过 pip 安装:
$ pip install requests
下面是一个简单的使用示例:
`` ` >>> import requests >>> r = requests . get ( 'https://api.github.com' , auth = ( 'user' , 'pass' )) >>> r . status_code 204 >>> r . headers [ 'content-type' ] 'application/json' >>> r . content ... `` `
更多详情,请查看 Requests的文档 。
Flask:网络开发微框架
Flask是一个基于Werkzeug与Jinja2这两个库的Python微框架。
首先通过 pip 安装:
$ pip install Flask
下面是一个简单的使用示例:
from flask import Flask app = Flask ( __name__ ) @app.route ( "/" ) def hello (): return "Hello World!" if __name__ == "__main__" : app . run ()
这样运行Flask应用:
$ python hello.py * Running on http://localhost:5000/
Flask官网
Django:面向网络开发的全栈框架
Django是一个全栈网络框架。它提供了ORM、HTTP库、表格处理、XSS过滤、模板引擎以及其他功能。
这样通过 pip 安装:
$ pip install Django
前往 Django官网 ,跟着教程学习即可。非常简单。
Fabric:简化使用SSH部署网站和执行系统管理任务的方式
Fabric是一个命令行工具,可以简化使用SSH进行网站部署或执行系统管理任务的过程。
它提供了一套基本的操作,可以执行本地或远程命令行命令,上传/下载文件,以及提示用户进行输入或者取消执行等辅助性功能。
你可以通过 pip 安装:
$ pip install fabric
下面是用Fabric写的一个简单任务:
from fabric.api import run def host_type (): run ( 'uname -s
接下来,你可以在一个或多个服务器上执行该任务:
$ fab -H localhost host_type [ localhost ] run: uname -s [ localhost ] out: LinuxDone.Disconnecting from localhost... done .
Fabric官网
SciPy:Python中的科学计算工具
如果你的工作涉及科学计算或数学计算,那么SciPy就是必不可少的工具。
SciPy (pronounced “Sigh Pie”) 是一个开源的数学、科学和工程计算包。SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。与其功能相类似的软件还有MATLAB、GNU Octave和Scilab。SciPy目前在BSD许可证下发布。它的开发由Enthought资助
前往 SciPy官网 ,获取详细的下载/安装说明以及文档。
PEP 8:Python风格指南
虽然PEP 8本身不是一个工具,但毋庸置疑的是,它是Python开发方面一个非常重要的文件。
PEP 8这个文件中,定义了主流Python发行版本中标准库的编码规范。文件的唯一目的,就是确保其他的Python代码都能遵守同样地代码结构以及变量、类和函数命名规律。确保你充分了解并遵循该风格指南。
PEP 8链接
强大的Python标准库
Python的标准库内容非常丰富,提供了大量的功能。标准库中包含了众多内建模块(built-in modules,用C语言编写的),可以访问类似文件读/写(I/O)这样的系统功能,还包括了用Python编写的模块,提供了日常编程中许多问题的标准解决方案。其中一些模块的设计思路很明显,就是要鼓励和增强Python程序的可移植性,因此将平台相关的细节抽象为了不依赖于平台的API接口。
查看 标准库的官方文档 。
推荐阅读
David Goodger的《如何像Python高手一样编程》一文,深入介绍了许多Python的惯用法和技巧,可以立刻为你增添许多有用的工具。
Doug Hellmann的系列文章 Python Module of the Week 。这个系列的焦点,是为Python标准库中模块编写示例代码。
结语
我在本文中所介绍的内容,触及的还只是Python生态系统的表面。Python世界中,几乎针对每一个你能想象到的任务,都存在相关的工具、库和软件。这些明显无法在一篇文章中尽述。你必须要自己慢慢探索。
Python有伟大的社区,社区中的人很聪明,也很有耐心,乐于帮助Python语言的初学者。所以,你可以选择一个最喜欢的开源项目,去它的IRC频道找人聊天;关注邮件列表,并积极提问;和有丰富Python系统实施经验的人交谈。慢慢地,随着你的经验和知识逐步积累,你也会成为他们之中的一员。
最后,我为大家推荐 Python之禅 。反复回味、思考这几段话,你一定会有所启发!
>>> import this The Zen of Python , by Tim Peters Beautiful is better than ugly . Explicit is better than implicit . Simple is better than complex . Complex is better than complicated . Flat is better than nested . Sparse is better than dense . Readability counts . Special cases aren 't special enough to break the rules. Although practicality beats purity . Errors should never pass silently . Unless explicitly silenced . In the face of ambiguity , refuse the temptation to guess . There should be one -- and preferably only one -- obvious way to do it . Although that way may not be obvious at first unless you 're Dutch. Now is better than never . Although never is often better than * right * now . If the implementation is hard to explain , it 's a bad idea. If the implementation is easy to explain , it may be a good idea . Namespaces are one honking great idea -- let 's do more of those! 原文链接: http://mirnazim.org/writings/python-ecosystem-introduction/
译文链接: http://codingpy.com/article/python-ecosystem-introduction/
本文为专栏文章,来自:编程派,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/4794.html 。
数据分析
2015-12-16 23:40:00
正如前面内容所暗示的一样,R 语言允许用户 创建自己的 函数 (function)对象。R 有一些 内部函数并且可以用在 其他的表达式中。通过这个过程,R 在程序的功能性, 便利性和优美性上得到了扩展。学写这些有用的函数 是一个人轻松地创造性地使用 R 的 最主要的方式。
需要强调的是,大多是函数都作为 R 系统的一部分提供,如 mean() , var() , postscript() 等等。这些函数都是用 R 写的, 因此在本质上和用户写的没有差别。
一个函数是通过下面的语句形式定义的。 > name <- function( arg_1 , arg_2 , ...) expression
其中 expression 是一个 R 表达式(常常是一个成组 表达式),它利用参数 arg_i 计算最终的结果。 该表达式的值就是返回给函数的最终值。
可以在任何地方以 name ( expr_1 , expr_2 , ...) 的形式调用函数。
Simple examples: 简单的例子
这是一个简单的例子,它用来计算双样本的 t-统计量,并且显示“所有步骤”。这是一个人为的例子, 当然还有其他更简单的办法 得到一样的结果。
函数定义如下: > twosam <- function(y1, y2) { n1 <- length(y1); n2 <- length(y2) yb1 <- mean(y1); yb2 <- mean(y2) s1 <- var(y1); s2 <- var(y2) s <- ((n1-1)*s1 + (n2-1)*s2)/(n1+n2-2) tst <- (yb1 - yb2)/sqrt(s*(1/n1 + 1/n2)) tst }
通过这个函数,你可以下面的命令 实现双样本 t-检验。 > tstat <- twosam(data$male, data$female); tstat
第二个例子是仿效 Matlab 里面的反斜杠命令。它是用来返回向量 y 正交投影到 X 列空间上面的系数。 (这常常被称为回归系数的 最小二乘法估计。) 这可以用 函数 qr() 来实现;但是直接使用这个函数有时有点 难处理。下面提供了一个简单 而又安全的函数。
给定 n × 1 的向量 y 和一个 n × p 的矩阵 X,因此 X y 可以定义如下 (X’X)^{-}X’y, 其中 (X’X)^{-} 这就是 X’X的广义逆矩阵(generalized inverse)。 > bslash <- function(X, y) { X <- qr(X) qr.coef(X, y) }
当这个对象创建后,它可能用于这样的命令中: > regcoeff <- bslash(Xmat, yvar)
经典的 R 函数 lsfit() 可以很好的实现这个功能和其他一些相关 的事情 1 。它以一种有点违反直觉的方式 依次用函数 qr() 和 qr.coef() 去完成这部分计算。 如果一部分代码常常使用, 我们可以把这部分代码单独列出来成为函数 使用。如果是这样,我们可能期望矩阵的二元操作 能以一种更为便利的方式进行。
Defining new binary operators: 定义新的二元操作符
假定我们给予函数 bslash() 一个不同的名字,且以 下面的形式给出 % anything %
那么它将以 二元操作符 的形式在表达式中使用, 而不是函数的形式。例如我们选择 ! 作为中间的字符。函数可以如下定义 > "%!%" <- function(X, y) { ... }
(注意要使用引号)。该函数然后就可以用于 X %!% y 。(反斜杠符不是一个很好的选择, 因为在某些情况下会引入一些特定的问题。)
矩阵的乘法操作符 %*% 和外积操作符 %o% 同样是这种方式定义的 二元操作符。
Named arguments and defaults: 参数命名和默认值
和 Generating regular sequences 提示的一样,如果调用的函数的参数 以“ name = object ”的方式给出, 它们可以用任何顺序。但是,参数赋值序列可能以 未命名的,位置特异性的方式给出,同时也有可能 在这些位置特异性的参数后加上命名参数赋值。
因此,如果有下面方式定义的函数 fun1 > fun1 <- function(data, data.frame, graph, limit) { [function body omitted] }
那么函数将会被好几种方式调用,如 > ans <- fun1(d, df, TRUE, 20) > ans <- fun1(d, df, graph=TRUE, limit=20) > ans <- fun1(data=d, limit=20, graph=TRUE, data.frame=df)
上面所有的方式是等价的。
许多时候,参数会被设定一些默认值。 如果默认值适合你要做的事情,你可以省略这些参数。 例如,函数 fun1 用下面的方式 定义 > fun1 <- function(data, data.frame, graph=TRUE, limit=20) { ... }
它可以被如下命令调用 > ans <- fun1(d, df)
这和前面的三种情况等价。 > ans <- fun1(d, df, limit=10)
这就改变了一个默认值。
特别说明一下,默认值可以是任何表达式,甚至是函数本身 所带有的其他参数;它们没有要求 是常数。我们的例子采用常数只是使问题简单容易说明。
The ellipsis argument (…): 省略符号的参数(…)
还有一种常常出现的情况就是要求一个函数的参数设置 可以传递给另外一个函数。例如图形函数如果调用了函数 par() 和其他如 plot() 类的函数, par() 函数的图形设置将会传递给图形输出的设备控制。 (See The par() function, 后面的章节会给出函数 par() 更为详细的内容。)这个可以通过给函数 增加一个额外的参数来实现。这个参数字面上就是 … ,它可以被传递。 一个概述性的例子可以如下所示。 fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) { [省略一些语句] if (graph) par(pch="*", ...) [省略其他语句] }
Assignment within functions: 函数内部的赋值
注意 任何在函数内部的普通赋值都是局部的 暂时的,当退出函数时都会丢失 。因此 函数中的赋值语句 X <- qr(X) 不会影响 调用该函数的程序赋值情况。
如果要彻底理解 R 赋值管理的原则, 读者需要熟悉解析 框架 (Evalution frame)的概念。这属于高级内容, 不在这里深入讨论。
如果想在一个函数里面全局赋值或者永久赋值,那么可以采用 “强赋值”(superassignment)操作符 <<- 或者采用函数 assign() 。用 help 命令可以得到更细节的内容。 S-Plus 用户需要注意 <<- 在 R 里面有着不同的语义(semantics)。
More advanced examples: 高级的例子
区组设计中的效率因子
下面是一个有点枯燥但较为完整的例子。它是用来 计算一个区组设计中的效率因子。
区组设计(block design)需要考虑两个因子 blocks ( b 个水平) 和 varieties ( v 个水平)。如果R 和 K 分别是 v × v 和 b × b 重复 (replications)及 区组大小 (block size)矩阵而 N 则是 b × v 的关联矩阵,那么 那么效率因子就是这个矩阵的特征值。 E = I_v – R^{-1/2}N’K^{-1}NR^{-1/2} = I_v – A’A, where A = K^{-1/2}NR^{-1/2}. 写这个函数的一种方式就是 > bdeff <- function(blocks, varieties) { blocks <- as.factor(blocks) # minor safety move b <- length(levels(blocks)) varieties <- as.factor(varieties) # minor safety move v <- length(levels(varieties)) K <- as.vector(table(blocks)) # 去掉 dim 属性 R <- as.vector(table(varieties)) # 去掉 dim 属性 N <- table(blocks, varieties) A <- 1/sqrt(K) * N * rep(1/sqrt(R), rep(b, v)) sv <- svd(A) list(eff=1 - sv$d^2, blockcv=sv$u, varietycv=sv$v) }
这种情况下,奇异值分解 比求解特征值效率高。
函数的结果是一个列表。它不仅以第一个分量的形式给出了 效率因子,还给出了区组和规范对照信息, 因为有些时候这些会给出额外有用的 定量信息。
去除打印数组中的名字
为了显示一个大的数组或者矩阵,常常需要 需要以一个完整的块的形式显示,同时去掉数组名和编号。 去掉 dimnames 属性是不能达到这个要求的,因为 R 环境会把空的字符串赋给 dimnames 属性。 为了打印一个矩阵 X > temp <- X > dimnames(temp) <- list(rep("", nrow(X)), rep("", ncol(X))) > temp; rm(temp)
这个可以非常便利地通过下面的函数 no.dimnames() 实现。它是利用一种“卷绕”(wrap around) 的方式实现的。这个例子还说明一些非常高效有用的用户函数 也可以是非常简洁的。 no.dimnames <- function(a) { ## 为了更紧凑的打印,可以去除数组中的维度名字 d <- list() l <- 0 for(i in dim(a)) { d[[l <- l + 1]] <- rep("", i) } dimnames(a) <- d a }
通过这个函数,数组可以用一种紧凑的方式 显示 > no.dimnames(X)
这对大的整数数非常的有用,因为这些数组 表现出来的式样(pattern)可能比它们的值更为重要。
递归式的数值积分
函数可以是递归的,可以在函数内部调用自己。 但是需要注意的是,这些函数或者变量, 不会被更高层次的解析框架(evaluation frame)中的被调用函数 所继承。如果它们在搜索路径中,这种情况就会出现。
下面的例子显示了一个最简单的一维数值积分方法。 被积函数在所积范围的两端和中点的值会被计算。 如果单面板梯形法则(one-panel trapezium rule)的结果和 双面板的非常相似,那么就以后者作为返回值。 否则同样的过程会递归用于各个面板。 这是一个自适应的积分过程。它会集中各个 被积函数接近线性的区域函数计算值。 但是这种方法开销有点过大 1 。 相对其他积分算法,它的优势体现在被积函数既平滑又很难求值时。
这个例子同样可以部分的作为一个 R 编程的难题给出。 area <- function(f, a, b, eps = 1.0e-06, lim = 10) { fun1 <- function(f, a, b, fa, fb, a0, eps, lim, fun) { ## function `fun1' is only visible inside `area' d <- (a + b)/2 h <- (b - a)/4 fd <- f(d) a1 <- h * (fa + fd) a2 <- h * (fd + fb) if(abs(a0 - a1 - a2) < eps || lim == 0) return(a1 + a2) else { return(fun(f, a, d, fa, fd, a1, eps, lim - 1, fun) + fun(f, d, b, fd, fb, a2, eps, lim - 1, fun)) } } fa <- f(a) fb <- f(b) a0 <- ((fa + fb) * (b - a))/2 fun1(f, a, b, fa, fb, a0, eps, lim, fun1) }
Scope: 作用域
这一部分的内容相对本文档其他部分的内容更偏向一些技术性的问题。 但是它会澄清 S-Plus 和 R 一些重要的 差异。
在函数内部的变量可以分为三类: 形式参数,局部变量和自由变量。 形式参数是出现在函数的参数列表中的变量。 它们的值由实际的函数参数 绑定 形式参数的过程决定的。 局部变量由函数内部的表达式的值决定的。 既不是形式参数又不是局部变量的变量是 自由变量。自由变量 如果被赋值将会变成局部变量。考虑下面的 函数定义过程。 f <- function(x) { y <- 2*x print(x) print(y) print(z) }
在这个函数中, x 是形式参数, y 是局部变量 , z 是自由变量。
在 R 里面,可以利用函数被创建的环境中某个变量的第一次出现 解析一个自由变量的绑定。这称为 词法作用域 (lexical scope)。我们可以定义一个函数 cube 。 cube <- function(n) { sq <- function() n*n n*sq() }
函数 sq 中的变量 n 不是函数的参数。 因此它是自由变量。一些作用域的原则可以用来 确定和它相关的值。在静态作用域 ( S-Plus ),这个值指的是一个和全局变量 n 相关的值。在词法作用域(R),它指的是函数 cube 的参数。因为当 sq 定义的时候, 它会动态绑定参数 n 。 在 R 里面解析和在 S-Plus 里面解析不同点在于 S-Plus 搜索 全局变量 n 而 R 在 cube 调用时 首先寻找环境创建的变量 n 。 ## 首先用 S 解析 S> cube(2) Error in sq(): Object "n" not found Dumped S> n <- 3 S> cube(2) [1] 18 ## 同样的函数在 R 中解析 R> cube(2) [1] 8
词汇作用域会给予函数 可变状态 (mutable state)。 下面的例子演示 R 如何模仿一个银行的 帐户。真正的银行帐户必须同时有跟踪收支平衡或者总额的变量, 提供提款业务,取款业务和显示 当前余额的函数。我们可以在 account 里面 创建三个函数,然后返回一个包含它们的 的列表。当调用 account 时,它读入一个数值参数 total ,并且返回一个包含三个函数的列表。 因为这些函数时定义在一个有变量 total 的环境中,它们可以访问它的值。
<<- 是一个特别的赋值操作符,它用来 更改和 total 相关的值。这个操作符会回溯到 一个含有标识符 total 的密闭环境中,当它找到这个环境, 它会用操作符右边的值替换环境中这个变量的值。 如果在全局变量或者最高层次的环境中仍然没有找到标识符 total ,那么该变量就会被创建并且在那里被赋值。 大多数用户用 <<- 创建全局变量,并且把操作符右边 的值赋给它 1 。仅仅当 <<- 用于 一个函数的输出是另外一个函数的输入时, 这里描述的独特行为才会出现。 open.account <- function(total) { list( deposit = function(amount) { if(amount <= 0) stop("Deposits must be positive!n") total <<- total + amount cat(amount, "deposited. Your balance is", total, "nn") }, withdraw = function(amount) { if(amount > total) stop("You don't have that much money!n") total <<- total - amount cat(amount, "withdrawn. Your balance is", total, "nn") }, balance = function() { cat("Your balance is", total, "nn") } ) } ross <- open.account(100) robert <- open.account(200) ross$withdraw(30) ross$balance() robert$balance() ross$deposit(50) ross$balance() ross$withdraw(500)
Customizing the environment: 定制环境
用户可以有好几种办法定制环境。可以修改 位置初始化文件,并且每个目录都有它特有的一个 初始化文件。还有就是利用函数 .First 和 .Last 。
位置初始化文件的路径可以通过 环境变量 R_PROFILE 设置。如果该变量没有设置, 默认是R安装目录下面的子目录 etc 中的 Rprofile.site 。这个文件包括你每次执行 R 时一些自动运行的命令。第二个定制文件是 .Rprofile ,它可以放在任何目录下面。如果 R 在该目录下面 被调用,这个文件就会被载入。这个文件允许用户 定制它们的工作空间,允许在不同的工作目录下 设置不同的起始命令。如果在起始目录中没有 .Rprofile , R 会在用户主目录下面搜索 .Rprofile 文件并且调用它 (如果它 存在的话)。
在这两个文件或者 .RData 中任何叫 .First() 的函数 都有特定的状态的。它会在 R 对话的开始时自动执行并且初始化环境。 下面例子中的定义允许 将提示符改为 $ ,以及设置其他有用的东西。 这些设置同样会在其他会话中起作用。
因此,这些文件的执行顺序是 Rprofile.site , .Rprofile , .RData 然后是 .First() 。后面文件中 定义会屏蔽掉前面文件中的定义。 > .First <- function() { options(prompt="$ ", continue="+t") # $ is the prompt options(digits=5, length=999) # custom numbers and printout x11() # for graphics par(pch = "+") # plotting character source(file.path(Sys.getenv("HOME"), "R", "mystuff.R")) # my personal functions library(MASS) # attach a package }
相似的是,如果定义了函数 .Last() ,它(常常)会在对话 结束时执行。一个例子就是 > .Last <- function() { graphics.off() # 一个小的安全措施。 cat(paste(date(),"nAdiosn")) # 该吃午饭了? }
Object orientation: 面向对象
一个对象的类决定了它会如何被一个 泛型 函数处理。相反,一个泛型函数 通过 参数类的特异 参数来完成特定工作或者事务的。 如果参数缺乏任何类属性, 或者在该问题中有一个不能被任何泛型函数处理的类, 泛型函数会有一种 默认的处理方式 。
下面的一个例子使这个问题清晰。类机制为用户提供了为特定问题设计和编写 泛型函数的便利。 在其他泛型函数中, plot() 用于图形化显示 对象, summary() 用于各种类型的概述分析, 以及 anova() 用于比较 统计模型。
能以特定方式处理类的泛型函数的数目非常的庞大。 例如,可以在非常时髦的类对象 "data.frame" 中使用的函数有 [ [[<- any as.matrix [<- mean plot summary
可以用函数 methods() 得到当前对某个类对象 可用的泛型函数列表: > methods(class="data.frame")
相反,一个泛型函数可以处理的类同样很多。 例如, plot() 有默认的方法和变量 处理对象类 "data.frame" , "density" , "factor" ,等等。一个完整的列表同样可以通过 函数 methods() 得到: > methods(plot)
读者可以参考 完整描述这一机制的正式文档。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2015-11-22 01:38:00
前言
Google搜索,早已成为我每天必用的工具,无数次惊叹它搜索结果的准确性。同时,我也在做Google的SEO,推广自己的博客。经过几个月尝试,我的博客PR到2了,外链也有几万个了。总结下来,还是感叹PageRank的神奇!
改变世界的算法,PageRank!
目录 PageRank算法介绍 PageRank算法原理 PageRank算法的 R语言 实现
1. PageRank算法介绍
PageRank是Google专有的算法,用于衡量特定网页相对于搜索引擎索引中的其他网页而言的重要程度。它由Larry Page 和 Sergey Brin在20世纪90年代后期发明。PageRank实现了将链接价值概念作为排名因素。
PageRank让链接来”投票”
一个页面的“得票数”由所有链向它的页面的重要性来决定,到一个页面的超链接相当于对该页投一票。一个页面的PageRank是由所有链向它的页面(“链入页面”)的重要性经过递归算法得到的。一个有较多链入的页面会有较高的等级,相反如果一个页面没有任何链入页面,那么它没有等级。
简单一句话概括:从许多优质的网页链接过来的网页,必定还是优质网页。
PageRank的计算基于以下两个基本假设: 数量假设:如果一个页面节点接收到的其他网页指向的入链数量越多,那么这个页面越重要 质量假设:指向页面A的入链质量不同,质量高的页面会通过链接向其他页面传递更多的权重。所以越是质量高的页面指向页面A,则页面A越重要。
要提高PageRank有3个要点: 反向链接数 反向链接是否来自PageRank较高的页面 反向链接源页面的链接数
2. PageRank算法原理
在初始阶段:网页通过链接关系构建起有向图,每个页面设置相同的PageRank值,通过若干轮的计算,会得到每个页面所获得的最终PageRank值。随着每一轮的计算进行,网页当前的PageRank值会不断得到更新。
在一轮更新页面PageRank得分的计算中,每个页面将其当前的PageRank值平均分配到本页面包含的出链上,这样每个链接即获得了相应的权值。而每个页面将所有指向本页面的入链所传入的权值求和,即可得到新的PageRank得分。当每个页面都获得了更新后的PageRank值,就完成了一轮PageRank计算。
1). 算法原理
PageRank算法建立在随机冲浪者模型上,其基本思想是:网页的重要性排序是由网页间的链接关系所决定的,算法是依靠网页间的链接结构来评价每个页面的等级和重要性,一个网页的PR值不仅考虑指向它的链接网页数,还有指向’指向它的网页的其他网页本身的重要性。
PageRank具有两大特性: PR值的传递性:网页A指向网页B时,A的PR值也部分传递给B 重要性的传递性:一个重要网页比一个不重要网页传递的权重要多
2). 计算公式: PR(pi): pi页面的PageRank值 n: 所有页面的数量 pi: 不同的网页p1,p2,p3 M(i): pi链入网页的集合 L(j): pj链出网页的数量 d:阻尼系数, 任意时刻,用户到达某页面后并继续向后浏览的概率。
(1-d=0.15) :表示用户停止点击,随机跳到新URL的概率
取值范围: 0 < d ≤ 1, Google设为0.85
3). 构造实例:以4个页面的数据为例
图片说明: ID=1的页面链向2,3,4页面,所以一个用户从ID=1的页面跳转到2,3,4的概率各为1/3 ID=2的页面链向3,4页面,所以一个用户从ID=2的页面跳转到3,4的概率各为1/2 ID=3的页面链向4页面,所以一个用户从ID=3的页面跳转到4的概率各为1 ID=4的页面链向2页面,所以一个用户从ID=4的页面跳转到2的概率各为1
构造邻接表: 链接源页面 链接目标页面 1 2,3,4 2 3,4 3 4 4 2
构造邻接矩阵(方阵): 列:源页面 行:目标页面 [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 1 0 0 1 [3,] 1 1 0 0 [4,] 1 1 1 0
转换为概率矩阵(转移矩阵) [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 1/3 0 0 1 [3,] 1/3 1/2 0 0 [4,] 1/3 1/2 1 0
通过链接关系,我们就构造出了“转移矩阵”。
3. R语言单机算法实现
创建数据文件:page.csv 1,2 1,3 1,4 2,3 2,4 3,4 4,2
分别用下面3种方式实现PageRank: 未考虑阻尼系统的情况 包括考虑阻尼系统的情况 直接用R的特征值计算函数
1). 未考虑阻尼系统的情况
R语言实现 #构建邻接矩阵 adjacencyMatrix<-function(pages){ n<-max(apply(pages,2,max)) A <- matrix(0,n,n) for(i in 1:nrow(pages)) A[pages[i,]$dist,pages[i,]$src]<-1 A } #变换概率矩阵 probabilityMatrix<-function(G){ cs <- colSums(G) cs[cs==0] <- 1 n <- nrow(G) A <- matrix(0,nrow(G),ncol(G)) for (i in 1:n) A[i,] <- A[i,] + G[i,]/cs A } #递归计算矩阵特征值 eigenMatrix<-function(G,iter=100){ iter<-10 n<-nrow(G) x <- rep(1,n) for (i in 1:iter) x <- G %*% x x/sum(x) } > pages<-read.table(file="page.csv",header=FALSE,sep=",") > names(pages)<-c("src","dist");pages src dist 1 1 2 2 1 3 3 1 4 4 2 3 5 2 4 6 3 4 7 4 2 > A<-adjacencyMatrix(pages);A [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 1 0 0 1 [3,] 1 1 0 0 [4,] 1 1 1 0 > G<-probabilityMatrix(A);G [,1] [,2] [,3] [,4] [1,] 0.0000000 0.0 0 0 [2,] 0.3333333 0.0 0 1 [3,] 0.3333333 0.5 0 0 [4,] 0.3333333 0.5 1 0 > q<-eigenMatrix(G,100);q [,1] [1,] 0.0000000 [2,] 0.4036458 [3,] 0.1979167 [4,] 0.3984375
结果解读: ID=1的页面,PR值是0,因为没有指向ID=1的页面 ID=2的页面,PR值是0.4,权重最高,因为1和4都指向2,4权重较高,并且4只有一个链接指向到2,权重传递没有损失 ID=3的页面,PR值是0.19,虽有1和2的指向了3,但是1和2还指向的其他页面,权重被分散了,所以ID=3的页面PR并不高 ID=4的页面,PR值是0.39,权重很高,因为被1,2,3都指向了
从上面的结果,我们发现ID=1的页面,PR值是0,那么ID=1的页,就不能向其他页面输出权重了,计算就会不合理!所以,增加d阻尼系数,修正没有链接指向的页面,保证页面的最小PR值>0,。
2). 包括考虑阻尼系统的情况
增加函数:dProbabilityMatrix #变换概率矩阵,考虑d的情况 dProbabilityMatrix<-function(G,d=0.85){ cs <- colSums(G) cs[cs==0] <- 1 n <- nrow(G) delta <- (1-d)/n A <- matrix(delta,nrow(G),ncol(G)) for (i in 1:n) A[i,] <- A[i,] + d*G[i,]/cs A } > pages<-read.table(file="page.csv",header=FALSE,sep=",") > names(pages)<-c("src","dist");pages src dist 1 1 2 2 1 3 3 1 4 4 2 3 5 2 4 6 3 4 7 4 2 > A<-adjacencyMatrix(pages);A [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 1 0 0 1 [3,] 1 1 0 0 [4,] 1 1 1 0 > G<-dProbabilityMatrix(A);G [,1] [,2] [,3] [,4] [1,] 0.0375000 0.0375 0.0375 0.0375 [2,] 0.3208333 0.0375 0.0375 0.8875 [3,] 0.3208333 0.4625 0.0375 0.0375 [4,] 0.3208333 0.4625 0.8875 0.0375 > q<-eigenMatrix(G,100);q [,1] [1,] 0.0375000 [2,] 0.3738930 [3,] 0.2063759 [4,] 0.3822311
增加阻尼系数后,ID=1的页面,就有值了PR(1)=(1-d)/n=(1-0.85)/4=0.0375,即无外链页面的最小值。
3). 直接用R的特征值计算函数
增加函数:calcEigenMatrix #直接计算矩阵特征值 calcEigenMatrix<-function(G){ x <- Re(eigen(G)$vectors[,1]) x/sum(x) } > pages<-read.table(file="page.csv",header=FALSE,sep=",") > names(pages)<-c("src","dist");pages src dist 1 1 2 2 1 3 3 1 4 4 2 3 5 2 4 6 3 4 7 4 2 > A<-adjacencyMatrix(pages);A [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 1 0 0 1 [3,] 1 1 0 0 [4,] 1 1 1 0 > G<-dProbabilityMatrix(A);G [,1] [,2] [,3] [,4] [1,] 0.0375000 0.0375 0.0375 0.0375 [2,] 0.3208333 0.0375 0.0375 0.8875 [3,] 0.3208333 0.4625 0.0375 0.0375 [4,] 0.3208333 0.4625 0.8875 0.0375 > q<-calcEigenMatrix(G);q [1] 0.0375000 0.3732476 0.2067552 0.3824972
直接计算矩阵特征值,可以有效地减少的循环的操作,提高程序运行效率。
在了解PageRank的原理后,使用R语言构建PageRank模型,是非常容易的。实际应用中,我们也愿意用比较简单的方式建模,验证后,再用其他语言语言去企业应用!
下一篇文章,将介绍如何用MapReduce分步式算法来实现PageRank模型, PageRank算法并行实现
参考文章 Google 的秘密 PageRank 彻底解说中文版 http://zh.wikipedia.org/wiki/PageRank
算法为王系列文章 ,涵盖了计算机算法, 数据挖掘 (机器学习)算法,统计算法,金融算法等的多种跨学科算法组合。在 大数据 时代的背景下,算法已经成为了金字塔顶的明星。一个好的算法可以创造一个伟大帝国,就像Google。
算法为王的时代正式到来…. 关于作者: 张丹(Conan), 程序员Java,R,PHP,Javascript weibo:@Conan_Z blog: http://blog.fens.me email: bsspirit@gmail.com
来源:http://blog.fens.me/algorithm-pagerank-r/
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-07-08 23:50:00
经常有人问, SAS 如何和HADOOP交互、集成在回答这个问题前,主要看HADOOP在SAS系统中的定位,有下面定位考虑:
1.把HADOOP作为传统数据源供SAS访问
这是最简单的一种应用场景,就是把HADOOP当做类似于ORACLE/DB2等之类的数据库源来使用,SAS有能力直接在HADOOP上进行数据处理,在HADOOP上进行直接数据读写
2.把HADOOP作为分析平台
通过在HADOOP上嵌入SAS分析组件,SAS可以使你在数秒内交互式浏览或者分析上十亿行记录。
配合SAS 的Event Stream Process(实时事件处理引擎),你可以实时的分析当前数据,快速洞悉变化。
3..把HADOOP作为数据管理平台
使用SAS Data Loader for haddop组件,企业用户能利用其对HADOOP上的数据进行简单、快速的数据清洗、转换、数据质量管理等操作
换另外一种方法来说,SAS针对HADOOP提供有FROM /WITH/IN的能力
FROM
你的数据可以来自(FROM)你的HADOOP系统,你也可以写数据从(FROM)SAS到HADOOP
通过利用SAS/ACCESS to haddop组件或者使用SAS SPDE FOR HADOOP技术,你能像操作常规数据那样操作HADOOP
WITH
“With”是利用HADOOP上各个节点的存储能力和计算能力并行进行数据访问和处理的能力。而不像是”FROM”抓取、写入能力,存在一个管道来集中接收来自HADOOP的数据或者从一个管道往HADOOP中写入数据。
“WITH”可以充分利用HADOOP各个节点的存储能力和计算能力,使HADOOP节点和SAS节点间并行交互和计算,比如SAS产品 Visual Analytics, Visual Statistics, In-Memory Statistics for Hadoop, High Performance Analytic procedures .
IN
“In”就是SAS支持直接在HADOOP中进行计算,所有的操作都在HADOOP内部完成,SAS只是负责提交代码、转换SAS代码为HADOOP代码(M/R)、接收代码执行结果。
典型的SAS组件有:SAS Code Accelerator for Hadoop, SAS Data Quality Accelerator for Hadoop
希望上述讲解能回答HADOOP和SAS的关系,让大家对SAS在HADOOP上的应用有个比较简单的理解 来源:CSDN 作者:AnyJack
链接:http://blog.csdn.net/anyjack/article/details/50917300
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-07-07 22:00:00
Excel 是Microsoft Office家族中的主要成员之一,而其中所提供的函数其实是一些预定义的公式,利用它能够在Excel中快速准确地进行各种复杂的运算。简单地说,使用函数时,只需指定相应的参数即可得到正确结果,从而将烦琐的运算简单化。本文将对函数的基础知识进行详细的介绍。
0函数的基本事项
(1)基础公式
Excel中的函数可以说是一种特殊的公式。在使用函数前,需提前了解公式的基本参数。公式是进行数值计算的等式,由运算符号组合而成。
(2)函数基础
了解函数的类型,熟悉函数的语法结构、参数设置,掌握其输入方法。此外,还介绍了函数检索的方法以及嵌套函数的技巧。
(3)错误分析
介绍在指定函数的单元格中修改显示错误内容时的方法。同时,介绍对循环引用产生的错误的处理方法。
(4)加载宏的使用
在高等函数中,包含有“加载宏”的外部程序。如果要使用此函数, Excel必须加载该程序。
(5)数组的使用
作为函数使用的应用手册,讲解在函数中使用数组的方法。
1 基础公式
公式是对工作表中的值执行计算的等式。在Excel中,可以使用常量和计算运算符创建简单公式。
(1)认识公式
在Excel中,公式是以“ =”开始的用于数值计算的等式。简单的公式包含+、-、×、÷四则运算,复杂的公式包含函数、引用、运算符、常量等。比如运用>、<之类的比较运算符,比较单元格内的数据。因此, Excel公式不局限于公式的计算,还可运用于其他情况。公式中使用的运算符包括算术运算符、比较运算符、文本运算符、引用运算符4种类型。
如果在公式中同时使用了多个运算符,那么将按照表5所示优先级进行计算。它和基本的数学运算优先级基本相同,但是,括号内的数值先计算。
在了解公式的基本知识后,接下来学习如何输入公式,以及使用公式进行相应计算。
(2)输入公式
在Excel中,可以利用公式进行各种运算。在此,首先学习输入公式的流程。 选中需显示计算结果的单元格; 在单元格内输入等号“ =”; 输入公式并按Enter键确认
用键盘直接输入公式时,首先应选中需显示计算结果的单元格,并在其中输入“ =”。如果不输入“ =”,则不能显示输入的公式和文字,也不能得出计算结果。此外,在公式中也可以引用单元格,如果引用包含有数据的单元格,那么在修改单元格中的数据时,对公式的结构没有影响,用户无须再次修改公式。在公式中引用单元格时,单击相应的单元格(选中单元格区域)比直接输入数据简单,选定的单元格将被原样插入到公式中。待完成公式的输入后,用户可以随时对其进行修改。如果不再需要公式,那么可以选中单元格,按Delete键将其删除。
——本文摘自《Excel公式与函数辞典2016》,由中国青年出版社投稿至 数据分析 网
本文由 中国青年出版社 投稿至 数据分析网 并经编辑发表,内容观点不代表本站立场,如转载请联系原作者,本文链接:https://www.afenxi.com/20653.html 。
数据分析
2016-07-07 00:25:00
前言
人类总是在生活中摸索规律,把规律总结为经验,再把经验传给后人,让后人发现更多的规规律,每一次知识的传递都是一次进化的过程,最终会形成了人类的智慧。自然界规律,让人类适者生存地活了下来,聪明的科学家又把生物进化的规律,总结成 遗传算法 ,扩展到了更广的领域中。
本文将带你走进遗传算法的世界。
1. 遗传算法介绍
遗传算法是一种解决最优化的搜索算法,是进化算法的一种。进化算法最初借鉴了达尔文的进化论和孟德尔的遗传学说,从生物进化的一些现象发展起来,这些现象包括遗传、基因突变、自然选择和杂交等。遗传算法通过模仿自然界生物进化机制,发展出了随机全局搜索和优化的方法。遗传算法其本质是一种高效、并行、全局搜索的方法,它能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程,计算出全局最优解。
遗传算法的操作使用适者生存的原则,在潜在的种群中逐次产生一个近似最优解的方案,在每一代中,根据个体在问题域中的适应度值和从自然遗传学中借鉴来的再造方法进行个体选择,产生一个新的近似解。这个过程会导致种群中个体的进化,得到的新个体比原来个体更能适应环境,就像自然界中的改造一样。
如果从生物进化的角度,我们可以这样理解。在一个种群中,个体数量已经有一定规模,为了进化发展,通过选择和繁殖产生下一代的个体,其中繁殖过程包括交配和突变。根据适者生存的原则,选择过程会根据新个体的适应度进行保留或淘汰,但也不是完全以适应度高低作为导向,如果单纯选择适应度高的个体可能会产生局部最优的种群,而非全局最优,这个种群将不会再进化,称为早熟。之后,通过繁殖过程,让个体两两交配产生下一代新个体,上一代个体中优秀的基因会保留给下一代,而劣制的基因将被个体另一半的基因所代替。最后,通过小概率事件发生基因突变,通过突变产生新的下一代个体,实现种群的变异进化。
经过这一系列的选择、交配和突变的过程,产生的新一代个体将不同于初始的一代,并一代一代向增加整体适应度的方向发展,因为最好的个体总是更多的被选择去产生下一代,而适应度低的个体逐渐被淘汰掉。这样的过程不断的重复:每个个体被评价,计算出适应度,两个个体交配,然后突变,产生第三代。周而复始,直到终止条件满足为止。
遗传算法需要注意的问题: 遗传算法在适应度函数选择不当的情况下有可能收敛于局部最优,而不能达到全局最优。 初始种群的数量很重要,如果初始种群数量过多,算法会占用大量系统资源;如果初始种群数量过少,算法很可能忽略掉最优解。 对于每个解,一般根据实际情况进行编码,这样有利于编写变异函数和适应度函数。 在编码过的遗传算法中,每次变异的编码长度也影响到遗传算法的效率。如果变异代码长度过长,变异的多样性会受到限制;如果变异代码过短,变异的效率会非常低下,选择适当的变异长度是提高效率的关键。 变异率是一个重要的参数。 对于动态数据,用遗传算法求最优解比较困难,因为染色体种群很可能过早地收敛,而对以后变化了的数据不再产生变化。对于这个问题,研究者提出了一些方法增加基因的多样性,从而防止过早的收敛。其中一种是所谓触發式超级变异,就是当染色体群体的质量下降(彼此的区别减少)时增加变异概率;另一种叫随机外来染色体,是偶尔加入一些全新的随机生成的染色体个体,从而增加染色体多样性。 选择过程很重要,但交叉和变异的重要性存在争议。一种观点认为交叉比变异更重要,因为变异仅仅是保证不丢失某些可能的解;而另一种观点则认为交叉过程的作用只不过是在种群中推广变异过程所造成的更新,对于初期的种群来说,交叉几乎等效于一个非常大的变异率,而这么大的变异很可能影响进化过程。 遗传算法很快就能找到良好的解,即使是在很复杂的解空间中。 遗传算法并不一定总是最好的优化策略,优化问题要具体情况具体分析。所以在使用遗传算法的同时,也可以尝试其他算法,互相补充,甚至根本不用遗传算法。 遗传算法不能解决那些“大海捞针”的问题,所谓“大海捞针”问题就是没有一个确切的适应度函数表征个体好坏的问题,使得算法的进化失去导向。 对于任何一个具体的优化问题,调节遗传算法的参数可能会有利于更好的更快的收敛,这些参数包括个体数目、交叉率和变异率。例如太大的变异率会导致丢失最优解,而过小的变异率会导致算法过早的收敛于局部最优点。对于这些参数的选择,现在还没有实用的上下限。 适应度函数对于算法的速度和效果也很重要。
遗传算法的应用领域包括计算机自动设计、生产调度、电路设计、游戏设计、机器人学习、模糊控制、时间表安排,神经网络训练等。然而,我准备把遗传算法到金融领域,比如回测系统的参数寻优方案,我会在以后的文章中,介绍有关金融解决方案。
2. 遗传算法原理
在遗传算法里,优化问题的解是被称为个体,它表示为一个变量序列,叫做染色体或者基因串。染色体一般被表达为简单的字符串或数字串,也有其他表示法,这一过程称为编码。首先要创建种群,算法随机生成一定数量的个体,有时候也可以人工干预这个过程进行,以提高初始种群的质量。在每一代中,每一个个体都被评价,并通过计算适应度函数得到一个适应度数值。种群中的个体被按照适应度排序,适应度高的在前面。
接下来,是产生下一代个体的种群,通过选择过程和繁殖过程完成。
选择过程,是根据新个体的适应度进行的,但同时并不意味着完全的以适应度高低作为导向,因为单纯选择适应度高的个体将可能导致算法快速收敛到局部最优解而非全局最优解,我们称之为早熟。作为折中,遗传算法依据原则:适应度越高,被选择的机会越高,而适应度低的,被选择的机会就低。初始的数据可以通过这样的选择过程组成一个相对优化的群体。
繁殖过程,表示被选择的个体进入交配过程,包括交配(crossover)和突变(mutation),交配对应算法中的交叉操作。一般的遗传算法都有一个交配概率,范围一般是0.6~1,这个交配概率反映两个被选中的个体进行交配的概率。
例如,交配概率为0.8,则80%的“夫妻”个体会生育后代。每两个个体通过交配产生两个新个体,代替原来的“老”个体,而不交配的个体则保持不变。交配过程,父母的染色体相互交換,从而产生两个新的染色体,第一个个体前半段是父亲的染色体,后半段是母亲的,第二个个体则正好相反。不过这里指的半段並不是真正的一半,这个位置叫做交配点,也是随机产生的,可以是染色体的任意位置。
突变过程,表示通过突变产生新的下一代个体。一般遗传算法都有一个固定的突变常数,又称为变异概率,通常是0.1或者更小,这代表变异发生的概率。根据这个概率,新个体的染色体随机的突变,通常就是改变染色体的一个字节(0变到1,或者1变到0)。
遗传算法实现将不断的重复这个过程:每个个体被评价,计算出适应度,两个个体交配,然后突变,产生下一代,直到终止条件满足为止。一般终止条件有以下几种: 进化次数限制 计算耗费的资源限制,如计算时间、计算占用的CPU,内存等 个体已经满足最优值的条件,即最优值已经找到 当适应度已经达到饱和,继续进化不会产生适应度更好的个体 人为干预
算法实现原理:
创建初始种群 循环:产生下一代 评价种群中的个体适应度 定义选择的适应度函数 改变该种群(交配和变异) 返回第二步 满足终止条件结束
3. 遗传算法 R语言 实现
本节的系统环境 Win7 64bit R: 3.1.1 x86_64-w64-mingw32/x64 (64-bit)
一个典型的遗传算法要求:一个基因表示的求解域, 一个适应度函数来评价解决方案。
遗传算法的参数通常包括以下几个: 种群规模(Population),即种群中染色体个体的数目。 染色体的基因个数(Size),即变量的数目。 交配概率(Crossover),用于控制交叉计算的使用频率。交叉操作可以加快收敛,使解达到最有希望的最优解区域,因此一般取较大的交叉概率,但交叉概率太高也可能导致过早收敛。 变异概率(Mutation),用于控制变异计算的使用频率,决定了遗传算法的局部搜索能力。 中止条件(Termination),结束的标志。
在R语言中,有一些现成的第三方包已经实现的遗传算法,我们可以直接进行使用。 mcga包,多变量的遗传算法,用于求解多维函数的最小值。 genalg包,多变量的遗传算法,用于求解多维函数的最小值。 rgenoud包,复杂的遗传算法,将遗传算法和衍生的拟牛顿算法结合起来,可以求解复杂函数的最优化化问题。 gafit包,利用遗传算法求解一维函数的最小值。不支持R 3.1.1的版本。 GALGO包,利用遗传算法求解多维函数的最优化解。不支持R 3.1.1的版本。
本文将介绍mcga包和genalg包的遗传算法的使用。
3.1 mcga包
我们使用mcga包的mcga()函数,可以实现多变量的遗传算法。
mcga包是一个遗传算法快速的工具包,主要解决实值优化的问题。它使用的变量值表示基因序列,而不是字节码,因此不需要编解码的处理。mcga实现了遗传算法的交配和突变的操作,并且可以进行大范围和高精度的搜索空间的计算,算法的主要缺点是使用了256位的一元字母表。
首先,安装mcga包。 > install.packages("mcga") > library(mcga)
查看一下mcga()函数的定义。 > mcga function (popsize, chsize, crossprob = 1, mutateprob = 0.01, elitism = 1, minval, maxval, maxiter = 10, evalFunc)
参数说明: popsize,个体数量,即染色体数目 chsize,基因数量,限参数的数量 crossprob,交配概率,默认为1.0 mutateprob,突变概率,默认为0.01 elitism,精英数量,直接复制到下一代的染色体数目,默认为1 minval,随机生成初始种群的下边界值 maxval,随机生成初始种群的上边界值 maxiter,繁殖次数,即循环次数,默认为10 evalFunc,适应度函数,用于给个体进行评价
接下来,我们给定一个优化的问题,通过mcga()函数,计算最优化的解。
题目1 :设fx=(x1-5)^2 + (x2-55)^2 +(x3-555)^2 +(x4-5555)^2 +(x5-55555)^2,计算fx的最小值,其中x1,x2,x3,x4,x5为5个不同的变量。
从直观上看,如果想得到fx的最小值,其实当x1=5,x2=55,x3=555,x4=5555,x5=55555时,fx=0为最小值。如果使用穷举法,通过循环的方法找到这5个变量,估计会很费时的,我就不做测试了。下面我们看一下遗传算法的运行情况。 # 定义适应度函数 > f<-function(x){} # 代码省略 # 运行遗传算法 > m <- mcga( popsize=200, + chsize=5, + minval=0.0, + maxval=999999, + maxiter=2500, + crossprob=1.0, + mutateprob=0.01, + evalFunc=f) # 最优化的个体结果 > print(m$population[1,]) [1] 5.000317 54.997099 554.999873 5555.003120 55554.218695 # 执行时间 > m$costs[1] [1] 3.6104556
我们得到的最优化的结果为x1=5.000317, x2=54.997099, x3=554.999873, x4=5555.003120, x5=55554.218695,和我们预期的结果非常接近,而且耗时只有3.6秒。这个结果是非常令人满意地,不是么!如果使用穷举法,时间复杂度为O(n^5),估计没有5分钟肯定算不出来。
当然,算法执行时间和精度,都是通过参数进行配置的。如果增大个体数目或循环次数,一方面会增加算法的计算时间,另一方面结果也可能变得更精准。所以,在实际的使用过程中,需要根据一定的经验调整这几个参数。
3.2 genalg包
我们使用genalg包的rbga()函数,也可以实现多变量的遗传算法。
genalg包不仅实现了遗传算法,还提供了遗传算法的 数据可视化 ,给用户更直观的角度理解算法。默认图显示的最小和平均评价值,表示遗传算法的计算进度。直方图显出了基因选择的频率,即基因在当前个体中被选择的次数。参数图表示评价函数和变量值,非常方便地看到评价函数和变量值的相关关系。
首先,安装genalg包。 > install.packages("genalg") > library(genalg)
查看一下rbga()函数的定义。 > rbga(stringMin=c(), stringMax=c(), suggestions=NULL, popSize=200, iters=100, mutationChance=NA, elitism=NA, monitorFunc=NULL, evalFunc=NULL, showSettings=FALSE, verbose=FALSE)
参数说明: stringMin,设置每个基因的最小值 stringMax,设置每个基因的最大值 suggestions,建议染色体的可选列表 popSize,个体数量,即染色体数目,默认为200 iters,迭代次数,默认为100 mutationChance,突变机会,默认为1/(size+1),它影响收敛速度和搜索空间的探测,低机率导致更快收敛,高机率增加了搜索空间的跨度。 elitism,精英数量,默认为20%,直接复制到下一代的染色体数目 monitorFunc,监控函数,每产生一代后运行 evalFunc,适应度函数,用于给个体进行评价 showSettings,打印设置,默认为false verbose,打印算法运行日志,默认为false
接下来,我们给定一个优化的问题,通过rbga()函数,计算最优化的解。
题目2 :设fx=abs(x1-sqrt(exp(1)))+abs(x2-log(pi)),计算fx的最小值,其中x1,x2为2个不同的变量。
从直观上看,如果想得到fx的最小值,其实当x1=sqrt(exp(1))=1.648721, x2=log(pi)=1.14473时,fx=0为最小值。同样地,如果使用穷举法,通过循环的方法找到这2个变量,估计会很费时的,我也不做测试了。下面我们看一下rbga()函数的遗传算法的运行情况。 # 定义适应度函数 > f<-function(x){} #代码省略 # 定义监控函数 > monitor <- function(obj){} #代码省略 # 运行遗传算法 > m2 = rbga(c(1,1), + c(3,3), + popSize=100, + iters=1000, + evalFunc=f, + mutationChance=0.01, + verbose=TRUE, + monitorFunc=monitor + ) Testing the sanity of parameters... Not showing GA settings... Starting with random values in the given domains... Starting iteration 1 Calucating evaluation values... ....................................................... done. Sending current state to rgba.monitor()... Creating next generation... sorting results... applying elitism... applying crossover... applying mutations... 2 mutations applied Starting iteration 2 Calucating evaluation values... ...................... done. Sending current state to rgba.monitor()... Creating next generation... sorting results... applying elitism... applying crossover... applying mutations... 4 mutations applied Starting iteration 3 Calucating evaluation values... ....................... done. # 省略输出...
程序运行截图
需要注意的是,程序在要命令行界面运行,如果在RStudio中运行,会出现下面的错误提示。 Creating next generation... sorting results... applying elitism... applying crossover... applying mutations... 1 mutations applied Starting iteration 10 Calucating evaluation values... .......................... done. Sending current state to rgba.monitor()... Error in get(name, envir = asNamespace(pkg), inherits = FALSE) : object 'rversion' not found Graphics error: Error in get(name, envir = asNamespace(pkg), inherits = FALSE) : object 'rversion' not found
我们迭代1000次后,查看计算结果。 # 计算结果 > m2$population[1,] [1] 1.650571 1.145784
我们得到的最优化的结果为x1=1.650571, x2=1.145784,非常接近最终的结果。另外,我们可以通过genalg包的可视化功能,看到迭代过程的每次的计算结果。下面截图分为对应1次迭代,10次迭代,200次迭代和1000次迭代的计算结果。从图中可以看出,随着迭代次数的增加,优选出的结果集变得越来越少,而且越来越精准。
默认图输出,用于描述遗传过程的进展,X轴为迭代次数,Y轴评价值,评价值越接近于0越好。在1000迭代1000次后,基本找到了精确的结果。 > plot(m2)
直方图输出,用于描述对染色体的基因选择频率,即一个基因在染色体中的当前人口被选择的次数。当x1在1.65区域时,被选择超过80次;当x2在1.146区域时,被选择超过了80次。通过直方图,我们可以理解为更优秀的基因被留给了后代。 > plot(m2,type='hist')
参数图输出,用于描述评价函数和变量的值的相关关系。对于x1,评价值越小,变量值越准确,但相关关系不明显。对于x2,看不出相关关系。 > plot(m2,type='vars')
对比mcga包和genalg包,mcga包适合计算大范围取值空间的最优解,而用genalg包对于大范围取值空间的计算就表现就不太好了。从另一个方面讲,genalg包提供了可视化工具,可以让我们直观的看遗传算法的收敛过程,对于算法的理解和调优是非常有帮助的。
在掌握了遗传算法后,我们就可以快度地处理一些优化的问题了,比如接下来我会介绍的金融回测系统的参数寻优方案。让我们远离穷举法,珍惜CPU的每一秒时间。
参考文章
http://zh.wikipedia.org/zh/遗传算法
算法为王系列文章 ,涵盖了计算机算法, 数据挖掘 (机器学习)算法,统计算法,金融算法等的多种跨学科算法组合。在 大数据 时代的背景下,算法已经成为了金字塔顶的明星。一个好的算法可以创造一个伟大帝国,就像Google。
算法为王的时代正式到来…. 作者:张丹(Conan), 程序员Java,R,PHP,Javascript;weibo:@Conan_Z;blog: http://blog.fens.me; email: bsspirit@gmail.com
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-07-06 22:15:00
1、EXACT:
描述: 字符串的比较
语法结构:
=EXACT(text1,text2)
解释:=EXACT(文本字符串1,文本字符串2),对比两个文本字符串是否相同。
用法举例:
= EXACT(“自行车”,”汽车”),结果等于FALSE
= EXACT(“汽车”,”汽车”),结果等于TRUE
2、FIND:
描述: 用一个或几个字符(find_text),在一个字符串(within_text)中查找, 返回所在的位置数,
语法结构:
= FIND(find_text,within_text,start_num)
解释:
= FIND(查找的字符,字符串 ,起始数)
例如:用”国”字,在”中国银行”这个字符串中查找,从第一个字符开始查找。返回的结果是2。
用法举例:
= FIND(”国”, ”中国银行”,1),结果等于2
=FIND(“M”,”Miriam McGovern”) 等于 1
=FIND(“m”,”Miriam McGovern”) 等于 6,本函数区分大小写
=FIND(“M”,”Miriam McGovern”,3) 等于 8
3、LEFT:
描述: 从左边提取字符的文本串
语法结构 :
=LEFT(text,num_chars)
解释:
=LEFT(包含要提取字符的文本串,提取的字符数)
用法举例:
= LEFT (“大亚湾核电站”,3),结果等于:大亚湾
或= LEFT (A1,3)
A1单元格中是:大亚湾核电站,结果等于:大亚湾
4、RIGHT:
描述: 从右边提取字符的文本串
语法结构:
=RIGHT(text,num_chars)
解释:
=RIGHT(包含要提取字符的文本串,提取的字符数)
用法举例:
= RIGHT (“大亚湾核电站”,3),结果等于:核电站
或= RIGHT (A1,3)
A1单元格中是“大亚湾核电站”,结果等于:核电站
5、MID:
描述: 从左边指定位置开始的,截取指定位数的文本串
语法结构:
MID(text,start_num,num_chars)
解释:
=MID(文本字符串,开始截取的位置,截取的数量)
用法举例:
= MID (“大亚湾核电站”,4,2),结果等于:核电
或= MID (A1,4,2)
A1单元格中是“大亚湾核电站”,结果等于:核电
6、LEN:
描述: 返回文本串的字符数
语法结构:
= LEN(text)
解释:
= LEN(字符)。测量字符的数量,数字和汉字都按1计算。
用法举例:
= LEN(2587),结果等于4;
= LEN(“财会课”),结果等于3;
7、LENB:
描述: 返回文本串的字节数
语法结构 := LENB(text)
解释: = LEN(字符)。测量字节的数量,数字和字母都按1计算,汉字按照2计算。
用法举例:
= LENB(2587),结果等于4;
= LENB(“函数课”),结果等于6;
8、LOWER:
描述 :将一个文字串中的所有大写字母转换为小写字母
语法结构 :=LOWER(text)
解释: =LOWER(字符串)。把大写字母转化成小写字母
用法举例:
=LOWER(“AOIEUTVPO IUTPOIU”)
结果等于aoieutvpo iutpoiu
9、REPT :
描述 :按照给定的次数重复显示文本
语法结构 :=REPT(text,number_times)
解释 :=REPT(一个或多个字符串,重复的数量)
用法举例 :
= REPT(“萌萌哒”,3)
结果等于:萌萌哒萌萌哒萌萌哒
10、SUBSTITUTE:
描述: 在某一文字串中替换指定的文本。
语法结构 :=SUBSTITUTE(text, old_text, new_text, instance_num)
解释:
=SUBSTITUTE(一串待处理的字符, 旧文本, 新文本,数字-替换第几次出现的一个数字)
用法举例一 :
=SUBSTITUTE(“上海人热爱上海这座城市”,”上海”,”深圳”,1)
=深圳人热爱上海这座城市
用法举例二:
=SUBSTITUTE(“上海人热爱上海这座城市”,”上海”,”深圳”,2)
=上海人热爱深圳这座城市
11、TRIM(text): 去除文本间多余的空格
12、TEXT:
描述: 将一数值转换为按指定数字格式表示的文本
语法结构: =TEXT(value,format_text)
解释: =TEXT(数字,格式代码)
用法举例:
=TEXT(2.715, “$0.00”)
等于 “$2.72″;
=TEXT(“4/15/91”, “mmmm dd, yyyy”)
等于 “April 15, 1991”
如果A1输入日期:2016-06-8
=TEXT(A1,”yyyy年mm月dd日”)
结果等于 2016年06月08日
=TEXT(A1,”yyyy年m月d日”)
结果等于 2016年6月8日 来源: Excel 之家ExcelHome
作者:郭辉
新浪微博 @EXCEL财务达人,ExcelHome论坛版主,《财会玩转Excel》课程讲师,图书作者。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-07-06 21:25:00
没什么是永恒的——包括编程语言。很多看起来可能是将来的佼佼者,到头来可能被人们遗忘。无论是因为不可抗拒的原因,还是因为自身发展的原因。
Python 时下正在“最热门的编程语言榜”上春风得意,看起来将会成为一门不朽的语言。但是现在,很多其他语言也逐渐显现出Python的一些优点:编程方便,对数学和科学计算拥有强大的处理能力,庞大的第三方库。
下面是Python的一些潜在的挑战者,并讨论了Python是如何保住它第一的席位的。
Swift
它是什么: 苹果公司的一种编程语言,主要用于原生的iOS开发,但是现在已经 开源 ,并有向服务器端发展的倾向。
它的优点: 使用Swift编程是一种毫无障碍的体验!用起来相比于编译型语言(比如,它间接的前任Objective-C)更像是一种脚本语言(比如Python)。Swift的决定性的优点是它的速度——它是由LLVM编译框架编译成机器码的,所以它具备真正的多线程。Python 还在这方面挣扎 。
如果说开发速度要比执行速度重要的话,Python在方面更有优势。但是Swift有XCode IDE的“Playground”模式。
Python的优点: 一方面,相比于Python来说,Swift是一门新型的编程语言,Python有所有成熟的语言所具备的有点——大量的用户基础,大量的库,成熟的多平台支持。Swift现在甚至还不能支持Windows(如果不算上 第三方库 的话),虽然这是将来必定会实现的特性。Swift还会产生对苹果工具链的依赖(比如Xcode),而Python的依赖就少的很。
Go
**它是什么:**Google的“表现力强、简洁、干净、高效”的语言,从Docker及其相关项目到InfluxDB数据库,Ethereum坏链系统和Canonical的Snappy包管理工具都是用Go写成的。
它的优势: 和Swift一样,Go语言也会编译成平台相关的机器码,所以它不仅可以在多任务方面比Python快很多,还还可以在运行时不像Python那样生成额外的目标。Go代码编译速度非常快,开发速度也很快,所以它更像一门解释性的语言。
Python的优势: 虽然Go不像Swift那么新——它在2009年发布——Python在用户和库的数量方面还是占有优势。此外,Go的语法和错误处理方式和Python相去甚远。所以,现在Python用户很难转移到Go,但是不会阻止新用户选择这样一门语言。现阶段,Python的安装器让使用和构建Python应用非常简单——更不必说像Linux这样的系统,Python已经成为了标准。
Julia
它是什么: 在2012年发布,是面向 技术应用 的一门编程语言,例如 数据分析 和线性代数。
它的优点: Python一个很大的用处是数学和科学应用——多亏了Numpy这样的库和交互式的IPython编辑程序。Julia的目标用户也是同样的群体,和Go、Swift一样,它也比Python快。它还有一个正在不断扩展的 包 ,不仅仅包括科学和数学计算的应用,还有很多Python的功能,比如从云端提供商那里取得数据。
Python的优点: Julia有和Python类似的库,但是Python并不满足现状,还在马不停蹄地优化 语言的核心 和 开发环境 。Python的速度并非 一定不及Julia (或者其他Python的竞争者),只要针对不同的工作选择恰当的库完成,速度还是客观的。
Julia语言本身还存在一些争议。比如,Julia的数组下标是从1开始的,而不是0——这不仅和Python比是一个缺点,很其他语言比起来也是。(很多第三方的包索引也是从1开始,但是仍让人很不习惯。)
R
它是什么: 无论是就开发环境还是语言本身来说,这都是一个很老的语言了。它专为统计学设计。
它的优点: R有很多Python的优点,比如 有丰富的第三方库 等。但是R是专门 为统计学而生 的,并且在后面的发展中依然专注于此。Python也可以做数学和统计学方面的计算,但是在这方面被 R语言 完全碾压。
R语言还引起了很多大公司的注意,微软 收购了一个R语言标准实现的开发商 开服务它的云端数据。Hewlett-Packard开发了一种分布式的R语言计算产品,可以同时跨多个节点运行。这个产品在将来可以把Python完全挤出这个领域。
Python的优点: 有时候,作为一个多用途的语言也有它的好处。R语言的功能 局限 在统计学计算方面。由于开发环境的限制,构建R语言应用也很麻烦,使用Python创建应用就很简单。而且通过像 RPy2 这样的包可以轻松地将R语言和Python联合起来。
微软对R语言的投入很多,但是同时微软也 对Python提供了很多支持 ,所以这两种语言都能在Azure上工作的很好。 原文: 4 languages poised to out-Python Python
作者: Serdar Yegulalp
翻译: 赖信涛 责编: 钱曙光
本文链接:http://geek.csdn.net/news/detail/85202
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-06-30 22:48:00
在这个R和Python主宰数据科学的时代,我们来看一下另一个叫做 Weka 的数据科学工具。Weka已经出现了一段时间,是在Waitako大学为了研究的目的而内部发展的。简单的学习曲线使得Weka具有尝试的价值。
对于一个很久没有编码的人来说,Weka和它的图形用户界面提供了一个最简单的过渡到数据科学的世界。因为是由JAVA编写的,有JAVA经验的人也把它称作他们编码的图书馆。
个人来讲,当我在Waitako大学上课时第一次接触数据科学。这门课是一个很好的介绍,并且给了我一个轻松的过渡到数据科学的机会。后来当我不得不解决更大的问题时,我转而使用R。所以我强烈推荐那些想要进入数据的世界的人把Weka当作一个入门学习工具。
下面是学习Weka的路线,它会帮助你以更好更具体的方式来理解这些概念。
1、什么是Weka,为什么要使用它?
根据Wikipedia:“Weka是对于解决 数据挖掘 任务的 机器学习 算法的一个集合。这些算法技能直接被应用到一个数据集,也可以从你自己的JAVA编码被调用。Weka是包含数据预处理、分类、回归、收集、关联规则和形象化的工具”。
你可能想要看一下这个来自Brandon Weinberg的视频(https://www.youtube.com/watchv=m7kpIBGEdkI)。这个视频会给予你对于这个神奇的工具相当大的洞察力。通过这个视频你可能不会理解所有的东西,但也会懂得如何学习这些东西。
2、使用机器
既然我们已经熟悉了Weka,就可以进入下一步了。关于这个工具更多的了解和它成功背后的人们,你可以看一下这个关于Project Weka的网页(http://www.cs.waikato.ac.nz/ml/index.html)。甚至,你也可以下载这个软件,从这个链接(http://www.cs.waikato.ac.nz/ml/weka/downloading.html)选择适合你系统的最新版本。
3、学习Weka的基础
开始学习Weka最好的方法是使用由Waikato大学提供的大规模在线开放课程(MOOC)。Weka的数据挖掘是一个评分很高的课程,但它到现在还不可获得。然而,不用担心,在这种情形下你可以在YouTube(https://www.youtube.com/user/WekaMOOC)上获得这些课程的视频。这个课程的官方链接点击这里(https://weka.waikato.ac.nz/explorer)。需要用到的数据集可以从这个链接(http://www.cs.waikato.ac.nz/ml/weka/datasets.html)下载。这篇文章里有数据集的进一步链接。Weka以ARFF的格式存储数据。以防数据不是ARFF格式,通过这个视频(https://www.youtube.com/watchv=tS6qFxNDrMc)的帮助,你可以把它从CSV格式转换成ARFF格式。
4、数据集
我们已经对这个课程提供的数据集进行了操作,接下来尝试对由Kaggle(https://www.kaggle.com/c/titanic-gettingStarted)提供的新数据进行操作。因为数据格式可能是CSV,所以为了我们能在Weka界面上阅读,要把它转化为ARFF格式。在做完这些步骤后,我们已经得到了足够的技能来使用Weka图形用户界面来操作和分析数据集。访问MOOC链接的人可能已经看见“Weka数据挖掘”这门课了。
5、Weka数据挖掘
在这里,使用这个软件的一些更高级的功能已经被讨论了。它通过使用以前的课程来建立经验,这是一个先决条件。
YouTube系列:
除了这门课程,你可能想要从Rushdi Shams(https://www.youtube.com/playlistlist=PLJbE6j2EG1pZnBhOg3_Rb63WLCprtyJag)看一下这个演讲系列。一共有38个演讲。在最初的两三个视频里,如果你发现和以前的课程有些相似的话你可以跳跃一下看。这些课程被建立在各种各样的技巧之上,它们是以前提供系列的的补充。
Weka新闻:
在Reddit上有一些关于Weka(http://www.reddit.com/searchq=Weka+)的有趣的讨论。仔细检查一下上面的链接、收集关于Weka的新闻和它是怎样被他人所使用的做法是明智的。这可以给Weka之后下一个可能的步骤足够的观点。
6、Weka 命令行
下一步:截至目前,我们已经依赖于Weka,并使用Weka图形用户界面。截至目前,课程依赖于这个图形用户界面是因为那些有JAVA工程经验的人能够依赖并使用Weka从JAVA内部编码。这是有用的,因为尝试和解决 大数据 集脚本帮助使你的工作自动化。而且,JAVA使用Hadoop框架,所以Weka也能被用于大数据。你能够了解更多在大数据中使用Weka的案例(http://www.cs.waikato.ac.nz/ml/weka/bigdata.html)。
对Weka感兴趣的人可以尝试由Dr Noureddin Sadawi(https://www.youtube.com/user/DrNoureddinSadawi)主讲的演讲系列。你可能也想要检查Weka的应用编程接口教程列表(https://www.youtube.com/playlistlist=PLea0WJq13cnBVfsPVNyRAus2NK-KhCuzJ)。重点是在JAVA编码内部获得Weka的应用编程接口,它重复了上述的一些概念但是我们使用Weka利用一个命令行界面。
7、Word2Vec 挑战
在对Weka已经有了一个很好的了解之后,我们来看一个情感分析案例。有一个小的数据集,它的大小大约25MB。能通过使用Weka图形用户界面来处理。对于大于40MB的数据集,我们需要使用命令行方法。这个讨论(https://www.reddit.com/r/MachineLearning/comments/13w6yi/text_mining_with_weka_java_api/)可能对你是有用的。
这个学习路径是Abhinav Unnam提供的,他去年在我们这实习。Abhinav现在正读IIT Roorkee的双学位课程,IIT Roorkee是最好的工程学院之一。他选择Weka开始他的机器学习旅程并且很享受使用R参加Kaggle竞赛。 编译人员: 数据分析网 翻译小组成员—于海燕,一名数学系研究生,正在学习SPSS、R语言等。
本文由 翻译小组 翻译发布,英文链接:,转载或内容合作请联系我们,未经允许谢绝转载,本文链接:https://www.afenxi.com/20285.html 。
数据分析
2016-06-30 10:20:00
此文将从销售漏斗管理分析的业务背景、 Excel 平台上的实施方式以及销售漏斗管理分析仪的实现过程三方面内容进行说明,希望帮助有此类业务分析需求的朋友拓展思路。
业务背景
销售漏斗是科学反映商机状态以及销售效率的一种重要的销售管理模型,此模型应用广泛,适用于多种不同类型的销售体系,其中尤其适用于关系型销售企业,也就是适用于需要长期维护客户关系的企业。销售漏斗指的是将从发现商业机会开始到最终与客户成交为止的销售过程按照不同的销售进度分为几个不同的销售阶段,每个销售阶段代表一个已经达成的某种销售进程。在销售漏斗中销售阶段的数量及设定方法依据企业的经营方式不同而不同。
比如,下图是某企业在销售管理业务中使用的销售漏斗模型。
此销售漏斗将从发现潜在商机到最后与客户成交的 整个销售流程分为七种不同的销售阶段,商机数由上至下越来越少,但与此同时,商机的成功率却由上至下越来越高, 就好像一个生活中使用的漏斗,当我们为漏斗注满水后,处在漏斗上部的水量最多,而越往漏斗下部则水量越少,但真正能供我们使用的只有从漏斗最底部漏出的少量的水。
销售漏斗的管理目的就是让每一个销售阶段的商机都尽可能的顺利过渡到下一个销售阶段,只有将每一个销售阶段的商机管理好才能最终实现从销售漏斗最底层获得的成交机会最多,也就是达成企业销售收入最大化的目的。销售漏斗管理的本质是企业经营方面的风险管理,它直接关系企业的盈亏状况,是企业销售环节的生命线。
了解了销售漏斗管理的目的后,我们再来了解一下销售漏斗管理分析的目的。 针对销售漏斗模型的分析目的在于提前发现各销售阶段中潜在的商机风险,并通过分析结果指导销售管理人员及时做出销售策略上的调整 ,以期达到销售资源最优化、销售效率与商机转换率最大化的目的。销售管理分析在整个销售运营业务的多个环节中都发挥着重要作用,请参照下图了解销售管理分析所涉及到的销售运营业务环节(粉色圆圈标出的销售运营环节)。
想要做好销售漏斗管理分析我们需要在以下几个分析环节中分别解决一些针对该环节的关键问题: 分析环节1:数据获取
销售漏斗管理业务涉及的相关数据往往来自于多个不同的数据源(在下文中将把不同的数据源称为不同的数据维度),企业销售业务越复杂,参与协作的部门及关联企业就越多,所需的业务维度也就越多,在数据获取环节中,我们需要一种能够快速与不同外部数据源创建链接并保证当这些数据源的数据发生变化时能够随时与之同步的数据获取方式,这种方式应能够同时保证获取数据的时效性与准确性。除此之外,因为需要从不同数据源导入大量数据,所以需要具备能够获取百万行甚至千万行量级数据的能力。在Excel平台中,应用Power Query免费插件可以满足上述数据获取需求。
Power Query操作界面 分析环节2:数据处理
如果想要洞察到涉及多个不同数据维度的商机风险,就需要我们将获取到的多种不同维度的数据汇总到同一个多维数据模型中,并以此模型作为分析环境以便开展接下来的 数据分析 工作。除了创建多维数据模型外,我们还需要一种类似数据库一样的“表”数据批量处理方式,这种方式应以字段而非单元格作为数据的基本处理单位,应用此方式能够帮助我们实现灵活、高效且迅捷地处理海量数据的分析需求。在Excel平台上,应用Power Pivot免费插件可以满足创建多维数据模型的需求,应用Power Query免费插件可以满足灵活、高效地批量处理海量数据的分析需求。
Power Pivot操作界面搭建多维数据模型 分析环节3:数据分析
在此分析环节中,我们需要紧密结合业务需求将透视分析、多维分析运用到极致,从多维环境下深度透视关键指标,以完成及时洞察风险商机的目的。此时Excel提供的基本数据透视功能已经完全无法满足我们的业务需求,所以需要运用到更为强力的透视分析工具Power Pivot来实现上述两项分析需求。
应用Power Pivot实现关键指标透视分析 分析环节4:结果展现
在此分析环节中,我们需要应用到Excel基础制图以上的功能,根据业务分析实际需要,制作具有针对性的简洁、直观的自定义图表以及具备交互效果的动态图表。必要情况下,我们还要用到少量的VBA宏程序来解决实际问题。
用具备升维效果的折线图与饼图的嵌套图表来展现各时点商机的构成变化情况用动态嵌套柱形图来展现销售阶段的周变化情况
实施方式
在满足以上所有分析需求后,我们就可以在Excel平台上制作会讲故事的销售管理分析仪了,制作分析仪的目的在于有条理的、简单易懂地告诉销售管理者你手中的商机处在何种情况下、它们可能正面临何种问题、需要管理者及时做出何种响应来回避风险,达成销售目标。其实对于销售管理者而言,面对现有商机可能无法完成销售业绩的问题一般只能做出两大类举措来改善现状。第一类是命令手下销售人员找新的商机进来提高商机总量,下这种命令一般是出现了商机总量不足的情况,即便现有商机都在有条不紊的向前推进,在销售周期内也还是很难达到销售目标值时便只能通过补充新的商机进来提高商机总量的方式来应对了。
还有一类举措是命令手下销售人员尽可能快地将手头商机向前推进,下达这种命令主要是因为虽然商机总量足够大,但其中很多商机在低销售阶段停留过久,出现了商机无法在销售周期内完成的风险。在这种情况下,如果做出补充新商机的错误判断,就会更加分散销售资源,降低销售效率,造成本来能在销售周期内完成的商机无法完成的严重后果。摆在销售管理人员面前的就像是一道二选一的选择题,正确率是50%,但一旦错误,就会造成无法挽回的毁灭性后果。
所以 销售管理分析仪正是帮助销售管理者提高选择题正确率而存在的 ,众多指标都只在为销售管理者标明一条宽广且正确的销售策略之路。
在使用销售管理分析仪之前,很多销售管理分析报表是这样的:这份报表只是将关键指标进行了罗列,虽然用不同颜色标注了重点值,但离一目了然的发现问题,并洞察问题原因的目的还相去甚远。为了解决这样的业务痛点,我将原始数据进行了再加工整理,于是便有了以下的销售管理分析仪:这份分析仪设计着眼点在故事性上,我试图用自上而下的图表排列顺序来展现由大到小的业务问题,当阅读者从上至下将所有图表读下来后,在脑中可以形成一个由现象到原因、由整体到细节的完整故事。故事脉络清晰完整,读完后阅读者便能快速理解其内容并做出响应。那么这个故事究竟是怎样的呢,接下来让我们逐章阅读一下: 序章:仪表盘展现总体趋势问题
通过分析仪上方的六张仪表盘,可以快速发现在大趋势中哪类销售角色管理的商机出现问题最大。在很多复合型业务企业,销售任务不是由单一角色完成的,而是由不同维度的不同销售角色共同完成的。
比如地域维度的销售人员主要负责按地区划分的销售片区,产品维度的销售人员主要负责自己手头负责的单类产品,而行业领域维度的销售人员主要负责自己精通的行业或者领域中的企业客户。然后阶段4以上和阶段5以上的商机总金额一般是最为关注的指标。在案例中阶段4为“明确”,即已经明确了客户的购买意向,而阶段5为投入,既公司已经决定为了能够成功与客户成交,要投入一定的销售成本了。
在案例中,销售阶段4以上的商机总金额需达到销售目标值得1.2倍以上,而销售5以上的销售目标值需达到销售目标值的1.5倍以上,才能预测在销售周期内有可能完成销售目标。所以六个仪表盘就分别代表了在不同销售维度中销售阶段4以及销售阶段5以上商机总金额与目标值之间的占比情况。我们从中可以迅速发现最有问题的销售维度在哪里。
发现大问题后,故事就算拉开了序章,接下来就是要找出问题的原因,制定解决方案环节了。在故事序章中应用到的Excel技巧为仪表盘的制作技巧及动态图表展现技巧。仪表盘是用环形图与饼图嵌套而来,动态图表是由下拉列表控件与offset公式组合应用实现的。 开展:了解各阶段商机占比
故事的开展是由表现各销售阶段商机占比情况的瀑布图展现的,通过瀑布图我们可以了解到低阶段商机与高阶段商机的占比情况,以及商机总量的数值情况。如果低阶段商机多,说明商机向高阶段转变乏力,需要销售人员积极推进,如果商机总值低,则需要补充新商机进来。此阶段的瀑布图是通过excel基本函数rept得来的。 高潮:了解单个销售阶段商机构成
故事的高潮部分是用一个动态的组合柱形图展现的。通过此图我们可以清楚地了解到需要重点关注的销售阶段是由上周的哪些销售阶段转变而来的。比如上图反映的就是当周“投入”阶段的商机就是由上周“潜在”阶段贡献81、“明确”阶段贡献91……组合而来的。了解了商机的周变化情况,就可以判断销售人员对手头商机的推进力度情况,为是否该做出让销售人员积极推动商机的决策提供了更深层的数据依据。 尾声:了解细节
故事的尾声结束在对不同销售维度的细节展现上,通过前边的内容,精明的销售管理人员已经可以大致做出大方向上的决策判断了,再通过阅读尾声的细节图表信息,销售人员便可以对某个具体销售人员做出更细致的销售指导,以便大的销售策略能够得到顺利的开展。尾声部分的内容是通过少量VBA程序、切片器、Power Pivot数据透视图表、KPI指标设定等功能实现的。
到这里一个会讲故事的销售管理分析仪就做完了,在前台展现界面的后台是应用Power Query与Power Pivot加工处理过的数据模型,它们提供了前台分析所需的底层环境,它们还保证了每次外部数据更新后分析仪中使用的数据都能得到快速地同步更新。在整个分析仪的制作过程中分别应用到了Power Query、Power Pivot、Excel 基本功能、动态及自定义图标制作技巧、简单VBA程序等相关功能。有兴趣的朋友可以尝试结合自己业务需要制作相应的有商业洞察力的 商业智能 分析仪,帮助企业创收的同时也提高自己的个人价值。
另外,也欢迎关注对此内容感兴趣的朋友加我QQ或微信共同交流进步。作者简介:李奇(QQ:2105780995 微信:Dio20009)
现任德勤中国数据分析团队高级咨询顾问,有5年在日工作经验及4年国内工作经验。在日时曾担任软件工程师及日本再就业支援中心的中文及Excel讲师。归国后曾先后在IBM中国担任销售管理团队数据分析项目组长及德勤北京所的数据分析高级咨询顾问,专精于企业数据分析、制定商业智能业务解决方案、软件开发及Excel培训等。 来源:电子表格应用大会、CDA数据分析师(本文已获得授权)
作者:李奇
本文为专栏文章,来自:CDA数据分析师,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/20471.html 。
数据分析
2016-06-29 15:00:00
作者 Brian Ray 编译  Mika
对于想入门 数据科学 的新手来说,选择学 Python 还是 R语言 是一个难题,本文对两种语言进行了比较,希望能帮助你做出选择。
我是德勤的数据科学家主管,多年来我一直在使用Python和R语言,并且与Python社区密切合作了15年。本文是我对这两种语言的一些个人看法。
第三种选择
针对这个问题,Studio的首席数据科学家Htley Wickham认为,比起在二者中选其一,更好的选择是让两种语言合作。因此,这也是我提到的第三种选择,我在文本最后部分会探讨。
如何比较R和Python
对于这两种语言,有以下几点值得进行比较:
· 历史:
R和Python的发展历史明显不同,同时有交错的部分。
· 用户群体:
包含许多复杂的社会学人类学因素。
· 性能:
详细比较以及为何难以比较。
· 第三方支持:
模块、代码库、可视化、存储库、组织和开发环境。
· 用例:
根据具体任务和工作类型有不同的选择。
· 是否能同时使用:
在Python中使用R,在R中使用Python。
· 预测:
内部测试。
· 企业和个人偏好:
揭晓最终答案。
历史
简史:
ABC语言 – > Python 问世(1989年由Guido van Rossum创立) – > Python 2(2000年) – > Python 3(2008年)
Fortan语言 – > S语言(贝尔实验室) – > R语言问世(1991年由Ross Ihaka和Robert Gentleman创立) – > R 1.0.0(2000年) – > R 3.0.2(2013年)
用户群体
在比较Python与R的使用群体时,要注意:
只有50%的Python用户在同时使用R。
假设使用R语言的程序员都用R进行相关“科学和数字”研究。可以确定无论程序员的水平如何,这种统计分布都是真实。
这里回到第二个问题,有哪些用户群体。整个科学和数字社区包含几个子群体,当中存在一些重叠。
使用Python或R语言的子群体:
· 深度学习
· 机器学习
· 高级分析
· 预测分析
· 统计
· 探索和 数据分析
· 学术科研
· 大量计算研究领域
虽然每个领域几乎都服务于特定群体,但在统计和探索等方面,使用R语言更为普遍。在不久之前进行数据探索时,比起Python,R语言花的时间更少,而且使用Python还需要花时间进行安装。
这一切都被称为Jupyter Notebooks和Anaconda的颠覆性技术所改变。
Jupyter Notebook :增加了在浏览器中编写Python和R代码的能力;
Anaconda :能够轻松安装和管理Python和R。
现在,你可以在友好的环境中启动和运行Python或R,提供开箱即用的报告和分析,这两项技术消除了完成任务和选择喜欢语言间的障碍。Python现在能以独立于平台的方式打包,并且更快地提供快速简单的分析。
社区中影响语言选择的另一个因素是“开源”。不仅仅是开源的库,还有协作社区对开源的影响。讽刺的是,Tensorflow和GNU Scientific Library等开源软件(分别是Apache和GPL)都与Python和R绑定。虽然使用R语言的用户很多,但使用Python的用户中有很多纯粹的Python支持者。另一方面,更多的企业使用R语言,特别是那些有统计学背景的。
最后,关于社区和协作,Github对Python的支持更多。如果看到最近热门的Python包,会发现Tensorflow等项目有超过3.5万的用户收藏。但看到R的热门软件包,Shiny、Stan等的收藏量则低于2千。
性能
这方面不容易进行比较。
原因是需要测试的指标和情况太多。很难在任何一个特定硬件上测试。有些操作通过其中一种语言优化,而不是另一种。
循环
在此之前让我们想想,如何比较Python与R。你真的想在R语言写很多循环吗?毕竟这两种语言的设计意图不太相同。 { "cells": [  {   "cell_type": "code",   "execution_count": 1,   "metadata": {},   "outputs": [],   "source": [    "import numpy as np\n",    "%load_ext rpy2.ipython"   ]  },  {   "cell_type": "code",   "execution_count": 2,   "metadata": {},   "outputs": [],   "source": [    "def do_loop(u1):\n",    "\n",    "    # Initialize `usq`\n",    "    usq = {}\n",    "\n",    "    for i in range(100):\n",    "      # i-th element of `u1` squared into `i`-th position of `usq`\n",    "      usq[i] = u1[i] * u1[i]\n"   ]  },  {   "cell_type": "code",   "execution_count": 3,   "metadata": {},   "outputs": [],   "source": [    "%%R\n",    "do_loop <- function(u1) {\n",    "    \n",    "    # Initialize `usq`\n",    "    usq <- 0\n",    "\n",    "    for(i in 1:100) {\n",    "      # i-th element of `u1` squared into `i`-th position of `usq`\n",    "      usq[i] <- u1[i]*u1[i]\n",    "    }\n",    "\n",    "}"   ]  },  {   "cell_type": "code",   "execution_count": 4,   "metadata": {},   "outputs": [    {     "name": "stdout",     "output_type": "stream",     "text": [      "1.58 ms ± 42.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"     ]    }   ],   "source": [    "%%timeit -n 1000\n",    "%%R\n",    "u1 <- rnorm(100)\n",    "do_loop(u1)"   ]  },  {   "cell_type": "code",   "execution_count": 5,   "metadata": {},   "outputs": [    {     "name": "stdout",     "output_type": "stream",     "text": [      "36.9 µs ± 5.99 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"     ]    }   ],   "source": [    "%%timeit -n 1000\n",    "u1  = np.random.randn(100)\n",    "do_loop(u1)"   ]  } ], "metadata": {  "kernelspec": {   "display_name": "Python 3",   "language": "python",   "name": "python3"  },  "language_info": {   "codemirror_mode": {    "name": "ipython",    "version": 3   },   "file_extension": ".py",   "mimetype": "text/x-python",   "name": "python",   "nbconvert_exporter": "python",   "pygments_lexer": "ipython3",   "version": "3.6.3"  } }, "nbformat": 4, "nbformat_minor": 2 }
Python为0.000037秒,R为0.00158秒
包括加载时间和在命令行上运行:R需要0.238秒,Python需要0.147秒。强调,这并不是科学严谨的测试。
测试证明,Python的运行速度明显加快。通常这并没有太大影响。
除了运行速度外,对于数据科学家而言哪种性能更重要?两种语言之所以受欢迎是因为它们能被用作命令语言。例如,在使用Python时大多时候我们都很依赖Pandas。这涉及到每种语言中模块和库,以及其执行方式。
第三方支持
Python有PyPI,R语言有CRAN,两者都有Anaconda。
CRAN使用内置的 install.packages 命令。目前,CRAN上有大约1.2万个包。其中超过1/2的包都能用于数据科学。
PyPi中包的数量超过前者的10倍,约有14.1万个包。专门用于科学工程的有3700个。其中有些也可以用于科学,但没有被标记。
在两者中都有重复的情况。当搜索“随机森林”时,PyPi中可以得到170个项目,但这些包并不相同。
尽管Python包的数量是R的10倍,但数据科学相关的包的数量大致相同。
运行速度
比较DataFrames和Pandas更有意义。
我们进行了一项实验:比较针对复杂探索任务的执行时间,结果如下:
在大多数任务中Python运行速度更快。
来源:http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882
可以看到,Python + Pandas比原生的R语言DataFrames更快。注意,这并不意味着Python运行更快,Pandas 是基于Numpy用C语言编写的。
可视化
这里将ggplot2与matplotlib进行比较。
matplotlib是由John D. Hunter编写的,他是我在Python社区中最敬重的人之一,他也是教会我使用Python的人。
Matplotlib虽然不易学习但能进行定制和扩展。ggplot难以进行定制,有些人认为它更难学。
如果你喜欢漂亮的图表,而且无需自定义,那么R是不错的选择。如果你要做更多的事情,那么Matplotlib甚至交互式散景都不错。同样,R的ShinnyR能够增加交互性。
是否能同时使用
可能你会问,为什么不能同时使用Python和R语言
以下情况你可以同时使用这两种语言:
· 公司或组织允许;
· 两种都能在你的编程环境中轻松设置和维护;
· 你的代码不需要进入另一个系统;
· 不会给合作的人带来麻烦和困扰。
一起使用两种语言的方法是:
· Python提供给R的包:如rpy2、pyRserve、Rpython等;
· R也有相对的包:rPython、PythonInR、reticulate、rJython,SnakeCharmR、XRPython
· 使用Jupyter,同时使用两者,例子如下:
之后可以传递pandas的数据框,接着通过rpy2自动转换为R的数据框,并用“-i df”转换:
来源: http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a
预测
Kaggle上有人对开发者使用R还是Python写了一个Kernel。他根据数据发现以下有趣的结果:
· 如果你打算明年转向Linux,则更可能是Python用户;
· 如果你研究统计数据,则更可能使用R;如果研究计算机科学,则更可能使用Python;
· 如果你还年轻(18-24岁),则更可能是Python用户;
· 如果你参加编程比赛,则更可能是Python用户;
· 如果你明年想使用Android,则更可能是Python用户;
· 如果你想在明年学习SQL,则更可能是R用户;
· 如果你使用MS office,则更可能是R用户;
· 如果你想在明年使用Rasperry Pi,则更可能是Python用户;
· 如果你是全日制学生,则更可能是Python用户;
· 如果你使用的敏捷方法(Agile methodology),则更可能是Python用户;
· 如果对待 人工智能 ,比起兴奋你更持担心态度,则更可能是R用户。
企业和个人偏好
当我与Googler和Stack Overflow的大神级人物Alex Martelli交流时,他向我解释了为什么Google最开始只官方支持少数几种语言。即使是在Google相对开发的环境中,也存在一些限制和偏好,其他企业也是如此。
除了企业偏好,企业中第一个使用某种语言的人也会起到决定性作用。第一个在德勤使用R的人他目前仍在公司工作,目前担任首席数据科学家。我的建议是,选择你喜欢的语言,热爱你选择的语言,起到领导作用,并热爱你的事业。
当你在研究某些重要的内容时,犯错是难以避免的。然而,每个精心设计的数据科学项目都为数据科学家留有一些空间,让他们进行实验和学习。重要的是保持开放的心态,拥抱多样性。
最后就我个人而言,我主要使用Python,之后我期待学习更多R的内容。
原文链接:
https://blog.usejournal.com/python-vs-and-r-for-data-science-833b48ccc91d
本文为专栏文章,来自:CDA数据分析师,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/57527.html 。
数据分析
2018-07-12 06:11:00
传统企业在数字化转型中,面临的很大问题就是创新问题, 大数据 也不例外,最近读到得到《何凡读书俱乐部》中关于创新的系列文章,有了一些共鸣和启发,这里结合 大数据 的创新实践分享一下自己的看法。
一、创新就是在行动中思考
首先讲一个团队建设的游戏,这个团队建设游戏叫“棉花糖挑战”,是一位工业设计师彼得.斯基尔曼和他的朋友们一起开发的,参加这个游戏的人被分成几组,每一组都分到一个棕色的纸袋。纸袋里面有二十根意大利面条,当然是生的,不是煮熟的,还有一根绳子,一条胶带,以及一颗棉花糖。这个游戏的目标是搭一个塔,要尽可能高,而且能够把棉花糖放在塔尖上。每个团队都有8分钟的时间,到时间截止时,不能用手扶住他们搭的塔。
这个游戏是团队建设,比的是团队之间如何协调、合作,跟“脑筋急转弯”式的测试题不一样,你可以用各种方法搭塔,比如把意大利面条掰断,用绳子捆,用胶带粘。斯基尔曼发现:表现最佳的团队是五六岁的儿童。幼儿园的孩子搭起来的塔平均有27英寸高,CEO们只能搭成21英寸高的塔,律师们建了15英寸的塔,最差的是商学院的学生,他们搭成的塔平均是10英寸,大约只是幼儿园孩子建成的塔的高度的三分之一。
为什么会是这样呢?这不是因为商学院的学生不如幼儿园的孩子聪明。斯基尔曼发现,最大的差异是孩子们一上来就动手干,而商学院的学生会先讨论半天。幼儿园的孩子在18分钟的时间内,平均会在5分钟的时候就试着把棉花糖放在塔上,然后,他们会不断地再尝试。商学院的学生通常只把棉花糖放在塔上一次,而且大多是在最后一分钟。当他们试着把棉花糖放在塔上的时候,才会发现,坏了,棉花糖其实比他们想象中的要重。
这个测试告诉一个道理,创新就是要在行动中思考,而不是在思考之后才行动。
这个结论对不对?
笔者觉得这个结论大致是靠谱的,比如笔者写微信公众号文章,动笔前大多时候是没有明确思路的,最多有个模糊的方向,然后就是边写边看边想,然后似乎思路会逐步打开,最后再倒腾一下逻辑,当然可能有人会反驳,不对啊,自己工作中大多数时候是想清楚再行动的,而且挺有效,那可能的原因是这个工作的确定性比较强,谈不上有多大的创新。
如果你现在非常纠结于大数据的亮点,那就找准一个方向,找到一个切入点直接开干,回顾自己企业很多大数据的创新都遵循了这么一个原则,下面笔者简要罗列了一些案例,供你参考:
天盾反欺诈算法如何研发的?
开始认为难度很大,在反欺诈中心呆了一个礼拜就知道了欺诈大致的套路,然后就是分析提炼规则,然后就有了更好的算法。
第一个大数据合同怎么签订的?
开始时候完全无从着手,价格怎么定,条款怎么写,流程怎么走,网上找一点信息,伙伴那里问点线索,法律部门探些问道,都是试着能往前走一步,然后再因地制宜。
大数据管理规范怎么制定的?
很多人来向我们要管理规范,其实规范不是制定出来的,而是在项目和运维中边干边总结出来的,因为建立制度的成本不低,要达到很高的性价比就得结合自己的实际找到平衡点,比如我们就明确觉得现阶段在业务部门设立数据管理专员不靠谱,中国移动也才在最近设立了IT委员会。
行业知识图谱怎么做的?
虽然笔者在《为什么运营商大数据变现要搞“行业知识图谱”》提到我们已经构建了38个一级行业,487个二级行业的图谱,但一开始起步的时候哪是这样,就是先找了视频几个主流网站去分析其网站结构和DPI日志的特点,人工发现了一些规则,然后反复验证积少成多,然后才逐步做多,最后再总结一下方便管理,不可能一开始就想好了这个体系,而且挑选的行业也是跟变现最相关的。
创新最主要的不是靠灵感,而是靠执行。
二、创新要懂得及时止损
笔者在去年底反思工作的时候想到了这一点,起因是发现很多传统企业搞BI,比如做专题分析项目,一旦想做就得立项,一旦立项就得做到底,系统可以没人用,但项目不能失败,由于很多立项往往源于年初一个临时的想法,但一旦业务发生了变化,项目箭在弦上也不得不发了,企业相对稳定的业务系统建设用这种模式可行,但诸如大数据等创新工作就有点水土不服了。
让笔者感受更深的是团队的一些 数据挖掘 工作,一旦布置了,从数据准备到最后出结果,短则一月,长则半年,而且效果很多不理想,浪费了太多精力和时间,究其原因,就是缺乏成本意识和止损机制。
做了这么多年数据,感觉在企业做数据挖掘,边际效益其实蛮低的,比如天盾1个月搞出来的东西的价值是最大的,后面就是修修补补,因此,建议做数据挖掘一个月内没明显成绩就要考虑换方向了,其中一种有效的控制方式就是保证反馈能力。
创新的不确定性和偶然性决定了这个事多半要失败,一般的项目领导可以几个月不管,但创新则要无时不刻关注,这个创新是否走在了原来设想的正确的路上和能获得可预期的结果,这里举一个有名的“蜡烛问题”的例子。
想象你自己在一个房间里,房门是木头的,房间里有一根蜡烛,一包火柴和一盒图钉,你怎样才能把蜡烛固定在门上,把它点亮,照亮房间呢?
最常见的解决办法是把蜡烛点燃,然后用融化的蜡把蜡烛固定在门上,另一种思路是试着用图钉把蜡烛固定在门上,听起来这两种思路都很直接,但仔细想想却不靠谱,最好的办法其实很简单:你可以把图钉从盒子里倒出来,用图钉把盒子钉在门上,再把蜡烛竖在盒子里,这样就把蜡烛问问地托住了。
管理者应该及时的对创新中蹩脚的做法给出建议,很多路的走法肯定是走不到你想要达到的效果的,一定要及时指出,试试换一条其它的路看看,迭代并不是说要在错的路上一直走到底才回头,获得所谓的经验,而是要尽量的早发现,然后多尝试几条路,这才能增大成功的几率。
笔者就给标签库团队设立了一条止损底线,下面是当时总结的一页片子,大家可以看看,也许不科学,但需要有这个意识:
三、激情比奖励更能推动创新
这里先举个例子:
哈洛建立了世界上最早的灵长目动物实验室之一,他养了一群猴子,然后在猴子的笼子里留了一些谜题。比如,他会留一些缠住的铰链,然后观察猴子们会不会解开铰链。如果猴子们学会解开铰链了,哈洛就会再个他们出一道更难的题。一周之后,猴子们都学会了解开铰链,而且乐此不疲。
哈洛改变了游戏的规则,他想看看能不能进一步激励猴子们解开谜题。这次的规则是,如果猴子解开了谜题,就会得到食物奖励。结果出乎意料:有了食物的奖励之后,猴子解开谜题的积极性反而下降了。
人跟猴子是一样的。当我们做创造性工作的时候,我们的最大动机是兴趣,而不是奖励。如果你让幼儿园的孩子们即兴画画,在没有奖励的情况下,他们画画的热情更高,水平更棒,如果把画画跟奖励挂钩,画画也就变得没意思了。
流行音乐界有个说法,叫“第二章专辑综合征”,有些乐队的第一张引起轰动的专辑大多是在乐队成员处于人生低谷、没有钱、也没有支持的时候坚持做出来的。当第一张专辑大获成功之后,他们往往会花更多的钱,在更精良的录音棚里录制第二张专辑,遗憾的是,第二章专辑往往不如第一张专辑。
因此好消息是:创新是不需要激励的,坏消息是:即使用金钱等手段鼓励,也买不到好的创新。
这个结论大致靠谱,笔者也有实际体会,传统企业当前在 大数据创新 领域面临着较大的人才引入挑战,与薪资动辄百万的互联网公司相比的确是囊中羞涩,但其实能否创造更好的人员成长、发展和创新环境才是企业当务之急,这不是钱能解决的问题,也不要让钱成为大数据业务发展不了的托词。
传统企业得放弃幻想,尊重现状,为现有员工创造良好的环境,无论是《基业长青》还是《从优秀到卓越》,都提到了自家成长的经理人的重要性,笔者自己也有体会,越理解自己公司的员工,越可能创新。
比如面对新的形式,AT&T重新定义了企业愿景,目标是成为数字化时代的软件和科技公司。为达此目标,AT&T自2012年起推动一系列的转型措施,其中在人力资源部分部分推动“2020人才计划”,目标将庞大员工队伍转型为企业发展需要的数字化人才,14W员工积极参与,多数员工每周花5到10小时接受培训,接受再教育的员工填补了47%的技术管理岗,平台一年访问量达到600万,产品开发周期缩短40%,获利周期缩短32%,浙江移动也在花很大的力气搞千人计划和培训计划,给有创新意愿的员工更多的机会,这对于企业都是功在千秋的事业。
四、独自工作比头脑风暴有效
你一定听说过头脑风暴,这个主意是在1939年由广告经理奥斯本发明的,这个做法曾经风扉一时,至今还有不少机构习惯开个“头脑风暴”会议。然而,事实证明,“头脑风暴”并不能有效地提高创新,如果在“头脑风暴”会议上召集的人数越多,效果反而越差,最佳的方式不是开“头脑风暴”,而是“闭门思考”,也就是说,创新不是“广场舞”,而是“独行侠”。
苹果的创始人之一,也是苹果公司首台电脑的发明者沃兹尼亚克早就明白这一点。他说:“如果你独自工作,你将最有可能设计出革命性的产品和功能,不是在一个委员会中,也不是在一个团队里。”
虽然他的话不能全信,但有一点极为宝贵的经验,也就是说,创新就是持之以恒地凭兴趣干一件事情,或者叫深度工作。
其实比“独行侠”更好一些的,是组建一个小分队,创新可以是个人的事情,也可以是一个小分队的事情,但从来都不是一个大机构的事情,那么怎样把你的团队改造成一个创新的团队呢?
有一篇《乔布斯们的巢穴》的文章可以去读一下:
“创新不是天才人物的灵光一现,而是一个富有创造性的团队天天混在一起,每天都有点新的想法,互相交流、互相补充,日积月累,凝聚出来的。”
“当人们聚集在一起,形成一个组织的时候,最容易发生的故事就是垂直的科层制无情地碾压了创新的梦想。要想保持创新的活力,一个组织必须打破科层制,尽可能地创造出人人平等的气氛。不管走到哪里,都会有很多人不愿意冒险、习惯于蹈规循矩,凡事总爱否定,凡事总爱推脱。让这些人参加创新者的讨论,让激情感染他们。如果感染不了,那就限制他们的负面影响。你可以反对新的项目,但必须把反对的理由写下来。这样,就会避免人们不假思索地枪毙一切新的点子。”
“高效率的人往往缺乏创新精神。过分地追求效率,就会变得把一切工作都标准化、程式化。这对于常规的工作当然是必不可少的,但要想做出重大创新,追求完美和高效率反而会是一种障碍。成功会让人们有一种不停地复制成功的冲动,最后,伟大会退化为平庸。”
笔者的观点是创新首先是选择到正确的人,这个可遇不可求,创新都是自发的,不能奢望培养出能创新的人,其次,给一个开放能协作讨论的环境,最后,充分信任并给予资源。
其实头脑风暴和独自思考都仅仅是激发创新的一种方式,因人而异,从生物学的角度看,因为大脑需要刺激才能产生意外的连接,因此假如你习惯于人多讨论的环境,不如尝试独自走一段山路更能激发创意,但假如你一直习惯于独自思考,搞个头脑风暴或许有意外的惊喜。
五、四本书构建你的创新思维
何凡推荐了四本创新的书,笔者这里借花献佛:
1、凯文.阿什顿 《被误读的创新》
创新就是打破常规,找到解决问题的新方法,创新就像走路,决定能否成功的关键不是一步能迈多远,而是看你一共走了多少步。
人的本性是拒斥创新,越是伟大的创新,遭到的拒斥就越大,如果你没有遭到拒斥,很可能是因为你不够创新。
所有的创新都来源于其他人的贡献,我们不过是站在巨人的肩膀上,才能看得更高。
2、克里斯滕森 《创新者的窘境》
很多领先企业突然惨遭淘汰,不是因为它们做得不好,恰恰相反,是因为它们做得太好,它们精于管理,信奉客户至上的理念,不断在技术上精益求精,努力提高盈利水平,但最终却失去了市场上的立足点。
这是跟大企业的一套成熟的商业理念、商业模式相一致的。如何才能避免出现这种窘境?据说张飞睡觉的时候都睁着眼。企业也必须睁大“张飞的眼睛”,不仅看到自己地盘上的变化,还要注意其它市场上的变化。企业必须放出更多的侦察兵,以及更多的远征军,到外边建立根据地,用更灵活的机制不断创新,适应新市场上出现的新技术。
谷歌为什么建了个母公司Alphabet,不就是为了避免创新的窘境吗?
大数据道理上其实也是一样的。
3、克里斯滕森 《创新者的解答》
这是一本更为实操性质的书,作者讲了防守的策略,也讲了进攻的策略,初创企业不可能一上来就采取正确的策略,不过,没关系,只要方向正确,前进道路上多走了弯路,也是无伤大雅的。方向是什么呢?方向是你必须找到可以低价盈利的商业模式。你得先挣到钱,然后才能生存下来,才有可能以后挣到大钱。你要选择对手的薄弱环节,找到破坏性的定位,也就是那种你的对手不屑一顾、乐得放弃,但却大有可为的“空白地带”。
4、马特.里德利 《自下而上:万物进化简史》
这本书的视野更为广阔,阿什顿讲的是个人的创新,克里斯滕森讲得是企业的创新,而里德利建讲的就是整个系统的演进,从这本书中,你能读到,无论是经济、思想、教育,还是货币、宗教、互联网,都发生巨大的变化,我们人类从本性上就是一种有创新本能的物种,这一天性造就了我们巨大的进步。
就写到这里吧,希望于你有启示,虽然笔者从事的是大数据的相关工作,但其实创新的思想是跨行业通用的,欢迎分享!
作者:傅一平 就职于浙江移动大数据中心 微信号:fuyipingmnb 欢迎交流!
本文为专栏文章,来自:傅一平,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/57141.html 。
数据分析
2018-07-09 09:45:00
作者 Megan Mary Jane 编译  Mika
随着数据科学的日益普及,现在有大量的就业机会。如果你正在找 数据科学家 的工作,你可以在各大求职网站上看到大量求职需求。如果你正在考虑转行,或者想在没有数据科学背景的情况下开启新的职业生涯,那么数据科学家仍然是很好的职业选择。
以下列出了成为数据科学家的十大好处。
1. 本世纪最性感的工作
《哈佛商业评论》的一篇文章称,“数据科学家是21世纪最性感的工作”,有很多方面可以证明这点。从事金融、统计和运营研究的公司比以往任何时候都更加关注数据科学。数据科学正在为企业带来大量价值,同时数据科学家的需求也在迅速增长。大量的市场需求对于个人职业的发展也是十分有利的。
2. 工作上的自由
如果你问数据科学家,他们作为数据科学家最棒的一点是什么?他们的答案会是自由。对于数据科学,你不必局限于特定行业。成为数据科学家的最大优势在于,你的工作将与技术紧密相连,这意味着你的工作充满了创新和潜力,你可以自由地从事感兴趣的项目。更重要的是,你通过数据科学的工作能够改变成千上万人的生活。
3. 更有机会进入大公司
作为数据科学家,你更有机会在亚马逊、苹果和优步等公司工作。例如,亚马逊通过使用数据科学向客户推荐产品进行销售。亚马逊使用的数据来自其庞大的客户群。苹果公司使用 大数据 来为产品功能做出决策。优步的高峰期溢价就是公司如何使用数据科学的最好例子之一。
4. 收入丰厚
美国数据科学家的平均工资约为每年12万美元。自2011年以来,94%的美国毕业生找到了数据科学家的工作,平均工资为每年11.4万美元。根据2017年的报告,数据科学家的工作在排名前25的最佳工作岗位中位居第一,而且目前它仍然保持着这一地位。
5. 优质的培训和课程
与其他许多 IT 工作不同,数据科学家不必学习没有用的技能。许多数据科学课程都由该领域具有丰富经验和知识的专家提供。经过认证的数据科学家的加薪幅度约为在58%,而没有认证的人士加薪幅度约为35%。对于经过认证的专业人士来说,升职加薪更为容易,但这并不一定意味着自学成才的数据科学家难以得到发展。
6. 市场需求大
数据科学家的职业发展选择很多,比如项目管理、安全性、系统架构、咨询等。这些专业领域对具有相关技能的人才有巨大的需求。有些职位的就业增长率甚至超过100%。例如,信息安全分析师职位的就业增长率为279.69%,其他职位也是如此。到2018年底,美国对数据管理人员的需求将超过150万。IBM预计,数据科学家的需求将继续增长。
7. 人才的多样性
数据科学是令人兴奋的,需要不同角色的人来解决现实问题。在世界各地,大中小型企业每天都在创造数据,但并非每个企业都在利用他们产生的数据。为了改善这种局面,公司发展的不同阶段都需要具备数据科学知识的人才。这些公司需要对数据进行分析,将业务问题转化为易于理解的数据问题,实现统计数据方法,缩小理论与编程之间的差距。
8. 相对安全的职业
新技术层出不穷,这就是为什么人们认为科技世界中许多技术都会转瞬即逝。数据科学并非如此,但这并不一定意味着数据科学家应该停止学习新技能。我们都知道,包括数据科学在内的当今许多技术都将实现自动化。这意味着某些领域最终将实现自动化,但数据科学领域的发展不会停止,对数据科学家的需求也将继续增长。那些拥有一定技能并保持正确心态的人才不会被淘汰。
9. 获得高管的青睐
数据科学家研究许多技术和编程语言,他们使用许多工具来解决业务问题,在此过程中,他们能获得高层管理人员的信任。数据科学家与来自不同行业和部门的人员合作,只要他们不断努力提高专业技能,他们就更有机会获得高管的青睐。
10. 更容易创业
当你了解许多行业的内部和外部情况,并且建立良好的联系,同时获得解决业务问题的能力,那么开创自己的业务将更为容易。
结语
如果你在LinkedIn等求职网站搜索“ 数据科学家职位 ”,你将看到数百个就业机会。即使没有扎实的数据科学背景,你也可以通过在线学习课程和教程来充实这方面的知识。数据科学如今非常热门,并且在未来几年内也将如此。
原文链接: http://bigdata-madesimple.com/the-perks-of-being-a-data-scientist/
本文为专栏文章,来自:CDA数据分析师,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/55994.html 。
数据分析
2018-07-08 19:06:00
作者 | Christopher Groskopf
译者 | 无明
编辑 | Vincent、Debra
微信公众号“AI 前线”,(ID:ai-front)
应该从数据来源解决的问题
 值缺失
注意数据集中的空值或“null”,除非你知道它们的确切含义。如果数据是年度数据,那么有没有哪年的数据没有被收集到?如果是一项问卷调查,有没有受访者拒绝回答问题?当你在处理缺失数据时,应该问自己:“我知道这个值的缺失是什么意思吗?”如果答案是否定的,你应该检查你的数据来源。
 使用零代替缺失值
使用任意值代替缺失值比缺失值本身更糟糕。这可能是人类无意义思考的结果,也可能是不知道如何处理空值的自动化处理造成的。无论如何,如果你看到一长串的零,应该问自己,这些值真的是零,还是表示“没有”(有时候也会用 -1)。如果你不确定,请检查你的数据来源。
 行或值重复
如果同一行数据不止一次出现在数据集中,你应该找出原因,有时它可能不是一整行都一样。一些活动财务数据包含了一些修订数据,这些修订数据使用了与原始交易相同的唯一标识符。如果你不知道这点,那么你对数据所做的任何计算都是错误的。如果某些东西看起来应该是唯一的,那就验证它。如果你发现它不是,请检查你的数据来源。
 拼写不一致
拼写检查是判断数据是否由手动输入的最明显的方式之一。不要只看人们的名字——这些往往是最难检测到拼写错误的地方——应该查找城市名称或州名不一致的地方。如果你发现了这些问题,那么就可以确信数据是手动编辑过的。手动编辑的数据最有可能出错。这并不意味着你不应该使用它们,但你可能需要手动更正这些错误,或者在报告中对其进行说明。
 日期格式不一致
下面两个日期哪个是表示 9 月份: 10/9/15 9/10/15
如果第一个是欧洲人写的,第二个是美国人,那么它们两个都是表示 9 月份。如果你不知道数据的来源,你就无法确定。所以要确定你的数据来自哪里,并确保它是由来自同一大洲的人生成的。
 没有指定单位
weight 和 cost 都不能传达关于计量单位的任何信息。不要认为美国境内生产的数据就一定是以磅和美元为单位。本地货币中可能会提到到国外的价格。如果数据没有指定单位,请检查你的数据源。
 来源没有记录
数据通常由各种个人和组织创建,包括企业、政府、非营利组织等。我们通过很多不同的方式收集数据,包括问卷调查、传感器和卫星。了解你的数据来自哪里可以让你深入了解它的局限性。
例如,问卷调查数据通常都不会很详尽。传感器的精度各不相同。政府往往不愿意给你无偏见的信息。由于存在穿越战线的危险,来自战区的数据可能具有强烈的地域偏见。更糟糕的是,这些不同的来源经常混在一起。政策分析师经常会打乱从政府收集来的数据。医生指定的数据可能是由护士输入。每种情况都有可能发生错误,所以还是要检查你的数据来源。
 数据太粗糙
你有州的数据,但你需要的是县的数据。你有雇主的数据,但你需要的是雇员的数据。他们给了你几年的数据,但你想要几个月的数据。在很多情况下,我们收集的数据对于我们的使用目的而言已经太过了。
一旦数据合并在一起,通常很难再把它们分开。如果你提供的数据太粗糙,就需要向数据来源索要更具体的内容。他们可能没有。即使有,也可能无法或不愿意把它们交给你。为了保护个人隐私,很多联邦数据集无法在本地访问。
永远不应该做的一件事是将年度数据除以 12,并称之为“每月平均值”。如果不知道数值的具体分布,那么这个数字就没有意义。这是错误的,所以不要这样做。
 拥有 65536 行数据的电子表格
老式 Excel 电子表格允许的最大行数为 65,536。如果你收到具有该行数的数据集,则几乎可以肯定你收到的数据是被截断的。较新版本的 Excel 支持 1,048,576 行,因此数据行不太可能达到极限。
 拥有 255 列数据的电子表格
Apple 的 Numbers 应用程序只能处理包含 255 列的电子表格,并且应用程序会截断具有更多列的文件而不会警告用户。如果你收到的数据集正好为 255 列,那么就要确认这个文件是否在 Numbers 中打开或转换过。
 文本被转换为数字
并非所有的数字都是数字。例如,美国人口普查局使用“FIPS 代码”代表美国的每一个地方。这些代码具有不同的长度,都是由数字组成,但它们其实不是数字。037 是洛杉矶县的 FIPS 代码,不是指数字 37。37 是北卡罗来纳州的 FIPS 代码。Excel 和其他电子表格通常会认为它们是数字,就把前导零去掉了。
 数字以文本形式保存
在使用电子表格时,数字可能会被保存为文本。例如,一个单元格可能使用字符串“1,000,000”、“1 000 000”或“USD 1,000,000”,来表示百万美元,而不是直接使用数字 1000000。Excel 可以利用内置函数来处理一些简单的情况,但通常需要使用公式去除字符,直到单元格的内容可以被识别为数字。最好的做法是不使用格式来保存数字,并在列名或元数据中包含相关信息。
应该由你自己解决的问题
 文本乱码
在绝大多数情况下,你的文本编辑器或电子表格应用程序会找出正确的编码,但是,你可能会发现某些人的名字中有怪异的字符。你的数据来源应该能够告诉你数据采用了什么编码。如果他们无法提供这些信息,你可以通过一些可靠的方式猜出来,或去问程序员。
 换行符是乱码
所有文本和“文本数据”文件(如 CSV)都使用不可见字符来表示换行符。Windows、Mac 和 Linux 一直以来没有在换行符该使用什么字符上达成过一致。试图在一个操作系统上打开在另一个操作系统上保存的文件有时会导致 Excel 或其他应用程序无法正确识别换行符。
通常,只需在通用文本编辑器中打开文件并重新保存即可轻松解决该问题。如果文件特别大,你可能需要考虑使用命令行工具或向程序员寻求帮助。
 PDF 中的数据
大量的数据——尤其是政府数据——只能以 PDF 格式提供。如果你在 PDF 中有真实的文本数据,那么可以通过几种方式来提取它们。Tabula 是一个优秀的免费工具。如果你订阅了 Adobe Creative Cloud,那么可以使用 Acrobat Pro,它提供了将 PDF 表格导出到 Excel 的功能。
 数据太细
这与数据太粗糙刚好相反。在这种情况下,你有县的数据,但你想要州或有几个月的数据。所幸的是,这通常很简单。
可以使用 Excel 或谷歌文档的数据透视表(Pivot Table)功能来汇总数据。透视表是每个记者都应该学习的神奇工具,但它们也有其局限性。对于非常大的数据集,你应该向程序员求助,他们可以制定一个更容易验证和重用的解决方案。
 手动输入的数据
手动数据输入是一个常见问题,至少在这里描述的其他问题中有 10 个与它相关。没有比让一个人输入数据却没有对其进行验证更糟糕的方式来搞砸数据了。例如,我曾经拿到伊利诺伊州库克县完整的养狗许可数据库。系统创建者让狗的主人通过一个文本框输入狗的品质,而不是提供一个狗的品质列表给他们选择。结果这个数据库出现了至少 250 个不同的吉娃娃品种。
 数据与格式和注释混杂在一起
HTML 和 XML 复杂的数据表示在数据和格式之间有清晰的分隔,但对于电子表格的数据表示来说并非如此。电子表格数据的一个常见问题是,前几行数据实际上是关于数据的描述或备注,而不是列标题或数据本身。数据字典也会被放在电子表格的中,标题行可能会重复,或者在同一张表格中包含多个表(可能有不同的列标题),而不是分成不同的表格存放。
很明显,试图对具有这些问题的电子表格进行分析都会失败。所以,在首次查看新数据时,请确保数据中不包含额外的标题行或其他格式化字符。
 基于缺失值进行聚合
设想一个数据集有 100 行数据,其中有一列叫作 cost。在其中的 50 行中,cost 列是空白的。那么该列的平均值是多少?是 sum_of_cost/50 还是 sum_of_cost/100?没有一个明确的答案。一般情况下,如果要在缺失值的列上进行聚合,可以先安全地过滤掉带有缺失值的行。在某些情况下,缺失的值也可能被设置为 0。如果你不确定,请向专家咨询,或者不要做聚合计算。
 误差幅度过大
没有什么能够比使用误差幅度很大的数据得出的报告包含更多的错误。而不是具有非常大的错误余量的数字的非反应性使用。误差幅度通常与问卷调查数据有关。投票数据或美国人口普查局的美国社区调查数据是最有可能出现误差幅度的。误差幅度一般用于衡量真值的范围。它可以表示为一个数字(400 +/- 80)或百分比(400 +/- 20%)。相关人口越少,误差幅度就越大。例如,根据 2014 年 5 年的 ACS 估计,居住在纽约的亚裔人数为 1,106,989 +/- 3,526(0.3%)。菲律宾人的数量是 71,969 +/- 3,088(4.3%)。萨摩亚人的数量是 203 +/- 144(71%)。前两个数字是安全可信的,但第三个数字不应该用于已发布的报告。关于什么样的数字不能够使用并不存在规则,但经验告诉我们,应该谨慎使用误差幅度超过 10%的数字。
 误差幅度未知
有时候,问题不在于误差幅度过大,而在于没有人想过要弄清楚它究竟是什么。这是一个不科学的民意调查问题。如果不计算误差幅度,就不可能知道结果的准确程度。作为一般规则,只要你有问卷调查数据,就应该询弄误差幅度是什么。如果数据来源无法提供这一信息,那么这些数据可能不值得用在分析上。
 数据样本有偏见
有偏见的样本是由不谨慎的抽样导致的,或者有人故意扭曲。样本可能包含偏见,因为它是从互联网上收集的,而穷人不像富人那样可以频繁使用互联网。问卷调查必须仔细加以权衡,以确保它们覆盖所有的人口比例,避免出现扭曲。要完美做到这一点几乎是不可能的,所以人们经常会做错。
 数据被手动编辑过
手动编辑存在的问题几乎与人类输入数据的问题相同,只不过它是在后面才发生。事实上,手动编辑数据通常是为了修复人类最初输入的数据。当编辑人员不完全了解原始数据时,就会出现问题。我曾经看到有人自发地进行“修正”,将数据集中的 Smit 改为 Smith。那个人的名字真的是 Smith 吗?我不知道,我只知道现在值出现了问题。
 通货膨胀歪曲了数据
通货通胀表示货币的价值随着时间的流逝而发生变化。我们没有办法通过观察数字来判断数字是否已经出现了“膨胀调整”。如果你在获得数据后不知道它们是否已经被调整过,请检查你的数据来源。如果他们没有进行过调整,你可能会想要自己进行调整,可以借助这个工具 http://inflation-adjust.herokuapp.com 进行数据调整。
 自然 / 季节变化歪曲了数据
由于某些潜在的原因,很多类型的数据会发生自然波动。最著名的例子就是随季节而变化的就业形式。经济学家已经开发出各种补偿这种变化的方法。这些方法的细节并不重要,重要的是要知道你使用的数据是否已经经过“季节性调整”。如果他们没有,并且你想比较每月的就业情况,你可能需要向数据来源所要调整过的数据(自己调整它们要比膨胀调整要困难得多)。
需要由第三方专家帮你解决的问题
 作者不可信
有时候,你拥有的唯一数据是来自你不想依赖的来源。在某些情况下,这很好。只有枪械制造商才知道他们究竟生产了多少把枪。但是,如果你的数据来自可疑制造商,那么请务必与其他专家核对,最好与两三个专家一起检查。除非你有确凿的证据,否则不要发布来自包含偏见的来源的数据。
 收集过程不透明
在数据收集过程中引入不真实的假设、错误或纯粹的谬误是非常容易的。因此,收集数据的方法必须是透明的,这一点很重要。很少有人知道数据集是如何收集的,不过可以从一些表象看出问题来,比如不切实际的断言精确度和结果好过头的数据。
 不切实际的精确度
除了硬科学之外,很少有东西会以超过两位小数的精确度进行测量。如果某个数据集意图将工厂的排放量显示在小数点后第七位,它们可能是从其他数值估算出来的。它们往往是错误的。
 莫名其妙的异常值
我最近创建了一个数据集,表示消息通过互联网到达不同目的地需要多长时间。除了其中的三个超过了 5000 秒,其他所有时间都在 0.05 到 0.8 秒的范围内。这表示数据生成过程中出现了问题。我写的代码出现了一个错误,导致在发送和接收其他消息时,无法计算某些消息的时间。
这些异常值可能会极大地影响你的统计数据——特别是如果你要使用平均值(你应该使用中位数)。在获得一个新数据集时,最好先查看它们的最大值和最小值,并确保它们处于合理的范围内。如果数据正确,你可能还想使用标准偏差或中位数偏差进行更加严格的分析。
异常值往往是找出问题的好方法。如果真的有一个国家在互联网上发送一个消息多花费了 5000 倍的时间,那就有意思了。
 指数掩盖了底层的变化
想要跟踪问题趋势的记者通常会创建各种价值指数来跟踪进度。使用指数没有任何内在问题,它们有很好的解释力。但是,要注意那些由离散指标组合而成的指数。
例如,联合国性别不平等指数(GII)由与妇女平等发展进程相关的几项指标组成。GII 采取的指标之一是“妇女在议会中的代表权”。世界上有两个国家的法律规定在其议会中需要有不同性别比例的代表:中国和巴基斯坦。因此,这两个国家在指数上的表现要好于其他国家。这是否公平?这并不重要,因为任何不了解这个情况的人通常都会感到困惑。在使用 GII 和类似指数时应该进行仔细的分析,以确保底层的变化不会以意想不到的方式造成指数的波动。
 结果被 p-hack
P-hacking 故意改变数据、改变统计分析结果或有选择地报告结果,以获得具有统计意义的结果。这方面的例子包括:一旦有了重要结果就停止收集数据,删除观察结果以获得重要结果,或者执行多次分析,只报告少数重要结果。关于这个问题已经有一些报道 http://fivethirtyeight.com/features/science-isnt-broken。
如果你要公布研究结果,你需要了解 p 值是什么,它意味着什么,然后对结果是否值得使用做出明智的决定。许多垃圾研究成果让它出现在主要的出版物中,因为记者不了解 p 值是什么。
 Benford 定律失效
Benford 定律是一种理论,即小数字(1,2,3)出现在数字开头的频率比大数字(7,8,9)大得多。理论上,Benford 定律可以用来检测会计或选举结果的异常情况,但实际上它很容易被误用。如果你怀疑某个数据集已被篡改,Benford 定律是一个很好的检验手段,但在得出数据被篡改的结论之前,应该先与专家验证你的结果。
 结果好得过了头
没有人知道生活在西伯利亚的确切人数。跨境犯罪统计数据不具可比性。美国政府不会告诉你它手上有多少裂变材料。
对于那些声称可以告诉你某些你不可能知道的”真相“的数据要特别小心。它们不是数据,可能只是某些人的臆想,而且是错误的。有可能它只是个趣闻,所以务必和专家确认。
应该由程序员帮你解决的问题
 基于错误的类别或地区聚合数据
有时候你的数据具有恰到好处的细节(既不太粗糙也不太细化),但是它们已经按照你不想要的分组进行了聚合。举个典型的例子,一组按照邮政编码进行聚合的数据,但你希望能够按照相邻的城市进行聚合。在很多情况下,如果不从数据来源获取更多细化的数据,就不可能解决这个问题,但有时可以将数据按比例从一个组映射到另一个组,但要十分小心不要在这一过程中引入误差幅度。如果你按照错误的组聚合了数据,请向程序员求助,看看是否可以重新聚合数据。
 扫描文档中的数据
多亏了 FOIA,政府往往需要向你提供数据,即使他们真的不想。在这些情况下,一个非常常见的策略是让他们给你数据页的扫描或照片。它们可能是图像文件,或者是 PDF 文档。
我们可以从图像中提取文本并将其重新转换为数据。这是通过称为光学字符识别(OCR)的技术完成的。现代 OCR 技术通常可以达到 100%的准确率,但它非常依赖于文档的质量。每次使用 OCR 提取数据时,你都希望有一个过程来验证结果是否与原始数据匹配。
有很多网站可以上传文件进行 OCR 操作,但也有免费工具可让程序员调整你的文档,可以向他们求助,看看怎样更好地处理你的 PDF 文档。
英文原文:
https://github.com/Quartz/bad-data-guide
本文为专栏文章,来自:AI前线,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/56953.html 。
数据分析
2018-07-02 18:58:00
策划编辑 | Natalie 编译 | Debra,Vincent 编辑 | Vincent 微信公众号“AI 前线”,(ID:ai-front)
自 2012 年上市以来, Facebook 已经提交了数千项专利申请。其中一项是使用前置摄像头来分析用户的表情,并检测用户在 Feed 中看到内容时感到无聊或惊讶。另一项是使用手机的麦克风来确定用户在观看哪个电视节目。其他让人匪夷所思的系统还包括猜测你是否即将结婚,预测你的社会经济地位,并跟踪你的睡眠情况,等等。
通过对 Facebook 数百项专利申请的审查显示,该公司已经在思考用技术跟踪用户生活的几乎所有方面:你身在何处,和谁在一起,是否处于恋爱期,你在讨论哪个品牌或政治家…… 该公司甚至试图通过一种方法来预测你的朋友何时会死掉!
Facebook 一再表示,其专利申请不应被视为该公司未来的产品规划方向。 “这些专利中描述的大部分技术并未应用在我们的任何产品中,而且从永远不会。”Facebook 副总裁兼副总顾问,及该公司的知识产权负责人 Allen Lo 在一封电子邮件中表示。
总而言之,尽管公众对该公司的隐私政策批评声不绝,并且其首席执行官承诺该公司将会“做得更好”,Facebook 的专利却暴露其确实仍在收集用户个人信息。
纽约大学法学教授 Jason M. Schultz 说道:“专利组合是一家公司思考其技术发展方向的蓝图。”
以下是 Facebook 的其中七项专利申请,揭示了该公司如何收集和利用你的个人信息。
预测你的死亡时间
只靠你在 Facebook 这样的社交网络上留下的信息,就能推测你的死亡时间?没错,在 Facebook 近日提交的一份专利申请中,描述了 Facebook 使用用户的信用卡交易和位置信息,以及帖子和消息来预测可能发生的,如出生、死亡或毕业等重大生活事件的时间。
(预测社交网络系统成员的重大生活改变,U.S. 专利申请号 12/839,350,https://patents.google.com/patent/US20120016817A1/en)
更重要的是,这些技术中的很多仅仅依靠智能手机的地理定位数据,就能够了解更多关于用户的习惯。
专利申请材料称,通过这些“生活变化事件”,有助于广告商将能够更有效地及时地提供广告 。比如,如果搜集并分析得出用户近期有订婚或者结婚的意向,Facebook 就会在用户的使用界面上推送婚礼相关的广告。 这样一来,广告商就不会因为用户没有提前告知要结婚,而错失一次赚钱的机会。
Facebook 在专利中提出使用机器学习来“计算用户经历生活变化事件的可能性”,以及“经历了生活变化事件的其他用户的历史数据”。
该算法可以查找诸如“点赞”按钮,其他用户在每个用户简档上点击了多少次,或者其他记录的数据以形成“生活变化预测引擎”。
Facebook 还表示,即使在用户不在使用 Facebook 应用程序时,它也可以使用一系列地理位置数据点来确定用户的“常用程序”,因为许多移动软件都可以与 Facebook 同时在后台运行。
读取你的恋爱关系
其中一项专利申请讨论了使用诸如你访问其他用户页面的次数、个人资料图片中的人数,以及你不同性别朋友的比例等信息,来预测你是否处于恋爱关系。
(推断用户社交关系状态专利,专利申请号:US14/295,543  https://patents.google.com/patent/US20150356180A1/en)
分类你的个性
另一项专利,是使用你的帖子和消息来推断你的人格特质。它描述了你的外向程度、开放性或情绪稳定性,然后利用这些特征选择要展示的新闻报道或广告。
(从社交网络系统通信和特征判断用户个性特征,U.S. 专利申请号:9,740,752 https://patents.google.com/patent/US9740752B2/en)
识别你的相机
另一项专利是使用错误的像素或镜头划痕分析照片,以创建一个独特的相机“标签”。该标签可用于发现你知道的某人在你设备上传了拍摄的照片,即使你之前并未与之连接。或者,这项技术可以根据你使用同一台相机的频率猜测你和朋友之间的“亲密关系”。
(连接社交系统中相机的使用者,U.S. 专利号:8,472,662,https://patents.google.com/patent/US8472662B2/en)
监听你周围的环境
本专利申请探索了如何使用手机麦克风来识别你观看的电视节目,以及广告是否被静音。它还探索了使用电视电源线创建的电气干扰模式来猜测正在播放的节目。
(将媒体消费数据与用户配置文件相关联,U.S. 专利申请号:14/985,089 https://patents.google.com/patent/US20170195435A1/en)
跟踪你的例行路程
另一个专利申请讨论了如何跟踪你的每周例行路线,并向其他与此路线不同的用户发送通知。此外,它还描述了如何在深夜使用你的手机位置来确定你的居住地点。
(例行路线通知,U.S. 专利申请号:15/203,063 https://patents.google.com/patent/US20160316341A1/en)
推断你的习惯
本专利提出一种通过测定你的手机位置与朋友手机位置的距离,推断你最常与哪些人进行社交活动。它还会监控你手机静音的时间,以推断你的睡眠时间。
(持续位置跟踪,U.S. 专利申请号: 9,369,983 https://patents.google.com/patent/US9369983B2/en)
牺牲 用户隐私 带来的暴利
在某些情况下,公司可以出于防御申请专利,即使他们无意使用它,也可以让竞争对手无法获得某种新技术。虽然 Facebook 的某些专利可能属于这种情况,但很多专利都是其用来收集、分析和使用个人信息,并将其打包卖给给广告商的新方法——这对该公司的商业模式至关重要。2018 年第一季度,Facebook 的收入中有近 99%来自广告。
“只要 Facebook 不停止收集个人信息,我们就应该警惕这些信息可能被用于比定制广告更危险的目的,包括操纵选举活动或用户的情绪,”斯坦福大学法学院互联网和社会中心消费者隐私总监 Jennifer King 如此说道,“这可能会造成严重的后果。”
除了 Facebook,其他技术公司也提交了令人不安的专利申请,包括亚马逊用来跟踪仓库员工的腕带以及配备了摄像头和麦克风的 Google 泰迪熊。
虽然,Facebook 每月活跃用户数量超过 20 亿,大多数人都在这个平台上分享他们的想法和感受,但其仍正以前所未有的规模收集我们的个人信息。弗吉尼亚大学媒体研究教授 Siva Vaidhyanathan 表示,这种情况不太可能改变。 “我没有看到任何迹象表明 Facebook 在改变其一贯做法,它还在监视、记录、利用我们所做的一切,”他说道。
结尾
今年三月,Facebook 被爆出大量泄露用户数据隐私,大约有 8,700 万用户的数据在当事人完全未知的情况下被窃取。
之后,扎克伯格就一直疲于应对各种公开听证会,并不断在听证会上作出承诺将会“做得更好”。 “这是一种违背信任的行为,我很抱歉我们当时没有做更多的事情来阻止。”
扎克伯格在纽约时报和其他出版物上刊登的整版广告中写道。 Facebook 也做出了回应,推出了一系列工具,使用户能够更好地理解和控制网站收集哪些数据。
从本文介绍的这几项专利看来,Facebook 确实是做得越来越“好”了,而且越来越难以让用户发现。不仅是 Facebook,不少技术大厂在被曝出利用用户隐私达到某些商业目的后,都对外公开承诺“永不再犯”,如今这样的“承诺”大家都已经听得耳朵起茧了,用户的信任不断被消费,而隐私的底线却仍然在不断地被侵犯,在这种情况下,这些所谓的“承诺”还会有人相信吗?
参考链接 :
http://www.dailymail.co.uk/sciencetech/article-5883981/Facebook-patents-firm-predict-youll-DIE-exactly-youll-day.html
https://www.nytimes.com/interactive/2018/06/21/opinion/sunday/facebook-patents-privacy.html
本文为专栏文章,来自:AI前线,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/56719.html 。
数据分析
2018-06-28 09:24:00
在工业生产活动中,有一类常见 机器学习 问题,就是如何基于有噪声样本标签训练模型,以进行故障检测和分类。
先解释下什么是有噪声样本标签,它指的是训练模型用的样本标签并非完全准确,部分样本的标签有标错的情况。
对于这个问题,为了便于大家理解,我们以一个最近成功实践的项目为例,以实例为大家讲述如何实现。
一、人工测量电子开关的问题
在大型工业设备中,有一类广泛使用的电子开关,这些电子开关使用久了,会逐渐老化故障,进而影响设备运行,因此需要替换。
目前业内的常见做法是首先进行一系列的人工测量,然后通过经验来判断电子开关是否已经损坏,并将损坏的电子开关替换。这里面测量数据只是用作参考,实际上并没有明确的损坏标准,操作中还是以经验为主。
这种方式其实是存在很多问题的。
比如,人和人之间是有个体差异的,每个人的经验是不一样的,这样就导致最终的判断结果也没法相同。
就有可能导致本来正常的电子开关,被判断为坏的或者即将损坏的,以此进行替换就会造成浪费。
同样的,也有可能把坏的或者即将损坏的判断为正常的电子开关,继续使用,导致更大的损失。
因此,如果能够利用机器学习的技术,避免人工经验判断的误差或错误,提升判断的准确性,就能给我们的客户带来很大的价值。
于是,我们开始考虑通过机器学习如何去实现?
二、如何避免训练出“有噪声”的模型
对于机器学习来说,解决这类问题的难点在于,样本数据的标签是有噪声的或者说不完全准确的。
如果直接使用这些样本进行训练,无论我们采用哪种分类算法(决策树、逻辑回归 ,亦或是近年较为流行的 XGBoost),最终训练出的模型都是对噪声样本拟合较好的“有噪声”的模型。
如果我们用这样的模型去判断和分类,准确度是很难超过经验丰富的“老司机”的,所以这样的模型并没有多大的意义。
那么基于永洪的产品 Yonghong Z-Suite ,我们可以怎么做呢?
对Z-Suite比较熟悉的朋友都知道,我们的产品里内置了常见的算法模型(分类,聚类,决策时,神经网络,关联模型,时序预测等),采用图形化操作,可以通过简单的拖拽,快速实现典型 数据挖掘 算法。
除此之外,还内置了R语言支持,提供了强大的模型扩展能力。
因此,我们借助这一能力,通过R语言模型扩展实现的算法,解决了有噪声样本标签分类的问题。
我们扩展实现的这种算法,是根据MIT的一篇论文(链接:https://arxiv.org/abs/1705.01936)提供的思路,将其与 XGBoost 分类算法结合而成的。
这种算法的思路如下:
首先,训练模型的样本数据来自于历史测量数据,数据的标签都是人工根据经验判断的,所以会发生标签误判的情况,换句话说,训练模型使用的是有噪声的样本数据。
然后使用常规分类算法比如 Logistic Regression、Bayes,SVM、XGBoost 等在有噪声的样本数据集上训练出分类器;
分类器对预测的正负标签给出概率(0~1),概率越大说明预测为正标签的可信度越高,概率越小说明预测为负标签的可信度越高,概率接近0.5的预测标签的可信度并不高,可能是有噪声的数据;
假定有噪声的数据在数据集中占比不大,如果剔除可信度不高的数据,用剩下的相对可靠的数据训练分类模型,那么分类器的准确度理论上将有所提高。
三、排除不可靠数据,提高模型准确度
基于以上思路,我们在 Yonghong Z-Suite 中实现的分类算法步骤如下(详细算法推导论证过程可参照上面提到的论文): 通过选定的二分类算法(我们使用的是XGBoost),利用有噪声样本数据进行模型训练,并得到每个样本x预测结果为true(true表示电子开关合格,false表示不合格,以下同)的概率g(x)。 计算样本数据中标记为true的比率Ps1(即样本数据中电子开关标记合格的百分比)。 计算门限概率LBy=1,如果上面第1步的预测概率g(x)大于LBy=1,则表示该样本的真实标签很可能是true(合格);同理计算UBy=0,如果上面第1步的预测概率g(x)小于UBy=0,则表示该样本的真实标签很可能是false(不合格)。
LBy=1定义为标记为true的样本数据的g(x)的期望;UBy=0定义为标记为false的样本数据的g(x)的期望 根据上面第2,3步得出的Ps1,LBy=1和UBy=0,计算出样本数据中的真实标签为true,但是被误标记为false的比率ρ0 =P(s=0|y=1),以及样本数据中的真实标签为false,但是被误标记为true的比率ρ1=P(s=1|y=0)。
这里面y表示真实标签,s表示样本标签。 然后根据贝叶斯公式计算出样本数据中标记为不合格但是实际合格的概率π0=P(y=1|s=0)和标记为合格但是实际不合格的概率π1=P(y=0|s=1)。 在标记true的样本数据中剪除g(x)最小的比例为π1的那些样本(正样本pruning过程);在标记false的样本数据中剪除g(x)最大的比例为π0的样本(负样本pruning过程);
这两类样本被认定为不一致的可能对预测结果产生干扰的错误标记样本,因此需要移除。 对剩余样本加权后(因为有样本移除,所以需要对剩余样本进行加权修正),重新训练模型。 根据生成模型对新的电子开关测试数据进行计算,判断其合格或不合格。
该算法通过排除训练模型中不可靠(不一致)的数据,提升了剩余数据的质量,并利用这些数据进行模型训练,因而提高了模型的准确度,有效的解决了有噪声样本训练的带来的模型不准的问题。
四、预测准确度提升20%
我们将该模型应用在上述电子开关测试项目,并将其与电子开关进行二次测试(对换下的电子开关的深入测试,基本可以认为是真实标签)的结果进行对比, 发 现预测准确度从人工预测的60%~70%提升到了80%左右,整体的预测准确度提升了近20% ,这为我们的客户带来了十分明显的价值,客户对我们的这一算法赞赏有加。
在此基础上,我们将 Logistic Regression、Bayes 和 XGBoost 三种模型集成到一起,作为 RankPruning 算法的基础模型。 测试结果表明,模型精度在 XGBoost 基础上,又有了近2%的额外的小幅提升。
亚瑟·克拉克说过:“任何足够先进的技术都等同于魔术。”
机器学习在今天互联网的环境里,可能已经不是什么新鲜事了,但是对于传统的工业和制造业来说,能够大幅度提升效率、节约成本的技术,就是能为他们带来价值的。
同样的,我们也觉得机器学习的真正应用不是通过概念或者思想的方式,而是通过实践。我们在把机器学习技术实际落地、想办法为客户创造价值的过程中,也在逐渐对机器学习的理解进入更深的层次。
我们将这个经验分享出来,目的是帮助大家在基于有噪声样本标签,进行故障检测和分类的时候,能够有更科学和精确的方式,也为大家在 大数据 领域机器学习的应用提供一些具有参考价值的案例。
本文由 永洪科技 投稿至 数据分析网 并经编辑发表,内容观点不代表本站立场,如转载请联系原作者,本文链接:https://www.afenxi.com/56378.html 。
数据分析
2018-06-23 07:46:00
华为 数据挖掘 方法论及案例介绍
数据挖掘 是 BI 领域的一个重要应用方向,BI指通过对行业的讣知、经验,结合数学理论、管理理论、市场营销理论,利用工具软件、数学、算法(如:神经网络、遗传算法、聚类、客户绅分等)对企业的数据、业务、市场迚行分析及预测,以图表、 数据分析 报告的形式支撑企业决策、市场营销、业务拓展、信息运营等工作。



作者:华为 BI研发部
出自:https://wenku.baidu.com/view/c2c82c61a21614791611286c.html
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2018-06-23 07:07:00
时间序列 分析+音乐=?
时间序列分析是一种常用的处理随时间变化数据的统计方法,它通过寻找数据过去的规律来预测其未来的发展趋势。时间序列分析广泛应用于自然科学和社会科学的各个领域,比如天气预报、销量预测等等。
而音乐,是反映人们现实生活情感的艺术,是人类的精神食粮。时间序列和音乐,两个听起来不太相干的事物能碰撞出什么样的火花呢?让我们在下面的故事中寻找真相。
有故事哦?
故事的主人公叫王大锤,他有一个相恋多年的女友苏小美。两人的爱情始于校园,从相识相知到相亲相爱,他们共同走过了四年的大学生活。
转眼又是一年毕业季,大学生活即将结束,人生将迈入新的旅程。在这一特殊时刻,王大锤也希望为自己的爱情开启一个新阶段,他决定向小美求婚,成为守护她一生的男人。
可是如何求婚才能给小美一个惊喜呢?王大锤犯难了……这时,作为王大锤好基友的慕容白同学,想出了一个好主意:“小美平时那么喜欢唱歌,你为她作一首独一无二的求婚歌,她一定会被感动的!”这个主意让王大锤眼前一亮。然而,理想很美好,现实很骨感。作曲这么高级的操作对于王大锤这种音乐小白来说,简直是难于上青天啊!
正所谓帮人帮到底,为了帮助王大锤同学实现作曲的目标,慕容白抛出了终极大招:“直接创作确实有难度,不过可以以一段现有旋律为基础,采用时间序列的方法进行乐曲改编,这样也能得到你的专属旋律哦~”
艰辛的音乐探索之路
虽然可以借助时间序列分析来降低改编乐曲的难度,但还是需要了解基本的乐理知识。于是,慕容白为好友王大锤开启了音乐小课堂。
一首音乐主要由曲调、节奏、力度等构成。我们常见的乐谱有两种,一种是简谱,一种是五线谱。简谱主要展示乐曲的主旋律,而五线谱可以展示所有的音乐要素。下图展示了我们熟悉的do re mi fa sol la xi do在五线谱和钢琴上的对应位置。
五线谱是一种世界通用的记谱法,主要由音符、谱号、谱表组成。五线谱中的内容非常复杂,它可以记录音域的高低、音阶的升降、弹奏的强弱以及多音弹奏形成的和弦等。对五线谱感兴趣的童鞋可以阅读下图了解每个符号的具体含义哦。
看完五线谱后,王大锤的内心是崩溃的……这么复杂的内容很难一时都掌握啊啊啊。别着急,在使用时间序列作曲时,我们可以把五线谱中的内容简化,只抽取乐曲中的主旋律,体现曲调和节奏即可,和弦、强弱、踏板什么的就不管了。
然后需要做的就是把主旋律变成数字,让时间序列模型可以“认识”乐曲。具体来说,我们将主旋律中的每个音符按照其在钢琴键盘上的对应位置编码成1到103的数字。熟悉钢琴的朋友可能会疑惑,钢琴不是只有88个键吗?怎么多出了几个?这是因为白健和黑键之间差半个音,但相邻的两个白健之间差一个音,为了保证音的跨度和数字的间隔相等,特意将没有黑键的部分也进行了编号。
此外,我们用数字的重复来体现音乐的节奏。比如一段旋律的节奏最小单位为半拍,那对于一个两拍的音符,就将其重复4次。这样我们就实现了乐谱的结构化,已经离成功不远了。下面进入真正的造音乐环节。
选乐曲
首先需要确定曲目。由于在乐谱结构化时只提取了主旋律,所以慕容白建议大锤可以选一首主旋律比较鲜明,和旋和伴奏较少的歌,一般来说纯音乐比较合适。王大锤还是懂小美的,因此他选择了小美最爱的钢琴曲《忧伤还是快乐》。
忧伤还是快乐 K.Williams – The Golden Piano
《忧伤还是快乐》原名《My Soul》,出自韩国作曲家July。这首歌夹带着淡淡的悲伤缓缓道来,然后节奏逐渐变得欢快,就像人生,由悲转喜,由苦到甘。虽然人生难免遇到忧愁和困苦,但是大锤希望能够为小美带来欢快和幸福。所以这首歌正和心意!
造音乐
王大锤将乐曲中反复出现的一段旋律作为训练集,并对它进行了结构化处理。从结构化之后的时序图中可以发现,这段旋律具有明显的周期性特征,属于非平稳序列,对该序列的平稳性检验也支持了这一结果。
对非平稳序列的分析方法,常用的有ARIMA模型和指数平滑法。ARIMA模型是一种常用的非平稳序列分析方法,它的实质是先对时序数据进行差分运算,使数据变为平稳序列,然后再建立ARMA模型。在确定性时序分析中,选择了holt-winters三参数指数平滑法,它可以削弱短期随机波动对序列的影响,使序列平滑,从而显示出变化规律。
ARIMA模型
由于原始序列属于非平稳序列,因此对非平稳序列进行差分处理,也就是计算t时刻到t-1时刻的差值。对于差分后的序列,可以用单位根检验来判断它的平稳性,用Ljung-Box检验来判断它的纯随机性。从下面展示的结果中看到,差分后的序列是平稳的、非白噪声序列,因此可以进行后续建模。
为了确定模型并选择阶数,对差分后的序列计算了ACF(自相关系数)和PACF(偏自相关系数),如下图所示,可以看出两者均有明显的拖尾特征。当序列表现出这种特征时,说明单纯使用AR模型或者MA模型已经不再合适,因此考虑用ARMA模型。通过进一步计算数据的EACF(延伸自相关系数),王大锤最终选择使用ARMA(1,1)模型对差分后的序列建模,也就是对原序列建立ARIMA(1,1,1)模型。
下图展示了模型估计的结果,可以看出AR部分和MA部分的系数都是显著的。此外,在建模结束之后还需要检验一下模型的有效性,也就是看模型的残差是否是白噪声。检验结果表明,没有证据表明残差是非白噪声序列,这说明建立的ARIMA(1,1,1)模型已经能够完全提取序列间的相关性,因此该模型是可以接受的。
接着进入最关键的一个环节,生成新乐曲。王大锤摩拳擦掌,能不能给小美一个惊喜就看它了!王大锤根据建立的模型对乐曲未来走势进行预测,通过这种方法自动的生成新旋律。但结果出来后,王大锤傻眼了,新生成的旋律波动并不明显,后期的乐曲都一直维持在相同的水平上,也就是一直在播放同一个音符,这可不好听。只能试试其他方法了。
指数平滑模型
由于序列具有明显的周期性特征,因此王大锤选择了holt-winters三参数指数平滑模型。平滑法是时间序列分析中一种常用的数据修匀技术,它可以削弱短期随机波动对序列的影响,使序列平滑,从而显示出变化规律。holt-winters三参数指数平滑模型认为一个序列受到水平因素(a t )、趋势因素(b t )和季节因素(s t )的影响,并给出不同因素之间相互作用的关系,因此可以处理既包含时间趋势项,又有周期性变化规律的时序数据。模型的具体形式和部分估计结果见下图:
同样,王大锤进行了预测编曲,发现新生成的旋律和原始乐曲的变动趋势差不多,保留了之前的周期性。把这次新生成的乐曲播放出来一听,惊喜的发现,哎呦,不错哦,立马决定求婚时就用它啦!!
改编后乐曲 来自狗熊会 00:00 00:41
Happy Ending
微风不燥,阳光正好,就像那天大锤和小美第一次约会时那样。此时此刻,王大锤拨动着手里的琴弦,悠扬的琴声触动了小美的心弦。王大锤终于说出了一直埋藏在心里的话,那句“你是否愿意”饱含深情与期待。小美也为大锤的的心意所感动,轻轻说出那句“我愿意” ……故事完美结局。
本文为专栏文章,来自:狗熊会,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/56324.html 。
数据分析
2018-06-22 14:30:00
大数据 文摘出品
编译:JonyKai、元元、云舟
对于 深度学习 和 机器学习 工程师们来说,正态分布是世界上所有概率模型中最重要的一个。即使你没有参与过任何 人工智能 项目,也一定遇到过高斯模型,今天就让我们来看看高斯过程为什么这么受欢迎。
高斯分布(Gaussian distribution),也称正态分布,最早由A.棣莫弗在求二项分布的渐近公式中得到。C.F.高斯在研究测量误差时从另一个角度导出了它。P.S.拉普拉斯和高斯研究了它的性质。是一个在 数学 、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。
正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟形曲线。
若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
高斯概率分布的数学表达式
在自然现象中随处可见 所有模型都是错的,但有些是有用的
—George Box
正在扩散的粒子的位置可以用正态分布来描述
正态分布有极其广泛的实际背景,生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。例如,在生产条件不变的情况下,产品的强力、抗压强度、口径、长度等指标;同一种生物体的身长、体重等指标;同一种种子的重量;测量同一物体的误差;弹着点沿某一方向的偏差;某个地区的年降水量;以及理想气体分子的速度分量,等等。
一般来说,如果一个量是由许多微小的独立随机因素影响的结果,那么就可以认为这个量具有正态分布。从理论上看,正态分布具有很多良好的性质,许多概率分布可以用它来近似;还有一些常用的概率分布是由它直接导出的,例如对数正态分布、t分布、F分布等。
数学原因:中心极限定理
二维空间上进行200万步的随机游走之后得到的图案
中心极限定理的内容为:大量独立随机变量的和经过适当标准化之后趋近于正态分布,与这些变量原本的分布无关。比如,随机游走的总距离就趋近于正态分布。下面我们介绍三种形式的中心极限定理:
独立同分布的中心极限定理
设随机变量X1,X2,……Xn,……独立同分布,并且具有有限的数学期望和方差:E(Xi)=μ,D(Xi)=σ^2 (i=1,2….),则对任意x,分布函数为
满足
该定理说明,当n很大时,随机变量
近似地服从标准正态分布N(0,1)。因此,当n很大时,
近似地服从正态分布N(nμ,nσ^2).该定理是中心极限定理最简单又最常用的一种形式,在实际工作中,只要n足够大,便可以把独立同分布的随机变量之和当作正态变量。这种方法在数理统计中用得很普遍,当处理大样本时,它是重要工具。
棣莫佛-拉普拉斯定理
设随机变量X(n=1,2,…,)服从参数为n,p(0该定理表明,正态分布是二项分布的极限分布,当数充分大时,我们可以利用上式来计算二项分布的概率。
不同分布的中心极限定理
设随机变量X1,X2,……Xn,……独立同分布,它们的概率密度分别为fxk(x),并有E(Xk)=μk,D(Xk)= σk^2,(k=1,2……)
若对任意正数τ,有:
对任意x,随机变量Yn的分布函数Fn(x),满足:
该定理说明:所研究的随机变量如果是有大量独立的而且均匀的随机变量相加而成,那么它的分布将近似于正态分布。
万变不离其宗
与其他很多分布不同,正态分布进行适当的变换之后,仍是正态分布。 两个正态分布之积仍是正态分布 两个独立的服从正态分布的随机变量之和服从正态分布 对一个正态分布进行高斯卷积还是正态分布 正态分布经过傅立叶变换之后仍是正态分布
简洁
奥卡姆剃刀强调一个哲学原则:在其他条件都相同下,最简单的解就是最好的解。
对于任何一个用正态分布拟合的随机分布,都可能存在一个多参数,更复杂,更准确的解法。但是我们仍然会倾向于选用正态分布,因为它在数学上很简洁。 它的均值(mean)、中值(median)和众数(mode)都相同 只需要用两个参数就可以确定整个分布
图形特性: 集中性:正态曲线的高峰位于正中央,即均数所在的位置。 对称性:正态曲线以均数为中心,左右对称,曲线两端永远不与横轴相交。 均匀变动性:正态曲线由均数所在处开始,分别向左右两侧逐渐均匀下降。 曲线与横轴间的面积总等于1,相当于概率密度函数的函数从正无穷到负无穷积分的概率为1。即频率的总和为100%。
相关报道:
https://towardsdatascience.com/why-data-scientists-love-gaussian-6e7a7b726859
本文为专栏文章,来自:大数据文摘,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/56138.html 。
数据分析
2018-06-20 09:07:00
作者 | Matthew Mayo 编译 | Liu Zhiyong 编辑 | Natalie 微信公众号“AI 前线”,(ID:ai-front)
1. 《统计思维:程序员数学之概率统计》Think Stats: Probability and Statistics for Programmers Allen B. Downey|著 张建峰 等|译
英文:http://www.greenteapress.com/thinkstats/
中文:https://union-click.jd.com/jdcd=eysyRS
本书是 Python 程序员对概率和统计的介绍。
本书强调了一些简单的技术,您可以利用这些技术来探索真实的数据集并回答有趣的问题。该书的样例基于美国国立卫生研究院的数据,并鼓励读者使用真实的数据集展开项目。
2. 《贝叶斯方法:概率编程与贝叶斯推断》Probabilistic Programming & Bayesian Methods for Hackers Cam Davidson-Pilon|著 辛愿 等|译
英文:http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers
中文:https://union-click.jd.com/jdcd=noCI83
本书以计算 / 理解为主,数学为辅,介绍了贝叶斯方法理论和概率编程。
贝叶斯方法是对数学分析自然而然的估计与推论,但贝叶斯方法的推理非常晦涩、繁杂、难懂。通常介绍贝叶斯推断之前,要先介绍两到三章的概率论的相关内容。不幸的是,由于大多数贝叶斯模型的数学复杂性,读者只能看到简单的、人为编造的示例。于是给读者留下一种“贝叶斯似乎也没什么用处”的错觉。事实上作者本人在刚开始学贝叶斯方法就有过这种尴尬。
3. 《深入理解机器学习:从原理到算法》Understanding Machine Learning: From Theory to Algorithms Shai Shalev-Shwartz 等|著 张文生|译
英文:http://www.cs.huji.ac.il/~shais/UnderstandingMachineLearning/
中文:https://union-click.jd.com/jdcd=RFII4v
机器学习是计算机科学发展最快的领域之一,具有深远的应用。本书的目的是以原则性的方式介绍机器学习及其提供的算法范例。本书提供了机器学习的基础知识,以及将这些原理转化为实际算法的数学推导的说明。在介绍基础知识之后,本书还涵盖了以前教科书没有提到的大量重要的课题。课题包括讨论学习的计算复杂性、凸性和稳定性的概念;重要的算法包括随机梯度下降、神经网络和结构化输出式学习;以及新兴的理论概念,如 PAC-Bayes 方法和 compression-based bounds 等。
4. The Elements of Statistical Learning Trevor Hastie 等|著
英文:http://statweb.stanford.edu/~tibs/ElemStatLearn/printings/ESLII_print10.pdf
中文:无
这本书在通用概念框架的基础上阐述了统计学领域的重要思想。虽然本书的许多方法都是基于统计学的,但它的重心在概念上而不是数学理论上。本书以彩色配图的形式给出了大量的样例。本书对统计学家以及任何对科学或工业 数据挖掘 感兴趣的从业人士来说都是一本不可多得的好书。本书的覆盖面很广,从监督式学习(预测)到非监督式学习都有所涉猎。书中还提到了神经网络、支持向量机、分类树、预测和分级助推之类的其他话题,这也是相关话题在所有书籍中首次全面论述的一本书。
5. 《统计学习导论:基于 R 应用》An Introduction to Statistical Learning with Applications in R Gareth James 等|著 王星|译
英文:http://www-bcf.usc.edu/~gareth/ISL/
中文:https://union-click.jd.com/jdcd=bf87xm
本书介绍了统计学习方法。本书主要面向非数学专业的高年级本科生、硕士研究生和博士生。本书包括大量的 R 语言的实例,这些实例详细解释了如何将统计方法使用真实世界情形设置的详细解释,这些资源对于有志于成为 数据科学家 的人来说应该很有价值。
6. Foundations of Data Science Avrim Blum 等|著
英文:https://www.cs.cornell.edu/jeh/book.pdf
中文:无
虽然计算机科学的传统领域仍然十分重要,但越来越多的研究人员目光转向了如何利用计算机从应用中产生的大量数据中理解和提取有用的信息,而不仅仅是用计算机解决实际的应用问题。鉴于上述原因,本书涵盖了未来四十年里都会非常有用的技术理论,这些理论的重要性,就相当于自动控制的原理和算法,它们在过去四十年里对学生们在数据科学上的研究起到了很大的作用。
7. 《写给程序员的 数据挖掘 实践指南》A Programmer’s Guide to Data Mining: The Ancient Art of the Numerati Ron Zacharski|著 王斌|译
英文:http://guidetodatamining.com/
中文:https://union-click.jd.com/jdcd=GQ9u7w
本书的编写理念是遵循一个循序渐进的方法,引导读者使用作者提供的 Python 代码进行练习和实验,而不是被动地去阅读本书。作者建议读者们可以积极参与这个编程的实战中去,去尝试数据挖掘的技术。本书通过将知识点分解成一系列小步骤,当读者学完本书时,就可以掌握一个对于数据挖掘技术的基本理解了。
8.《 大数据 : 互联网大规模数据挖掘与分布式处理》Mining of Massive Datasets Jure Leskovec 等|著 王斌|译
英文:http://mmds.org/
中文:https://union-click.jd.com/jdcd=2fudaj
本书由斯坦福大学 CS246:Mining Massive Datasets 和 SC345A:Data Mining 课程的内容总结而成。
本书的设计同斯坦福课程一样,假设读者没有相关的预备基础知识。如果读者想要了解更深层的东西,大多数章节都附有参考书目,读者可以按此索引进行深入学习。
9. 《深度学习》Deep Learning Ian Goodfellow 等|著 赵申剑 等|译
英文:http://www.deeplearningbook.org/
中文:https://union-click.jd.com/jdcd=HK6Cxh
本书旨在帮助读者进入机器学习的领域,尤其是深度学习。网上有完整的在线免费版可供阅读。
10. 《机器学习训练秘籍》Machine Learning Yearning Andrew Ng|著
英文:http://www.mlyearning.org/
中文:微信公众号 ngDeepLearningai
人工智能 、机器学习和深度学习正在改变着许多行业。但是建立一个机器学习系统需要你做出以下的一些决策: 应该收集更多的训练数据吗? 应该使用端对端的深度学习吗? 如何处理与测试集不匹配的训练集? 等等……
11. Python 数据科学手册 Python Data Science Handbook Jake VanderPlas|著 陶俊杰 等|译
英文:https://github.com/jakevdp/PythonDataScienceHandbook
中文:https://union-click.jd.com/jdcd=KBvZ05
本书介绍了使用 Python 处理数据所必需的核心库:IPython、NumPy、panda、Matplotlib、Scikit-Learn 以及相关包。本书要求读者需熟悉 Python 语言。如果读者想快速学习 Python,可选读作者另一本著作 A Whirlwind Tour of Python,该书是为计算机相关人员准备的快速入门。
12. Neural Networks and Deep Learning Michael Nielsen|著
英文:http://neuralnetworksanddeeplearning.com
中文:无
本书分两部分: 神经网络:一种唯美的、从万物生长中汲取灵感的编程范式,使计算机能够从数据中学习; 深度学习:一系列强有力的技术,让神经网络壮大起来。
目前,神经网络和深度学习在图像识别、语音识别和自然语言处理等诸多问题提供了最佳的解决方案。本书将教会读者许多神经网络和深度学习背后的核心概念。
13. 《贝叶斯思维》Think Bayes Allen B. Downey|著 许杨毅|译
英文:http://greenteapress.com/wp/think-bayes/
中文:https://union-click.jd.com/jdcd=zHle26
本书讲述的是如何使用计算方法处理贝叶斯统计。
作为 Think X 丛书之一,本书的编写理念是,如果读者会编程,就可以用这项技能来学习其他科目了。
多数关于贝叶斯统计的书,用的都是数学符号,也就是以数学概念如微积分来表达其思想。本书用的是 Python 代码,取代了数学符号,用离散近似代替连续数学。结果,数学里的积分变成了求和,概率分布的运算大多成了简单的环。
14. Machine Learning & Big Data Kareem Alkaseer|著
英文:http://www.kareemalkaseer.com/books/ml
中文:无
本书尚未完成,将随着时间推移进一步完善。本书的理念是,在理论和实践之间取得平衡,让软件工程师能够轻松使用机器学习模型,而不必过分依赖库。多数情况下,模型或技术背后的概念都比较简单直观,但在细节或术语上就有所欠缺。另外,现有的库通常都可以解决手头的问题,但它们都是黑盒,它们多数还有自己的抽象方法和结构,看不到基本概念。本书的目的就是要把这些隐藏的基本概念弄清楚。
15. Statistical Learning with Sparsity: The Lasso and Generalizations Trevor Hastie 等|著
英文:https://web.stanford.edu/~hastie/StatLearnSparsity/
中文:无
在过去的十年里,计算机和信息技术发生了爆炸式增长。随之而来的是医学、生物学、金融和市场营销等领域有了大量数据。本书在通用的概念框架中阐述了这些领域的重要思想。
16. Statistical inference for data science Brian Caffo|著
英文:https://leanpub.com/LittleInferenceBook
中文:无
本书是 Coursera 课程 Statistical Inference(推论统计学)的配套书,也是 Data Science(数据科学)专业课的一部分。然而,如果读者不上这门课,本书也可阅读。
本书目的是对重要的推论统计学领域进行介绍。目标读者是有数学背景、具备编程能力的学生,帮助他们把这样的技能用到数据科学或统计学中去。
17. 《凸优化》Convex Optimization Stephen Boyd 等|著 王书宁 等|译
英文:http://stanford.edu/~boyd/cvxbook/
中文:https://union-click.jd.com/jdcd=kBrTS3
本书是讲述关于凸优化的问题。凸优化是一类特殊的数学优化问题,最小二乘法和线性规划问题也属于此类。众所周知,最小二乘法和线性规划问题有相当完整的理论,在各种应用中都有出现,并且可以非常有效地用数值方法求解。本书的基本要点是,对于较大的凸优化问题,也可以这样用编程的方式来解决。
18. 《Python 自然语言处理》Natural Language Processing with Python Steven Bird|著 张旭 等|译
英文:https://www.nltk.org/book/
中文:https://union-click.jd.com/jdcd=RSf7bd
本书是关于自然语言处理的书。所谓“自然语言”,是指一种人类日常交流所使用的语言:英语、印地语或葡萄牙语等。与编程语言和数学表示法等人工语言不同的是,自然语言是在代代相传的过程中而进化的,很难用明确的规则来解析其中的含义。我们将把自然语言处理广泛地应用于任何一种自然语言的计算机操作。
本书是基于 Python 编程语言和一个名为自然语言工具包(NLTK)的开源库而写成的。
19. Automate the Boring Stuff with Python Al Sweigart|著
英文:https://automatetheboringstuff.com/
中文:无
你是否曾经花费好几个小时来重命名文件、或者更新表格里的几百个单元?这些任务是多么乏味,那就让电脑来为你效力吧!
Python 可以帮你完成这些乏味的任务。本书将教会你如何使用 Python 编程来帮你完成那些乏味的任务。本书不要求读者有编程经验,只需跟随本书即可掌握相关编程技巧。一旦掌握编程的基础知识,创建可以毫不费力地执行自动化的 Python 程序将是一件手到擒来的轻松事儿。
20. 《社会媒体挖掘》Social Media Mining: An Introduction Reza Zafarani 等|著 刘挺 等|译
英文:http://dmml.asu.edu/smm/
中文:https://union-click.jd.com/jdcd=VyZxUc
过去十年,社交媒体的发展改变了个人互动和行业开展业务的方式。个人通过社交媒体互动、分享和消费内容,以前所未有的速度生成数据。了解和处理这种新型的数据,从而收集可操作的模式,为跨学科研究、新算法和工具开发提供了挑战和机会。社交媒体挖掘整合了社交媒体、社交网络分析和数据挖掘,为学生、从业者、研究人员和项目经理提供了一个方便、连贯的平台,以了解社交媒体挖掘的基础和潜力。
参考链接:
https://www.kdnuggets.com/2017/04/10-free-must-read-books-machine-learning-data-science.html
https://www.kdnuggets.com/2018/05/10-more-free-must-read-books-for-machine-learning-and-data-science.html
本文为专栏文章,来自:AI前线,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/56110.html 。
数据分析
2018-06-18 07:49:00
什么是“目标客户优化模型”?
“目标客户优化模型”其实是一个从理解到验证的循环过程。在这个过程中,我们通过商业理解,提炼出不同维度的“目标客户”指标,通过数据的获取、建模与分析,刻画出真正“目标客户”的特征,对这个人群采取行动,获得反馈数据,再放回我们的模型中,验证其有效性。
以一张图来概括,就是下图:
有人说销售是一个从找到线索到获得回款的过程,但一个成功销售的“底层架构”,必将是一个在分析中不断优化商业理解、找准目标的过程。
模型拆解:一个制造业企业的案例
光说不练,多好的理论看起来都显得干巴巴的。下面我们就通过一个案例,带您一步步地拆解我们的模型。
一般企业都会预判目标客户或者借鉴其他企业的目标客户识别规则,在已保有和潜在的客户中区分出目标客户,针对这些客户展开专项营销策略。那么在统计的时候可以优先看一下这些客户的占比情况,比如该案例中的企业目标客户属于“房地产行业”,且“企业规模在千人以上”,这些客户在过去的几年间快速发展,采购规模成倍的增长,为企业带来了巨大的收益。而随着市场的低迷,每年符合要求的客户越来越少,企业现在希望修改目标客户的筛选规则,从而优化营销策略。
首先,是三个KPI:
1、主指标:今年订单金额
副指标:达成率(今年订单金额/今年目标金额)
这个指标可以接合当前时间,非常简单粗暴地来看你的目标客户找对了没有。比如现在已经6月上旬了,但是目标达成率居然只有不到30%,肯定了问题的存在;
2、主指标:目标客户数量
副指标:贡献度(目标客户金额/今年订单金额)
这个指标可以看出,你想象中的“目标客户”到底给你带来了多大贡献,仅占今年订单金额的9%,再次确认问题的严重性。
3、指标:目标客户占比(目标客户数量/所有客户数量)
最后,根据“二八原则”,80%的收益来自20%的客户。这里目标客户既没有达到20%,收益更是小的可怜。从以上3个KPI,可以确定“目标用户”需要调整。
锁定问题之后,我们当然需要修改目标客户的筛选规则,从而优化营销策略。
但是,怎么修改呢?这就需要继续拆解我们的数据。
首先,最“粗”的一层,就是区分新老客户。我们发现,老客户占全部客户的73%,同时,在老客户中,我们想象中的“目标客户”只占13%。那么,锁定老客户为深入挖掘的对象。一方面,老客户对产品的黏性更高,更容易转化;另一方面,维护老客户、转化老客户的成本,也比新客户要小很多。
所以,在此基础上,我们继续拆分“老客户”群体。
先看行业差异,发现相比于我们设定的标准——房地产业,制造业与金融业的客户数量、成交金额都更为突出。
接下来看几个行业在近几年的交易规模趋势,这里忽略2018年不看,因为2018年才刚刚过去一半,数据不全。可以看出,绿色面积所代表的制造业是最棒的;
然后,按成交规模来看,发现差异不是很明显,没关系,我们再换一个角度。
气泡图左,横轴是交易次数,纵轴是交易总周期,气泡的大小代表金额多少。我们发现交易次数多、同时与我们缔结关系长的,同时交易金额还大的,是右上角几个蓝色的气泡——蓝色代表制造业;
气泡图右,横轴、纵轴、气泡大小不变,颜色分组以“地区”为标准,我们发现,又以蓝色代表的“北方地区”拔得头筹。
现在我们已经可以锁定北方区域、制造业、金融业这三个关键词了。那么,还能不能继续细化呢?
左边组合图:横轴为年份,蓝色为客户数量,紫色为订单数量,绿色线条代表着交易金额。我们发现,北方市场的制造业与金融业,客户与订单量虽然逐年减少,但交易规模却在逐年上升!这说明,虽然我们客户数量少了,但是质量却很高,在我们这里下的单越来越大。
右边组合图:横轴为年份,蓝色为客户数量,紫色为订单数量,绿色线条代表着交易金额,与左图一样,但通过过滤,只留下了制造业(因为在前面的分析中,制造业比较突出),我们发现,制造业的客户交易规模上升十分明显。
到这里,其实我们已经锁定新的“目标客户”,并且可以描述出他们在哪儿了:
不过,虽然刻画出了特征,我们还希望更进一步,知道具体客户的具体维系方式。数据可以告诉我们答案么?当然!
依旧是利用气泡图,只是这一次,里面的泡泡少了很多——没错,因为这里只剩下了刚才筛选出的北方区域制造业用户。
横轴为交易次数,纵轴为交易周期,每个气泡代表一个客户,气泡大小代表着交易金额的多少。现在我们可以对这些客户进行进一步细分。
右上角:交易次数多、交易周期长;已经是我们的“目标客户”了,应该重点保护,维系关系;
右下角:交易次数多、交易周期短;这是我们的“潜在目标客户”,需要保持长期合作,向右上角转化;
左上角:交易周期长,交易次数少;这也是我们的“潜在目标客户”,需要通过营销手段刺激多次消费,向右上角转化;
左下角:交易次数少,交易周期短;保持正常维护,向左上或右下转化。
至此,我们已经完成了从商业理解到特征刻画的一系列过程。不过,想要实现模型的“优化”魅力,还需要一个重要的步骤——行动!根据以上洞察,制定相应的营销策略,努力运营一段时间,然后再将反馈的数据放回到这个看板里,进行验证。
还记得这个图吗?
本文由 数据观 投稿至 数据分析网 并经编辑发表,内容观点不代表本站立场,如转载请联系原作者,本文链接:https://www.afenxi.com/55810.html 。
数据分析
2018-06-14 23:03:00
大数据 文摘作品
编译:Zhifu、雪清、元元、小鱼
本文覆盖数据科学求职全过程。从申请到面试,到拿offer之后的协商,所有细节一应俱全。每个阶段都有作者丰富的个人感悟以及链接资源~
内容不仅适用于有兴趣在美国申请数据科学相关工作的求职者,大体上也适用于各种技术工作的申请。
工作申请
在网上打造个人IP
请 谨慎处理自己在社交网络上公开的信息 。
比如,检查你在Facebook或者其他社交媒体上的隐私设置,确保公开的范围适当。很多公司的网申表格中都可以选填推特账号,除非你的推特主要用于专业用途(例如,介绍数据科学相关资源或晒宠物),否则不要填写。
如果你有GitHub账户,建议使用Pin功能优先展示你希望别人看到的项目,并添加解释该项目的README文档。 另外,我强烈建议你创建自己的博客,用于展示数据科学相关的内容,例如,你做过的项目,机器学习方法的解释,或者参加会议的摘要。
如果你还是认为写博客浪费时间,请参考Dave Robinson撰写的相关文章。如果你使用R,可以尝试使用blogdown来创建网站。Emily Zabor为blogdown写了一篇很棒的教程。另外,你还可以在Mara Averick创建的资源列表上找到更多的关于blogdown的资源。如果你不使用R,你可以直接使用Hugo(blogdown构建在Hugo的基础之上)搭建个人博客,或者用更简单的方式——在Medium网站上创建博客。
相关链接:
http://varianceexplained.org/r/start-blog/
https://bookdown.org/yihui/blogdown/
http://www.emilyzabor.com/tutorials/rmarkdown_websites_tutorial.html
https://maraaverick.rbind.io/2017/10/keeping-up-with-blogdown/
职位寻找与评估
广撒网
数据科学家 有很多别名,包括产品分析师、 数据分析师 、研究科学家、量化分析师和机器学习工程师。类似的职位在不同公司中头衔也不一样。有些公司还在不断改变头衔所代表的职能(Lyft最近将 数据分析 师更名为数据科学家,然后又更名为研究科学家)。
就数据分析师与数据科学家的区别,现在行业内也没有达成一致意见(参见Mikhail Popov最近发表的一篇总结不同观点的文章)。在寻找工作的时候,你可以搜索上面提到的所有头衔以便更广泛的查找职位,然后根据职位描述来评估自己是否合适。如果你对初创企业感兴趣,Angelist上有数千个职位,其中许多职位都列举出了薪资范围。
相关链接:
https://eng.lyft.com/whats-in-a-name-ce42f419d16c
https://mpopov.com/blog/2018/5/24/data-analyst-vs-data-scientist-industry-perspectives
建立自我认知
与其去申请你发现的每一个与数据科学相关的工作,不如 先想想你自己最感兴趣的方向 。当我在规划职业道路以及准备求职的时候,我发现一篇关于A型和B型数据科学家的区别的文章非常有帮助。
A型数据科学家善于分析(Analysis):他们具有过硬的统计背景,能够处理混乱的数据并擅长于结果分析。B型数据科学家善于创建工程(Build):他们具有很强的写代码技能,可能曾经担任软件工程师,并且专注于将机器学习模型(如推荐系统)应用到产品中。
还有一点你需要考虑的是,你希望你所就职的公司在数据方面目前处于哪个阶段(参见Robert Chang文章中的讨论)。在一家小公司工作的好处是你可以尝试数据科学的不同领域;大公司更专业化,因此你可能没有机会尝试创建一个终身价值模型的同时调整推荐系统。而且,许多问题(如数据工程的问题)都已经被抽象出来,无需自己解决。
另一方面,小公司通常有数据质量差,文档不完整和运行速度慢的问题。虽然公司所处阶段与公司规模相关,但是也有可能有超过百岁的大公司在数据科学方面依然处于在蹒跚起步的阶段。
相关链接:
https://www.quora.com/What-is-data-science/answer/Michael-Hochster
https://medium.com/@rchang/my-two-year-journey-as-a-data-scientist-at-twitter-f0c13298aee6
不要过度追求完美
你在这个领域的第一份工作可能不是你梦寐以求的职位。相较于苛求最完美的工作,在同专业领域内换工作,或者将数据科学引入当前的工作中更加容易。即使你最终希望离开现在的领域,一步登天也是不现实的,你可能需要先考虑跳到一个 既离目标领域更近,又可以施展自己其他才能 的职位。
这并不意味着抛开所有要求和偏好,而是说你需要有一定的 灵活性 。工作一两年后跳槽换工作都很正常,你也不必想着自己的未来15年都被束缚了。对我而言,第一份工作最重要的是一个支持性环境,因为在这样的工作环境中,我可以向周围很多资深的分析师学习。正如Jonathan Nolis指出的那样,在进入职场打拼前,你无法确切知道自己想要什么,即使是糟糕的工作,你也可以从中学习,所以不要有太大压力。 太棒了!我想在“不要过度追求完美”部分补充一点。你不应该过度追求完美,而且你应该认识到绝对完美是不现实的。你以前从来没有当过数据科学家,你怎么可能提前知道你会喜欢什么职位?
在我职业生涯的早期,我花了很多心血来努力弄清楚哪些工作对我来说是“正确”的,我究竟需要什么。但是现在我意识到即使一份糟糕的工作也是珍贵的经验,它们帮助我认清哪些是重要的事情。
——Jensen Harris推文
不要低估自己
职位描述通常是具有一定灵活性的要求清单。如果你满足其中80%的要求(例如,你的工作经验比要求的少上一年,或者你没有使用过他们要求的某项技术),但其他方面很合适,你还是应该申请这份工作。
但是,请谨慎对待要求“全能”的职位描述——有计算机科学博士学位,同时也是一名数据科学家。拥有5年以上的工作经验,并且在最前沿的统计学,深度学习方面是专家,还擅长于和业务合作伙伴沟通。除此之外还列出了从完成生产级别的机器学习模型,到创建报表,到运行A/B测试的大量要求。这通常意味着这些公司不知道他们具体需要哪些技能,他们希望招聘一个全能的数据科学家,能够一个人在没有任何支持的情况下解决所有问题。
在LinkedIn上查找相关的联系人
在你感兴趣的公司中,有你认识的员工吗?如果没有,请查看你校友网络中是否有人就职于该公司(包括你参加过的训练营,大学校友,你在某个夏天加入的足球队)。你也可以查找你朋友的朋友,看看你的朋友是否愿意引荐。
许多工作可能有数百个甚至数千个竞争者,如果有人推荐你,或者告诉你他们团队具体的要求,对你来说都有着极大的帮助。如果你确实打算寻求别人的帮助,请你花点时间斟酌求助措辞。尤其是在你不认识这个人的情况下,你需要进行多方面研究,并且参考他们的背景或公开信息。
参加聚会和会议
有的时候招聘经理会在参加聚会或者会议的同时招募员工。你也可能会遇到在你感兴趣的公司或子行业工作的人。你可以问他们是否有时间做个信息采访,这样你就可以加深自己对于该领域的理解。如果你直接问他们公司是否有空缺的职位,或者是否可以推荐你,他们可能会让你去浏览公司的招聘页面,你也错失了被推荐的机会。提前建立好你的人脉很重要——因为以强烈的需求开场很难建立双方互惠的人际关系。
如果你想了解更多关于如何构建人脉的方法,请参考:
https://www.themuse.com/advice/3-steps-to-a-perfect-informational-interview
http://hookedondata.org/Building-Your-Data-Science-Network-Reaching-Out/
简历和求职信
简历一页就好
你不用列出你曾经做过的所有事情。你可以尝试制作一份包含所有工作履历的简历模板,然后针对每份工作的要求补充最相关的内容。你也不需要把曾经使用过的每一项技术都列入清单,把重点放在你熟悉的那些就好。
一个来自于招聘人员的小提示:“不要使用图表来展示你在某些技术方面的经验等级。如果你的Python技能条是满格,就意味着你真的100%的了解Python吗?”如果一页纸的空间不够,你简历又有自我总结的部分,你完全可以舍弃它,因为自我总结已经不流行了。如果你来自学术界并且有工作经验,如果雇主招对博士学位不作要求,职位也并非研究岗位,你可以考虑舍弃简历中的论文部分。
校对简历
在你的“简力”上出现拼写错误或语法错误,可能会让你的申请以最快速度被否决。请使用“拼些检查”功能,并且让“一俩个”朋友帮你检查。
别放自己的大头照
虽然这在欧洲和南美的一些国家很常见,但在美国并不合适。
根据岗位制作简历
大公司经常用简历自动筛选系统来检测关键词。首先你可以从职位描述中找到一些关键词。然后,你可以使用像TagCrowd这样的工具来查看哪些单词最常见。比如说,领导力(Leadership)是否比管理(Management)更常见? 应该用NLP还是用自然语言处理(Natural language processing)?最后,你需要修改简历中的关键字来匹配筛选系统的关键字。
相关链接:
https://tagcrowd.com/
每一项内容从动词开始
比如写“分析了300篇论文”,而不是“我分析了300篇论文”。
在可能的情况下量化你的成果
不要写“对我们的排名算法进行实验”,而是写“进行了60多次实验,并且我带来了230万美元的额外收入。”
相关链接:
https://www.themuse.com/advice/how-to-quantify-your-resume-bullets-when-you-dont-work-with-numbers
写一封求职信
如果有需要提交求职信的地方,请 一定提交 。有些公司会筛掉那些没有写求职信的候选人。就像你的简历一样,你可以做一个求职信模板,在你需要的时候补充对应的段落。至少在求职信中为每家公司单独撰写第一段和最后一段内容,并确保这些公司的名字正确无误!
求职信最好包括你对公司的研究,还有你对这个职位感兴趣的具体原因。这两部分内容你写的越具体越好。你可以试着找找招聘经理的名字,这样你就可以信的开头写上他们的名字,而不是笼统写“亲爱的招聘经理”。
如果你想要获得更多关于推荐信的指导,请戳:
https://www.themuse.com/advice/the-3-rules-of-addressing-your-cover-letter
https://www.themuse.com/advice/how-to-write-a-cover-letter-31-tips-you-need-to-know
https://www.themuse.com/advice/5-common-cover-letter-phrases-that-are-losing-you-the-job
正如Jesse Maegan在推特中写到: 数据科学求职小提示:
一些建议表明,求职信并不重要,所以你只需要将简历重命名为求职信,或者写一个句“这是我的求职信”就可以了。
这个建议很糟糕。
面试
准备和练习
面试官可能会问到两种主要类型的问题—技术和行为。对于诸如“述说一次与团队成员发生冲突的经历”或“你最大的优势是什么”等行为问题,请使用情景—行为—结果模型来进行描述:描述你当时所面对的情况,你是如何处理它的,以及结果如何。
尽量使你的答案 简短而全面 。你可以提前为这些问题列一个清单,并考虑哪些经历和性格特征最适合你所面试的具体工作。对于技术问题,你需要了解面试结构。面试结构和问题类型的范围非常广泛:你可能得做一套带回家完成的测评,回答计算机科学问题(例如反转二叉树),解释随机森林模型,做展示,编写SQL代码等。
提前知道题型 会有很大帮助。你还可以查看Glassdoor针对面试过程的评论,并从自己的人脉网找找是否有人在那家公司面试过。在第一轮电话筛选过程中你也可以直接询问HR面试过程中会出现的题型和范围。如果你要进行多轮面试,你可以询问每轮的内容和结构是什么(例如,“我需要做白板编程吗?”)。一旦你知道面试的内容,你就可以集中准备。
面试过程中,如果你遇到了问题,可以试着说:“我不确定,但我会考虑这样去解决它。”通常,面试官评估的是你如何解决问题,而不是你是否回答正确。欲了解更多建议,请参考Trey Causey的数据科学就业市场经验,Erin Shellman的数据科学工作着陆指南,还有Mikhail Popov的维基媒体基金会面试数据分析师的过程。
相关链接:
http://treycausey.com/data_science_interviews.html Crushed it! Landing a data science job
Hiring a data scientist
你的简历中的任何内容都有可能被问到
如果你在简历中列出了在六年前的一次实习,或者将AWS列为技能,那么请准备好回答相关的问题。
研究公司背景
在撰写求职信时你做了一些准备工作,但是一旦进入面试环节,就需要做更深入的研究。 除了下文的建议外,你还需要了解面试官的专业成就。 有一次,我面试的候选人谈及我做过一个展示并提出了一些相关的技术问题,我对此印象非常深刻。 尤其当你要面试一家初创公司,请花一个小时做这项研究。公式如下:
1.浏览Crunchbase,找出资本来源,投资者等
2.浏览LinkedIn,看看有谁在那里工作?
3.浏览Glassdoor,了解公众对公司有什么看法?
4.浏览公司网站,关注所有你能访问到的信息。
——Jensen Harris推文
准备好问题
每位面试官都应该会留出时间来回答问题。如果他们不这样做,那就糟糕了!面试是一个双向匹配过程:你在评估他们的同时,他们也在评估你。 如果你不知道该问什么,请查看Julia Evans的清单。她将所有的问题分为诸如生活质量,公司文化和管理实践等类别。想想什么对你来说最重要!
你可以向每位面试官询问不同的问题,以最大限度地提高你可以得到的答案数量,但你也可以尝试向多个人询问相同的问题,看看他们的答案是否有差异。 如果是初创公司,我强烈建议查看下面链接中的问题清单。
相关链接:
https://jvns.ca/blog/2013/12/30/questions-im-asking-in-interviews/
https://twitter.com/jensenharris/status/988967889330819072
不要说出薪水数目
不要告诉他们你目前的薪水或你对这一职位的期望薪水。在某些地方,包括纽约市和加利福尼亚州,向你询问你现在的工资实际上是非法的。如果你说出一个数目,他们有可能会给你一个偏低的报价。他们的报价不应该取决于你目前的薪水或期望,而是取决于你在人才市场上的价值,并且与同等条件下你同事的薪水一样!
如果申请表上有这样问题,请填上“不适用”或“可灵活调整”,如果不得不写数字,则填入“0”并在其他地方写上:“注意:我在工资问题上填入了0美元。如果我们双方都觉得雇佣关系很合适,我对薪水问题很灵活。”如果你在面试中被问到了薪水问题,可以这样转移话题:“在讨论薪水之前,我想了解更多的关于职位的信息,并专注于我能给公司带来什么价值。我相信,如果我们都认为彼此是很好的选择,我们可以商量出一个具有竞争力的整体薪酬方案。”
如果问题是关于你目前的工资,而你处于一个薪水较低的不同工作类型/行业,你可以这样说:“这个职位与我目前的工作相比大有不同,不如讨论一下我在贵公司的主要职责,并最终确定这个职位的合理薪酬。”
如果他们坚持想知道你的期望薪资,那么在研究该行业和该公司的工资标准的基础上给出一个较大的范围。例如,你可以说:“从我的研究和过去的经验来看,我认为基本工资在9.5~12万美元之间比较合理,但我最感兴趣的是职位和整体薪酬方案的契合程度。”你可以查看H1B签证数据、Glassdoor和paysa,给自己定一个大概的范围。多和朋友交流!知识就是力量。
相关链接: HOW TO ANSWER: What Are Your Salary Expectations?
https://www.themuse.com/advice/answer-illegal-salary-question-right-way
也有人乐意交流薪资信息,例如Sharla Gelfand在推特中写到: 调查薪酬期间,如果你想把你的薪水数目发给我,我的私信总是开着的。如果你做数据方面的工作,坐标在多伦多,或者在技术岗有0-3年的工作经验,我们对你的薪酬水平非常感兴趣。如果你是用户关系管理经理(URM),我也会告诉你我的工资。知识是力量!
优雅地处理拒绝
在求职过程中,你难免被拒绝,也许这样的事会发生十来二十次。数据科学是一个充满竞争的领域,被拒绝是每个人都会经历的过程。如果他们拒绝你(相对于从不回信),你可以礼貌地表达你的沮丧(例如“很遗憾听到这个消息”),并感谢他们曾经考虑过你。
你可以要求反馈,但要知道许多招聘经理将无法提供给你,因为他们不希望反馈被解读为歧视而受到起诉。花一点时间来平复心情,但不要在公共场合或招聘经理面前大骂一场。这种做法不会改变结果,只会损害你的专业声誉。
Jesse Maegan在推特中也提到: 有一件事情应该不言而喻,但我们必须指出,优雅地处理拒绝很重要。数据科学职位竞争激烈。但在公共场合崩溃、给招聘经理发送讨厌的电子邮件等行为很糟糕。
拿到offer之后
首次回复
对于最初的offer,你可能会收到电话,或是包含详细信息的电子邮件,或要求通过电话来检查这项offer的电子邮件。在所有情况下,你都需要确保自己表达出了对此机会的兴奋和感激。但不要立刻接受offer:你可以要求以书面形式获取整份offer,说你需要检查一下,并询问你是否可以在几天后再联系。这就为协商奠定了基础,如果你正在考虑其他offer,也可以为你提供时间。如果你需要更多信息(例如入职日期,健康保险信息),你应该在第二次对话之前进行询问,以便你可以全面了解情况。
玩转多个选择
不幸的是,你可能无法同时获得所有你感兴趣的公司的offer(或拒绝)。更有可能的是,当你收到一份offer时,你可能正在某家公司的最后一轮面试中,收到了另一家公司的电话回复,或是还在等待其他的公司的回复。 如果你正在等待的工作机会中有你“梦想中的工作”呢?
如果你是在公司的最后一轮面试中,请告诉他们你的其他选择。 重申你对他们的公司有多么感兴趣(如果他们是你的首选,告诉他们!),但请说明你已收到另外一份offer,并希望他们能够在X日期之前给你一个决定。
招聘人员明白,你可能同时在面试其他几家公司,他们常常需要处理这种情况。如果你还在另一家公司面试的初期,他们不太可能加快面试速度并及时给出offer,这种情况下你可能要决定是否接受已经收到的offer。
工资协商
即使offer超出你的预期,或者相较于你目前的工作来说有很大提升,你也应该进行工资协商。 科技公司希望你和他们协商工资。你几乎总能得到至少5千美元或5%的基本工资增长,具体数额更多取决于公司和最初报价。你也可以要求签约奖金或更多的股票期权。
请记住,协商并不是自私或贪婪,正如bletchley punk在推特中写到: 关于工资协商我有不同看法:这件事与你现在的工资无关。它关乎你在新公司的同事的薪水。争取利益对你来说可能是一个巨大的障碍,但是如果你不协商,一旦你被雇佣了,你做同样的工作将会拿到更低的工资。
同时考虑争取你感兴趣的 非货币福利 。例如,也许你希望每周能有一天在家工作。也许你希望他们每年支付两次会议的费用。如果是一家小公司,你可以要求一个不同的职位头衔。
你可以协商多少取决于你的协商地位和公司。非营利性组织的薪水可能会更少。如果你有另一个offer,或者你当前的工作薪资较高,那么即使协商失败,你还有不错的备选方案。
如果他们看中的是你的罕见技能或者职位已经空缺很长时间,他们很难找到其他人。你应该对上面提到的工资网站进行研究,这样你就可以解释你为什么如此开价。要价高一点,以便你有足够的空间来协商,给一个具体数字,而不是一个范围——如果你说期望加薪的范围在5k~10k之间,他们可能就给你涨5k美元。
重申你对公司和职位感到兴奋的原因,并提出X,Y,Z要求。最后,用你感兴趣的话题开启协商,而不是一个接一个地提出问题和解决问题。这样,他们会明白你想要的东西,并且在薪资问题上可以协商(例如,你可能会接受基本工资增加5k美元,外带5k美元的签约奖金的加薪条件,而不是直接要求加薪1万美元)。
我强烈建议阅读更多关于如何进行工资协商的文章,可以从下面两篇文章开始: 第一篇文章提出了协商offer的15条规则,第二篇为女性提供了协商offer的建议。
相关链接:
https://hbr.org/2014/04/15-rules-for-negotiating-a-job-offer
https://hbr.org/2014/06/why-women-dont-negotiate-their-job-offers
一家公司很少很少很少(重要的事情说三遍)因为工资协商而撤回offer。 如果他们这样做,你不会想在那里工作了。
警告:如果你正在协商,还得到了你要求的一切,公司是希望你接受offer的!当然你可以有自己的选择,但是你如果不打算接某公司的offer,就不应该像模像样的和这家公司协商工资。 知道自己最终会接受offer也能让你自信满满的说出这句神奇的话:“如果我们能够到达X,Y和Z,我会很高兴接受这个offer。”
写在最后
找工作压力很大,特别是你已经有一份全职工作或者想要换个行业时,压力更大。我希望这篇文章能够提供一个良好的起点,让你理解数据科学中的招聘流程,知道哪些错误可以避免以及有哪些策略可以利用。如果你想要获取更多信息,可以查看Favio Vazquez非常全面的指导,文章包括了他自己的想法和几十种资源的链接。
相关报道:
https://towardsdatascience.com/the-two-sides-of-getting-a-job-as-a-data-scientist-a4571acc58bc
本文为专栏文章,来自:大数据文摘,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/55784.html 。
数据分析
2018-06-13 06:29:00

在这篇文章中,我会简要概述 推荐系统 这个领域,并解释每个算法的工作原理。
首先明确一下推荐系统的定义。推荐系统是一种技术,主要应用在那些需要为用户(客户,访客,应用程序用户,读者)等进行物品(产品,电影,事件,文章)推荐的场景或相反的为物品推荐用户的场景。通常情况下,在这些场景中会存在非常多的物品和用户,解决这个问题将会变的非常困难而且需要付出很大的代价。想象一个商店的例子,聪明的商人知道顾客的个人喜好,那么店主高质量的建议,能在让顾客满意的同时自己也会增加利润。在网络营销和购物的场景中,上面所说的人为的推荐行为则被推荐系统这一“人造的商人”所代替。
要构建一个推荐系统,您需要一个物品和用户的数据集,以及理想的用户与物品的交互行为数据。有非常多的应用领域,典型的有用户代表顾客,物品代表产品,用户行为表示一次单独的购买行为。
在这张图片中,用户代表信用卡持有者,物品代表信用卡终端,用户行为代表交易行为。用这个的数据集生成的规则可以显示用户如何与物品交互。在这种情况下,基于在捷克的信用卡交易规则可以用来将附近的商店推荐给用户进行参观。
基于知识的推荐系统 用户和物品都有一些属性。你越了解你的用户和物品,得到的推荐结果就会越好。下面,我举一个与推荐相关的物品属性的例子: Item: TV2305 { "name": "Television TV2305", "short description": "HD resolution LED TV", "long description": " Enjoy a movie with your family on the weekend with this HD television from Micromax. With an 81cm (32) display, you can view every single detail with rich detail and clarity. This LED TV produces a resolution of 1366 x 768 pixels with a refresh rate of 60Hz to display crisper images and fluid picture movement. Play HD videos and enjoy a 178 degree viewing angle so that everyone in the family, even those at the sides, can see. Connect HD devices such as BluRay players, PlayStations or HD Set Top Boxes to this television as it has an HDMI port. You can also connect an HDD or USB device to this TV via its USB port. Get a surround sound effect in your living room as this TV comes with two 8W speakers to deliver crisp sound across all your media. With a 5 band equalizer and an auto volume leveler feature, you can enjoy a movie's soundtrack or the latest hit single the way it was meant to be heard.", "price": 250, "categories": ["Electronics", "Televisions"]
}
这样的属性是非常有用的,用在 数据挖掘 方法中可以提取基于规则和模式形式的知识,随后可以用在推荐系统中。例如,上面的物品是由几个可用来测量推荐项相似度的属性表示。即使是很长的文本说明也可以通过先进的自然语言处理工具进行处理。然后,根据物品的相似度产生推荐结果。在用户也可以通过类似的属性描述(例如,从求职者的简历中提取文本)的情况下,可以根据用户属性相似度生成推荐项。注意,在这种情况下,我们不使用用户的历史行为。因此,这种方法在被称为“冷启动”的用户和物品推荐场景中非常有效。这些通常都是新用户和新的物品。
基于内容的推荐系统 对于一个给定的用户,这样的系统推荐的物品是类似于那些他过去喜欢的物品,不会将其他用户的喜好考虑进来。基本上,有两种不同类型的反馈机制。
显式反馈是特意以“喜欢”/“不喜欢”可以点击按钮,以及可以代表喜好程度的星数等形式提供给用户。在很多场景中,很难获取到用户显式反馈的数据。在用户表达不感兴趣的形式上,通常可以将他/她点击一个物品“不喜欢”按钮替代为离开网页或切换到另一个电视频道上。
隐式反馈的数据,如“用户浏览过物品”,“用户完整的阅读了整篇文章”或者是“用户购买了一个物品”,这些都是非常容易搜集的数据并且能够帮助我们计算出好的推荐结果。不同类型隐式反馈数据可能包含: 用户行为 (隐式反馈数据): - 用户浏览了一个物品 - 用户浏览了一个物品的详细信息 - 用户添加一个物品到购物车 - 用户购买了一个物品 - 用户把一篇文章从头读到尾
同样,在反馈的数据非常丰富的情况下,得到的推荐系统越能符合你的期望。
基于内容的推荐系统仅仅依赖给定用户的de历史行为数据,即并不会把其他用户的行为数据考虑进来。现行的方法是通过计算和用户最近访问过的物品的属性相似度,并推荐类似的物品。在这里,从我们的业务出发,我要指出一个有趣的现象,推荐最近的物品往往是非常成功的策略,当然这只是在某些领域和某些场景。
基于 协同过滤 规则的推荐系统 最后一组推荐算法是基于过去的整个用户群体的行为数据。当一个“邻居”是准确定义并且行为数据是干净的,这些算法比以前的章节中描述的更为精确。
上面描述的是一个很简单并且很流行的近邻算法(K-NN)。构建一个用户推荐,需要对K个最近邻用户(同类最相似的用户)进行检查。然后,排名最高的N个额外的物品(当前用户没有对它们评过分),将会被推荐出来。
这种做法不仅面向主流的用户和受欢迎的物品,而且针对“长尾”用户的推荐效果也很好。在推荐的过程中,通过控制把多少邻居考虑进来,可以优化算法,并找到推荐的畅销物品和小众物品之间的平衡。良好的平衡对于推荐系统来说是至关重要的,这将在本文的第二部分中讨论的。
最近邻算法的实现主要两种不同的实现方法。那就是item-based和user-based协同过滤算法。两种算法都是基于user-item矩阵(用户对物品的评分矩阵)。在user-based算法中,对于一个用户u,这个用户未评分的物品,它的得分可以通过综合类似于u的用户的评分信息计算出来。
在item-based算法中,(u,i)是通过看一组类似的物品(互动相似),然后一些类似于用户u访问过的物品组合而成并给出一个用户u对它们预测的评分。
item-base方法的优点在于物品相似性更加的稳定并且可以被高效的预先计算出来。
从我们的经验看,user-based的算法在大多数的场景和数据集下优于item-based算法。唯一的例外可能是数据集中物品数大大小于用户数或者是用户行为非常少。
K近邻算法不仅可以解决协同过滤的问题。上面讨论的基于规则的算法采用APRIORI算法从用户行为矩阵中生成规则集。有足够支持度的规则随后就可以用来生成推荐的候选集。
K-NN和基于规则的算法最重要的区别就是学习速度和召回。通常机器学习模型分为两个阶段。在训练阶段,建立模型,在召回阶段,模型被应用到新的数据集上。基于规则的算法在训练阶段需要付出很大的代价但是召回非常快。K-NN算法刚好相反-因此被称为惰性学习者。在推荐系统中,很重要的一点就是需要经常更新模型(在每个用户与系统交互之后),并且可以立即应用到下一次的推荐请求中。而惰性的学习者很容易更新,基于规则的模型需要重新训练,在大型生产环境,这是特别具有挑战性的。
在Recombee,我们设计了一个以基于规则推荐为基础的改良版的惰性学习推荐算法,使我们能够实时输入用户行为,动态挖掘规则和实时更新模型。
用户与物品之间的交互行为产生的规则。
规则可以可视化,它是检查您的数据集中的数据质量和问题的一款非常好用的工具。该图显示了在行为矩阵中有足够支持度的规则。每个箭头都是一个规则(或暗示),有足够多的用户在与源物品进行交互完之后又与目标物品交互。连接的强度就是置信度。
上面描述的规则的详细视图。每个规则由箭头表示。箭头的大小是规则的置信度。
这些特定的规则是由银行提供的信用卡交易数据产生的。物品是“信用卡终端”,用户是“信用卡持有人”。用户行为单次交易。我们忽略了标签,因为数据是保密的,很多可以来自规则。在第一张图片中,规则簇是非常明显的。很明显这些信用卡终端在地理位置上离的很近。有很多有趣的规则显示出用户的购物习惯。当你上传你的数据到我们的推荐引擎(直接或通过我们的keboola APP,这将会更快),我们可以为您生成规则,你可以在你自己的数据中发现很多有趣的规则。
然而上面提到的规则的首要目的并不是 数据分析 而是用来推荐。可以根据他们最近的交易,为每个信用卡持有者单独生成推荐结果(例如,从这个取款机取款的人通常会花在以下的商店)。银行可以利用这些推荐结果建立智能数据产品(例如,用户在推荐的商店购物,银行可以领取奖励)。这样的数据产品几乎无处不在。你有很好想法如何利用推荐数据驱动的数据产品来提升你的业务吗?告诉我们,我们将会帮助你评估。
最后,可能是这里描述的最有趣的一类协同过滤算法,称为因式分解的算法。以上,用户行为矩阵被分解成两个小矩阵(一个代表用户,一个代表物品的矩阵)和一定数量的协方差矩阵(通常几百个)。通过将这两个小矩阵相乘得到(u,i)评分。有几种方法可以做矩阵分解并训练它们。上面所显示的是一个简单的梯度下降技术。通过随机梯度下降,交替最小二乘法或坐标下降算法误差可以被最小化。也有基于奇异值分解的方法,这种方法将排序矩阵分解为三个矩阵。
一般来说,这是非常有趣和成熟的机器学习领域。这里是一些进一步的阅读材料,如果你有兴趣:Facebook用基于矩阵分解解决了推荐系统的扩展性,处理隐含的评分或各种指标。
正如你所看到的,有大量的算法并且每个算法都有参数来帮助我们找到模型良好的可塑性。我的将来会写一篇文章讨论组合的推荐模型,可以进一步提高推荐的质量。
如何评测推荐算法的好坏? 这是另一个复杂的问题。
“不好的”的推荐结果一般来说是很难检测和预防。他们往往是特定于某个领域在推荐的时候必须被过滤掉。
离线评估推荐算法展示了基于ALS矩阵分解是如何胜过基于用户的K-NN算法的。详情见下一篇文章。
推荐系统的评测
在线评估质量和优化推荐效果。详情在下一篇文章。
有几个如何离线和在线的评价推荐系统的策略。在Recombee,准确的质量评估帮助我们自动优化系统参数,在所有的推荐场景的推荐系统的效果均得到提升。
你可以为自己的数据找出哪些组合的算法是最有效的。因此我们准备了一个免费的即时帐户,这样你可以使用我们的API或客户端做实验了。 译者:王庆
原文:https://medium.com/recombee-blog/recommender-systems-explained-d98e8221f468#.o0a09jlig
本文为专栏文章,来自:AI前线,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/24422.html 。
数据分析
2016-08-28 12:43:00
Mixpanel
近日,一家名叫 Mixpanel的创业公司获得 125 万美元的融资推出实时视觉化用户数据监测功能 Streams帮助网站主监测用户在该网站的活动。
比如你可以选择一个用户,查看他们浏览的历史页面。还可以根据自定义过滤设置和颜色标识来监测一些趋势,比如用户想要回到形象主页时是不是点击的“主页”按钮?哪些页面容易导致用户使用“帮助”项等等。
另外,更加令你吃惊的是相比在大网站上 Mixpanel 只能获取匿名随机用户样本,在小网站上它却能够很容易的监测每个用户都在做什么。如果你想要的话,你可以事实上给每个用户用他们真实的名字打上标签,然后实时监测他们都在你的站内干什么。
不过 Mixpanel 也不是第一家能够提供实时监测服务的网站,其竞争对手还有 Reinvigorate和 Chartbeat等。据其创始人 Doshi 表示,Streams 将永远免费,不过他希望用户也还能使用一些 优质的付费功能。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2011-06-04 04:36:00
摘要
这篇短文的目的是分享我这几天里从头开始学习 Python 爬虫技术的经验,并展示对爬取的文本进行情感分析(文本分类)的一些挖掘结果。 不同于其他专注爬虫技术的介绍,这里首先阐述爬取网络数据动机,接着以豆瓣影评为例介绍文本数据的爬取,最后使用文本分类的技术以一种机器学习的方式进行情感分析。由于内容覆盖面巨大,无法详细道尽,这篇文章旨在给那些对相关领域只有少量或者没有接触的人一个认知的窗口,希望激发读者自行探索的兴趣。
以下的样本代码用Pyhton写成,主要使用了scrapy, sklearn两个库。
所以,什么是情感分析(Sentiment Analysis)
情感分析又叫意见挖掘(Opinion Mining), 是一个研究人们对某种事物,例如产品,话题,政策的意见,情绪或者态度的领域。 随着网路上意见型数据的爆发,情感分析也被广泛研究和应用。Bing Liu 的 Sentiment Analysis and Opinion Mining 对此做了比较全面的概括和案例研究,另一篇Bo Pang 的经典论文 Opinion Minning and Sentiment Analysis 则着重研究了情感分类这一问题。
简单的一个应用的例子,某公司想调查自己在淘宝上销售的产品的受喜爱程度,就可以从产品评论入手, 用一个训练好的分类器判断每个留下评论用户的对此产品的喜好态度,积极的或者是消极的评价,以此展开,充分挖掘文本内容。
Python爬虫
当然,情感分析的第一步是获取数据,而网络尤其是社交网络是存在着丰富而易于获得的意见型数据资源。Python的开源爬虫库scrapy就很好用,这也是作为一个新手上手的首选工具。scrapy wiki 提供了全面的学习资源,甚至有中文的资料和说明文档。就像我一直强调的,数据科学家是一个要具备多领域技能的职位,以练代学不失为一种很好的途径。我鼓励对Python爬虫跃跃欲试的读者不要担心自己知识不足,这里没有门槛,直接上就是了。
当你读完了上述介绍文档之后,你应该知道一个scrapy项目的组成,抓取流程,scrapy里每种Spider的应用场景,大致了解XPATH的语法规则。这样之后你就了解到编写一个简单爬虫只需四步:
1.scrapy startproject PROJECT_NAME
2.定义一个爬虫类: 选择爬虫种类(Spider, CrawlSpider), 取决于目标和爬虫各自合适的应用场景 有一个初始url,或者一个生成初始url的方法 有一个能够生成请求(request)的“解析(parse)”方法
3. 在item类里想要抓取的内容
4. scrapy crawl SPIDER_NAME
我上手的第一个例子是爬取豆瓣的影评数据,选择豆瓣一是因为其丰富的语料资源和配备的打分体系,便于分类问题的标签获得。 二是可以避开账户登录,限制少。思路是选取一部特定的电影,然后爬取其所有的短评和评分。这样后期文本就可以作为分类特征,评分则作为分类标签。 我选了绣春刀(2014年最喜欢的电影)作目标,定义的爬虫类如下:
简短几十行代码之后你已经能够开始抓取一部电影的全部短评和评分了。在这之前,记得在settings里加一个DOWNLOAD_DELAY = 2,不然的话爬不到一半就会被豆瓣给禁了。
情感分类
特征转化
当我们得到一条影评时,能够通过某种算法自动地预测出该影评是否时积极还是消极计算机不会理解人类的文字符号,有没有一种方法能够将文字转化为机器能够理解的信息举简单的线性回归的例子,在作回归分析时我们都会利用对回归预测有帮助的变量作为特征(features), 这里我们主要将文字作为含有可用信息的特征。 通常多是的分类算法都需要量化的具有固定长度的特征向量,原始文本需要一步转换之后才能“喂给”这些分类算法。这也是情感分类问题与一般的分类问题相比不同的地方。
最直接也最常规的一种转化方法是计算单词(单个字) 在文本中的出现频率,也就是:
将一段文本划分成若干其组成词语,比如对英文我们可以以空格和标点符号分割单词,对中文我们可以利用一些完备的词语库。
计算每个词语在一段文本中的出现次数
这样,每单个词语的频率就代表一个变量(特征), 每一条短评代表一个样本。
成功将文本转化为特征阵之后,你可能会想,一些经常用到的词例如“的“,”我“,实际上对判断喜好的帮助应该不大,但是它们的高频率可能会盖过那些真正重要的词,从而降低特征的预测能力。TF-IDF 是一种常用的再权重方法。主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
N-grams
即使是加了权重以后,这种以单个词语作特征的方式还是没办法很好的传递句意啊。一段文字的意思不仅取决于其组成的词语,也在于这些词语间的排列和依赖关系。就像“我爱她”和“她爱我”由三个相同的字组成,但是字的顺序不同表达的意思也不一样。
一种解救的方法是利用N-gram。这里的N指的是一组词语的数量。与其用一个词语代表一个特征,我们可以将两个甚至更多的词语连在一起组成一个特征。背后的思路也很简单:比较两个文本,如果它们有更多的子集相同,那它们就更加相似。上面的例子里,除了“我”,“有”,“小毛驴”,“北京”之外,对一个2-gram,我们还会有“我有”,”有小毛驴“,”有北京“这样的组合出现在特征矩阵中。
重新回到 绣春刀…
我一共爬取了16587条短评,比总的短评数量要少,因为中途断网实际上爬取了一半左右的短评,更重要的原因是一些短评没有评级所有并没有使用。根据打星的数量,三个星及以下视为消极评价,四个星及以上是为积极评价。
基本的操作流程是:
使用了几个文本分类里表现较好的分类器:Naive Bayes, Stochastic Gradient Descent, Support Vector Machine, Random Forest.
最好的分类器是Bernoulli Naive Bayes,交叉验证估计的预测准确率为0.67。
至于分类器的比较,变量筛选,参数选择等内容已经超出了这篇文章覆盖的范围。
总结
1. 介绍了情感分析的动机和定义
2. 情感分析的前提是意见型数据,而爬虫能够获取大量评论及文本型数据,于是我们介绍了流行的Python爬虫工具scrapy,尝试从头开始学起写一个简单的爬虫
3. 文本分类的一个困难在于将文本转化为能“喂给”分类算法的特征阵,最直接的方法是将文本分隔成一组词语并计算词语出现的频率
4. 利用N-gram试图抓取词语间的顺序和依赖关系,尽可能减少语义的流失 来源:知乎
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-05-05 11:00:00
自己喜欢在上班的途中听点有声书,所以经常在喜马拉雅上找资源,要找到一个好听的节目不容易,虽然在喜马拉雅官网上可以按分类来看,但是却不能按点赞数或者评论内容排序找,不是很方便。
于是就用 Python 写了个爬虫,把所有声音的相关信息、评论内容都抓取下来,然后放到数据库来分析,这样喜欢什么样的资源,直接根据声音或评论的内容来汇总分析,结果就一目了然了。
流程实现图

Urllib,requests, selenium
Web的访问使用urllib和urllib2,相比requests、selenium来说,效率更高些,感觉也稳定些,之前使用requests的遇到https的网址处理起来有点问题。而selenium呢,自动化操作可以不用分析具体页面的处理逻辑,不过对于这种海量数据,处理起来速度就会慢很多。
多线程和队列。
使用了2个threading.Thread的继承类,Ximalaya类用来解析声音专辑,分析提取专辑内的声音信息,解析出评论地址;CommentDown类专门用来提取保存评论内容信息;一般一个声音会有多条评论,多的上千条评论,所以CommentDown分配了10个线程来提取评论,Ximalaya分配了3个线程来分析专辑的声音信息。
使用了2个队列,1个用来保存专辑url,大小100,1个用来保存评论url,大小设置为200;这样在超过队列最大值的时候就会停下来,等待前面队列里处理了再继续,可以有效控制整个爬虫速度,以免访问太过频繁被网站给屏蔽了。
数据保存
使用了Mongodb数据库,Nosql处理高并发的,相比SQL速度和效率要高得多。Mongodb里在music下保存声音的相关信息(比如声音的专辑名、专辑地址、声音的地址、声音的时长、点赞数等等),bookcomment下保存声音的评论内容。
断点续传、重复处理
遇到中途中断后要继续执行,还得考虑下断点续传,这里处理得比较简单粗暴。在Ximalaya处理声音的时候,会先判断数据库是否有声音的地址,如果存在就是跳过不再处理,在CommentDown处理评论的时候,判断判断数据库是否有声音的地址,如果存在就是跳过不再处理,这样对于后面比较费时处理部分都可以直接跳过,也不会存在有重复的数据会影响最后的分析的问题。
异常处理
程序在解析页面的时候,可能会有超时之类的异常情况,增加了对应的异常处理,socket.setdefaulttimeout(20)设置全局超时为20秒,超过20秒就会超时报错,这样再通过异常捕获来处理,设置了异常处理记数器,对于异常页面重复处理指定次数后不再处理,避免部分声音页面被删除一直访问异常的情况。
数据分析
最后对保存到数据库的数据进行分析,做分析的时候Nosql做关联分析太痛苦了,完全不如sql查询方便,于是把数据导入到Oracle来进行的分析,根据评论内容中的关键字来标识判断(例如:“点赞”,“好听”,“太棒“之类的都判断成受欢迎),最后再用汇总统计出结果。
结果
评论最受欢迎的TOP20有声书:
评论最受欢迎的TOP10综艺节目:
评论最受欢迎的TOP20音乐:
评论普通话说得最好的节目:
最后附上源代码地址:http://git.oschina.net/highroom/My-Project/blob/master/Ximalaya.py
本文为专栏文章,来自:编程派,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/15991.html 。
数据分析
2016-05-04 23:58:00
1、聚类
常用的包: fpc,cluster,pvclust,mclust
基于划分的方法: kmeans, pam, pamk, clara
基于层次的方法: hclust, pvclust, agnes, diana
基于模型的方法: mclust
基于密度的方法: dbscan
基于画图的方法: plotcluster, plot.hclust
基于验证的方法: cluster.stats
2、 分类
常用的包:rpart,party,randomForest,rpartOrdinal,tree,marginTree,
maptree,survival
决策树: rpart, ctree
随机森林: cforest, randomForest
回归, Logistic回归, Poisson回归: glm, predict, residuals
生存分析: survfit, survdiff, coxph
3、 关联规则与频繁项集
常用的包:
arules:支持挖掘频繁项集,最大频繁项集,频繁闭项目集和关联规则
DRM:回归和分类数据的重复关联模型
APRIORI算法,广度RST算法:apriori, drm
ECLAT算法: 采用等价类,RST深度搜索和集合的交集: eclat
4、 时间序列
常用的包: timsac
时间序列构建函数: ts
成分分解: decomp, decompose, stl, tsr
5、 统计
常用的包: Base R, nlme
方差分析: aov, anova
密度分析: density
假设检验: t.test, prop.test, anova, aov
线性混合模型:lme
主成分分析和因子分析:princomp
6、 图表
条形图: barplot
饼图: pie
散点图: dotchart
直方图: hist
树: rpart
密度图: densityplot
蜡烛图, 箱形图 boxplot
热图, contour: contour, filled.contour
QQ (quantile-quantile) 图: qqnorm, qqplot, qqline
Parallel coordinates: parallel, paracoor, parcoord
其他图: stripplot, sunflowerplot, interaction.plot, matplot, fourfoldplot,
assocplot, mosaicplot
7、 数据处理
缺失值:na.omit
变量标准化:scale
变量转置:t
抽样:sample
堆栈:stack, unstack
其他:aggregate, merge, reshape
本文为专栏文章,来自:小蚊子乐园,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/15683.html 。
数据分析
2016-05-02 14:24:00
写在前面
在此总结一些在 数据分析 /挖掘中可能用到的功能,方便大家索引或者从一种语言迁移到另一种。当然,这篇博客还会随时更新(不会另起一篇,为了方便大家索引),请大家如果有需要收藏到书签中。 如果大家还知道哪些常用的命令,也可以在评论中回复我。我可以添加进来, 方便更多地人更方便的检索 。也希望大家可以转载。
如果大家已经熟悉python和R的模块/包载入方式,那下面的表查找起来相对方便。python在下表中以模块 . 的方式引用,部分模块并非原生模块,请使用 pip install *
安装;同理,为了方便索引,R中也以 :: 表示了函数以及函数所在包的名字,如果不含 :: 表示为R的默认包中就有,如含 :: ,请使用 install.packages("*")
安装。
连接器与io
数据库
类别 Python R MySQL mysql-connector-python(官方) RMySQL
Oracle cx_Oracle ROracle
Redis redis rredis
MongoDB pymongo RMongo, rmongodb
neo4j py2neo RNeo4j
Cassandra cassandra-driver RJDBC
ODBC
JDBC
pyodbc
未知[Jython Only]
RODBC
RJDBC
IO类
类别 Python R excel xlsxWriter, pandas.(from/to)_excel, openpyxl openxlsx::read.xlsx(2), xlsx::read.xlsx(2)
csv csv.writer read.csv(2), read.table
json
图片
json
PIL
jsonlite
jpeg, png, tiff, bmp
统计类
描述性统计
类别 Python R 描述性统计汇总 scipy.stats.descirbe summary
均值 scipy.stats.gmean(几何平均数), scipy.stats.hmean(调和平均数), numpy.mean, numpy.nanmean, pandas.Series.mean mean
中位数 numpy.median, numpy.nanmediam, pandas.Series.median median
众数 scipy.stats.mode, pandas.Series.mode 未知
分位数 numpy.percentile, numpy.nanpercentile, pandas.Series.quantile quantile
经验累积函数(ECDF) statsmodels.tools.ECDF ecdf
标准差 scipy.stats.std, scipy.stats.nanstd, numpy.std, pandas.Series.std sd
方差 numpy.var, pandas.Series.var var
变异系数 scipy.stats.variation 未知
协方差 numpy.cov, pandas.Series.cov cov
(Pearson)相关系数 scipy.stats.pearsonr, numpy.corrcoef, pandas.Series.corr cor
峰度 scipy.stats.kurtosis, pandas.Series.kurt e1071::kurtosis
偏度
直方图
scipy.stats.skew, pandas.Series.skew
numpy.histogram, numpy.histogram2d, numpy.histogramdd
e1071::skewness
未知
回归(包括统计和机器学习)
类别 Python R 普通最小二乘法回归(ols) statsmodels.ols, sklearn.linear_model.LinearRegression lm,
广义线性回归(gls) statsmodels.gls nlme::gls, MASS::gls
分位数回归(Quantile Regress) statsmodels.QuantReg quantreg::rq
岭回归 sklearn.linear_model.Ridge MASS::lm.ridge, ridge::linearRidge
LASSO sklearn.linear_model.Lasso lars::lars
最小角回归
稳健回归
sklearn.linear_modle.LassoLars
statsmodels.RLM
lars::lars
MASS::rlm
假设检验
类别 Python R t检验 statsmodels.stats.ttest_ind, statsmodels.stats.ttost_ind, statsmodels.stats.ttost.paired; scipy.stats.ttest_1samp, scipy.stats.ttest_ind, scipy.stats.ttest_ind_from_stats, scipy.stats.ttest_rel t.test
ks检验(检验分布) scipy.stats.kstest, scipy.stats.kstest_2samp ks.test
wilcoxon(非参检验,差异检验) scipy.stats.wilcoxon, scipy.stats.mannwhitneyu wilcox.test
Shapiro-Wilk正态性检验
Pearson相关系数检验
scipy.stats.shapiro
scipy.stats.pearsonr
shapiro.test
cor.test
时间序列
类别 Python R AR statsmodels.ar_model.AR ar
ARIMA VAR
statsmodels.arima_model.arima statsmodels.var_model.var
arima 未知
生存分析
类别 Python R
PH回归
statsmodels.formula.api.phreg
未知
机器学习类
回归
参见统计类
分类器
LDA、QDA
类别 Python R
LDA QDA
sklearn.discriminant_analysis.LinearDiscriminantAnalysis sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis
MASS::lda MASS::qda
SVM(支持向量机)
类别 Python R 支持向量分类器(SVC) sklearn.svm.SVC e1071::svm
非支持向量分类器(nonSVC) 线性支持向量分类器(Lenear SVC)
sklearn.svm.NuSVC sklearn.svm.LinearSVC
未知 未知
基于临近
类别 Python R k-临近分类器 sklearn.neighbors.KNeighborsClassifier 未知
半径临近分类器 临近重心分类器(Nearest Centroid Classifier)
sklearn.neighbors.RadiusNeighborsClassifier sklearn.neighbors.NearestCentroid
未知 未知
贝叶斯
类别 Python R 朴素贝叶斯 sklearn.naive_bayes.GaussianNB e1071::naiveBayes
多维贝叶斯(Multinomial Naive Bayes) 伯努利贝叶斯(Bernoulli Naive Bayes)
sklearn.naive_bayes.MultinomialNB sklearn.naive_bayes.BernoulliNB
未知 未知
决策树
类别 Python R 决策树分类器 sklearn.tree.DecisionTreeClassifier tree::tree, party::ctree
决策树回归器 sklearn.tree.DecisionTreeRegressor tree::tree, party::tree
随机森林分类器
随机森林回归器
sklearn.ensemble.RandomForestClassifier
sklearn.ensemble.RandomForestRegressor
randomForest::randomForest, party::cforest
randomForest::randomForest, party::cforest
聚类
类别 Python R kmeans scipy.cluster.kmeans.kmeans kmeans::kmeans
分层聚类 scipy.cluster.hierarchy.fcluster (stats::)hclust
包聚类(Bagged Cluster) 未知 e1071::bclust
DBSCAN sklearn.cluster.DBSCAN dbscan::dbsan
Birch
K-Medoids聚类
sklearn.cluster.Birch
pyclust.KMedoids(可靠性未知)
未知
cluster.pam
关联规则
类别 Python R
apriori算法 FP-Growth算法
apriori(可靠性未知,不支持py3), PyFIM(可靠性未知,不可用pip安装) fp-growth(可靠性未知,不支持py3), PyFIM(可靠性未知,不可用pip安装)
arules::apriori 未知
神经网络
类别 Python R
神经网络 深度学习
neurolab.net, keras.* keras.*
nnet::nnet, nueralnet::nueralnet 不可靠包居多以及未知
当然, theano 模块值得一提,但本质 theano 包的设计并非在神经网络,所以不归于此类。
文本、NLP
基本操作
类别 Python R tokenize nltk.tokenize(英), jieba.tokenize(中) tau::tokenize
stem nltk.stem RTextTools::wordStem, SnowballC::wordStem
stopwords stop_words.get_stop_words tm::stopwords, qdap::stopwords
中文分词
TFIDF
jieba.cut, smallseg, Yaha, finalseg, genius
gensim.models.TfidfModel
jiebaR
未知
主题模型
类别 Python R LDA lda.LDA, gensim.models.ldamodel.LdaModel topicmodels::LDA
LSI gensim.models.lsiModel.LsiModel 未知
RP
HDP
gensim.models.rpmodel.RpModel
gensim.models.hdpmodel.HdpModel
未知
未知
值得留意的是python的新第三方模块, spaCy
与其他分析/可视化/挖掘/报表工具的交互
类别 Python R
weka
Tableau
python-weka-wrapper
tableausdk
RWeka
Rserve(实际是R的服务包)
来源:segmentfault  作者:三次方根
链接:https://segmentfault.com/a/1190000005041649
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-05-02 14:19:00
在之前的一篇文章 Python 利用 AIML 和 Tornado 搭建聊天机器人 微信 订阅号 中用 aiml 实现了一个简单的英文聊天机器人订阅号。但是只能处理英文消息,现在用 图灵机器人 来实现一个中文的聊天机器人订阅号。
这里主要介绍如何利用 Python 的 Tornado Web框架以及 wechat-python-sdk 微信公众平台 Python 开发包来快速搭建微信公众号。
完整的公众号代码 GitHub 地址: green ,由于目前此公众号有一些功能正在开发中,此完整代码会与下文所描述的代码有不一致的地方,但是自动回复的功能会一直保留。
本文搭建的微信公众号为 Ms_haoqi ,可以扫码关注后测试效果
自动回复效果:
安装Python库
通过 pip 安装 wechat-python-sdk , Requests 以及 Tornado
1
2
3
pip install tornado
pip install wechat-sdk
pip install requests
订阅号申请
要搭建订阅号,首先需要在微信公众平台官网进行注册,注册网址: 微信公众平台。
目前个人用户可以免费申请微信订阅号,虽然很多权限申请不到,但是基本的消息回复是没有问题的。
服务器接入
具体的接入步骤可以参考官网上的 接入指南 。
本订阅号的配置为:
配置里的URL为服务器提供订阅号后台的url路径,本文用到的源代码配置的是 http://server_ip/wx 其中 server_ip 是运行源代码的主机的公网ip地址。
Token 可以设置为任意字符串。
EncodingAESKey 可以选择随机生成。
消息加密方式可以设置为比较简单的明文模式。
接受并处理微信服务器发送的接入请求的关键代码为Tornado的一个Handle, wx.py :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import tornado.escape
import tornado.web
from wechat_sdk import WechatConf
conf = WechatConf(
token=’your_token’, # 你的公众号Token
appid=’your_appid’, # 你的公众号的AppID
appsecret=’your_appsecret’, # 你的公众号的AppSecret
encrypt_mode=’safe’,# 可选项:normal/compatible/safe,分别对应于 明文/兼容/安全 模式
encoding_aes_key=’your_encoding_aes_key’# 如果传入此值则必须保证同时传入 token, appid
)
from wechat_sdk import WechatBasic
wechat = WechatBasic(conf=conf)
class WX(tornado.web.RequestHandler):
def get(self):
signature = self.get_argument(‘signature’, ‘default’)
timestamp = self.get_argument(‘timestamp’, ‘default’)
nonce = self.get_argument(‘nonce’, ‘default’)
echostr = self.get_argument(‘echostr’, ‘default’)
if signature != ‘default’ and timestamp != ‘default’ and nonce != ‘default’ and echostr != ‘default’
and wechat.check_signature(signature, timestamp, nonce):
self.write(echostr)
else:
self.write(‘Not Open’)
此代码的作用就是验证消息是来自微信官方服务器后直接返回echostr。
启动后台的 main.py 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
‘session_secret’: “3cdcb1f07693b6e75ab50b466a40b9977db123440c28307f428b25e2231f1bcc”,
‘session_timeout’: 3600,
‘port’: 5601,
‘wx_token’: ‘weixin’,
}
web_handlers = [
(r’/wx’, wx.WX),
]
define(“port”, default=settings[‘port’], help=”run on the given port”, type=int)
if __name__ == ‘__main__’:
app = tornado.web.Application(web_handlers, **settings)
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
配置好程序源代码后运行,确认运行无误后再在公众号设置页面点击 提交 ,如果程序运行没问题,会显示接入成功。
接入图灵机器人
要接入图灵机器人,首先需要在官网申请API Key。
申请到之后可以利用以下代码包装一个自动回复接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def reply(self, unicode_str):
body = {‘key’: self.key, ‘info’: unicode_str.encode(‘utf-8’)}
r = requests.post(self.url, data=body)
r.encoding = ‘utf-8’
resp = r.text
if resp is None or len(resp) == 0:
return None
try:
js = json.loads(resp)
if js[‘code’] == 100000:
return js[‘text’].replace(‘
’, ‘n’)
elif js[‘code’] == 200000:
return js[‘url’]
else:
return None
except Exception:
traceback.print_exc()
return None

编写公众号自动回复代码
利用 wechat-python-sdk 微信公众平台 Python 开发包可以很容易地处理公众号的所有消息。
如下为处理来自微信官方服务器的微信公众号消息的 Tornado Handler对象(此代码会获取公众号收到的用户消息并调用刚刚包装的图灵机器人API自动回复) wx.py 部分代码:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# -*- coding: utf-8 -*-
import tornado.escape
import tornado.web
auto_reply = TulingAutoReply(key, url) # key和url填入自己申请到的图灵key以及图灵请求url
class WX(tornado.web.RequestHandler):
def wx_proc_msg(self, body):
try:
wechat.parse_data(body)
except ParseError:
print ‘Invalid Body Text’
return
if isinstance(wechat.message, TextMessage): # 消息为文本消息
content = wechat.message.content
reply = auto_reply.reply(content)
if reply is not None:
return wechat.response_text(content=reply)
else:
return wechat.response_text(content=u”不知道你说的什么”)
return wechat.response_text(content=u’知道了’)
def post(self):
signature = self.get_argument(‘signature’, ‘default’)
timestamp = self.get_argument(‘timestamp’, ‘default’)
nonce = self.get_argument(‘nonce’, ‘default’)
if signature != ‘default’ and timestamp != ‘default’ and nonce != ‘default’
and wechat.check_signature(signature, timestamp, nonce):
body = self.request.body.decode(‘utf-8’)
try:
result = self.wx_proc_msg(body)
if result is not None:
self.write(result)
except IOError, e:
return 来源:http://blog.csdn.net/tobacco5648/article/details/51190039
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-04-28 00:21:00
摘要:看了知乎上大部分关于如何用excel做数据地图的回答,感觉最费劲的地方都在 地图素材上,有用多边形描出来的(有点儿累),有推荐excel插件的(不喜欢依赖插件或软件包),这样多多少少缺少了弹性(当然你也可以网上找一个人家做好的)。我个人比较喜欢从零DIY,学会了整套方法,以后遇到任何问题都可以解决。
正好有串子在我的一些回答中问过我,我的那些热感地图怎么做出来的。借这个机会,我毅然决定,专写一篇文章来说说我的数据地图是怎么画的。
很简单, 按照我的方法,六步你就可以画出自己的热感地图,不需要GIS软件,各种地图都适用。
前提:你要有 Excel 这个软件啊(否则搞毛),还要能上网啊(能看到这回答说明正在上网吧?)
第一步:需要一张普通的地图图片
这个很简单,网上到处都有。中国的省级地图,地级市地图,甚至县级地图都可以找到。 这里两个小要求:1)尽量找张干净的图,干净指的是地图的边界清晰;2)svg格式的图(Scalable Vector Graphics)- 别慌, 推荐你个下载svg格式地图模板的好去处: Wikimedia Commons
在这个网站搜索 China provinces,可以得到下面这些图(上百张),第一张图就很符合我们的要求:
第二步:打开下载的svg图。这里推荐个免费开源的软件: Inkscape 。用这个软件打开svg的地图,然后另存为Enhanced Meta File(emf)格式的文件。
第三步:用excel导入emf的文件,然后ungroup这个地图变成freeform的图形,如下图。
这样我们就得到了excel里面的地图素材。
第四步:每个省现在对应的名字都没有,我们需要重新命名。简单的方法:鼠标点击选一个省,在左上角公式旁边的文本框里输入省的名字,如下图:
第五步:在excel里另建一个worksheet, 按照下图来设计数据版面:
更新:F列每个颜色的单元格漏写了对应的命名,比如白色的单元格,将其命名为对应的J列的值(classpro0)
渐变颜色可以自己选择,目前这个例子是从0到5六种类别(颜色),根据你的研究需要(比如各省人均收入水平你按照高低分了10类,那就10种),随便改多少种都可以, 唯一注意的就是命名的区域要跟着变。 再啰嗦一下:根据你自己的分类标准,筛选你的数据,将筛选后的分类结果(比如6种 0-5)对应到之前提到的类别中,这样也就对应好了颜色。
第六步:这些都做完了, 在地图那页worksheet里面加个按钮,把下面这段VBA程序copy进去:
For i = 2 To 32 '这里是省的数量,2代表的是后面连接的数据表起始位是第二行,可以根据你自己的设计更改 Range("actRegProvince").Value = Range("Data_Province!D" & i).Value '按顺序选取数据表中省份 ActiveSheet.Shapes(Range("actRegProvince").Value).Select '激活对应的省份地图 Selection.ShapeRange.Fill.ForeColor.RGB = Range(Range("actRegCodeProvince")).Interior.Color '将数据表中省份对应的颜色类别赋值给对应的省份地图Next i
补充说明:Data_Province!D中Data_Province是数据表(worksheet)的名字,D指的是省份名字所在的列(见上面那张截图)。根据自己的需要可以改成你喜欢的名字或位置。
第七步:这步不算了啊!就是六步~
点击按钮,享受成果,不谢!
把刚才的地图换成紫色渐变色,效果如下:
我过去的研究用过的一些样图(ps: 数据原因,有些图未包含台湾) :
地级市级别方言地图,请参考: 文化对经济有着怎样的影响? – 钱粮胡同的回答
地级市层面经济集群图,请参考: 中国是否真的需要均衡发展? – 钱粮胡同的回答
神经网络算法分类中国地级市,请参考: 机器学习(machine learning)在经济学领域是否有应用前景? – 钱粮胡同的回答
同样方法制作县级地图
作者:钱粮胡同(授权转载)
专栏链接:https://zhuanlan.zhihu.com/p/20756711
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-04-27 22:33:00
本人刚刚完成 SAS 正则表达式的学习,初学SAS网络爬虫,看到过一些前辈大牛们爬虫程序,感觉很有趣。现在结合实际例子,浅谈一下怎么做一些最基本的网页数据抓取。第一次发帖,不妥之处,还望各位大牛们指正。
本帖研究网页为’http://health.gmw.cn/2012-10/03/content_5266132.htm’,意在提取该网页中全国各省降雨量信息,部分截图如下:
大致步骤就是用filename fileref url ‘网页地址’获取网页代码信息(包含有待提取数据),再用infile fileref将字符代码读入变量中,接着根据待提取数据的特点对写入的观测进行“数据清洗”,最后获得所需数据观测。
先针对该过程中可能出现的问题,做一下简单说明:
1.本人所用SAS软件为多国语言9.2版,刚开始运行含有filename fileref url ‘网页地址’及infile fileref时,很不友好的显示错误:无法连接主机。这一问题困惑我好久。最后看到有前辈发帖,从一个网站http://ftp.sas.com/techsup/download/hotfix/f9_sbcs_prod_list.html#034098下载相关hot fix(F9BA26)以后,得以解决。
2.若未在infile语句中加encoding=’utf-8’,得出的观测乱码。
3.正则表达式并不是必须的,但是用起来简洁明了,与一些字符函数配合使用,绝对可以达到你想要的提取目的。
4.大家进入网页后,点击右键,查看源代码(有些是源文件),这个源代码就是我们需要写入数据集的文件。先用filename fileref url ‘http://health.gmw.cn/2012-10/03/content_5266132.htm’;
5.怎样将网页源文件代码写入数据集用infile+input。不过根据写入方式不同,后续清洗数据的程序自然也不一样了。由于源代码中每一个input line的形式为<…>!!!<…>或者<…><…>(大家可以观察网页的源代码),而我们需要的数据就包含在!!!里面。而由于一个网页包含的信息太多,也有可能找到的!!!不包含所需数据。为了“清洗”数据方便,在这里我采用了一个比较笨的方法,通过观察源代码中待提取数据的大致范围,如第一个待提取字符串”黑龙江”出现在第184个input line,而最后一个”120”(澳门人均降水) 则出现在第623个input line,其他input line我们不需要,可以考虑在infile语句中加入firstobs=184 obs=623。
注意:由于网页可能发生小的变化,firstobs=与obs= 的值可能不准确,从而影响结果。建议查看源代码确定相应值。
这里介绍两种不同的写入方式。
a.以’>’为分隔符,写入后每个观测就形如<…或者!!!<…,而后者是我们所需保留的观测。
根据!!!<…写出对应正则表达式进行清洗。考虑用正则表达式’/.+/’。此种方式编程如下:
b.源代码文件中每一个input line整体作为一个值,这样就保留了原来形式<…>!!!<…>或者<…><…>,根据>!!!<写出对应表达式进行清洗。考虑用正则表达式’/>.{1,8}
以上两种方式主要看各位的习惯吧。得到了筛选后的数据集work.newa(work.newb),数据集只含有1个变量text。而网页中则有6个变量。这是就需要对数据集work.newa做写什么了。法1.set操作:
法2.分组transpose:
作者 :1989pengwei
来源 :经管之家论坛
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-04-26 23:18:00
数据文件数量多,格式种类多,会给管理这些数据文件带来难度。 怎么解决这个问题呢?
1.通过专门的文件夹来保存
建立一个专门保存数据的文件夹,然后再建立不同的子目录来分门别类的保存文件,这是一个好习惯,已经能够对数据进行比较高效率的管理了。
2.通过 数据库 来保存自己的数据文件
通过数据库来保存自己的数据文件,数据保存在同一个地方,使用数据时,只需进入不同的数据库即可,可以大大提高数据的管理效率。
My SQL 社区版本是免费的,所以我们可以使用MySQL来管理数据。
1.在MySQL的官方网站注册、下载并安装好MySQL.
2.然后同样在MySQL官网下载安装好MySQL ODBC连接程序( MySQL connector\ODBC )。
3.在windows下,打开“管理工具”,在数据源中添加MySQL数据连接。

4.具体连接步骤参考如下动图。

5.在 Excel R 或者 SPSS 中连接MySQL。
下面分别介绍如何连接到SPSS 、R 、Excel
1.MySQL连接到SPSS
(1)打开spss之前,你需要先下载安装好MySQL ODBC驱动程序,并进行数据库文件配置。
(2)打开SPSS,依次打开菜单 文件>打开数据库,选择上面已经连接好的数据库。按如下如所示进行操作即可。
步骤一
步骤二
步骤三
步骤四
2.MySQL 连接 R
(1)安装并载入RODBC包。 install. packages (RODBC) #下载RODBC包 library (RODBC) #安装RODBC包
(2)连接数据库 wechat<- odbcConnect ("wechat", uid="root", pwd="5205")
(3)查看所连接的数据库中的表 sqlTables(wechat) #查看数据中的表
最前面的那个表名称是中文的,R对中文支持还不够好
(4)将数据库表中的数据读取出来并存入数据框。 city<- sqlFetch (wechat,"city")
结果如下图所示:
3.连接到Excel
在Excel中是通过插件的形式来连接的,连接后,可以通过Excel写入数据到MySQL,并且可以读取。具体步骤如下:
(1)添加MySQL加载项

(2)连接到MySQL
Excel连接到MySQL数据库具体的配置过程请参阅MySQL官方的文档,这需要一定的英文阅读能力和数据基础知识,如果没有这些基础,请先学习。
小结:spss、R 、excel连接到MySQL的原理是一样的,即通过MySQL ODBC驱动程序,连接后,都可以通过这些 数据分析 工具进行数据的读取和写入操作。我们可以将数据文件保存到数据库中,以便于管理和更新数据。特别是公司里面一般将数据保存再数据库中,知道这些分析工具和数据库连接的知识,就不用将数据导出为中间格式如.txt .csv格式,有助于直接将学到的数据分析技术和方法运用于实战。 来源:spss统计分析
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-04-26 22:30:03
学会利用 Excel 制图表以便于让数据能够更直观的表现出来,是工作必备技能之一。
Excel 2016在数据展现上做了哪些新的突破?有哪些更多好用的新图表呢?今天和大家分享几个常用的图表制作方法:
一、瀑布图:
全选表内所有数据,单击【插入】-【瀑布图】。
.单击【图表标题】,输入图表的标题名称。
右击【盈余】柱形图,选择【设置为总计】。
单击【格式】-【形状填充】,选择【绿色】。
最后删除图例项和网格线,设置一下填充色,完成:
二、旭日图
旭日图非常适合显示分层数据。
层次结构的每个级别均通过一个环或圆形表示,最内层的圆表示层次结构的顶级。
操作步骤:
1.选中表内所有数据,单击【插入】-【旭日图】。
单击【图表标题】,输入图表的标题名称。
选中插入的图表,单击【设计】-【图表样式】,即可改变插入图表的样式。
三、树状图
树状图提供数据的分层视图,树分支表示为矩形,每个子分支显示为更小的矩形。树状图用于比较层次结构内的数据相对大小。
操作步骤:
1.选中表内所有数据,单击【插入】-【树状图】。
单击【图表标题】,输入图表的标题名称。
.选中插入的图表,单击【设计】-【图表样式】选择一种样式。
再选中图表上任意数据标签,在“设置数据标签格式”窗格中选中“值”。
最终效果:
四、柏拉图
用于寻找主要问题或影响质量的主要原因,它能够突出显示一组数据中的最大因素,被视为七大基本质量控制工具之一。
操作步骤:
选中表内所有数据,单击【插入】-【排列图】。
选中添加的图表,单击【设计】-【图表样式】,即可改变插入图表的样式。更改图表名称。 来源:ExcelHome
祝洪忠根据@微软帮助和支持 微博改写
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「 我们 」留言处理。
数据分析
2016-04-26 01:04:00
关于动态图,前面已经讲了三种方法,不知道各位读者去实践过没有!其实,所谓的动态图,无非是通过函数中的某个参数的变化来实现数据变化,进而促使对应的图形进行变化。
比如我们前面最常用到的是index函数,我们通过改变index函数当中引用的某个参数的变化来使对应数据变化,这个参数可以是直接引用的单元格内的数字(比如 组合框 , 选择按钮 对应链接的单元格),也可以是函数(比如 数据验证 法里面就是通过单元格内的名称变化,对应的match函数变化),前面讲的三种方法,动态的时候,表格中需要设置对应的数据,例如:

(图1,2,3)
通过这三种方法做好的动态图,因为美观的因素,多少还是需要对这些辅助的数据进行处理。今天就给大家介绍一种不需要辅助数据的动态图法,案例数据还是与前面三种方法一样!进入正题!
本次要讲的方法是:通过定义名称来实现图表动态!
第一步:
在B14单元格设置数据验证,也就是姓名列下拉。
(图4)
第二步:
定义名称。在定义名称之间,我们要思考动态的维度,在此处,要求的是查看每个销售员在10个月的销售概况,也就是我们只要按列取数即可!如何定义名称?这里使用的函数是offset函数,具体如图:

(图5,6,7)
同样,名称复制给大家:
=OFFSET(定义名称!$B$2,1,MATCH( 定义名称!$B$14 ,定义名称!$C$2:$G$2,),COUNTA(定义名称!$B$3:$B$12),)
B14就是我们动态的地方。
第三步:成图
这里我们可以选择源数据中的任何一列作为图对应的数据,然后将图中引用的数据更改为我们在案例中定义的名称Data。如图:


(图8,9,10,11,12)
最后,效果图展示:
(图13)
到今天为止,动态图系列就告一段落了,关于动态图的制作方法,肯定是远远不止我介绍的这几种方法,希望这个系列能给您带来您所需要的内容,对于之前的几种方法所利用的index,match函数,可以通过本号之前的内容去了解,同样index函数也可以用今天的offset函数来替代,关于offset函数的用法,你可以关注个人公众,并且回复“ 我要附件 ”可以下载最新的案例数据以及offset的动态图解。
本文为专栏文章,来自:Excelky,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/14690.html 。
数据分析
2016-04-22 23:55:00