单变量描述统计

研究方法
作者

yangjh

发布日期

November 23, 2022

单变量描述统计分析按照变量的测量层次,可以分为无序类别变量的描述统计分析、有序类别变量的描述统计分析以及数值变量的描述统计分析。

单变量描述统计的维度

  1. 集中趋势。如众数、平均值、中位数等。
  2. 离散特征。如异质指数、四分位差、方差标准差
  3. 分布特征。如偏度峰度

无序类别变量的描述统计

适用于无序类别变量的描述统计方法,有次数分布、比例、比率、图示和对比值等。

次数分布

次数分布(frequency distribution),就是变量中每一个值的出现次数。通过次数分布,可以看出变量中不同取值的多少。不同规模样本中的次数分布不能直接比较。

次数分布的Python实现

使用value_counts()函数,可以计算指定变量的次数分布。

SPSS实现

数据视图选中变量,按右键,选择描述统计即可。

比例

比例(proporitions) 就是将每个类别的次数 \(f\) 除以总数\(N\)。公式为:\(P = \dfrac{f}{N}\)。通过计算比例,可使不同样本规模的总数成为同一个基数,即都是1

Python实现

使用value_counts(normalize=True),可以算出指定变量不同取值的比例。

SPSS实现

数据视图选中变量,按右键,选择描述统计即可。

比率

比率(rates)就是把比例的基数变大,使读者更容易领会。社会科学中最常用的比率是百分率(%),在汇报结果时,通常保留12位小数。

Python实现

使用数组的基本运算,即可得到比率值。例如df['政治面貌'].value_counts(normalize=True).values * 100

SPSS实现

数据视图选中变量,按右键,选择描述统计即可。

类别数据可视化

在社会科学中多使用柱状图和饼图描述无序类别变量。

柱状图

柱状图(bar chart)是一种通过柱形的长度来表现数据大小的一种常用图表类型。

Python实现
……
…… #导入包,打开文件等代码省略
…… 
# 生成x、y轴方向的坐标
x = df['政治面貌'].value_counts().index
y = df['政治面貌'].value_counts(normalize=True).values * 100
# 创建图
fig, ax = plt.subplots()
# 绘制柱状图
rects1 = ax.bar(x, y)
# 设置x轴变量名称
ax.set_xlabel('政治面貌')
# 设置y轴最大值
ax.set_ylim(ymax=100)
# 在柱上方显示对应的值
ax.bar_label(rects1, fmt="%.1f", padding=3)
# 显示图形
plt.show()

可以将上述代码写成一个函数,方便以后重复使用。

饼图

饼图(pie chart)是一个圆形平面按照数值比例分割的图。

Python实现
fig, ax2 = plt.subplots()
labels = df['政治面貌'].value_counts().index
ax2.pie(y, autopct='%1.1f%%', labels=labels, textprops=dict(color="w"))
plt.show()

有序类别变量的描述统计

适用于无序类别变量的描述统计方法,如次数分布、比例、比率、柱状图、饼图,也适用于有序类别变量。还有针对有序类别变量的描述统计方法:累计次数、累加百分率。

累加次数

累加次数(cumlulative frequencies),简写cf,就是把次数逐级相加起来。分为两种,一种是向上累加,一种是向下累加。累加次数的作用是使我们容易知道某值以下或者以上的次数总和。

Python实现

借助于value_counts方法和cumsum方法,可以实现对累加次数的计算。

import pandas as pd
from pyreadstat import pyreadstat
df, metadata = pyreadstat.read_sav(r'国家认同数据清理后.sav',apply_value_formats=True,formats_as_ordered_category=True)
result = df['会打多少分'].value_counts(sort=False)
df_result = pd.DataFrame(result)
df_result['累计求和'] = result.values.cumsum()

SPSS实现

累加百分比

累加百分比(cumulative percentages),简写c%,就是将各级的百分率数值逐级相加。

Python实现

result['累计百分比(%)'] = result['百分比'].values.cumsum()

SPSS实现

数值变量的描述统计

数值变量可以使用有序类别变量的累加次数和累加百分比。

使用累加百分比描述数值变量

