利用R语言进行探索性数据分析(EDA)

在数据进行建模或者严格的统计分析之前,我们一般需要先熟悉一下数据,弄清楚各变量的分布以及变量之间的关系,为进一步构建严格的模型,深入的分析打下基础。探索性数据分析(EDA)就是为了获得对数据的初步了解。
这篇文章,来源于自己课程学习实践的一个项目,主要是利用R语言进行探索性数据分析。用到的数据,是普遍使用的白葡萄酒的数据。主要内容涉及对单个变量,两个变量之间关系,多个变量之间的关系的一个探索。
单个变量的探索,主要利用的是柱形图,查看各变量的整体分布。两个变量的探索,主要分析变量之间是否存在相关关系,对于两个连续型变量可以使用散点图,一个连续型变量和离散型变量可以使用箱线图查看整体趋势;另外,定量分析可以使用相关系数矩阵和线性模型。三个变量的探索,可以使用气泡图,或者用颜色区分第三各变量。一般来说,探索性数据分析都是为后面具体的深入分析打基础的,所以也会一定的方向性。但是这篇文章为自己的探索性数据分析的课程项目,所以篇幅较长。主要的分析方向是探索影响白葡萄酒质量的因素。

数据总体概览

在探索数据之前,我们先对数据有一个总体的概览。我们先导入数据

pf=read.csv('wineQualityWhites.csv')

查看数据整体的大小

dim(pf)  #查看数据行列数

在这里插入图片描述
整个数据有4898条,涉及13各变量。接着我们查看一下具体的信息:

summary(pf) #查看数据具体信息

利用R语言进行探索性数据分析(EDA)_第1张图片
数据设计及到的变量有,白葡萄酒的固定酸度、挥发性酸度、柠檬酸度、残糖量、白葡萄酒质量等。在对数据有了总体的概观以后,我们可以开始探索了。先导入相应的包资源:

library(ggplot2)
library(GGally)
library(scales)
library(memisc)
library(dplyr)
library(corrplot)
library(PerformanceAnalytics)
library(knitr)

单变量探索

白葡萄酒数据主要涉及的是每一类白葡萄酒的质量,以及它具有的一些属性。我们主要关注的问题是什么因素会影响到白葡萄酒的质量。首先我们对白葡萄酒的质量有一个总体的概观:

qplot(x=quality,data=pf,ylab = 'count')+scale_x_continuous(lim=c(2,10),breaks = seq(2,10,1)) #绘制quality的柱形图

从上面的总体分析中,可以看到白葡萄酒的质量最低为3,最高为9,为了更能充分的展示,这里用scale_x_continuous来限制x轴的范围,并设置x轴的断点。最后结果为:
利用R语言进行探索性数据分析(EDA)_第2张图片
从上面的直方图中可以看到整个白葡萄酒各种质量的分布情况。从直方图中可以看到,白葡萄酒的质量大部分集中在5,6,7这三类。由于我们最终的目的是为了探索影响白葡萄酒质量的因素,所以在分析每个变量时,还分析了高质量和低质量葡萄酒在这个变量上的区别。为了突出这种差异,我们把3和4作为低质量的一列,8和9作为高质量的一列。切分的代码如下:

pf1=subset(pf,pf$quality<5)
pf2=subset(pf,7<pf$quality)  #按质量值切分数据

接下来会涉及到大量的图形绘制,而且很多的代码类似,所以这里先设置一个绘图函数:

creat_plot=function(name,binwidth){
  return(ggplot(aes_string(x=name),data=pf,ylab = 'count')+geom_histogram(binwidth=binwidth))   #构建绘图函数
}  

1.固定酸度

首先,我们来看一下固定酸度。

creat_plot('fixed.acidity',0.07)               #绘制固定酸度的分布图

利用R语言进行探索性数据分析(EDA)_第3张图片
固定酸度值的分布大致为正态分布,大部分值都集中在6-8之间。我们来看一下高、低质量的区别:

summary(pf1$fixed.acidity)
summary(pf2$fixed.acidity)

