关于r:R语言之数值型描述分析

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。在剖析之前,先将数据集 birthwt 中的分类变量 low、race、smoke、ht 和 ui 转换成因子。 library(MASS)data(birthwt)str(birthwt)options(warn=-1)library(dplyr)birthwt <- birthwt %>% mutate(low = factor(low, labels = c("no", "yes")), race = factor(race, labels = c("white", "black", "other")), smoke = factor(smoke, labels = c("no", "yes")), ht = factor(ht, labels = c("no", "yes")), ui = factor(ui, labels = c("no", "yes")))str(birthwt)获取数据框里每个变量的罕用统计量是一种疾速摸索数据集的办法,这能够通过上面的一个命令实现。 summary(birthwt) 函数 summary( )能够对每个变量进行汇总统计。对于数值型变量,如 age、lwt、plt、ftv 和 bwt,函数 summary( )给出最小值、下四分位数、中位数、均值、上四分位数和最大值;对于分类变量,如 low、race、smoke、ht 和 ui,给出的则是频数统计表。 epiDisplay 包的函数 summ( )作用于数据框能够失去另一种格局的汇总输入,它将变量按行排列,把最小值和最大值放在最初两列以不便查看数据的全距。 library(epiDisplay)summ(birthwt)须要留神的是,对于因子型的变量,函数 summ( )把变量的各个程度当作数值计算统计量。 ...

September 1, 2023 · 2 min · jiezi

关于r:R语言之-ggplot-2-和其他图形

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。1. 初识 ggplot2 包ggplot2 包提供了一套基于图层语法的绘图零碎,它补救了 R 根底绘图零碎里的函数不足一致性的毛病,将 R 的绘图性能晋升到了一个全新的境界。ggplot2 中各种数据可视化的根本准则完全一致,它将数学空间映射到图形元素空间。设想有一张空白的画布,在画布上咱们须要定义可视化的数据(data),以及数据变量到图形属性的映射(mapping)。 上面应用数据集 mtcars 作图。 该数据集摘自 1974 年的美国《汽车趋势》杂志,蕴含 32 辆汽车的燃油耗费、设计和性能等方面的 11 个指标:mpg(耗油量)、cyl(气缸数)、disp(排量)、hp(总功率)、drat(后轴比)、wt(车重)、qsec(四分之一英里用时)、vs(发动机类型)、am(传动形式)、gear(后退挡个数)和 carb(化油器个数)。咱们首先来摸索车重和耗油量的关系,将变量 wt 映射到 x 轴,变量 mpg 映射到 y 轴。 library(ggplot2)p <- ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) 在下面的命令里,aes 代表美学(aesthetics)元素,咱们把须要映射的变量都放在这个函数中。间接运行 p 失去的只是一个空白的画布,还须要定义用什么样的图形来示意数据。 以 geom 结尾的一系列函数用于指定图形元素,包含点、线、面、多边形等。上面应用点(point)这种几何对象来展现数据,后果如下图所示。 p + geom_point() 除了坐标轴,还能够把变量映射到色彩(color)、大小(size)、形态(shape)等属性。 例如,为了展现不同传动形式下车重和耗油量的关系,咱们能够将变量 am 映射为色彩(下图左)或形态(下图右)。变量 am 在原数据集里是一个数值型变量(取值为 0 和 1),本质上它应该是一个分类变量,因而咱们先把它转换为一个二程度的因子。 library(gridExtra)mtcars$am <- factor(mtcars$am)p1 <- ggplot(data = mtcars, aes(x = wt, y = mpg, color = am)) + geom_point()p2 <- ggplot(data = mtcars, aes(x = wt, y = mpg, shape = am)) + geom_point()grid.arrange(p1, p2, nrow=1) ...

August 30, 2023 · 4 min · jiezi

关于r:R语言之基础绘图

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。R 的根底绘图零碎由 Ross Ihaka 编写,性能十分弱小,次要由 graphics 包和 grDevices 包组成,它们在启动 R 时会主动加载。根底绘图零碎中有两类函数,一类是高水平作图函数,另一类是低水平作图函数。 所谓高水平作图函数是用于间接产生图形的函数,包含 plot( )、hist( )、boxplot( )和 pairs( )等。低水平作图函数是用于在高水平作图函数所绘图形的根底上增加新的图形或元素的函数,包含 points( )、lines( )、text( )、title( )、legend( )和 axis( )等。 1. 函数 plot( )函数 plot( ) 是一个泛型函数,对于不同类型的数据,它能够绘制出不同的图形。例如,对于数值型数据,它能够绘制出散点图;对于分类数据,它能够绘制出箱线图;对于一些统计模型,它能够绘制出相应的图形,比方对于生存剖析,它能够绘制出生存曲线。因而,函数 plot( ) 的应用频率十分高,倡议能够关上它的帮忙文档查看其各种罕用参数的用法。 上面创立一个示例数据,示意某病病人对 2 种药物(drugA 和 drugB)、5 个剂量(dose)程度上的响应状况。 dose <- c(20, 30, 40, 45, 60)drugA <- c(16, 20, 27, 40, 60)drugB <- c(15, 18, 25, 31, 40)用下面的数据绘制药物 A 的剂量和响应关系的图形: plot(dose, drugA)plot(dose, drugA, type = "b")下面的命令创立了两幅图,函数 plot( ) 里的参数 type 默认为“p”(代表点),所以失去的第一张图是散点图。在第二行命令里,参数 type 改为了“b”(代表点和线),所以失去的第二张图是点线图。 ...

August 29, 2023 · 3 min · jiezi

关于r:R语言之处理大型数据集的策略

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。在理论的问题中,数据分析者面对的可能是有几十万条记录、几百个变量的数据集。解决这种大型的数据集须要耗费计算机比拟大的内存空间,所以尽可能应用 64 位的操作系统和内存比拟大的设施。否则,数据分析可能要花太长时间甚至无奈进行。此外,解决数据的无效策略能够在很大水平上进步剖析效率。 1. 清理工作空间为了在数据分析时取得尽可能大的内存空间,倡议在启动任何新的剖析我的项目时,首先清理工作空间。 # rm(list = ls(all = TRUE))函数 ls( ) 用于显示当前工作空间中的对象,其中参数 all 默认为 FALSE,这里设为 TRUE 是为革除包含暗藏对象在内的所有对象。 此外,在数据分析的过程中,对于长期对象和不再须要的对象,应用命令 rm(object1,object2, …) 及时将它们革除。 2. 疾速读取.csv 文件.csv 文件占用空间小,能够由 Excel 查看和生成,因而被宽泛使用于存储数据。在后面里介绍的函数 read.csv( ) 能够很不便地读取 .csv 文件。然而,对于大型数据集,该函数读取数据的速度太慢,有时甚至会报错。这时,能够应用 readr 包里的 read_csv( ) 函数或者 data.table 包里的 fread( ) 函数读入数据,其中后者的读取速度更快(大概为前者的两倍)。 data.table 包提供了一个数据框的高级版本,大大提高了数据处理的速度。该包尤其适宜那些须要在内存中解决大型数据集(比方 1GB~100GB)的用户。不过,这个包的操作形式与 R 中其余包相差较大,须要投入肯定的工夫学习。 3. 模仿一个大型数据集为了便于阐明,上面模仿一个大型数据集,该数据集蕴含 50000 条记录、200 个变量。 bigdata <- as.data.frame(matrix(rnorm(50000 * 200), ncol = 200))# 应用了嵌套的两个 for 循环语句和 R 的内置常量 letters(小写英文字母)为 200 个变量命名。varnames <- NULL# 里面一层循环语句构建变量名的第一个字符(a~t)for (i in letters[1:20]) {# 外面一层循环语句把数字 1~10 用 `_` 作为分隔符别离连贯到这些字母上。 for (j in 1:10) { # 函数 paste( ) 用于连贯字符串。 varnames <- c(varnames, paste(i, j, sep = "_")) }}names(bigdata) <- varnamesnames(bigdata)如果你不太想应用多个循环,能够思考: ...

August 28, 2023 · 2 min · jiezi

关于r:R语言之缺失值处理

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。缺失值解决在理论的数据分析中,缺失数据是经常遇到的。缺失值(missing values)通常是因为没有收集到数据或者没有录入数据。 例如,年龄的缺失可能是因为某人没有提供他(她)的年龄。大部分统计分析办法都假设解决的是残缺的数据集。因而,除了一些专业化的书籍,大多数统计学教科书很少波及这一问题。实际上,在进行正式的剖析之前,咱们须要在数据筹备阶段检查数据集是否存在缺失值,并通过一些办法补救因缺失值所造成的损失。 1. 辨认缺失值在 R 中,缺失值用 NA 示意,是“Not Available”的缩写。函数 is.na( ) 能够用于辨认缺失值,其返回后果是逻辑值 TRUE 或 FALSE。 height <- c(100, 150, NA, 160)height# 100 150 <NA> 160is.na(height)# FALSE FALSE TRUE FALSE如果数据很少,缺失值的个数间接能够数进去,比方下面的变量 height 只有一个缺失值。然而如果数据量很大,就须要借助函数 table( ) 了。 table(is.na(height))# FALSE TRUE # 3 1 须要留神的是,任何蕴含 NA 的计算结果都是 NA。例如: mean(height)# <NA>想要失去所有可参加计算的元素的平均值,应该先将 NA 从向量中移除。 mean(height, na.rm = TRUE)# 136.666666666667参数 na.rm 示意移除缺失值,其意义与用函数 na.omit( ) 把缺失值省略是一样的。 mean(na.omit(height))留神,这里 na.omit( ) 是一个独立的函数,它能疏忽输出对象中的缺失值,而 na.rm 只是计算描述性统计量的函数里的一个外部参数。函数 summary( ) 在计算向量的统计量时会主动疏忽缺失值,它会给出向量中缺失值的个数。例如: ...

August 27, 2023 · 2 min · jiezi

