การกำหนดผู้มีส่วนร่วมมากที่สุดในกลุ่ม


9

ฉันไม่รู้สถิติเกี่ยวกับตัวฉันมากนัก สมมติว่าฉันมีพนักงาน 1,000 คน ฉันต้องการทราบว่าใครคือคนงานที่ยากที่สุด แต่ฉันสามารถวัดปริมาณงานที่ต้องทำในกลุ่มที่ 1-100 มากกว่าหนึ่งชั่วโมงต่อการทำงาน สมมติว่าคนงานแต่ละคนทำงานในปริมาณที่เท่ากันเสมอกว่าการทดลองและการรวมกันเป็นจำนวนมากฉันจะจัดอันดับคนงานของฉันโดยใครที่ทำงานหนักที่สุด

หมายเหตุ: นี่เป็นเพียงคำอุปมาจึงไม่ต้องกังวลกับการทดสอบจริง ๆ เพียงแค่สมมติว่าฉันมีชุดข้อมูลจำนวนมากแล้ว

แก้ไข: เมื่อฉันพูดว่า "สมมติว่าคนงานแต่ละคนทำงานด้วยปริมาณงานที่เท่ากันเสมอ" ฉันหมายถึงแต่ละคนทำงานในปริมาณที่เท่ากันในแต่ละวัน ดังนั้นโจอี้จะทำงานประมาณ 100 หน่วยในแต่ละวันและเกร็กจะทำประมาณ 50 งานปัญหาคือฉันสามารถสังเกตจำนวนหน่วยของงานที่ทำโดยกลุ่มเท่านั้น

การแก้ไขเพิ่มเติม: เกี่ยวกับจำนวนของคนงานที่ทำงานในคราวเดียวและความถี่ของพวกเขาที่ทำงาน อาจมีคนงานจำนวนเท่าใดก็ได้ที่ทำงานในเวลาเดียวกัน คนงานบางคนอาจจะจบลงด้วยการทำงานมากกว่าคนอื่น ๆ นั่นก็คือเราสามารถสันนิษฐานได้ว่าคนงานบางคนจะทำงานเกือบ 90% ของเวลาและคนอื่น ๆ แทบจะไม่เคยเลย

ฉันรู้ว่ามันทำให้ยาก แต่ฉันจะมีชุดข้อมูลที่มีขนาดใหญ่มากหวังว่าจะทำให้ง่ายขึ้นเล็กน้อย

ในแต่ละชั่วโมงเรารู้ว่าคนงานคนใดกำลังทำงานและทำงานเป็นจำนวนเท่าใด จากข้อมูลนั้นฉันต้องการทราบว่าใครทำผลงานได้ดีที่สุด

หากข้อมูลอยู่ในรูปแบบ JSON จะมีลักษณะดังนี้:

[
  {
    "work_done": 12345,
    "Workers": [ "andy", "bob", "cameron", "david" ]
  },
  {
    "work_done": 432,
    "Workers": [ "steve", "joe", "andy"]
  },
  {
    "work_done": 59042,
    "Workers": [ "bob", "aaron", "michelle", "scott", "henry" ]
  },
  ...
]

3
สารเติมแต่งในการทำงานเช่นปริมาณของผลิตภัณฑ์หรือไม่ จากนั้นคุณสามารถใช้การถดถอยเชิงเส้นเพื่อประเมินผลงานจากผู้ปฏิบัติงานแต่ละคนและเรียงลำดับคนงานตามค่าสัมประสิทธิ์ของพวกเขา ถ้ามันไม่ใช่สารเติมแต่งคุณอาจต้องการบางสิ่งที่ซับซ้อนกว่านี้
Douglas Zare

หากคุณคิดว่าคุณรู้ว่าแต่ละกลุ่มทำงานได้เท่าไหร่และยังถือว่างานนั้นมีการกระจายอย่างเท่าเทียมกันระหว่างผู้เข้าร่วมในแต่ละกลุ่มคุณสามารถแบ่งจำนวนงานที่ทำโดยกลุ่มตามจำนวนคนในกลุ่มและผลรวม บิตของงานแต่ละคนได้ทำในกลุ่มที่แตกต่างกัน แม้ว่ามันจะไม่มีสถิติอะไรเลย
Qnan

1
@DouglasZare ใช่งานเป็นสารเติมแต่ง
Greg Guida

