Anova тест в Python с очень большим количеством групп - PullRequest
1 голос
/ 25 апреля 2019

У меня есть относительно большой набор данных (около 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   |
........

Мне нужно выяснить, существует ли корреляция между именем и силой диоптрий.,Я решил использовать тест ANOVA, поскольку существует одна категориальная и одна количественная переменная.Моя проблема состоит в том, что набор данных содержит большое количество диоптрийных групп имен (около 21 000), поэтому я не совсем уверен, как реализовать

stats.f_oneway( Name_Dioptrics_GroupA, Name_Dioptrics_GroupB,....)

. То, что я до сих пор делал:

  • импортированные данные в виде единичного фрейма данных из csv
  • попытка группировки на основе имен-диоптрий

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() ] ] ]) ) 


Конечно, это не работает ...Правильный ли я подход здесь?

1 Ответ

1 голос
/ 26 апреля 2019

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

Вернется:

{('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')}

В вашем коде вы пытаетесь сгруппировать только по имени, без диоптрии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...