利用R语言进行探索性数据分析(EDA)_第4张图片
高质量和低质量的白葡萄酒的固定酸度也都集中在6-8之间。

2.挥发性酸度

creat_plot('volatile.acidity',0.007)           #绘制挥发性酸度的分布图

利用R语言进行探索性数据分析(EDA)_第5张图片

summary(pf1$volatile.acidity)
summary(pf2$volatile.acidity)

利用R语言进行探索性数据分析(EDA)_第6张图片
挥发性酸度值也大致服从正态分布,大部分分布在0.15-0.35之间。可以看到,高低质量的白葡萄酒的挥发性酸度值的分布情况很相近。

3.柠檬酸度

creat_plot('citric.acid',0.01)                  #绘制柠檬酸度分布图

利用R语言进行探索性数据分析(EDA)_第7张图片

summary(pf1$citric.acid)
summary(pf2$citric.acid)

利用R语言进行探索性数据分析(EDA)_第8张图片
柠檬酸度值大部分分布在0.25-0。45之间。高低质量的白葡萄酒的柠檬酸度至也大致在这个范围。

4.残糖量

creat_plot('residual.sugar',0.1) #绘制残糖量分布图

利用R语言进行探索性数据分析(EDA)_第9张图片
可以看到白葡萄酒的残糖量在0-20之间。为了跟好的观察,我们把x轴的跨度限制在0-20,如下图:

creat_plot('residual.sugar',0.1)+scale_x_continuous(lim=c(0,20))

利用R语言进行探索性数据分析(EDA)_第10张图片

5.酒精度

creat_plot('alcohol',0.05)   #绘制酒精度分布图

利用R语言进行探索性数据分析(EDA)_第11张图片
可以看到白葡萄酒的酒精度大部分集中在8.5-13之间。我的一个兴趣点就是研究酒精度对白葡萄酒质量的影响。为了更好地观察,我们把x轴的范围限制8.5-13之间。如下图:

creat_plot('alcohol',0.05)+scale_x_continuous(lim=c(8.5,13))

利用R语言进行探索性数据分析(EDA)_第12张图片

#绘制低质量白葡萄酒的酒精度分布图
qplot(x=alcohol,data=pf1,ylab = 'count',binwidth=0.05)+
  #添加标题
  ggtitle("alcohol of low_quality")+
  #标题居中
    theme(plot.title=element_text(hjust=0.5))  

利用R语言进行探索性数据分析(EDA)_第13张图片

#绘制高质量白葡萄酒的酒精度分布图
qplot(x=alcohol,data=pf2,ylab = 'count',binwidth=0.05)+
  #添加标题
  ggtitle("alcohol of high_quality")+
     #标题居中
     theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第14张图片
可以看到低质量的白葡萄酒的酒精度大部分集中在10的附近。而高质量的白葡萄酒的酒精度大部分集中在12的附近。

6.氯化物含量

#绘制氯化物含量分布图
creat_plot('chlorides',0.001)

利用R语言进行探索性数据分析(EDA)_第15张图片

#绘制低质量氯化物含量分布图
qplot(x=chlorides,data=pf1,ylab = 'count',binwidth=0.001)+
  #添加标题
  ggtitle("chlorides of low_quality")+
     #标题居中
     theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第16张图片

#绘制高质量氯化物含量分布图
qplot(x=chlorides,data=pf2,ylab = 'count',binwidth=0.001)+
  #添加标题
  ggtitle("chlorides of high_quality")+
    #标题居中
    theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第17张图片
总体的白葡萄酒的氯化物含量在0-0.1之间。而高质量的白葡萄酒的氯化物含量大部分在0.025-0.05之间。

7.游离二氧化硫含量

creat_plot('free.sulfur.dioxide',1)

利用R语言进行探索性数据分析(EDA)_第18张图片

summary(pf1$free.sulfur.dioxide)
summary(pf2$free.sulfur.dioxide)

