পাঠ ৪৫ · ৫৭-এর মধ্যে · মডিউল ১০
Home / Courses / Software Testing & Quality Assurance / A/B টেস্টিং ও এক্সপেরিমেন্টেশন

A/B টেস্টিং ও এক্সপেরিমেন্টেশন একটি QA টেকনিক হিসেবে

A/B testing & experimentation as a QA technique
১০ মিনিট পড়া অ্যাডভান্সড Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • A/B টেস্টিং কী এবং এটি কীভাবে একটি QA/এক্সপেরিমেন্টেশন টেকনিক হিসেবে কাজ করে
  • "কাজ করে" ও "উন্নতি" — এই দুটো ভিন্ন প্রশ্নের মধ্যে পার্থক্য
  • দুটো গ্রুপের কনভার্সন ডেটা থেকে রেট, পার্থক্য ও রিলেটিভ লিফট সত্যিকারভাবে গণনা করা
  • কেন একটি পার্থক্য দেখা মানেই তা "পরিসংখ্যানগতভাবে তাৎপর্যপূর্ণ" নয়

১ · A/B টেস্টিং কী, এবং এটি কেন একটি QA টেকনিক

এই কোর্সের বাকি সব টেকনিক — ইউনিট টেস্টিং থেকে এক্সপ্লোরেটরি টেস্টিং পর্যন্ত — একটি সাধারণ ভিত্তির উপর দাঁড়িয়ে: একটি প্রত্যাশিত আচরণ আছে (স্পেসিফিকেশন, নিয়ম, বা টেস্টারের অভিজ্ঞতা-ভিত্তিক বিচার), এবং টেস্টিং যাচাই করে কোড সেই প্রত্যাশা পূরণ করছে কি না। কিন্তু একটি গুরুত্বপূর্ণ প্রশ্ন এই কাঠামোর বাইরে — কোড নিখুঁতভাবে স্পেসিফিকেশন অনুযায়ী কাজ করলেও, স্পেসিফিকেশনটি নিজেই কি সঠিক সিদ্ধান্ত ছিল? "নতুন চেকআউট বাটন ডিজাইন কনভার্সন বাড়াবে" — এটি কোড বাগমুক্ত হলেও সত্যি নাও হতে পারে।

A/B টেস্টিংA/B Testingসত্যিকারের ব্যবহারকারীদের দুটো দলে ভাগ করে একদলকে পুরনো সংস্করণ, অন্য দলকে নতুন সংস্করণ দেখিয়ে একটি মেট্রিকে ফলাফল তুলনা করে পরিবর্তনটি প্রকৃত উন্নতি কি না তা নিয়ন্ত্রিতভাবে যাচাই করা। এই প্রশ্নের উত্তর দেয় — সত্যিকারের ব্যবহারকারীদের এলোমেলোভাবে দুটো দলে ভাগ করে (একদল A/control, অন্য দল B/variant দেখে), তারপর প্রি-নির্ধারিত একটি মেট্রিকে (কনভার্সন রেট, ক্লিক-থ্রু রেট, গড় সময়, ইত্যাদি) দুই দলের প্রকৃত আচরণ পরিমাপ করে তুলনা করা হয়। এটিকে একটি QA টেকনিক হিসেবে ধরার কারণ — এটি "পরিবর্তনটি ভেঙে পড়েনি" এই প্রশ্নের চেয়ে গভীরে গিয়ে "পরিবর্তনটি সত্যিই ভালো কি না" যাচাই করে, ল্যাব পরিবেশের বদলে সত্যিকারের ব্যবহারকারীর আচরণের উপর ভিত্তি করে।

নিয়ন্ত্রিত (Controlled)
একই সময়ে, একই পরিস্থিতিতে, শুধু একটি জিনিস (variant) ভিন্ন — অন্য সব শর্ত (সময়কাল, ট্রাফিক সোর্স ইত্যাদি) স্থির রাখা হয়, যাতে পার্থক্যের কারণ নির্দিষ্ট করা যায়।
র‍্যান্ডম সেগমেন্টেশন
ব্যবহারকারীদের A/B-তে এলোমেলোভাবে (এবং যথেষ্ট বড় নমুনায়) ভাগ করা হয়, যাতে দুই দল মোটামুটি একই রকম (বয়স, ডিভাইস, আচরণ) হয় — তাহলে দলের পার্থক্যের কারণ শুধু variant-টিই থাকে, অন্য কিছু নয়।
একটি প্রি-ডিফাইন্ড মেট্রিক
এক্সপেরিমেন্ট শুরুর আগেই ঠিক করে রাখা হয় সাফল্য কী দিয়ে মাপা হবে (যেমন "চেকআউট সম্পন্ন করার হার") — পরে ফলাফল দেখে সুবিধাজনক একটি মেট্রিক বেছে নেওয়া (এটি একটি পরিচিত পরিসংখ্যানগত ভুল) এড়ানোর জন্য।

