ailiteracynepal 🇳🇵
पाठ आकार

अध्याय ३ · खण्ड I · 28 मिनेट

छुटेका मान, डुप्लिकेट, र खराब पङ्क्ति

तीन झन्डै-विश्वव्यापी डाटा गुणस्तर समस्या। प्रत्येकको पत्ता लगाउन pandas ढाँचा र कसरी सम्हाल्ने भन्ने विचारशील निर्णय छ। यिनलाई राम्ररी सफा गर्नु हरेक पछिल्लो विश्लेषणको प्रवेश शुल्क हो।

झन्डै हरेक वास्तविक डाटासेटमा छुटेका मान, डुप्लिकेट, र अस्तित्वमा हुनुनपर्ने थोरै पङ्क्ति हुन्छन्। यी विरला समस्या होइनन्। यी डाटा कामको पृष्ठभूमि शोर हुन्। सीप तिनलाई छिटो चिन्ने, के गर्ने निर्णय गर्ने, र चुपचाप अव्यवस्थालाई मोडेलमा तल नपठाउने हो। यो खण्ड कुनै पनि डाटासेटमा पहिलो सफा गर्ने प्रहार हो।

सानो अव्यवस्थित डाटासेट सेट गर्ने

यो खण्डका लागि हामी Course 01 को कारोबार डाटासेटको जानीजानी अव्यवस्थित संस्करणमा काम गर्नेछौं। data/messy_transactions.csv मा यो राख्नुहोस्:

vendor,amount,date
Khalti,5000,2026-06-25
eSewa,1200,2026-06-25
Khalti,,2026-06-26
Khalti,5000,2026-06-25
FonePay,900,2026-06-26
,3500,2026-06-26
Khalti,-200,2026-06-27

सात पङ्क्तिमा तीनै समस्या छन्: छुटेको रकम, सटीक डुप्लिकेट, छुटेको विक्रेता, र नकारात्मक रकम (सम्भवतः फिर्ता वा डाटा त्रुटि — हामी निर्णय गर्नेछौं)।

लोड गर्नुहोस्:

import pandas as pd
df = pd.read_csv("data/messy_transactions.csv")
print(df)

छुटेका मान पत्ता लगाउने

कुनै पनि नयाँ डाटासेटमा पहिलो चाल के छुटेको सोध्ने हो:

df.isna().sum()

आउटपुट:

vendor    1
amount    1
date      0
dtype: int64

एक छुटेको विक्रेता, एक छुटेको रकम। यो जानकारी हो; स्किप नगर्नुहोस्। 80% छुटेको स्तम्भ र 0.5% छुटेको स्तम्भ फरक समस्या हुन्। प्रतिशतले स्तम्भ मेटाउने, मान भर्ने, वा प्रभावित पङ्क्ति हटाउने भन्छ।

बढी दृश्य हेराइ:

df[df.isna().any(axis=1)]

यसले कुन पङ्क्तिमा कुनै पनि छुटेको मान छ देखाउँछ — त्यसैले तपाईं तिनलाई हेर्न र किन छुटेका छन् परिकल्पना बनाउन सक्नुहुन्छ।

छुटेका मानका लागि तीन इमानदार विकल्प

के छुटेको थाहा पाएपछि, तीन वैध चाल छन्:

1. पङ्क्ति हटाउनुहोस्। सरल, क्रूर, र छुटेको दुर्लभ र सम्भवतः अनियमित हुँदा सही उत्तर:

df_clean = df.dropna()

मूल्य: तपाईंले ती पङ्क्ति गुमाउनुहुन्छ। 80% पङ्क्तिमा छुटेको मान छ भने, 80% डाटा गुमाउनुहुन्छ।

2. स्तम्भ हटाउनुहोस्। जब एक स्तम्भ अधिकांश खाली छ र तपाईं बिनै काम चलाउन सक्नुहुन्छ:

df_clean = df.drop(columns=["unreliable_column"])

3. मान भर्नुहोस् (imputation)। छुटेका मानलाई उचित केहीले बदल्नुहोस्। सही छनोट स्तम्भमा निर्भर हुन्छ:

df["amount"] = df["amount"].fillna(0)            # शून्य — सावधान, चेतावनी हेर्नुहोस्
df["vendor"] = df["vendor"].fillna("Unknown")    # स्पष्ट अज्ञात लेबल
df["amount"] = df["amount"].fillna(df["amount"].median())  # मध्यिका — आउटलायरप्रति सहनशील

निर्णय प्राविधिक होइन; न्यायगत हो। तपाईंले के छान्नुभयो र किन कागजात गर्नुहोस्, आदर्श रूपमा निर्णय गरेको लाइनमा टिप्पणीमा। भविष्यको तपाईंलाई सम्झिनुपर्छ।

डुप्लिकेट पत्ता लगाउने

डुप्लिकेट त्यो पङ्क्ति हो जसको मान अर्को पङ्क्तिसँग समान (वा झन्डै-समान) हुन्छ। तिनी नराम्रो मर्ज, डाटा क्याप्चरका बेला दोहोरो प्रविष्टि, र उही रेकर्ड दुई पटक समावेश गर्ने निर्यातकर्ताबाट छिर्छन्।

df.duplicated().sum()           # कति डुप्लिकेट
df[df.duplicated(keep=False)]   # एकअर्काको डुप्लिकेट भएका सबै पङ्क्ति देखाउनुहोस्

keep=False महत्त्वपूर्ण छ: पूर्वनिर्धारित रूपमा .duplicated() ले केवल दोस्रो र पछिका घटनालाई डुप्लिकेट मार्क गर्छ; keep=False सँग यसले तपाईंलाई मिल्ने सबै पङ्क्ति छेउछाउ देखाउँछ ताकि तपाईंले के डुप्लिकेट भएको देख्न सक्नुहुन्छ।

डुप्लिकेट हटाउन:

df = df.drop_duplicates()

त्यसले हरेक अद्वितीय पङ्क्तिको पहिलो घटना राख्छ र बाँकी हटाउँछ। यदि अन्तिम राख्न चाहनुहुन्छ (कहिलेकाहीं हालसालैको बढी सटीक हुन्छ):

df = df.drop_duplicates(keep="last")

झन्डै-डुप्लिकेट — गाह्रो केस

प्रायः कठिन समस्या झन्डै-डुप्लिकेट हुन्: उहीनै हुनुपर्ने तर सानो तरिकाले फरक भएका पङ्क्ति। एउटै कारोबारका दुई पङ्क्ति जहाँ एउटाले विक्रेता नाम "Khalti" र अर्कोले "khalti " (साना अक्षर, पुच्छरमा खाली) देखाउँछ। दुवै एउटै कारोबार हुन्; कुनै पनि df.duplicated() मा मेल खाँदैन।

तपाईं यिनलाई चरणमा पक्रनुहुन्छ — र अधिकांश काम यो अध्यायको खण्ड 3 (नाम मानकीकरण) मा गर्नेछौं। अहिले, ढाँचा: डुप्लिकेट जाँच्नुअघि झन्डै-डुप्लिकेट हुनसक्ने स्तम्भ सामान्यीकरण गर्नुहोस्।

df["vendor"] = df["vendor"].str.strip().str.lower()
df = df.drop_duplicates(subset=["vendor", "amount", "date"])

subset= आर्गुमेन्टले डुप्लिकेसन निर्णय गर्दा pandas लाई केही स्तम्भ मात्र विचार गर्न भन्छ — एक स्तम्भले वैध रूपमा फरक हुन सक्छ तर बाँकीले मेल खानुपर्छ भन्ने बेलामा उपयोगी।

“खराब पङ्क्ति” — र के गन्ने

“खराब पङ्क्ति” त्यो हो जसले वैध डाटा कस्तो देखिनुपर्छ भन्ने तपाईंको धारणा भङ्ग गर्छ। हाम्रो उदाहरणमा, -200 को रकम शङ्कास्पद छ। यो हुनसक्छ:

  • फिर्ता (वैध)।
  • डाटा-प्रविष्टि त्रुटि (कसैले प्लस होइन माइनस टाइप गर्‍यो)।
  • फरक कारोबार ढाँचाको डेबिट पङ्क्ति जुन यो फाइलमा बिल्कुलै हुनुहुँदैनथ्यो।

