Tuổi ước tính từ tên, phần 1


Lê Mai Khánh
6 năm trước
Hữu ích 10 Chia sẻ Viết bình luận 0
Đã xem 5906

Hôm nay tôi đọc một bài đăng dễ thương từ Flowing Data về những cái tên hợp thời nhất trong lịch sử Hoa Kỳ . Điều khiến tôi chú ý là một liên kết được đăng trong bài báo đến dữ liệu nguồn, đây là danh sách hàng năm các tên em bé được đăng ký với cơ quan an sinh xã hội Hoa Kỳ kể từ năm 1880
(xem tại đây) . Tôi nghĩ rằng có thể tốt để biên dịch và sử dụng các danh sách này tại nơi làm việc vì hai lý do:

(1) Tôi không có kinh nghiệm xử lý đầu vào tập tin lập trình trong R (tức là làm việc với một loạt các tập tin trong một thư mục thay vì tự tải một hoặc hai) và
(2) Nó có thể là hữu ích để có ước tính tuổi trong các tập tin nhà tài trợ mà tôi làm việc cùng (sử dụng năm khi mỗi tên đầu tiên phổ biến nhất).

Tôi đã bao gồm mã R trong bài đăng này ở phía dưới, sau văn bản giải thích sau đây.

Tôi đã quản lý để xây dựng một khung dữ liệu chứa trong mỗi hàng một tên, có bao nhiêu người đã được đăng ký sinh ra với tên đó trong một năm nhất định, năm, tổng dân số cho năm đó và tỷ lệ tương đối của những người có tên đó Trong năm đó.

Khi tôi có được khung dữ liệu đó, tôi đã xây dựng một hàm để truy vấn khung dữ liệu đó trong năm khi một tên cụ thể là phổ biến nhất, tuổi ước tính sử dụng năm đó và tỷ lệ tương đối của những người sinh ra với tên đó từ năm đó.

Tôi không có bất kỳ dữ liệu kiểm tra nào để kiểm tra kết quả, nhưng tôi đã thực hiện kiểm tra không chính thức quanh văn phòng và có vẻ ổn!

Tuy nhiên, tôi muốn mở rộng quy mô này lên để ước tính tuổi có thể được tính cho mỗi hàng trong một vectơ tên. Khi mã đứng bên dưới, hàm tôi thực hiện mất quá nhiều thời gian để được tăng kích thước một cách hiệu quả.

Tôi đang tự hỏi cách tiếp cận tốt nhất để làm là gì? Một số ý tưởng tôi đã làm theo cho đến nay:

  • Tạo một khung dữ liệu nhỏ hơn trong đó mỗi hàng chứa một tên duy nhất, năm mà nó phổ biến nhất và mức độ phổ biến tương đối trong năm đó. Tạo một hàm để truy vấn khung dữ liệu mới này.
  • Có thể chuyển đổi khung dữ liệu trên thành bảng dữ liệu và sau đó xây dựng hàm để truy vấn bảng dữ liệu thay thế.
  • Không đạt được hiệu quả của hai ý tưởng trên, tải dữ liệu phổ biến vào Python và tạo một hàm để truy vấn nó ở đó.
Có ai có ý tưởng nào tốt hơn cho tôi không?

library(stringr)
library(plyr)
 
# We're assuming you've downloaded the SSA files into your R project directory.
 
file_listing = list.files()[3:135]
for (f in file_listing) {
  year = str_extract(f, "[0-9]{4}")
  if (year == "1880") { # Initializing the very long dataframe
    name_data = read.csv(f, header=FALSE)
    names(name_data) = c("Name", "Sex", "Pop")
    name_data$Year = rep(year, dim(name_data)[1]) }
  else { # adding onto the very long dataframe
    name_data_new = read.csv(f, header=FALSE)
    names(name_data_new) = c("Name", "Sex", "Pop")
    name_data_new$Year = rep(year, dim(name_data_new)[1])
    name_data = rbind(name_data, name_data_new)
}}
 
year_pop_totals = ddply(name_data, .(Year), function (x) sum(x$Pop))
name_data = merge(name_data, year_pop_totals, by.x="Year", by.y="Year", all.x=TRUE)
name_data$Rel_Pop = name_data$Pop/name_data$V1
 
estimate_age = function (input_name, sex = NA) {
if (is.na(sex)) {
  name_subset = subset(name_data, Name == input_name & Year >= 1921)} #1921 is a year I chose arbitrarily. Change how you like.
else {
  name_subset = subset(name_data, Name == input_name & Year >= 1921 & Sex == sex)
}
  year_and_rel_pop = name_subset[which(name_subset$Rel_Pop == max(name_subset$Rel_Pop)),c(1,6)]
  current_year = as.numeric(substr(Sys.time(),1,4))
  estimated_age = current_year - as.numeric(year_and_rel_pop[1])
  return(list(year_of_birth=as.numeric(year_and_rel_pop[1]), age=estimated_age, relative_pop=sprintf("%1.2f%%",year_and_rel_pop[2]*100)))
}

Tôi cũng sẽ chấp nhận mọi đề xuất để làm sạch mã của tôi



Hữu ích 10 Chia sẻ Viết bình luận 0
Đã xem 5906