ฉันอยากจะแนะนำการวิเคราะห์เบื้องต้น (มาตรฐาน) เพื่อลบเอฟเฟกต์หลักของ (a) การเปลี่ยนแปลงระหว่างผู้ใช้ (ข) การตอบสนองทั่วไปในหมู่ผู้ใช้ทั้งหมดต่อการเปลี่ยนแปลงและ (c) การเปลี่ยนแปลงทั่วไปจากช่วงเวลาหนึ่งไปยังอีก .
วิธีที่ง่ายที่สุด (แต่ไม่ดีที่สุด) ในการทำเช่นนี้คือการทำซ้ำ "median polish" บนข้อมูลเพื่อกวาดล้างมีเดียกลางของผู้ใช้และมีเดียไทม์ช่วงเวลา ระบุความราบรื่นที่เปลี่ยนแปลงไปมาก: พวกเขาคือผู้ใช้ที่คุณต้องการเน้นในกราฟิก
เนื่องจากสิ่งเหล่านี้เป็นข้อมูลที่นับเป็นความคิดที่ดีที่จะแสดงอีกครั้งโดยใช้รากที่สอง
ตัวอย่างของสิ่งที่อาจส่งผลต่อไปนี้เป็นชุดข้อมูลจำลอง 60 สัปดาห์ของผู้ใช้ 240 คนซึ่งโดยทั่วไปจะดำเนินการ 10 ถึง 20 การกระทำต่อสัปดาห์ การเปลี่ยนแปลงในผู้ใช้ทั้งหมดเกิดขึ้นหลังจากสัปดาห์ที่ 40 มีการ "บอก" สามอย่างเพื่อตอบสนองต่อการเปลี่ยนแปลง พล็อตด้านซ้ายแสดงข้อมูลดิบ: จำนวนการกระทำของผู้ใช้ (โดยผู้ใช้แยกตามสี) เมื่อเวลาผ่านไป ตามที่ถูกกล่าวหาในคำถามมันเป็นระเบียบ พล็อตที่ถูกต้องแสดงผลลัพธ์ของ EDA นี้ - ในสีเดียวกับก่อน - โดยผู้ใช้ที่ตอบสนองผิดปกติจะถูกระบุและไฮไลต์โดยอัตโนมัติ ข้อมูลระบุตัว - แม้ว่าจะเป็นแบบเฉพาะกิจ - มันสมบูรณ์และถูกต้อง (ในตัวอย่างนี้)
นี่คือR
รหัสที่สร้างข้อมูลเหล่านี้และทำการวิเคราะห์ สามารถปรับปรุงได้หลายวิธี ได้แก่
ใช้การขัดแบบมัธยฐานเต็มรูปแบบเพื่อค้นหาสิ่งตกค้างมากกว่าการทำซ้ำเพียงครั้งเดียว
การทำให้เศษตกค้างเกลี้ยงก่อนและหลังจุดเปลี่ยน
อาจใช้อัลกอริธึมการตรวจหาค่าผิดปกติที่ซับซ้อนยิ่งขึ้น ปัจจุบันปัจจุบันเพียงแค่ตั้งค่าสถานะผู้ใช้ทั้งหมดที่มีช่วงของการตกค้างมากกว่าสองเท่าของค่ามัธยฐาน แม้ว่าจะง่าย แต่ก็ดูแข็งแกร่งและทำงานได้ดี (ค่าที่ผู้ใช้สามารถตั้งค่าได้threshold
สามารถปรับเปลี่ยนเพื่อให้การระบุนี้เข้มงวดมากขึ้นหรือน้อยลง)
การทดสอบแสดงให้เห็นว่าวิธีการแก้ปัญหานี้ทำงานได้ดีสำหรับการนับจำนวนผู้ใช้ที่หลากหลาย, 12 - 240 หรือมากกว่า
n.users <- 240 # Number of users (here limited to 657, the number of colors)
n.periods <- 60 # Number of time periods
i.break <- 40 # Period after which change occurs
n.outliers <- 3 # Number of greatly changed users
window <- 1/5 # Temporal smoothing window, fraction of total period
response.all <- 1.1 # Overall response to the change
threshold <- 2 # Outlier detection threshold
# Create a simulated dataset
set.seed(17)
base <- exp(rnorm(n.users, log(10), 1/2))
response <- c(rbeta(n.users - n.outliers, 9, 1),
rbeta(n.outliers, 5, 45)) * response.all
actual <- cbind(base %o% rep(1, i.break),
base * response %o% rep(response.all, n.periods-i.break))
observed <- matrix(rpois(n.users * n.periods, actual), nrow=n.users)
# ---------------------------- The analysis begins here ----------------------------#
# Plot the raw data as lines
set.seed(17)
colors = sample(colors(), n.users) # (Use a different method when n.users > 657)
par(mfrow=c(1,2))
plot(c(1,n.periods), c(min(observed), max(observed)), type="n",
xlab="Time period", ylab="Number of actions", main="Raw data")
i <- 0
apply(observed, 1, function(a) {i <<- i+1; lines(a, col=colors[i])})
abline(v = i.break, col="Gray") # Mark the last period before a change
# Analyze the data by time period and user by sweeping out medians and smoothing
x <- sqrt(observed + 1/6) # Re-express the counts
mean.per.period <- apply(x, 2, median)
residuals <- sweep(x, 2, mean.per.period)
mean.per.user <- apply(residuals, 1, median)
residuals <- sweep(residuals, 1, mean.per.user)
smooth <- apply(residuals, 1, lowess, f=window) # Smooth the residuals
smooth.y <- sapply(smooth, function(s) s$y) # Extract the smoothed values
ends <- ceiling(window * n.periods / 4) # Prepare to drop near-end values
range <- apply(smooth.y[-(1:ends), ], 2, function(x) max(x) - min(x))
# Mark the apparent outlying users
thick <- rep(1, n.users)
thick[outliers <- which(range >= threshold * median(range))] <- 3
type <- ifelse(thick==1, 3, 1)
cat(outliers) # Print the outlier identifiers (ideally, the last `n.outliers`)
# Plot the residuals
plot(c(1,n.periods), c(min(smooth.y), max(smooth.y)), type="n",
xlab="Time period", ylab="Smoothed residual root", main="Residuals")
i <- 0
tmp <- lapply(smooth,
function(a) {i <<- i+1; lines(a, lwd=thick[i], lty=type[i], col=colors[i])})
abline(v = i.break, col="Gray")