2013-09-07 19 views
5

Để tôi cho bạn một ví dụ:"Top 20% số người kiếm được 80% số tiền" ... kiểu này quả sử dụng R

person | salary 
---------------- 
1  | 30'000 
2  | 10'000 
3  | 15'000 
4  | 25'000 
5  | 80'000 
6  | 56'000 
... | ... 

Các bước cần thực hiện để có được kết quả này sẽ để đặt hàng tiền lương và sau đó tạo một bảng mới cho chia sẻ hàng/người từ đầu cho đến hàng tương ứng và tỷ lệ của tổng tiền lương bắt đầu cho đến khi hàng tương ứng (trong tổng số tiền lương).

Sau đó, người ta chỉ phải lấy hàng gần nhất với 20% cho mọi người và chúng tôi biết họ kiếm được bao nhiêu tiền.

Đây là một câu hỏi khá chuẩn - nhưng vì tôi không biết làm thế nào để tham khảo nó bằng lời nói tôi không thể google nó. Vì vậy, tôi sẽ đánh giá cao nếu ai đó có thể cho tôi biết những gì để "gọi này" và làm thế nào để tính toán và âm mưu này trong R dễ dàng nhất - vì vậy không có vòng lặp và các công cụ. Trực giác của tôi cho tôi biết có ít nhất 5 gói và 10 chức năng giải quyết tình huống này. Có thể một cái gì đó tương tự như tóm tắt() với số lượng cố định.

Vì vậy, chúng ta hãy giả bảng trên là có sẵn như là một khung dữ liệu:

salaries <- data.frame(person = c(1,2,3,...), salary = c(30000,...))

+2

Lưu ý rằng 20% ​​số người nói chung sẽ kiếm được 20% số tiền. Đó là * đầu * 20% có thể tạo ra nhiều hơn. Cơ thể câu hỏi của bạn dường như hỏi về 20% hàng đầu nhưng tiêu đề câu hỏi của bạn hơi gây hiểu nhầm. –

+1

Quy tắc "80-20" được gọi là một ví dụ cụ thể về [phân phối pháp luật quyền lực] (https://en.wikipedia.org/wiki/Power_law). [Bài đăng này] (http://tuvalu.santafe.edu/~aaronc/powerlaws/) có một số thông tin thú vị về một số ngôn ngữ, bao gồm R. Ngoài ra còn có một gói R, [poweRlaw] (http: //cran.r -project.org/web/packages/poweRlaw/index.html), w/mà tôi không quen thuộc, nhưng rõ ràng được viết bởi người dùng CV @csgillespie. – gung

Trả lời

1

Sử dụng dữ liệu SLID thu nhập từ car -package:

library(car) 

dat <- SLID[!is.na(SLID$wage),]  # Remove missing values 
dat$income <- dat$wage*40*50   # "translate" the wages to their full time annual earnings equivalent. 
dat$id <- seq(1,nrow(dat))  

# Create a data.frame with a person ID and their annual income: 
keep <- data.frame(id = seq(1, nrow(dat)), 
        income = dat$income) 
keep <- keep[order(keep$income, decreasing = TRUE),] # Descending ordering according to income 
keep$accum <- cumsum(keep$income)      # Cumulative sum of the descending incomes 
keep$pct <- keep$accum/sum(keep$income)*100   # % of the total income 

keep$check <- keep$pct<80      # Check where the % is smaller than 80% 
threshold <- min(which(keep$check == FALSE)) # First line where % is larger than 80% 
border <- threshold/nrow(keep)*100    # Check which percentile that was 
border <- round(border, digits = 2) 
paste0(border, "% of the people earn 80% of the income") 

#[1] "62.41% of the people earn 80% of the income" 

Các cổ điển 80-20 quy tắc như chúng tôi mong đợi, sẽ cho thấy "20% số người kiếm được 80% thu nhập". Quy tắc này không áp dụng ở đây, như bạn có thể nhìn thấy ..

Đối số đảo ngược:

# The 20% of the people earn X % of total income: 

linenr <- ceiling(1/5*nrow(keep)) 
outcome2 <- round(keep$pct[linenr], digits = 2) 
paste0(outcome2, "% of total income is earned by the top 20% of the people") 

# [1] "36.07% of total income is earned by the top 20% of the people" 

Lưu ý rằng những con số đưa ra ở đây không phải là đại diện cho thế giới thực :)

Ngoài ra, Wikipedia có thêm một số thông tin về nguyên tắc Pareto, còn được gọi là quy tắc 80-20. Dường như quy tắc này xuất hiện trong nhiều cài đặt, chẳng hạn như kinh doanh, kinh tế và toán học.