关于r:R语言之数据框的合并

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。有时数据集来自多个中央,咱们须要将两个或多个数据汇合并成一个数据集。合并数据框的操作包含纵向合并、横向合并和依照某个共有变量合并。 1.纵向合并:rbind( )要纵向合并两个数据框,能够应用 rbind( )函数。被合并的两个数据框必须领有雷同的变量,这种合并通常用于向数据框中增加观测。例如: data1 <- data.frame(id = 1:5, sex = c("female", "male", "male", "female", "male"), age = c(32, 46, 25, 42, 29))data1 data2 <- data.frame(id = 6:10, sex = c("male", "female", "male", "male", "female"), age = c(52, 36, 28, 34, 26))data2 rbind(data1, data2)2. 横向合并:cbind ( )要横向合并两个数据框,能够应用 cbind( ) 函数。用于合并的两个数据框必须领有雷同的行数,而且要以雷同的顺序排列。这种合并通常用于向数据框中增加变量。例如: data3 <- data.frame(days = c(28, 57, 15, 7, 19), outcome = c("discharge", "dead", "discharge", "transfer", "discharge"))data3cbind(data1, data3)3. 依照某个共有变量合并:merge( )有时咱们有多个相干的数据集,这些数据集有一个或多个共有变量,咱们想把它们依照共有变量合并成一个大的数据集。函数 merge( ) 能够实现这个性能,例如: ...

August 26, 2023 · 2 min · jiezi

关于r:R语言之-dplyr-包

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。这个包以一种对立的标准更高效地解决数据框。dplyr 包里解决数据框的所有函数的第一个参数都是数据框名。 上面以 MASS 包里的 birthwt 数据集为例,介绍 dplyr 包里罕用函数的用法。该数据集来自一项对于新生儿低体重危险因素的病例对照钻研。首先加载该数据集并查看其相干信息。 library(dplyr)data(birthwt, package = "MASS")# ??birthwt数据集 birthwt 里一共蕴含 189 个钻研对象、10 个变量。其中后果变量 bwt 是新生儿的体重(单位:g),变量 low 是将 bwt 的取值以 2500g 为分点转换成的一个二分类变量。其余 8 个变量均为预测变量,包含孕妇的年龄(age)、种族(race)、吸烟情况(smoke)、高血压史(ht)等。 1.应用 filter( ) 和 slice( ) 筛选行函数 filter() 能够基于观测值筛选数据框的一个子集。第一个参数是数据框名,第二个参数以及随后的参数是用来筛选数据框的表达式。 例如,筛选数据框里年龄大于 35 岁的对象的所有记录: filter(birthwt, age > 35)函数 filter ( ) 里能够用逗号分隔多个条件。应用上面的命令将会抉择抉择年龄大于 35 岁,并且出世体重小于 2500g 或者大于 4000g 的所有记录,因为记录较多,这里只显示了前 10 行。 head(filter(birthwt, age > 35, bwt < 2500 | bwt > 4000),10)函数 slice( ) 能够依照行号抉择指定的行。例如,上面的命令抉择数据集外面的第 2 行到第 5 行。 ...

August 25, 2023 · 4 min · jiezi

关于r:R语言之基本包

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。用 R 根本包在理论的数据分析中,剖析者往往须要破费大量的精力在数据的筹备上,将数据转换为剖析所须要的模式。遗憾的是,大多数统计学教材很少波及这一重要问题。整顿数据是统计学的工作之一。咱们开始关注 R 中最罕用的数据格式——数据框的基本操作。咱们将首先应用根本包解决数据框。 先加载 epiDisplay 包里的一个小型数据集 Familydata。 library(epiDisplay)data("Familydata")1.查看数据框里的内容如果数据框较小,比方本例(只有 6 个变量,11 条记录),只需输出数据框名即可查看其全部内容,这等价于调用函数 print( ) 显示对象的内容。 # 输出数据框名即可查看其全部内容,这等价于调用函数 print( ) 显示对象的内容。Familydata# 用函数 `head( )` 只显示其前几行head(Familydata)# 用函数 `tail( )` 显示其最初几行tail(Familydata)# 能够加参数指定到底几行tail(Familydata,7) # 显示尾7行# 列出所有变量名(列名)names(Familydata) 另一个能够用来不便地摸索数据框构造的函数是 str( )。 str(Familydata)# ==============显示后果=============# 首先给出了对象的类型(这里是数据框“data.frame”)、观测数和变量的个数;'data.frame': 11 obs. of 6 variables:# 接着给出了数据框中每个变量的变量名和类型,以及变量的前几个取值 $ code : chr "K" "J" "A" "I" ... $ age : int 6 16 80 18 69 72 46 42 58 47 ... $ ht : int 120 172 163 158 153 148 160 163 170 155 ... $ wt : int 22 52 71 51 51 60 50 55 67 53 ... $ money: int 5 50 100 200 300 500 500 600 2000 2000 ... # 对于因子型变量还给出了因子的程度; $ sex : Factor w/ 2 levels "F","M": 1 2 2 1 1 1 1 1 2 1 ... # 最初给出了数据框的一些属性: # 数据标签(“datalabel”) - attr(*, "datalabel")= chr "Anthropometric and financial data of a hypothetical family" - # 数据建设工夫(“time.stamp”) - attr(*, "time.stamp")= chr "23 Nov 2006 17:15" - attr(*, "formats")= chr [1:6] "%9s" "%8.0g" "%8.0g" "%8.0g" ... - attr(*, "types")= int [1:6] 128 98 105 98 105 108 # 变量标签(“var.labels”) - attr(*, "val.labels")= chr [1:6] "" "" "" "" ... - attr(*, "var.labels")= chr [1:6] "" "Age(yr)" "Ht(cm.)" "Wt(kg.)" ... # 版本号(“version”) - attr(*, "version")= int 7 - attr(*, "label.table")=List of 6 ..$ sex1: Named num [1:2] 1 2 .. ..- attr(*, "names")= chr [1:2] "F" "M" ..$ : NULL ..$ : NULL ..$ : NULL ..$ : NULL ..$ : NULL这些属性能够加强用户对数据集的了解。要想显示数据框属性的全副信息,能够应用 attributes( ) 函数,该函数的输入是一个列表。 ...

August 24, 2023 · 3 min · jiezi

关于r:R语言之数据导出

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。1. 导出数据因为 R 次要用于数据分析,导入文件比导出文件更罕用,但有时咱们也须要将数据或剖析后果导出。函数 write.table( ) 和 write.csv( ) 能够别离将数据导出到一个 .txt 文件和 .csv 文件。 此外,函数 save( ) 能够将工作空间中的指定对象保留为以 .rdata 为扩展名的 R 数据文件。例如: ID <- 1:5sex <- c("male", "female", "male", "female", "male")age <- c(25, 34, 38, 28, 52)pain <- c(1, 3, 2, 2, 3) pain.f <- factor(pain, levels = 1:3, labels = c("mild", "medium", "severe")) patients <- data.frame(ID, sex, age, pain.f)save(patients, file = "patients.rdata")# 导入数据load("patients.rdata")rdata 格式文件占用空间小,用 R 读入速度很快。因而,倡议用户在导入其余格局的数据并整顿好后,将其保留为 rdata 格局。要导入这种格局的数据,只需调用 load( ) 函数。 ...

August 23, 2023 · 2 min · jiezi

关于r:R语言之数据获取操作

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。实际上,R 中有大量的内置数据集可用于剖析和实际,咱们也能够在R 中创立模仿特定散布的数据。而在理论工作中,数据分析者更多时候面对的是来自多种数据源的内部数据,即各式各样扩展名的数据文件,如 .txt、.csv、.xlsx、.xls 等。不同扩展名的文件代表不同的文件格式,这经常会给剖析者带来困扰。 R 提供了适用范围宽泛的数据导入工具。 1.获取内置数据集R 中的内置数据集存在于各个包中,其中根本包 datasets 里只有数据集,没有函数。这个包提供了近 100 个数据集,涵盖医学、天然、社会学等各个领域。 你能够用上面的命令进行查看: data(package = "datasets")如果想要调用某个数据集,能够应用 data( ) 函数。运行上面的命令,R 会加载数据集 iris 到工作空间。 data(iris)除了 datasets 包,R 中很多其余的包也带有数据集。如果不是运行 R 后主动加载的根本包,咱们须要装置和加载这些包当前能力应用其中的数据。上面以 MASS 包里的数据集 bacteria 为例阐明数据的调用过程: library(MASS)data(bacteria)2. 模仿特定散布的数据R 提供了一系列能够用于数值模仿的函数。这些函数以 r 结尾,罕用的有:rnorm( )、runif( )、rbinom( )和 rpois( ) 等。例如: # 后续可视化局部会具体介绍直方图r1 <- rnorm(n = 100, mean = 0, sd = 1)# head(r1) # 取前 5 个值看看hist(r1)r2 <- runif(n = 10000, min = 0, max = 100)hist(r2)r3 <- rbinom(n = 80, size = 100, prob = 0.1)hist(r3)r4 <- rpois(n = 50, lambda = 1)hist(r4)3. 获取其余格局的数据3.1 txt 与csv 格局如果数据起源是一个用 Windows 记事本或其余纯文本编辑器所创立的 ASCII 格式文件,咱们能够应用函数 read.table( ) 读取其中的数据,返回的是一个数据框。 ...

August 22, 2023 · 2 min · jiezi

关于r:R语言的数据结构与转换

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。任何数据分析的第一步都是依照所须要的格局创立数据集。在 R 中,这个工作包含两个步骤:首先抉择一种数据结构来存储数据,而后将数据输出或者导入这个数据结构中。上面介绍 R 中用于存储数据的多种数据结构。 R 的数据结构在大多数状况下,结构化的数据是一个由很多行和很多列组成的数据集。在 R 中,这种数据集被称为数据框。在学习数据框之前,咱们先来意识一些用于存储数据的数据结构:向量、因子、矩阵、数组和列表。1.1 向量向量(vector)是用于存储数值型、字符型、逻辑型数据的一维数组。标量能够看作是只含有一个元素的向量。函数 c( ) 可用来创立向量,例如: x1 <- c(2, 4, 1, -2, 5)x2 <- c("one", "two", "three")x3 <- c(TRUE, FALSE, TRUE, FALSE)这里 x1 是数值型向量,x2 是字符型向量,而 x3 是逻辑型向量。每一个向量中的数据类型必须统一。如果想创立有法则的向量,R 提供了一些简便的操作和函数,例如: x4 <- 1:5 # 等价于x4 <- c(1, 2, 3, 4, 5)x5 <- seq(from = 2, to = 10, by = 2) # 等价于x5 <- c(2, 4, 6, 8, 10)x6 <- rep("a", times = 4) # 等价于x6 <- c("a", "a", "a", "a")有时候咱们只想应用向量中的某个局部,即选取向量的子集。假如有一个从 3 到 100 的步长为 7 的整数向量,那么第 5 个数的值是多少呢? ...

