A/B परीक्षणों से पहले का जीवन: अंतर्ज्ञान क्यों विफल होता है
\nक्या आपने कभी डिज़ाइनर से बहस की है कि कौन सा बटन बेहतर है - लाल या नीला? या मैनेजर से कि कौन सा शीर्षक अधिक क्लिक आकर्षित करेगा? पहले ऐसे विवाद ऊंची आवाज या पदानुक्रम में स्थान से तय होते थे। आज हमारे पास TypeScript में A/B परीक्षण है - एक वैज्ञानिक विधि जो अनुमानों को डेटा में बदल देती है।
\nकल्पना करें: आप एक ऑनलाइन स्टोर चलाते हैं। ऐसा लगता है कि उत्पाद कार्ड पर समीक्षाएँ जोड़ने से बिक्री बढ़ेगी। और यदि आप इमेज कैरोसेल हटाकर एक बड़ी फोटो रख दें? स्प्लिट-परीक्षण के बिना आप कभी सच्चाई नहीं जान पाएंगे। यहीं पर TypeScript मदद करता है - सख्त टाइपिंग और आधुनिक उपकरण A/B परीक्षणों को विश्वसनीय और सुविधाजनक बनाते हैं।
\n\nसरल शब्दों में A/B परीक्षण क्या है
\nA/B परीक्षण (जिसे स्प्लिट-परीक्षण भी कहा जाता है) एक प्रयोग है जिसमें उपयोगकर्ताओं के दो समूहों को एक ही तत्व के अलग-अलग संस्करण दिखाए जाते हैं। नियंत्रण समूह (A) वर्तमान संस्करण देखता है, प्रायोगिक समूह (B) संशोधित संस्करण देखता है। फिर हम मीट्रिक्स की तुलना करते हैं: रूपांतरण, साइट पर समय, क्लिक।
\nयह क्यों महत्वपूर्ण है? क्योंकि अनुभवी प्रोडक्ट मैनेजर भी 70% मामलों में गलती करते हैं। A/B परीक्षणों के साथ परिकल्पना परीक्षण अंतर्ज्ञान के बजाय डेटा के आधार पर निर्णय लेने की अनुमति देता है। TypeScript इसमें प्रकार सुरक्षा और विकास में सुविधा जोड़ता है।
\n\nTypeScript अनुप्रयोगों में A/B परीक्षण कैसे काम करता है
\nTypeScript अनुप्रयोगों में A/B परीक्षण आमतौर पर इसके माध्यम से कार्यान्वित किया जाता है:
\n- \n
- उपयोगकर्ताओं का वितरण - किसी विशिष्ट उपयोगकर्ता को कौन सा संस्करण दिखाना है \n
- ईवेंट ट्रैकिंग - उपयोगकर्ता क्रियाओं के बारे में डेटा एकत्र करना \n
- परिणामों का विश्लेषण - सांख्यिकीय महत्व की गणना \n
आइए प्रत्येक चरण को एक उदाहरण के साथ देखें। मान लीजिए, हम लॉगिन पेज पर एक नए शीर्षक का परीक्षण करना चाहते हैं। कोड में यह इस प्रकार दिखता है:
\n\n// प्रयोग के लिए प्रकार परिभाषित करें\ntype ExperimentVariant = 'control' | 'variant';\ntype ExperimentConfig = {\n id: string;\n variants: ExperimentVariant[];\n weights: number[]; // योग 100 होना चाहिए\n};\n\n// A/B परीक्षण का कॉन्फ़िगरेशन\nconst headlineExperiment: ExperimentConfig = {\n id: 'headline_test_2024',\n variants: ['control', 'variant'],\n weights: [50, 50] // 50% पुराना शीर्षक देखते हैं, 50% नया\n};\n\n// यादृच्छिक वितरण फ़ंक्शन\nfunction assignVariant(config: ExperimentConfig): ExperimentVariant {\n const random = Math.random() * 100;\n let cumulativeWeight = 0;\n \n for (let i = 0; i < config.variants.length; i++) {\n cumulativeWeight += config.weights[i];\n if (random < cumulativeWeight) {\n return config.variants[i];\n }\n }\n \n return config.variants[0]; // fallback\n}\n\n// उपयोग\nconst userVariant = assignVariant(headlineExperiment);\nconsole.log(`उपयोगकर्ता को संस्करण मिलेगा: ${userVariant}`);\n\n\nउपयोगकर्ता विभाजन: भ्रम से बचने के लिए
\nयह महत्वपूर्ण है कि एक ही उपयोगकर्ता हमेशा एक ही संस्करण देखे। अन्यथा डेटा दूषित हो जाएगा। इसके लिए हम उपयोगकर्ता पहचानकर्ता या कुकीज़ का उपयोग करते हैं:
\n\nfunction getStableVariant(\n userId: string, \n config: ExperimentConfig\n): ExperimentVariant {\n // नियतात्मक वितरण के लिए userId का हैश उपयोग करें\n const hash = simpleHash(userId + config.id);\n const normalizedHash = hash % 100;\n \n let cumulativeWeight = 0;\n for (let i = 0; i < config.variants.length; i++) {\n cumulativeWeight += config.weights[i];\n if (normalizedHash < cumulativeWeight) {\n return config.variants[i];\n }\n }\n \n return config.variants[0];\n}\n\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Conv