1
ฉันคิดว่าคำอธิบายนั้นชัดเจน คุณสังเกตคนงานเป็นกลุ่มและต้องการที่จะอนุมานเกี่ยวกับคนงานแต่ละคน ตัวอย่างเช่นสมมติว่าคุณมีคนงานทั้งหมด 5 คนในวันแรกคุณสังเกตพนักงาน {1,2,3} คนในวันที่สองคุณเห็นคนงาน {1,4,5} ในวันที่สาม {2,3,4 } ฯลฯ และข้อมูลของคุณเป็นผลลัพธ์ทั้งหมดในแต่ละวัน จากนั้นคุณสามารถประมาณค่าเฉลี่ยของผลลัพธ์ของพนักงานแต่ละคนได้หรือไม่? คำตอบคือใช่ - ถ้าคุณได้รับการกระจายของผลรวมของคนงานคุณก็สามารถเขียนความน่าจะเป็นและเพิ่มความสามารถให้มากที่สุดในฐานะหน้าที่ของแต่ละคน
มาโคร

1
ฉันพลาดอะไรไป ฉันยังคงไม่เห็นว่าคุณได้ค่าเฉลี่ยของแต่ละคนเท่าไหร่ เรารู้อยู่เสมอว่าคนงานคนไหนที่อยู่ในช่วงเวลาที่แยกกันของข้อมูล? จำนวนงานทั้งหมดต่อชั่วโมงได้รับการแก้ไขหรือไม่? มีข้อสันนิษฐานที่ชัดเจนในการกำหนดปัญหาที่ฉันพลาดหรือไม่?
Michael R. Chernick

คำตอบ:


10

David Harris ให้คำตอบที่ดีแต่เนื่องจากคำถามยังคงได้รับการแก้ไขบางทีมันอาจช่วยในการดูรายละเอียดของวิธีแก้ปัญหาของเขา ไฮไลท์ของการวิเคราะห์ต่อไปนี้คือ:

  • สี่เหลี่ยมที่มีน้ำหนักน้อยที่สุดน่าจะเหมาะสมกว่าสแควร์สแควร์ทั่วไป

  • เนื่องจากการประมาณการอาจสะท้อนให้เห็นถึงความแปรปรวนของประสิทธิภาพการทำงานที่นอกเหนือการควบคุมของบุคคลใด ๆ โปรดใช้ความระมัดระวังเกี่ยวกับการใช้งานเหล่านี้เพื่อประเมินพนักงานแต่ละคน


ในการดำเนินการนี้ให้สร้างข้อมูลจริงโดยใช้สูตรที่ระบุเพื่อให้เราสามารถประเมินความแม่นยำของการแก้ปัญหา สิ่งนี้ทำได้ด้วยR:

set.seed(17)
n.names <- 1000
groupSize <- 3.5
n.cases <- 5 * n.names  # Should exceed n.names
cv <- 0.10              # Must be 0 or greater
groupSize <- 3.5        # Must be greater than 0
proficiency <- round(rgamma(n.names, 20, scale=5)); hist(proficiency)

ในขั้นตอนแรกเรา:

  • ตั้งค่าเมล็ดพันธุ์สำหรับตัวสร้างตัวเลขสุ่มเพื่อให้ทุกคนสามารถทำซ้ำผลลัพธ์ได้อย่างแน่นอน

  • n.namesระบุจำนวนแรงงานที่มีอยู่กับ

  • groupSizeกำหนดจำนวนที่คาดหวังของคนงานต่อกลุ่มที่มี

  • ระบุวิธีการหลายราย (สังเกต) n.casesจะสามารถใช้ได้กับ (หลังจากนั้นไม่กี่ข้อเหล่านี้จะถูกกำจัดเพราะพวกเขาสอดคล้องกันในขณะที่มันเกิดขึ้นแบบสุ่มกับคนงานในหน่วยงานสังเคราะห์ของเรา)

  • จัดเรียงสำหรับปริมาณงานที่จะแตกต่างกันแบบสุ่มจากสิ่งที่จะถูกคาดการณ์ตามผลรวมของ "ความชำนาญ" ของแต่ละกลุ่ม ค่าของcvเป็นรูปแบบสัดส่วนทั่วไป เช่นที่0.10 รับที่นี่สอดคล้องกับรูปแบบทั่วไป 10% (ซึ่งอาจช่วงเกิน 30% ในบางกรณี)

  • สร้างพนักงานของคนที่มีทักษะการทำงานที่แตกต่างกัน พารามิเตอร์ที่ให้ไว้ที่นี่สำหรับการคำนวณproficiencyสร้างช่วงของมากกว่า 4: 1 ระหว่างพนักงานที่ดีที่สุดและแย่ที่สุด (ซึ่งจากประสบการณ์ของฉันอาจแคบลงเล็กน้อยสำหรับเทคโนโลยีและงานมืออาชีพ แต่อาจกว้างสำหรับงานการผลิตตามปกติ)

