ailiteracynepal 🇳🇵
पाठ आकार

अध्याय ४ · खण्ड III · 26 मिनेट

मोडेलिङअघि सम्बन्ध देख्ने

अधिकांश मोडेलले स्तम्भहरूबीचको सम्बन्ध खोजिरहेका हुन्छन्। मोडेलिङअघि स्क्याटर प्लट र सहसम्बन्ध हेर्दा कुन सम्बन्ध वास्तविक छन्, कुन शोर हुन्, र कुन धोकेबाज छन् बताउँछ।

“ऋणी विशेषताबाट ऋण डिफल्ट पूर्वानुमान गर्ने” मोडेल यान्त्रिक रूपमा स्तम्भहरूबीचको सम्बन्ध खोज्दैछ। यदि तिर्ने दिनले डिफल्टसँग सहसम्बन्ध राख्छ भने, मोडेलले त्यो भेट्छ। यदि जिल्लाले डिफल्टसँग सहसम्बन्ध राख्छ भने, मोडेलले त्यो भेट्छ। तर मोडेलले भेट्ने हरेक ढाँचा वास्तविक छैन — केही सहयोग हुन्, केही तेस्रो चरले गराएका हुन्, र केही डाटा सङ्कलनका कलाकृति हुन्। तिनलाई छुट्ट्याउने तरिका हेरेर सुरु हुन्छ। यो खण्ड तपाईंको भविष्यको मोडेलले के भेट्नेछ थाहा पाउन पर्याप्त स्पष्ट रूपमा सम्बन्ध देख्ने बारे हो।

दुई सङ्ख्यात्मक स्तम्भ: स्क्याटर प्लट

सबैभन्दा सरल सम्बन्ध दृश्य स्क्याटर प्लट हो — एक स्तम्भ x-अक्षमा, अर्को y-अक्षमा, प्रति पङ्क्ति एक डट।

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("data/clean/loans.csv")

df.plot.scatter(x="amount", y="repayment_days", alpha=0.3)
plt.xlabel("Loan amount (NPR)")
plt.ylabel("Repayment period (days)")
plt.title("Amount vs repayment period")
plt.show()

alpha=0.3 ले ओभरल्याप गर्ने बिन्दुलाई आंशिक रूपमा पारदर्शी बनाउँछ — कुनै पनि घनो स्क्याटर प्लटका लागि आवश्यक। बिनै, एक ठाउँमा हजार डट र एक ठाउँमा एक डट उस्तै देखिन्छन्।

नतिजामा खोज्ने कुरा:

दायाँ माथिको तिर्छो रेखा → बलियो सकारात्मक सम्बन्ध। ठूला ऋणले लामो तिर्ने अवधि पाउँछन्। सम्भवतः वास्तविक, सम्भवतः तपाईंले अपेक्षा गरेको।

दायाँ तलको तिर्छो रेखा → नकारात्मक सम्बन्ध। एउटा बढ्दा अर्को घट्छ। कहिलेकाहीं वास्तविक, कहिलेकाहीं एक चर अर्कोको प्रतिनिधि हो भन्ने सङ्केत।

स्पष्ट ढाँचाबिनाको बादल → थोरै वा कुनै सम्बन्ध छैन। दुई स्तम्भ स्वतन्त्र रूपमा फरक हुन्छन्। कहिलेकाहीं सूचनात्मक (तपाईंले सम्बन्ध अपेक्षा गर्नुभएको थियो र छैन) र कहिलेकाहीं केवल शोर।

फरक थुप्रो वा पट्टी → श्रेणीगत संरचना देखाउँदै। प्रायः तपाईंले चित्रमा नथपेको कुनै श्रेणीगत स्तम्भले डाटा बाँडिरहेको छ।

बाङ्गो वा कुप्रिएको ढाँचा → गैर-रेखीय सम्बन्ध। रेखीय मोडेलले यसलाई कम-फिट गर्नेछन्; रुख-आधारित मोडेलले समात्नेछन्। मोडेलिङअघि थाहा पाउन लायक।

रङले तेस्रो आयाम थप्ने

दुई-अक्षको स्क्याटर प्लटले रङमार्फत तेस्रो स्तम्भ इन्कोड गर्न सक्छ:

districts = df["district"].unique()
colours = plt.cm.tab10(range(len(districts)))

for i, d in enumerate(districts[:5]):  # शीर्ष 5 जिल्ला मात्र
    subset = df[df["district"] == d]
    plt.scatter(
        subset["amount"], subset["repayment_days"],
        c=[colours[i]], label=d, alpha=0.5,
    )

plt.xlabel("Amount")
plt.ylabel("Repayment days")
plt.legend()
plt.show()

