Как использовать функцию mse — пример с детскими именами

#r

#r

Вопрос:

Итак, я использую пакет ‘babynames’ в rstudio и пытаюсь получить 35 наиболее распространенных унисекс-имен. Я пытаюсь ранжировать имена на основе среднеквадратичной ошибки из строки 50 на 50 (однако я не уверен, как это сделать). Любая помощь была бы с благодарностью принята! (Также под своим кодом я помещу ‘справочный код’, который нам дали, который включает в себя 35 лучших имен для мужчин)

Ссылочный код:

 actual_names <- c("Jessie", "Marion", "Jackie", "Alva", "Ollie",
                  "Jody", "Cleo", "Kerry", "Frankie", "Guadalupe", 
                  "Carey", "Tommie", "Angel", "Hollis", "Sammie",
                  "Jamie", "Kris", "Robbie", "Tracy", "Merrill", 
                  "Noel", "Rene", "Johnnie", "Ariel", "Jan", 
                  "Devon", "Cruz", "Michel", "Gale", "Robin", 
                  "Dorian", "Casey", "Dana", "Kim", "Shannon")
  

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

1. Я бы предложил объединить общее количество мужчин и женщин по каждому имени, что-то вроде babynames %>% filter(year >= 1930, year <= 2012) %>% count(name, sex, wt = n) %>% spread(sex, n) . Затем вы могли бы mutate из двух результирующих столбцов получить процентное разделение и связанную с ним среднеквадратичную ошибку 50/50.

Ответ №1:

Я думаю, есть несколько способов ответить на поставленный вопрос, поскольку существует компромисс между «наиболее популярным» и «наиболее унисексным».

Вот способ подготовить данные для сбора некоторой статистики для каждого имени.

 library(babynames)
library(tidyverse)
babynames_share <-
  babynames %>%
  filter(year >= 1930, year <= 2012) %>%
  count(name, sex, wt = n) %>% 
  spread(sex, n, fill = 0) %>% 
  mutate(Total = F   M,  
         F_share = F / Total,
         MS_50 = ((F_share-0.5)^2   
               (0.5-F_share)^2) / 2)
  

Похоже, что около 100 имен имеют идеальное соотношение полов — но все они довольно необычны:

 babynames_share %>%
  filter(F == M) %>%
  arrange(-Total) 
# A tibble: 100 x 6
   name         F     M Total F_share RMS_50
   <chr>    <dbl> <dbl> <dbl>   <dbl>  <dbl>
 1 Tyjae      157   157   314     0.5      0
 2 Callaway   128   128   256     0.5      0
 3 Avyn       100   100   200     0.5      0
 4 Zarin       92    92   184     0.5      0
 5 Tkai        72    72   144     0.5      0
 6 Rayen       57    57   114     0.5      0
 7 Meco        43    43    86     0.5      0
 8 Pele        40    40    80     0.5      0
 9 Nijay       35    35    70     0.5      0
10 Mako        27    27    54     0.5      0
# … with 90 more rows
  

Или мы могли бы выбрать некоторый произвольный порог для того, что считается унисекс. В приведенном выше примере я рассчитал среднеквадратичную ошибку для процентных долей женщин и мужчин. Мы можем построить график так, чтобы в верхней части отображались имена с разбивкой по полу (по этому показателю MS_50 превышает 0,25), а в нижней части — имена с разделением на мужчин и женщин. Но для меня не очевидно, как далеко мы должны зайти, чтобы считать имя унисекс. Является ли Кейси, который на 58,9% мужчина, следовательно, с ошибкой в квадрате 8,9% ^ 2 = 0,79%, однополым? Или нам нужно перейти к Джесси, которая на 50,8% состоит из мужчин?

 babynames_share %>%
  ggplot(data = .,
         aes(Total, MS_50, label = name))  
  geom_point(size = 0.2, alpha = 0.1, color = "gray30")  
  geom_text(data = . %>% filter(Total > 10000),
            check_overlap = TRUE, size = 3)  
  scale_x_log10(breaks = c(10^(1:7)), 
                labels = scales::comma) 
  

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

На уровне гендерного равенства «Кейси», вот 35 лучших:

 unisex_names <- babynames_share %>% 
  filter(MS_50 <= 0.00796) %>%
  arrange(-Total) %>%
  top_n(35, wt = Total) 
  

Также интересно увидеть весь спектр имен, большинство из которых мужские внизу, женские вверху и унисекс в середине:

 babynames_share %>%
  ggplot(data = .,
         aes(Total, F_share, label = name))  
  geom_point(size = 0.2, alpha = 0.1, color = "gray30")  
  geom_text(data = . %>% filter(Total > 10000),
            check_overlap = TRUE, size = 2)  
  scale_x_log10(breaks = c(10^(1:7)), 
                labels = scales::comma) 
  

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

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

1. Большое спасибо за вашу помощь! Насколько я понимаю, нет определенного места для «end», чтобы считать имя унисекс. Тем не менее, я просмотрел все имена в списке по отдельности, и все имена содержат в общей сложности как минимум 9000 дочерних элементов за период 1930-2012 годов с таким именем.

2. Я отредактировал выше, чтобы было понятнее, что вы могли бы использовать определение «такой же унисекс, как Кейси», чтобы получить список самых популярных мужских имен. Однако это всего лишь одно определение / пороговое значение — если вы имеете в виду что-то конкретное, пожалуйста, включите это в вопрос.