২ · বাস্তবায়ন: দুই গ্রুপের কনভার্সন রেট তুলনা

ধরা যাক একটি ই-কমার্স সাইটের চেকআউট বাটনের একটি নতুন ডিজাইন (B) পুরনো ডিজাইনের (A) বিরুদ্ধে টেস্ট করা হচ্ছে। প্রতিটি গ্রুপকে সমান সংখ্যক ব্যবহারকারী (৫০০০ জন করে) দেখানো হয়েছে, এবং কতজন আসলে চেকআউট সম্পন্ন করেছেন (conversions) তা রেকর্ড করা হয়েছে। নিচের কোড এই raw কাউন্ট থেকে কনভার্সন রেট, পরম পার্থক্য, এবং রিলেটিভ লিফট শতাংশ সত্যিকারভাবে গণনা করে।

Python
# synthetic এক্সপেরিমেন্ট ডেটা — বাস্তব প্রোডাকশন লগ থেকে সংগৃহীত হতে পারত
group_a_conversions, group_a_trials = 150, 5000   # A = পুরনো চেকআউট বাটন ডিজাইন (control)
group_b_conversions, group_b_trials = 180, 5000   # B = নতুন চেকআউট বাটন ডিজাইন (variant)

rate_a = group_a_conversions / group_a_trials
rate_b = group_b_conversions / group_b_trials

absolute_diff = rate_b - rate_a
relative_lift_pct = (rate_b - rate_a) / rate_a * 100

print(f"Group A (control): {group_a_conversions}/{group_a_trials} conversions -> rate = {rate_a:.2%}")
print(f"Group B (variant): {group_b_conversions}/{group_b_trials} conversions -> rate = {rate_b:.2%}")
print(f"Absolute difference (B - A): {absolute_diff:.2%}")
print(f"Relative lift: {relative_lift_pct:.2f}%")

    
এই সংখ্যাগুলো দিয়ে: Group A-এর কনভার্সন রেট ৩.০% (১৫০/৫০০০), Group B-এর ৩.৬% (১৮০/৫০০০) — পরম পার্থক্য ০.৬ শতাংশ পয়েন্ট, আর রিলেটিভ লিফট +২০% (কারণ ০.৬ পয়েন্ট বৃদ্ধি, মূল ৩.০%-এর সাপেক্ষে, ২০% আপেক্ষিক বৃদ্ধি)। লক্ষ্য করুন "পরম পার্থক্য" ও "রিলেটিভ লিফট" দুটোই একসাথে রিপোর্ট করা গুরুত্বপূর্ণ — শুধু "২০% বেশি!" বললে বিভ্রান্তিকর শোনাতে পারে যদি আসল পরম পরিবর্তন খুবই ছোট হয়।

৩ · একটি পার্থক্য দেখা যথেষ্ট নয় — significance-এর প্রশ্ন

উপরের গণনা সম্পূর্ণ সত্যি ও সঠিক — B গ্রুপে এই নির্দিষ্ট ৫০০০ জনের নমুনায় সত্যিই বেশি কনভার্সন হয়েছে। কিন্তু এই থেকে সরাসরি "নতুন ডিজাইন ভালো" সিদ্ধান্তে পৌঁছানো তাড়াহুড়া হবে। প্রশ্নটা হলো — এই ০.৬ শতাংশ পয়েন্ট পার্থক্য কি সত্যিই ডিজাইন পরিবর্তনের কারণে, নাকি এটি নিছক দৈবক্রমে (random chance) ঘটতে পারত, এমনকি দুটো ডিজাইন আসলে সমানভাবে কার্যকর হলেও?

