在统计分析中,往往会对三个及以上类别的个体在某连续变量上的值进行差异比较,这时候要用到方差分析的方法。通过比较组间均方与组内均方的比值是否超越F分布的临界值而得出组间差异是否显著的判断,是一种常用的假设检验的统计方法。
在学术论文中,方差分析的结果一般用表格的形式表示:
上图表示的是只有一个类别变量且只有一个连续变量时的结果呈现方式。
然而,某些情况下,需要呈现多种类别变量在多个连续变量上方差分析的结果。假设有M个类别变量和N各连续变量,那么按照上图的形式,至少得用M×N个表才能表示全部结果。为了清楚地展示方差分析结果,可以考虑只表示F值的检验情况,将所有F值的检验结果用一张简洁的图表示清楚。
于是我使用Python语言实现了下面这样的效果:
图中纵坐标表示了四个类别变量,横坐标表示了十个连续变量。
图中红色圆圈表示的是圆圈对应的纵坐标的类别变量的不同类别个体在对应横坐标的连续变量上的差异显著,以及对应的F值大小,而蓝色“X”表示的是不显著的方差分析结果。
这样的一张图就将40个方差分析的结果表示出来。
上图的代码如下:
# 引入数据分析需要用到的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
categories = ['年龄','性别','人种','地区']
dimensions = ['dim1','dim2','dim3','dim4','dim5',
'dim6','dim7','dim8','dim9','dim10']
marks = np.random.randn(4,10)+4 # 为了方便,生成随机数作为F值
df_trial = pd.DataFrame(data=marks,index=categories,columns=dimensions)
# 定义一个dataframe的数据表,存放方差分析的F值
# 设置绘图的画布
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体
plt.figure(figsize=(12,6)) # 设置画布大小
color_p = sns.color_palette('hls',2) # 设置要用到的颜色
#设置显著的F值对应的类别变量和连续变量的序号,
#其中signif_xy的键代表类别变量的序号,值代表连续变量的序号。
signif_xy = {
0:[2,3,4],
1:[4,5,6],
2:[7,8,9],
3:[1,3,8,8]
}
# 开始绘图
for i in [0,1,2,3]:
for j in [0,1,2,3,4,5,6,7,8,9]: #通过嵌套循环对40个结果对应在图中的位置进行绘制
if j in signif_xy[i]:
dot_number = df_trial.iloc[i,j]
plt.scatter(x=j+1,y=i+1,marker='o',s=(dot_number-1.5)**2*50,color=color_p[0],alpha=0.5)
plt.text(x=j+1,y=i+1-0.22,s='{0:.3f}'.format(dot_number),fontsize=12,va='center',ha='center')
else:
plt.scatter(x=j+1,y=i+1,marker='o',edgecolors='black' ,s=4**2*20,color="white",alpha=1)
# plt.text(x=j+1,y=i+1,s='{0:.3f}'.format(dot_number),fontsize=12,va='center',ha='right')
plt.xticks([1,2,3,4,5,6,7,8,9,10],dimensions,fontsize=16)
plt.yticks([1,2,3,4],categories,fontsize=16)
plt.ylim((0.5,4.5))
# plt.legend(['a','b','c','d','e','f','g','i','j','k','l','m','n'])
plt.show()
这样就得到了一个用点的大小表示的方差分析结果图。是不是还算简洁美观呢?
当然还可以根据自己的偏好,改变可视化的风格,比如改变颜色:
关于颜色的使用可参考这篇文章:Matplotlib作图常用marker类型、线型和颜色。
关于如何使用seaborn包实现丰富的配色方案可参考这篇文章:绘制热力图seaborn.heatmap,cmap设置颜色的参数。