Отображать на столбчатом графике только верхние имена с точки зрения частоты

#graph #stata

#График #stata

Вопрос:

Рассмотрим следующий набор данных toy:

 clear

input group str10 name n
1     "Jenny"   1
1     "Jenny"   1
1     "Ben"     1
1     "Tiffany" 1
1     "Sun"     1
2     "Jenny"   1
2     "Sun"     1
2     "Tiffany" 1
2     "S"       1
2     "T"       1
2     "R"       1
2     "Y"       1
2     "U"       1
2     "I"       1
2     "E"       1
2     "A"       1
2     "B"       1
3     "U"       1
3     "I"       1
3     "E"       1
3     "A"       1
3     "B"       1
end
  

Мой код следующий:

 gen n=1
graph hbar (count) n, over(name, sort(1)) over(group)
  

Это показывает мне все перепутанные имена, если я использую вышеупомянутые данные:

введите описание изображения здесь

Как я могу создать столбчатую диаграмму, которая показывает только 10 лучших категорий с точки зрения частоты, определяемой отдельно для каждого отдельного значения group ?

Комментарии:

1. Большое спасибо обоим за вашу помощь и понимание

Ответ №1:

Вот слегка измененный пример:

 clear
input group str50 name n
1     "Jenny"   1
1     "Jenny"   1
1     "Ben"     1
1     "Tiffany" 1
1     "Jenny"   1
1     "Sun"     1
2     "Jenny"   1
2     "Sun"     1
2     "Sun"     1
2     "Tiffany" 1
2     "Tiffany" 1
2     "Tiffany" 1
2     "Tiffany" 1
2     "Tiffany" 1
2     "S"       1
2     "T"       1
2     "R"       1
2     "Y"       1
2     "U"       1
2     "I"       1
2     "E"       1
2     "A"       1
2     "B"       1
3     "U"       1
3     "Ramon"   1
3     "Ramon"   1
3     "Ramon"   1
3     "Ramon"   1
3     "I"       1
3     "I"       1
3     "I"       1
3     "E"       1
3     "A"       1
3     "B"       1
end
  

Вы можете сначала collapse свой набор данных:

 collapse (count) n, by(group name)
  

Затем вы можете управлять количеством отображаемых имен, регулируя порог частоты следующим образом:

 gsort group -n
bysort group: generate tag = _n < 3

graph hbar (asis) n if tag, over(name) over(group) nofill
  

введите описание изображения здесь

Ответ №2:

Чтобы проиллюстрировать выбор 10 наиболее часто встречающихся классов, мы построим здесь набор данных с двумя группами. В каждом из них есть 11 классов. Затем мы покажем общий метод выбора 10 наиболее частых.

 * create sandbox dataset 
clear 
set obs 22 
tokenize "`c(ALPHA)'" 
generate name = "" 
generate freq = _n 
generate group = cond(_n <= 11, 1, 2) 
forval j = 1/11 { 
      replace name = "``j''" if inlist(_n, `j', 23 - `j') 
}  

tabulate name group [fw=freq] 
expand freq 
drop freq 
  

Вот как выглядит набор данных (результаты tabulate команды выше):

            |         group
      name |         1          2 |     Total
----------- ---------------------- ----------
         A |         1         22 |        23 
         B |         2         21 |        23 
         C |         3         20 |        23 
         D |         4         19 |        23 
         E |         5         18 |        23 
         F |         6         17 |        23 
         G |         7         16 |        23 
         H |         8         15 |        23 
         I |         9         14 |        23 
         J |        10         13 |        23 
         K |        11         12 |        23 
----------- ---------------------- ----------
     Total |        66        187 |       253 
  

Десятью наиболее частыми классами являются K, J, …, C, B для группы 1 и A, …, J для группы 2.

Вот один из способов получить и отобразить 10 наиболее частых, определенных отдельно для каждой группы. Код пользователя начинается здесь, с другого номера пользователя вместо 10, если это необходимо. В этом случае ничто не зависит от наличия только двух групп, как в примере.

 bysort group name : generate freq = _N
egen tag = tag(group name)
gsort group -tag -freq name
by group: generate selected = _n <= 10
bysort group name (selected) : replace selected = selected[_N]

graph hbar (count) if selected, over(name, sort(1) descending) by(group) nofill scheme(s1color)
  

введите описание изображения здесь