ด้วยแรงงานสังเคราะห์ในมือนี้ขอจำลองการทำงานของพวกเขา จำนวนนี้เพื่อสร้างกลุ่มของพนักงานแต่ละคน ( schedule) สำหรับการสังเกตแต่ละครั้ง (กำจัดการสังเกตใด ๆ ที่ไม่มีคนทำงานเลยเข้าร่วม) รวมถึงความเชี่ยวชาญของพนักงานในแต่ละกลุ่มและคูณผลรวมนั้นด้วยค่าเฉลี่ยแบบสุ่ม1) เพื่อสะท้อนความผันแปรที่จะเกิดขึ้นอย่างหลีกเลี่ยงไม่ได้ (หากไม่มีการเปลี่ยนแปลงเลยเราจะส่งคำถามนี้ไปยังไซต์คณิตศาสตร์ที่ผู้ตอบแบบสอบถามชี้ให้เห็นว่าปัญหานี้เป็นเพียงชุดของสมการเชิงเส้นพร้อมกันซึ่งสามารถแก้ไขได้อย่างแม่นยำสำหรับผู้เชี่ยวชาญ)

schedule <- matrix(rbinom(n.cases * n.names, 1, groupSize/n.names), nrow=n.cases)
schedule <- schedule[apply(schedule, 1, sum) > 0, ]
work <- round(schedule %*% proficiency * exp(rnorm(dim(schedule)[1], -cv^2/2, cv)))
hist(work)

ฉันพบว่าสะดวกที่จะนำข้อมูลเวิร์กกรุ๊ปทั้งหมดไปไว้ในกรอบข้อมูลเดียวเพื่อการวิเคราะห์ แต่เพื่อแยกค่าการทำงานออก:

data <- data.frame(schedule)

นี่คือที่ที่เราจะเริ่มต้นด้วยข้อมูลจริง:เราจะมีการจัดกลุ่มคนงานที่เข้ารหัสโดยdata(หรือschedule) และผลงานที่สังเกตได้ในworkอาเรย์

น่าเสียดายถ้าคนงานบางคนถูกจับคู่เสมอขั้นตอนRของมันlmก็ล้มเหลวโดยมีข้อผิดพลาด เราควรตรวจสอบการจับคู่ดังกล่าวก่อน วิธีหนึ่งคือการหาคนงานที่มีความสัมพันธ์อย่างสมบูรณ์ในตาราง:

correlations <- cor(data)
outer(names(data), names(data), paste)[which(upper.tri(correlations) & 
                                             correlations >= 0.999999)]

ผลลัพธ์จะแสดงรายการของพนักงานที่จับคู่ตลอดเวลา: สามารถใช้เพื่อรวมพนักงานเหล่านี้เป็นกลุ่มเพราะอย่างน้อยเราสามารถประเมินประสิทธิภาพของแต่ละกลุ่มได้หากไม่ใช่บุคคลที่อยู่ภายใน character(0)เราหวังว่ามันก็ถ่มน้ำลายออกมา สมมติว่ามันเป็นอย่างนั้น

หนึ่งจุดที่ลึกซึ้งโดยนัยในคำอธิบายที่กล่าวมาคือความแปรปรวนในงานที่ทำนั้นเป็นแบบหลายค่าไม่ใช่แบบเพิ่มเติม สิ่งนี้เป็นจริง: ความแปรปรวนของผลลัพธ์ของกลุ่มคนงานจำนวนมากจะสูงกว่าการเปลี่ยนแปลงในกลุ่มเล็ก ๆ ดังนั้นเราจะได้รับการประมาณที่ดีขึ้นโดยการใช้กำลังสองน้อยที่สุดแทนการยกกำลังสองธรรมดา น้ำหนักที่ดีที่สุดที่จะใช้ในรุ่นนี้คือส่วนกลับของปริมาณงาน (ในกรณีที่จำนวนงานบางอย่างเป็นศูนย์ฉันทำเหลวไหลโดยเพิ่มจำนวนเล็กน้อยเพื่อหลีกเลี่ยงการหารด้วยศูนย์)