利用R语言进行探索性数据分析(EDA)_第19张图片
总体上,游离二氧化硫的含量在0-100之间。而高低质量的白葡萄酒在大致在这个范围之内,有一点是高质量的白葡萄酒都在100以内。

8.总二氧化硫含量

creat_plot('total.sulfur.dioxide',1)

利用R语言进行探索性数据分析(EDA)_第20张图片

summary(pf1$total.sulfur.dioxide)
summary(pf2$total.sulfur.dioxide)

利用R语言进行探索性数据分析(EDA)_第21张图片
总体上,白葡萄酒的总二氧化硫的含量大部分在100-200之间。高低质量的白葡萄酒的含量也大致在这个范围内。

9. 密度

#绘制密度分布图
creat_plot('density',0.0006)

利用R语言进行探索性数据分析(EDA)_第22张图片

summary(pf1$density)
summary(pf2$density)

利用R语言进行探索性数据分析(EDA)_第23张图片
白葡萄酒的密度值大部分集中在0.9871-1之间,彼此相差不是很大。

10.pH值

#绘制pH值分布图
creat_plot('pH',0.01)

利用R语言进行探索性数据分析(EDA)_第24张图片

summary(pf1$pH)
summary(pf2$pH)

利用R语言进行探索性数据分析(EDA)_第25张图片
白葡萄酒的pH值大部分分布在3-3.3之间。高质量和低质量的白葡萄酒的pH值分布差不多。

11.硫酸盐含量

#绘制硫酸盐含量分布图
creat_plot('sulphates',0.01)

利用R语言进行探索性数据分析(EDA)_第26张图片

summary(pf1$sulphates)
summary(pf2$sulphates)

利用R语言进行探索性数据分析(EDA)_第27张图片

白葡萄酒的硫酸盐量大部分分布在0.3-0.6之间。高低质量的白葡萄酒的硫酸盐含量差不多。

单变量分析总结:

共有4898条白葡萄酒数据,数据中包含12各变量。其中除quality这个变量为分类变量,其他全为连续型变量。
quality:3,4,5,6,7,8,9
质量总共有3-9七个品类,3为最低质量,9为最高质量。
其他变量:
1.固定酸度大部分在6-8之间;挥发性酸度大部分在0.15-0.35之间;柠檬酸度大部分在0.25-0.45之间。
2.残糖量大部分在0-20;酒精度大部分在8.5-13之间;氯化物大部分在0-0.1之间。
3.游离二氧化硫大部分在0-100之间;总二氧化硫大部分在100-200之间。
4.密度在0.9871-1.03之间;pH至在2.72-3.82之间;硫酸盐含量在0.22-1.08之间。

双变量分析

双变量分析,在于探索哪些变量之间会存在关系,一般采用散点图和计算相关系数,箱线图可以可视化群体间的差异。
首先我们计算所有变量之间的相关系数:

co=cor(pf)     #计算各变量之间的相关系数

可视化相关系数

#可视化相关系数
corrplot(co, type="upper", order="hclust", tl.col="black", tl.srt=45)

利用R语言进行探索性数据分析(EDA)_第28张图片
另外,可以看查看具体的数值:

#展示具体的相关系数值和p值
chart.Correlation(pf,histogram = TRUE,pch=19)

利用R语言进行探索性数据分析(EDA)_第29张图片
从上面的相关性分析可以看到,酒精度和白葡萄酒的质量有最大的正相关性,密度和白葡萄酒的质量有最大的负相关性。接下来,用箱线图展示几个相关系数较大的变量与白葡萄酒质量的具体关系。

#绘制酒精度和质量之间的箱线图
boxplot(alcohol~quality,data=pf,xlab='quality',ylab='alcohol')

利用R语言进行探索性数据分析(EDA)_第30张图片
并没有一个固定的趋势展示白葡萄酒的质量越高,酒精度越高。但可以看到高质量的白葡萄酒的酒精度会相对来说高一点。

#绘制密度和质量之间的箱线图
boxplot(density~quality,data=pf,xlab='quality',ylab='density')