August 18, 2023 · 3 min · jiezi

关于r:R-语言入门与介绍

文章和代码曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。罕用算术运算符运算符形容+加法−减法*乘法/除法^或**求幂\%\%求余\%/%整数除法留神,R 辨别大小写。 罕用数学函数abs(x)sqrt(x)sin(x)、cos(x)、tan(x)asin(x)、acos(x)、atan(x)exp(x)log(x)、log2(x)、log10(x)round(x, 保留位数)ceiling(x)floor(x)trunc(x):截取 x 的整数局部R 包中的大多数函数都附带例子,函数 example ( ) 用于运行示例代码。R 对象在 R 语言中,“所有皆对象”。数据分析包含很多步骤,从数据整顿、摸索、建模到可视化,每个步骤都须要解决不同的对象,例如向量、矩阵、函数、模型等。 a = 3 + 5# 能够写成a <- 3 + 5倡议应用 <- 赋值符号,防止与比拟操作符 == 相混同b <- sqrt(36) #b=6a + b# 也能够在右边计算它的值,而后通过右赋值“->”把后果赋给一个新的对象;这个写法并不常见a + 3*b -> cc对象的名字能够由一个或一个以上的字符组成。对象名个别 只能以字母结尾 ,能够蕴含数字、点“.”和下划线“_”。 罕用的关系和逻辑运算符><==!=>=<=&|!工作空间治理工作空间(workspace)就是 R 的工作环境,所有创立的对象都被长期保留在工作空间(也可称为全局环境,.GlobalEnv)中。 咱们能够用函数 ls( ) 列出当前工作空间中的所有对象。 ls()工作目录(working directory)是 R 用来读取文件和保留后果的一个文件夹。咱们能够应用函数 getwd( ) 来查看以后的工作目录,也能够应用函数 setwd( ) 设定以后的工作目录。把某个剖析我的项目的所有文件保留在一个文件夹里会给项目管理带来便当,进步剖析效率。因而,在一个代码脚本文件的第一行,通常能够先设定工作目录。 getwd() # 获取工作目录门路setwd("/home/project/myprojects/project1") # 批改工作目录门路# 想要把当前工作空间保留到一个指定的文件,能够在退出时输出save.image("MyFile.Rdata")# 输入后能够刷新右侧文件树,右键复制文件门路,或者下载下次咱们只需应用函数 load( ) 就能够载入保留的工作空间并持续进行该项目标剖析工作。在工作量较大时,能够很好地进步工作效率。 ...

August 17, 2023 · 1 min · jiezi

关于r:六一双倍的快乐ggplot2绘制双y轴图

双y轴图的目标,是想要在同一坐标系中画两组数据,然而他们值范畴差很多,比方一组数据是1-10,另一组是10-100,那么能够对第一组数据做数据变动,比方第一组数据乘以 10,而后在对应的y轴上写上1-10,尽管第一组的数据曾经变成了10-100。这种数据变换叫做归一化(Normalization,又称Min-Max Scaling)把数值型某一特色缩放到最大值和最小值在某个范畴,在sklearn中应用MinMaxScaler能够归一化解决特色矩阵。from sklearn.preprocessing import MinMaxScalera = np.arange(1,11).reshape(-1,1)scaler = MinMaxScaler(feature_range=(10,100)) #实例化scaler = scaler.fit(a) #fit,在这里实质是生成min(x)和max(x)scaler.transform(a) #通过接口导出后果 数学计算过程xi′=xi−min(x)max(x)−min(x)x_i'=\frac{x_i-min(x)}{max(x)-min(x)}xi′=max(x)−min(x)xi−min(x)在R中能够应用scales::rescale函数把某一组数据变动到某一范畴。using(scales)a=1:10scales::rescale(a,c(10,100)) 画图想要模拟文献中的最左边的双坐标图(barplot+lineplot) 演示数据 R P1: -0.5186650 3.3632052: -0.5033615 3.1681503: 0.4924422 3.0344394: -0.4785956 2.8711165: -0.4725588 2.8020146: -0.4591719 2.6531647: 0.4565071 2.6242378: 0.4556375 2.6148489: -0.4548278 2.60612710: -0.4533324 2.59007511: -0.4529072 2.58552412: 0.4527432 2.58377013: -0.4521214 2.57712914: -0.4510678 2.56590315: -0.4478618 2.53195916: 0.4413370 2.46386917: -0.4411496 2.46193318: -0.4392941 2.44282019: 0.4379135 2.42866620: -0.4378894 2.428420实例数据中R得范畴是[-0.5186650,0.4924422],所以能够把坐标轴的范畴设置为x_min_max=[-0.6,0.5]。在ggplot2图形映射中(geom_line、geom_point),都把P列的范畴放缩到x_min_max这个范畴,然而在坐标轴上标出实在的值范畴p_min_max。细调,coord_flip反转x轴和y轴,在theme中批改axis.title的色彩r_min_max <- range(plot_data$R)p_min_max <- range(plot_data$P)x_min_max <- c(-0.6,0.5)r_color <- "tan"r_colorp_color <- "skyblue"ggplot(plot_data,aes(x = Pathway)) + ...

June 1, 2023 · 1 min · jiezi

关于r:ALLUVIAL-DIAGRAM冲积图详解和R语言实现实例

全文链接:http://tecdat.cn/?p=1770冲积图是最后开发用来示意随工夫变动的网络结构的一种流程图。为了兼顾它们的视觉外观和对流动的器重,冲积图是以流水沉积的土壤天然造成的冲积扇命名的。变量调配给平行的垂直轴。值由每个轴上的块示意。块的高度示意簇的大小,并且流域的高度示意由流域连贯的两个块中蕴含的组件的大小。 例子

November 30, 2022 · 1 min · jiezi

关于r:解决Rstudio启动时报错normalizePath文件名目录名或卷标语法不正确

问题形容最近从新装了win11零碎,也重新配置了R和Rstudio环境,然而发现每次关上Rstudio会报错: Warning message:In normalizePath(path.expand(path), winslash, mustWork) : path[1]="C:/Users/xxx/OneDrive/??": 文件名、目录名或卷标语法不正确。 这个问题在我间接运行R.exe (Rgui.exe)时候并不会呈现。通过一番钻研,是因为R.exe能够反对中文门路,然而Rstudio不反对。在装置R的时候,R默认把一些零碎环境变量指定成了OneDrive下的“文档”文件夹中,导致Rstudio无奈辨认。能够用如下办法验证: > Sys.getenv()会看到有几个变量被指定成了中文门路: # R.exe (Rgui.exe)中:HOME C:\Users\xxx\OneDrive\文档R_USER C:\Users\xxx\OneDrive\文档# Rstudio中:HOME C:/Users/linhe/OneDrive/??R_USER C:/Users/linhe/OneDrive/??解决方案经钻研,次要是R_USER这个变量出了问题。在windows零碎变量中增加一个新的R_USER变量即可解决问题。 进入 此电脑右键->属性->高级零碎设置->环境变量...->零碎变量下点击新建...->变量名: R_USER; 变量值: 你轻易指定一个门路截图如下: 确定后,重启Rstudio,世界都喧扰了! 网上的有效方法包含但不限于: 在R装置门路下的\R\R-4.2.1\library\base\R\Rprofile增加R_USER="D:\\R"在R工作目录下新建.Rprofile文件并增加.libPaths("C:/R/win-library/3.3")在以上两个文件中增加R_LIBS_SITE="C:\\Program Files\\R\\R-4.1.1\\library"以上都试过了,对我有效。帮到你的话给我个赞哦:)

October 13, 2022 · 1 min · jiezi

关于r:R语言学习笔记丨因子和数据框基础知识

