Data Science Viva


https://claude.ai/share/bafe3f19-087b-4865-9784-a9d744e6f49b

🧠 প্রথমে ধারণা পরিষ্কার করি

ধরো তুমি একটা hospital dataset নিয়ে কাজ করছো (তোমার project-এর মতো):

nameagebmistroke
A2520No
B3530Yes
C4028No
D3235Yes

📦 PART 1: dplyr — Data নিয়ে খেলা করা

👉 সহজভাবে:
dplyr = data কে কাটাছেঁড়া করে যেটা দরকার সেটা বের করা


🔹 Step 1: Filter (ছেঁকে নেওয়া)

ধরো তুমি শুধু 30+ বয়সের মানুষ দেখতে চাও:

df %>% filter(age > 30)

👉 কী হলো?

nameagebmistroke
B3530Yes
C4028No
D3235Yes

👉 মানে তুমি পুরো dataset থেকে condition দিয়ে কিছু row বেছে নিলে


🔹 Step 2: Select (column বাছাই)

ধরো তুমি শুধু age আর stroke দেখতে চাও:

df %>% select(age, stroke)

👉 result:

agestroke
25No
35Yes
40No
32Yes

👉 মানে:
👉 column কমিয়ে ফেললে


🔹 Step 3: Group + Summarise (এটাই সবচেয়ে important)

এটা একটু ভালো করে বুঝো 👇

তুমি জানতে চাও:
👉 stroke হয়েছে যাদের, তাদের average age কত?

df %>%
  group_by(stroke) %>%
  summarise(avg_age = mean(age))

👉 ভিতরে কী হচ্ছে?

Step by step:

  1. group_by(stroke)
    👉 data দুই ভাগ:
  • No group
  • Yes group
  1. summarise(mean(age))
    👉 প্রতিটা group-এর average age বের করে

👉 result:

strokeavg_age
No32.5
Yes33.5

👉 মানে:
👉 group করে calculation করা


🔹 Step 4: Duplicate remove

df %>% distinct()

👉 same row থাকলে remove করবে


🔥 Real intuition (IMPORTANT)

👉 dplyr =
“আমি data থেকে যা চাই সেটা সহজভাবে বের করতে পারি”


📦 PART 2: caret — Model ready করার tools

👉 সহজভাবে:
caret = model train করার আগে data prepare করা


🔹 Step 1: Problem (Imbalance)

ধরো dataset:

stroke
No
No
No
No
Yes

👉 Problem:

  • 4টা No
  • 1টা Yes

👉 Model শিখবে:
👉 “সবাই No” → ভুল করবে


🔹 Step 2: upSample()

upSample(x = features, y = stroke)

👉 কী করে?

👉 ছোট class (Yes) বাড়িয়ে দেয়

👉 Result:

stroke
No
No
No
No
Yes
Yes
Yes
Yes

👉 এখন balanced


🔹 Step 3: Data Split

ধরো তোমার 100টা data আছে

createDataPartition(df$stroke, p = 0.7)

👉 কী হয়?

  • 70 → training
  • 30 → testing

🔥 Important intuition

👉 caret =
“data কে model-এর জন্য ready করা”


⚠️ সবচেয়ে বড় confusion clear

👉 তুমি মনে রাখো:

dplyr → “data নিয়ে কাজ”

  • filter
  • select
  • group
  • summarise

caret → “model-এর আগে কাজ”

  • imbalance fix
  • data split

🧩 তোমার project এ connect করি

👉 তুমি যা করছো:

dplyr দিয়ে:

  • filter (age range)
  • select (id remove)
  • group_by (stroke analysis)

caret দিয়ে:

  • upSample (balance)
  • createDataPartition (split)

End Package

হ্যাঁ—তোমরা data analysis (descriptive statistics + comparison) অংশে মূলত এই ৩টা numerical variable নিয়েই কাজ করেছো:

👉 age, bmi, avg_glucose_level

এখন আমি শুধু “কি করেছো” না—ভিতরের insight (মানে data আসলে কী বলছে) একদম clear করে বুঝাচ্ছি।


🧠 1. Descriptive Statistics (overall data বুঝা)

তোমরা করেছো:

  • Mean
  • Median
  • Standard Deviation (SD)
  • Min, Max

🔍 এগুলা কেন?

ধরো তুমি শুধু raw data দেখলে কিছু বুঝবা না।
এইগুলা summary বানায়।


🔹 Mean vs Median

👉 যদি mean ≈ median
→ data balanced (normal)

👉 যদি difference বেশি
→ skew আছে (outlier ছিল আগে)


🔹 SD (Standard Deviation)

