LLM پر مبنی تعاون کی خصوصیت پر کارآمد نتیجہ چلانے والی کوئی بھی مصنوعات کی تجرباتی ٹیم بالآخر اسی دیوار سے ٹکرائے گی۔ صارفین خود مختار نہیں ہیں۔ آپ کی ٹیم آپ کے پلیٹ فارم پر آدھے انٹرپرائز اکاؤنٹس کو AI میٹنگ سمریزر فراہم کرتی ہے۔ رول آؤٹ صاف ہے، آدھا آن، آدھا بند، کنٹرول گروپ کے اپنا کام مکمل کرنے کا انتظار کر رہا ہے جب کہ پروسیس شدہ گروپ آہستہ آہستہ آگے بڑھ رہا ہے۔ جیسے جیسے دو ہفتے گزر رہے ہیں، کنٹرول گروپ کے نمبر بھی آگے بڑھ رہے ہیں۔ زیادہ نہیں، لیکن نمایاں طور پر۔ اکاؤنٹ کے لیے فیچر کی تصدیق کی گئی ہے اور رول آؤٹ کنفیگریشن کو دو بار چیک کیا گیا ہے۔ کچھ اب بھی آپ کے کنٹرول کے احساس کو داغدار کر رہا ہے۔
اس سے پہلے کہ آپ لاگز کو قریب سے دیکھیں، آپ دیکھ سکتے ہیں کہ یہ کیا ہے۔ AI میٹنگ کے خلاصے مشترکہ Slack چینل میں ظاہر ہوتے ہیں، AI ڈرافٹ دستاویزات مشترکہ Google Drive فولڈر میں ظاہر ہوتے ہیں، اور AI کوڈ کے جائزے کی تجاویز پل کی درخواستوں میں ظاہر ہوتی ہیں جنہیں پروسیسنگ اور کنٹرول انجینئرز دونوں پڑھتے ہیں۔ پراسیس شدہ صارف کے رویے میں تبدیلیاں اور اس رویے کے کچھ حصے تعاونی گراف کے ذریعے کنٹرول گروپ میں واپس جھلکتے ہیں۔
یہ ایک ساتھی آلودگی کا جال ہے۔ یہ تمام تخلیقی AI پروڈکٹس میں ظاہر ہوگا جن میں مشترکہ نمونے شامل ہیں۔ ٹیم کے ممبران کے ذریعہ پڑھے گئے AI میٹنگ کے نوٹس، ساتھیوں کے ذریعہ ترمیم کردہ AI ڈرافٹ دستاویزات، جائزہ لینے والوں کے ذریعہ جانچے گئے AI کوڈ کی تجاویز، AI سے تیار کردہ ای میل تھریڈز جن کا پوری ٹیم نے جواب دیا، اور بہت کچھ۔ یوزر لیول رینڈمائزیشن فرض کرتی ہے کہ ایک صارف کی ٹریٹمنٹ اسائنمنٹ دوسرے تمام صارفین کے لیے نتائج کو محفوظ رکھتی ہے۔ کام کرنے والی جگہوں میں، یہ مفروضے ڈیزائن کے لحاظ سے غلط ہیں، اور پروڈکٹ کے تجربات کسی خصوصیت کے اصل اثرات اور کنٹرول گروپ کے اندر پیدا ہونے والے لہر کے اثرات کو یکجا کر دیتے ہیں۔
صارف کی سطح کے A/B ٹیسٹنگ کے پیچھے باہمی تعاون پر مبنی AI خصوصیات کو چلانا ایک پروڈکٹ کا تجربہ ہے جو اسٹیبل یونٹ پروسیسنگ ویلیو سمپشن (SUTVA) کی خلاف ورزی کرتا ہے۔ حل کلسٹر رینڈمائزیشن ہے۔ پوری ٹیم کو ایک ساتھ داخل ہونے یا باہر نکلنے کی اجازت دینے کے لیے ورک اسپیس کی سطح پر ایک سکے کو پلٹائیں، اور پھر براہ راست ورک اسپیس کے درمیان اسپل اوور کو ماڈل کریں۔
یہ ٹیوٹوریل آپ کو پوری پائپ لائن (کلسٹر تفویض، غیرجانبدار صارف کی سطح کے OLS، ایماندار معیاری غلطیوں کے لیے کلسٹر کے وزن والے کم سے کم اسکوائرز، براہ راست اور اسپل اوور اثرات کی الگ الگ شناخت کرنے کے لیے دو ایکسپوژر ڈیکمپوزیشن، اور کلسٹرڈ بوٹسٹریپ اعتماد کے وقفے) سے گزرتا ہے۔ اثرات آپ اس کا اندازہ لگائیں گے، غیر یقینی صورتحال کا اندازہ لگائیں گے، اور دیکھیں گے کہ آپ کا نقطہ نظر خاموشی سے کہاں ٹوٹتا ہے۔
ساتھی کوڈ: تمام کوڈ بلاکس ساتھی نوٹ بک میں github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm/tree/main/05_cluster_randomization پر اینڈ ٹو اینڈ چلائے جاتے ہیں۔ لیپ ٹاپ (
cluster_randomization_demo.ipynb) میں تمام آؤٹ پٹ پری رن ہے، لہذا آپ اسے مقامی طور پر چلانے سے پہلے GitHub سے پڑھ سکتے ہیں۔
انڈیکس
صارف کی سطح کی A/B بے ترتیب کاری تعاون کو کیوں توڑ دیتی ہے۔
A/B ٹیسٹنگ کی ریاضی خوبصورت ہے کیونکہ ایک صارف کی پروسیسنگ تفویض دوسرے صارف کے نتائج کو متاثر نہیں کرتی ہے۔ ایک سکہ پلٹائیں؛ آدھے صارفین AI فیچر کا استعمال کرتے ہیں اور سکے پلٹنے سے کنفیگریشن کی وجہ سے پیدا ہونے والی کسی بھی الجھن کو ختم ہو جاتا ہے۔ تعاون تین طریقوں سے ضمانتوں کو توڑتا ہے۔
مشترکہ نمونے سفر کرتے ہیں۔ AI کے خلاصے ان چینلز میں جاتے ہیں جنہیں ٹیم کے تمام اراکین پڑھتے ہیں، AI ڈرافٹ دستاویزات فولڈرز میں جاتے ہیں جن میں ٹیم کے تمام اراکین ترمیم کرتے ہیں، اور AI کوڈ کے جائزے کی تجاویز پل کی درخواستوں میں جاتی ہیں جن کا جائزہ لینے والے تمام جائزہ لیتے ہیں۔ کنٹرول کرنے والے صارفین ان نمونوں کو استعمال کریں گے قطع نظر اس سے کہ فیچر آن کیا گیا ہے یا نہیں، اور AI کی مدد سے مواد کو پڑھنے کے ان کے اعمال کے اثرات نتائج میں آ جائیں گے۔
مشترکہ ورک فلو مداخلت کا باعث بنتے ہیں۔ AI سمریزرز پر انحصار کرنے والے سلوک کرنے والے صارفین مختصر فالو اپ نوٹ لکھتے ہیں، یہ فرض کرتے ہوئے کہ ان کی ٹیم کے اراکین نے خلاصے پڑھ لیے ہیں۔ ایک ہی ٹیم کے کنٹرول والے صارفین چھوٹے نوٹ وصول کرتے ہیں اور انہیں پڑھنے میں کم وقت صرف کرتے ہیں، اس طرح سیشن کی لمبائی میں تبدیلی آتی ہے۔ اس کا مطلب یہ ہے کہ پروسیس شدہ صارف کی تفویض نے کنٹرول صارف کے نتائج کو تبدیل کر دیا، جو بالکل وہی ہے جو SUTVA منع کرتا ہے۔
نیٹ ورک اپنانا تعاون کی پیروی کرتا ہے۔ پروسیسڈ ٹیموں پر طاقت استعمال کرنے والے پہلے خصوصیات کے ساتھ تجربہ کرتے ہیں اور پھر کراس ٹیم چینلز کے ذریعے اپنی ٹیم کے ساتھیوں کو دوسرے ورک اسپیس سے دھکیلتے ہیں۔ اگر پروسیس شدہ گروپ AI- فعال مواد تیار کرتا ہے جسے کنٹرول گروپ پڑھتا اور کاپی کرتا ہے، تو کنٹرول گروپ کو سوئچ پلٹائے بغیر جزوی طور پر پروسیس کیا جاتا ہے۔
تینوں میکانزم ایک جیسی علامات پیدا کرتے ہیں۔ یعنی، خام صارف کی سطح کا موازنہ کسی خصوصیت کے براہ راست اثر کو کم سمجھتا ہے کیونکہ کنٹرول گروپ اب خالص متضاد نہیں ہے۔ اس ٹیوٹوریل کے مصنوعی ڈیٹاسیٹ میں، زمینی سچائی کا براہ راست اثر علاج شدہ صارفین کے لیے +0.80 منٹ سیشن کا وقت ہے، اور کام کی جگہوں پر تعاون کرنے والے کنٹرول صارفین کے لیے زمینی سچائی کا اثر +0.20 منٹ ہے۔ بے ہودہ صارف کی سطح کا OLS +0.6723 بازیافت کرتا ہے، جو براہ راست اثر کو 16% کم سمجھتا ہے اور معیاری غلطیوں کی اطلاع دیتا ہے جو تقریباً 19 گنا بہت چھوٹی ہیں۔ اس کی وجہ یہ ہے کہ ہم 50,000 صارفین کو خود مختار سمجھتے ہیں، حالانکہ علاج صرف 50 کلسٹرز میں بے ترتیب تھے۔ یہ کوئی چھوٹی غلطی نہیں ہے۔ وہ قسم جو ٹوٹی ہوئی خصوصیات کو جاری کرنے کے بارے میں فیصلے کرتی ہے۔
کلسٹر رینڈمائزیشن دراصل کیا کرتی ہے۔
کلسٹر رینڈمائزیشن اس بات کو یقینی بنانے کے لیے ورک اسپیس کی سطح پر مختص سکے کو پلٹ دیتی ہے کہ پوری ٹیمیں ایک ہی سیکٹر میں واقع ہیں، زیادہ تر مداخلت کو اس مقام تک محدود کرتے ہوئے اور بقایا انٹر ورک اسپیس رساو کو براہ راست ماڈل کے قابل بناتا ہے۔
شکل 1 (تصویر ab: کلسٹر رینڈمائزیشن کو نشانہ بنانے والی SUTVA خلاف ورزی کا منصوبہ۔ پروسیس شدہ ورک اسپیس (اوپر کی قطار، سرخ) میں موجود تمام صارفین AI فعالیت دیکھ سکتے ہیں۔ کنٹرول ورک اسپیس (نیچے کی قطار) میں موجود تمام صارفین کچھ نہیں دیکھ سکتے ہیں، لیکن ساتھی (نارنج) AI آرٹفیکٹس کو پڑھتے ہیں، مشترکہ دستاویزات کے ذریعے سفر کرنے والے کوڈز کا جائزہ لیتے ہیں۔ لیکس کو جزوی طور پر پروسیس کیا جاتا ہے، یہ مداخلت کو غائب نہیں کرتا ہے، لیکن باقی کو ایک قابل شناخت جزو کے طور پر چھوڑنے سے جس کا دوہرا نمائش کا ماڈل براہ راست اندازہ لگا سکتا ہے۔
ورک اسپیس پر کارروائی ہونے کے بعد، اس کے اندر موجود تمام صارفین کو وہ فعالیت حاصل ہوگی۔ اگر یہ ایک کنٹرول شدہ ورک اسپیس ہے تو اس میں کوئی نہیں ہے۔ ورک اسپیس کے اندر مداخلت ٹھیک ہے کیونکہ ٹیم کے تمام ممبران ایک ہی اسائنمنٹ کا اشتراک کرتے ہیں اور ورک اسپیس لیول کی اوسط پورے پروسیسنگ پیکج کو حاصل کرتی ہے۔ ڈیزائن کا مقصد پورے کام کی جگہ میں مداخلت کو کنٹرول کرنا ہے۔
تخمینہ لگانے والا مفروضوں کے ایک سیٹ کے تحت کام کرتا ہے، اور ہر مفروضے کا ایک نام جاننے کے قابل ہوتا ہے، جیسا کہ اس ٹیوٹوریل کے نقشے کے آخر میں ناکامی کے طریقوں کو براہ راست مخصوص خلاف ورزیوں تک پہنچایا جاتا ہے۔
-
کلسٹر سطح کی بے ترتیب تفویض۔ علاج دراصل ایک بے ترتیب طریقہ کار کے ذریعے کلسٹر کی سطح پر تفویض کیے جاتے ہیں۔ علاج شدہ بازو کو کون سی ورک اسپیس تفویض کی گئی ہے وہ ورک اسپیس لیول کے ممکنہ نتائج سے آزاد ہے۔
-
جزوی مداخلت۔ مداخلت کلسٹر کے اندر ہوتی ہے، لیکن کلسٹر کے اس پار نہیں ہوتی ہے (Hudgens et al.) ورک اسپیس A میں علاج حاصل کرنے والے صارفین ورک اسپیس A میں ٹیم کے اراکین کو متاثر کر سکتے ہیں، لیکن ورک اسپیس B میں استعمال کنندگان کو نہیں۔
-
کلسٹر لیول SUTVA۔ ورک اسپیس کی پروسیسنگ ایک واحد، اچھی طرح سے طے شدہ پیکیج ہے۔ اس فنکشن کا ایک ورژن ہے: نمائش میں کلسٹر ہیٹروجنیٹی کلسٹر سطح کے اثرات میں جذب ہو جاتی ہے۔
-
کلسٹرز کا تبادلہ۔ آپ سکے کو پلٹانے سے پہلے پروسیس شدہ اور ورک اسپیس کو کنٹرول کر سکتے ہیں۔ رینڈمائزیشن اسے کمپوزیشن کے ذریعے حاصل کرتی ہے۔
-
کلسٹرز کی کافی تعداد ہے۔ کلسٹرز پر مضبوط اندازہ کلسٹر وسیع مرکزی حد نظریہ پر انحصار کرتا ہے۔ پریکٹیشنرز اکثر K ≥ 30 کو کام کرنے والی پرت کے طور پر استعمال کرتے ہیں، لیکن مناسب حد کا انحصار کلسٹر سائز کی نسبت اور ٹیسٹ کے اعدادوشمار کے انتخاب پر ہوتا ہے۔ کم کلسٹرز کو دوسرے انفرنس ٹولز کی ضرورت ہوتی ہے جیسے رینڈم انفرنس یا کلسٹر وائلڈ بوٹسٹریپنگ۔
جزوی مداخلت یہاں لوڈ بیئرنگ کے لیے پہلے سے طے شدہ مفروضہ ہے۔ کلسٹر رینڈمائزیشن کا نکتہ یہ ہے کہ چونکہ انٹر کلسٹر سپل اوور انٹرا کلسٹر سپل اوور سے چھوٹا اور سست ہے، اس لیے پوری ٹیم کی پروسیسنگ میں زیادہ تر متوقع مداخلت ہوگی (یوگینڈر ایٹ ال۔) اگر انٹر کلسٹر رساو اہم ہے، تو دو نمائشی ماڈل براہ راست اس رساو کی شناخت اور اندازہ لگاتا ہے۔
شرطیں
Python 3.11 یا اس سے زیادہ، پانڈا اور لکیری رجعت کے ساتھ آرام، اور عام کم سے کم چوکوں کے بارے میں قطعی علم کی ضرورت ہے۔
اس ٹیوٹوریل کے لیے پیکجز انسٹال کریں۔
pip install numpy pandas statsmodels scipy matplotlib
موجودہ صورتحال کچھ یوں ہے: پانچ پیکیج پوری پائپ لائن کا احاطہ کرتے ہیں۔ پانڈا ڈیٹا لوڈ کرتا ہے اور کلسٹر مختص کرتا ہے۔ NumPy سرنی ریاضی اور بوٹسٹریپ ڈرائنگ کو ہینڈل کرتا ہے۔ اسٹیٹس ماڈل تمام ریگریشنز کے لیے موزوں ہے، بشمول بولی OLS، کلسٹر-ویٹڈ کم از کم اسکوائرز، اور کلسٹر-مضبوط معیاری خامیوں کے ساتھ دو نمائشی ماڈل۔ Scipy کرنل ڈینسٹی تشخیصی پلاٹوں کی حمایت کرتا ہے، اور matplotlib انہیں پیش کرتا ہے۔
مصنوعی ڈیٹاسیٹ حاصل کرنے کے لیے، ساتھی ریپوزٹری کو کلون کریں۔
git clone https://github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm.git
cd product-experimentation-causal-inference-genai-llm
python data/generate_data.py --seed 42 --n-users 50000 --out data/synthetic_llm_logs.csv
موجودہ صورتحال کچھ یوں ہے: کلون ساتھی ذخیرہ درآمد کرتا ہے اور generate_data.py ہم ایک مشترکہ 50,000 صارف ڈیٹاسیٹ بناتے ہیں جو پوری سیریز میں استعمال ہوتا ہے۔ بیج 42 ڈیٹا کو دوبارہ پیدا کرنے کے قابل رکھتا ہے۔ 50,000 استعمال کنندگان کا ایک سائز کافی صارفین کو فی ورک اسپیس (تقریباً 1,000 ہر ایک) فراہم کرتا ہے تاکہ کلسٹر لیول کا اندازہ غیر علامتی طور پر برتا جا سکے۔ آؤٹ پٹ CSV اس پر پہنچے گا: data/synthetic_llm_logs.csv.
ورکنگ مثال سیٹ اپ
مصنوعی ڈیٹاسیٹ 50 ورک اسپیس میں تقسیم کیے گئے 50,000 صارفین کے ساتھ SaaS پروڈکٹ کی نقل کرتا ہے۔ تعاون پر مبنی AI خصوصیات 25 تصادفی طور پر منتخب کردہ ورک اسپیس کو مکمل کوریج فراہم کرتی ہیں اور باقی 25 کو کوئی کوریج نہیں ملتی۔
ورک اسپیس میں تعاون کرتے وقت کنٹرول کرنے والے صارفین کو لیکس کا سامنا کرنا پڑتا ہے۔ اس ٹیوٹوریل میں opt_in_agent_mode == 1 یہ ان کام کی جگہوں پر سرگرمی کے لیے رویے سے متعلق پراکسی کے طور پر کام کرتا ہے۔ وہ صارفین جو فعال طور پر AI ٹولز کا انتخاب کرتے ہیں وہ لوگ ہیں جو ٹیم کے ممبران کی لکھی ہوئی دستاویزات پڑھتے ہیں، سلیک تھریڈز، اور درخواستیں کھینچتے ہیں جہاں پر عملدرآمد شدہ ورک اسپیس AI آؤٹ پٹ ظاہر ہوتا ہے۔ پروڈکشن کی تعیناتیوں میں، اس پراکسی کو مشاہدہ شدہ تعاون کے گراف سے تبدیل کریں، جیسے کہ مشترکہ چینل کی رکنیت، دستاویز کی شریک تصنیف، یا جائزہ لینے والے اوورلیپ۔ کیونکہ opt_in_agent_mode چونکہ وہ بے ترتیب جزو کے بغیر رضاکارانہ طرز عمل کے انتخاب کی عکاسی کرتے ہیں، اس لیے حقیقی تجربات میں سپل اوور کوفیشینٹس آپٹ ان اور غیر آپٹ ان کنٹرول صارفین کے درمیان انتخاب کے فرق کو جذب کرتے ہیں۔ پیداوار لیک جھنڈے مشاہدہ تعاون گراف پر مبنی ہونے چاہئیں۔ طرز عمل پراکسی انتخابی تعصبات کو متعارف کراتے ہیں جنہیں دوہری نمائش کے ماڈل درست نہیں کرسکتے ہیں۔
اس ٹیوٹوریل میں session_minutes_obs ہم ایک ورک اسپیس لیول بیس لائن پر معلوم زمینی سچائی کے اثرات ڈال کر شروع سے شروع کرتے ہیں۔ CSV کی session_minutes کالم جان بوجھ کر الگ رکھے گئے ہیں۔ یہ علیحدگی ہمیں اس بات کو یقینی بنانے کی اجازت دیتی ہے کہ تمام تخمینہ لگانے والے بیکڈ ان اثرات کی بازیافت کریں۔
منظر نامے میں ظاہر ہونے والا اصل اثر علاج شدہ صارفین کے لیے +0.80 منٹ کا براہ راست اثر ہے اور اسپل کے سامنے آنے والے کنٹرول صارفین کے لیے +0.20 منٹ کا اسپل اوور اثر ہے۔ دونوں قدروں کو جاننا آپ کو یہ جانچنے کی اجازت دیتا ہے کہ آیا تخمینہ لگانے والا انہیں بازیافت کرتا ہے۔
مرحلہ 1: کلسٹرز تفویض کریں اور اخراج کی نمائش بنائیں
پہلا کوڈ بلاک ڈیٹا کو لوڈ کرتا ہے، کلسٹر کی سطح پر پروسیسنگ کے لیے ورک اسپیس مختص کرتا ہے، لیک ہونے والے صارفین کو جھنڈا دیتا ہے، اور مشاہدات کو ترتیب دیتا ہے جہاں حقیقت معلوم ہوتی ہے۔ نتائج ورک اسپیس لیول بیس لائن سے شروع ہوتے ہیں، اس لیے ورک اسپیس کے اندر کے ارتباط حقیقی ہیں۔ اس کے بعد ہم علاج شدہ صارفین کے لیے براہ راست اثر، بے نقاب کنٹرول استعمال کرنے والوں کے لیے اسپل اوور اثر، اور Gaussian شور شامل کرتے ہیں۔
import numpy as np
import pandas as pd
DIRECT_EFFECT = 0.80
SPILLOVER_EFFECT = 0.20
DATA_SEED = 42
OUTCOME_NOISE_SD = 0.30
df = pd.read_csv("data/synthetic_llm_logs.csv")
rng = np.random.default_rng(DATA_SEED)
df["treated_workspace"] = (df["workspace_id"] < 25).astype(int)
df["treated_user"] = df["treated_workspace"]
df["spillover_exposed"] = (
(df["treated_workspace"] == 0) & (df["opt_in_agent_mode"] == 1)
).astype(int)
ws_baseline = pd.DataFrame({
"workspace_id": np.arange(50),
"ws_baseline": rng.normal(5.0, 0.30, size=50),
})
df = df.merge(ws_baseline, on="workspace_id")
noise = rng.normal(0, OUTCOME_NOISE_SD, size=len(df))
df["session_minutes_obs"] = (
df["ws_baseline"]
+ DIRECT_EFFECT * df["treated_user"]
+ SPILLOVER_EFFECT * df["spillover_exposed"]
+ noise
)
df["exposure"] = np.select(
[df["treated_user"] == 1, df["spillover_exposed"] == 1],
["direct", "spillover"],
default="pure_control",
)
print(f"Total users: {len(df):,}")
print(f"Treated workspaces: {df[df.treated_workspace == 1].workspace_id.nunique()}")
print(f"Control workspaces: {df[df.treated_workspace == 0].workspace_id.nunique()}")
print(f"Treated users: {df.treated_user.sum():,}")
print(f"Pure-control users: {(df.exposure == 'pure_control').sum():,}")
print(f"Spillover-exposed users: {(df.exposure == 'spillover').sum():,}")
ws_sizes = df.groupby("workspace_id").size()
print(f"Workspace size: min={ws_sizes.min()} median={int(ws_sizes.median())} max={ws_sizes.max()}")
متوقع پیداوار:
Total users: 50,000
Treated workspaces: 25
Control workspaces: 25
Treated users: 24,937
Pure-control users: 18,319
Spillover-exposed users: 6,744
Workspace size: min=923 median=1002 max=1052
موجودہ صورتحال کچھ یوں ہے: ورک اسپیس IDs 0-24 پروسیس شدہ کلسٹر بن جاتے ہیں اور 25-49 کنٹرول کلسٹر بن جاتے ہیں، جس سے 24,937 پروسیس شدہ صارفین اور 25,063 کنٹرول صارفین ہوتے ہیں۔ 6,744 کنٹرولز کو لیک کی نمائش کے لیے جھنڈا لگایا گیا تھا کیونکہ وہ کنٹرول ورک اسپیس پر بیٹھے تھے، ممکنہ طور پر ایجنٹ موڈ کو منتخب کر رہے تھے اور انٹر ٹیم چینلز کے ذریعے پروسیس شدہ ورک اسپیس آؤٹ پٹ کو پڑھ رہے تھے۔ باقی 18,319 خالص کنٹرول صارفین ہیں جو اس خصوصیت سے متاثر نہیں ہوتے ہیں۔ ورک اسپیس کا سائز 923 سے 1,052 صارفین تک ہوتا ہے، جو توازن حاصل کرنے کے لیے کافی قریب ہے، جس سے کلسٹر وزنی اور غیر وزنی تخمینہ لگانے والے اسی طرح کا برتاؤ کرتے ہیں۔ مشاہدہ شدہ نتائج session_minutes_obs معلوم زمینی سچائی کو پکڑیں۔ علاج کرنے والے صارفین ورک اسپیس بیس لائن میں 0.80 منٹ کا اضافہ کرتے ہیں، اسپل سے بے نقاب صارفین 0.20 منٹ کا اضافہ کرتے ہیں، اور تمام صارفین 0.30 منٹ کے معیاری انحراف کے ساتھ گاوسی شور سے متاثر ہوتے ہیں۔

شکل 2 (اوپر کی تصویر): 50,000 صارفین کے ڈیٹاسیٹ کے لیے تین نمائشی گروپ۔ اوپری پینل ہر گروپ کے لیے مشاہدہ شدہ نتائج کی تقسیم دکھاتا ہے، گروپ میں عمودی ڈیشڈ لائنوں کے ساتھ مطلب ہے (خالص کنٹرول 5.06 منٹ، اخراج کی نمائش 5.27 منٹ، علاج 5.79 منٹ)۔ سپل اوور ڈسٹری بیوشن خالص کنٹرول اور علاج شدہ تقسیم کے درمیان ہے، جو کہ وہ آلودگی ہے جسے صارف کے سطحی تخمینہ لگانے والے کنٹرول بیس لائن میں شامل کرتے ہیں۔ نیچے والا پینل انہی گروپوں کو خام شمار میں تبدیل کرتا ہے: 18,319 خالص کنٹرول صارفین، 6,744 بے نقاب کنٹرول صارفین، اور 24,937 علاج شدہ صارفین۔ جبکہ شکل 1 SUTVA کی خلاف ورزی کو سکیماتی طور پر دکھاتا ہے، یہ اعداد و شمار اسے ڈیٹا پیمانے پر دکھاتا ہے: تین گروپوں کا ڈھانچہ بالکل وہی ہے جو چار قدمی، دو-ایکسپوژر ماڈل کی شناخت کرے گا۔
مرحلہ 2: سادہ صارف کی سطح کا OLS (تعصب اور حد سے زیادہ اعتماد)
ایک سادہ تجزیہ کلسٹرنگ کو مکمل طور پر نظر انداز کرتا ہے اور ہر صارف کے علاج کی تفویض پر مشاہدہ شدہ نتائج کو واپس لے جاتا ہے، معیاری غلطیوں کی اطلاع دینا گویا تمام صارفین آزاد قرعہ اندازی کرتے ہیں۔ ایک ساتھ دو چیزیں غلط ہو جاتی ہیں۔
import statsmodels.formula.api as smf
naive = smf.ols("session_minutes_obs ~ treated_user", data=df).fit()
print(f"Naive estimate: {naive.params['treated_user']:+.4f} min")
print(f"Naive SE: {naive.bse['treated_user']:.4f} (under-reported)")
ci = naive.conf_int().loc["treated_user"].tolist()
print(f"Naive 95% CI: [{ci[0]:+.4f}, {ci[1]:+.4f}]")
print(f"Ground truth: +0.80")
print(f"Bias: {naive.params['treated_user'] - 0.80:+.4f} min")
متوقع پیداوار:
Naive estimate: +0.6723 min
Naive SE: 0.0034 (under-reported)
Naive 95% CI: [+0.6656, +0.6790]
Ground truth: +0.80
Bias: -0.1277 min
موجودہ صورتحال کچھ یوں ہے: پوائنٹ کا تخمینہ +0.6723 ہے، جو +0.80 کے اصل براہ راست اثر سے 16% کم ہے۔ تعصب کے دو اجزاء ہیں: پہلا، اسپل اوور آلودگی: پروسیس شدہ ورک اسپیس آؤٹ پٹ کو پڑھنے والے 6,744 کنٹرول صارفین کو خالص کنٹرول بیس لائن کے اوپر رکھا جاتا ہے، کنٹرول کا مطلب بڑھاتا ہے اور بولی پروسیسنگ-مائنس-کنٹرول کے فرق کو کم کرتا ہے۔ دوسرا، ورک اسپیس بیس لائن کا عدم توازن: صرف 50 کلسٹرز کے ساتھ، بے ترتیب تفویض اس بات کی ضمانت نہیں دیتا کہ علاج شدہ اور کنٹرول ورک اسپیس پول ایک ہی اوسط بیس لائن کھینچتے ہیں۔ اس ڈیٹاسیٹ میں کچھ بیج ایک ٹریٹمنٹ پول بیس لائن تیار کرتے ہیں جو کہ کنٹرول پول بیس لائن سے تھوڑا کم ہوتا ہے، تخمینوں میں اضافی نیچے کی طرف دباؤ ڈالتا ہے۔ اسباق کو اس طرح عام کیا جاتا ہے: چھوٹے K میں، تجربے سے پہلے قابل مشاہدہ ورک اسپیس کی خصوصیات کے خلاف توازن کی جانچ موجودہ بین بازو اختلافات کے خلاف واحد دفاع ہے جسے معیاری غلطی کی اصلاح سے حل نہیں کیا جا سکتا۔
معیاری غلطی اس سے بھی زیادہ حیران کن نمبر ہے۔ 0.0034 پر، یہ 50,000 صارفین میں فرق کی عکاسی کرتا ہے جسے آزاد مشاہدے کے طور پر سمجھا جاتا ہے اور نتیجے میں 95 فیصد اعتماد کا وقفہ ہوتا ہے۔ [+0.6656, +0.6790] یہ ڈیزائن زمینی حقیقت کو تقریباً 1/20 چوڑائی پر مکمل طور پر خارج کر دیتا ہے جس کی یہ حقیقت میں حمایت کرتا ہے۔ اگر SE 19 گنا بہت چھوٹا ہے تو، t-statistic کو اسی عنصر سے فلایا جائے گا، جس سے سادہ رجعت کی p-value ڈیزائن کے جواز سے کہیں زیادہ اہم دکھائی دے گی۔ اس رپورٹ کو پڑھنے والے اسٹیک ہولڈرز کو یقین ہو جائے گا کہ براہ راست اثر 0.67 منٹ کے قریب ہے۔ غلط نمبر، غلط درستگی۔
مرحلہ 3: کلسٹر ویٹڈ لیسٹ اسکوائرز (ایماندار معیاری غلطیاں)
معیاری غلطیوں کی تصحیح یہ ہے کہ 50 ورک اسپیس کی اوسط کو جمع کیا جائے اور پھر ریگریس کیا جائے جس کا مطلب ورک اسپیس کے سائز کے حساب سے ورک اسپیس لیول پروسیسنگ میٹرک پر ہوتا ہے۔ اب اندازہ K = 50 مشاہدات پر مبنی ہے۔
import statsmodels.api as sm
ws = (
df.groupby("workspace_id")
.agg(ws_mean=("session_minutes_obs", "mean"),
ws_size=("user_id", "count"),
treated=("treated_workspace", "max"))
.reset_index()
)
X_ws = sm.add_constant(ws["treated"])
wls = sm.WLS(ws["ws_mean"], X_ws, weights=ws["ws_size"]).fit()
wls_ci = wls.conf_int().loc["treated"].tolist()
print(f"WLS cluster-mean contrast: {wls.params['treated']:+.4f} min")
print(f"WLS SE: {wls.bse['treated']:.4f} (based on K=50 clusters)")
print(f"WLS 95% CI: [{wls_ci[0]:+.4f}, {wls_ci[1]:+.4f}]")
متوقع پیداوار:
WLS cluster-mean contrast: +0.6723 min
WLS SE: 0.0652 (based on K=50 clusters)
WLS 95% CI: [+0.5412, +0.8035]
موجودہ صورتحال کچھ یوں ہے: کلسٹر کا مطلب کنٹراسٹ +0.6723 کے سادہ اندازے کے برابر ہے۔ اس کی وجہ یہ ہے کہ وزنی ورک اسپیس اوسط اسی صارف کی سطح کے ڈیٹا کا ایک مختلف مجموعہ ہے۔ جو بدلا ہے وہ معیاری خرابی ہے۔ 0.0652 پر، یہ بولی 0.0034 سے تقریباً 19 گنا بڑا ہے اور 50 کلسٹر ذرائع سے زیادہ اصل تبدیلی کی عکاسی کرتا ہے (شماریاتی ماڈل WLS z=1.96 کی بجائے t(48) حد استعمال کرتا ہے، اس لیے CI کی حدیں z کے ساتھ دستی حسابات سے قدرے مختلف ہیں)۔ 95% اعتماد کا وقفہ درج ذیل ہے: [+0.5412, +0.8035]یہ بمشکل ہی اصل حقائق کا احاطہ کرتا ہے۔ WLS تخمینہ کے مسئلے کو درست کرتا ہے تاکہ معیاری غلطیاں اب حقیقی ڈیزائن کی عکاسی کرتی ہیں، لیکن شناخت کے مسئلے کو حل نہیں کرتی ہیں۔ چونکہ کنٹرول ورک اسپیس میں اب بھی ایسے صارفین موجود ہیں جو اسپل سے متاثر ہوئے ہیں، اس لیے یہ تخمینہ ایک آلودہ کنٹراسٹ ہے جسے صاف ATE سے تعبیر نہیں کیا جا سکتا۔ اگلا مرحلہ دونوں کو الگ کرتا ہے۔
مرحلہ 4: دو نمائشی سڑن (غیر جانبدارانہ براہ راست اور گرا ہوا)
دو نمائشی ماڈل ہر صارف کی نمائش کو تین زمروں کے متغیر (براہ راست، اسپلڈ، یا خالص کنٹرول) کے طور پر دیکھتا ہے اور دو غیر معیار کے زمروں (آرونو اور دیگر) کے نتائج کو پیچھے چھوڑتا ہے۔ خالص کنٹرول ایک چھوڑا ہوا حوالہ ہے، لہذا دونوں گتانکوں کی براہ راست تشریح کی جا سکتی ہے۔ ایک خصوصیت کا براہ راست اثر ہے اور دوسرا ورک اسپیس میں تعاون کرنے والے کنٹرول کرنے والے صارفین پر لہر کا اثر ہے۔
df["is_direct"] = (df["exposure"] == "direct").astype(int)
df["is_spillover"] = (df["exposure"] == "spillover").astype(int)
two_exp = smf.ols(
"session_minutes_obs ~ is_direct + is_spillover",
data=df,
).fit(cov_type="cluster", cov_kwds={"groups": df["workspace_id"]})
direct = two_exp.params["is_direct"]
spillover = two_exp.params["is_spillover"]
direct_ci = two_exp.conf_int().loc["is_direct"].tolist()
spillover_ci = two_exp.conf_int().loc["is_spillover"].tolist()
print(f"Direct effect: {direct:+.4f} min (ground truth = +0.80)")
print(f" SE: {two_exp.bse['is_direct']:.4f}")
print(f" 95% CI: [{direct_ci[0]:+.4f}, {direct_ci[1]:+.4f}]")
print(f"Spillover effect: {spillover:+.4f} min (ground truth = +0.20)")
print(f" SE: {two_exp.bse['is_spillover']:.4f}")
print(f" 95% CI: [{spillover_ci[0]:+.4f}, {spillover_ci[1]:+.4f}]")
spillover_share = (df["exposure"] == "spillover").mean()
projected = direct + spillover_share * spillover
print(f"Spillover share of all users: {spillover_share:.4f}")
print(f"Projected total under full rollout: {projected:+.4f} min")
متوقع پیداوار:
Direct effect: +0.7284 min (ground truth = +0.80)
SE: 0.0647
95% CI: [+0.6016, +0.8552]
Spillover effect: +0.2083 min (ground truth = +0.20)
SE: 0.0038
95% CI: [+0.2008, +0.2158]
Spillover share of all users: 0.1349
Projected total under full rollout: +0.7565 min
موجودہ صورتحال کچھ یوں ہے: کلسٹر-مضبوط معیاری خامیوں کے ساتھ نمائش کے تین زمروں میں فٹ بیٹھتا ہے۔ workspace_id یہ دو صاف گتانک پیدا کرتا ہے۔ براہ راست اثر +0.7284 ہے اور CI 95% ہے۔ [+0.6016, +0.8552]اس میں +0.80 کی زمینی سچائی شامل ہے۔ لہر کا اثر +0.2083 ہے اور CI 95% ہے۔ [+0.2008, +0.2158]یہ مضبوطی سے زمینی سچائی +0.20 کا احاطہ کرتا ہے۔ اسپل اوور SE (0.0038) کلسٹر-مضبوط اندازہ کے لیے چھوٹا دکھائی دیتا ہے کیونکہ نقلی اسپل اوور اثر 25 کنٹرول کلسٹرز میں یکساں ہے۔ متفاوت اخراج کی شدت کے ساتھ حقیقی اعداد و شمار میں، ہم دیکھتے ہیں کہ کلسٹرز میں مضبوط SEs معنی خیز طور پر بڑے ہو جاتے ہیں۔ تخمینہ شدہ کُل +0.7565 منٹ اس خلاف ورزی کے اثر کے لیے اکاؤنٹس کی بنیاد پر استعمال کنندگان کے فیصد کی بنیاد پر جو کسی مقررہ تعیناتی سائز (اس ڈیٹاسیٹ میں 0.1349) پر خلاف ورزی کے سامنے آنے کی توقع رکھتے ہیں۔ پروڈکشن کی تعیناتی میں، ہم اس حصے کو ان حصص سے بدل دیتے ہیں جن کی ہم پیش گوئی کرتے ہیں کہ ہمارے رول آؤٹ پلان کے مطابق ہمارے تعاون کے گراف میں لیک ہو جائیں گے۔ چونکہ پیشن گوئی رول آؤٹ کے لیے ایک ڈیزائن پیرامیٹر ہے، اس لیے نمبروں کی اطلاع دیتے وقت واضح طور پر فرض شدہ قبضے کو بیان کرنا نہ بھولیں۔
مرحلہ 5: کلسٹر-بوٹسٹریپ اعتماد کا وقفہ
کلسٹر بوٹسٹریپنگ پوری ورک اسپیس کو دوبارہ نمونہ بناتی ہے تاکہ جانچ کی جا سکے کہ آیا مرحلہ 4 سے تجزیہ اعتماد کے وقفے یہ مانے بغیر کہ مرکزی حد تھیوریم مکمل طور پر K = 50 پر لاگو ہوتا ہے۔ بوٹسٹریپ دراصل اس بات کو یقینی بناتا ہے کہ اس میں حقیقی ڈیٹا موجود ہے۔ چونکہ ایک ہی ورک اسپیس کے صارفین کلسٹر اسائنمنٹس اور ورک اسپیس لیول کے معیار کا اشتراک کرتے ہیں، اس لیے انفرادی صارفین کو دوبارہ نمونہ دینے سے فرق کم ہوگا۔ کلسٹر بوٹسٹریپنگ اس ارتباطی ڈھانچے کو محفوظ رکھتی ہے۔
def naive_point(d):
return smf.ols(
"session_minutes_obs ~ treated_user", data=d
).fit().params["treated_user"]
def wls_point(d):
w = (d.groupby("workspace_id").agg(
ws_mean=("session_minutes_obs", "mean"),
ws_size=("user_id", "count"),
treated=("treated_workspace", "max")).reset_index())
X = sm.add_constant(w["treated"])
return sm.WLS(w["ws_mean"], X, weights=w["ws_size"]).fit().params["treated"]
def two_exp_point(d):
fit = smf.ols(
"session_minutes_obs ~ is_direct + is_spillover", data=d
).fit(cov_type="cluster", cov_kwds={"groups": d["workspace_id"]})
return fit.params["is_direct"], fit.params["is_spillover"]
rng_boot = np.random.default_rng(7)
ws_ids = df["workspace_id"].unique()
k = len(ws_ids)
reps = {"naive": [], "cluster_wls": [], "direct": [], "spillover": []}
for _ in range(500):
draw = rng_boot.choice(ws_ids, size=k, replace=True)
sample = pd.concat(
[df[df["workspace_id"] == wid] for wid in draw],
ignore_index=True,
)
reps["naive"].append(naive_point(sample))
reps["cluster_wls"].append(wls_point(sample))
d_b, s_b = two_exp_point(sample)
reps["direct"].append(d_b)
reps["spillover"].append(s_b)
for key, truth in [("naive", 0.80), ("cluster_wls", 0.80),
("direct", 0.80), ("spillover", 0.20)]:
arr = np.array(reps[key])
lo, hi = np.percentile(arr, [2.5, 97.5])
covers = "covers" if lo <= truth <= hi else "misses"
print(f"{key:<13} 95% CI: [{lo:+.4f}, {hi:+.4f}] ({covers} {truth:+.2f})")
متوقع پیداوار:
naive 95% CI: [+0.5386, +0.7966] (misses +0.80)
cluster_wls 95% CI: [+0.5386, +0.7966] (misses +0.80)
direct 95% CI: [+0.5931, +0.8519] (covers +0.80)
spillover 95% CI: [+0.2008, +0.2164] (covers +0.20)
موجودہ صورتحال کچھ یوں ہے: متبادل کے ساتھ 50 ورک اسپیس ڈرا کر اور ہر تخمینہ کنندہ کو 500 بار ریفٹ کر کے، ہم تمام پوائنٹ کے تخمینے کے لیے بوٹسٹریپ ڈسٹری بیوشن حاصل کر سکتے ہیں۔ بولی OLS اور کلسٹرڈ WLS تخمینہ لگانے والے ایک جیسے بوٹسٹریپ وقفے تیار کرتے ہیں کیونکہ وہ ورک اسپیس لیول ری سیمپلنگ سے ایک ہی نقطہ کے تخمینے کا اشتراک کرتے ہیں اور زمینی سچائی +0.80 کو خارج کرتے ہیں کیونکہ دونوں وقفے مرحلہ 2 میں شناخت کیے گئے دو ذرائع کے ذریعہ متعصب ہیں (اسپل اوور آلودگی اور ورک اسپیس بیس لائن عدم توازن)۔ دو نمائشی ماڈل کے لیے براہ راست اثر کا وقفہ ہے: [0.5931, 0.8519]0.80 پر مشتمل ہے۔ اخراج کے وقفے یہ ہیں: [+0.2008, +0.2164]یہ مضبوطی سے +0.20 کا احاطہ کرتا ہے۔ کلسٹر بوٹسٹریپ اس بات کی تصدیق کرتا ہے کہ مرحلہ 4 میں تجزیاتی کلسٹر مضبوط معیاری غلطیاں پہلے ہی کیا دکھا چکی ہیں۔ یعنی، K = 50 پر تخمینہ کسی asymptotic تخمینے پر انحصار کیے بغیر رکھتا ہے۔ اسے آپ کے لیپ ٹاپ پر چلنے میں تقریباً ایک منٹ لگتا ہے۔
جب کلسٹر رینڈمائزیشن ناکام ہوجاتی ہے۔
کلسٹر رینڈمائزیشن SUTVA کے مسئلے کو حل کرتی ہے جب مفروضے برقرار رہتے ہیں، اور متعصب اندازے پیدا کرتے ہیں جو صاف ظاہر ہوتے ہیں جب وہ نہیں ہوتے ہیں۔ تین ناکامی کے طریقوں کو شناختی مفروضوں کے ساتھ نقشہ بنایا گیا ہے۔ جب کلسٹر کے سائز برابر نہیں ہوتے ہیں تو چوتھا اندازہ لگانے والے کی کارکردگی کو بتاتا ہے۔
بہت کم کلسٹرز (کلسٹرز کی کافی تعداد کی خلاف ورزی)۔ کلسٹر-مضبوط معیاری غلطیاں کلسٹرز میں مرکزی حد تھیوریم پر انحصار کرتی ہیں، اور اگرچہ پریکٹیشنرز اکثر K ≥ 30 کو ورکنگ فلور کے طور پر استعمال کرتے ہیں، لیکن مناسب حد کلسٹر سائز کی متفاوتیت اور ٹیسٹ کے اعدادوشمار کے انتخاب پر منحصر ہے (MacKinnon & Webb, 2017)۔ تعاون پر مبنی AI خصوصیت چار کسٹمر اکاؤنٹس کے لیے ان معیارات پر پورا نہیں اترتی۔ K = 4 کے ساتھ کلسٹر-مضبوط معیاری غلطیاں قدامت پسند نہیں ہیں، اور نتیجے میں اعتماد کے وقفے بہت تنگ ہیں۔ اگر K چھوٹا ہے، تو بے ترتیب اندازہ یا کلسٹر وائلڈ بوٹسٹریپنگ ایک درست p- ویلیو فراہم کرے گا۔
کلسٹر باؤنڈری میں مداخلت کا گراف (جزوی مداخلت کی خلاف ورزی) شامل نہیں ہے۔ کلسٹر رینڈمائزیشن فرض کرتی ہے کہ مداخلت کام کی جگہ میں مقامی ہے۔ اگر صارفین سلیک کنیکٹ چینلز، بیرونی طور پر مشترکہ دستاویزات، یا کسٹمر کمیونٹی فورمز کے ذریعے کام کی جگہوں پر گہرا تعاون کرتے ہیں، تو مقامی مداخلت فرضی ہے اور تمام کلسٹر کی حدود میں پھیل جاتی ہے۔ دو ایکسپوژر ماڈل درمیانے درجے کے انٹر کلسٹر رساو کو جذب کر سکتا ہے کیونکہ سپل کوفیشینٹ تمام رساو کو پکڑ لیتا ہے جس کی پیمائش ایکسپوزر فلیگ سے ہوتی ہے۔ اگر رساو ساختی ہے تو، ایک گراف کلسٹر بے ترتیب ڈیزائن کی ضرورت ہے، مشاہدہ شدہ تعاون کے گراف اور خود تعاون کے ڈھانچے سے کلسٹرز بنانا (یوگینڈر ایٹ ال۔)
متضاد کلسٹر سائز بائیسنگ ایگریگیشن (اندازہ لگانے والے کی کارکردگی) مساوی وزن والے کلسٹر کا مطلب یہ ہے کہ 50 یوزر ورک اسپیس کو 5000 یوزر ورک اسپیس جیسا ہی سمجھا جاتا ہے۔ جب ورک اسپیس میں اوسط تبدیلی زیر بحث صارفین کی تعداد پر منحصر ہوتی ہے تو یہ ایک کم موثر تجارت ہے۔ ترمیمات مخلوط اثرات کے ماڈل ہیں جن میں وزن والے کم سے کم مربع یا ورک اسپیس کے بے ترتیب وقفے کے ساتھ ورک اسپیس سائز پر منحصر ہے۔ یہ ایک کارکردگی کا مسئلہ ہے جس کا شناخت سے کوئی تعلق نہیں ہے، اور امتیاز اہم ہے۔ پوائنٹ کا تخمینہ وزن کے انتخاب میں یکساں رہتا ہے۔
پوسٹ ہاک کلسٹر کی تعمیر (تبدیلی کی خلاف ورزی)۔ نتائج کا مشاہدہ کرنے کے بعد کلسٹر اسائنمنٹس بنانا ایک درست ڈیزائن کو پی-ہیک میں تبدیل کرنے کا صاف ترین طریقہ ہے۔ مثالی طور پر، پہلے سے رجسٹرڈ تجزیے کے منصوبے میں بے ترتیب ہونے سے پہلے کلسٹرز کی تعریف کی جانی چاہیے اور اس کا پابند ہونا چاہیے۔ کلسٹر باؤنڈریز میں پوسٹ ہاک ایڈجسٹمنٹ (انتہائی نتائج کے ساتھ کام کی جگہوں کو حذف کرنا، چھوٹے کام کی جگہوں کو کمپلیکس میں ضم کرنا، ڈیٹا کے معائنے کے بعد رساو کی نمائش کی نئی تعریف کرنا) انتخابی تعصب کو دوبارہ متعارف کراتے ہیں جسے معیاری غلطی کی اصلاح سے دور نہیں کیا جا سکتا۔
حقیقی دنیا کی تعیناتیوں میں، دو اضافی خطرات پر توجہ کی ضرورت ہے:
جزوی خصوصیت اپنانے کی وجہ سے کلسٹر لیول SUTVA ناکام ہو جاتا ہے۔ کلسٹر سطح کے SUTVA مفروضے کے لیے ورک اسپیس پروسیسنگ کو ایک واحد، اچھی طرح سے طے شدہ پیکیج کی ضرورت ہوتی ہے۔ مسائل اس وقت پیدا ہوتے ہیں جب خصوصیات کو ایک ہی ورک اسپیس میں گود لینے کی مختلف شرحوں کے ساتھ جاری کیا جاتا ہے یا جب متعدد فیچر ورژن ایک ساتھ موجود ہوتے ہیں (بجلی کے صارفین کے لیے اعلیٰ، آرام دہ صارفین کے لیے بنیادی)۔ اس صورت میں، کلسٹر سطح کے "علاج" میں متعدد اثرات شامل ہوتے ہیں، لہذا تخمینوں کی مزید تشریح نہیں کی جا سکتی۔
جب رینڈمائزیشن مکینیکل نہیں ہوتی ہے، تو یہ کام کی جگہ کی سطح پر افراتفری کا باعث بنتی ہے۔ انٹرپرائز کی تعیناتیوں میں، ایڈریسڈ سیگمنٹس کے لیے ورک اسپیس کا انتخاب اکثر مکمل طور پر بے ترتیب نہیں ہوتا ہے۔ بیٹا پروگرام ٹیکنالوجی کے معروف صارفین کو اپنی طرف متوجہ کرتے ہیں۔ آپ کی گاہک کی کامیابی کی ٹیم اس بات پر اثر انداز ہوتی ہے کہ کس گاہک کو ابتدائی رسائی حاصل ہوتی ہے۔ اگر سکے کے پلٹنے سے پہلے تبدیلی کی خلاف ورزی کی جاتی ہے، کلسٹر-مضبوط معیاری غلطیاں علاج شدہ اور کنٹرول ورک اسپیس پول کے درمیان موجودہ منظم فرق کو درست نہیں کرسکتی ہیں۔ قابل مشاہدہ کام کی جگہ کی خصوصیات (سائز، صنعت، بیس لائن شرکت) پر بیلنس چیک اور کلسٹر کی سطح پر ریگریشن ٹیوننگ معیاری حل ہیں۔
یہ ناکامی کے طریقوں کو ریگریشن گتانک میں نہیں دکھایا گیا ہے۔ یہ بعد میں آف لائن تخمینوں اور پیداوار کی رہائی کے درمیان فرق میں ظاہر ہوتا ہے۔ کلسٹر شمار، تعاون پر مبنی گراف آڈٹ، اور تحریری پری رجسٹریشن ہی حقیقی دفاع ہیں۔
آگے کیا کرنا ہے۔
کلسٹر رینڈمائزیشن ایک مناسب ٹول ہے جب ورک اسپیس کے اندر تعاون سے ایسے اثرات پیدا ہوتے ہیں جو صارف کی سطح کے SUTVA کو خراب کرتے ہیں اور کلسٹر قدرتی اور قابل مشاہدہ ہوتے ہیں (ورک اسپیس، ٹیم، اکاؤنٹ، فزیکل اسٹور)۔ اگر دلچسپی کی مداخلت جغرافیائی منڈیوں تک پھیلی ہوئی ہے یا وقت کے ساتھ ساتھ دو طرفہ مارکیٹ کے اندر واقع ہوتی ہے جہاں ڈرائیور اور سوار عالمی سطح پر منظم ہوتے ہیں، تو ایک سوئچ بیک تجربہ جو کہ ٹائم سلاٹس کو بے ترتیب بناتا ہے زیادہ مناسب ہے۔ اگر علاج انفرادی سطح پر بیان کیا گیا ہے لیکن غیر مشاہدہ شدہ کراس یوزر کنفاؤنڈرز پر شبہ ہے، ڈیزائن پر مبنی ٹولز کا استعمال کرتے ہوئے آلہ متغیر تجزیہ شناخت کی ایک واضح حکمت عملی فراہم کرتا ہے۔ جب مداخلت معلوم اور پیچیدہ ہوتی ہے، تو Horvitz-Thompson وزنی نمائش کا تخمینہ استعمال کرتے ہوئے گراف کلسٹر رینڈمائزیشن تمام کلسٹر حدود کو تمام مداخلت کرنے والے راستوں پر مشتمل ہونے پر مجبور کیے بغیر اثر کا غیر جانبدارانہ تخمینہ فراہم کرتا ہے۔
اس ٹیوٹوریل کے لیے ساتھی نوٹ بک github.com/RudrenduPaul/product-experimentation-causal-inference-genai-llm/tree/main/05_cluster_randomization پر ہے۔ ریپوزٹری کو کلون کریں، ایک مصنوعی ڈیٹاسیٹ بنائیں، اور اسے چلائیں۔ cluster_randomization_demo.ipynb (یا cluster_randomization_demo.py) اس ٹیوٹوریل میں ہر کوڈ بلاک، ہر نمبر، اور ہر تصویر کو دوبارہ پیش کرتا ہے۔
جب اشتراکی AI صلاحیتیں اشتراک کرنے والی ٹیموں کو فراہم کی جاتی ہیں، تو صارف کی سطح کے A/B تخمینے تقریباً ہمیشہ غلط ہوتے ہیں۔ کلسٹر رینڈمائزیشن اور دو ایکسپوژر ماڈلز الگ الگ براہ راست اور اسپل اوور اثرات فراہم کرتے ہیں، اور کلسٹر بوٹسٹریپنگ ایک قابل دفاع خلا فراہم کرتی ہے جب اسٹیک ہولڈرز پوچھتے ہیں کہ کسی خصوصیت سے کتنی لفٹ آتی ہے اور ٹیم کے ساتھیوں کے ایک دوسرے سے بات کرنے سے کتنی لفٹ آتی ہے۔