将数值变量按照一定规则分组,使用cut方法将数值变量转化为有序类别变量,然后按照有序类别变量的描述统计进行。

Python实现

df['星级'] = pd.cut(df['average'],
           bins=[0, 2, 4, 6, 8, 10],
           labels=['一星', '二星', '三星', '四星', '五星'])
result = df['星级'].value_counts(sort=False)
df_result['累计百分比(%)'] = result.values.cumsum()

SPSS实现

使用直方图对数值变量的分布进行可视化

可以使用直方图数值变量的分布进行可视化分析,还可观察数值变量中异常值的分布情况。

Python实现

"""
引入包,读取数据文件的代码参考其他图形
"""
fig, ax = plt.subplots()
ax.hist(
    df['average'],
    """设定组距"""
    bins=[0, 2, 4, 6, 8, 10],
    linewidth=0.5,
    edgecolor="white",
)

SPSS实现

集中趋势

集中趋势就是找出一个数值来代表变量的数值分布,以反映资料的集结情况,可以根据这个值来估计或预测每个研究对象(即个案)的数值。

众值

众值的概念及实现见无序类别变量的描述统计中的众值

中位值

中位值(median)就是在一个序列中的中央位置之值。中位值具有估计和预测的意义,以中位值去估计变量的数值,所犯的错误总数是最少的。中位值的计算公式是\(median=\dfrac{n+1}{2}\)。其中\(n\)是个案数目。

Python实现
"""
使用median方法,可计算出变量的中位数。
"""
df['average'].median()
"""
输出结果为9.0
"""

均值

均值(mean)是将变量的各个数值相加起来求取平均值。计算公式为\(\bar{x}=\dfrac{\sum{x}}{n}\)。其中\(n\)表示全部个案数目,\(\sum{x}\)表示各个个案数值之和。以均值估计数值变量的资料,错误最小。

Python实现
"""
使用mean方法,可计算出变量的平均数。
"""
df['average'].mean()
"""
输出结果为8.9
"""

离散趋势

离散趋势是用来表示个案与个案之间差异情况的描述统计方法。与集中趋势测量具有互相补充的作用。

四分位差

四分位差(interquartile range)是将个案由低到高排列,然后分为四个等分,第一个四分位置的值(Q1)与第三个四分位置的值(Q3)的差异,就是四分位差。四分位值越大,表示中位值的代表性就越小。

Python实现
"""
使用quantile方法,可计算出变量的分位值。
"""
df['average'].quantile([0.25,0.5,0.75])
"""
输出结果为:
0.25    8.45
0.50    9.00
0.75    9.20
Name: average, dtype: float64
"""

标准差

标准差(standard deviation),是将各数值\(x\)与其均值\(\bar{x}\)之差的平方和除以全部个案数目\(n\),然后取其平方根。公式为\(S=\sqrt{\dfrac{\sum{(x-\bar{x})^2}}{n}}\)。标准差的意义就是以均值预测各个个案的数值,所犯错误的大小。

Python实现
"""
使用std方法,可计算出变量的标准差。
"""
df['average'].std()
"""
输出结果为:
0.7621411592991403
"""

分布

偏度

偏度(Skewness)是描述分布偏离对称性程度的一个特征数。当偏度大于0时,称该分布右偏或正偏。当偏度小于0时,该分布左偏或负偏。

偏态说的是有一边的尾巴更厚,相当于某一边加了异常值。异常值对均值影响大,对中位数影响微小,对众数无影响。

峰度

峰度(Kurtosis)又称峰态系数,表征概率密度分布曲线在平均值处峰值高低的特征数,即是描述总体中所有取值分布形态陡缓程度的统计量。直观看来,峰度反映了峰部的尖度。这个统计量需要与正态分布(也叫常态分布)相比较。

参考文献

  1. 李沛良. (2001). 社会研究的统计应用. 社会科学文献出版社.
  2. matplotlib.pyplot — Matplotlib 3.5.2 documentation
  3. matplotlib.axes.Axes.pie — Matplotlib 3.5.2 documentation
  4. Categorical data — pandas 1.4.3 documentation (pydata.org)
回到顶部