Как использовать функцию mse - пример babynames - PullRequest
1 голос
/ 06 марта 2019

Поэтому я использую пакет '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 Ответ

0 голосов
/ 07 марта 2019

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

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

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) 

enter image description here

На уровне гендерного паритета "Кейси", вот лучшие 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) 

enter image description here

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