使用条件子群体的交叉表
Cross Tab using conditional sub-populations
我正在学习如何使用 pandas
python 库。我正在尝试一个可能不是最简单的问题,因为之前没有使用 pandas
的经验,也没有任何统计语言,例如 Stata
.
假设我有一个关于人们对馅饼和蛋糕的感受的查询数据集。我问的大多数问题都是以下形式:
"Do you prefer pies over cakes?" or "Would you vote for a cherry pie for President of the United states in 2020?"
这些导致 "Yes" 或 "No" 个答案。
假设我有 1000
人做出了回应,但他们有一些对我即将进行的分析很重要的区别,例如 Gender
、Eye-Color
和 primary-hand-use
(right/left/ambidextrous).还假设我有数百个这样的区别,最终我想将它们与同一个问题进行比较。
现在,从我的 cake-pie.DTA
文件中我可以 运行:
frame = pandas.read_stata("cake-pie.DTA")
answers = ["Yes", "No"]
pandas.crosstab(frame["Question_1", frame["Eye_Color"]], answers, normalize="columns")
这将给我以下内容:
col_0 yes
col_1 no
Question_1 eye_color
Yes Blue 0.1500
Hazel 0.050
Brown 0.2100
Green 0.050
No Blue 0.2850
Hazel 0.0000
Brown 0.2450
Green 0.010
然而,我的 1000 个人的反应并不是由每种眼睛颜色的相同比例组成的。也许我的人口看起来像:
Blue 435 (43.5%)
Hazel 50 (5.0%)
Brown 455 (45.5%)
Green 60 (6.0%)
我想要输出的信息不是对“绿色和是”概率的估计,而是“是”的概率 |绿色(给定绿色眼睛的是的概率。)
我知道我可以手动除以亚群总数来得到答案,但我不确定如何除以 pandas Series
数据,即我的眼睛颜色 table 在单个交叉表中执行上述操作。
假设您的 DataFrame 看起来像下图,您通过取消堆叠然后将每一行除以其行总数来旋转它。
df1 = df.unstack(0)
df1.div(df1.sum(1), axis=0)
eye_color
No Yes
Blue 0.655172 0.344828
Brown 0.538462 0.461538
Green 0.166667 0.833333
Hazel 0.000000 1.000000
更多解释。 unstack(0)
将索引的最外层(级别从左侧开始索引为零)旋转到一列,以便您获得以下框架。
.sum(1)
对每一行求和。默认值是对列求和(轴 = 0)。然后我们必须巧妙地使用 .div
和 axis=0 来通过仅对齐索引值来划分。
我正在学习如何使用 pandas
python 库。我正在尝试一个可能不是最简单的问题,因为之前没有使用 pandas
的经验,也没有任何统计语言,例如 Stata
.
假设我有一个关于人们对馅饼和蛋糕的感受的查询数据集。我问的大多数问题都是以下形式:
"Do you prefer pies over cakes?" or "Would you vote for a cherry pie for President of the United states in 2020?"
这些导致 "Yes" 或 "No" 个答案。
假设我有 1000
人做出了回应,但他们有一些对我即将进行的分析很重要的区别,例如 Gender
、Eye-Color
和 primary-hand-use
(right/left/ambidextrous).还假设我有数百个这样的区别,最终我想将它们与同一个问题进行比较。
现在,从我的 cake-pie.DTA
文件中我可以 运行:
frame = pandas.read_stata("cake-pie.DTA")
answers = ["Yes", "No"]
pandas.crosstab(frame["Question_1", frame["Eye_Color"]], answers, normalize="columns")
这将给我以下内容:
col_0 yes
col_1 no
Question_1 eye_color
Yes Blue 0.1500
Hazel 0.050
Brown 0.2100
Green 0.050
No Blue 0.2850
Hazel 0.0000
Brown 0.2450
Green 0.010
然而,我的 1000 个人的反应并不是由每种眼睛颜色的相同比例组成的。也许我的人口看起来像:
Blue 435 (43.5%)
Hazel 50 (5.0%)
Brown 455 (45.5%)
Green 60 (6.0%)
我想要输出的信息不是对“绿色和是”概率的估计,而是“是”的概率 |绿色(给定绿色眼睛的是的概率。)
我知道我可以手动除以亚群总数来得到答案,但我不确定如何除以 pandas Series
数据,即我的眼睛颜色 table 在单个交叉表中执行上述操作。
假设您的 DataFrame 看起来像下图,您通过取消堆叠然后将每一行除以其行总数来旋转它。
df1 = df.unstack(0)
df1.div(df1.sum(1), axis=0)
eye_color
No Yes
Blue 0.655172 0.344828
Brown 0.538462 0.461538
Green 0.166667 0.833333
Hazel 0.000000 1.000000
更多解释。 unstack(0)
将索引的最外层(级别从左侧开始索引为零)旋转到一列,以便您获得以下框架。
.sum(1)
对每一行求和。默认值是对列求和(轴 = 0)。然后我们必须巧妙地使用 .div
和 axis=0 来通过仅对齐索引值来划分。