明天的笔记内容是R语言中因子和数据框的根底介绍和应用办法。更多笔记关注公众号:生信剖析笔记R语言 因子因子能够用来存储不同类别的数据类型,R 语言创立因子应用 factor() 函数,向量作为输出参数。 factor() 函数语法格局: factor(x = character(), #向量levels, #指定各程度值labels = levels, #程度标签exclude = NA, #剔除的字符ordered = is.ordered(x), #逻辑值,指定是否排序 nmax = NA) #程度的下限创立因子依照如下形式可能创立一个简略的因子,含有大和小两个程度。 > x <- c("大", "小", "大")> yinzi <- factor(x)> print(yinzi)[1] 大 小 大Levels: 大 小> print(is.factor(yinzi)) # 判断是不是因子[1] TRUE增加程度标签首先,设置因子程度(共两个程度“大”、“小”),具体形式如下: > # 因子程度标签> x <- c("大", "小", "大",levels=c("大","小"))> yinzi <- factor(x)> print(yinzi) levels1 levels2 大 小 大 大 小 Levels: 大 小应用 labels 参数为每个因子程度增加标签,labels 参数的字符程序,要和 levels 参数的字符程序保持一致。 ...

September 21, 2022 · 2 min · jiezi

关于r:RRstudio安装与配置

R和python,如此像,彼此交融。应用Rstudio是能够间接运行python代码,并且交融十分好。 R的装置非常简单下载之后装置,但有一点倡议,在装置时这个message translation最好不要勾选。否则报错让你看的一脸懵逼。 最重要的一点 R的装置目录不能用中文,只能用英文,否则会莫名其妙各种报错比方E:\360驱动巨匠目录\驱动备份目录 F:\教程\Netlify都是禁止应用的Rstudio装置没有任何阻碍,间接下一步下一步同样界面抉择英文的 关上Rstudio第一件事是设置国内镜像 Tools--global options--packages--change(个别抉择中科大镜像mirrors.ustc.edu.cn)第二步,设置python解释器 Tools--global options--Python--select装置rticulate包在Rstudio点击install即可 Try it在console输出plot(cars) 新建一个R Markdown插入python代码块(chunk)运行个代码试试? Python 之禅import this

November 2, 2021 · 1 min · jiezi

关于r:dplyr

arrange(.data, ..., .by_group = FALSE)msleep%>%group_by(vore)%>%arrange(sleep_total)%>%write_csv("C:/Users/panda/Desktop/R-result/arrange0.csv")msleep%>%group_by(vore)%>%arrange(sleep_total,.by_group=TRUE)%>%write_csv("C:/Users/panda/Desktop/R-result/arrange1.csv")第一次执行组存在但表中看不出 count(x, ..., wt = NULL, sort = FALSE, name = NULL)tally(x, wt = NULL, sort = FALSE, name = NULL)add_count(x, ..., wt = NULL, sort = FALSE, name = NULL, .drop = deprecated())add_tally(x, wt = NULL, sort = FALSE, name = NULL)msleep%>%count(vore,sort=TRUE,name='n')%>%write_csv("C:/Users/panda/Desktop/R-result/count0.csv")msleep%>%count(vore,wt=sleep_total,sort=TRUE,name='n')%>%write_csv("C:/Users/panda/Desktop/R-result/count1.csv")msleep%>%group_by(vore)%>%tally(sort=TRUE,name='n')%>%write_csv("C:/Users/panda/Desktop/R-result/tally.csv")msleep%>%add_count(vore,sort=TRUE,name='n')%>%write_csv("C:/Users/panda/Desktop/R-result/add_count.csv")msleep%>%add_tally(wt=sleep_total,sort=TRUE,name='n')%>%write_csv("C:/Users/panda/Desktop/R-result/add_tally.csv")<font color=red> .drop = deprecated()</font> count(列名)==group_by(列名)%>%tally() add_保留原数据并增加新列(新列反复项必定多) wt如果是数值型数据新列是sum的后果 distinct(.data, ..., .keep_all = FALSE)msleep%>%distinct(vore,.keep_all=TRUE)%>%write_csv("C:/Users/panda/Desktop/R-result/distinct0.csv")msleep%>%distinct(vore)%>%write_csv("C:/Users/panda/Desktop/R-result/distinct1.csv").keep_all = TRUE保留所有列并反复时抉择第一行 filter(.data, ..., .preserve = FALSE)msleep%>%group_by(vore)%>%filter(sleep_total>10)%>%write_csv("C:/Users/panda/Desktop/R-result/filter0.csv").preserve = FALSE组的数量可能会缩小,当在某组没有满足条件的行 mutate( .data, ..., .keep = c("all", "used", "unused", "none"), .before = NULL, .after = NULL)transmute(.data, ...)msleep%>%mutate(test=sleep_total*2,.keep='none')%>%write_csv("C:/Users/panda/Desktop/R-result/mutate.csv")msleep%>%transmute(test=sleep_total*2)%>%write_csv("C:/Users/panda/Desktop/R-result/transmute.csv")mutate(.data,.keep = "none")==transmute(.data) ...

August 18, 2021 · 2 min · jiezi

关于r:R语言有状态依赖强度的非线性多变量跳跃扩散过程模型似然推断分析股票价格波动

原文链接:http://tecdat.cn/?p=23010 跳跃扩散过程为间断演化过程中的偏差提供了一种建模伎俩。然而,跳跃扩散过程的微积分使其难以剖析非线性模型。本文开发了一种办法,用于迫近具备依赖性或随机强度的多变量跳跃扩散的转移密度。通过推导摆布过程时变的方程组,咱们可能通过密度因子化来近似转移密度,将跳跃扩散的动静与无跳跃扩散的动静进行比照。在这个框架内,咱们开发了一类二次跳跃扩散,咱们能够计算出对似然函数的准确近似。随后,咱们剖析了谷歌股票稳定率的一些非线性跳跃扩散模型,在各种漂移、扩散和跳跃机制之间进行。在此过程中,咱们发现了周期性漂移和依赖状态的跳跃机制的根据。 简介事实世界的过程常常受到许多随机输出源的影响,导致各种随机行为,造成过程轨迹的一个组成部分。因而,在对这种景象进行建模时,模型方程必须思考到过程动静的各种随机性起源。 只管扩散过程在间断过程的建模中被宽泛应用,但通常假如布朗运动作为过程随机演变的驱动机制。如果布朗运动不够,能够对模型过程进行概括,使其利用更加理论。 一个这样的概括是在模型过程的轨迹中包含随机产生的 "跳跃"。这种批改次要是在金融背景下进行的,其中扩散模型被用来形容价格/资产过程的动静,这些价格/资产过程在察看到的工夫序列中会呈现看似自发的频繁跳动。例如,人们通常假如一个给定的股票价格过程的对数收益为正态分布。通过假如股票价格过程的动态变化遵循几何布朗运动,这一假如能够很容易地被纳入随机微分方程中。 其中Xt示意工夫t的股票价格,由此可见,对数(Xt)-对数(Xs)∼N((-2/2)(t-s), 2(t-s)),对于t>s。然而,股票价格收益率的正态性长期以来始终受到争议,教训证据表明,收益率往往体现出正态分布不能很好复制的特色。其中最广为人知的是模型过程中显著不足重尾的景象。这一点能够通过计算描述性的统计数据来证实,比方察看到的收益率序列的偏度和峰度,随后能够与正态分布下的相应统计数据进行比照。在扩散过程的背景下,这种差别通常是通过建设随机稳定率模型来补救的,其中收益过程的扩散系数自身被视为一个随机过程。也就是说,批改后的过程能够采取以下模式: 其中a( 2 t , t)和b( 2 t , t)别离示意方差过程的漂移和扩散,B (1) t和B (2) t是相干的布朗运动。随机稳定率模型通过容许对数收益的方差随工夫变动,更精确地捕获股票价格收益的尾部行为。 然而,在解释随机稳定率机制时须要留神。事实上,当 B (1) t 和 B (2) t 不相干时,对数收益过程的边际散布是以方差过程的已知初始值为条件的(即Xt|Xs, 2 s for t > s),依然是正态分布,即存在强相干,在这种状况下,对数收益的边际散布可能是偏斜的,尾部比正态分布下预测的略厚,由此产生的转移密度可能没有足够的leptokurtic来解释短转移期内的极其收益事件。 为了阐明这一点,思考对规范普尔500指数(S&P 500)的每日对数收益的滚动预计。让Xti示意规范普尔500指数在工夫ti的值,而后用带宽h定义一个峰度滚动估计值。  图形容了峰度的滚动预计和时间差预计,计算为{K(ti, h) - K(ti-1, h) : i = h, h + 1, . . N},在1990-01-01至2015-12-31的时间段内应用h=250天的带宽。在这个带宽下,差分序列代表了将滚动估计值向前挪动一天所引起的预计峰度的变动,即(大概)过来一年的数据。此外,咱们还将峰度的总体估计值(在整个时间段内计算)与正态分布的估计值叠加在一起。 依据总体预计,样本的峰度显著超过了正态分布的预计。然而,一年的滚动预计显示,只管对数收益系列的峰度通常高于正态分布的峰度,但总体预计的规模可归因于一些极其收益事件的产生。这些事件体现为峰度的滚动估计值中忽然呈现的尖峰,在时间差的估计值中能够分明地看到。 为了解释这种极其事件,Merton(1976)提出在扩散轨迹中退出跳跃,以便建设一个比几何布朗运动的间断门路所预测的更准确的资产价格回报模型,在这种状况下,批改后的随机微分方程(SDE)的模式为 其中zt示意正态分布的跳跃随机变量,Nt是强度恒定的泊松过程,即Nt-Ns∼Poi((t - s))。在这种表述下,极其事件被明确地蕴含在随机微分方程中,作为扩散轨迹中随机产生的不间断跳跃。因而,察看到的对数收益的尾部行为和布朗运动的尾部行为之间的差别,通过退出跳跃机制失去了缓解。在此基础上,咱们能够扩大该模型,以建设一个带有跳跃的随机稳定率模型,例如: 其中跳跃同时影响着收益率和稳定率。利用这一点,能够保留随机稳定率的有用个性,同时间接阐明极其收益事件和稳定率的跳跃。 标量的例子为了证实矩量方程在剖析跳跃扩散模型中的利用,咱们思考一个具备随机强度的非线性、工夫不均一的跳跃扩散。设 (Xt, rt, t) = rt,其中强度参数rt的动态变化由间断工夫马尔科夫链(CTMC)给出。  ...

July 8, 2021 · 1 min · jiezi

关于r:考虑投影坐标系的空间计算shapely-pyproj

空间数据的坐标应用经纬度,空间计算心愿依照"米"解决,该怎么办? 如果对投影坐标系不理解,咱们只能对上述需要做个近似,用度来迫近米。假如地球为一个球体,对于赤道和经度圈,360度对应4万km,所以1度对应111km。因而咱们能够用“度”和“米”的近似换算来达成上述目标。不过这个简化存在一些问题,在纬度圈上不实用,纬度越大,1度对应的公里数越小。比方,咱们心愿对一个空间对象外扩50m的范畴,那么在货色方向上,理论的外扩范畴,黑龙江 < 北京 < 广东。 那么如果心愿能准确依照米做空间计算呢?这就须要引入投影坐标系(相干概念请参考我的另一篇文章《瓦片地图原理》)。Python中能够用pyproj实现这个性能,将WGS84的经纬度坐标系投影到UTM的米制坐标系。上面给一个代码示例: from shapely.geometry import LineStringfrom shapely.ops import transformimport pyprojwgs84 = pyproj.CRS('EPSG:4326')utm = pyproj.CRS('EPSG:32618')line = LineString([[126.631021,45.7443], [126.631021,45.74138], [126.635699,45.74138]])degree_buffer = line.buffer(0.00050, cap_style=2)project = pyproj.Transformer.from_crs(wgs84, utm, always_xy=True).transformdistline = transform(project, line)dist_buffer = distline.buffer(55.5, cap_style=2)reverse = pyproj.Transformer.from_crs(utm, wgs84, always_xy=True).transformdist_buffer = transform(reverse, dist_buffer)print lineprint degree_bufferprint dist_buffer将数据可视化后,成果如下: 绿色为按“米”准确开的范畴,红色为按“度”开的范畴。能够看到在东西向上,用“度”近似的办法范畴偏小,南北向上范畴准确。

March 5, 2021 · 1 min · jiezi

关于r:Rstudio在Win10系统下terminal没有啦

Rstudio下的terminal是2017年推出的性能,还是挺实用的,然而新装置的Rstudio可能会呈现找不到的问题。比方这样: 没有bash还能够了解,然而没有powershell就有点诡异。其实问题出在设置那里。点击Tools-->Global Options-->Terminal 默认值是custome,抉择Windows PowerShell,就成为惯例的powershell 然而如果咱们想用bash的话,怎么办?其实能够装置Git,而后应用Git Bash即可。

January 7, 2021 · 1 min · jiezi

关于r:译-解密-Google-的营销归因模型最佳实践

假如你是一个市场营销人员,你在进行一个市场营销流动。你想晓得这个流动实际上的成果如何。能够看的指标比如说,你的网站流量,注册,转化率,或者任何你心愿进步的货色。 或者,让咱们假如你是一个产品人,而后你想晓得一个特定的性能或者产品公布实际上是如何影响用户流动的,他们在产品上破费的均匀工夫,等等。 这听起来很简略,因为你只须要比拟流动前后的测量值(如营销流动) ,或者比拟两组测量值(如 A/B 测试)。然而,实际上很难在事实世界中掂量这种影响,因为有许多属性能够影响后果(例如页面浏览量)。这就是所谓的乐音。 谷歌也遇到了同样的问题,Kay Brodersen 和谷歌的团队建设了这个叫做“因果影响”的算法来解决这个问题,并将其作为一个 r 包开源。 基本上,它建设了一个基于多个可比对照组(或市场)的贝叶斯构造工夫序列模型,并应用该模型来预测(或预测)事件产生后时间段的一系列基准值。 所以,假如咱们的网站在日本有如下独特的页面浏览量。 红色圆圈代表咱们进行营销流动时的页面视图。这就是咱们所说的影响事件,它能够是一个公关布告,一个新版本产品的公布等等。 当初,通过因果影响算法,咱们能够基于其余国家的页面视图数据建设一个模型,来预测同一时间段的一系列预期值,假如这些国家没有产生这样的影响事件。这是一个基线,表明了如果没有这次事件,咱们在日本的预期数字。如上面的橙色线所示。 一旦咱们失去了这个基线,咱们就能够计算两行之间的差别,理论值(蓝线)和预期值(橙线) ,并将这些差别作为事件的理论影响。上面的绿线代表实在的影响。 咱们能够累积自事件产生以来所有受影响的值,并查看任何给定点以内的总受影响值。上面的紫色线条示意这个。 这样,咱们就能够更好地掂量此类流动(例如市场推广流动)的投资回报率(ROI) ,即便咱们不确定该流动是否是惟一的影响起源。因果影响算法帮忙您疾速取得这些信息,以便您能够充满信心地及时调整您的口头。 通过 Exploratory v3.5,咱们在营销影响剖析中增加了这个因果影响算法反对,以便咱们的用户可能快速访问这个算法,并以统计的形式考察这些事件的影响。 首先让咱们看一下因果影响算法,而后咱们能够看一下如何在 Exploratory 外部拜访它。我将持续应用市场营销流动作为一个例子,以使它更容易了解,但当然,这个算法能够用于不仅仅是评估市场营销成果。 因果影响算法简介对于因果影响算法是如何工作的,有一些事件须要理解。 如前所述,该算法的外围是建设一个基于多个控制组的贝叶斯构造工夫序列模型,并在调整控制组和测试组之间的大小差别后结构一个综合工夫序列基线。 那么什么是对照组和测试组呢?为了简化这个问题,能够将 Group 看作市场,如日本、美国、西班牙等。 对照组 vs. 测试组控制组是咱们没有事件,如营销流动,因而咱们不心愿看到任何影响,掂量咱们的趣味的事件。 测试组是咱们举办这次流动的中央,并且冀望在肯定水平上对咱们趣味的掂量产生影响。 例如,如果咱们在日本进行营销流动,咱们想晓得这个流动对页面浏览量有什么影响,那么日本是测试组(或市场) ,其余国家如美国、西班牙等是控制组(或市场)。 基线那么,什么是“综合工夫序列基线”呢? 这基本上是一系列咱们冀望的没有影响事件的值。为了预测这些数值,与其余典型的预测/预测算法不同,这些算法会依据测试组自身过来的数据建设预测模型,该算法基于对照组预先时间段的理论数据建设模型,并预测基线值。 这意味着,控制组须要与测试组类似或相干,以便算法可能以牢靠的形式预测测试组的基线值。 相干对照组那么如何抉择“类似或相干”的对照组呢? 因果影响算法能够通过在回归系数上搁置一个尖峰和平板先验散布,从给定的数据中主动挑选出最有用的组。 然而 Kim Larsen@Uber 在他的 MarketMatching R包页面 上介绍了一个更好的办法。留神,这并不是要替换因果影响算法的控制组抉择逻辑,而是通过增加额定的抉择步骤作为预处理来补充它。 假如咱们有日本和美国的独特页面访问量数据,如下所示。 咱们能够简略地运行相干算法来计算这两个组之间的相关性,然而这会疏忽大小。咱们能够做的另一种办法是计算线之间的欧几里德间隔。然而,在工夫序列数据上计算这些数据可能有点辣手,因为有一种称为“长期移位”的景象,这种景象常常产生在工夫序列数据上。简略地计算这样的间隔就能够疏忽这样的变动,并假如它是更远的间隔。 看看上面的图表。 这两条线并没有在完全相同的工夫上的起伏,然而通过观察它们,咱们能够看到两条线之间的一些相似之处。上面曲线(彩色)的高和低比上方曲线(红色)的来得晚一点。因而,依据一对一的映射来计算间隔,也就是同一时间轴点上两个数据点之间的差别,能够疏忽这种“长期移位” ,并且能够将这两条线标记为“不同”而不是“类似”。 ...

November 15, 2020 · 1 min · jiezi

python与R对比SAS我该选择哪种工具

介绍我们热衷于比较! 从智能手机中的三星,苹果和HTC,移动操作系统中的iOS,Android和Windows,到即将进行选举的候选人的比较,或为世界杯团队选择队长,比较和讨论丰富了我们的生活。如果你喜欢讨论,你需要做的就是在一个充满激情的论坛里抛出一个相关的问题,然后看着它发酵。这个过程的美妙之处就在于,论坛里的每个人都是一个知识渊博的人。 那我在这里就抛出一个类似的话题—— SAS和R语言之争可能是数据科学行业可能见证的最大争辩,而Python是现在发展最快的语言之一,自成立以来已经走过了漫长的道路。我开始讨论这个话题不是想看它引爆全场(虽然这也很有趣),而是我知道我们都会从讨论中受益。 这个问题也经常在博客中被人们讨论。所以,我想和大家一起讨论! 在这个问题上讨论的还不够多吗?可能是! 所以我还是觉得有必要进行讨论,理由如下: 数据科学非常有活力,前两年进行的讨论可能与现在的情况没什么关联了。传统观念里没有把python列作比较之内,我觉得现在这是个非常值得深思的问题。虽然我们将讨论有关语言的全球趋势,但我也将添加印度分析行业的相关具体信息(处于不同的发展水平)好了,闲话少说,让我们开始讨论吧! 背景下面是一些关于这三个生态系统的简要说明: SAS:SAS一直是商业分析领域无可争议的市场领导者。该软件提供大量统计功能,具有良好的GUI,供人们快速学习,并提供强大的技术支持。然而,它最终变成了一种昂贵的选择,并不总是具有最新的统计功能。R:R是SAS的开源对应物,传统上用于学术和研究。由于其开源性质,最新技术可以快速发布。互联网上有很多相关文档,R是一个非常划算的选择。Python:作为一种开源脚本语言,Python的使用者数量随着时间的推移而不断增长。今天,它集成一些库(numpy,scipy和matplotlib)和几乎所有你可能想做的统计操作/模型构建的功能。自从引入pandas以来,它在结构化数据的操作方面变得非常强大。属性比较我将在以下属性上比较这些语言: 1.可用性/成本 2.易于学习 3.数据处理能力 4.图形功能 5.先进的工具 6.工作场景 7.深度学习支持 8.客户服务支持和社区 我从分析师的角度来比较这些。 因此,如果您正在为您的公司寻找要购买的工具,您可能无法在此获得完整的答案。但是以下信息仍然有用。 对于每个属性,我给这三种语言中的每一种都给出一个分数(1 - 低 ; 5 - 高)。 这些参数的权重,根据您的职业生涯阶段和雄心而有所不同。 可用性/成本SAS是一款商业软件。对于大多数专业人士而言,这是昂贵的且没有能力以个人身份购买。但是,它在私人企业中拥有最高的市场份额。 因此,除非您在投资了SAS的机构中,否则可能很难接触到SAS。 尽管如此,SAS已经引入了一个可以免费访问的大学版,但它有一些局限性。在那里你也是可以使用 Jupyter notebook的! 另一方面,R&Python是完全免费的。以下是我对此参数的打分: SAS - 3 R - 5 Python - 5 易于学习SAS易于学习,并为已经了解SQL的人提供简便的选项(PROC SQL)。 不仅如此,它在其存储库中具有良好的稳定GUI界面。 在资源方面,各大学的网站上都有教程,SAS有全面的文档。 从SAS培训机构出来是可以获得认证的,但它们也是需要一笔花费。 R在3种语言中具有最陡峭的学习曲线。它要求您学习和理解编码。R是低级编程语言,因此简单的过程可能需要较长的代码。 Python因其编程世界的简单性而闻名。 对于数据分析也是如此。,虽然目前还没有广泛的GUI界面,但我希望Python notebooks会变得越来越主流。 它们为文档和共享提供了出色的功能。 SAS - 4.5 R - 2.5 Python - 3.5 数据处理能力这一度是SAS的优势。 R计算内存(RAM)中的每一个单元,因此计算受到32位机器上的RAM数量的限制。 但是现在已不再是这种情况。 这三种语言都具有良好的数据处理能力和并行计算选项。我觉得这不再是一个很大的区别。 他们都带来了Hadoop和Spark集成,他们也支持Cloudera和Apache Pig。 ...

June 13, 2019 · 1 min · jiezi

大数据之R语言速成与实战

什么是R语言?R语言由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两人共同发明。其词法和语法分别源自Scheme和S语言。 R定义:一个能够自有有效的用于统计计算和绘图的语言和环境,它提供了广泛的统计分析和绘图技术。 R是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。 R语言语法通俗易懂,很容易学会和掌握语言的语法。而且学会之后,我们可以编制自己的函数来扩展现有的语言。这也就是为什么它的更新速度比一般统计软件,如SPSS、SAS等快得多。大多数最新的统计方法和技术都可以在R中直接得到。 作为当前在世界范围内最受欢迎的数据挖掘开发语言——R语言以其特有的开放性、高可扩展性以及顶尖的制图功能吸引了越来越多的数据分析爱好者。 R语言优势1 R是免费的开源软件。2 全面的统计研究平台,提供了各种各样的数据分析技术。3 R是一个程序设计语言,所以它的能力可以很容易的通过使用用户定义的函数扩展。4 R拥有顶尖水准的制图功能5 可以从多个数据源获取数据,并将其转化为可用的形式。6 R可以运行在多种平台上,包括Windows、UNIX以及Mac上 大数据之R语言速成与实战:阿里云大学—开发者课堂

May 22, 2019 · 1 min · jiezi

Python与R、Matlab的对比

作为一枚程序员,想要研究Python编程语言与数学学习(教学)的结合,就不能不了解以及比对一下其他数学学习与应用的解决方案,比如R语言、Matlab等数学软件。经过广泛的搜索了解了一下国外的反馈与趋势之后,最终的结论就是Python确实是未来。Python与R语言的对比Python与R语言在数据分析领域的对比,DataCamp上有一篇引用率非常高的文章,数据分析选择R还是Python,不过这篇文章是2015年写的,我们先大致总结一下文章内容:R主要用于学术与研究,也开始迅速进入企业市场,越是接近统计学、研究、数据科学,你就会越偏爱R,而Python主要用于程序员想进入数据分析领域、掌握统计技能,以及其他开发人员进入数据科学领域。如果你的工作越接近工程环境,你会越偏爱Python。R的社区生态主要是研究员,数据科学家、统计学家和量化研究员,而Python主要是程序员和开发者。R学习门槛比较高,但是当你掌握了基础之后就学起来比较容易,R对程序员来说不难;Python可读性强,入门非常容易,被公认为非常不错的入门编程语言。在2015年前的Tiobe编程语言的排名上Python排名在第4或第5,R排在第17到13。而据2015数据分析领域,用R的研究员占58%,Python占42%,两者都用的占23.45%;在2013年,R转Python的有26%,Python转R的有18%,而新进入数据分析领域的有44%的人选择R,23%的人选择Python.从2015年之前的情况看来,正如作者所说,R和Python在数据分析领域确实平分秋色,难分伯仲,从数据中我们可以看出,虽然Python相比R更流行,在编程方面更有优势,但是在数据科学领域,选择使用R的人更多。但是翻到2018年的文章里看到2016、2017年的数据,情况下发生了逆转。在数据科学领域,2016年有34%的人选择Python,42%的人选择R,而到了2017年41%的人选择Python,36%的人选择R。在2017年的调查统计里数据科学家和工程师最流行的编程语言分别是JavaScript(58.7%,令人惊讶啊,可能与数据可视化有关?)、SQL(58%)、Python(45%),而R(11.2%),Python在商业领域领域比较火,而R在学术和研究领域比较多,所以不那么流行吧。而在最近的Tiobe的排行榜上,与数据科学相关的编程语言Python、R、SQL、Matlab等涨幅都比较大,Python在整个编程语言的流行度也由2014年的2%猛增到2019年8.26%,跃居第3,成为2018年年度语言。Python、R、Scala在数据科学领域的流行包Python与Matlab的对比虽然不是学数学的,但是Matlab的大名可是如雷贯耳,与数学相关专业、相关行业的学生、工程师们基本一定会使用到它。MathWorks公司跟设计公司Adobe、三维软件公司Autodesk一样都是极其硬核的存在,旗下的产品不仅是学习必备,而且是工程(比工作听起来霸气)必备。我个人对Matlab的了解极其有限,Python与Matlab的对比我也只能像一个产品经理去广泛查阅专业意见来权衡利弊。我所得出的结论也只是基于掌握了Python的前提,断不敢用偏颇的立场去亵渎神器。我们来看一下美国相关专业人员对两者的对比,只是粗略而不精准的翻译一下。我是一名工程师,之前长期使用Matlab来处理复杂的数学运算都没有遇到什么大的问题,就在几个月前因为岗位需要学习了Python之后,我才意识到Matlab相比Python是多么的糟糕。之前需要我用Matlab花一整天处理的问题用Python只需数小时,Python的表现、流畅度让我惊讶。而且使用Python我可以做之前用Matlab做的任何事情,而且更优秀。因此我非常建议Matlab使用者转向Python。Python编程语言比Matlab更强大,能够联合非常多的外部工具模块,只需一个文件就可以调用非常多的库、函数、类,语法也更加简单,面向对象开发也更加方便,还能非常方便地调用C、C++、Fortran。Python是免费的,而且可以运行在更多平台上面。 —Stackoverflow某工程师经过调查Matlab与Python的宿命之争在2011年就开始了,而且网上Matlab与Python的对比文章、评论非常之多。Matlab官方在2013年就开始拿Matlab和Python进行对比官方对比最是致命:MATLAB OR Python中文,年代越近,由Matlab全面转向Python的建议就越多,更多人直言Python是未来的编程语言,在Python与Matlab的选择之上,看了非常多的建议,已成一边倒的趋势。有人列出了Python相对于Matlab的8大优势,我只粗略翻译一下这8大优势,详情大家可以去查看原文:Python的代码相比于Matlab更简洁,可读性更强;和其他编程一样,Python都是从0开始计数,而Matlab不是;Python可以更好的支持哈希字典;面向对象开发让Python更简单、更优雅;Python免费且开源;Python一个文件、模块里可以包含非常多的函数;Python支持import声明;Python支持更多图像处理的包和工具集在PyCon 2017年的大会上,多位大佬提出科学家应该全面拥抱Python,在2015年开始Python在NASA的地位就开始遥遥领先IDL、Matlab和Fortran。由于这里我们只讨论Python和Matlab在数学上的对比,至于科学家转型Python的优势的细节,大家可以看DataCamp的雄文。小结其实在写这篇文章之前,我就问过一下包括清华在内的学校以及一些数学专业的学生,Matlab和R还是占主流,但是经过一番调查发现在美国Python在数据科学、数学等方面好像渐成压倒性的优势。这也激励我要把用Python学数学的专栏给写下去。

March 17, 2019 · 1 min · jiezi

[原] 数据科学教程:R语言与DataFrame[2019版]

前言9102年是互联网大环境不太好的一年,这一年更需要苦练基本功,数据科学领域的基本功无非就是数据处理,而 DataFrame 是其中的核心。那么,都9102年了,如何在 R 语言中优雅地使用 DataFrame 呢?是否优雅是矿工生产力差异的重要来源,本文将介绍最近三年来 DataFrame 的最近进展。R 中的 DataFrame 新趋势tidy 编程流分布式计算集成 NoSQL集成各领域核心算法按照功能来划分:核心计算:tidyverse/sparklyr图计算: tidygraph/graphframe空间计算:sf/geospark/tidyraster时间序列:tidyquant文本计算:tidytext/tabulizer模型构建:tidymodelsNoSQL集成:nodbi核心计算谈到数据处理的基本功必须先了解 DataFrame 的最核心能力:比SQL还要优雅地处理数据。作为第四代数据处理语言的核心 tidyverse 是必须要了解的。tidyverse 实现了核心计算的大一统,它囊括了八个数据科学最高频的操作:ggplot2, 支持数据可视化dplyr, 数据操作tidyr, 数据清洗readr, 数据IOpurrr, 函数式编程tibble, 数据框轻量化格式stringr, 文本处理forcats, 因子类型处理对于 tidyverse 的各个子模块可以参考 R语言与DataFrame 2016版, 其中详细介绍了各模块的情况,本文不再赘述,更多着墨与新趋势。八大模块中,dplyr 是核心中的核心,因为它实现了数据处理的前后端分离,支持 R 语言的前端和多种结构化数据库的后端,比如 RPostGIS,RMySQL,sparklyr 等。下面举一个 sparklyr 处理数据的例子来感受一下现代数据处理:library(sparklyr)library(tidyverse)# 数据库连接sc <- sparklyr::spark_connect(master = “localhost”, spark_home = “/data/FinanceR/Spark”, version = “2.2.0”, config = sparklyr::spark_config())sc <- sparklyr::spark_connect(master = “localhost”, spark_home = “/data/FinanceR/Spark”, version = “2.2.0”, config = sparklyr::spark_config())# 在 mutate 中支持 Hive UDFremote_df = dplyr::tbl(sc,from = “db.financer_tbl”) # 定义数据源表 # 或者 remote_df = dplyr::tbl(sc,from = dplyr::sql(“select * from db.financer_tbl limit 10”)) ## 以比SQL更接近于自然语言的方法编程,以 remote_df %>% dplyr::mutate(a = b+2) %>% # 在 mutate 中支持 Hive UDF dplyr::filter(a > 2)%>% dplyr::group_by(key)%>% dplyr::summarize(count = n())%>% dplyr::select(cnt = count)%>% dplyr::arrange(desc(cnt))%>% na.omit() -> pipeline## 将数据操作的SQL执行过程 打印pipeline %>% dbplyr::sql_render() ## 将 pipeline 结果自动缓存为临时表 tmp_tbl tmp_tbl = pipeline %>% compute(“tmp_tbl”)# 将 临时表按照条件过滤后再写回 Hive 数据库,省去建表过程tmp_tbl %>% filter(cnt > 10) %>% sparklyr::spark_write_table(“db.financer_res”)图计算空间计算时间序列文本计算假设检验特征工程参考资料数据科学教程:R语言与DataFrame[2019版 ...

March 10, 2019 · 1 min · jiezi

R 脚本读取汇总 Excel 表格数据

主要用到了 xlsx 和 rJava 包,打开 Excel 文件,读取各表格数据,再写入到汇总表。下图为处理前的原始数据表格:下图为处理后的数据:代码实现安装&加载包的函数实现。installed.packages() 函数获取所有已安装的包,用以排除已安装的包。install.packages() 函数安装指定的包。library() 加载引入包。loadLibrary <- function(pkgs) { uninstalledPkgs <- pkgs[!(pkgs %in% installed.packages()[, “Package”])] if (length(uninstalledPkgs)) { install.packages(uninstalledPkgs) } for (pkg in pkgs) { library(pkg, character.only = TRUE, quietly = TRUE) }}自定义设置。涉及表格文件路径、汇总表名等。setwd("/path/to/work/dir") # 工作目录fileName = “summary_sheet_demo.xlsx” # 处理的表格文件summaryName = “汇总” # 汇总的 sheet 表名summarySheet = FALSE # 对象变量、忽略startRow = 2 # 汇总表中操作起始行设置 CRAN 源。官方默认源可能比较慢,所以选择国内的源很重要。此处选择了清华 CRAN 源,其他的可参考 CRAN Mirrors。options(repos = “https://mirrors.tuna.tsinghua.edu.cn/CRAN/")加载依赖包。用到了上述写的安装加载包的函数。loadLibrary(c(“xlsx”, “rJava”))打开工作表。loadWorkbook() 打开指定路径的表格文件,并加载到工作簿对象中。wb <- loadWorkbook(fileName)遍历查询&汇总数据。# 获取所有表格sheets <- getSheets(wb)# 循环所有表格,找出需要写入的表for (sheet in sheets) { sheetName <- sheet$getSheetName() if (sheetName == summaryName) { summarySheet <- sheet }}if (summarySheet == FALSE) { stop(paste(“表:”, summaryName, “未找到”))}# 指定Date格式(此处可忽略)# options(xlsx.date.format=‘yyyy/MM/dd’)# 遍历所有表格for (sheet in sheets) { # 过滤掉需写入的表 sheetName <- sheet$getSheetName() if (sheetName == summaryName) { next } # 获取表格【内容行数】 rowNum <- sheet$getLastRowNum() print(paste(“表名:”, sheetName, “总共:”, rowNum, “行,”, sep = " “)) # 读取表格内容 参数 colClasses 指定每列的类型(实际是指定处理该列的类/对象) data <- read.xlsx2(fileName, sheetName = sheetName, header = FALSE, startRow = 2, colClasses = c(“character”, “Date”, “integer”, “integer”, rep(“numeric”, 2), “integer”)) print(data) # 将表格内容写入汇总的那张表 addDataFrame(data, summarySheet, col.names = FALSE, row.names = FALSE, startRow = startRow) # 累加行数 startRow <- startRow + rowNum}把对象内容写入文件中保存。saveWorkbook(wb, fileName)完整代码# 包加载/安装包loadLibrary <- function(pkgs) { uninstalledPkgs <- pkgs[!(pkgs %in% installed.packages()[, “Package”])] if (length(uninstalledPkgs)) { install.packages(uninstalledPkgs) } for (pkg in pkgs) { library(pkg, character.only = TRUE, quietly = TRUE) }}# 自定义配置setwd("/path/to/work/dir”) # 工作目录fileName = “summary_sheet_demo.xlsx” # 处理的表格文件summaryName = “汇总” # 汇总的 sheet 表名summarySheet = FALSE # 对象变量、忽略startRow = 2 # 汇总表中操作起始行# 设置CRANoptions(repos = “https://mirrors.tuna.tsinghua.edu.cn/CRAN/")# 加载依赖包loadLibrary(c(“xlsx”, “rJava”))# 打开Excel表格wb <- loadWorkbook(fileName)# 获取所有表格sheets <- getSheets(wb)# 循环所有表格,找出需要写入的表for (sheet in sheets) { sheetName <- sheet$getSheetName() if (sheetName == summaryName) { summarySheet <- sheet }}if (summarySheet == FALSE) { stop(paste(“表:”, summaryName, “未找到”))}# 指定Date格式(此处可忽略)# options(xlsx.date.format=‘yyyy/MM/dd’)# 遍历所有表格for (sheet in sheets) { # 过滤掉需写入的表 sheetName <- sheet$getSheetName() if (sheetName == summaryName) { next } # 获取表格【内容行数】 rowNum <- sheet$getLastRowNum() print(paste(“表名:”, sheetName, “总共:”, rowNum, “行,”, sep = " “)) # 读取表格内容 参数 colClasses 指定每列的类型(实际是指定处理该列的类/对象) data <- read.xlsx2(fileName, sheetName = sheetName, header = FALSE, startRow = 2, colClasses = c(“character”, “Date”, “integer”, “integer”, rep(“numeric”, 2), “integer”)) print(data) # 将表格内容写入汇总的那张表 addDataFrame(data, summarySheet, col.names = FALSE, row.names = FALSE, startRow = startRow) # 累加行数 startRow <- startRow + rowNum}# 最后需要把对象内容写入文件中saveWorkbook(wb, fileName)表格附件summary_sheet_demo.xlsx原文地址: https://shockerli.net/post/r-…更多文章请访问我的个人博客: https://shockerli.net ...

January 25, 2019 · 2 min · jiezi

[原]数据科学教程: 如何使用 mlflow 管理数据科学工作流

背景近年来,人工智能与数据科学领域发展迅速,传统项目在演化中也越来越复杂了,如何管理大量的机器学习项目成为一个难题。在真正的机器学习项目中,我们需要在模型之外花费大量的时间。比如:跟踪实验效果机器学习算法有可配置的超参通常都是十几个到几十个不等,如何跟踪这些参数、代码以及数据在每个实验中的表现目前业界也没有一个统一的解决方案,更多都是根据某个实验进行单独的开发。部署ML模型部署ML模型通常都需要将模型文件和线上环境Service/Spark Job/SDK(Java/Scala/C++)对接,而大部分数据科学家通常都不太熟悉这些工程开发语言。因此,将模型迁移到不同平台是具有挑战性的,它意味着数据科学家还需要考虑线上部署的性能问题,目前业界也缺少比较通用的模型部署工具。目前,在大厂内部已经孵化出这样的一些机器学习平台,比如 Uber 的 Michelangelo、Google 的 TFX,但是他们都与大厂的基础架构深度耦合,所以也没有在开源社区流行起来。在这样的背景下, mlflow 框架横空出世,它的出现旨在将效果追踪、模型调参、模型训练、模型代码、模型发布等模块集中一处,提升数据科学工作流的管理效率。简介mlflow 将数据科学工作流分为3个部分:模型追踪:支持记录和查询实验周围的数据,如评估指标和参数项目管理:如何将模型封装在 pipeline 中,以便与可重复执行模型发布:管理模型部署并提供 RestFul API模型追踪:mlflow tracking 提供了一个入口,用于将机器学习的参数、代码版本、代码路径、评估指标等统一管理,输出到系统中可视化管理。通常我们模型会迭代很多次,这样每次输出的结果就可以集中对比效果的好坏。比如:library(mlflow)# 记录超参my_int <- mlflow_param(“my_int”, 1, “integer”)my_num <- mlflow_param(“my_num”, 1.0, “numeric”)# 记录指标mlflow.log_metric(“accuracy”, 0.45)# 记录输出文件(模型、feature importance图)等mlflow.log_atrifact(“roc.png”)mlflow.log_artifact(“model.pkl”)项目管理mlflow project 提供了打包可重用数据科学代码的标准格式,项目通过本地文件/git管理代码,通过 yaml 文件来描述。name: FinanceR Projectconda_env: conda.yamlentry_points:main:parameters:data_file: pathregularization: {type: double, default: 0.1}command: “python train.py -r {regularization} {data_file}“validate:parameters:data_file: pathcommand: “python validate.py {data_file}“codna 将提供统一的虚拟环境服务,通过 mlflow run 可以任意执行项目的 pipelinemlflow run example/project -P num_dimensions=5mlflow run git@github.com:xxx/xxx.git -P num_dimensions=5下面举一个官网的具体例子:举例初始化devtools::install_github(“mlflow/mlflow”, subdir = “mlflow/R/mlflow”)mlflow::mlflow_install()模型参数# Sample R code showing logging model parameterslibrary(mlflow)# Define parametersmy_int <- mlflow_param(“my_int”, 1, “integer”)my_num <- mlflow_param(“my_num”, 1.0, “numeric”)my_str <- mlflow_param(“my_str”, “a”, “string”)# Log parametersmlflow_log_param(“param_int”, my_int)mlflow_log_param(“param_num”, my_num)mlflow_log_param(“param_str”, my_str)模型训练# Sample R code training a linear modellibrary(mlflow)# Read parameterscolumn <- mlflow_log_param(“column”, 1)# Log total rowsmlflow_log_metric(“rows”, nrow(iris))# Train modelmodel <- lm(Sepal.Width ~ iris[[column]], iris)# Log models interceptmlflow_log_metric(“intercept”, model$coefficients[["(Intercept)”]])线上实验library(mlflow)# Create and activate the “R-Test” experimentmlflow_create_experiment(“R-Test”)mlflow_active_run()启动界面mlflow_ui()默认需要在浏览器中访问 localhost:5000添加注释超参调优超参调优支持3种模式:Random: 完全随机探索策略Gpyopt: 基于高斯过程的探索策略Hyperopt: 基于数据库的分布式探索方法mlflow run -e random –experiment-id <hyperparam_experiment_id> -P \ training_experiment_id=<individual_runs_experiment_id> examples/r_wine –entry-point train.R其中 train.R 为library(mlflow)# read parameterscolumn <- mlflow_log_param(“column”, 1)# log total rowsmlflow_log_metric(“rows”, nrow(iris))# train modelmodel <- lm( Sepal.Width ~ x, data.frame(Sepal.Width = iris$Sepal.Width, x = iris[,column]))# log models interceptmlflow_log_metric(“intercept”, model$coefficients[["(Intercept)”]])# save modelmlflow_save_model( crate(~ stats::predict(model, .x), model))模型部署mlflow rfunc serve model模型推断mlflow_rfunc_predict(“model”, data = data.frame(x = c(0.3, 0.2)))## Warning in mlflow_snapshot_warning(): Running without restoring the## packages snapshot may not reload the model correctly. Consider running## ‘mlflow_restore_snapshot()’ or setting the ‘restore’ parameter to ‘TRUE’.## 3.400381396714573.40656987651099## 1 2 ## 3.400381 3.406570或者在命令行中调用mlflow rfunc predict model data.json总结mlflow 的出现极大方便了炼丹师傅们的工作,提供了堪比 michelangelo 的用户体验,并且全面支持 sklearn、spark、pytorch、tensorflow、mxnet、mlr、xgboost、keras 等主流算法框架。更多 mlflow 的详细资料可以参见官方文档。参考资料MLflow v0.7.0 Features New R API by RStudiomlflow-r-interface-for-mlflowmlflow hyperparamhttps://www.slideshare.net/da…Uber michelangelo作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog…,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio商业使用请联系作者。 ...

October 31, 2018 · 2 min · jiezi

[原] 解密 Uber 数据团队的大规模地理数据可视化神器:Deck.gl 与 H3

背景如何大规模可视化地理数据一直都是一个业界的难点,随着2015年起 Uber 在这一领域的发力,构建了基于 Deck.gl + H3 (deckgl,h3r) 的大规模数据可视化方案。一方面,极大地满足了大规模地理数据可视化的需求。另一方面,也极大地方便了数据科学家的可视化工作。在大规模空间轨迹分析、交通流量与供需预测等领域得到广泛应用,突破了原来leaflet架构中数据量(通常不会超过10W个原始点)的瓶颈问题,实现百万点绘制无压力,并且可以结合GPU实现加速渲染。地理单元:H3随着互联网出行公司的全球化扩张,越来越多的公司涌现出对地理单元划分的需求。一方面,传统的地理单元比如 S2和geohash,在不同纬度的地区会出现地理单元单位面积差异较大的情况,这导致业务指标和模型输入的特征存在一定的分布倾斜和偏差,使用六边形地理单元可以减少指标和特征normalization的成本。另一方面,在常用的地理范围查询中,基于矩形的查询方法,存在8邻域到中心网格的距离不相等的问题,也就是说六边形网格与周围网格的距离有且仅有一个,而四边形存在两类距离,而六边形的周围邻居到中心网格的距离却是相等的,从形状上来说更加接近于圆形。所以,基于hexagon的地理单元已经成为各大厂家的首选,比如 Uber 和 Didi 的峰时定价服务。在这样的背景下 Uber 基于六边形网格的地理单元开源解决方案 H3 应运而生,它使得部署 Hexagon 方案的成本非常低,通过UDF、R pacakge等方式可以以非常低的成本大规模推广。H3 的前身其实是 DDGS(Discrete global grid systems) 中的 ISEA3H,其原理是把无限的不规则但体积相等的六棱柱从二十面体中心延伸,这样任何半径的球体都会穿过棱镜形成相等的面积cell,基于该标准使得每一个地理单元的面积大小就可以保证几乎相同。然而原生的 ISEA3H 方案在任意级别中都存在12个五边形,H3 的主要改进是通过坐标系的调整将其中的五边形都转移到水域上,这样就不影响大多数业务的开展。下面是 ISEA3H 五边形问题的示例:#Include librarieslibrary(dggridR)library(dplyr)#Construct a global grid with cells approximately 1000 miles acrossdggs <- dgconstruct(spacing=1000, metric=FALSE, resround=‘down’)#Load included test data setdata(dgquakes)#Get the corresponding grid cells for each earthquake epicenter (lat-long pair)dgquakes$cell <- dgGEO_to_SEQNUM(dggs,dgquakes$lon,dgquakes$lat)$seqnum#Converting SEQNUM to GEO gives the center coordinates of the cellscellcenters <- dgSEQNUM_to_GEO(dggs,dgquakes$cell)#Get the number of earthquakes in each cellquakecounts <- dgquakes %>% group_by(cell) %>% summarise(count=n())#Get the grid cell boundaries for cells which had quakesgrid <- dgcellstogrid(dggs,quakecounts$cell,frame=TRUE,wrapcells=TRUE)#Update the grid cells’ properties to include the number of earthquakes#in each cellgrid <- merge(grid,quakecounts,by.x=“cell”,by.y=“cell”)#Make adjustments so the output is more visually interestinggrid$count <- log(grid$count)cutoff <- quantile(grid$count,0.9)grid <- grid %>% mutate(count=ifelse(count>cutoff,cutoff,count))#Get polygons for each country of the worldcountries <- map_data(“world”)#Plot everything on a flat mapp<- ggplot() + geom_polygon(data=countries, aes(x=long, y=lat, group=group), fill=NA, color=“black”) + geom_polygon(data=grid, aes(x=long, y=lat, group=group, fill=count), alpha=0.4) + geom_path (data=grid, aes(x=long, y=lat, group=group), alpha=0.4, color=“white”) + geom_point (aes(x=cellcenters$lon_deg, y=cellcenters$lat_deg)) + scale_fill_gradient(low=“blue”, high=“red”)p转化坐标系后:#Replot on a spherical projectionp+coord_map(“ortho”, orientation = c(-38.49831, -179.9223, 0))+ xlab(’’)+ylab(’’)+ theme(axis.ticks.x=element_blank())+ theme(axis.ticks.y=element_blank())+ theme(axis.text.x=element_blank())+ theme(axis.text.y=element_blank())+ ggtitle(‘Your data could look like this’)H3 中还提供了类似 S2 的六边形压缩技术,使得数据的存储空间可以极大压缩,在处理大规模稀疏数据时将体现出优势:地理数据可视化:Deck.gl在使用 Deck.gl 之前,业界通用的解决方案通常是另一个开源的轻量级地理数据可视化框架 Leaflet。Leaflet 经过十余年的积累已经拥有足够成熟的生态,支持各式各样的插件扩展。不过随着 Leaflet 也暴露出一些新的问题,比如如何大规模渲染地理数据,支持诸如 轨迹、风向、六边形网格的可视化。好在近年来 Mapbox 和 Deck.gl 正在着手改变这一现状。下面是一个具体的例子,如何可视化Hexagon:# 初始化devtools::install_github(“crazycapivara/deckgl”)library(deckgl)# 设置 Mapbox token,过期需要免费在 Mapbox 官网申请Sys.setenv(MAPBOX_API_TOKEN = “pk.eyJ1IjoidWJlcmRhdGEiLCJhIjoiY2poczJzeGt2MGl1bTNkcm1lcXVqMXRpMyJ9.9o2DrYg8C8UWmprj-tcVpQ”)# 数据集合sample_data <- paste0( “https://raw.githubusercontent.com/", “uber-common/deck.gl-data/”, “master/website/sf-bike-parking.json”)properties <- list( pickable = TRUE, extruded = TRUE, cellSize = 200, elevationScale = 4, getPosition = JS(“data => data.COORDINATES”), getTooltip = JS(“object => object.count”))# 可视化deckgl(zoom = 11, pitch = 45) %>% add_hexagon_layer(data = sample_data, properties = properties) %>% add_mapbox_basemap(style = “mapbox://styles/mapbox/light-v9”) 除了六边形之外 Deck.gl 也支持其他常见几何图形,比如 Grid、Arc、Contour、Polygon 等等。更多信息可以见官方文档: https://crazycapivara.github….地理仪表盘:结合 ShinyDeck.gl 结合 Shiny 后,可将可视化结果输出到仪表盘上:library(mapdeck)library(shiny)library(shinydashboard)library(jsonlite)ui <- dashboardPage( dashboardHeader() , dashboardSidebar() , dashboardBody( mapdeckOutput( outputId = ‘myMap’ ), sliderInput( inputId = “longitudes” , label = “Longitudes” , min = -180 , max = 180 , value = c(-90, 90) ) , verbatimTextOutput( outputId = “observed_click” ) ))server <- function(input, output) { set_token(‘pk.eyJ1IjoidWJlcmRhdGEiLCJhIjoiY2poczJzeGt2MGl1bTNkcm1lcXVqMXRpMyJ9.9o2DrYg8C8UWmprj-tcVpQ’) ## 如果token 过期了,需要去Mapbox官网免费申请一个 origin <- capitals[capitals$country == “Australia”, ] destination <- capitals[capitals$country != “Australia”, ] origin$key <- 1L destination$key <- 1L df <- merge(origin, destination, by = ‘key’, all = T) output$myMap <- renderMapdeck({ mapdeck(style = mapdeck_style(‘dark’)) }) ## plot points & lines according to the selected longitudes df_reactive <- reactive({ if(is.null(input$longitudes)) return(NULL) lons <- input$longitudes return( df[df$lon.y >= lons[1] & df$lon.y <= lons[2], ] ) }) observeEvent({input$longitudes}, { if(is.null(input$longitudes)) return() mapdeck_update(map_id = ‘myMap’) %>% add_scatterplot( data = df_reactive() , lon = “lon.y” , lat = “lat.y” , fill_colour = “country.y” , radius = 100000 , layer_id = “myScatterLayer” ) %>% add_arc( data = df_reactive() , origin = c(“lon.x”, “lat.x”) , destination = c(“lon.y”, “lat.y”) , layer_id = “myArcLayer” , stroke_width = 4 ) }) ## observe clicking on a line and return the text observeEvent(input$myMap_arc_click, { event <- input$myMap_arc_click output$observed_click <- renderText({ jsonlite::prettify( event ) }) })}shinyApp(ui, server)参考资料Uber H3 原理分析http://strimas.com/spatial/he…https://cran.r-project.org/we...https://en.wikipedia.org/wiki...http://www.pyxisinnovation.co...Large Scale Data Visualisation with Deck.gl and Shinyhttps://uber.github.io/h3/https://eng.uber.com/shan-he/https://eng.uber.com/keplergl/[译] 解密 Uber 数据部门的数据可视化最佳实践作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog…,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio商业使用请联系作者。 ...

October 22, 2018 · 3 min · jiezi