Групповая статистика

Групповая статистика

Загрузим файл, который мы сохранили при подготовке набора данных.

D = pd.read_csv('rtgotov.csv')
D.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 48 entries, 0 to 47
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   t       48 non-null     float64
 1   v       45 non-null     float64
 2   isi     47 non-null     float64
 3   mod     48 non-null     object 
 4   g       48 non-null     int64  
dtypes: float64(3), int64(1), object(1)
memory usage: 2.0+ KB

Из информации о наборе данных видно, что в нём есть 4 числовых колонки и одна нечисловая.

Для получения базовой статистики по числовым колонкам удобно использовать метод describe().

D.describe()
t v isi g
count 48.000000 45.000000 47.000000 48.000000
mean 137.359292 0.394822 4.860957 4.916667
std 69.842828 0.085013 2.559978 2.541848
min 9.585000 0.282000 1.671000 2.000000
25% 85.204000 0.338000 2.268500 2.000000
50% 122.865500 0.385000 4.508000 4.000000
75% 204.571000 0.431000 6.917000 8.000000
max 238.050000 0.698000 10.507000 8.000000

Зависимая переменная в колонке „v“ - время реакции, с. Значения зависимой переменной мы хотим сгруппировать по признакам модальность (mod) и группа (g).

D.groupby(by=['mod','g'])['v'].mean()
mod  g
a    2    0.392000
     4    0.456125
     8    0.464143
v    2    0.355143
     4    0.313857
     8    0.382444
Name: v, dtype: float64

В полученной серии средних значений индекс сдвоенный в соответствии с нашими группирующими признаками.

Мы можем такой группировочный объект сохранить в переменную, из которой можем получить различные статистические показатели.

g = D.groupby(by=['mod','g'])['v']
g
<pandas.core.groupby.generic.SeriesGroupBy object at 0x00000199FE74A6D0>
xx = arange(len(g))
yy = g.mean()
bar(xx, yy)
errorbar(xx, yy, yerr=g.sem(), color='k', ls='')
xticks(xx, g.groups.keys())
title('Групповые средние ВР, с');
_images/i_groupmean_12_0.png

В данному случае мы отобразили групповые средние .mean() и ошибку средних .sem() в виде усов. Подписи к рисунку взяты из названий получившихся групп.

Фактически группировщик задает списки принадлежности исходных данных к найденным группам по их индексам.

g.groups
{('a', 2): [41, 42, 43, 44, 45, 46, 47], ('a', 4): [33, 34, 35, 36, 37, 38, 39, 40], ('a', 8): [24, 25, 26, 27, 28, 29, 30, 31, 32], ('v', 2): [17, 18, 19, 20, 21, 22, 23], ('v', 4): [9, 10, 11, 12, 13, 14, 15, 16], ('v', 8): [0, 1, 2, 3, 4, 5, 6, 7, 8]}

Часто при группировке по двум и более факторам удобно получить итоговые значения на пересечениях всех значений факторов. (В терминологии Excel это называется сводная таблица).

P = D.pivot_table(index='mod',columns='g', values='v')
P
g 2 4 8
mod
a 0.392000 0.456125 0.464143
v 0.355143 0.313857 0.382444

По-умолчанию, в сводной таблице считается среднее, но можно задать и другую агрегирующую функцию.

# с параметром aggfunc='sem' вычисляем такую же таблицу с ошибками среднего
E = D.pivot_table(index='mod',columns='g', values='v', aggfunc='sem')
P.plot(kind='bar', yerr=E, title='Групповые средние ВР, с');
_images/i_groupmean_19_0.png

Альтернативный способ взглянуть на эти данные - транспонировать сводную таблицу.

P.T.plot(kind='bar', yerr=E.T, title='Групповые средние ВР, с');
_images/i_groupmean_21_0.png

В подписях и легендах к рисункам в пакете pandas автоматически отображаются названия группирующих факторов. Это удобно и наглядно при предварительном анализе.

Для окончательных рисунков можно задать свои подписи с соответствующими параметрами. Или, наоборот, можно задать русские названия факторов и их значений.