关键字:R语言, 统计分析, 概率密度图,联合分布图,箱线图, 小提琴图
R语言画的图,当在论文或PPT上呈现时,可能会有字体太小,或者线条太细以及配色等问题,本文把相关代码写在一起,可直接使用这些代码片,画出好看的图片,直接就调整配色,字体等。
使用数据:
UCI数据库Heart Disease数据集
(http://archive.ics.uci.edu/ml/datasets/Heart+Disease)
本文使用的是这个数据集的一个子集(共14列)
(https://github.com/xjcjiacheng/data-analysis/tree/master/heart%20disease%20UCI)
所有代码和数据都在这里:
https://github.com/wushangbin/tripping/tree/master/R_Plot
1 相关性计算
可以计算多个特征与label之间的 残差统计量(Deviance Residuals),回归系数(Estimate),标准差,Z统计量和P值等。
data = read.csv("./heart.csv")
# print(names(data)) 可以查看这个数据有哪些列
# data是读取的dataframe,target,age,sex,cp,chol,trestbps都是数据中的列名。
model <- glm(target~age+sex+cp+chol+trestbps, data = data, family='binomial')
summary(model)
结果如下:
Call:
glm(formula = target ~ age + sex + cp + chol + trestbps, family = "binomial",
data = data)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.5320 -0.7584 0.2806 0.7685 2.2828
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 7.579089 1.536048 4.934 8.05e-07 ***
age -0.059743 0.017652 -3.384 0.000713 ***
sex -1.916315 0.351638 -5.450 5.05e-08 ***
cp 1.065319 0.151163 7.048 1.82e-12 ***
chol -0.003965 0.002819 -1.407 0.159552
trestbps -0.020903 0.008557 -2.443 0.014579 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 417.64 on 302 degrees of freedom
Residual deviance: 302.13 on 297 degrees of freedom
AIC: 314.13
使用caret里的train可以输出误差
library(caret)
model <- train(target~age+sex+cp+chol+trestbps, data=data, method='glm', family='binomial')
print(model) # 注意这里是print,如果用summary,输出和上面是一样的
输出结果:
Generalized Linear Model
303 samples
5 predictor
No pre-processing
Resampling: Bootstrapped (25 reps)
Summary of sample sizes: 303, 303, 303, 303, 303, 303, ...
Resampling results:
RMSE Rsquared MAE
0.4216974 0.2939183 0.339408
2 单变量分布可视化
2.1 概率密度分布图
适用于连续型变量。我这里一键调颜色,调字体。 画trestbps的概率密度分布图,并对sex进行区分。
library(ggplot2)
data$sex <- as.factor(data$sex) # 先把sex转化成factor,不然R会处理为整型的0,1
ggplot(data, aes(x = trestbps)) + geom_line(size=3, colour = "cadetblue3", stat = "density") +
geom_rug(aes(colour = sex), sides = "b") +
theme(axis.title.x =element_text(size=20), axis.title.y=element_text(size=20))
2.2 直方图和条形图
要注意区分直方图(也即柱状图,hist, histogram)和条形图(barplot, bar chat)。虽然这两个图的形状很像,但是直方图反应的是一列数据的分布,而条形图反应的是每个元素的大小。我们以2020年第七次中国人口普查的数据为例,画一下直方图和条形图。
population = read.csv("./China_Population.csv")
hist(population$population2020)
barplot(population$population2020, names.arg = population$ChineseName, las=2)
可以看到,直方图是只用选择一列数据,画出这一列数据的分布即可,横轴是人口数量,而纵轴是Frequency;但条形图是要多选一列数据作为label,可直观地看出每个数据的大小。
3 小提琴图与箱线图
把这两个图放到一起,因为它们都反应的是离散型变量和连续型变量之间的关系。我还是拿刚刚的两个变量,sex和trestbps举例子。
3.1 箱线图
library(ggplot2)
data$sex <- as.factor(data$sex) # 先把sex转化成factor,不然R会处理为整型的0,1
ggplot(data, aes(sex, trestbps)) +
geom_boxplot(aes(fill = sex)) +
stat_summary(fun = "mean", fill = "white", size = 2, geom = "point", shape = 23) +
theme(axis.title.x =element_text(size=20), axis.title.y=element_text(size=20))
3.2 小提琴图
library(ggplot2)
data$sex <- as.factor(data$sex) # 先把sex转化成factor,不然R会处理为整型的0,1
ggplot(data, aes(sex, trestbps)) +
geom_violin(aes(fill = sex), show.legend = FALSE) + geom_jitter(width = 0.1) +
theme(axis.title.x =element_text(size=20), axis.title.y=element_text(size=20))
4 联合分布
4.1 二维直方图
这次画的是chol 和 trestbps两个变量
library(ggplot2)
ggplot(data, aes(chol, trestbps)) +
geom_bin2d() +
theme(axis.title.x =element_text(size=20), axis.title.y=element_text(size=20))
4.2 联合概率密度分布图
这次选的两个连续型变量分别是chol和trestbps,在sex上进行区分
library(ggpubr)
data$sex <- as.factor(data$sex) # 先把sex转化成factor,不然R会处理为整型的0,1
ggscatterhist(
data, x ='chol', y = 'trestbps',
shape=21,color ="black",fill= "sex", size =3, alpha = 0.8,
palette = c("#00AFBB", "#E7B800", "#FC4E07"),
margin.plot = "density",
margin.params = list(fill = "sex", color = "black", size = 0.2),
legend = c(0.9,0.15),
ggtheme = theme_minimal()) +
theme(axis.title.x =element_text(size=20), axis.title.y=element_text(size=20))
4.3 散点图
这一次我们给散点图加点东西,比如,画散点图,并给散点图加标签,然后散点的颜色和大小也赋予意义,不同散点的颜色和大小是不一样的:
ggplot(population, aes(x=popChange, y=percentChange)) +
geom_point(aes(size=population2020, color=population2020)) + # 这里散点颜色和大小是同一个含义,可根据需要调整
geom_text(aes(label=ChineseName), size=4, hjust=1, vjust=-1) # 给散点加label
但是这样加标签的话你跑一下就知道了,每个散点都有标签,看起来很乱,所以我们接下来,只给满足要求的散点加标签,并且,在右边的图例中把最小值,最大值和中位数标出来:
minPerChange <- 10
minPopChange <- 1000000
population$keyProvince <- population$popChange>minPopChange & population$percentChange > minPerChange
minLabel <- format(min(population$population2020), big.mark = ",", trim = TRUE)
maxLabel <- format(max(population$population2020), big.mark = ",", trim = TRUE)
medianLabel <- format(median(population$population2020), big.mark = ",", trim = TRUE)
g <- ggplot(population, aes(x=popChange, y=percentChange)) +
geom_point(aes(size=population2020, color=population2020, shape=keyProvince)) +
geom_text(data = population[population$popChange > minPopChange & population$percentChange > minPerChange,],
aes(label=ChineseName, hjust=1, vjust=-1)) +
# 加图例,展示出最小值,最大值和中位数
scale_color_continuous(name="Pop", breaks = with(population, c(
min(population2020), median(population2020), max(population2020))),
labels = c(minLabel, medianLabel, maxLabel), low = "white", high = "black")
g
4.4 回归线
画完散点图之后,画上回归线并加置信区间:
if (TRUE) {
ggplot(population, aes(x=population2010, y=popChange)) +
geom_point() +
stat_smooth(method="lm", col="red")
}