Theory
वह mean जिसने जवाब देने से इनकार किया
पिछले lesson की cleaning के बाद, roll 121 का impossible screen time NA बन गया। अब आप average माँगते हैं:
mean(survey$screen)
[1] NA
R जवाब देने से मना करता है। कोई error नहीं, कोई guess नहीं: एक सपाट "unknown"।
चिढ़ाने वाला? यह इस course का सबसे honest behaviour है: एक value unknown है, तो exact mean unknowable है, और R यही कहता है। आज: छेद कैसे ढूँढें, और उनके आसपास काम करने के तीन legitimate तरीक़े।
Theory
Attendance register में blank
एक register row दिखाता है: present, present, blank, present। blank का मतलब क्या है? "absent" नहीं: absent का अपना mark होता है। blank का मतलब है किसी ने इसे record ही नहीं किया: unknown।
NA वही blank है। यह 0 नहीं है (एक असली measured zero), "" नहीं है (एक empty text), NULL नहीं है (कोई box ही नहीं): यह एक box है जिसके contents किसी को नहीं पता। और एक blank पर OVER compute किया कोई भी total ख़ुद... blank है। R इस logic को गंभीरता से लेता है।
Theory
NA propagate करता है, और == इसे नहीं देख सकता
दो rules NA को govern करते हैं:
Propagation: NA छूती कोई भी arithmetic NA देती है: mean, sum, sd, यहाँ तक कि 5 + NA। Missingness results को infect करती है, ज़ोर से, design से।
Comparison blindness: x == NA NA return करता है, कभी TRUE नहीं: "क्या यह unknown उस unknown के बराबर है?" पूछने का कोई जवाब नहीं है। आपने यह बिल्कुल यही logic BCA303 में देखी: SQL का = NULL वैसे ही fail हुआ था, उसी कारण से।
Eकमात्र honest detector एक dedicated function है: is.na()।
Practical
पहले detect कीजिए, फिर एक strategy चुनिए
screen <- c(120, 90, NA, 240, 150, NA)
# DETECT
is.na(screen) # FALSE FALSE TRUE FALSE FALSE TRUE
sum(is.na(screen)) # [1] 2 how many holes
mean(is.na(screen)) # [1] 0.333 what fraction is missing
# the wrong way (comparison blindness):
screen == NA # NA NA NA NA NA NA never TRUE!
# STRATEGY 1: compute around the holes
mean(screen, na.rm = TRUE) # [1] 150 NAs removed for this calc
# STRATEGY 2: keep only complete rows (whole data frame)
survey_complete <- na.omit(survey)
# per-column hole count for a data frame:
colSums(is.na(survey))
# STRATEGY 3 (advanced, use with care): impute
# screen[is.na(screen)] <- median(screen, na.rm = TRUE)
Quiz
एक student survey$screen[is.na(survey$screen)] <- 0 से NA problem "fix" करता है और गर्व से नया mean report करता है। क्या ग़लत है?
- Zero एक CLAIM है (student बिल्कुल screen इस्तेमाल नहीं करता), absence नहीं: fake zeros mean को नीचे खींचते हैं और हर statistic को bias करते हैं
- कुछ नहीं: 0 और NA का मतलब एक ही है
- Syntax invalid है: NAs पर assign नहीं किया जा सकता
- यह सिर्फ़ तब fail होता है जब आधे से ज़्यादा values NA हों
Show the answer
Zero एक CLAIM है (student बिल्कुल screen इस्तेमाल नहीं करता), absence नहीं: fake zeros mean को नीचे खींचते हैं और हर statistic को bias करते हैं
NA कहता है "हमें नहीं पता"; 0 कहता है "हमें पता है, और यह zero है": एक को दूसरे से replace करना data manufacture करता है, और हर fake 0 mean को zero की तरफ़ खींचता है (हमारे छह values में दो fake zeros 150 की जगह 100 report करेंगे)। Mechanically-correct fixes हैं na.rm = TRUE या na.omit(); median से imputation defensible advanced option है: report में एक note के साथ। सवाल में syntax valid R है: crime statistical है, syntactic नहीं।
Think first
चार outputs अंदाज़ा लगाइए
x <- c(10, NA, 30) के साथ, tap करने से पहले हर एक अंदाज़ा लगाइए:
1. sum(x)
2. sum(x, na.rm = TRUE)
3. x == NA
4. sum(is.na(x))
Show the answer
1. NA: propagation: एक unknown पूरे total को unknown बना देता है।
2. 40: इस calculation के लिए hole एक तरफ़ रख दिया गया।
3. NA NA NA: NA के साथ comparisons कभी resolve नहीं होते: blindness rule।
4. 1: is.na() honest detector है, और इसके TRUEs जोड़ना holes गिनता है।
चार lines, चारों NA rules: exams topic को बिल्कुल इसी चौकड़ी से test करते हैं, और यही तरीक़ा है जिससे आपको किसी statistic पर भरोसा करने से पहले किसी भी dataset को self-check करना चाहिए।
Watch out
Strategy ईमानदारी से चुनना
na.rm = TRUE: quick statistics जब holes कम और random हों।
na.omit(): complete rows चाहती analyses: पर check कीजिए आप कितनी rows खोते हैं (nrow पहले बनाम बाद में): चुपचाप आधी survey drop करना अपना ही crime है।
Imputation: NA को mean/median से replace करना row रखता है पर value manufacture करता है: practice में acceptable, हमेशा disclosed।
कभी नहीं: NA → 0। और किसी भी statistic के साथ हमेशा hole count report कीजिए।
Theory
वह concept जिससे आप अब तीन बार मिले हैं
SQLite ने इसे NULL कहा (IS NULL, वह = NULL trap), pandas ने इसे NaN दिखाया, R इसे NA spell करता है: तीन languages, एक idea: unknown एक value नहीं है, और equality इसे नहीं देख सकती। यह cross-language recognition किसी भी अकेली syntax से ज़्यादा मायने रखता है: interviewers बिल्कुल यही probe करते हैं। अगला lesson: types convert और recode करना: वह factor trap भी जो categories को ग़लत numbers में बदल देता है।
Summary
Key takeaways
- NA = unknown: 0 (एक असली zero), "" (empty text) और NULL (कोई object नहीं) से अलग।
- NA propagate करता है: किसी भी NA पर mean/sum/sd NA return करते हैं: design से ज़ोर से।
- x == NA कभी काम नहीं करता (NA return करता है): is.na() से detect कीजिए; sum(is.na(x)) से गिनिए।
- na.rm = TRUE से holes के आसपास compute कीजिए; na.omit() से incomplete rows drop कीजिए (row loss check कीजिए)।
- Imputation (median/mean) data manufacture करता है: sparingly इस्तेमाल कीजिए, हमेशा disclose कीजिए; NA → 0 कभी नहीं।
- SQL NULL और pandas NaN जैसा ही concept।
- Memory hook: register में blank एक zero नहीं है।