এই প্রশ্নের সঠিক উত্তর একটি প্রকৃত পরিসংখ্যানগত তাৎপর্য পরীক্ষা (statistical significance test) দাবি করে — যেমন একটি two-proportion z-test বা chi-square test, যা নমুনার আকার ও পর্যবেক্ষিত পার্থক্য বিবেচনা করে একটি p-value গণনা করে (কত সম্ভাবনা আছে যে এই পার্থক্য নিছক দৈবক্রমে ঘটেছে)। এই পাঠের কোড ইচ্ছাকৃতভাবে সেই সম্পূর্ণ টেস্ট বাস্তবায়ন করেনি — এটি শুধু পর্যবেক্ষিত রেট ও পার্থক্য সততার সাথে গণনা করে দেখিয়েছে। বাস্তব-জগতে A/B টেস্টিং প্ল্যাটফর্ম (Optimizely, Google Optimize-এর উত্তরসূরি টুল, বা ইন-হাউস পরিসংখ্যান ইঞ্জিন) এই তাৎপর্য গণনা স্বয়ংক্রিয়ভাবে করে, এবং প্রায়ই একটি ন্যূনতম নমুনা সাইজ পৌঁছানোর আগে সিদ্ধান্ত না নেওয়ার পরামর্শ দেয়।

কেন এই সতর্কতা গুরুত্বপূর্ণ

ছোট নমুনায় (যেমন মাত্র কয়েকশ ব্যবহারকারী) দৈবক্রমেই একটি দল অন্যটির চেয়ে ভালো ফলাফল দেখাতে পারে, এমনকি দুটো সংস্করণ পুরোপুরি অভিন্ন হলেও। যত বড় নমুনা, তত কম সম্ভাবনা যে পর্যবেক্ষিত পার্থক্য নিছক দৈব। এই কারণে একটি দায়িত্বশীল A/B টেস্টিং প্রক্রিয়া রিলেটিভ লিফট শতাংশ প্রকাশের পাশাপাশি সবসময় নমুনার আকার এবং (আদর্শভাবে) একটি তাৎপর্য/কনফিডেন্স লেভেলও রিপোর্ট করে — শুধু "B জিতেছে" বলাটা যথেষ্ট নয়।

মূল কথা · Key takeaway

A/B টেস্টিং টেস্টিং-এর সংজ্ঞাকে "কোড স্পেসিফিকেশন মেনে চলছে কি না" থেকে "আমাদের সিদ্ধান্তটাই কি আসলে সঠিক" পর্যন্ত প্রসারিত করে — এবং এটি এই কোর্সের M10 মডিউলের একটি যথাযথ সমাপ্তি, কারণ এখানে "সঠিক" মানে আর একটি স্থির স্পেসিফিকেশনের সাথে মিল নয়, বরং সত্যিকারের ব্যবহারকারীর পরিমাপযোগ্য আচরণের সাথে মিল। পরবর্তী মডিউল (M11) এই সব টেকনিক কীভাবে একটি সুসংগঠিত টেস্ট প্ল্যান ও স্ট্র্যাটেজিতে একত্র করা হয় তা নিয়ে আলোচনা করবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ উপরের উদাহরণে যদি নমুনার আকার ৫০০০ জনের বদলে মাত্র ৫০ জন হতো (প্রতি গ্রুপে), তাহলে একই ২০% রিলেটিভ লিফট দেখানো কেন অনেক কম বিশ্বাসযোগ্য হতো?

ছোট নমুনায় দৈবক্রমিক ওঠানামার প্রভাব অনেক বেশি — মাত্র কয়েকজন ব্যবহারকারীর সিদ্ধান্ত (যারা হয়তো সম্পূর্ণ ভিন্ন কারণে কনভার্ট করেছেন বা করেননি) পুরো রেট উল্লেখযোগ্যভাবে বদলে দিতে পারে। ৫০০০ জনের নমুনায় একই আকারের এলোমেলো ওঠানামা রেটের উপর অনেক কম প্রভাব ফেলে, কারণ ব্যক্তিগত এলোমেলোতা গড়ে মিলিয়ে যায় (law of large numbers)। এই কারণেই একটি প্রকৃত তাৎপর্য পরীক্ষা নমুনার আকার সরাসরি বিবেচনায় নেয়।

প্র ০২ একটি টিম A/B টেস্ট শুরু করার সময় "কনভার্সন রেট" মেট্রিক ঠিক করেছিল, কিন্তু ফলাফল দেখার পর সেটি তেমন ভালো না হওয়ায় "গড় সেশন সময়" মেট্রিকে সুইচ করে ফেলল, যেখানে B ভালো ফলাফল দেখাচ্ছে। এতে কী সমস্যা?