👉 low SD → values কাছাকাছি
👉 high SD → values spread out


🔥 Insight (তোমার project অনুযায়ী)

👉 age, bmi, glucose সব normalize করার পরও:

  • distribution smooth হয়েছে
  • extreme values control হয়েছে
  • model-এর জন্য clean input তৈরি হয়েছে

⚖️ 2. Class-wise Comparison (MOST IMPORTANT PART)

group_by(stroke)

👉 তুমি দুইটা group বানিয়েছো:

  • No Stroke
  • Stroke

🔍 তারপর compare করেছো:

  • Mean Glucose
  • Mean Age
  • Mean BMI

🔥 Main Insight

👉
Stroke patients → higher avg_glucose_level


🧠 এর মানে কী?

👉 যারা stroke করেছে:

  • তাদের glucose level বেশি

👉 এটা suggest করে:
👉 Glucose = risk factor


⚠️ কিন্তু careful insight (important)

👉 এটা cause না
👉 শুধু association

👉 মানে:

  • glucose বেশি → stroke হতে পারে
  • but নিশ্চিত কারণ না

📊 3. Variability Analysis (deep analysis)

তোমরা compare করেছো:

  • Variance
  • SD
  • IQR
  • Range

🔍 কী দেখছো এখানে?

👉 শুধু average না
👉 data কতটা spread হচ্ছে


🔥 Insight (VERY IMPORTANT)

👉 Stroke group-এ:

  • glucose variability বেশি
  • BMI variability বেশি

🧠 এর মানে কী?

👉 Stroke patients:

  • uniform না
  • values অনেক spread

👉 অর্থ:

  • risk factors vary a lot
  • different ধরনের patient আছে

🎯 Full Insight Summary (deep understanding)

👉 তোমার analysis আসলে ৩টা জিনিস বলছে:


🧩 (1) Clean data → reliable result

  • missing handle
  • outlier handle
  • normalization

🧩 (2) Glucose important factor

  • stroke group → higher mean glucose
    👉 potential risk indicator

🧩 (3) Stroke group more unstable

  • higher SD, IQR
    👉 variability বেশি
    👉 patient diversity বেশি

⚠️ Sir trap question (IMPORTANT)

❓ “Why only these 3 variables?”

👉 কারণ:

  • numerical variables
  • statistical analysis possible

❓ “Why not categorical?”

👉 categorical → frequency analysis লাগে
mean করা যায় না


🔥 Final deep understanding

👉 তুমি আসলে যা করছো:

  • Data clean করেছো
  • Group compare করেছো
  • Pattern identify করেছো

👉 এবং main finding:

“Higher glucose level and greater variability are associated with stroke patients.”


এই অংশটা তোমার descriptive statistics table তৈরি করার core code 👍
আমি একদম ভেঙে, step-by-step বুঝাচ্ছি—কি হচ্ছে ভিতরে।


🧠 1. কোন variable নিয়ে কাজ করছো?

num_vars <- c("age", "bmi", "avg_glucose_level")

👉 তুমি বলছো:
👉 “আমি এই ৩টা numerical column নিয়ে analysis করবো”


📊 2. মূল কাজটা কোথায় হচ্ছে?

balanced_data[, num_vars]

👉 এর মানে:

👉 dataset থেকে শুধু এই ৩টা column নেওয়া:

| age | bmi | avg_glucose_level |


🔁 3. sapply() কী করছে? (VERY IMPORTANT)

sapply(balanced_data[, num_vars], mean)

👉 এটা একদম key concept 👇

👉 sapply() মানে:

👉 প্রতিটা column-এর উপর একই function apply করা


🔍 Example

ধরো:

agebmi
2025
3030

👉 sapply(..., mean) করলে:

age → mean(age)
bmi → mean(bmi)

👉 result:

age = 25
bmi = 27.5

📊 4. এখন একে একে সব part বুঝি


🔹 Mean

sapply(..., mean, na.rm = TRUE)

👉 প্রতিটা column-এর average


🔹 Median

sapply(..., median)

👉 middle value


🔹 SD

sapply(..., sd)

👉 spread (variation)


🔹 Min / Max

👉 smallest / largest value


🔹 round(..., 4)

👉 4 decimal পর্যন্ত রাখছে


🧱 5. data.frame() কী করছে?

data.frame(
  Variable = num_vars,
  Mean = ...,
  Median = ...,
  ...
)

👉 সব result একসাথে table বানাচ্ছে


🔍 Final output structure

VariableMeanMedianSDMinMax
age
bmi
glucose

🧠 6. print(desc_stats)

👉 এই table console-এ দেখায়


🔥 Deep understanding (IMPORTANT)