利用R语言进行探索性数据分析(EDA)_第31张图片
虽然白葡萄酒的密度值相差不是很大,但有个个比较明显的趋势是质量越高的白葡萄酒的密度较低。

#绘制氯化物含量与质量之间的箱线图
boxplot(chlorides~quality,data=pf,xlab='quality',ylab='chlorides')

利用R语言进行探索性数据分析(EDA)_第32张图片
白葡萄酒的质量和氯化物的含量并不是很明显的负相关。但高质量的白葡萄酒的氯化物含量相对较低。下面对酒精度和白葡萄酒质量进行更细致的分析:

#将数据按质量分组并计算各组的酒精度均值
pf_alcohol_by_quality=pf%>%group_by(quality)%>%summarise(alcohol_mean=mean(alcohol))%>%arrange(quality)
#可视化各组的均值
qplot(x=quality,y=alcohol_mean,data=pf_alcohol_by_quality)+
  #添加标题
  ggtitle("mean of alcohol for each quality")+
    #标题居中
    theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第33张图片
从上面的酒精度均值的散点图中可以看到,高质量的白葡萄酒的酒精度相对来说会高一点。
定量分析:

#构建质量和酒精度之间的线性模型
m1=lm(I(quality)~I(alcohol),data=pf)
summary(m1)

利用R语言进行探索性数据分析(EDA)_第34张图片
对白葡萄酒质量和酒精度构建线性模型可以看到,R-squared值为0.1897。所以,相关性最强的酒精度也不能充分解释白葡萄酒的质量。另外,从散点图中看到,质量和酒精度在质量为5的时候有个折点。因此,对质量高于5的白葡萄酒进行线性建模,如下所示:

#取出质量高于4的数据子集
pf4=subset(pf,pf$quality>4)
#对质量高于4的数据构建线性模型
m1=lm(I(quality)~I(alcohol),data=pf4)
summary(m1)

利用R语言进行探索性数据分析(EDA)_第35张图片
同样可以看到R-squared值为0.2186,也说明酒精度并不能解释白葡萄酒质量。在相关性分析中,密度与酒精度的相关性最大。下面展示它们之间的关系图:

#绘制酒精度和密度之间的散点图
ggplot(aes(x=alcohol,y=density),data=pf)+
  geom_jitter()+
  #添加标题
    labs(title = 'scatterplot between density and alcohol')+
      #标题居中
      theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第36张图片
定量分析:

#构建密度和酒精度之间的线性模型
m4=lm(I(density)~I(alcohol),data=pf)
summary(m4)

利用R语言进行探索性数据分析(EDA)_第37张图片
从散点图中,可以看到密度和酒精度存在很强的正相关性。但我们可以知道,酒精度会影响密度,而不是反过来的关系。而且,从构建的线性模型来看,酒精度可以解释60.86%的密度的波动。另外,从相关性分析可以看到,影响白葡萄酒密度的因素,除酒精度外,还有一个很重要的因素就是残糖量。下面我们展示密度和残糖量之间的关系图:

#绘制残糖量和密度之间的散点图
ggplot(aes(x=residual.sugar,y=density),data=pf)+
  geom_jitter()+
  #添加标题
    labs(title = 'scatterplot between density and residual sugar')+
      #标题居中
      theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第38张图片
残糖量大部分集中在0-20之间,我们忽略掉几个高于20的极值点,并把密度值范围缩小在0.987-1.005之间,设置透明度以清晰看到数据整体的情况,重新绘图如下:

ggplot(aes(x=residual.sugar,y=density),data=pf)+
  #为了便于观察,增加透明度,我们设置alpha值为0.05
  geom_jitter(alpha=0.05)+
  labs(title = 'scatterplot between density and residual sugar')+
  #将残糖量值范围限制在0-20
  scale_x_continuous(lim=c(0,20))+
  #将密度值限制在0.987-1.005
  scale_y_continuous(lim=c(0.987,1.005))+
  #标题居中
  theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第39张图片
