এই সমস্যাটিকে জেড-স্কোর বা স্ট্যান্ডার্ড স্কোরের জন্য আহ্বান জানানো হয়েছে, যা historicalতিহাসিক গড়কে বিবেচনা করবে, যেমন অন্যান্য লোকেরা উল্লেখ করেছেন, তবে এই historicalতিহাসিক ডেটার মানক বিচ্যুতিও কেবল গড় ব্যবহারের চেয়ে আরও দৃust় করে তোলে।
আপনার ক্ষেত্রে একটি জেড-স্কোর নিম্নলিখিত সূত্র দ্বারা গণনা করা হয়, যেখানে প্রবণতাটি ভিউ / দিনের মতো হার হবে।
z-score = ([current trend] - [average historic trends]) / [standard deviation of historic trends]
যখন একটি জেড-স্কোর ব্যবহার করা হয়, জেড-স্কোরটি তত বেশি বা অস্বাভাবিক প্রবণতাটি কম বাড়ে, উদাহরণস্বরূপ যদি জেড-স্কোরটি অত্যন্ত ইতিবাচক হয় তবে প্রবণতাটি অস্বাভাবিকভাবে বাড়ছে, যদি এটি অত্যন্ত নেতিবাচক হয় তবে এটি অস্বাভাবিকভাবে পতিত হয় । সুতরাং একবার আপনি সমস্ত পরীক্ষার্থীর প্রবণতার জন্য জেড-স্কোর গণনা করুন সর্বোচ্চ 10 জেড-স্কোর সবচেয়ে অস্বাভাবিকভাবে বৃদ্ধি পাওয়া জেড-স্কোরগুলির সাথে সম্পর্কিত।
জেড-স্কোর সম্পর্কে আরও তথ্যের জন্য দয়া করে উইকিপিডিয়া দেখুন।
কোড
from math import sqrt
def zscore(obs, pop):
# Size of population.
number = float(len(pop))
# Average population value.
avg = sum(pop) / number
# Standard deviation of population.
std = sqrt(sum(((c - avg) ** 2) for c in pop) / number)
# Zscore Calculation.
return (obs - avg) / std
নমুনা আউটপুট
>>> zscore(12, [2, 4, 4, 4, 5, 5, 7, 9])
3.5
>>> zscore(20, [21, 22, 19, 18, 17, 22, 20, 20])
0.0739221270955
>>> zscore(20, [21, 22, 19, 18, 17, 22, 20, 20, 1, 2, 3, 1, 2, 1, 0, 1])
1.00303599234
>>> zscore(2, [21, 22, 19, 18, 17, 22, 20, 20, 1, 2, 3, 1, 2, 1, 0, 1])
-0.922793112954
>>> zscore(9, [1, 2, 0, 3, 1, 3, 1, 2, 9, 8, 7, 10, 9, 5, 2, 4, 1, 1, 0])
1.65291949506
মন্তব্য
আপনি স্লাইডিং উইন্ডো দিয়ে এই পদ্ধতিটি ব্যবহার করতে পারেন (অর্থাত্ শেষ ৩০ দিন) আপনি যদি খুব বেশি ইতিহাস বিবেচনায় না নিতে চান তবে এটি স্বল্পমেয়াদী প্রবণতাগুলিকে আরও প্রকট করে তুলবে এবং প্রক্রিয়াজাতকরণের সময়টি কেটে ফেলতে পারে।
আপনি প্রতিদিনের ক্রমবর্ধমান / হ্রাসের জন্য অস্বাভাবিক মূল্যবোধগুলি সনাক্ত করতে এক দিন থেকে পরের দিন থেকে দেখা পরিবর্তনের মতো মানগুলির জন্য জেড-স্কোরও ব্যবহার করতে পারেন। এটি প্রতিদিনের গ্রাফের theাল বা ভিউর ব্যবহারের মতো।
আপনি যদি জনসংখ্যার বর্তমান আকার, জনসংখ্যার বর্তমান মোট এবং জনসংখ্যার x ^ 2 এর বর্তমান পরিমাণের উপর নজর রাখেন তবে আপনাকে এই মানগুলি পুনরায় গণনা করার দরকার নেই, কেবলমাত্র সেগুলি আপডেট করুন এবং তাই আপনাকে কেবলমাত্র প্রয়োজন ইতিহাসের জন্য এই মানগুলি রাখুন, প্রতিটি ডাটা মান নয়। নিম্নলিখিত কোডটি এটি দেখায়।
from math import sqrt
class zscore:
def __init__(self, pop = []):
self.number = float(len(pop))
self.total = sum(pop)
self.sqrTotal = sum(x ** 2 for x in pop)
def update(self, value):
self.number += 1.0
self.total += value
self.sqrTotal += value ** 2
def avg(self):
return self.total / self.number
def std(self):
return sqrt((self.sqrTotal / self.number) - self.avg() ** 2)
def score(self, obs):
return (obs - self.avg()) / self.std()
এই পদ্ধতিটি ব্যবহার করে আপনার কাজের প্রবাহ নিম্নরূপ হবে। প্রতিটি বিষয়, ট্যাগ, বা পৃষ্ঠার জন্য একটি ভাসমান পয়েন্ট ফিল্ড তৈরি করুন, মোট দিনের সংখ্যা, দেখার সমষ্টি এবং আপনার ডাটাবেসে স্কোয়ার ভিউগুলির যোগফল। আপনার যদি historicতিহাসিক ডেটা থাকে, তবে এই ডেটাটি ব্যবহার করে এই ক্ষেত্রগুলি সূচনা করুন, অন্যথায় শূন্যে শুরু করুন। প্রতিটি দিন শেষে, তিনটি ডাটাবেস ক্ষেত্রে সংরক্ষিত historicতিহাসিক ডেটার বিরুদ্ধে দিনের সংখ্যাটি ব্যবহার করে জেড-স্কোর গণনা করুন। সর্বাধিক এক্স জেড-স্কোর সহ বিষয়গুলি, ট্যাগগুলি বা পৃষ্ঠাগুলি হ'ল আপনার এক্স "সবচেয়ে জনপ্রিয় ট্রেন্ডস"। দিনের মান সহ 3 টি ক্ষেত্রের অবশেষে আপডেট করুন এবং আগামীকাল প্রক্রিয়াটি পুনরাবৃত্তি করুন।
নতুন সংযোজন
উপরোক্ত আলোচিত সাধারণ জেড স্কোরগুলি তথ্যের ক্রমটিকে বিবেচনা করে না এবং তাই '1' বা '9' এর পর্যবেক্ষণের জন্য জেড-স্কোরটি ক্রমটির বিপরীতে একই পরিমাণে [1, 1, 1, 1 , 9, 9, 9, 9]। স্পষ্টতই ট্রেন্ড সন্ধানের জন্য, সর্বাধিক বর্তমান ডেটাতে পুরানো ডেটার চেয়ে বেশি ওজন থাকা উচিত এবং তাই আমরা '1' পর্যবেক্ষণকে '9' পর্যবেক্ষণের চেয়ে আরও বড় আকারের স্কোর করতে চাই। এটি অর্জনের জন্য আমি একটি ভাসমান গড় জেড-স্কোর প্রস্তাব করি। এটি পরিষ্কার হওয়া উচিত যে এই পদ্ধতিটি পরিসংখ্যানগতভাবে সাবলীল হওয়ার গ্যারান্টিযুক্ত নয় তবে প্রবণতা সন্ধানের জন্য বা এর অনুরূপ জন্য কার্যকর হওয়া উচিত। স্ট্যান্ডার্ড জেড-স্কোর এবং ভাসমান গড় জেড-স্কোরের মধ্যে প্রধান পার্থক্য হ'ল গড় জনসংখ্যা মূল্য এবং গড় জনসংখ্যা মান বর্গক্ষেত্র গণনা করতে ভাসমান গড়ের ব্যবহার। বিশদ জন্য কোড দেখুন:
কোড
class fazscore:
def __init__(self, decay, pop = []):
self.sqrAvg = self.avg = 0
# The rate at which the historic data's effect will diminish.
self.decay = decay
for x in pop: self.update(x)
def update(self, value):
# Set initial averages to the first value in the sequence.
if self.avg == 0 and self.sqrAvg == 0:
self.avg = float(value)
self.sqrAvg = float((value ** 2))
# Calculate the average of the rest of the values using a
# floating average.
else:
self.avg = self.avg * self.decay + value * (1 - self.decay)
self.sqrAvg = self.sqrAvg * self.decay + (value ** 2) * (1 - self.decay)
return self
def std(self):
# Somewhat ad-hoc standard deviation calculation.
return sqrt(self.sqrAvg - self.avg ** 2)
def score(self, obs):
if self.std() == 0: return (obs - self.avg) * float("infinity")
else: return (obs - self.avg) / self.std()
নমুনা IO
>>> fazscore(0.8, [1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9]).score(1)
-1.67770595327
>>> fazscore(0.8, [1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9]).score(9)
0.596052006642
>>> fazscore(0.9, [2, 4, 4, 4, 5, 5, 7, 9]).score(12)
3.46442230724
>>> fazscore(0.9, [2, 4, 4, 4, 5, 5, 7, 9]).score(22)
7.7773245459
>>> fazscore(0.9, [21, 22, 19, 18, 17, 22, 20, 20]).score(20)
-0.24633160155
>>> fazscore(0.9, [21, 22, 19, 18, 17, 22, 20, 20, 1, 2, 3, 1, 2, 1, 0, 1]).score(20)
1.1069362749
>>> fazscore(0.9, [21, 22, 19, 18, 17, 22, 20, 20, 1, 2, 3, 1, 2, 1, 0, 1]).score(2)
-0.786764452966
>>> fazscore(0.9, [1, 2, 0, 3, 1, 3, 1, 2, 9, 8, 7, 10, 9, 5, 2, 4, 1, 1, 0]).score(9)
1.82262469243
>>> fazscore(0.8, [40] * 200).score(1)
-inf
হালনাগাদ
ডেভিড কেম্প সঠিকভাবে উল্লেখ করেছেন যে, যদি ধ্রুবক মানগুলির একটি সিরিজ দেওয়া হয় এবং অন্য পর্যালোচিত মানের জন্য একটি zscore যা অন্যান্য মানগুলির থেকে পৃথক হয় তবে অনুরোধ করা হয় ফলাফলটি সম্ভবত শূন্য নয়। আসলে প্রত্যাবর্তিত মানটি অনন্ত হওয়া উচিত। সুতরাং আমি এই লাইনটি পরিবর্তন করেছি,
if self.std() == 0: return 0
প্রতি:
if self.std() == 0: return (obs - self.avg) * float("infinity")
এই পরিবর্তনটি ফ্যাজস্কোর সমাধান কোডে প্রতিফলিত হয়। যদি কেউ অসীম মূল্যবোধের সাথে ডিল করতে না চায় তবে একটি গ্রহণযোগ্য সমাধান এর পরিবর্তে লাইনটি পরিবর্তন করতে পারে:
if self.std() == 0: return obs - self.avg