अब तपाईं रकम र तिर्ने दिनबीचको सम्बन्ध हरेक जिल्लामा उस्तै छ कि — वा केही जिल्लामा प्रणालीगत रूपमा फरक ढाँचा छन् कि देख्न सक्नुहुन्छ। पछिल्लो प्रायः बढी चाखलाग्दो खोज हुन्छ।

सहसम्बन्ध — चित्र पछाडिको सङ्ख्या

सहसम्बन्ध गुणक एकल सङ्ख्या हो जसले दुई सङ्ख्यात्मक स्तम्भ कति बलियोसँग सँगै फरक हुन्छन् सारांश दिन्छ:

df["amount"].corr(df["repayment_days"])

नतिजा -1 र +1 बीचको सङ्ख्या हो:

  • +1.0 — पूर्ण सकारात्मक सम्बन्ध; एक स्तम्भ बढ्दा अर्को ठ्याक्कै बढ्छ।
  • +0.5 — मध्यम सकारात्मक।
  • 0.0 — कुनै रेखीय सम्बन्ध छैन (अझै गैर-रेखीय हुन सक्छ)।
  • -0.5 — मध्यम नकारात्मक।
  • -1.0 — पूर्ण नकारात्मक।

एकैचोटि सबै सङ्ख्यात्मक स्तम्भका लागि:

df.select_dtypes(include="number").corr()

यसले सहसम्बन्ध मेट्रिक्स उत्पादन गर्छ — उपयोगी तर गलत पढ्न सजिलो।

सहसम्बन्धले के भन्दैन

तीन विश्वव्यापी सावधानी:

सहसम्बन्ध कारण होइन। ऋण रकम र तिर्ने दिन सहसम्बन्धित छन्। के ऋण रकमले लामो तिर्ने कारण बनाउँछ? सम्भवतः हो (ठूला रकमका लागि लामो-अवधिका सम्झौता लेखिन्छन्)। तर एक्लै सहसम्बन्धले यो प्रमाणित गर्न सक्दैन। दुई स्तम्भ दुवै तेस्रोमा निर्भर हुन सक्छन् — उदाहरणका लागि, ऋण अधिकारीको वरिष्ठताले ठूला ऋण र लामो अवधि दुवै कारण बनाउन सक्छ, र रकम र अवधिबीचको प्रत्यक्ष सम्बन्ध धेरै कमजोर हुन सक्छ।

सहसम्बन्धले रेखीय सम्बन्ध मात्र समात्छ। पराबोलाको रूपमा अनुसरण गर्ने स्तम्भ (y = x²) सँग अन्तर्निहित x सँग शून्य-झैँ रेखीय सहसम्बन्ध हुन्छ, सम्बन्ध पूर्ण भए पनि। सहसम्बन्ध सङ्ख्यामा विश्वास गर्नुअघि सधैं प्लट गर्नुहोस्।

सहसम्बन्ध आउटलायरप्रति संवेदनशील छ। माइक्रोफाइनान्स डाटासेटमा एक रु 4.5 करोडको ऋणले सहसम्बन्ध गुणक 0.3 वा बढीले हल्लाउन सक्छ। कुनै पनि सहसम्बन्ध सङ्ख्या रिपोर्ट गर्नुअघि स्क्याटर प्लट हेर्नुहोस्।

श्रेणीगत बनाम सङ्ख्यात्मक: बक्स प्लट

जब तपाईं श्रेणीगतमा सङ्ख्यात्मक स्तम्भ तुलना गर्न चाहनुहुन्छ — भनौँ, जिल्लाद्वारा ऋण रकम — स्क्याटर प्लट गलत औजार हो। बक्स प्लट प्रयोग गर्नुहोस्:

df.boxplot(column="amount", by="province", figsize=(12, 6))
plt.title("Loan amount by province")
plt.xticks(rotation=45)
plt.show()

हरेक श्रेणीका लागि बक्स प्लटले मध्यिका (बक्समा रेखा), अन्तरचतुर्थांश दायरा (बक्स), सामान्य दायरा (व्हिस्कर), र आउटलायर (डट) देखाउँछ। छेउछाउ, तिनले श्रेणीहरूमा वितरण एक हेराइमा तुलना गर्न दिन्छन्।

खोज्ने कुरा:

  • धेरै फरक उचाइमा बक्स → श्रेणीगत चर सङ्ख्यात्मकसँग बलियो सम्बन्ध छ।
  • समान उचाइमा बक्स तर धेरै फरक चौडाइ → मध्यिका समान भए पनि फैलावट श्रेणीअनुसार फरक छ।
  • अरूभन्दा धेरै अग्लो (लामो व्हिस्कर, धेरै डट) एक बक्स → त्यो श्रेणीमा असामान्य रूपमा परिवर्तनशील मान छन्; छानबिन गर्नुहोस्।