可以看到,残糖量和密度之间有很强的正相关关系。一般来说,残糖量越高,白葡萄酒的密度越大。为了更加具体的分析残糖量对密度的决定性影响,我们对残糖量和密度构建线性模型:

#构建密度和残糖量之间的线性模型
m3=lm(I(density)~I(residual.sugar),data=pf)
summary(m3)

利用R语言进行探索性数据分析(EDA)_第40张图片
可以看到R-squared的值为0.7039,说明残糖量可以解释大部分的白葡萄酒质量的波动.除了对白葡萄酒密度影响较大的两个因素酒精度和残糖量外,总的二氧化硫的含量与密度也有着较强的关系,它们之间的散点图如下:

#绘制总二氧化硫含量与密度之间的散点图
ggplot(aes(x=total.sulfur.dioxide,y=density),data=pf)+
  #增加透明度,设置alpha值为0.08
  geom_jitter(alpha=0.08)+
  #添加标题
  labs(title = 'scatterplot between density and total sulfur dioxide')+
  #将密度值限制在0.987-1.005
  scale_y_continuous(lim=c(0.987,1.005))+
  #标题居中
  theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第41张图片
从上面的散点图可以看到,虽然不像残糖量和酒精度那样和密度有很强的相关关系,总二氧化硫含量与密度之间也有着较为明显的正相关关系,总二氧化硫的含量越高,相对来说密度越大。除了对白葡萄酒密度的观察,我们还可以看到,在变量中有固定酸度、挥发性酸度和柠檬酸度这几个酸度值。这几个酸度值中,固定酸度值对白葡萄酒pH值的影响最大,它们之间的关系图如下:

#绘制固定酸度值和pH值之间的散点图
ggplot(aes(x=fixed.acidity,y=pH),data=pf)+
  #增加透明度,设置alpha值为0.05
  geom_jitter(alpha=0.05)+
  #添加标题
  labs(title = 'scatterplot between pH and fixed acidity')+
  #标题居中
  theme(plot.title=element_text(hjust=0.5))

利用R语言进行探索性数据分析(EDA)_第42张图片
可以看到,固定酸度值与pH值之间有着明显的负相关关系。固定酸度值越大,pH值越小,也就是酸性越强。

双变量分析总结

从分析的结果中可以看到,质量较高的白葡萄酒的酒精度会相对来说高一点。虽然整体的密度和氯化物浓度相差不大,但有个较明显的趋势是,质量高白葡萄酒的密度和氯化物浓度都较低。白葡萄酒的密度和酒精度有着很强的负相关关系,和残糖量有着很强的正相关关系。最后,白葡萄酒的pH值和固定酸度值关系比较大。在分析中发现白葡萄酒的密度和酒精度以及残糖量有着很强的联系。

多变量分析

在上一部分的双变量分析中,我们可以看到,密度和酒精度、残糖量和总二氧化碳含量相关性较强,我们这里想看一下这种相关性会不会在不同质量的白葡萄酒上表现不同。

#将质量值转化为排序的因子
pf$quality=factor(pf$quality)
#绘制不同质量下酒精度和密度的散点图,用不同颜色区分
ggplot(aes(x=alcohol,y=density,color=quality),data=pf)+
  geom_jitter()+
  #将密度限制在0.987-1.005以方便观察
  coord_cartesian(ylim = c(0.987,1.005))+
  #将背景色设置为暗色
  theme_dark()+
  #设置颜色属性
  scale_color_brewer(type = 'div')+
  #添加x,y轴的标签,以及标题
  labs(x='alcohol (% by volume)',y='density (mg/l)',
  title = 'scatterplot between density and alcohol with colored quality levels')

利用R语言进行探索性数据分析(EDA)_第43张图片

#绘制不同质量下残糖量和密度之间的散点图,用不同颜色区分
ggplot(aes(x=residual.sugar,y=density,color=quality),data=pf)+
  geom_jitter()+
  #将密度限制在0.987-1.005以方便观察
  coord_cartesian(ylim = c(0.987,1.005),
          #残糖量限制在0-20,因为大部分在这个区域
          xlim = c(0,20))+
  #背景色设置为暗色
  theme_dark()+
  #设置颜色属性
  scale_color_brewer(type = 'div')+
  #添加x,y轴的标签,以及标题
  labs(x='residual sugar (mg / dm^3)',y='density (mg/l)',
  title = 'scatterplot between density and residual sugar with colored quality levels')

利用R语言进行探索性数据分析(EDA)_第44张图片

#绘制不同质量下总二氧化硫含量与密度之间的散点图,用颜色区分
ggplot(aes(x=total.sulfur.dioxide,y=density,color=quality),data=pf)+
  geom_jitter()+
  #将密度限制在0.987-1.005以方便观察
  coord_cartesian(ylim = c(0.987,1.005),
                  #将总二氧化硫含量限制在0-300
                  xlim = c(0,300))+theme_dark()+
  #添加x,y轴标签,以及标题
  scale_color_brewer(type = 'div')+labs(x='total sulfur dioxide (mg / dm^3)',y='density (mg/l)',
  title = 'scatterplot between density and total sulfur dioxide with colored quality levels')

利用R语言进行探索性数据分析(EDA)_第45张图片
上面三幅图分别为在不同质量下,按颜色区分的酒精度、残糖量和总二氧化硫含量与白葡萄酒密度的关系图。从图中可以看到,低质量的白葡萄酒大部分集中在高的密度和低的酒精度区域,高质量的白葡萄酒大部分集中在低的密度和高的酒精度区域。另外,高质量的白葡萄酒在低的密度区域与残糖量相关,低质量的白葡萄酒在高的密度区域与残糖量相关。最后,高质量的白葡萄酒更偏向于低的密度和低的总二氧化硫含量,低质量的白葡萄酒更偏向于高的密度和高的总二氧化硫含量。为了更加具体的对白葡萄酒密度进行,分析,我们对密度和酒精度、残糖量以及总二氧化硫含量构建线性模型:

#构建密度和酒精度的线性模型
lm1=lm(I(density)~I(alcohol),data=pf)
#添加残糖量
lm2=update(lm1,~.+residual.sugar)
#添加总二氧化硫含量
lm3=update(lm2,~.+total.sulfur.dioxide)
#展示各个线性模型
mtable(lm1,lm2,lm3)

利用R语言进行探索性数据分析(EDA)_第46张图片
我们可以看到酒精度和残糖量已经可以解释90.7%的密度的波动,加上总二氧化硫的含量可以解释91.1%的密度的波动。

#绘制不同质量下固定酸度值和pH值之间的散点图,用颜色区分
ggplot(aes(x=fixed.acidity,y=pH,color=quality),data=pf)+
  geom_jitter()+
  #将固定酸度值限制在2.5-12之间,因为大部分在这个区域
  coord_cartesian(xlim = c(2.5,12))+
  #将背景色设置为暗色
  theme_dark()+
  #设置颜色属性
  scale_color_brewer(type = 'div')+
  #添加x,y轴的标签,以及标题
  labs(x='fixed acidity (g / dm^3)',y='pH',
  title = 'scatterplot between fixed acidity and pH with colored quality levels')

利用R语言进行探索性数据分析(EDA)_第47张图片
可以看到高质量的白葡萄酒更偏向于高的pH值和低的固定酸度值,低质量的白葡萄酒更偏向于低的pH值和高的固定酸度值。

多变量分析总结

我们通过分析不同质量的白葡萄酒下,酒精度、残糖量和总二氧化硫与密度的关系,以及pH值与固定酸度值的关系。我们看到不同质量的白葡萄酒这些关系会有些差异,高质量的白葡萄酒更偏向于高的酒精度、低的密度、低的总二氧化硫的含量以及高的pH值和低的固定酸度值。通过分析发现,白葡萄酒的密度和残糖量之间存在很强的正相关关系,和酒精度有很强的负相关关系。并且在不同的白葡萄酒质量下,这种关系存在着差异。

你可能感兴趣的:(数据分析,数据分析,可视化)