fit <- lm(work ~ . + 0, data=data, weights=1/(max(work)/10^3+work))
fit.sum <- summary(fit)

ควรใช้เวลาหนึ่งหรือสองวินาที

ก่อนที่จะไปเราควรทำการทดสอบการวินิจฉัยของพอดี แม้ว่าการพูดถึงสิ่งเหล่านั้นจะนำเราไปไกลเกินกว่าที่นี่Rคำสั่งเดียวในการสร้างการวินิจฉัยที่มีประโยชน์คือ

plot(fit)

(จะใช้เวลาสองสามวินาที: มันเป็นชุดข้อมูลขนาดใหญ่!)

แม้ว่าโค้ดไม่กี่บรรทัดเหล่านี้จะทำงานทั้งหมดและคายความเชี่ยวชาญโดยประมาณสำหรับผู้ปฏิบัติงานแต่ละคน แต่เราไม่ต้องการสแกนผ่านเอาต์พุตจำนวน 1,000 บรรทัดทั้งหมด - อย่างน้อยก็ในทันที Let 's กราฟิกที่ใช้ในการแสดงผล

fit.coef <- coef(fit.sum)
results <- cbind(fit.coef[, c("Estimate", "Std. Error")], 
             Actual=proficiency, 
             Difference=fit.coef[, "Estimate"] - proficiency,
             Residual=(fit.coef[, "Estimate"] - proficiency)/fit.coef[, "Std. Error"])
hist(results[, "Residual"])
plot(results[, c("Actual", "Estimate")])

ฮิสโตแกรม (แผงด้านซ้ายล่างของรูปด้านล่าง) มีความแตกต่างระหว่างค่าประมาณและความเป็นจริงซึ่งแสดงเป็นทวีคูณของข้อผิดพลาดมาตรฐานของการประมาณ สำหรับขั้นตอนที่ดีค่าเหล่านี้มักจะอยู่ระหว่างกันเสมอ2 และ 2 และมีการกระจายแบบสมมาตรรอบ ๆ 0. แม้ว่ามีพนักงาน 1,000 คนที่เกี่ยวข้องเราคาดหวังอย่างเต็มที่ว่าจะเห็นความแตกต่างที่เป็นมาตรฐานเหล่านี้สองสามอย่าง3 และแม้กระทั่ง 4 ห่างจาก 0. นี่คือกรณีตรงนี้: ฮิสโตแกรมนั้นสวยอย่างที่ใคร ๆ ก็คาดหวัง (สิ่งหนึ่งอาจเป็นเรื่องที่ดี: ข้อมูลจำลองมาจากทั้งหมด แต่สมมาตรยืนยันว่าน้ำหนักทำงานได้อย่างถูกต้องการใช้ตุ้มน้ำหนักที่ไม่ถูกต้องจะมีแนวโน้มที่จะสร้างฮิสโตแกรมแบบอสมมาตร)