👉 তুমি এখানে আসলে করছো:

👉
“প্রতিটা numerical feature-এর summary statistics একসাথে বের করা”


🎯 কেন এটা important?

👉 এটা দিয়ে বুঝা যায়:

  • data center কোথায় (mean/median)
  • data কত ছড়ানো (SD)
  • range কী

💬 Real-life analogy

ধরো exam marks:

👉 তুমি বের করছো:

  • average mark
  • highest mark
  • lowest mark

👉 একই কাজ এখানে


⚠️ Viva trap question

❓ “Why use sapply instead of writing separately?”

👉 Answer idea:

  • code short হয়
  • scalable (many columns handle করা যায়)

🔥 এক লাইনের clean understanding

বুঝেছি 👍 — তুমি চাও তুমি যেগুলো code নিয়ে আলাদা আলাদা জিজ্ঞেস করেছো, সেগুলা cleanভাবে একসাথে সাজানো explanation
আমি নিচে একদম revision sheet style করে দিচ্ছি 👇


🔥 1. na.rm = TRUE

👉 মানে:
NA (missing value) বাদ দিয়ে calculation করা

Example:

mean(c(10, 20, NA), na.rm=TRUE) = 15

👉 না দিলে → result = NA ❌


🔥 2. c() vs c[]

👉 correct:

c("age","bmi")

👉 ভুল:

c["age","bmi"] ❌

👉 c() = vector বানায়


🔥 3. summary()

👉 automatically দেয়:

  • Min
  • Q1
  • Median
  • Mean
  • Q3
  • Max

👉 numeric হলে stats
👉 categorical হলে count


🔥 4. Normalization code

(x - min) / (max - min)

👉 সব value → 0 থেকে 1


⚠️ তোমার confusion

👉 “Before normalization = 0–1”

👉 কারণ:
👉 already normalize হয়ে গেছে


🔥 5. min_max_normalize() function

👉 কাজ:

  • min বের করে
  • max বের করে
  • scale করে

🔥 6. temp_data$stroke

👉 মানে:

👉 temp_data dataframe-এর stroke column

👉 vector আকারে


🔥 7. table()

table(train_data$stroke)

👉 count করে:

  • No কয়টা
  • Yes কয়টা

👉 use:
✔ class distribution check


🔥 8. Data splitting logic

train_index <- createDataPartition(..., p=0.7)

👉 70% train

temp_data <- remaining 30%

👉 তারপর:

  • 15% test
  • 15% validation

-train_index

👉 selected rows বাদ দিয়ে বাকি নেয়


🔥 9. set.seed(42)

👉 same random result

👉 reproducibility


🔥 10. upSample()

👉 minority class বাড়ায়

👉 কীভাবে?

✔ existing row copy করে
❌ new value বানায় না


⚠️ তোমার প্রশ্ন

👉 “সব duplicate হয় না?”

✔ হ্যাঁ হয়
👉 কিন্তু:

  • model balanced শেখে

🔥 11. sapply()

sapply(data, mean)

👉 প্রতিটা column-এ function apply


✔ তোমার case

👉 age, bmi, glucose → mean, median, sd


🔥 12. group_by() + summarise()

group_by(stroke)

👉 data 2 ভাগ:

  • Stroke
  • No Stroke

summarise(mean(...))

👉 প্রতিটা group-এর average


✔ insight

👉 Stroke group → glucose বেশি


🔥 13. Variability (var, sd, IQR, range)

👉 built-in function ✔


✔ মানে:

👉 data কতটা ছড়ানো


Example:

  • 20,21,22 → low variability
  • 10,50,90 → high variability

🔥 14. Indexing

df$age[df$age < 0] <- NA

👉 condition true হলে value replace


🔥 15. Pipe %>%

df %>% filter()

👉 left → right flow
👉 readable code


🔥 16. $ vs [ ]

df$age        → vector
df["age"]     → dataframe

🎯 FINAL QUICK RECALL

👉 মনে রাখো:


🧩 Data handling

  • NA → na.rm
  • vector → c()
  • summary → auto stats

🧩 ML prep

  • normalize → 0–1
  • upSample → copy rows
  • split → 70/15/15

🧩 Analysis

  • sapply → column-wise
  • group_by → group compare
  • table → count
  • variability → spread

💬 শেষ কথা

👉 এখন তুমি:

✔ code বুঝো
✔ logic বুঝো
✔ trap avoid করতে পারবা

👉 মানে তুমি strong viva ready 🔥


চাও তো আমি এখন
👉 “sir যেভাবে প্রশ্ন করবে exactly সেইভাবে rapid-fire viva practice”
করাতে পারি 😏

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top