Python 中包含大量组的 Anova 测试
Anova test in Python with a very large number of Groups
我有一个相对较大的数据集(大约 273,744 条记录),其中包含人名和他们使用的屈光力:
Name | Dioptric | Gender | Town |
-----------------------------------
'John' | 0.25 | M | A |
'Jack' | 0.5 | M | C |
'John' | 25 | M | A |
'Mary' | 0.25 | F | C |
........
我需要查明名字和屈光力之间是否存在相关性。我决定使用方差分析检验,因为有一个分类变量和一个定量变量。我的问题是数据集包含大量名称屈光度组(大约 21,000 个),因此我不太确定如何实现
stats.f_oneway( Name_Dioptrics_GroupA, Name_Dioptrics_GroupB,....)
到目前为止我所做的是:
- 从 csv 中将数据作为 numpy 数据帧导入
- 尝试根据名称屈光度分组
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.stats as stats
# read data
data = pd.read_csv("dioptrics-to-name.csv")
# prepare data
dioptrics = data['value']
name = data['firstName']
"""
group based on name-dioptrics power
"""
name_dioptric_frame = pd.DataFrame({"Name":name,"dioptrics":dioptrics})
name_dioptrics_groups = name_dioptric_frame.groupby("Name").groups
## break into name-dioptrics groups
## name_dioptrics_GroupA = dioptrics[name_dioptrics_groups["John"]]
## name_dioptrics_GroupB = dioptrics[name_dioptrics_groups["Jamie"]]
## and so on ....
print(stats.f_oneway( dioptrics[name_dioptrics_groups[ name_dioptrics_groups.keys()] ]) )
print(stats.f_oneway( dioptrics[name_dioptrics_groups[ [ name for x in name_dioptrics_groups() ] ] ]) )
这当然行不通...我在这里采取的方法是否正确?
Pandas groupby 函数允许您按多列对数据框进行分组。如果您使用列列表而不是一列,则可以使用此功能:
df = pd.DataFrame([
['WAKA', 2, '1'],
['WAKA-WAKA', 3, '7'],
['WAKKA', 1, '0'],
['WAKA', 2, '1'],
['WAKA-WAKA', 1, '7'],
['WAKKA', 1, '1'],
['WAKA', 5, '1'],
['WAKA-WAKA', 3, '7'],
['WAKKA', 1, '2'],
])
df.columns = ['name', 'd', 'info']
df.groupby(['name', 'd']).groups
会 return:
{('WAKA', 2): Int64Index([0, 3], dtype='int64'),
('WAKA', 5): Int64Index([6], dtype='int64'),
('WAKA-WAKA', 1): Int64Index([4], dtype='int64'),
('WAKA-WAKA', 3): Int64Index([1, 7], dtype='int64'),
('WAKKA', 1): Int64Index([2, 5, 8], dtype='int64')}
在您的代码中,您试图仅按名称分组,没有屈光度。
我有一个相对较大的数据集(大约 273,744 条记录),其中包含人名和他们使用的屈光力:
Name | Dioptric | Gender | Town |
-----------------------------------
'John' | 0.25 | M | A |
'Jack' | 0.5 | M | C |
'John' | 25 | M | A |
'Mary' | 0.25 | F | C |
........
我需要查明名字和屈光力之间是否存在相关性。我决定使用方差分析检验,因为有一个分类变量和一个定量变量。我的问题是数据集包含大量名称屈光度组(大约 21,000 个),因此我不太确定如何实现
stats.f_oneway( Name_Dioptrics_GroupA, Name_Dioptrics_GroupB,....)
到目前为止我所做的是:
- 从 csv 中将数据作为 numpy 数据帧导入
- 尝试根据名称屈光度分组
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.stats as stats
# read data
data = pd.read_csv("dioptrics-to-name.csv")
# prepare data
dioptrics = data['value']
name = data['firstName']
"""
group based on name-dioptrics power
"""
name_dioptric_frame = pd.DataFrame({"Name":name,"dioptrics":dioptrics})
name_dioptrics_groups = name_dioptric_frame.groupby("Name").groups
## break into name-dioptrics groups
## name_dioptrics_GroupA = dioptrics[name_dioptrics_groups["John"]]
## name_dioptrics_GroupB = dioptrics[name_dioptrics_groups["Jamie"]]
## and so on ....
print(stats.f_oneway( dioptrics[name_dioptrics_groups[ name_dioptrics_groups.keys()] ]) )
print(stats.f_oneway( dioptrics[name_dioptrics_groups[ [ name for x in name_dioptrics_groups() ] ] ]) )
这当然行不通...我在这里采取的方法是否正确?
Pandas groupby 函数允许您按多列对数据框进行分组。如果您使用列列表而不是一列,则可以使用此功能:
df = pd.DataFrame([
['WAKA', 2, '1'],
['WAKA-WAKA', 3, '7'],
['WAKKA', 1, '0'],
['WAKA', 2, '1'],
['WAKA-WAKA', 1, '7'],
['WAKKA', 1, '1'],
['WAKA', 5, '1'],
['WAKA-WAKA', 3, '7'],
['WAKKA', 1, '2'],
])
df.columns = ['name', 'd', 'info']
df.groupby(['name', 'd']).groups
会 return:
{('WAKA', 2): Int64Index([0, 3], dtype='int64'),
('WAKA', 5): Int64Index([6], dtype='int64'),
('WAKA-WAKA', 1): Int64Index([4], dtype='int64'),
('WAKA-WAKA', 3): Int64Index([1, 7], dtype='int64'),
('WAKKA', 1): Int64Index([2, 5, 8], dtype='int64')}
在您的代码中,您试图仅按名称分组,没有屈光度。