Scatterplot (แผงด้านล่างขวาของรูปภาพ) เปรียบเทียบความเชี่ยวชาญโดยประมาณกับที่เกิดขึ้นจริงโดยตรง แน่นอนว่าสิ่งนี้จะไม่สามารถใช้งานได้ในความเป็นจริงเพราะเราไม่ทราบถึงความเชี่ยวชาญที่แท้จริง: ในที่นี้คือพลังของการจำลองด้วยคอมพิวเตอร์ สังเกต:

  • หากไม่มีการเปลี่ยนแปลงแบบสุ่มในการทำงาน (ตั้งค่าcv=0และรันโค้ดอีกครั้งเพื่อดูสิ่งนี้) scatterplot จะเป็นเส้นทแยงมุมที่สมบูรณ์แบบ การประมาณการทั้งหมดจะแม่นยำอย่างสมบูรณ์แบบ ดังนั้นการกระจายที่เห็นที่นี่สะท้อนให้เห็นถึงการเปลี่ยนแปลงที่

  • บางครั้งค่าที่ประมาณไว้นั้นค่อนข้างอยู่ไกลจากค่าจริง ตัวอย่างเช่นมีจุดหนึ่งอยู่ใกล้ (110, 160) ซึ่งความสามารถโดยประมาณนั้นสูงกว่าความสามารถที่แท้จริงประมาณ 50% เกือบจะหลีกเลี่ยงไม่ได้ในชุดข้อมูลขนาดใหญ่ จำสิ่งนี้ไว้ในใจหากการประมาณการจะถูกนำมาใช้เป็นรายบุคคลเช่นสำหรับการประเมินคนงาน โดยรวมแล้วการประเมินเหล่านี้อาจยอดเยี่ยม แต่ในกรณีที่การเปลี่ยนแปลงในการทำงานเกิดจากสาเหตุที่อยู่นอกเหนือการควบคุมของบุคคลใดบุคคลหนึ่งแล้วประมาณสองสามคนการประมาณการจะผิดพลาด: สูงเกินไปบางคนต่ำเกินไป และไม่มีวิธีที่จะบอกได้อย่างแม่นยำว่าใครได้รับผลกระทบ

นี่คือสี่แปลงที่สร้างขึ้นในระหว่างกระบวนการนี้

พล็อต

ท้ายที่สุดโปรดทราบว่าวิธีการถดถอยนี้สามารถปรับให้เข้ากับการควบคุมตัวแปรอื่น ๆ ที่อาจมีความสัมพันธ์กับผลผลิตกลุ่ม สิ่งเหล่านี้อาจรวมถึงขนาดกลุ่มระยะเวลาของความพยายามในการทำงานแต่ละครั้งตัวแปรเวลาปัจจัยสำหรับผู้จัดการของแต่ละกลุ่มและอื่น ๆ เพียงรวมไว้เป็นตัวแปรเพิ่มเติมในการถดถอย


ว้าวนั่นเป็นเรื่องที่ต้องทำมากมายฉันเดาว่าฉันไม่แน่ใจว่าฉันจะบอกได้อย่างไรว่าคนงานที่ยากที่สุดมาจากแผนภูมิเหล่านี้
Greg Guida

แผนภูมิเป็นแบบต่อคนงานหรือไม่
Greg Guida

แผงด้านล่างขวาแสดงการประมาณการทั้งหมด 1,000 รายการ ส่วนที่สูงที่สุดอยู่ที่ประมาณ 200: มันปรากฏไปทางขวา ฮิสโทแกรมความชำนาญและฮิสโตแกรมที่เหลือยังแสดงถึงผลลัพธ์สำหรับพนักงาน 1,000 คน พาเนลด้านบนขวาซึ่งเป็นฮิสโตแกรมของงานแสดงจำนวนงานทั้งหมดเกือบ 5,000 งาน
whuber

ตกลงฉันเข้าใจความหมายของแต่ละชาร์ต แต่ฉันไม่แน่ใจว่าจะใช้มันอย่างไรเพื่อจัดอันดับคนงาน
Greg Guida

จากบนลงล่างในแผงล่างขวา รหัสยังสร้างตารางของผลลัพธ์เหล่านี้ (เรียกว่าresults): คุณสามารถจัดเรียงได้ตามค่าที่ประเมินไว้ คุณสามารถส่งออกไปยังสเปรดชีตและอื่น ๆ ได้
whuber

7

คุณต้องการตั้งค่าข้อมูลของคุณเช่นนี้โดยที่ 1 ระบุว่าบุคคลนั้นเป็นส่วนหนึ่งของทีมที่ทำงานของแถวนั้น:

 work.done Alice Bob Carl Dave Eve Fred Greg Harry Isabel
 1.6631071     0   1    1    0   1    0    0     0      0
 0.7951651     1   1    0    0   0    0    0     1      0
 0.2650049     1   1    1    0   0    0    0     0      0
 1.2733771     0   0    0    0   1    0    0     1      1
 0.8086390     1   0    1    0   0    0    0     0      1
 1.7323428     1   0    0    0   0    0    1     0      1
 ...

จากนั้นคุณสามารถทำการถดถอยเชิงเส้น (สมมติว่าทุกอย่างเป็นสารเติมแต่ง ฯลฯ ตามที่คุณกล่าวถึงในความคิดเห็น) ในRคำสั่งจะเป็น

