Python 3 - 如何从高维数据制作马赛克图?

时间:2015-11-29 20:03:52

标签: python python-3.x pandas plot

我有一个pandas-DataFrame:

data = pd.read_csv(r'C:\data-path\demographics.csv', sep=',') print(data)

PersonID Married No. of Children Sex 1 yes 0 male 2 no 0 female 3 no 1 male 4 yes 1 male 5 no 1 female 6 no 2 female 7 no 1 male 8 no 2 male 9 no 2 male 10 no 1 male 11 no 0 female

现在我尝试使用statsmodels.graphics.mosaicplot

创建一个马赛克图

mosaic(data, ['Married', 'No. of Children'])

...每当我尝试添加第三个维度时,它都可以工作,例如:

mosaic(data, ['Married', 'No. of Children', 'Sex'])

...我收到以下错误消息:

ValueError: at least one proportion should begreater than zero

我不确定,它对我有什么要求。是否有一些参数缺失/错误设置?

我选择的列/尺寸或顺序也无关紧要。每当我超过2时,我都会收到错误。

有人有想法吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

经过一些修修补补后,我没有找到解决方案,而是找到了bug的来源。

它位于mosaicplot-class / -module的代码中:http://nipy.bic.berkeley.edu/nightly/statsmodels/doc/html/_modules/statsmodels/graphics/mosaicplot.html

简而言之:它无法处理数据集中的类,这些类是空的,即有0个实例。

考虑原始问题中的数据集,然后调用以下函数:

mosaic(data, ['Married', 'No. of Children'])

'马赛克'方法将做的是确定第一类有多少类(在这种情况下:2),然后确定每个类出现的频率。然后,它将根据情节生成情节矩形的“比例”列表,如果是“已婚”类别,则

[2,9]

...因为有2个'是'和9个'不'实例。

对于每个班级,根据第二类,会有新的分组,在这里:'不。孩子的'。有3个类(0,1和2),这将生成以下'比例':

[1,1,0](1与0个孩子结婚,1个与1个孩子结婚,0个与2个孩子结婚)

[2,4,3](1个单身,0个孩子等等)

仅基于上述内容,它就可以画出完美的马赛克图。

但是,一旦我们考虑了第三类(例如:“性别”),上面其中一个列表中的0就成了问题。它将产生列表[0,0],因为它们是已婚男性/女性和2个孩子。

在源代码的第45行中,有一个if子句将在所有0列表中引发异常(因为它们“没有意义”)。

如上所述,我无法找到修复/解决方法来执行此操作。简单地说出if-clause将允许所有分割正常执行,但是,这也会导致马赛图的绘制在matplotlib的backend_agg.py中引发异常,因为它们现在是NaN的值(不是数字)。

为什么会这样,我不知道,如果有人比我更聪明,更有经验,我会很高兴。

我仍然不排除我必须以不同的方式设置一些参数。