یادگیری علم داده (Data Science) با پایتون — از صفر تا صد

۷۸۸۴ بازدید
آخرین به‌روزرسانی: ۲۸ خرداد ۱۴۰۱
زمان مطالعه: ۲۵ دقیقه
یادگیری علم داده (Data Science) با پایتون — از صفر تا صد

همه چیز از چند سال پیش و هنگامی که تب تند «علم داده» (Data Science) افراد بیشتری را به خود دچار می‌ساخت آغاز شد. «تحلیل داده» (Data Analytics) و «داده‌کاوی» (Data Mining) خیلی زود به گرایش‌های روز علمی و پژوهشی مبدل شدند و دیری نپایید که کسب‌و‌کارها نیز به دلیل کاربردها و مزایای متعدد این حوزه‌ها به آن‌ها روی آوردند.

فهرست مطالب این نوشته

با وجود آنکه داده‌کاوی برای سال‌های زیادی مطرح بوده اما با برجسته‌تر شدن و افزایش توجهات به آن باری دیگر این مساله که گروهی داده‌کاوی را طرحی نو از آمار کلاسیک می‌پنداشتند قوت گرفت. در عین حال، این مشکل وجود داشته و دارد که بسیاری از افراد همچنان از تفاوت‌ها و شباهت‌های علم داده، داده‌کاوی، تحلیل داده و یادگیری ماشین آگاه نیستند.

امروزه، افزایش علاقمندی به علم داده و داده‌کاوی از یک سو و روند رو به رشد و توسعه «هوش مصنوعی» (Artificial Intelligence) و «یادگیری ماشین» از سوی دیگر موجب تحولی اساسی در فضای علمی و صنعتی شده که همچنان نیز ادامه دارد و به دلیل بالا بودن نرخ این تحول و رشد، آینده این علوم به نوعی در هاله‌ای از ابهام قرار داشته و کسی نمی‌داند در آینده پیش رو بشر با چه چیزی مواجه خواهد شد.

شاید خیلی زود عامل‌های هوشمندی که با بهره‌گیری از هوش مصنوعی انسان‌گونه رفتار و عمل می‌کنند و با بهره‌گیری از داده‌کاوی، تحلیل‌های داده و یادگیری ماشین تصمیم‌سازانی به مراتب موفق‌تر از انسان‌ها هستند جهان را تسخیر کرده و آن‌ها باشند که حکمرانی جهان انسانی را به دست می‌گیرند!

پایتون برای علم داده

اما ظهور و توسعه هوش مصنوعی و علم داده خود نیازمند ابزارهایی برای پیاده‌سازی و استفاده از مفاهیم آن‌ها برای کاربردهای جهان‌واقعی بوده است. از همین رو نرم‌افزارهای متعددی معرفی شدند. در این میان زبان‌های برنامه‌نویسی محاسباتی همچون R و زبان‌های اسکریپت‌نویسی مانند پایتون به دلایل گوناگون توانستند جایگاه خوبی را در میان پژوهشگران و علاقمندان به این حوزه کسب کنند. با رشد حجم، نرخ تولید و تنوع داده‌ها مسائل تحلیل داده رنگ و بوی جدیدی گرفتند و مبحث «کلان‌داده» (Big Data | مِه‌داده) مطرح شد. با ظهور کلان‌داده، ابزارهای جدیدی همچون هادوپ، اسپارک و استورم با قابلیت‌های پردازشی جدید مطرح شدند.

در میان ابزارهای موجود برای تحلیل داده‌ها، زبان برنامه‌نویسی پایتون که در ابتدا یک زبان همه منظوره بود به دلیل رشد و توسعه سریع کتابخانه‌های مربوط به علم داده، آمار و احتمال و جبرخطی و داشتن جامعه قدرتمندی که همواره آن‌ها را توسعه می‌دهند به جایگاه قابل توجهی دست یافت. تا جایی که در حال حاضر در بسیاری از آگهی‌های استخدام داده‌کاو، تحلیل‌گر یا دانشمند داده تسلط به زبان پایتون یکی از معیارهای کلیدی است.

در این مطلب یک راهنمای کامل و جامع برای یادگیری علم داده با پایتون ارائه شده که هرآنچه برای آغاز یادگیری علم داده با پایتون نیاز است را به بیان ساده و به طور جامع در اختیار مخاطب قرار می‌دهد. افرادی که تمایل دارند هوش مصنوعی و یادگیری عمیق را به طور جدی‌تر بیاموزند نیز می‌توانند از مطالب زیر بهره‌مند شوند.

این راهنما به افراد کمک می‌کند تا پایتون را سریع‌تر فرا بگیرند و با چگونگی استفاده از آن برای علم داده نیز به خوبی آشنا شوند. مطلب پیش رو به گونه‌ای حاضر شده تا افراد به شکل کاملا کاربردی بتوانند کار با پایتون را بیاموزند. سرفصل‌های کلی موضوعات ارائه شده در این مطلب به شرح زیر است.

  1. مبانی پایتون برای تحلیل داده
  2. کتابخانه‌ها و ساختارهای داده در پایتون
  3. تحلیل اکتشافی در پایتون با استفاده از Pandas
  4. پیش‌پردازش داده‌ها در پایتون با استفاده از Pandas
  5. ساخت یک مدل پیش‌بین در پایتون

۱. مبانی پایتون برای تحلیل داده

در ادامه مبانی لازم جهت یادگیری پایتون برای علم داده بیان شده‌اند.

چرا بسیاری از افراد برای تحلیل داده پایتون می‌آموزند؟

پایتون برای داده‌کاوی

پایتون اخیرا توجهات زیادی را به عنوان زبان منتخب برای تحلیل داده به خود جلب کرده است. در ادامه برخی مزایای پایتون که موجب شده تا به یکی از ابزارهای اصلی تحلیل‌گران داده مبدل شود بیان شده‌اند.

  • متن‌باز بودن و نصب رایگان
  • جامعه آنلاین فوق‌العاده
  • یادگیری بسیار آسان
  • قابلیت تبدیل شدن به یک زمان متداول برای علم داده و تولید محصولات تحلیلی مبتنی بر وب

البته پایتون در کنار مزایا، معیابی نیز دارد که مهم‌ترین آن‌ها در ادمه بیان شده است.

  • پایتون یک «زبان تفسیری» (Interpreted Language) است (زبان «کامپایلی» (compiled language) نیست)، از این رو ممکن است نسبت به یک زبان کامپایلی مدت زمان بیشتری CPU استفاده کند. با این وجود به دلیل صرفه‌جویی که در زمان برنامه‌نویس‌ها دارد (به دلیل سهولت استفاده)، همچنان یک انتخاب خوب است.

پایتون نسخه ۲.۷ در مقایسه با پایتون ۳.۴

انتخاب از میان پایتون نسخه ۲.۷ و ۳.۴ یکی از پربحث‌ترین موضوعات پیرامون این زبان برنامه‌نویسی است. توصیه می‌شود که فراگیران به ویژه افراد مبتدی به این بحث ورود نکنند، زیرا هیچ انتخاب صحیح یا غلطی وجود ندارد. انتخاب گزینه مناسب کاملا بسته به شرایط و نیازهای کاربر دارد. در ادامه اشاراتی برای کمک به مخاطبان جهت انتخاب نسخه مناسب خودشان ارائه شده است.

پایتون ۲.۷ یا ۳.۴

چرا پایتون ۲.۷؟

  1. جامعه پشتیبانی فوق‌العاده‌ای دارد. این یکی از چیزهایی است که کاربران در روزهای آغاز کار خود با یک زبان جدید به شدت به آن نیاز پیدا می‌کنند. پایتون ۲ در اواخر سال ۲۰۰۰ میلادی منتشر شد و برای بیش از ۱۵ سال مورد استفاده قرار گرفته است.
  2. میزان بسیار زیادی از کتابخانه‌های شخص ثالث برای این نسخه از پایتون موجود هستند. گرچه کتابخانه‌های زیادی نیز از پایتون نسخه‌های ۳ پشتیبانی می‌کنند اما همچنان تعداد زیادی از ماژول‌ها تنها در نسخه‌های ۲ کار می‌کنند. افرادی که قصد دارند از پایتون برای کاربردهای نرم‌افزاری مانند توسعه وب با وابستگی بالا به ماژول‌های خارجی استفاده کنند، شاید بهتر باشد با پایتون ۲.۷ کار کنند.
  3. برخی از ویژگی‌های نسخه‌های ۳ دارای «سازگاری عقب‌رو» (backward compatibility) هستند و می‌توانند با نسخه ۲.۷ کار کنند.