lm(work.done ~ . + 0, data = my.data)

"สูตร" work.done ~ . + 0บอกว่าเป็นภาษาอังกฤษว่าปริมาณงานที่ทำขึ้นอยู่กับคอลัมน์อื่น ๆ ทั้งหมด (นั่นคือ ".") และกลุ่มที่ไม่มีคนงานจะไม่ทำงาน (นั่นคือ "+ 0") สิ่งนี้จะทำให้คุณมีส่วนร่วมโดยประมาณจากพนักงานแต่ละคนไปยังกลุ่มผลลัพธ์เฉลี่ย

ตามที่กล่าวไว้ในความคิดเห็นหากคุณมีคู่แรงงานที่อยู่ด้วยกันเสมอโมเดลจะไม่แยกความแตกต่างของการมีส่วนร่วมของพนักงานสองคนจากคนอื่นและคนหนึ่งจะได้รับ "NA"


มันสำคัญแค่ไหนที่มีพนักงาน 1,000 คน? กลุ่ม 1-100 หมายถึงอะไร แม้จะมีการชี้แจงจากการแก้ไข 2 ครั้งฉันไม่เห็นว่าทุกชุดข้อมูลระบุบุคคลในกลุ่มได้อย่างไร สิ่งที่ฉันรู้ก็คือแต่ละคนทำงานในปริมาณเท่ากันทุกวัน เนื่องจากหลายท่านคิดว่ามีวิธีแก้ปัญหาที่อาจเกิดขึ้นผ่านการถดถอยอย่างชัดเจนสมมติฐานพื้นฐานและวิธีการทำงานของบุคคลที่สามารถระบุตัวตนได้อย่างไร นอกจากนี้ฉันยังสับสนเกี่ยวกับการอภิปรายทั้งหมดของการทำงานร่วมกัน ไม่มีสิ่งใดที่จะถือว่านอกเหนือไปจากการทำงานอย่างอิสระ
Michael R. Chernick

ข้อ จำกัด เดียวที่ฉันเห็นคือแต่ละคนสามารถทำงานในปริมาณที่เท่ากันในการทดลองจำนวนมาก? ดูเหมือนว่าเรากำลังพยายามแปลสิ่งที่ไม่สมเหตุสมผล แต่ชัดเจนว่านี่คือสิ่งที่ OP ต้องการหรือไม่
Michael R. Chernick

@MichaelChernick ฉันไม่แน่ใจว่าฉันเข้าใจความกังวลของคุณ เป็นเช่นนั้นหรือไม่ที่บุคคลเดียวกันสามารถมีส่วนร่วมในการทดลองที่แตกต่างกันหรือมีจำนวนมากขึ้นหรือไม่
David J. Harris

@ DavidHarris ฉันคิดว่าคุณมีทางออกที่ดีถ้าสมมติฐานของคุณถูกต้อง แต่ฉันกังวลเกี่ยวกับความสามารถในการระบุตัวตนของแต่ละคนที่มีคนงานจำนวนมาก OP คิดว่าขนาดตัวอย่างใหญ่ช่วยได้ แต่จะต้องมีโครงสร้างเหมือนที่คุณให้ไว้และการตั้งสมมติฐาน ฉันไม่คิดว่าเขาได้ระบุทุกสิ่งที่เราต้องการเพื่อแก้ไขปัญหา
Michael R. Chernick

@MichaelChernick ฉันคิดว่าถ้าเราคิดว่าคนงานมีความเป็นอิสระโมเดลเชิงเส้นนั้นค่อนข้างปลอดภัยและ linearity ก็ปกป้องเราจากปัญหาบางอย่างที่เราอาจพบเจอ whuber อาจถูกต้องเกี่ยวกับน้ำหนักซึ่งจะช่วย เอฟเฟกต์แบบสุ่มสำหรับคนงานและกลุ่มสามารถช่วยให้ค่าพารามิเตอร์มีสติได้หากมีปัญหาในการระบุตัวตน อาจมีการปรับปรุงเพิ่มเติมที่สามารถทำได้ แต่ฉันยังคงคิดว่านี่เป็นแนวทางที่ถูกต้องโดยสมมติว่าคนงานมีความเป็นอิสระ
David J. Harris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.