এটি একটি পরিচিত পরিসংখ্যানগত সমস্যা — ফলাফল দেখার পর সুবিধাজনক মেট্রিক বেছে নেওয়া (কখনো "p-hacking" বা "metric shopping" নামে পরিচিত একটি সম্পর্কিত ধারণা)। যথেষ্ট মেট্রিক পরীক্ষা করলে দৈবক্রমেই কোনো না কোনোটিতে "উন্নতি" দেখা যাবে, এমনকি প্রকৃত কোনো প্রভাব না থাকলেও। এই কারণে সাফল্যের মেট্রিক এক্সপেরিমেন্ট শুরুর আগেই নির্দিষ্ট করে রাখা উচিত এবং তাতেই অটল থাকা উচিত।

প্র ০৩ A/B টেস্টিং কীভাবে এই কোর্সের M2-এর টেস্ট ডিজাইন টেকনিক (যেমন ইউজ-কেস টেস্টিং) থেকে মৌলিকভাবে ভিন্ন একটি প্রশ্নের উত্তর দেয়?

M2-এর টেকনিকগুলো (ইকুইভ্যালেন্স পার্টিশনিং, বাউন্ডারি ভ্যালু, ইউজ-কেস টেস্টিং) সবই একটি পূর্বনির্ধারিত স্পেসিফিকেশনের বিরুদ্ধে কোড সঠিক কি না যাচাই করে — "স্পেসিফিকেশন অনুযায়ী এই ইনপুটে এই আউটপুট হওয়ার কথা, তাই কি হচ্ছে?" A/B টেস্টিং ভিন্ন প্রশ্ন করে যেখানে কোনো "সঠিক" আউটপুট আগে থেকে জানা নেই — বরং দুটো ভিন্ন বৈধ ডিজাইনের মধ্যে কোনটি বাস্তব ব্যবহারকারীর আচরণে ভালো ফলাফল দেয় তা পরীক্ষামূলকভাবে আবিষ্কার করা হয়। একটি কোডের "সঠিকতা" যাচাই করে, অন্যটি একটি "সিদ্ধান্তের" গুণমান যাচাই করে।

অনুশীলন

  1. চিন্তা করুন: একটি A/B টেস্টে Group A-এর কনভার্সন রেট ৫% এবং Group B-এর কনভার্সন রেট ৫.৫% হলে, পরম পার্থক্য ও রিলেটিভ লিফট শতাংশ (আনুমানিকভাবে, মাথায় হিসেব করে) কত হবে?

    পরম পার্থক্য = ৫.৫% - ৫% = ০.৫ শতাংশ পয়েন্ট। রিলেটিভ লিফট = ০.৫ / ৫ × ১০০ = ১০% — অর্থাৎ B, A-এর তুলনায় আপেক্ষিকভাবে ১০% বেশি কনভার্সন দেখাচ্ছে, যদিও পরম পার্থক্য মাত্র অর্ধেক শতাংশ পয়েন্ট। এই দুটো সংখ্যা কতটা ভিন্ন "শোনাতে" পারে তা লক্ষ্য করুন — এটিই কেন উভয় সংখ্যা একসাথে রিপোর্ট করা গুরুত্বপূর্ণ তার একটি ভালো উদাহরণ।

  2. পরীক্ষা করুন: উপরের কোড সেলে group_b_conversions-কে 155-এ পরিবর্তন করে (অর্থাৎ B-এর সুবিধা অনেক কমিয়ে) Run চেপে দেখুন — নতুন রিলেটিভ লিফট শতাংশ কত আসে, এবং এত ছোট একটি পার্থক্যের ক্ষেত্রে কেন একটি প্রকৃত তাৎপর্য পরীক্ষা ছাড়া সিদ্ধান্ত নেওয়া আরও বেশি ঝুঁকিপূর্ণ হবে?

    group_b_conversions = 155 দিয়ে: rate_b = 155/5000 = ৩.১%, পরম পার্থক্য = ০.১ শতাংশ পয়েন্ট, রিলেটিভ লিফট ≈ ৩.৩৩%। এত ছোট একটি পার্থক্য সহজেই নমুনায় থাকা দৈবক্রমিক ওঠানামার মধ্যে পড়ে যেতে পারে — অর্থাৎ B আসলেই সামান্য ভালো, নাকি A ও B আসলে সমান কিন্তু এলোমেলো তারতম্যের কারণে B সামান্য এগিয়ে দেখাচ্ছে, তা এই সাধারণ গণনা থেকে বলা অসম্ভব — এখানেই একটি প্রকৃত তাৎপর্য পরীক্ষা (p-value/কনফিডেন্স ইন্টারভাল) ছাড়া সিদ্ধান্ত নেওয়া সবচেয়ে বেশি ঝুঁকিপূর্ণ হয়ে ওঠে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
এক্সপ্লোরেটরি টেস্টিং