আমি (ক) ব্যবহারকারীর মধ্যে পরিবর্তনের মূল প্রভাবগুলি মুছে ফেলার জন্য একটি (মানিক) প্রাথমিক বিশ্লেষণের পরামর্শ দিতে চাই, (খ) পরিবর্তনের ক্ষেত্রে সমস্ত ব্যবহারকারীর মধ্যে আদর্শ প্রতিক্রিয়া এবং (গ) এক সময়ের থেকে পরবর্তী সময়ের মধ্যে সাধারণ পরিবর্তনের জন্য ।
এটি করার একটি সহজ (তবে কোনওভাবেই সর্বোত্তম নয়) উপায় হল ব্যবহারকারী মিডিয়ান এবং সময়কালীন মিডিয়ানদের সাফ করার জন্য ডেটাতে "মিডিয়ান পোলিশ" এর কয়েকটি পুনরাবৃত্তি করা, তারপরে সময়ের সাথে সাথে বাকীগুলিকে মসৃণ করুন। মসৃণগুলি যেগুলি অনেকগুলি পরিবর্তন করে তা সনাক্ত করুন: তারা গ্রাফিকগুলিতে আপনি জোর দিতে চান এমন ব্যবহারকারী users
কারণ এগুলি গণনা ডেটা, বর্গমূল ব্যবহার করে এগুলি পুনরায় প্রকাশ করা ভাল ধারণা।
ফলাফল কী হতে পারে তার উদাহরণ হিসাবে, 240 ব্যবহারকারীর একটি সিমুলেটেড 60-সপ্তাহের ডেটাসেট রয়েছে যারা সাধারণত প্রতি সপ্তাহে 10 থেকে 20 ক্রিয়া করে। 40 সপ্তাহ পরে সমস্ত ব্যবহারকারীর মধ্যে একটি পরিবর্তন ঘটেছিল these এর মধ্যে তিনটি পরিবর্তকে নেতিবাচক প্রতিক্রিয়া জানাতে "বলা হয়েছিল"। বাম প্লটটি কাঁচা ডেটা দেখায়: সময়ের সাথে সাথে ব্যবহারকারী দ্বারা রঙের দ্বারা পৃথকীকৃত কর্মের সংখ্যা। প্রশ্নে দৃserted়ভাবে বলা হয়েছে, এটি একটি গোলযোগ। ডান প্লটটি এই ইডিএর ফলাফলগুলি দেখায় - আগের মতো একই রঙে - অস্বাভাবিকভাবে প্রতিক্রিয়াশীল ব্যবহারকারীদের সাথে স্বয়ংক্রিয়ভাবে চিহ্নিত এবং হাইলাইট হয়। সনাক্তকরণ - এটা কিছুটা যদিও তদর্থক --is সম্পূর্ণ ও সংশোধন (এই উদাহরণে)।
এখানে R
কোডটি এই তথ্য উত্পাদিত এবং বিশ্লেষণ চালায়। এটি সহ বেশ কয়েকটি উপায়ে উন্নতি করা যেতে পারে
কেবলমাত্র একটি পুনরাবৃত্তির পরিবর্তে অবশিষ্টাংশগুলি অনুসন্ধান করার জন্য একটি পূর্ণ মিডিয়ান পোলিশ ব্যবহার করা।
পরিবর্তনের পয়েন্টের আগে এবং পরে আলাদাভাবে অবশিষ্টাংশগুলিকে স্মুথ করা।
সম্ভবত আরও পরিশীলিত আউটলেট সনাক্তকরণ অ্যালগরিদম ব্যবহার করে। বর্তমান এক কেবল সমস্ত ব্যবহারকারীকে ফ্ল্যাগ করে যাঁর রেসিডুয়ালগুলির পরিসীমা মাঝারি ব্যাপ্তির দ্বিগুণেরও বেশি। তবুও সহজ, এটি দৃust় এবং ভালভাবে কাজ করে বলে মনে হয়। (একটি ব্যবহারকারী-স্থিরযোগ্য মান, এই পরিচয়টি 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")