कन्फाउन्डरबारे छोटो टिप्पणी

कन्फाउन्डर लुकेको तेस्रो चर हो जसले अरू दुईबीचको स्पष्ट सम्बन्ध व्याख्या गर्छ। सुरुआतीको “हामीले बलियो पूर्वानुमानकर्ता भेट्यौं” गलत हुने सबैभन्दा सामान्य कारण यिनी हुन्।

क्लासिक उदाहरण: नेपालभरको विद्यालय डाटासेटमा, तपाईं पाउनुहुन्छ कि उच्च उचाइले कम विद्यार्थी गन्तीसँग सहसम्बन्ध राख्छ। कारणात्मक? झन्डै निश्चित होइन। कन्फाउन्डर जनसङ्ख्या घनत्व हो — उच्च-उचाइ जिल्ला (कर्णाली, मुस्ताङ) मा कम जनसङ्ख्या घनत्व छ, कम जनसङ्ख्या घनत्व → साना विद्यालय। उचाइ सहयोग हो; जनसङ्ख्या घनत्व कारण हो।

अनुशासन: कुनै पनि सहसम्बन्धलाई कारणात्मक मान्नुअघि, “कुन तेस्रो चरले दुवै व्याख्या गर्न सक्छ?” सोध्नुहोस्। यदि तपाईं एउटा सोच्न सक्नुहुन्छ भने, यसलाई आफ्नो विश्लेषणमा नियन्त्रण गर्नुहोस् (जस्तै हरेक जनसङ्ख्या-घनत्व बाल्टीमा सहसम्बन्ध गणना गरेर)।

चार्टसँग बस्ने

ध्यानवान् निर्माता र हतार गर्ने बीच फरक पार्ने अभ्यास: जब तपाईं चार्ट उत्पादन गर्नुहुन्छ, अघि बढ्नुअघि पूरा एक मिनेट हेर्नुहोस्। तपाईंले देखेको नोट गर्नुहोस्। नदेखेको नोट गर्नुहोस्। अपेक्षा गर्नुभएको तर छुटेको नोट गर्नुहोस्। चार्टको अधिकांश मूल्य हेर्नमा छ, उत्पादनमा होइन।

यो स्पष्ट सुनिन्छ। यो दुर्लभ छ। अधिकांश सुरुआतीहरू चार्ट उत्पादन गर्छन्, दुई सेकेन्ड हेर्छन्, “हो त्यो ठीक देखिन्छ” निर्णय गर्छन्, र अघि बढ्छन्। तिनले द्विमोडल सङ्केत, अनपेक्षित आउटलायर, नबन्ने थुप्रो चुक्छन्। प्रति चार्ट एक मिनेट, दश चार्टमा लागू, दश मिनेट लाग्छ र हप्तौंको डिबगिङ बचाउने समस्या समात्छ।

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

Quick check

रकम बनाम तिर्ने दिनको स्क्याटर प्लटले समग्रमा स्पष्ट सकारात्मक प्रवृत्ति देखाउँछ। तपाईंले बिन्दुलाई प्रदेशले रङ्ग्याउँदा, तपाईं भेट्नुहुन्छ कि हरेक प्रदेशभित्र प्रवृत्ति *नकारात्मक* छ। के भइरहेको छ?

Quick check

तपाईंले `df['amount'].corr(df['repayment_days'])` गणना गर्नुहुन्छ र 0.04 — मूलतः कुनै सहसम्बन्ध छैन — पाउनुहुन्छ। टिम सदस्यले दुई स्तम्भ असम्बन्धित छन् निष्कर्ष निकाल्छिन् र एउटा हटाउन अगाडि बढ्छिन्। के यो सुरक्षित छ?

अब के आउँछ

अध्याय 4 ले तपाईंलाई मोडेलिङअघि डाटासेट बुझ्ने औजार दिएको छ। अध्याय 5 अर्को छलाङ लिन्छ: वास्तवमा मोडेलका लागि डाटा तयार पार्ने। श्रेणीगत पाठलाई सङ्ख्यामा बदल्ने (एन्कोडिङ), बाङ्गो सङ्ख्यात्मकलाई राम्रोसँग व्यवहार गर्ने फिचरमा बदल्ने (स्केलिङ), र डाटालाई मोडेलले देख्ने भाग र इमानदार मूल्याङ्कनका लागि लुकाएर राख्ने भागमा बाँड्ने महत्त्वपूर्ण अनुशासन।