सन्दर्भबिना तपाईं कुन हो जान्न सक्नुहुन्न। सम्हाल्ने तरिका कस्तो किसिमको खराब हो भन्नेमा निर्भर हुन्छ।

उपयोगी ढाँचा: दायरा जाँच।

print(df["amount"].describe())

.describe() सारांशले तपाईंलाई न्यूनतम, अधिकतम, औसत, र चतुर्थांश देखाउँछ। यदि न्यूनतम -200 छ र तपाईंले केवल सकारात्मक कारोबारको अपेक्षा गर्नुभएको थियो भने, तपाईंसँग छानबिन गर्ने केही छ। यदि अधिकतम 999999999 छ, उहीनै — छानबिन गर्नुहोस्।

शङ्कास्पद पङ्क्ति फ्ल्याग गर्न:

suspicious = df[df["amount"] < 0]
print(suspicious)

अनि निर्णय गर्नुहोस्: तिनलाई राख्ने (फ्ल्याग स्तम्भसहित), हटाउने, वा सुधार्ने।

df["is_suspicious"] = df["amount"] < 0
# वा
df_clean = df[df["amount"] >= 0]

पूर्ण सफा गर्ने प्रहार

सबै सँगै राख्ने। हाम्रो सानो डाटासेटका लागि पहिलो-प्रहार सफाकर्ता:

import pandas as pd

df = pd.read_csv("data/messy_transactions.csv")

# 1. पाठ स्तम्भ सामान्यीकरण गर्नुहोस्
df["vendor"] = df["vendor"].astype(str).str.strip()

# 2. छुटेका मान सम्हाल्नुहोस्
df["vendor"] = df["vendor"].replace("", pd.NA).fillna("Unknown")
df["amount"] = df["amount"].fillna(df["amount"].median())

# 3. सटीक डुप्लिकेट हटाउनुहोस्
df = df.drop_duplicates()

# 4. शङ्कास्पद पङ्क्ति फ्ल्याग गर्नुहोस् तर स्वतः मेटाउनुहुन्न
df["is_suspicious"] = df["amount"] < 0

# 5. बचाउनुहोस्
df.to_csv("data/clean/transactions.csv", index=False)
print(df)

पाँच साना चरण, मोटामोटी सही क्रममा। तपाईंले कहिल्यै लेख्ने अधिकांश सफा गर्ने कोड यसको कुनै विस्तार जस्तो देखिनेछ। क्रम महत्त्वपूर्ण छ — डुप्लिकेट जाँच्नुअघि पाठ सामान्यीकरण गर्नाले अन्यथा बाँच्ने झन्डै-डुप्लिकेट पक्रन्छ।

आफ्नो बुझाइ जाँच्नुहोस्

Quick check

ऋण-रकम स्तम्भमा 0.5% छुटेका मान छन्। रकम अन्यथा रु 5,000 देखि रु 500,000 सम्म छ केही चरम आउटलायरसहित (एउटा रु 10,000,000 को प्रविष्टि जुन स्पष्ट रूपमा वास्तविक छ)। 0.5% छुटेकाका लागि सबैभन्दा सुरक्षित पूर्वनिर्धारित imputation रणनीति कुन हो?

Quick check

तपाईंलाई शङ्का छ कि तपाईंको कारोबार डाटासेटमा झन्डै-डुप्लिकेट छन् किनभने 'Khalti', 'khalti ', र ' Khalti' जस्ता विक्रेता नामले उही कारोबारलाई सङ्केत गर्न सक्छन्। कार्यको सही क्रम के हो?

अब के आउँछ

छुटेका मान, डुप्लिकेट, र खराब पङ्क्ति विश्वव्यापी तीन हुन्। अर्को खण्डले सबैलाई समात्ने नेपाल-विशिष्ट समस्या टाँक्छ: एन्कोडिङ?????? देखाउने CSV जहाँ देवनागरी हुनुपर्थ्यो, विक्रम सम्बत् र AD अल्मलिने मिति, र एक मन्त्रालय निर्यातमा उही मिति आधा दर्जन तरिकाले ढाँचाबद्ध हुने। तपाईंले भर्खर गरेजस्तै धैर्यवान्, ढाँचा-आधारित कामले सबै सुधार्छौं।