چرا پایتون ۳.۴؟

  1. این نسخه از پایتون سریع‌تر و شفاف‌تر است. توسعه‌دهندگان پایتون برخی مشکلات موروثی و اشکالات جزئی موجود در این نسخه را به منظور ایجاد بنیانی مستحکم‌تر برای آینده برطرف کرده‌اند. این مساله ممکن است در ابتدا مهم به نظر نیاید اما با گذر زمان اهمیت آن آشکار می‌شود.
  2. این نسخه یک ویژگی محسوب می‌شود! پایتون ۲.۷ آخرین نسخه از خانواده ۲ بوده و همه افراد باید به تدریج به نسخه ۳ جا‌به‌جا شوند. پایتون ۳ نسخه‌های پایداری را برای پنج سال منتشر کرده و به همین شکل ادامه خواهد داد.

در مجموع باید گفت در مقایسه پایتون ۲.۷ و ۳.۴ هیچ برنده مشخصی وجود ندارد، اما به نظر می‌رسد آنچه افراد تازه‌وارد باید روی آن متمرکز شوند فراگیری پایتون به عنوان یک زبان است. جا‌به‌جایی بین نسخه‌ها مساله‌ای است که در گذر زمان مطرح شده و حل می‌شود.

چگونه می‌توان پایتون را نصب کرد؟

دو رویکرد برای نصب پایتون وجود دارد که در ادامه بیان شده‌اند.

  • می‌توان پایتون را به طور مستقیم از سایت پروژه و مولفه‌های آن و کتابخانه‌های مورد نیاز را نیز به همین صورت دانلود و نصب کرد.
  • می‌توان یک بسته را دانلود و نصب کرد که دارای کتابخانه‌های از پیش نصب شده است. در این راستا، دانلود و نصب «آناکوندا» (Anaconda) که یک توزیع رایگان و متن‌باز از زبان های برنامه‌نویسی پایتون و R برای کاربردهای مرتبط با علم داده و یادگیری ماشین است توصیه می‌شود. گزینه دیگر Enthought Canopy Express است.

راهکار دوم امکان نصب بدون زحمت را فراهم می‌کند و بنابراین به افراد مبتدی استفاده از این روش توصیه می‌شود. مشکل این روش آن است که کاربر باید همواره منتظر ارتقا (upgrade) کل بسته باشد، حتی اگر تمایل به نصب آخرین بسته یک کتابخانه داشته باشند. البته این مساله تا هنگامی که کاربر قصد انجام پژوهش‌های آماری خاص را نداشته باشد، حائز اهمیت نخواهد بود.

انتخاب یک محیط توسعه

هنگامی که فرد پایتون را نصب کرد، گزینه‌های گوناگونی برای انتخاب محیط توسعه وجود دارد. در ادامه سه مورد از متداول‌ترین گزینه‌ها بیان شده‌اند.

  • مبتنی بر ترمینال/شِل
  •  IDLE (محیط پیش‌فرض)
  • iPython Notebook (شبیه markdown در زبان برنامه‌نویسی R است)

پایتون در ترمینال

انتخاب محیط توسعه مناسب بسته به نیازهای افراد است و هر شخص متناسب با نیازها و البته سلیقه شخصی یکی یا چند تا از این موارد را انتخاب کند. iPython Notebook یک نرم‌افزار وب متن‌باز است که مورد توجه بسیاری از داده‌کاوها، تحلیلگران داده و دانشمندان داده واقع شده. دلیل این امر ویژگی‌های قابل توجه این نرم‌افزار به ویژه برای انجام پروژه‌های تحلیل داده محسوب می‌شود. از جمله این ویژگی‌ها قابلیت مستندسازی ضمن نوشتن کد و اجرای کدها در بلاک‌های جداگانه است (به جای اجرای خط به خط). از دیگر مزایای iPython Notebook می‌توان به مواردی که در زیر آمده اشاره کرد.

  • شِل (پوسته) تعاملی (Interactive shells) مبتنی بر ترمینال و کیوت (Qt)
  • یک رابط نوت‌بوک (notebook interface) مبتنی بر مرورگر با پشتیبانی از کد، متن، عبارات ریاضی، نمودارهای توکار و دیگر رسانه‌ها
  • پشتیبانی از بصری‌سازی داده تعاملی و استفاده از جعبه‌ابزارهای GUI
  • مفسرهای توکار و انعطاف‌پذیر برای بارگذاری در پروژه‌ها
  • وجود ابزارهای پردازش موازی

اجرای چند برنامه ساده در پایتون

می‌توان برای شروع کار از پایتون به عنوان یک ماشین حساب ساده استفاده کرد.

آغاز برنامه‌نویسی در پایتون

چند نکته شایان توجه:

  • می‌توان iPython notebook را با نوشتن “ipython notebook” در ترمینال یا cmd (بسته به سیستم‌عاملی که کاربر استفاده می‌کند) آغاز کرد.
  • می‌توان iPython notebook را به سادگی و تنها با کلیک کردن روی UntitledO (پس از باز کردن برنامه و ایجاد پروژه جدید) نام‌گذاری کرد.
  • رابط برای نمایش ورودی‌ها از «[*] In» و جهت نمایش خروجی‌ها از «[*] Out» استفاده می‌کند.
  • می‌توان کد نوشته شده را با فشردن «Shift + Enter» یا «ALT + Enter» (در صورتی که کاربر قصد داشته باشد یک سطر اضافی در ادامه کد قرار دهد این گزینه مناسب است) اجرا کرد.

کتابخانه‌ها و ساختارهای داده در پایتون

پیش از آن که به طور جدی‌تر به حل مساله پرداخته شود، یک گام عقب‌تر رفته و به مبانی پایتون پرداخته می‌شود. چنانکه مشهود است ساختارهای داده، حلقه‌ها و ساختارهای شرطی مبانی زبان‌های برنامه‌نویسی را شکل می‌دهند. در پایتون، لیست‌ها (lists)، رشته‌ها (strings)، تاپل‌ها (tuples) و دیکشنری‌ها (dictionaries) از جمله ساختارهای داده، for و while از حلقه‌ها و if-else از جمله ساختارهای شرطی است. در ادامه به طور مشروح‌تری به این موارد پرداخته خواهد شد.

ساختارهای داده در پایتون

در ادامه برخی از ساختارهای داده مورد استفاده در پایتون بیان شده‌اند. برای استفاده درست و موثر از این ساختارها، آشنایی با آن‌ها نیاز است.

لیست‌ها (Lists): لیست‌ها یکی از همه‌کارترین ساختارها در پایتون هستند. یک لیست را می‌توان به سادگی با نوشتن مجموعه‌ای از مقادیر جدا شده به وسیله ویرگول در میان دو کروشه تعریف کرد. لیست‌ها ممکن است شامل آیتم‌هایی از انواع گوناگون باشند، اما معمولا کلیه آیتم‌های یک لیست نوع یکسانی دارند. لیست‌های پایتون و عناصر منفرد از لیست قابل تغییر هستند. در ادامه مثالی برای تعریف لیست و دسترسی به آن ارائه شده است.

لیست‌ها در پایتون

رشته‌ها (Strings): رشته‌ها را می‌توان به سادگی با استفاده از ( ‘ )، ( ” ) و یا ( ”’ ) تعریف کرد. رشته‌هایی که در میان دو تا ( ”’ ) قرار گرفته‌اند قابلیت گسترش یافتن طی چند خط را دارند و معمولا در docstring‌ها (راهکار پایتون برای مستندسازی توابع) مورد استفاده قرار می‌گیرند. \ به عنوان یک کاراکتر فرار مورد استفاده قرار می‌گیرد. به بیان دیگر، اگر رشته آنقدر طولانی باشد که چندین خط به طول بیانجامد باید آن را در میان ( ”’ ) قرار داد. لطفا توجه کنید که رشته‌های پایتون تغییرناپذیر (immutable) هستند، بنابراین نمی‌توان بخشی از یک رشته را تغییر داد.

