密度图在工作中遇见的比较少,但是也碰到好几次读者询问,所以自己查了一些资料,跟大家分享一下。
大家首先要知道图形其实是表格数据的另一种呈现方式,我们得知道图形要展示什么数据,怎么展示,之后就是去实现了。
所以,我们先学习一下密度图(Density Plot)能传达什么信息。密度图也叫做核密度图( Kernel Density Plot)。密度图将数据在连续间隔或时间段内的分布可视化(也就是X轴,但不一定都是代表时间)。
这个图表是直方图的一种变体,它使用核平滑来绘制值,通过平滑噪声来实现更平滑的分布(As opposed to the histogram, the density plot can smooth out the distribution of values and reduce the noise.)。密度图的峰值有助于显示值在区间内的集中位置。
密度图相对于直方图的一个优势是,它们更善于确定分布形状,因为它们不受所使用的箱子数量的影响。仅包含4个bin的直方图不会产生像20个bin直方图那样可区分的分布形状。(这说的是什么意思我也不懂,第一次听到箱子)
比如下面是一张密度图,你能从这张图获取什么信息?
1)密度图的峰值位置可以反映数据的集中趋势,比如均值或中位数
2)密度图的宽度可以表明数据的离散程度,曲线越宽,数据的变异性越大。
3)在密度图的尾部可能会出现一些小的峰,这可能表明数据中存在异常值或次要的群体。
4)如果在同一坐标轴上绘制多个不同组的密度图,可以直观地比较它们的分布差异。
5)密度图的y轴表示概率密度,因此可以通过图形了解数据在某个区间内出现的概率。
最著名的密度曲线是钟形曲线,它代表正态分布。
是不是有些困惑?没事,我用SAShelp的cars数据集举个例子,针对horsepower这个变量的值,先看下基本的统计量,重点关注一下中位值和平均值,然后看一下对应的直方图。
data cars;
set sashelp.cars;
if type in ("Hybrid","SUV","Truck");
keep horsepower Type;
proc sort;by Type;
run;
proc univariate data=cars;
by Type;
var horsepower;
run;
type="Hybrid" type="Hybrid" type="SUV" type="SUV"看密度图的峰值,代表均值和中位数的集中位置,可以看到峰值聚集在230多,跟算出来的均值是差不多的,这个解释了信息1)
type="Truck" type="Truck"这是3种类型混合在一起的密度图,正态倒是能清晰的看出
通过比较3个密度图的宽度,我们可以看到type="SUV"和type="Truck"曲线更宽,所以type="SUV"和type="Truck"的变异性更大,也可以看到这两组数据的方差和标准差(Variance & Std Deviation)也更大(方差和标准差就是反映数据变异程度的),所以通过这张图解释了信息2)
前面说过密度图能够看出数据的大致分布形状。
比如下面这样是左偏态分布,也就意味着平均值比中位数小。
这个是右偏态分布,也就意味着平均值比中位数大。
还有一个就是无偏态分布,意味着平均值跟中位数相等。
上面的数据感觉偏态不太明显,即使第3张图mean>median,知道是右偏态,但是感觉图形跟模板差好多,所以我dummy一些数据
data cars_1;
set sashelp.cars;
if type in ("Hybrid","SUV","Truck");
if type="Truck" then horsepower=(1 /rand("Beta", 2, 5));
keep horsepower Type;
proc sort;by Type;
run;
这也是一个右偏态的数据,说实话,感觉跟模板还是不太像,但是右偏态数据在均值左侧的数量较多,这里的均值是6.26,通过柱状图也可以看出数据集中在哪,所以还是满足右偏态。
大家可以通过proc univariate算出来的值和图形比较,看下信息1)到5)是否都符合,除了信息3)数据我没dummy,其他基本符合了。
data cars;
set sashelp.cars;
if type in ("Hybrid","SUV","Truck");
keep horsepower Type;
proc sort;by Type;
run;
proc univariate data=cars;
by Type;
var horsepower;
run;
proc template;
define statgraph densityplot;
begingraph;
layout overlay;
/* histogram horsepower / ;*/
densityplot horsepower /group=type normal() lineattrs=(thickness=2)
name='density' legendlabel='Type';
discretelegend 'density';
endlayout;
endgraph;
end;
run;
proc sgrender data=cars template=densityplot;
/*by Type;*/
run;
data cars_1;
set sashelp.cars;
if type in ("Hybrid","SUV","Truck");
if type="Truck" then horsepower=(1 /rand("Beta", 2, 5));
keep horsepower Type;
proc sort;by Type;
run;
data cars;
set cars_1 ;
proc sort;by Type;
run;
proc univariate data=cars;
by Type;
var horsepower;
run;
proc template;
define statgraph densityplot;
begingraph;
layout overlay;
histogram horsepower / ;
densityplot horsepower / normal() lineattrs=(thickness=2)
name='density' legendlabel='Type';
discretelegend 'density';
endlayout;
endgraph;
end;
run;
proc sgrender data=cars template=densityplot;
by Type;
run;
网友评论