scipy.stats.contingency.

crosstab#

scipy.stats.contingency.crosstab(*args, levels=None, sparse=False)[source]#

返回 *args 中每个可能的唯一组合的计数表。

len(args) > 1 时,此函数计算的数组通常被称为列联表 [1]

参数必须是具有相同长度的序列。第二个返回值 count 是一个具有 len(args) 维度的整数数组。如果 levels 为 None,则 count 的形状为 (n0, n1, ...),其中 nkargs[k] 中唯一元素的数量。

参数:
*args序列

要对其唯一对齐元素进行计数的序列的序列。 args 中的序列必须全部具有相同的长度。

levels序列,可选

如果给出了 levels,它必须是与 args 长度相同的序列。levels 中的每个元素要么是一个序列,要么是 None。如果是序列,则给出 args 中相应序列中要计数的元素。如果 args 中的序列中的任何值没有出现在 levels 中的相应序列中,则该值将被忽略,并且不会在返回的数组 count 中计数。args[i]levels 的默认值为 np.unique(args[i])

sparsebool,可选

如果为 True,则返回稀疏矩阵。该矩阵将是 scipy.sparse.coo_matrix 类的实例。由于 SciPy 的稀疏矩阵必须是二维的,因此当 sparse 为 True 时,只允许两个输入序列。默认为 False。

返回:
resCrosstabResult

一个包含以下属性的对象

elementsnumpy.ndarrays 的元组。

长度为 len(args) 的元组,其中包含在 count 中计数的元素数组。 这些可以解释为 count 的相应维度的标签。 如果给出了 levels,那么如果 levels[i] 不是 None,则 elements[i] 将保存 levels[i] 中给出的值。

countnumpy.ndarray 或 scipy.sparse.coo_matrix

存储在数组中的 zip(*args) 中唯一元素的计数。 当 len(args) > 1 时,也称为列联表

参见

numpy.unique

备注

在版本 1.7.0 中添加。

参考

示例

>>> from scipy.stats.contingency import crosstab

给定列表 ax,创建一个列联表,计算相应对的频率。

>>> a = ['A', 'B', 'A', 'A', 'B', 'B', 'A', 'A', 'B', 'B']
>>> x = ['X', 'X', 'X', 'Y', 'Z', 'Z', 'Y', 'Y', 'Z', 'Z']
>>> res = crosstab(a, x)
>>> avals, xvals = res.elements
>>> avals
array(['A', 'B'], dtype='<U1')
>>> xvals
array(['X', 'Y', 'Z'], dtype='<U1')
>>> res.count
array([[2, 3, 0],
       [1, 0, 4]])

因此,('A', 'X') 出现两次,('A', 'Y') 出现三次,等等。

可以创建更高维度的列联表。

>>> p = [0, 0, 0, 0, 1, 1, 1, 0, 0, 1]
>>> res = crosstab(a, x, p)
>>> res.count
array([[[2, 0],
        [2, 1],
        [0, 0]],
       [[1, 0],
        [0, 0],
        [1, 3]]])
>>> res.count.shape
(2, 3, 2)

可以通过使用 levels 参数来设置要计数的值。 它允许显式给出每个输入序列中感兴趣的元素,而不是找到序列的唯一元素。

例如,假设其中一个参数是一个包含调查问题答案的数组,其整数值为 1 到 4。即使值 1 没有出现在数据中,我们也希望在表中为其添加一个条目。

>>> q1 = [2, 3, 3, 2, 4, 4, 2, 3, 4, 4, 4, 3, 3, 3, 4]  # 1 does not occur.
>>> q2 = [4, 4, 2, 2, 2, 4, 1, 1, 2, 2, 4, 2, 2, 2, 4]  # 3 does not occur.
>>> options = [1, 2, 3, 4]
>>> res = crosstab(q1, q2, levels=(options, options))
>>> res.count
array([[0, 0, 0, 0],
       [1, 1, 0, 1],
       [1, 4, 0, 1],
       [0, 3, 0, 3]])

如果给出了 levels,但 levels 的一个元素为 None,则使用相应参数的唯一值。 例如,

>>> res = crosstab(q1, q2, levels=(None, options))
>>> res.elements
[array([2, 3, 4]), [1, 2, 3, 4]]
>>> res.count
array([[1, 1, 0, 1],
       [1, 4, 0, 1],
       [0, 3, 0, 3]])

如果我们想忽略 q2 中出现 4 的对,我们可以只将值 [1, 2] 赋给 levels,并且 4 将被忽略

>>> res = crosstab(q1, q2, levels=(None, [1, 2]))
>>> res.elements
[array([2, 3, 4]), [1, 2]]
>>> res.count
array([[1, 1],
       [1, 4],
       [0, 3]])

最后,让我们重复第一个示例,但返回一个稀疏矩阵

>>> res = crosstab(a, x, sparse=True)
>>> res.count
<COOrdinate sparse matrix of dtype 'int64'
    with 4 stored elements and shape (2, 3)>
>>> res.count.toarray()
array([[2, 3, 0],
       [1, 0, 4]])