یادگیری علم داده (Data Science) با پایتون — از صفر تا صد

یادگیری علم داده (Data Science) با پایتون — از صفر تا صد

یادگیری علم داده (Data Science) با پایتون — از صفر تا صد

تاپل‌ها (Tuples): یک تاپل به وسیله تعدادی از مقادیر که به وسیله ویرگول‌ها از یکدیگر جدا شده‌اند نمایش داده می‌شود. تاپل‌ها نیز تغییرناپذیر هستند (immutable) و خروجی یک تاپل تعریف شده چنانکه در شکل زیر مشهود است در میان پرانتزها قرار می‌گیرد، بنابراین تاپل‌های تو در تو (nested tuples) به طور صحیحی پردازش می‌شوند. علاوه بر این، با اینکه تاپل ها تغییرناپذیر هستند، در صورت نیاز می‌توانند داده‌های تغییرپذیر (mutable) را نگهداری کنند.

تاپل‌ها در پایتون

دیکشنری (Dictionary): دیکشنری یک مجموعه نامرتب از جفت‌های کلید:مقدار (key: value) است که در آن کلیدها باید مقادیری یکتا داشته باشند (در یک دیکشنری). یک جفت آکولاد، یعنی {}، یک دیکشنری خالی می‌سازد.

دیکشنری‌ها در پایتون

ساختارهای شرطی و حلقه‌ها در پایتون

مانند اغلب زبان‌های برنامه‌نویسی، پایتون نیز دارای حلقه for است که پر استفاده‌ترین روش برای تکرار محسوب می‌شود. این متد دارای یک نحو (syntax) بسیار ساده است.

1for i in [Python Iterable]:
2  expression(i)

در اینجا، عبارت «Python Iterable» می‌تواند از نوع لیست، تاپل یا دیگر ساختارهای داده پیشرفته باشد. به عنوان مثال، برنامه محاسبه فاکتوریل یک عدد در ادامه نوشته شده است.

1fact=1
2for i in range(1,N+1):
3  fact *= i

عبارات شرطی برای اجرای یک بخش از کد براساس یک شرط مورد استفاده قرار می‌گیرند. پرکاربردترین ساختار شرطی if-else محسوب می‌شود که نحو آن به صورت زیر است.

1if [condition]:
2  __execution if true__
3else:
4  __execution if false__

برای مثال، در برنامه‌ای که تشخیص دهد عدد زوج است یا فرد و پاسخ مناسب را چاپ کند به صورت زیر عمل می‌شود.

1if N%2 == 0:
2  print ('Even')
3else:
4  print ('Odd')

اکنون که مبانی پایتون تشریح شد، می‌توان یک گام به جلو حرکت کرد. پرسشی که در این وهله مطرح می‌شود آن است که چگونه می‌توان وظایف زیر را انجام داد.

  • ضرب کردن دو ماتریس
  • پیدا کردن ریشه یک معادله درجه دوم
  • ترسیم نمودار میله‌ای و هیستوگرام
  • ساخت مدل‌های آماری
  • دسترسی به صفحات وب و گردآوری داده از آن‌ها

اگر کاربر قصد نوشتن همه کدها را از پایه داشته باشد، با کابوسی مواجه خواهد شد که موجب می‌شود بیش از چند روز از پایتون استفاده نکند. اما دلیلی برای نگرانی در این رابطه وجود ندارد. به لطف کتابخانه‌های بسیار زیادی که از پیش - برای زبان برنامه‌نویسی پایتون - تعریف شده‌اند و می‌توان آن‌ها را به طور مستقیم در کد ایمپورت کرد حل مسائلی که در بالا بیان شد و دیگر مسائل به مراتب پیچیده‌تر بسیار ساده خواهد شد. برای نمونه، مثال فاکتوریل که در بالا کد آن ارائه شد را می‌توان با استفاده از کتابخانه‌های از پیش آماده (در اینجا کتابخانه math) تنها با یک خط کد نوشت.

1math.factorial(N)

البته نیاز به ایمپورت کردن کتابخانه math برای کد بالا است. در ادامه، کتابخانه‌های گوناگون پایتون مورد بررسی قرار خواهند گرفت.

کتابخانه‌های پایتون

اکنون در سفر علم داده با پایتون، یک گام به پیش رفته تا فراگیران، پایتون را ضمن آشنایی با برخی از کتابخانه‌های مفید و کارآمد علم داده و ریاضیات و جبر خطی فرابگیرند. اولین گام در این راستا، آموختن شیوه ایمپورت کردن کتابخانه به محیط برنامه است. در پایتون چندین راه برای انجام این کار وجود دارد که در زیر نشان داده شده‌اند.

1import math as m

و

1from math import *

در راهکار اول، از نام مستعار m برای کتابخانه math استفاده شده است. اکنون می‌توان از توابع گوناگون کتابخانه math، مثلا از تابع factorial، با ارجاع آن با استفاده از همان نام مستعار به صورت ()m.factorial استفاده کرد. در راهکار دوم، کل فضای نام ایمپورت شده (برای مثال در اینجا کل کتابخانه math)، بنابراین می‌توان آن را به طور مستقیم به صورت factorial بدون ارجاع دادن به math استفاده کرد.

تذکر: گوگل توصیه می‌کند که از راهکار اول برای ایمپورت کردن کتابخانه‌ها استفاده شود زیرا بدین شکل مشخص است که توابع از کجا آمده‌اند. در ادامه لیستی از کتابخانه‌ها آمده که برای هرگونه محاسبات علمی و تحلیل داده‌ای به آن‌ها نیاز خواهد بود.

NumPy سرنامی برای  Numerical Python است. قدرتمندترین ویژگی این کتابخانه، آرایه‌های n-بُعدی هستند. این کتابخانه همچنین شامل توابع پایه‌ای جبر خطی، تبدیل فوریه، تولید پیشرفته اعداد تصادفی و ابزارهایی جهت یکپارچه‌سازی با دیگر زبان‌های سطح پایین مانند C++ ، C و فورترن (Fortran) است.

SciPy سرنامی برای Scientific Python است. SciPy براساس NumPy ساخته شده و یکی از پرکاربردترین کتابخانه‌ها برای انواع گسترده‌ای از ماژول‌های سطح بالای علمی و مهندسی مانند تبدیل فوریه گسسته (discrete Fourier transform)، جبر خطی، بهینه‌سازی و «ماتریس‌های خلوت یا اسپارس» (Sparse Matrix) محسوب می‌شود.

Matplotlib برای ترسیم انواع گسترده‌ای از نمودارها، از هیستوگرام و نمودارهای خطی گرفته تا نمودارهای حرارتی قابل استفاده است. می‌توان از ویژگی Pylab در ipython notebook (به صورت ipython notebook –pylab = inline) به منظور بهره‌گیری از ویژگی‌ رسم نمودار به صورت خطی استفاده کرد. اگر ویژگی inline توسط کاربر نادیده گرفته شود، pylab محیط ipython را به محیطی بسیار شبیه به «متلب» (Matlab) مبدل می‌کند.

Pandas برای عملیات روی داده‌های ساختار یافته و دستکاری آن‌ها مورد استفاده قرار می‌گیرد. این کتابخانه به طور گسترده‌ای برای «data munging» (این عبارت یک تعریف استاندارد برای انجام تغییرات غیر قابل بازگشت در داده‌ها است. به نظر می‌رسد عبارت mung سرنام برگرفته شده از Mash Until No Good باشد. در واقع، عبارت data munging اغلب به فرآیند دریافت داده‌های خام و تبدیل و نگاشت آن‌ها به دیگر فرمت‌ها به منظور آماده‌سازی مجموعه داده جهت انجام تحلیل‌های تخصصی، اشاره دارد و از آماده‌سازی داده‌ها به عنوان مقدمه‌ای جهت تحلیل‌ها استفاده می‌شود. Pandas در سال‌های اخیر به پایتون اضافه و منجر به افزایش استفاده از آن در جامعه دانشمندان داده شده است.

Scikit Learn کتابخانه‌ای برای یادگیری ماشین است. این کتابخانه بر اساس SciPy، NumPy و matplotlib ساخته شده و شامل ابزارهای کارآمدی برای یادگیری ماشین و مدل‌سازی آماری شامل «دسته‌بندی» (classification)، «رگرسیون» (regression)، «خوشه‌بندی» (clustering) و «کاهش ابعاد» (dimensionality reduction) است.

Statsmodels برای مدل‌سازی آماری مورد استفاده قرار می‌گیرد. این کتابخانه یک ماژول از پایتون است که به کاربران امکان اکتشاف در داده‌ها، تخمین مدل‌های آماری و انجام آزمون‌های آماری را می‌دهد. Statsmodels یک لیست گسترده از «آمار توصیفی» (descriptive statistics)، «آزمون‌های آماری» (statistical tests)، توابع ترسیم نمودار و نتایج آماری برای انواع گوناگونی از داده‌ها و برآوردگرها است.

Seaborn یک کتابخانه پایتون برای بصری‌سازی آماری داده‌ها است. این کتابخانه برای ساخت گرافیک‌های آماری اطلاعاتی و جذاب در پایتون قابل استفاده و برمبنای matplotlib ساخته شده. هدف Seaborn آن است که بصری‌سازی را به بخش مرکزی اکتشاف و ادراک داده‌ها مبدل کند.

Bokeh برای ساخت نمودارهای تعاملی، دشبوردها و برنامه‌های داده در مرورگرهای مدرن مورد استفاده قرار می‌گیرد. این کتابخانه کاربر را قادر به تولید گرافیک‌های ظریف و مختصری به سبک D3.js می‌سازد. علاوه بر آنچه گفته شد، این کتابخانه توانایی تعامل با کارایی بالا در مجموعه داده‌های بسیار بزرگ یا جریانی را دارا است.

Blaze به منظور گسترش توانایی‌های Numpy و Pandas برای مجموعه داده‌های توزیع شده و جریانی، مورد استفاده قرار می‌گیرد. این کتابخانه قابل استفاده به منظور دسترسی داشتن به داده‌ها از طریق گروه کثیری از منایع شامل Bcolz ،MongoDB ،SQLAlchemy ،Apache Spark ،PyTables و دیگر موارد است. Blaze در کنار کتابخانه Bokeh می‌تواند به عنوان یک ابزار بسیار قدرتمند جهت ساخت آثاری بصری (گرافیک‌ها و نمودارها) و دشبوردهای موثر برای مجموعه‌های عظیم داده مورد استفاده قرار بگیرد.

Scrapy کتابخانه‌ای برای «خزیدن در وب» (web crawling) است. این کتابخانه برای کشف الگوهای خاص در داده‌ها بسیار مفید به حساب می‌آید. Scrapy توانایی آغاز به کار کردن در URL خانگی وب‌سایت و کاوش کردن در صفحه وب برای گردآوری اطلاعات را دارد.

SymPy برای «محاسبات نمادین» (Symbolic Computation) مورد استفاده قرار می‌گیرد و دارای طیف وسیعی از توانایی‌ها از ریاضیات نمادین پایه گرفته تا حساب، جبر، ریاضیات گسسته و فیزیک کوانتوم است. دیگر ویژگی کارآمد این کتابخانه، توانایی قالب‌بندی نتایج محاسبات به صورت کد «لاتک» (LaTeX) است.

Requests برای دسترسی به وب است. این کتابخانه به صورت مشابه با کتابخانه پایتون استاندارد urllib2 مورد استفاده قرار می‌گیرد، اما کد زدن با استفاد از Requests ساده‌تر است. امکان دارد کاربران با تجربه تفاوت‌های ظریفی بین این دو کتابخانه پیدا کنند، اما Requests برای افراد مبتدی راحت‌تر است.

کتابخانه‌های دیگری که ممکن است به آن‌ها نیاز شود عبارتند از:

  • os برای عملیات سیستم‌عامل و فایل
  • networkx و igraph برای دستکاری داده‌های مبتنی بر گراف
  • regular expressions برای یافتن الگوها در داده‌های متنی
  • BeautifulSoup برای گردش در وب قابل استفاده است. این کتابخانه نسبت به Scrapy در درجه دوم قرار می‌گیرد و ناقص‌تر محسوب می‌شود زیرا در یک اجرا تنها توانایی استخراج اطلاعات از یک صفحه وب را دارد.

اکنون که مبانی پایتون و کتابخانه‌های اضافی آن تشریح شد، در ادامه مطلب با نگاهی عمیق به چگونگی حل مساله تحلیل داده با بهره‌گیری از پایتون پرداخته خواهد شد. بله، منظور ساخت یک مدل پیش‌بین است. در فرآیند پیش رو از برخی کتابخانه‌های قدرتمند استفاده و با سطح دیگری از ساختارهای داده کار می‌شود. در ادامه سه فاز کلیدی زیر انجام خواهند شد:

  1. «اکتشاف در داده‌ها» (Data Exploration): کسب اطلاعات بیشتر پیرامون داده‌های موجود
  2. Data Munging: پاک‌سازی داده‌ها و بازی با آن‌ها به منظور مدل‌سازی بهتر داده‌ها انجام می‌شود.
  3. «مدل‌سازی پیش‌بین» (Predictive Modeling): اجرای الگوریتم‌های واقعی و لذت بردن از تحلیل داده‌ها.

تحلیل اکتشافی در پایتون با استفاده از Pandas

به منظور اکتشاف در داده‌ها، نیاز به آشنایی با یک حیوان دیگر، «Pandas»، است (البته اگر آشنایی با پایتون و آناکوندا کافی نبوده باشد).

کتابخانه Pandas در پایتون

Pandas یکی از پرکاربردترین کتابخانه‌های تحلیل داده در پایتون به شمار می‌آید. این کتابخانه نقش برجسته‌ای در افزایش استفاده از پایتون در جامعه دانشمندان داده داشته است. اکنون از Pandas برای خواندن یک مجموعه داده از رقابت‌های «Analytics Vidhya» استفاده می‌شود. سپس، تحلیل‌های اکتشافی انجام و اولین الگوریتم دسته‌بندی برای حل این مساله ارائه خواهد شد. پیش از بارگذاری داده‌ها، باید با دو ساختار کلیدی «سری‌ها» (Series) و «DataFrames» در Pandas آشنا شد.

مقدمه‌ای بر سری‌ها و DataFrame‌ها در Pandas

سری‌ها را می‌توان به عنوان آرایه‌های تک‌بُعدی برچسب‌گذاری/ایندکس شده دید. می‌توان به عناصر این سری‌ها از طریق برچسب‌ها دسترسی داشت. یک dataframe مشابه «کارپوشه» (workbook) در اکسل (کاربر اسامی ستون‌ها که به ستون‌ها ارجاع دارد و سطرها را دارد و می تواند به آن‌ها از طریق شماره سطرها دسترسی داشته باشد) است.

تفاوت اساسی در این میان آن است که در dataframe‌ها، اسامی ستون و شماره سطرها با عنوان ایندکس سطرها و ستون‌ها شناخته می‌شوند. سری‌ها و dataframe‌ها از مدل‌های داده اصلی Pandas در پایتون هستند. مجموعه داده‌ها ابتدا در این چارچوب‌های داده خوانده می‌شوند و سپس عملیات گوناگون (مثلا group و aggregation) به سادگی روی ستون‌های آن‌ها قابل اعمال خواهد بود.

تمرین کار با مجموعه داده‌ها -- مساله پیش‌بینی وام

می‌توان مجموعه داده استفاده شده در این مثال را از اینجا دانلود کرد. توصیف متغیرهای این مجموعه داده در ادامه آمده است.

Loan Prediction Problem Data Set

آغاز اکتشاف

برای آغاز، رابط iPython را با نوشتن دستور زیر در ترمینال گنولینوکس/CMD ویندوز در حالت Inline Pylab اجرا کنید.

1ipython notebook --pylab=inline

این دستور موجب می‌شود رابط iPython notebook در محیط pylab باز شود که به طور پیش‌فرض برخی از کتابخانه‌های مفید را به صورت ایمپورت شده دارد. همچنین، کاربر قادر خواهد بود تا نمودارها را به صورت inline رسم کند، این کار موجب می‌شود محیط موجود برای تحلیل‌های داده تعاملی جایگاه بسیار خوبی باشد. برای بررسی اینکه محیط به طور صحیح بارگذاری شده، دستور زیر را تایپ کنید (خروجی باید مشابه شکل زیر باشد):

1plot(arange(5))

بررسی صحت عملکرد iPython در حالت Inline Pylab

کلیه مراحل این تمرین در سیستم‌عامل گنولینوکس انجام شده و مجموعه داده مورد استفاده در مسیر زیر ذخیره شده است.

1 /home/kunal/Downloads/Loan_Prediction/train.csv

ایمپورت کردن کتابخانه‌ها و مجموعه داده

در ادامه، لیست کتابخانه‌هایی که در این راهنما مورد استفاده قرار می‌گیرند بیان شده است.

  • numpy
  • matplotlib
  • pandas

شایان توجه است که نیازی به ایمپورت کردن کتابخانه‌های matplotlib و numpy به دلیل استفاده از محیط Pylab وجود ندارد. با این وجود همچنان در کدهای نوشته شده ایمپورت می‌شوند تا اگر شخصی در محیطی غیر از Pylab از آن‌ها استفاده کرد با خطا مواجه نشود. پس از ایمپورت کردن کتابخانه‌ها، باید مجموعه داده را با استفاده از تابع  .()read_csv خواند. کدهای مربوط به آنچه تا این لحظه بیان شد به صورت زیر هستند.

1import pandas as pd
2import numpy as np
3import matplotlib as plt
4%matplotlib inline
5
6df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #Reading the dataset in a dataframe using Pandas

اکتشاف داده سریع

پس از آنکه مجموعه داده خوانده شد، می‌توان تعدادی از سطرهای بالایی (اولیه) آن را با استفاده از تابع ()head مشاهده کرد.

1df.head(10)

اکتشاف داده در پایتون

این دستور باید ۱۰ سطر را چاپ کند. همچنین می‌توان با پرینت کردن مجموعه داده تعداد سطرهای بیشتری را دید. گام بعدی داشتن نگاهی به خلاصه فیلدهای عددی با استفاده از تابع ()describe است.

1df.describe()

تابع ()describe تعداد عناصر (count)، میانگین (mean)، انحراف معیار (standard deviation | std)، کمینه (min)، چارک‌ها (quartiles) و بیشینه (max) را در خروجی ارائه می‌کند.

اکتشاف داده در پایتون

در ادامه برخی از نتایجی که می‌توان با نگاه به خروجی تابع ()describe به آن‌ها دست یافت ارائه شده‌اند.

  • LoanAmount دارای ۲۲ مقدار ناموجود (۵۹۲– ۶۱۴) است.
  • Loan_Amount_Term دارای ۱۴ مقدار ناموجود (۶۰۰ - ۶۱۴) است.
  • Credit_History دارای ۵۰ مقدار ناموجود (۵۶۴-۶۱۴) است.

همچنین مشهود است که بالغ بر ٪۸۴ متقاضیان وام (applicants) دارای credit_history هستند. چگونه می‌توان این مطلب را فهمید؟ میانگین فیلد credit_history برابر با 0.84 است (به خاطر داشته باشید که Credit_History دارای مقدار «۱» برای افراد دارای تاریخچه اعتبار و مقدار «۰» برای افراد فاقد آن است). به نظر می‌رسد توزیع ApplicantIncome درست مانند CoapplicantIncome با انتظار مطابقت دارد.

شایان توجه است که می‌توان ایده وجود یک «چولگی» (Skewness) احتمالی در داده‌ها را با مقایسه میانگین و میانه در نظر گرفت. برای مقادیر غیر عددی (برای مثال Property_Area ،Credit_History و دیگر موارد)، برای دانستن اینکه آیا معنادار هستند یا خیر می‌توان نگاهی به توزیع فراوانی داشت. جدول فراوانی را می توان با استفاده از دستور زیر پرینت گرفت.

1df['Property_Area'].value_counts()

به طور مشابه، می‌توان مقادیر یکتا در تاریخچه اعتبار را مورد بررسی قرار داد. قابل توجه است که [’dfname[‘column_name d یک روش اندیس‌گذاری پایه برای دستیابی به یک ستون مشخص از dataframe است. این مورد می‌تواند لیستی از ستون‌ها نیز باشد.

تحلیل توزیع

اکنون که با مبانی خصوصیات داده  آشنایی ایجاد شد، توزیع متغیرهای گوناگون مورد بررسی قرار خواهد گرفت. این بررسی از متغیرهای عددی و برای مثال ApplicantIncome و LoanAmount آغاز خواهد شد. ابتدا نمودار هیستوگرام برای این متغیر با استفاده از دستور زیر ترسیم می‌شود.

1df['ApplicantIncome'].hist(bins=50)

نمودار هیستوگرام در پایتون

در اینجا قابل مشاهده است که تعداد ناچیزی مقادیر بسیار بزرگ وجود دارد. به همین دلیل است که برای ترسیم توزیع به طور شفاف نیاز به ۵۰ «رده» (Bin) است (به هیستوگرام متغیرهای گسسته که می‌توانند m مقدار متفاوت داشته باشند، هیستوگرام m-bin گفته می‌شود). در گام بعدی، برای فهمیدن توزیع داده‌ها نمودار جعبه‌ای مورد بررسی قرار می‌گیرد. نمودار جعبه‌ای را می‌توان با دستور زیر ترسیم کرد.

1df.boxplot(column='ApplicantIncome')

این نمودار گواهی بر وجود تعداد زیادی مقادیر ناهنجار یا دور افتاده است. این مساله به وجود اختلاف درآمد در میان اقشار مختلف جامعه نسبت داده می‌شود. بخشی از این مساله نیز احتمالا مربوط به این است که افرادی با سطح تحصیلات گوناگون مورد بررسی قرار گرفته‌اند. در ادامه افراد بر اساس سطح تحصیلات جداسازی می‌شوند.

نمودار جعبه‌ای در پایتون

می‌توان به وضوح در نمودار بالا دید که تفاوت قابل توجهی بین میانگین درآمد افراد فارغ‌التحصیل و غیر فارغ‌التحصیل وجود ندارد. اما افراد فارغ‌التحصیل بیشتری با درآمد بسیار بالا وجود دارند که در نمودار به صورت دورافتادگی ظاهر شده است. اکنون نمودار هیستوگرام و جعبه‌ای برای LoanAmount با استفاده از دستوراتی که در ادامه آمده ترسیم می‌شوند.

1df['LoanAmount'].hist(bins=50)

نمودار هیستوگرام در پایتون

1df.boxplot(column='LoanAmount')

نمودار جعبه‌ای در پایتون

مجددا، چندین مقدار بسیار زیاد وجود دارد. واضح است که ApplicantIncome و LoanAmount نیازمند munging (پیش‌پردازش) هستند. LoanAmount علاوه بر مقادیر بسیار بزرگ دارای مقادیر ناموجود نیز هست، در حالیکه ApplicantIncome دارای مقادیر بسیار بزرگی است که نیازمند درک عمیق‌تر هستند. به این مسائل در ادامه پرداخته خواهد شد.

تحلیل متغیرهای دسته‌ای

اکنون که توزیع‌های ApplicantIncome و LoanIncome مشخص شد، به متغیرهای دسته‌ای با جزئیات بیشتری پرداخته خواهد شد. در اینجا از سبک جداول محوری (pivot table) و جدول متقاطع (cross-tabulation) در نرم‌افزار اکسل (Excel) استفاده شده است. برای مثال، در نمونه زیر شانس گرفتن وام بر اساس تاریخچه اعتبار بررسی شده. این مورد را می‌توان با جداول محوری (پیوت تیبل) در اکسل انجام داد.

استفاده از اکسل برای تحلیل داده

تذکر: در اینجا وضعیت به این صورت کدگذاری شده که ۱ برای «بله» و ۰ برای «خیر» است. بنابراین میانگین احتمال دریافت وام را نشان می‌دهد. اکنون مراحل مورد نیاز برای تولید بینشی مشابه، با استفاده از پایتون، بررسی شده است. از قطعه کد زیر می‌توان برای تولید چیزی مشابه با آنچه از اکسل به دست آمده استفاده کرد.

1temp1 = df['Credit_History'].value_counts(ascending=True)
2temp2 = df.pivot_table(values='Loan_Status',index=['Credit_History'],aggfunc=lambda x: x.map({'Y':1,'N':0}).mean())
3print ('Frequency Table for Credit History:') 
4print (temp1)
5
6print ('\nProbility of getting loan for each Credit History class:')
7print (temp2)

تحلیل داده در اکسل

خروجی، چیزی شبیه pivot_table موجود در اکسل است. این خروجی را می‌توان با استفاده از نمودار میله‌ای و کتابخانه «matplotlib» با استفاده از کد زیر بصری کرد.

1import matplotlib.pyplot as plt
2fig = plt.figure(figsize=(8,4))
3ax1 = fig.add_subplot(121)
4ax1.set_xlabel('Credit_History')
5ax1.set_ylabel('Count of Applicants')
6ax1.set_title("Applicants by Credit_History")
7temp1.plot(kind='bar')
8
9ax2 = fig.add_subplot(122)
10temp2.plot(kind = 'bar')
11ax2.set_xlabel('Credit_History')
12ax2.set_ylabel('Probability of getting loan')
13ax2.set_title("Probability of getting loan by credit history")

نمودار میله ای در پایتون

این نمودار حاکی از آن است که در صورت وجود تاریخچه اعتباری معتبر، شانس دریافت وام هشت برابر می‌شود. می‌توان گراف مشابهی را با دیگر ویژگی‌ها از جمله Married، Self-Employed و Property_Area ترسیم کرد. همچنین، می‌توان این دو نمودار را در یک «نمودار تجمعی» (stacked chart) ترکیب و نمودار حاصل را ترسیم کرد.

1temp3 = pd.crosstab(df['Credit_History'], df['Loan_Status'])
2temp3.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)

نمودار میله‌ای تجمعی در پایتون

جنسیت را نیز می‌توان به این ترکیب افزود (مشابه جدول Pivot در اکسل).

پیش‌پرداز داده‌ها (Data Munging) در پایتون با استفاده از Pandas

مخاطبانی که تا این لحظه مطلب را مطالعه کرده‌اند باید به این نکته توجه داشته باشند که پیش‌پردازش داده‌ها مهم‌ترین گام در فرآیند تحلیل داده است که به آن به عبارتی (Data munging) نیز گفته می‌شود.

پیش‌پردازش داده‌ها - خلاصه‌ای از نیازها

در حین فرآیند اکتشاف داده‌ها، چندین مساله در مجموعه داده یافت شد که باید پیش از مدل‌سازی نهایی حل شوند. به این کار پیش‌پردازش داده‌ها یا «Data Munging» گفته می‌شود. مشکلاتی که حین اکتشاف داده‌ها از وقوع آن‌ها آگاهی حاصل شد به شرح زیر هستند:

  • مقادیر ناموجود برای برخی از متغیرها وجود دارند. باید این مقادیر را به طور هوشمندانه‌ای بسته به میزان مقادیر ناموجود و اهمیت آن متغیر تخمین زد.
  • هنگام بررسی توزیع مقادیر برای متغیرها، مشهود بود که ApplicantIncome و LoanAmount دارای مقادیر بسیار بزرگی هستد. گرچه، این مقادیر ممکن است در بردارنده اطلاعات نوآورانه‌ای باشند، اما باید با آن‌ها به شکل مناسبی مواجه شد.

علاوه بر این مسائل که برای مقادیر عددی وجود دارد، باید فیلد مقادیر غیر عددی مانند Education ،Married ،Property_Area و Gender را نیز از جهت وجود اطلاعات ارزشمند در آن‌ها مورد بررسی قرار داد.

بررسی مقادیر ناموجود در مجموعه داده

در این گام باید مقادیر ناموجود برای کلیه متغیرها مورد بررسی قرار بگیرند زیرا اغلب مدل‌ها با داده‌های ناموجود کار نمی‌کنند و حتی در صورت کار کردن نیز حل مشکل این مقادیر بهتر از حل نکردن آن است چون می‌تواند در دقت و صحت خروجی موثر باشد. تعداد nullها/NaNهای موجود در مجموعه داده با استفاده از کد زیر قابل محاسبه است.

1 df.apply(lambda x: sum(x.isnull()),axis=0)

دستور بالا باید تعداد مقادیر ناموجود در هر سطر را که ()isnull در صورت هیچ مقدار بودن (null) یک متغیر باز می‌گرداند، در اختیار بگذارد.

مقادیر ناموجود

گرچه مقادیر از دست رفته تعداد زیادی ندارند، اما متغیرهای زیادی دارای مقادیر ناموجود هستند، بنابراین هر یک از این موارد باید تخمین زده و به داده‌ها اضافه شوند. روش‌های گوناگونی برای حله مساله مقادیر ناموجود وجود دارد که تشریح کلیه آن‌ها از حوصله این بحث خارج است.

تذکر: به خاطر داشته باشید که مقادیر ناموجود همیشه NaN نیستند. برای مثال اگر Loan_Amount_Term برابر با ۰ باشد، این پرسش مطرح می‌شود که صفر دارای معنا است یا باید یک داده ناموجود محسوب شود؟ در اینجا پاسخ صحیح «داده ناموجود» است، بنابراین باید به دنبال چنین مقادیر غیر عملیاتی به عنوان مقادیر ناموجود بود.

چگونه مقادیر ناموجود برای LoanAmount محاسبه می‌شوند؟

راهکارهای گوناگونی برای جای‌گذاری مقادیر ناموجود loan amount وجود دارد. ساده‌ترین راه جایگزینی آن با میانگین است که با استفاده از قطعه کد زیر انجام می‌شود.

1 df['LoanAmount'].fillna(df['LoanAmount'].mean(), inplace=True)

راهکار قابل توجه دیگر استفاده از یک روش یادگیری نظارت شده برای پیش‌بینی مقدار وام بر اساس دیگر متغیرها و استفاده از سن در کنار دیگر متغیرها برای پیش‌بینی مقادیر ناموجود است. با توجه به اینکه هدف در حال حاضر آن است که گام‌های data munging انجام شود، رویکردی که اتخاذ می‌شود چیزی بین این دو خواهد بود. یک فرضیه کلیدی آن است که می‌توان از ترکیب تحصیل‌کرده یا خوداشتغال بودن فرد برای ارائه یک تخمین خوب از مقدار وام استفاده کرد. در این راستا، ابتدا نمودار جعبه‌ای زیر از جهت وجود گرایش‌ها بررسی می‌شود.

نمودار جعبه‌ای در پایتون

تغییراتی در میزان وام برای هر گروه وجود دارد و این امر برای نسبت دادن مقادیر قابل استفاده است. اما ابتدا، باید اطمینان حاصل شود که متغیرهای Self_Employed و Education نباید مقادیر ناموجود داشته باشند. همانطور که پیش از این مشاهده شد، Self_Employed دارای تعدادی مقدار از دست رفته است. جدول فراوانی مجددا مورد بررسی قرار می‌گیرد.

جدول فراوانی

با توجه به اینکه نزدیک به %86 مقادیر «No» هستند، می‌توان مقادیر ناموجود را با «No» جایگزین کرد زیرا احتمال آنکه تخمین درستی باشد بالا است. این کار را می‌توان با استفاده از قطعه کد زیر انجام داد.

1 df['Self_Employed'].fillna('No',inplace=True)

اکنون باید جدول Pivot ساخته شود تا مقدار میانه را برای همه گروه‌های مقادیر یکتای ویژگی‌های Self_Employed و Education فراهم کند. سپس، یک تابع تعریف می‌شود که مقدار این سلول‌ها را بازگردانده و آن را جایگزین مقادیر ناموجود loan amount می‌کند.

1table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median)
2# Define function to return value of this pivot_table
3def fage(x):
4 return table.loc[x['Self_Employed'],x['Education']]
5# Replace missing values
6df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)

این کد می‌تواند راهکار خیلی خوبی برای جایگزینی مقادیر ناموجود متغیر loan amount باشد.

تذکر: این روش تنها در صورتی پاسخگو است که مقادیر ناموجود با استفاده از راهکار پیش‌تر بیان شده پُر نشده باشند.

چگونه با مقادیر فوق‌العاده در توزیع LoanAmount و ApplicantIncome برخورد شود؟

ابتدا LoanAmount تحلیل می‌شود. با توجه به اینکه مقادیر فوق‌العاده ممکن است صحیح باشند (مثلا برخی افراد ممکن است درخواست وام‌های خیلی زیاد برای نیازهای خاص داشته باشند). بنابراین، به جای مواجهه با آن‌ها به صورت دورافتادگی، از یک تبدیل سوابق برای خنثی کردن تاثیر آن‌ها استفاده می‌شود.

1 df['LoanAmount_log'] = np.log(df['LoanAmount'])
2df['LoanAmount_log'].hist(bins=20)

بررسی مجدد نمودار هیستوگرام:

حل مساله داده‌های بسیار بزرگ/کوچک

اکنون توزیع به نرمال نزدیک‌تر شده و تاثیر مقادیر فوق‌العاده به میزان زیادی فروکش کرده. حالا نوبت به ApplicantIncome رسیده است. یک بینش می‌تواند این باشد که برخی از متقاضیان وام (applicants) درآمد کمتری دارند اما ضامن پشتیبان بسیار قوی دارند. بنابراین، ترکیب درآمدها به صورت درآمد کلی (total income) و تبدیل کردن سوابق آن می‌تواند ایده خوبی باشد.

1df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome']
2df['TotalIncome_log'] = np.log(df['TotalIncome'])
3df['LoanAmount_log'].hist(bins=20)

مساله تحلیلی اعطای وام

اکنون، می‌توان مشاهده کرد که توزیع داده‌ها بهتر از قبل است. جایگذاری مقادیر ناموجود برای Gender، Married، Dependents، Loan_Amount_Term و Credit_History به مخاطبان سپرده می‌شود. همچنین، توصیه می‌شود به دیگر اطلاعاتی که قابل حصول از داده‌ها هستند فکر شود. برای مثال، ساخت ستونی برای LoanAmount/TotalIncome ممکن است معنادار باشد زیرا ایده‌ای از اینکه درخواست‌کننده وام چقدر خوب بازپرداخت اقساط را انجام می‌دهد فراهم می‌کند. در ادامه، مبحث ساخت مدل پیش‌بین مورد بررسی قرار می‌گیرد.

ساخت یک مدل پیش‌بین در پایتون

پس از آنکه داده‌ها پیش پردازش و برای تحلیل مناسب شد، زمان آن رسیده که از کد پایتون برای ساخت یک مدل پیش‌بین روی مجموعه داده موجود استفاده شود. Skicit-Learn (یا sklearn) پر کاربردترین کتابخانه در پایتون برای این منظور است و در ادامه این مطلب از آن استفاده خوهد شد. از آنجا که برای کار با sklearn همه مقادیر باید عددی باشند، باید همه متغیرهای دسته‌ای را با رمزنگاری به متغیرهای عددی تبدیل کرد. پیش از آن همه مقادیر ناموجود در مجموعه داده با استفاده از قطعه کد زیر پر می‌شود.

1df['Gender'].fillna(df['Gender'].mode()[0], inplace=True)
2df['Married'].fillna(df['Married'].mode()[0], inplace=True)
3df['Dependents'].fillna(df['Dependents'].mode()[0], inplace=True)
4df['Loan_Amount_Term'].fillna(df['Loan_Amount_Term'].mode()[0], inplace=True)
5df['Credit_History'].fillna(df['Credit_History'].mode()[0], inplace=True)
1 from sklearn.preprocessing import LabelEncoder
2var_mod = ['Gender','Married','Dependents','Education','Self_Employed','Property_Area','Loan_Status']
3le = LabelEncoder()
4for i in var_mod:
5    df[i] = le.fit_transform(df[i])
6df.dtypes

سپس، ماژول‌های مورد نیاز ایمپورت می‌شوند. پس از آن، یک تابع دسته‌بندی عمومی تعریف می‌شود که مدل را به عنوان ورودی دریافت کرده و  صحت و امتیازهای «اعتبارسنجی متقابل» (Cross-Validation) را تعیین می‌کند. با توجه به اینکه این مطلب یک نوشته جامع ولی مقدماتی است، به جزئیات کد زیر پرداخته نمی‌شود.

1#Import models from scikit learn module:
2from sklearn.linear_model import LogisticRegression
3from sklearn.cross_validation import KFold   #For K-fold cross validation
4from sklearn.ensemble import RandomForestClassifier
5from sklearn.tree import DecisionTreeClassifier, export_graphviz
6from sklearn import metrics
7
8#Generic function for making a classification model and accessing performance:
9def classification_model(model, data, predictors, outcome):
10  #Fit the model:
11  model.fit(data[predictors],data[outcome])
12  
13  #Make predictions on training set:
14  predictions = model.predict(data[predictors])
15  
16  #Print accuracy
17  accuracy = metrics.accuracy_score(predictions,data[outcome])
18  print ("Accuracy : %s" % "{0:.3%}".format(accuracy))
19
20  #Perform k-fold cross-validation with 5 folds
21  kf = KFold(data.shape[0], n_folds=5)
22  error = []
23  for train, test in kf:
24    # Filter training data
25    train_predictors = (data[predictors].iloc[train,:])
26    
27    # The target we're using to train the algorithm.
28    train_target = data[outcome].iloc[train]
29    
30    # Training the algorithm using the predictors and target.
31    model.fit(train_predictors, train_target)
32    
33    #Record error from each cross-validation run
34    error.append(model.score(data[predictors].iloc[test,:], data[outcome].iloc[test]))
35 
36  print ("Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error)))
37
38  #Fit the model again so that it can be refered outside the function:
39  model.fit(data[predictors],data[outcome])

رگرسیون لوجستیک

در ادامه یک مدل رگرسیون برای داده‌های موجود که پیش پردازش آن‌ها نیز انجام شده ساخته می‌شود. یک راهکار آن است که همه متغیرها به مدل داده شوند، ولیکن این امر موجب «بیش‌برازش» (Overfitting) می‌شود (برای افرادی که با این مبحث هنوز آشنایی ندارند جای نگرانی وجود ندارد). به بیان ساده، دریافت کلیه متغیرها ممکن است منجر به درک روابط پیچیده موجود به طور خاص در داده‌ها شود و مانع از عمومی‌سازی خوب مدل شود. این مطلب برای مطالعه بیشتر پیرامون رگرسیون لوجستیک توصیه می‌شود. می‌توان به سادگی از چند فرضیه برای شروع کار استفاده کرد. شانس دریافت وام بالاتر خواهد بود اگر:

  • متقاضیان دارای تاریخچه اعتباری باشند (این مورد در اکتشاف داده‌ها مشاهده شد)
  • متقاضایان و ضامن‌های آن‌ها درآمد ورودی بیشتری داشته باشند.
  • متقاضیان سطح تحصیلات بیشتری داشته باشند.
  • متقاضی دارای املاک در نواحی شهری با چشم‌انداز رشد بالا باشد.

با توجه به آنچه بیان شد، اولین مدل با «Credit_History» ساخته می‌شود.

1outcome_var = 'Loan_Status'
2model = LogisticRegression()
3predictor_var = ['Credit_History']
4classification_model(model, df,predictor_var,outcome_var)

صحت: %80.945 و امتیاز اعتبارسنجی متقابل: %80.946

1#We can try different combination of variables:
2predictor_var = ['Credit_History','Education','Married','Self_Employed','Property_Area']
3classification_model(model, df,predictor_var,outcome_var)

صحت: %80.945 و امتیاز اعتبارسنجی متقابل: %80.946

به‌طور کلی، انتظار می‌رود که با افزودن متغیرها صحت افزایش پیدا کند. اما این کار چالش برانگیزتر است. صحت و امتیاز اعتبارسنجی متقابل در حضور متغیرهای کم‌اهمیت‌تر تحت تاثیر قرار نمی‌گیرند. Credit_History وضعیت غالب است. اکنون دو گزینه وجود دارد.

  1. مهندسی ویژگی‌ها: اشتقاق اطلاعات جدید و تلاش برای پیش‌بینی آن‌ها. انجام این کار بسته به خلاقیت مخاطبان می‌تواند به صورت‌های گوناگونی انجام پذیرد.
  2. روش‌های مدل‌سازی بهتر. این رویکرد در ادامه مورد بررسی قرار می‌گیرد.

درخت تصمیم

درخت تصمیم (Decision Tree) راهکار دیگری برای ساخت یک مدل پیش‌بین است. این راهکار به داشتن صحت بالاتر نسبت به مدل رگرسیون لوجستیک شناخته شده است.

1model = DecisionTreeClassifier()
2predictor_var = ['Credit_History','Gender','Married','Education']
3classification_model(model, df,predictor_var,outcome_var)

صحت: %81.930 و امتیاز اعتبارسنجی متقابل: %76.656

در اینجا مدل مبتنی بر متغیرهای دسته‌ای نمی‌تواند تاثیر داشته باشد زیرا Credit History بر آن‌ها غلبه دارد. بنابراین، از چند متغیر عددی استفاده می‌شود.

1#We can try different combination of variables:
2predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log']
3classification_model(model, df,predictor_var,outcome_var)

صحت %92.345 و امتیاز اعتبارسنجی متقابل: %71.009

چنانکه مشهود است با افزودن متغیرها، صحت افزایش پیدا کرد و امتیاز اعتبارسنجی متقابل کاهش یافت. این مساله به دلیل آنکه مدل با داده‌ها بیش‌برازش شد به وقوع پیوسته است. اکنون یک الگوریتم پیچیده‌تر مورد استفاده قرار می گیرد تا نتایج حاصل از آن با روش درخت تصمیم و رگرسیون لوجستیک مقایسه شوند.

جنگل تصادفی

«جنگل تصادفی» (Random Forest) الگوریتم دیگری برای حل مسائل  دسته‌بندی محسوب می‌شود. مزیت این الگوریتم آن است که می‌تواند با همه ویژگی‌ها کار کند و یک ماتریس اهمیت ویژگی‌ها باز می‌گرداند که برای انتخاب ویژگی‌ها قابل استفاده است.

1model = RandomForestClassifier(n_estimators=100)
2predictor_var = ['Gender', 'Married', 'Dependents', 'Education',
3       'Self_Employed', 'Loan_Amount_Term', 'Credit_History', 'Property_Area',
4        'LoanAmount_log','TotalIncome_log']
5classification_model(model, df,predictor_var,outcome_var)

صحت: %100.000 و امتیاز اعتبارسنجی متقابل %78.179

در اینجا مشهود است که صحت مدل برای داده‌های آزمون %۱۰۰ است. این نهایت بیش‌برازش محسوب می‌شود و به دو شکل قابل حل است:

  1. کاهش تعداد پیش‌بین‌ها
  2. تنظیم پارامترهای مدل

در ادامه هر دو راهکار بالا بررسی می‌شوند. ابتدا ماتریس اهمیت ویژگی‌ها که بر اساس آن می‌توان مهم‌ترین ویژگی‌ها را گرفت مشاهده می‌شود.

1#Create a series with feature importances:
2featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
3print (featimp)

ماتریس اهمیت ویژگی‌ها

اکنون از ۵ متغیر بالاتر برای ساخت مدل استفاده می‌شود. همچنین، پارامترهای جنگل تصادفی نیز کمی تنظیم می‌شوند.

1model = RandomForestClassifier(n_estimators=25, min_samples_split=25, max_depth=7, max_features=1)
2predictor_var = ['TotalIncome_log','LoanAmount_log','Credit_History','Dependents','Property_Area']
3classification_model(model, df,predictor_var,outcome_var)

صحت: ٪82.899 و امتیاز اعتبارسنجی متقابل: %81.461

شایان توجه است که صحت مدل کاهش یافته اما امتیاز اعتبارسنجی متقابل افزایش یافته که نشان می‌دهد مدل به خوبی عمومی‌سازی شده. باید به خاطر داشت که مدل‌های جنگل تصادفی دقیقا قابل تکرار نیستند. به عبارت دیگر، اجراهای گوناگون منجر به تنوع ناچیزی به دلیل تصادفی‌سازی می‌شوند. اما خروجی نباید تغییر قابل توجهی داشته باشد. مشهود است که با انجام تنظیمات کمی در پارامترهای جنگل تصادفی، صحت اعتبارسنجی متقابل بهتری نسبت به رگرسیون لوجستیک به دست آمد. این تمرین یافته‌های قابل توجهی را در اختیار قرار می‌دهد.

  • استفاده از مدل‌های پیچیده‌تر الزاما منجر به نتایج بهتری نمی‌شود.
  • باید از استفاده از روش‌های مدل‌سازی پیچیده به عنوان جعبه سیاه بدون درک مفاهیم آن‌ها ممانعت کرد.
  • مهندسی ویژگی‌ها کلید موفقیت است. هر کسی می‌تواند از یک مدل  Xgboost استفاده کند ولی هنر و خلاقیت واقعی ارتقای ویژگی‌ها برای تناسب بهتر مدل است.

سخن پایانی

امید می‌رود که این راهنما توانسته باشد به علاقمندان علم داده و داده‌کاوی که تمایل داشتند در عمل نیز با بهره‌گیری از زبان پایتون به فعالیت بپردازند کمک کرده باشد. انتظار می‌رود این مطلب علاوه بر روش‌های پایه‌ای تحلیل، چگونگی تحلیل برخی از روش‌های پیچیده‌تر نیز که امروزه به وفور مورد استفاده قرار می‌گیرند کمک کرده باشد.

پایتون یک ابزار فوق‌العاده است که به یک زبان بسیار محبوب در میان دانشمندان داده مبدل شده است. از جمله دلایل این امر سادگی یادگیری آن، قابلیت یکپارچه‌سازی به خوبی با دیگر مجموعه داده‌ها و ابزارهایی مانند «Spark» و «Hadoop» است. در عین حال، پایتون دارای توانایی محاسباتی بسیار بالا و کتابخانه‌های تحلیل داده قدرتمندی است. بنابراین، یادگیری پایتون به منظور انجام هر آنچه در چرخه حیات یک پروژه تحلیل داده قابل اجرا است توصیه می‌شود.

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شود:

این مطلب با حمایت «موسسه آموزش عالی آزاد توسعه» نوشته شده است.

موسسه توسعه، به صورت تخصصی به آموزش علم داده می‌پردازد. کسانی که صلاحیت ورود به دوره را پیدا کنند، زیر نظر اساتید طی یک دوره شش ماهه با صبر و تمرین زیاد به یک دانشمند علم داده تبدیل می‌شوند.

اساتید توسعه در زمینه علم داده، سال‌ها در امریکا این موضوع را آموخته‌اند، پیاده‌سازی کرده‌‌اند و درس داده‌اند. برای آشنایی بیش‌تر با این دوره و مدرسین آن به این آدرس مراجعه کنید.

کالا، خدمات و برند خود را در کادر «حامی مطالب» مجله فرادرس معرفی کنید.
کلیک کنید

^^

بر اساس رای ۴۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
analyticsvidhya
۸ دیدگاه برای «یادگیری علم داده (Data Science) با پایتون — از صفر تا صد»

بسیار مفید بود.

قسمت Strings یک کلمه not کم است . نمی توانند تغییر کنند

با سلام؛

از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزارم. مرجع توضیحات مثال‌ها نوشتار فارسی است و در این مورد نیز کد مثال و خطای پایتون مربوط به آن مد نظر است نه توضیحات منبع اصلی که دارای تایپو است. تصویر این بخش اصلاح شد.

با احترام؛
پیروز، شاد وتندرست باشید.

خیلی مفید بود ممنون

مطالب مفید و توضیح شفاف بود سپاس فراوان?

واقعا عالی بود و ممنون

تشکر از زحمات شما برای ایجاد این مجموعه آموزشی

با سلام.
از محتوا استفاده کردم. خیل خوب و مفید توضیح داده شده بود.
با تشکر از شما

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *