R语言在BRFSS数据中可视化分析探索糖尿病的影响因素

此示例显示如何用R语言在BRFSS数据中可视化分析探索糖尿病的影响因素

由Kaizong Ye,Coin Ge撰写

该数据集是来自全美约40万份与健康相关主题的问卷调查。BRFSS始于1980年代,并已通过问卷调查在美国用于监测普遍的疾病。

数据集:行为危险因素监视系统数据

摘要:该数据集是来自全美约40万份与健康相关主题的问卷调查。BRFSS始于1980年代,并已通过问卷调查在美国用于监测普遍的疾病。该研究是追溯性的,而不是设计性的实验,因此尽管可以推断出相关性,但不能因果关系。

数据集中的特征既是连续的又是分类的。

目标:探索性别,体重和年龄之间的相关性

×


1.前言

ggplot2是数据可视化的重要程序包,用于绘制各种高级统计图形。该程序包是新西兰统计学家Hadley Wickham在2005年左右开发的,那时候作者还是美国Iowa大学的博士生。

1.1 ggplot2的命令是一种用R实现的绘图语言

ggplot2的代码相对容易理解,设定各种参数较为方便,图形也十分美观,能用相对简单的代码在图形中呈现出非常丰富的信息。不过,ggplot2的语法与传统R函数的调用方式有很大差别,所以不少人反映学起来有些困难。

在ggplot2出现以前,R绘图都是调用函数,再通过改变函数的参数实现的。ggplot2将所绘制图形的各部分独立出来,如xy坐标,基本组件的颜色、图标大小、填充类型、堆叠方式、坐标轴、地图投影、数据分组、图形分面等等信息划归为一些基本类型,每一部分分别用一段代码表示。每段代码内部有相应的参数控制,各代码段再通过“+”运算符连接。这里的“+”并非四则运算的加法,而是表示图形各要素/组件之间的叠加。“+”运算符所连接的代码片段,有任何一部分做出更改,整个图形就做出相应调整。因此,本质上,ggplot2代码是用R语言实现的一种绘图语言。

ggplot2所用的绘图语言,主要是按照Wilkinson(2005)的设想实现的。Wilkinson(2005)将一幅统计图形看做由以下几个主要部分:

  1. 数据;

  2. 表现数据的点、线、多边形、栅格、颜色等;

  3. 坐标系

1.2 ggplot2命令的基本组成

具体来讲,在ggplot2程序包中,每一副图都是由若干组件组成的,这些组件包括:

  • data: 数据,必须为data.frame。

  • coordinate system: 数据可视化,主要是在二维平面上表示数据的关系,所用坐标系一般为平面直角坐标,有时会用到极坐标、地图投影等。ggplot2软件默认使用平面直角坐标。

  • geoms: 包括geoms_开头的各种对象,用来绘制各种基本组件,包括点、线、面、多边形、柱状图、箱线图等。

  • aesthetics: 图形的美学特征,如颜色、形状、透明度、大小、分组等。

  • scales: 坐标轴的属性

  • stats: 统计变换。用于设定数据要进行的统计转换,例如平均值、中位数、记录数等。

  • facets: 描述如何将图形按照某一个或者几个因子(factors)不同水平(levels)用多个图形分开展示。

1.3 ggplot2要求输入数据为data.frame

ggplot2要求输入的数据为data.frame。为了将R中的各种数据转换为ggplot2能够读取和操作的data.frame格式,H. Wickham还开发了reshape2以及dplyr等程序包,专门用于数据转换。

1.4 ggplot2中的aes函数

完整的ggplot2绘图命令, 总是以ggplot() 开始。ggplot()及其参数奠定整个ggplot2图形的基础,最重要的两个参数为data和mapping。其中data必须为data.frame格式。mapping参数要求数据通过aes函数进一步转换。aes是aesthetic的缩写。在aes函数中,要输入的参数有x, y, group, color, size等。aes可以直接访问data参数所输入数据框的各列,从而直接控制图形的横坐标、纵坐标、分组以及各组的颜色、大小、透明度等等。

注意:在ggplot()代码部分设置的aes参数对于整个图形都有效。在某个geom组件内部设置的aes参数,如颜色、分组、字体大小、线段类型等,只对该geom组件有效。若要设定所有geom组件的形状、大小、颜色等,相应的参数如size, color等,不要放入aes函数转换,而是作为ggplot()函数的普通参数即可。

1.5 ggplot2的geom组件

ggplot()代码段只定义数据展示的逻辑关系,并不直接绘图。要用ggplot2绘图,还必须为其添加各种基本图形组件。要添加的图形组件根据变量的数目以及要绘制的图形有所不同,包括:点geom_point、线geom_line、多边形geom_polygon、箱线图geom_boxplot、柱状图geom_bar、六角形图geom_hex、栅格图geom_tile、阶梯线geom_step、拟合的趋势线geom_smooth等等。

为了对图形进行进一步修饰,还可能要更改图形的横坐标、纵坐标、标题等等。

1.6 ggplot2图形的显示

ggplot2所生成的对象,同时具有gg和ggplot两种属性。如果要显示图形,需要将其print到屏幕上,而不是像plot()函数一样直接调用函数就可以调用绘图设备(屏幕也是绘图设备)。与此同时,ggplot2的图形也不接受par()设定的各种参数。

本文就ggplot2的常用绘图组件做简要介绍。

2 快速绘图

2.1 qplot (不建议使用)

为了让只熟悉R基础绘图的用户也能使用ggplot2,H. Wickham编写了qplot函数,调用方式类似plot()。在qplot()中,所有控制图形的信息都封装为参数。但是qplot()在一定程度上降低了绘图的灵活性,难以体现ggplot2的优势,因此不太建议使用。

#### 载入数据
library(maps)
library(ggthemes)
library(ggplot2)

2.1.1 普通绘图

plot(hwy ~ cty, data = mpg)

2.1.2 qplot绘图

qplot(x = cty, y = hwy, color = cyl, data = mpg, geom = "point")

2.1.3 ggplot2绘图

ggplot(data = mpg, aes(x = cty, y = hwy)) + ### 设置x, y以及数据
    geom_point(aes(color = cyl)) +          ### 添加 点, 以及 设置 点 的颜色
    geom_smooth(method = "lm") +            ### 添加拟合曲线/曲线以及置信区间
    coord_cartesian() +                     ### 笛卡尔坐标系, 即平面直角坐标系
    scale_color_gradient() +                ### 图例的颜色
    theme_base() +                          ### 主题为base风格
    scale_shape(solid = FALSE) +            ### 点的类型为中空。
    ggtitle("New Plot Title") +             ### 标题
    xlab("New X label") +                   ### 横轴
    ylab("New Y label")                     ### 纵轴

3 基本绘图组件及其属性

3.1 多边形

thismap = map_data("world")
c <- ggplot(thismap, aes(long, lat, group=group)) 
c + geom_polygon(fill="white", colour="gray")

3.2 折线图

ggplot(economics, aes(date, unemploy)) +
    geom_path(lineend = "butt", linejoin = "round", linemitre = 1)

3.3 带状图

ggplot(economics, aes(date, unemploy)) + 
    geom_ribbon(aes(ymin = unemploy - 900, ymax = unemploy + 900))

3.4 线段

ggplot(seals, aes(x = long, y = lat)) + 
    geom_segment(aes(xend = long + delta_long, yend = lat + delta_lat))

3.5 长方形

ggplot(seals, aes(x = long, y = lat)) + 
    geom_rect(aes(xmin = long, ymin = lat, 
        xmax = long + delta_long, ymax = lat + delta_lat))

4 一维连续数据(向量)绘图

4.1 一维连续数据

a <- ggplot(mpg, aes(hwy))

4.2 频度阴影图

a + geom_area(stat = "bin")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

4.3 核密度图

a + geom_density(kernel = "gaussian")

4.4 点状频度图

a + geom_dotplot()
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

4.5 频度折线图

a + geom_freqpoly()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

4.6 单变量离散数据

b <- ggplot(mpg, aes(fl))
b + geom_bar()

5 二维连续变量绘图

5.1 x和y均为连续变量

5.1.1 空白图形,只生成坐标

f <- ggplot(mpg, aes(cty, hwy))
f + geom_blank()

5.1.2 带随机扩散的散点图

f + geom_jitter()

5.1.3 散点图

f + geom_point()

5.1.4 分位数回归线

f + geom_quantile()
## Loading required package: SparseM
## 
## Attaching package: 'SparseM'
## The following object is masked from 'package:base':
## 
##     backsolve
## Smoothing formula not specified. Using: y ~ x

5.1.5 xy轴投影

f + geom_rug(sides = "bl")

5.1.6 线性模型拟合以及置信区间

f + geom_smooth(method = "lm")

5.1.7 Loess拟合趋势线以及置信区间

f + geom_smooth(method = "auto")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

5.2 x为离散变量,y为连续变量

5.2.1 柱状图

g <- ggplot(mpg, aes(class, hwy))
g + geom_bar(stat = "identity")

5.2.2 箱线图

g + geom_boxplot()

5.2.3 点图

g + geom_dotplot(binaxis = "y", stackdir = "center")
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

5.2.4 小提琴图

g + geom_violin(scale = "area")

5.3 x为离散变量, y为离散变量

h <- ggplot(diamonds, aes(cut, color))
h + geom_jitter()

5.4 二维密度分布图

5.4.1 栅格图

data(iris)
i <- ggplot(iris, aes(Sepal.Length, Sepal.Width))
i + geom_bin2d(binwidth = c(5, 0.5))

5.4.2 等高线密度图

i + geom_density2d()

5.4.3 六角形密度图

i + geom_hex()

5.5 x轴为时间序列的连续变量

5.5.1 阴影图

j <- ggplot(economics, aes(date, unemploy))
j + geom_area()

5.5.2 折线图

j + geom_line()

5.5.3 阶梯图

j + geom_step(direction = "hv")

5.6 添加误差线

df <- data.frame(grp = c("A", "B"), fit = 4:5, se = 1:2)
k <- ggplot(df, aes(grp, fit, ymin = fit-se, ymax = fit+se))

5.6.1 误差箱图

k + geom_crossbar(fatten = 2)

5.6.2 误差线图(带横线)

k + geom_errorbar()

5.6.3 误差线图(不带横线)

k + geom_linerange()

5.6.4 带误差线的点图

k + geom_pointrange()

6 三维数据的可视化

seals$z <- with(seals, sqrt(delta_long^2 + delta_lat^2))
m <- ggplot(seals, aes(long, lat))

6.1 等高线图

m + geom_contour(aes(z = z))

6.2 栅格图

m + geom_raster(aes(fill = z), hjust=0.5, vjust=0.5, interpolate=FALSE)

6.3 瓦片图

m + geom_tile(aes(fill = z))

7 统计变换

a + geom_bar(stat = "bin")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

说明:stat_bin(geom = "bar") 和 geom_bar(stat = "bin") 两者等价

7.1 一维概率密度统计变换参数的设定

a + stat_bin(binwidth = 1, boundary = 10)

a + stat_density(adjust = 1, kernel = "gaussian")

7.2 二维概率密度统计变换参数的设定

f + stat_bin2d(bins = 30, drop = TRUE)

f + stat_binhex(bins = 30)

f + stat_density2d(contour = TRUE, n = 100)

7.3 三维数据的统计变换参数设定

7.3.1 等高线图

m + stat_contour(aes(z = z))

7.3.2 线段图

m+ geom_spoke(aes(radius= z, angle = z))

7.3.3 六角形图

m + stat_summary_hex(aes(z = z), bins = 30, fun = mean)

7.3.4 栅格图

m + stat_summary_2d(aes(z = z), bins = 30, fun = mean)

7.4 组间比较

7.4.1 箱线图

g + stat_boxplot(coef = 1.5)

7.4.2 提琴图参数设定

g + stat_ydensity(adjust = 1, kernel = "gaussian", scale = "area")

7.4.3 累积曲线

f + stat_ecdf(n = 40)

7.4.4 分位数曲线图

f + geom_quantile(quantiles = c(0.25, 0.5, 0.75), formula = y ~ log(x), method = "rq")

7.4.5 Loess回归以及置信区间统计变换的参数设定

f + geom_smooth(method = "auto", formula = y ~ x, se = TRUE, n = 80, fullrange = FALSE, level = 0.95)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

7.4.6 绘制dnorm的概率密度分布

ggplot() + stat_function(aes(x = -3:3), fun = dnorm, n = 101, args = list(sd=0.5))

7.4.7 绘制散点图

f + stat_identity()

7.4.8 绘制qq图

ggplot() + stat_qq(aes(sample=1:100), distribution = qt, dparams = list(df=5))

7.4.9 绘制散点图, 点的大小为该点数据出现的次数

f + stat_sum()

7.4.10 带误差线的点图

f + stat_summary(fun.data = "mean_cl_boot")
## Warning: Removed 3 rows containing missing values (geom_pointrange).

7.4.11 无重复散点图

f + stat_unique()

8 图例

ggplot2 的图例与图形是一个整体, 设定图例的参数, 图例会更改, 设定图形的参数, 图例会自动更改。scale 控制图形中的颜色,文字显示, 图例中的图形。

n <- b + geom_bar(aes(fill = fl))
n

##### 柱状图设定颜色, 各组名称, 图例中各组名, 类别划分
n + scale_fill_manual(
   values = c("skyblue", "royalblue", "blue", "navy"),
   limits = c("d", "e", "p", "r"), 
   breaks =c("d", "e", "p", "r"),
   name = "fuel", labels = c("D", "E", "P", "R"))

8.1 坐标轴的控制

按照数据的类别, 分为

scale_x_continuous()
scale_x_discrete()
scale_x_identity()
scale_x_manual(values = c())
scale_y_continuous()
scale_y_discrete()
scale_y_identity()
scale_y_manual(values = c())

这几个函数的参数主要为:

  • alpha, 透明度

  • color, 颜色序列

  • fill, 颜色序列

  • linetype, 线段类型

  • shape, 点的形状

  • size, 点的大小

8.1.1 x轴显示日期

library(scales)
scale_x_date(labels = date_format("%m/%d"), breaks = date_breaks("2 weeks"))

8.1.2 x轴显示为日期和时间

scale_x_datetime()

8.1.3 x轴转换为以10为底的对数

scale_x_log10()

8.1.4 x轴逆向显示

scale_x_reverse()

8.1.5 x轴平方根变换

scale_x_sqrt()

9 颜色

颜色主要用来显示分组,或者数据的连续梯度变化。

9.1 颜色设定

在ggplot2中,可以通过scale_fill_brewer(palette = "")函数,可以将色系调整为以下任何一种。

9.1.1 最大差异色系 Diverging

BrBG, PiYG, PRGn, PuOr, RdBu, RdGy, RdYlBu, RdYlGn, Spectral

9.1.2 离散色系 Qualitative

Accent, Dark2, Paired, Pastel1, Pastel2, Set1, Set2, Set3

9.1.3 序列色系 Sequential

Blues, BuGn, BuPu, GnBu, Greens, Greys, Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples, RdPu, Reds, YlGn, YlGnBu, YlOrBr, YlOrRd

通过aes设定分组之后,如fill, color, group等,ggplot会自动设定颜色。点图、栅格图等连续变量,默认为深蓝色色系(“Diamond\nclarity”)。

调整图形颜色的函数还包括:

  • scale_colour_brewer

  • scale_fill_brewer

  • scale_colour_distiller

  • scale_fill_distiller

  • scale_colour_gradient

  • scale_fill_gradient

  • scale_colour_gradient2

  • scale_fill_gradient2

  • scale_colour_gradientn

  • scale_fill_gradientn

  • scale_colour_grey

  • scale_fill_grey

  • scale_colour_hue

  • scale_fill_hue

等多种,分别用来对画布中的点线面进行不同的填充设色等。

n <- b + geom_bar(aes(fill = fl))

9.1.4 R中调色板设置

n + scale_fill_brewer(palette = "Blues")

n + scale_fill_brewer(palette = "BrBG")

9.1.4.1 R中的灰色梯度显示柱状图

n + scale_fill_grey( start = 0.2, end = 0.8, na.value = "red")

9.1.4.2 通过 scale_fill_gradient显示颜色过渡

o <- a + geom_dotplot(aes(fill = ..x..)) 
o + scale_fill_gradient( low = "red", high = "yellow")
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

9.1.4.3 通过scale_fill_gradient2显示颜色过渡

o + scale_fill_gradient2( low = "red", high = "blue", mid = "white", midpoint = 25 )
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

9.1.4.4 选择颜色序列

o + scale_fill_gradientn(colours = terrain.colors(6) )
## `stat_bindot()` using `bins = 30`. Pick better value with `binwidth`.

其他可以选择的颜色: rainbow(), heat.colors(), topo.colors(), cm.colors(), RColorBrewer::brewer.pal()

10 形状

绘制散点图时,不同形状的点表示分组,ggplot2已经尽可能做了最优化处理。以保证各组点的形状都能做较好区分。如果要表示的分组数量太多,ggplot2会给出相应警告。

10.1 按照形状分组

10.1.1 点图标的选择

p <- f + geom_point(aes(shape = fl))

10.1.2 显示空心图标

p + scale_shape(solid = FALSE)

10.1.3 指定点图标

p + scale_shape_manual(values = c(3:7))

10.2 更改图标大小

#### 设定图标大小与变量的关系q <- f + geom_point(aes(size = cyl)) 
#### 设定图标大小的范围q + scale_size_area()

11 坐标系

每个图形,只能设定一个坐标系。默认情况下,ggplot2使用平面直角坐标系。用户可以指定使用极坐标coord_polar,也可以通过coord_trans,coord_flip等对坐标轴的刻度进行相应变换。

11.1 平面直角坐标系

r <- b + geom_bar()
r + coord_cartesian(xlim = c(0, 5))

11.2 横轴、纵轴以固定比例显示

r + coord_fixed(ratio = 1/2)

11.3 横轴纵轴调换

r + coord_flip()

11.4 极坐标, 适用于绘制饼图

r + coord_polar(theta = "x", direction=1 )

11.4.1 横轴、纵轴的变换,如 log, sqrt等

r + coord_trans(y = "sqrt")

11.5 设定坐标轴范围

t + coord_cartesian(xlim = c(0, 100), ylim = c(10, 20))
## NULL
t + xlim(0, 100) + ylim(10, 20)
## NULL

12 细节调整

12.1 柱状图的叠加以及比较

12.1.1 并排排列

s <- ggplot(mpg, aes(fl, fill = drv))
s + geom_bar(position = "dodge")

12.1.2 堆叠排列

s + geom_bar(position = "stack")

12.1.3 按百分比堆叠排列, 各柱子等高

s + geom_bar(position = "fill")

12.1.4 散点图的随机化

在每个点的x,y方向上都加上较小的随机值, 以便点能散开。

f + geom_point(position = "jitter")

13 绘图主题与风格

所谓主题,就是绘图的风格。通过设定图形的主题,可以生成各种风格的图形。

ggplot2自身提供了一些主题,如:

  • theme_grey()

  • theme_gray()

  • theme_bw()

  • theme_linedraw()

  • theme_light()

  • theme_dark()

  • theme_minimal()

  • theme_classic()

  • theme_void()

  • theme_test()

t <- ggplot(mpg, aes(cty, hwy)) + geom_point()
t + theme_grey()
t + theme_classic()
t + theme_minimal()

ggthemes程序包(https://jrnold.github.io/ggthemes/reference/index.html)提供了更多主题,加载后,即可与ggplot2混合使用。

  • theme_base(): 模拟plot()的风格

  • theme_calc(): LibreOffice Calc风格

  • theme_economist() : 经济学家杂志风格

  • theme_economist_white(): 经济学家杂志

  • theme_excel(): 微软Office Excel传统风格

  • theme_excel_new(): 微软Office Excel最新风格

  • theme_few():Few’s “Practical Rules for Using Color in Charts”

  • theme_fivethirtyeight(): Theme inspired by fivethirtyeight.com plots

  • theme_foundation()

  • theme_gdocs() : google文档风格

  • theme_hc(): Highcharts Theme

  • theme_igray(): 逆向灰色梯度风格

  • theme_map(): 简约地图风格 Clean theme for maps

  • theme_pander() : A ggplot theme originated from the pander package

  • theme_par(): Theme which uses the current ‘base’ graphics parameter values from par(). Not all par() parameters, are supported, and not all are relevant to ggplot2 themes.

  • theme_solarized() theme_solarized_2(): ggplot color themes based on the Solarized palette

  • theme_solid(): Theme with nothing other than a background color

  • theme_stata(): Stata统计软件绘图风格

  • theme_tufte():Tufte Maximal Data, Minimal Ink Theme

  • theme_wsj():华尔街日报风格 Wall Street Journal theme

更多细节调整,可以查看theme()函数。

14 图形分面 facet

当要按照某一个因子的不同水平,将每个水平分别展示在不同的图形时,可以使用图形分面。例如,各省份GDP的逐年变化,可以按照年份绘制多个地图,每个小地图(分面)只展示该年份的GDP即可。

###按照因子组合绘制多图
t <- ggplot(mpg, aes(cty, hwy)) + geom_point()
t + facet_grid(. ~ fl)    ### 按照列, 排列不同 fl

t + facet_grid(year ~ .)  ### 按照行, 排列不同 year

t + facet_grid(year ~ fl) ### 行为 year, 列为 fl

t + facet_wrap(~ fl)      #### 设定显示为几行几列, nrow = NULL, ncol = NULL

#### 每幅图小标题的显示
t + facet_grid(. ~ fl, labeller = label_both)

t + facet_grid(. ~ fl, labeller = label_bquote(alpha ^ .(x)))

t + facet_grid(. ~ fl, labeller = label_parsed)

15 标题和坐标轴

15.1 更改标题和坐标轴名称

默认情况下,ggplot2绘制的图形并没有标题,添加标题,可以用ggtitle函数。

t + ggtitle("New Plot Title")  ### 标题

t + xlab("New X label")        ### x轴标题

t + ylab("New Y label")        ### y轴标题

t + labs(title =" New title", x = "New x", y = "New y") ### 同时设定标题, xy轴标题

ggtitle添加的标题默认是向左排列的,要设置标题居中,则用theme函数。

t + ggtitle("New Plot Title")+
  theme(plot.title = element_text(hjust = 0.5))

15.2 图例位置

t2 <- ggplot(mpg, aes(cty, hwy, color = trans)) + geom_point()
t2 + theme(legend.position = "bottom") 
###"bottom", "top", "left", or "right"

t2 + guides(color = "none")

t2 + scale_fill_discrete(name = "Title", labels = c("A", "B", "C"))

15.3 添加标注

而在ggplot2中,使用的是annotate()。annotate可以添加,文字、多边形或者任何其他geom对象。

16 绘制地图

16.1 geom_map

data <- data.frame(murder = USArrests$Murder,
    state = tolower(rownames(USArrests)))
    map <- map_data("state")

l <- ggplot(data, aes(fill = murder))

l + geom_map( aes(map_id = state), map = map ) + 
    expand_limits( x = map$long, y = map$lat )

16.2 geom_polygon

### 地图投影变换
### see:  
library(maps)
thismap = map_data("world")
ggplot(thismap, aes(long, lat, group=group)) +
  geom_polygon(fill="white", colour="gray") + 
  coord_map(projection = "ortho", orientation=c(41, -74, 0))

16.3 geom_sf

ggplot2 程序包还可以支持sf程序包的对象,geo_sf系列函数可以较为方便地生成地图。

由于sf程序包的st_read, st_transform, st_as_sf提供了读取和转换空间数据的办法,因此通过sf读取和处理空间数据,用ggplot2进行可视化,不失为很好的选择。

stat_sf()
geom_sf()
geom_sf_label()
geom_sf_text()
coord_sf()

17 保存图像

ggplot2的ggsave函数,可以根据图形的扩展名, 将ggplot2绘制的图形保存为相应的文件格式,默认保存7×7英寸, 300dpi的图形。

ggsave()

第0部分:设置

library(ggplot2)
library(dplyr)
library(Rgraphviz)
library(knitr)
library(grid)
library(gridExtra)

load("brfss2013.RData")
# 分组统计
feature_vcounts <- function(df, f) {
  df %>%
    group_by_at(f) %>%
      count()}

# 离散化方法
bin_min_sample <- function(p) {
  n = 10
  a = 10/p
  b = 10/(1-p)
  max(c(a,b))}

# 模拟分布
binom_prob_df <- function(df, f, target) {
  new_df <- feature_vcounts(df,f)
  new_df$n[new_df[f] == target]/sum(new_df$n)}

# 过滤数据
subgroup_df <- function(df,f, group) {
  filter(df,df[f]==group)}

# 计算概率
binom_prob_vec <- function(v, target) {
  sum(v == target)/length(v)}

# 进行抽样
binom_sample <- function(s,v)
  sample(v, size=s, replace=TRUE)

 binom_sample_dist <- function(df,f,target) {
  sample_dist <- c()
  for (i in 1:10001) {
    prob <- binom_prob_vec(binom_sample(100,df[,f]),target)
    sample_dist <- append(sample_dist,prob)}
  return(sample_dist)}

# convert decimal to percent
to_percent <- function(pvalue) {
  paste(round(pvalue*100,digits= 2),"%",sep="")}


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

第1部分:数据

导入和过滤数据以仅包括与糖尿病,性别,体重和年龄有关的重要特征。

# 导入原始数据
orig_dim <- dim(brfss2013)

#筛选相关特征
weight_diabetes <- brfss2013 %>%
   select(sex, X_ageg5yr, weight2,diabete3)

# ------------------Cleaning data------------------
# 1.数值化
weight_diabetes$weight2 <- as.numeric(as.character(weight_diabetes$weight2))
new_dim <- dim(weight_diabetes)

# 2. 删除部分数据
weight_diabetes <- na.omit(weight_diabetes)
weight_diabetes <- filter(weight_diabetes, weight2 <= 400)

# 3. 消除糖尿病反应

target <- c("Yes", "No")
weight_diabetes <- filter(weight_diabetes, diabete3 %in% target)

# 4. 排序
weight_diabetes$index <- seq.int(nrow(weight_diabetes))
weight_diabetes <- weight_diabetes[c(4,3,1,2)]
clean_dim <- dim(weight_diabetes)

# 查看数据
kable(head(weight_diabetes,n=5), caption="Diabetes Data Set",padding=0, format = "markdown",align="l")
糖尿病 重量 性别X_ageg5yr
没有25060至64岁
没有12750至54岁
没有16055至59岁
没有12860至64岁
没有26565至69岁

数据看起来很简单,仅包含该项目所需的功能。因为数据需要匿名,所以年龄范围是特定年龄的安全替代方案。年龄范围将用作此数据集的分类信息。

第2部分:研究问题

研究问题1:

性别,体重和年龄之间有相关性吗?(变量:性别,weight2,X_ageg5yr)

由于性别是生物识别技术中的关键变量,因此探讨性别是否可能与其他变量相关很重要。在这种情况下,我们正在研究性别是否与体重相关。

研究问题2:

性别或年龄与糖尿病相关吗?怎么样?(变量:性别,X_ageg5yr,weight2,diabete3)

该探索性项目的目标是检查体重/性别/年龄是否与糖尿病相关。了解任何相关性可能有助于根据患者的性别和体重告知患者患糖尿病的可能性。

研究问题3:

年龄,体重和糖尿病之间有关系吗?(变量:性别,X_ageg5yr,weight2,diabete3)

为了进一步探讨与糖尿病的可能相关性,我们还将研究四个变量之间的关系。


第3部分:探索性数据分析

研究问题1:

性别,体重和年龄之间有相关性吗?(变量:性别,weight2,X_ageg5yr)

首先检查数据的分布很重要。性别是二元分类的,因此我们将用条形图形象化它的分布。


R语言数据可视化分析案例:探索BRFSS数据

阅读文章


centered <- theme(plot.title = element_text(hjust = 0.5))
hist_weight <- ggplot(data=weight_diabetes,aes(weight2,  fill=weight2))+
  geom_histogram(fill='salmon',color='white') + ggtitle("Histogram [Weight]") + centered
weight_diabetes$log_weight <- log(weight_diabetes$weight2)
hist_log_weight <- ggplot(data=weight_diabetes,aes(log_weight, fill=log_weight))+
  geom_histogram(fill='mediumturquoise',color='white') + ggtitle("Histogram [Log_Weight]") + centered
grid.arrange(hist_weight, hist_log_weight, ncol = 2)

对于Weight2,分布右偏,而Weight2的对数接近正态。由于数据的对数规范版本几乎是正常的单峰数据,因此可以将权重用于推断统计中的后续分析。

​ 
女性参加者比男性参加者更多,其幅度大大超过美国的总人口。这可能表明抽样方法在性别抽样方面并非完全随机。但是,数据样本足够大,可以继续评估健康风险因素。


随时关注您喜欢的主题


​年龄范围似乎在两端都偏向极端。

​在比较年龄和体重时,性别的体重分布似乎确实存在明显差异。男性似乎比女性重。

还应注意,似乎还有一些成年患者体重不足50磅,许多患者体重约400磅。数据收集过程的未来分析应探索这些高低异常值是否是错误,或者它们是否反映出患有严重健康问题的患者。

当观察样本中的女性和男性参与者时,报告的糖尿病比率非常相似。

研究问题2:

体重,年龄和/或性别与糖尿病相关吗?怎么样?(变量:性别,X_ageg5yr,weight2,diabete3)

​ 

​随着年龄的增长,直到80岁及更高年龄,糖尿病的报告比例也似乎会增加。年龄可能与糖尿病有某种程度的相关性。

​随着体重增加,所报告的糖尿病比例也增加。体重似乎与报告的糖尿病有很强的相关性,应进一步探讨。

研究问题3:

年龄,体重和糖尿病之间有关系吗?(变量:性别,X_ageg5yr,weight2,diabete3)

​ 
报告患有糖尿病的男性和女性的体重分布均较高。男性的体重分布比女性重。

​这些箱线图描绘了一个更清晰的故事。报告患有糖尿病的患者似乎在每个年龄段都较重。报告患有糖尿病的年轻患者似乎比老年患者具有更大的体重范围。虽然尚不清楚年龄与糖尿病和体重之间的关系,但应进一步探讨这种关系。

第4部分:结论

从数据的初步探索中可以明显看出,某些功能具有比其他功能更强的相关性。体重与性别有关。性别似乎与体重无关。但是,糖尿病似乎与年龄有关,而与体重密切相关。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds