الدليل النهائي للمجموعات الهرمية باستخدام Python وScikit-Learn PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.

الدليل النهائي للتسلسل الهرمي للمجموعات باستخدام Python و Scikit-Learn

المُقدّمة

في هذا الدليل ، سوف نركز على تنفيذ خوارزمية التجميع الهرمي باستخدام Scikit-Learn لحل مشكلة تسويقية.

بعد قراءة الدليل ، ستفهم:

  • متى يتم تطبيق نظام المجموعات الهرمي
  • كيفية تصور مجموعة البيانات لفهم ما إذا كانت مناسبة للتجميع
  • كيفية المعالجة المسبقة للميزات وهندسة الميزات الجديدة بناءً على مجموعة البيانات
  • كيفية تقليل أبعاد مجموعة البيانات باستخدام PCA
  • كيفية استخدام وقراءة مخطط الأسنان لفصل المجموعات
  • ما هي طرق الربط المختلفة ومقاييس المسافة المطبقة على مخططات التخطيط وخوارزميات التجميع
  • ما هي استراتيجيات التكتل والتقسيم وكيف تعمل
  • كيفية تنفيذ التجميع الهرمي التجميعي باستخدام Scikit-Learn
  • ما هي أكثر المشاكل شيوعًا عند التعامل مع خوارزميات التجميع وكيفية حلها

ملحوظة: يمكنك تنزيل الكمبيوتر الدفتري الذي يحتوي على كل التعليمات البرمجية الموجودة في هذا الدليل هنا.

التحفيز

تخيل سيناريو تكون فيه جزءًا من فريق علم البيانات الذي يتفاعل مع قسم التسويق. كان التسويق يجمع بيانات تسوق العملاء منذ فترة ، وهم يريدون أن يفهموا ، بناءً على البيانات التي تم جمعها ، إن وجدت أوجه التشابه بين العملاء. تقسم أوجه التشابه هذه العملاء إلى مجموعات ويساعد وجود مجموعات عملاء في استهداف الحملات والعروض الترويجية والتحويلات وبناء علاقات أفضل مع العملاء.

هل هناك طريقة يمكنك من خلالها المساعدة في تحديد العملاء المتشابهين؟ كم منهم ينتمون إلى نفس المجموعة؟ وكم عدد المجموعات المختلفة؟

إحدى طرق الإجابة على هذه الأسئلة هي استخدام ملف المجموعات الخوارزمية ، مثل K-Means و DBSCAN و Hierarchical Clustering وما إلى ذلك. بشكل عام ، تجد خوارزميات التجميع أوجه التشابه بين نقاط البيانات وتجميعها.

في هذه الحالة ، تكون بياناتنا التسويقية صغيرة إلى حد ما. لدينا معلومات عن 200 عميل فقط. بالنظر إلى فريق التسويق ، من المهم أن نوضح لهم بوضوح كيفية اتخاذ القرارات بناءً على عدد المجموعات ، وبالتالي نشرح لهم كيفية عمل الخوارزمية بالفعل.

نظرًا لأن بياناتنا صغيرة وقابلية التوضيح هي عامل رئيسي، يمكننا الاستفادة المجموعات الهرمية لحل هذه المشكلة. تُعرف هذه العملية أيضًا باسم تحليل المجموعات الهرمية (HCA).

تتمثل إحدى مزايا HCA في أنه قابل للتفسير ويعمل جيدًا على مجموعات البيانات الصغيرة.

شيء آخر يجب أخذه في الاعتبار في هذا السيناريو هو أن HCA عبارة عن ملف غير خاضعة للرقابة الخوارزمية. عند تجميع البيانات ، لن تكون لدينا طريقة للتحقق من أننا نحدد بشكل صحيح أن مستخدمًا ينتمي إلى مجموعة معينة (لا نعرف المجموعات). لا توجد تسميات لنا لمقارنة نتائجنا بها. إذا حددنا المجموعات بشكل صحيح ، فسيتم تأكيدها لاحقًا من قبل قسم التسويق على أساس يومي (كما تم قياسه بواسطة مقاييس مثل عائد الاستثمار ومعدلات التحويل وما إلى ذلك).

الآن بعد أن فهمنا المشكلة التي نحاول حلها وكيفية حلها ، يمكننا البدء في إلقاء نظرة على بياناتنا!

تحليل موجز للبيانات الاستكشافية

ملحوظة: يمكنك تنزيل مجموعة البيانات المستخدمة في هذا الدليل هنا.

بعد تنزيل مجموعة البيانات ، لاحظ أنه ملف CSV (قيم مفصولة بفواصل) دعا ملف shopping-data.csv. لتسهيل استكشاف البيانات ومعالجتها ، سنقوم بتحميلها في ملف DataFrame باستخدام الباندا:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

وقالت شركة التسويق إنها جمعت 200 سجل للعملاء. يمكننا التحقق مما إذا كانت البيانات التي تم تنزيلها كاملة بـ 200 صف باستخدام ملف shape ينسب. سيخبرنا بعدد الصفوف والأعمدة لدينا ، على التوالي:

customer_data.shape

وينتج عنه:

(200, 5)

رائعة! بياناتنا كاملة مع 200 صف (سجلات العميل) ولدينا أيضًا 5 أعمدة (الميزات). لمعرفة الخصائص التي جمعها قسم التسويق من العملاء ، يمكننا رؤية أسماء الأعمدة بامتداد columns ينسب. للقيام بذلك ، قم بتنفيذ:

customer_data.columns

يعود البرنامج النصي أعلاه:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

هنا ، نرى أن التسويق قد أدى إلى إنشاء ملف CustomerID، جمعت ال Genre, Age, Annual Income (بآلاف الدولارات) ، وأ Spending Score الانتقال من 1 إلى 100 لكل عميل من 200 عميل. عندما سئلوا عن التوضيح ، قالوا أن القيم الموجودة في Spending Score يشير العمود إلى عدد المرات التي ينفق فيها شخص ما المال في مركز تجاري بمقياس من 1 إلى 100. وبعبارة أخرى ، إذا حصل العميل على درجة 0 ، فإن هذا الشخص لا ينفق المال أبدًا ، وإذا كانت النتيجة 100 ، فقد اكتشفنا للتو الأكثر إنفاقا.

دعنا نلقي نظرة سريعة على توزيع هذه النتيجة لفحص عادات الإنفاق للمستخدمين في مجموعة البيانات الخاصة بنا. هذا هو المكان الذي تعيش فيه الباندا hist() تأتي الطريقة للمساعدة:

customer_data['Spending Score (1-100)'].hist()

IMG

من خلال النظر إلى الرسم البياني ، نرى أن أكثر من 35 عميلًا حصلوا على درجات بين 40 و 60، ثم أقل من 25 لديهم درجات بين 70 و 80. لذا فإن معظم عملائنا هم كذلك المنفقون المتوازنون، يليه المنفقون المعتدلون إلى المرتفعون. يمكننا أن نرى أيضًا أن هناك سطرًا بعد ذلك 0على يسار التوزيع وسطر آخر قبل 100 على يمين التوزيع. ربما تعني هذه المساحات الفارغة أن التوزيع لا يحتوي على غير المنفقين ، والذي سيكون له درجة 0، وأنه لا يوجد أيضًا منفقون مرتفعون بدرجة 100.

للتحقق مما إذا كان هذا صحيحًا ، يمكننا النظر إلى الحد الأدنى والحد الأقصى لقيم التوزيع. يمكن العثور على هذه القيم بسهولة كجزء من الإحصاء الوصفي ، حتى نتمكن من استخدام describe() طريقة لفهم توزيعات القيم الرقمية الأخرى:


customer_data.describe().transpose()

سيعطينا هذا جدولًا يمكننا من خلاله قراءة توزيعات القيم الأخرى لمجموعة البيانات الخاصة بنا:

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

تم تأكيد فرضيتنا. ال min قيمة Spending Score is 1 والحد الأقصى هو 99. لذلك ليس لدينا 0 or 100 المنفقون النتيجة. لنلقِ نظرة بعد ذلك على الأعمدة الأخرى للمحوّل describe الطاولة. عند النظر إلى mean و std الأعمدة ، يمكننا أن نرى ذلك من أجل Age ال mean is 38.85 و std ما يقرب من 13.97. نفس الشيء يحدث ل Annual Income، مع mean of 60.56 و std 26.26ولل Spending Score مع mean of 50 و std of 25.82. لجميع الميزات ، فإن mean بعيدًا عن الانحراف المعياري الذي يشير بياناتنا لديها تقلبات عالية.

لفهم كيفية اختلاف بياناتنا بشكل أفضل ، دعنا نرسم Annual Income توزيع:

customer_data['Annual Income (k$)'].hist()

والتي ستعطينا:

IMG

لاحظ في الرسم البياني أن معظم بياناتنا ، أكثر من 35 عميلًا ، تتركز بالقرب من الرقم 60، على موقعنا mean، في المحور الأفقي. لكن ماذا يحدث عندما نتحرك نحو نهايات التوزيع؟ عندما نتجه نحو اليسار ، من المتوسط ​​60.560 دولارًا ، فإن القيمة التالية التي سنواجهها هي 34.300 دولار - المتوسط ​​(60.560 دولارًا) مطروحًا منه التباين القياسي (26.260 دولارًا). إذا ذهبنا بعيدًا إلى يسار توزيع البيانات لدينا ، يتم تطبيق قاعدة مماثلة ، فإننا نطرح التباين القياسي (26.260 دولارًا) من القيمة الحالية (34.300 دولارًا). لذلك ، سنواجه قيمة 8.040 دولارًا أمريكيًا (أو ما يعادله بالعملة المحلية). لاحظ كيف انتقلت بياناتنا من 60 ألف دولار إلى 8 آلاف دولار بسرعة. إنه "يقفز" 26.260 دولارًا في كل مرة - متفاوتًا كثيرًا ، ولهذا السبب لدينا مثل هذا التباين العالي.

IMG

يعتبر التباين وحجم البيانات مهمين في تحليل المجموعات لأن قياسات المسافة لمعظم خوارزميات التجميع حساسة لأحجام البيانات. يمكن للاختلاف في الحجم أن يغير نتائج التجميع من خلال جعل نقطة واحدة تبدو أقرب أو أكثر بعدًا إلى أخرى مما هي عليه في الواقع ، مما يؤدي إلى تشويه التجميع الفعلي للبيانات.

حتى الآن ، رأينا شكل بياناتنا ، وبعض توزيعاتها ، والإحصاءات الوصفية. باستخدام Pandas ، يمكننا أيضًا سرد أنواع البيانات الخاصة بنا ومعرفة ما إذا كانت جميع صفوفنا البالغ عددها 200 مملوءة أو بها بعض null القيم:

customer_data.info()

وينتج عنه:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

هنا ، يمكننا أن نرى أنه لا يوجد null القيم في البيانات وأن لدينا عمودًا فئويًا واحدًا فقط - Genre. في هذه المرحلة ، من المهم أن نضع في اعتبارنا الميزات التي تبدو مثيرة للاهتمام لإضافتها إلى نموذج التجميع. إذا أردنا إضافة عمود النوع إلى نموذجنا ، فسنحتاج إلى تحويل قيمه من قاطع إلى عددي.

دعونا نرى كيف Genre يتم ملؤها من خلال إلقاء نظرة سريعة على القيم الخمس الأولى لبياناتنا:

customer_data.head() 

وينتج عنه:

    CustomerID 	Genre 	Age 	Annual Income (k$) 	Spending Score (1-100)
0 	1 			Male 	19 		15 					39
1 	2 			Male 	21 		15 					81
2 	3 			Female 	20 		16 					6
3 	4 			Female 	23 		16 					77
4 	5 			Female 	31 		17 					40

يبدو أن لديها فقط Female و Male التصنيفات. يمكننا التأكد من ذلك من خلال إلقاء نظرة على قيمه الفريدة من خلال unique:

customer_data['Genre'].unique()

هذا يؤكد افتراضنا:

array(['Male', 'Female'], dtype=object)

حتى الآن ، نعلم أن لدينا نوعين فقط ، إذا كنا نخطط لاستخدام هذه الميزة في نموذجنا ، Male يمكن أن تتحول إلى 0 و Female إلى 1. من المهم أيضًا التحقق من التناسب بين الأنواع ، لمعرفة ما إذا كانت متوازنة. يمكننا أن نفعل ذلك مع value_counts() الطريقة وحجتها normalize=True لإظهار النسبة المئوية بين Male و Female:

customer_data['Genre'].value_counts(normalize=True)

هذا ينتج:

Female    0.56
Male      0.44
Name: Genre, dtype: float64

لدينا 56٪ من النساء في مجموعة البيانات و 44٪ من الرجال. الفرق بينهما هو 16٪ فقط ، وبياناتنا ليست 50/50 بل هي كذلك متوازن بما فيه الكفاية لا تسبب أي مشكلة. إذا كانت النتائج 70/30 ، 60/40 ، فقد تكون هناك حاجة إما لجمع المزيد من البيانات أو لاستخدام نوع من تقنيات زيادة البيانات لجعل هذه النسبة أكثر توازناً.

حتى الآن ، كل الميزات ولكن Age، تم استكشافها بإيجاز. فيما يتعلق Age، من المثير للاهتمام عادةً تقسيمها إلى صناديق لتتمكن من تقسيم العملاء بناءً على فئاتهم العمرية. إذا فعلنا ذلك ، فسنحتاج إلى تحويل الفئات العمرية إلى رقم واحد قبل إضافتها إلى نموذجنا. بهذه الطريقة ، بدلاً من استخدام الفئة 15-20 عامًا ، سنحسب عدد العملاء الموجودين في 15-20 الفئة ، وسيكون هذا رقمًا في عمود جديد يسمى 15-20.

المشورة: في هذا الدليل ، نقدم فقط تحليلًا موجزًا ​​للبيانات الاستكشافية. ولكن يمكنك أن تذهب أبعد من ذلك ويجب أن تذهب أبعد من ذلك. يمكنك معرفة ما إذا كانت هناك فروق في الدخل واختلافات في الدرجات بناءً على النوع والعمر. هذا لا يثري التحليل فحسب ، بل يؤدي إلى نتائج أفضل للنموذج. للتعمق في تحليل البيانات الاستكشافية ، تحقق من فصل جمعية الإمارات للغوص في "التدريب العملي على توقع أسعار المنازل - التعلم الآلي في بايثون" مشروع موجه.

بعد التخمين بشأن ما يمكن عمله بكل من الفئتين - أو القاطع - Genre و Age أعمدة ، دعنا نطبق ما تم مناقشته.

متغيرات الترميز وهندسة الميزات

لنبدأ بقسمة Age إلى مجموعات تختلف في 10 ، بحيث يكون لدينا 20-30 ، 30-40 ، 40-50 ، وهكذا. نظرًا لأن أصغر عميل لدينا يبلغ من العمر 15 عامًا ، يمكننا أن نبدأ في سن 15 عامًا وننتهي في سن 70 ، وهو عمر أقدم عميل في البيانات. بدءًا من 15 ، وانتهاءً بالرقم 70 ، سيكون لدينا فترات 15-20 ، و 20-30 ، و 30-40 ، و40-50 ، و50-60 ، و60-70.

إلى مجموعة أو بن Age القيم في هذه الفترات ، يمكننا استخدام الباندا cut() طريقة لتقطيعها إلى صناديق ثم تعيين الصناديق إلى ملف جديد Age Groups عمود:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

وينتج عنه:

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

لاحظ أنه عند النظر إلى قيم العمود ، يوجد أيضًا سطر يحدد أن لدينا 6 فئات ويعرض جميع فترات البيانات المجمعة. بهذه الطريقة ، قمنا بتصنيف بياناتنا الرقمية السابقة وإنشاء ملف Age Groups ميزة.

وكم عدد العملاء لدينا في كل فئة؟ يمكننا أن نعرف ذلك بسرعة عن طريق تجميع العمود وعد القيم به groupby() و count():

customer_data.groupby('Age Groups')['Age Groups'].count()

وينتج عنه:

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

من السهل ملاحظة أن معظم العملاء تتراوح أعمارهم بين 30 و 40 عامًا ، يليهم العملاء الذين تتراوح أعمارهم بين 20 و 30 عامًا ثم العملاء الذين تتراوح أعمارهم بين 40 و 50 عامًا. هذه أيضًا معلومات جيدة لقسم التسويق.

في الوقت الحالي ، لدينا متغيرين فئويين ، Age و Genre، والتي نحتاج إلى تحويلها إلى أرقام حتى نتمكن من استخدامها في نموذجنا. هناك العديد من الطرق المختلفة لإجراء هذا التحول - سوف نستخدم الباندا get_dummies() الطريقة التي تنشئ عمودًا جديدًا لكل فاصل زمني ونوع ، ثم تملأ قيمها بـ 0s و 1s- يسمى هذا النوع من العمليات ترميز واحد ساخن. دعونا نرى كيف يبدو:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

سيعطينا هذا عرضًا أوليًا للجدول الناتج:

IMG

مع الإخراج ، من السهل رؤية هذا العمود Genre تم تقسيمها إلى أعمدة - Genre_Female و Genre_Male. عندما تكون الزبون أنثى ، Genre_Female مساوي ل 1، وعندما يكون العميل ذكرًا ، فهو يساوي 0.

أيضا، Age Groups تم تقسيم العمود إلى 6 أعمدة ، واحد لكل فترة زمنية ، مثل Age Groups_(15, 20], Age Groups_(20, 30]، وهلم جرا. في نفس الطريقة كما Genre، عندما يبلغ العميل 18 عامًا ، فإن Age Groups_(15, 20] القيمة 1 وقيمة جميع الأعمدة الأخرى 0.

ميزة من الترميز الحار هو البساطة في تمثيل قيم العمود ، فمن السهل فهم ما يحدث - أثناء مساوئ هو أننا أنشأنا الآن 8 أعمدة إضافية ، لتلخيص الأعمدة التي لدينا بالفعل.

تحذير: إذا كانت لديك مجموعة بيانات يتجاوز فيها عدد الأعمدة المشفرة ذات درجة حرارة واحدة عدد الصفوف ، فمن الأفضل استخدام طريقة تشفير أخرى لتجنب مشكلات أبعاد البيانات.

يضيف الترميز الواحد الساخن أيضًا 0 ثانية إلى بياناتنا ، مما يجعلها أكثر ندرة ، مما قد يمثل مشكلة لبعض الخوارزميات الحساسة لتباين البيانات.

بالنسبة لاحتياجات التجميع لدينا ، يبدو أن الترميز الواحد الساخن يعمل. لكن يمكننا رسم البيانات لمعرفة ما إذا كانت هناك بالفعل مجموعات متميزة لنا لتجميعها.

التخطيط الأساسي وتقليل الأبعاد

تحتوي مجموعة البيانات الخاصة بنا على 11 عمودًا ، وهناك بعض الطرق التي يمكننا من خلالها تصور تلك البيانات. الأول عن طريق رسمه في 10 أبعاد (حظًا سعيدًا في ذلك). عشرة لأن Customer_ID العمود لا يتم النظر فيه. الثاني هو عن طريق رسم السمات العددية الأولية ، والثالث عن طريق تحويل ميزاتنا العشر إلى 10 - وبالتالي ، إجراء تقليل الأبعاد.

رسم كل زوج من البيانات

نظرًا لأن رسم 10 أبعاد أمر مستحيل بعض الشيء ، فسنختار اتباع الطريقة الثانية - سنقوم برسم ميزاتنا الأولية. يمكننا اختيار اثنين منهم لتحليلنا العنقودي. إحدى الطرق التي يمكننا من خلالها رؤية جميع أزواج البيانات لدينا مجتمعة هي باستخدام Seaborn pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

الذي يعرض:

IMG

في لمحة ، يمكننا تحديد المخططات المبعثرة التي يبدو أنها تحتوي على مجموعات من البيانات. واحد يبدو مثيرًا للاهتمام هو مخطط التشتت الذي يجمع Annual Income و Spending Score. لاحظ أنه لا يوجد فصل واضح بين مخططات التشتت المتغيرة الأخرى. على الأكثر ، يمكننا أن نقول أن هناك تركيزين متميزين للنقاط في Spending Score vs Age مبعثر.

كلا المخططات المبعثرة تتكون من Annual Income و Spending Score هي في الأساس نفس الشيء. يمكننا رؤيته مرتين لأن المحورين x و y تم تبديلهما. من خلال إلقاء نظرة على أي منها ، يمكننا أن نرى ما يبدو أنه خمس مجموعات مختلفة. دعونا نرسم هاتين الميزتين فقط مع Seaborn scatterplot() لإلقاء نظرة فاحصة:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

IMG

بالنظر عن كثب ، يمكننا بالتأكيد التمييز بين 5 مجموعات مختلفة من البيانات. يبدو أنه يمكن تجميع عملائنا بناءً على مقدار ما يكسبونه في السنة ومقدار ما ينفقونه. هذه نقطة أخرى ذات صلة في تحليلنا. من المهم أن نأخذ سمتين فقط في الاعتبار لتجميع عملائنا. أي معلومات أخرى لدينا عنهم لا تدخل المعادلة. يعطي هذا المعنى للتحليل - إذا عرفنا مقدار ما يكسبه العميل وينفقه ، فيمكننا بسهولة العثور على أوجه التشابه التي نحتاجها.

IMG

ذلك رائع! حتى الآن ، لدينا بالفعل متغيرين لبناء نموذجنا. إلى جانب ما يمثله هذا ، فإنه يجعل النموذج أيضًا أبسط وبخلًا وأكثر قابلية للتفسير.

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

ملحوظة: يفضل علم البيانات عادة الأساليب البسيطة قدر الإمكان. ليس فقط لأنه من الأسهل الشرح للأعمال ، ولكن أيضًا لأنه أكثر مباشرة - مع ميزتين ونموذج قابل للتفسير ، فمن الواضح ما يفعله النموذج وكيف يعمل.

رسم البيانات بعد استخدام PCA

يبدو أن نهجنا الثاني هو الأفضل على الأرجح ، ولكن دعنا نلقي نظرة أيضًا على منهجنا الثالث. يمكن أن يكون مفيدًا عندما لا يمكننا رسم البيانات لأنها تحتوي على أبعاد كثيرة جدًا ، أو عندما لا توجد تركيزات بيانات أو فصل واضح في المجموعات. عند حدوث هذه المواقف ، يوصى بمحاولة تقليل أبعاد البيانات باستخدام طريقة تسمى تحليل المكونات الرئيسية (PCA).

ملحوظة: يستخدم معظم الناس PCA لتقليل الأبعاد قبل التصور. هناك طرق أخرى تساعد في تصور البيانات قبل التجميع ، مثل التجميع المكاني القائم على الكثافة للتطبيقات ذات الضوضاء (DBSCAN) و خرائط ذاتية التنظيم (SOM) تجمع. كلاهما عبارة عن خوارزميات تجميع ، ولكن يمكن أيضًا استخدامهما لتصور البيانات. نظرًا لأن تحليل المجموعات ليس له معيار ذهبي ، فمن المهم مقارنة التصورات المختلفة والخوارزميات المختلفة.

سيقلل PCA من أبعاد بياناتنا بينما يحاول الحفاظ على أكبر قدر ممكن من المعلومات. دعنا أولاً نحصل على فكرة حول كيفية عمل PCA ، ومن ثم يمكننا اختيار عدد أبعاد البيانات التي سنقوم بتقليل بياناتنا إليها.

لكل زوج من الميزات ، يرى PCA ما إذا كانت القيم الأكبر لمتغير واحد تتوافق مع القيم الأكبر للمتغير الآخر ، ويفعل الشيء نفسه للقيم الأقل. لذلك ، فإنه يحسب بشكل أساسي مدى اختلاف قيم الميزات تجاه بعضها البعض - نسميها التغاير. ثم يتم تنظيم هذه النتائج في مصفوفة ، والحصول على مصفوفة التغاير.

بعد الحصول على مصفوفة التغاير ، تحاول PCA العثور على مجموعة خطية من الميزات التي تشرحها على أفضل وجه - فهي تناسب النماذج الخطية حتى تحدد تلك التي تشرح أقصى مقدار التباين.

ملاحظات: PCA هو تحويل خطي ، والخطية حساسة لمقياس البيانات. لذلك ، تعمل PCA بشكل أفضل عندما تكون جميع قيم البيانات على نفس المقياس. يمكن القيام بذلك عن طريق طرح العمود تعني من قيمها وقسمة النتيجة على انحرافها المعياري. هذا يسمى توحيد البيانات. قبل استخدام PCA ، تأكد من تحجيم البيانات! إذا لم تكن متأكدًا من كيفية القيام بذلك ، فاقرأ "ميزة تحجيم البيانات باستخدام Scikit-Learn للتعلم الآلي في Python"!

مع العثور على أفضل خط (تركيبة خطية) ، تحصل PCA على اتجاهات محاورها ، المسماة المتجهات الذاتية، ومعاملاتها الخطية ، فإن القيم الذاتية. الجمع بين المتجهات الذاتية والقيم الذاتية - أو اتجاهات المحاور والمعاملات - هي المكونات الرئيسية من PCA. وهذا هو الوقت الذي يمكننا فيه اختيار عدد الأبعاد الخاصة بنا بناءً على التباين الموضح لكل ميزة ، من خلال فهم المكونات الأساسية التي نريد الاحتفاظ بها أو تجاهلها بناءً على مقدار التباين الذي تفسره.

بعد الحصول على المكونات الرئيسية ، يستخدم PCA المتجهات الذاتية لتشكيل متجه من الميزات التي تعيد توجيه البيانات من المحاور الأصلية إلى تلك التي تمثلها المكونات الرئيسية - هكذا يتم تقليل أبعاد البيانات.

ملحوظة: أحد التفاصيل المهمة التي يجب مراعاتها هنا هو أنه نظرًا لطبيعته الخطية ، ستركز PCA معظم التباين الموضح في المكونات الرئيسية الأولى. لذلك ، عند النظر إلى التباين الموضح ، عادةً ما يكون المكونان الأولان كافيين. لكن قد يكون هذا مضللًا في بعض الحالات - لذا حاول الاستمرار في مقارنة المؤامرات والخوارزميات المختلفة عند التجميع لمعرفة ما إذا كانت تحمل نتائج مماثلة.

قبل تطبيق PCA ، نحتاج إلى الاختيار بين Age العمود أو Age Groups أعمدة في بياناتنا المشفرة سابقًا. نظرًا لأن كلا العمودين يمثلان نفس المعلومات ، فإن إدخالها مرتين يؤثر على تباين البيانات لدينا. إذا كان Age Groups تم اختيار العمود ، ما عليك سوى إزالة ملف Age العمود باستخدام الباندا drop() طريقة وإعادة تعيينه إلى customer_data_oh المتغير:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

تحتوي بياناتنا الآن على 10 أعمدة ، مما يعني أنه يمكننا الحصول على مكون رئيسي واحد حسب العمود واختيار عدد منها الذي سنستخدمه عن طريق قياس مقدار تقديم بُعد واحد جديد يوضح المزيد من تباين البيانات لدينا.

لنفعل ذلك مع Scikit-Learn PCA. سنحسب التباين الموضح لكل بُعد ، معطى بواسطة explained_variance_ratio_ ، ثم انظر إلى مجموعها التراكمي مع cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

الفروق التراكمية الموضحة لدينا هي:

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

يمكننا أن نرى أن البعد الأول يفسر 50٪ من البيانات ، وعند دمجها مع البعد الثاني ، فإنها تفسر 99٪. هذا يعني أن البعدين الأولين يفسران بالفعل 2٪ من بياناتنا. حتى نتمكن من تطبيق PCA مع مكونين ، والحصول على المكونات الرئيسية لدينا ورسمها:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

IMG

مخطط البيانات بعد PCA مشابه جدًا للمخطط الذي يستخدم عمودين فقط من البيانات بدون PCA. لاحظ أن النقاط التي تشكل المجموعات أقرب ، وأكثر تركيزًا بعد PCA من ذي قبل.

IMG

تصور الهيكل الهرمي مع Dendrograms

حتى الآن ، قمنا باستكشاف البيانات ، والأعمدة الفئوية المشفرة ، وتحديد الأعمدة المناسبة للتجميع ، وتقليل أبعاد البيانات. تشير المخططات إلى أن لدينا 5 مجموعات في بياناتنا ، ولكن هناك أيضًا طريقة أخرى لتصور العلاقات بين نقاطنا والمساعدة في تحديد عدد المجموعات - من خلال إنشاء مخطط شجر الأسنان (خطأ إملائي شائع مثل مخطط الأسنان). ديندرو يعني شجرة باللاتيني.

مخطط شجر الأسنان هو نتيجة ربط النقاط في مجموعة البيانات. إنه تمثيل مرئي لعملية التجميع الهرمي. وكيف تعمل عملية التجميع الهرمي؟ حسنًا ... هذا يعتمد - ربما إجابة سمعتها كثيرًا بالفعل في علوم البيانات.

فهم المجموعات الهرمية

عندما خوارزمية التجميع الهرمي (HCA) يبدأ في ربط النقاط والعثور على مجموعات ، يمكنه أولاً تقسيم النقاط إلى مجموعتين كبيرتين ، ثم تقسيم كل مجموعة من هاتين المجموعتين إلى مجموعتين أصغر ، بها 2 مجموعات في المجموع ، وهي مسبب للخلاف و من أعلى إلى أسفل النهج.

بدلاً من ذلك ، يمكنه القيام بالعكس - يمكنه إلقاء نظرة على جميع نقاط البيانات ، والعثور على نقطتين أقرب لبعضهما البعض ، وربطهما ، ثم العثور على النقاط الأخرى الأقرب لتلك النقاط المرتبطة واستمر في بناء المجموعتين من تصاعدي. وهو تكتلي نهج سوف نطور.

خطوات أداء التجميع الهرمي التجميعي

لجعل النهج التجميعي واضحًا ، هناك خطوات لـ التكتل الهرمي التجميعي (AHC) الخوارزمية:

  1. في البداية ، تعامل مع كل نقطة بيانات على أنها مجموعة واحدة. لذلك ، سيكون عدد المجموعات في البداية K - بينما K هو عدد صحيح يمثل عدد نقاط البيانات.
  2. قم بتكوين كتلة من خلال الانضمام إلى أقرب نقطتي بيانات مما أدى إلى مجموعات K-1.
  3. قم بتشكيل المزيد من المجموعات من خلال الانضمام إلى أقرب مجموعتين مما أدى إلى مجموعات K-2.
  4. كرر الخطوات الثلاث المذكورة أعلاه حتى يتم تكوين كتلة واحدة كبيرة.

ملاحظات: للتبسيط ، نقول "أقرب نقطتي بيانات" في الخطوتين 2 و 3. ولكن هناك المزيد من الطرق لربط النقاط كما سنرى بعد قليل.

إذا قمت بعكس خطوات خوارزمية ACH ، فانتقل من 4 إلى 1 - ستكون هذه هي الخطوات إلى *المجموعات الهرمية الانقسامية (DHC) *.

لاحظ أن HCAs يمكن أن تكون إما مثيرة للانقسام ومن أعلى إلى أسفل ، أو تكتلية ومن أسفل إلى أعلى. يعمل نهج DHC التنازلي بشكل أفضل عندما يكون لديك مجموعات أقل ولكن أكبر ، وبالتالي يكون أكثر تكلفة من الناحية الحسابية. من ناحية أخرى ، فإن نهج AHC التصاعدي مناسب عندما يكون لديك العديد من المجموعات الأصغر. إنه أبسط من الناحية الحسابية وأكثر استخدامًا وأكثر توفرًا.

ملحوظة: إما من أعلى إلى أسفل أو من أسفل إلى أعلى ، فإن تمثيل مخطط الأسنان لعملية التجميع سيبدأ دائمًا بتقسيم إلى قسمين وينتهي به الأمر مع تمييز كل نقطة فردية ، بمجرد أن يكون هيكلها الأساسي من شجرة ثنائية.

دعنا نرسم مخطط شجر بيانات العملاء لدينا لتصور العلاقات الهرمية للبيانات. هذه المرة ، سوف نستخدم ملف scipy مكتبة لإنشاء مخطط مخطط الأسنان لمجموعة البيانات الخاصة بنا:

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

يبدو إخراج البرنامج النصي كما يلي:

IMG

في النص أعلاه ، أنشأنا المجموعات والمجموعات الفرعية بنقاطنا ، وحددنا كيفية ارتباط نقاطنا (من خلال تطبيق ward طريقة) ، وكيفية قياس المسافة بين النقاط (باستخدام euclidean قياس).

باستخدام مخطط مخطط الأسنان ، يمكن تصور العمليات الموصوفة لـ DHC و AHC. لتصور النهج من أعلى إلى أسفل ، ابدأ من الجزء العلوي من مخطط الأسنان وانزل ، وافعل العكس ، وابدأ لأسفل وتحرك لأعلى لتصور النهج من الأسفل إلى الأعلى.

طرق الربط

هناك العديد من طرق الربط الأخرى ، من خلال فهم المزيد حول كيفية عملها ، ستتمكن من اختيار الطريقة المناسبة لاحتياجاتك. بالإضافة إلى ذلك ، كل واحد منهم سوف يسفر عن نتائج مختلفة عند تطبيقه. لا توجد قاعدة ثابتة في التحليل العنقودي ، إن أمكن ، قم بدراسة طبيعة المشكلة لمعرفة أيها يناسبها بشكل أفضل ، واختبار الطرق المختلفة ، وفحص النتائج.

بعض طرق الربط هي:

  • وصلة واحدة: كما يشار إلى أقرب الجار (NN). يتم تحديد المسافة بين المجموعات من خلال المسافة بين أقرب أعضائها.

IMG

  • ربط كامل: كما يشار إلى أبعد الجار (FN), خوارزمية أبعد نقطةالطرق أو خوارزمية فور هيز. يتم تحديد المسافة بين المجموعات من خلال المسافة بين أعضائها الأبعد. هذه الطريقة مكلفة حسابيا.

IMG

  • متوسط ​​الارتباط: المعروف أيضًا باسم UPGMA (طريقة مجموعة الأزواج غير الموزونة بمتوسط ​​حسابي). يتم حساب النسبة المئوية لعدد النقاط لكل مجموعة فيما يتعلق بعدد نقاط المجموعتين إذا تم دمجهما.

IMG

  • الارتباط المرجح: المعروف أيضًا باسم WPGMA (طريقة مجموعة الأزواج الموزونة بمتوسط ​​حسابي). تساهم النقاط الفردية للمجموعتين في المسافة الإجمالية بين مجموعة أصغر وأكبر.
  • الربط المركزي: كما يشار إلى UPGMC (طريقة مجموعة الزوج غير الموزون باستخدام Centroids). يتم حساب النقطة المحددة بمتوسط ​​جميع النقاط (النقطه الوسطى) لكل مجموعة والمسافة بين المجموعات هي المسافة بين النقطتين الوسطى لكل منهما.

IMG

  • ربط الجناح: المعروف أيضا باسم ميسك (الزيادة الدنيا لمجموع المربعات). تحدد المسافة بين مجموعتين ، وتحسب مجموع خطأ المربعات (ESS) ، وتختار المجموعات التالية على التوالي بناءً على ESS الأصغر. تسعى طريقة وارد إلى تقليل زيادة ESS في كل خطوة. لذلك ، تقليل الخطأ.

IMG

مقاييس المسافة

إلى جانب الارتباط ، يمكننا أيضًا تحديد بعض مقاييس المسافة الأكثر استخدامًا:

  • الإقليدية: كما يشار إلى فيثاغورس أو خط مستقيم مسافه: بعد. يحسب المسافة بين نقطتين في الفضاء ، عن طريق قياس طول قطعة مستقيمة تمر بينهما. يستخدم نظرية فيثاغورس وقيمة المسافة هي النتيجة (C) من المعادلة:

$$
ج ^ 2 = أ ^ 2 + ب ^ 2
$$

  • مانهاتن: وتسمى أيضا كتلة المدينة ، تاكسي مسافه: بعد. إنه مجموع الاختلافات المطلقة بين المقاييس في جميع أبعاد نقطتين. إذا كانت هذه الأبعاد ثنائية ، فهي مماثلة لعمل اليمين ثم اليسار عند المشي في كتلة واحدة.

IMG

  • مينكوفسكي: إنه تعميم للمسافات الإقليدية ومانهاتن. إنها طريقة لحساب المسافات بناءً على الاختلافات المطلقة في ترتيب مقياس Minkowski p. على الرغم من أنه يتم تعريفه لأي ص> 0، نادرًا ما يتم استخدامه لقيم أخرى غير 1 و 2 و (لانهائي). مسافة مينكوفسكي هي نفس مسافة مانهاتن عندما P = 1، ونفس المسافة الإقليدية عندما P = 2.

$$
Dleft (X، Yright) = يسار (sum_ {i = 1} ^ n | x_i-y_i | ^ pright) ^ {frac {1} {p}}
$$

IMG

  • تشيبيشيف: المعروف أيضًا باسم رقعة الشطرنج مسافه: بعد. إنها الحالة القصوى لمسافة مينكوفسكي. عندما نستخدم اللانهاية كقيمة للمعامل ع (ع = ∞)، ينتهي بنا الأمر بمقياس يحدد المسافة على أنها أقصى فرق مطلق بين الإحداثيات.
  • جيب التمام: هي مسافة جيب التمام الزاوية بين تسلسلين من النقاط ، أو المتجهات. تشابه جيب التمام هو حاصل الضرب النقطي للمتجهات مقسومًا على حاصل ضرب أطوالها.
  • جاكارد: يقيس التشابه بين مجموعات محدودة من النقاط. يتم تعريفه على أنه العدد الإجمالي للنقاط (العلاقة الأساسية) في النقاط المشتركة في كل مجموعة (تقاطع) ، مقسومًا على العدد الإجمالي للنقاط (العلاقة الأساسية) لإجمالي النقاط لكلتا المجموعتين (الاتحاد).
  • جنسن شانون: استنادًا إلى اختلاف Kullback-Leibler. يأخذ في الاعتبار التوزيعات الاحتمالية للنقاط ويقيس التشابه بين تلك التوزيعات. إنها طريقة شائعة لنظرية الاحتمالات والإحصاء.

لقد اخترنا جناح و الإقليدية لمخطط dendrogram لأنها الطريقة والمقاييس الأكثر استخدامًا. عادةً ما تعطي نتائج جيدة نظرًا لأن نقاط روابط Ward تستند إلى تقليل الأخطاء ، وتعمل Euclidean بشكل جيد في الأبعاد الأقل.

في هذا المثال ، نعمل مع ميزتين (عمودين) لبيانات التسويق و 200 ملاحظة أو صف. نظرًا لأن عدد المشاهدات أكبر من عدد الميزات (200> 2) ، فإننا نعمل في مساحة منخفضة الأبعاد.

عندما يكون عدد الميزات (F) أكبر من عدد المشاهدات (N) - يكتب في الغالب باسم و >> ن، فهذا يعني أن لدينا ملف مساحة عالية الأبعاد.

إذا أردنا تضمين المزيد من السمات ، لذلك لدينا أكثر من 200 ميزة ، فقد لا تعمل المسافة الإقليدية بشكل جيد ، لأنها ستواجه صعوبة في قياس جميع المسافات الصغيرة في مساحة كبيرة جدًا تزداد فقط. بمعنى آخر ، يواجه نهج المسافة الإقليدية صعوبات في التعامل مع البيانات تناثر. هذه قضية تسمى لعنة الأبعاد. ستصبح قيم المسافة صغيرة جدًا ، كما لو كانت "مخففة" في المساحة الأكبر ، مشوهة حتى تصبح 0.

ملحوظة: إذا واجهت مجموعة بيانات مع و >> ص، ستستخدم على الأرجح مقاييس المسافة الأخرى ، مثل ماهالانوبيس مسافه: بعد. بدلاً من ذلك ، يمكنك أيضًا تقليل أبعاد مجموعة البيانات باستخدام تحليل المكونات الرئيسية (PCA). هذه المشكلة متكررة خاصة عند تجميع بيانات التسلسل البيولوجي.

لقد ناقشنا بالفعل المقاييس والروابط وكيف يمكن لكل واحد منهم التأثير على نتائجنا. دعنا الآن نواصل تحليل مخطط الأسنان ونرى كيف يمكن أن يعطينا إشارة إلى عدد المجموعات في مجموعة البيانات الخاصة بنا.

إن العثور على عدد مثير للاهتمام من العناقيد في مخطط الأسنان يماثل العثور على أكبر مساحة أفقية لا تحتوي على أي خطوط عمودية (المساحة ذات الخطوط العمودية الأطول). هذا يعني أن هناك المزيد من الفصل بين المجموعات.

يمكننا رسم خط أفقي يمر بهذه المسافة الأطول:

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

IMG

بعد تحديد الخط الأفقي ، نحسب عدد المرات التي تقاطعت فيها الخطوط الرأسية - في هذا المثال ، 5 مرات. لذا يبدو الرقم 5 مؤشرًا جيدًا على عدد المجموعات التي لها أكبر مسافة بينها.

ملاحظات: يجب اعتبار مخطط الأسنان كمرجع فقط عند استخدامه لاختيار عدد المجموعات. يمكنه بسهولة التخلص من هذا الرقم ويتأثر تمامًا بنوع الارتباط ومقاييس المسافة. عند إجراء تحليل متعمق للكتلة ، يُنصح بالنظر إلى مخططات الشجرة ذات الروابط والمقاييس المختلفة وإلقاء نظرة على النتائج التي تم إنشاؤها باستخدام الأسطر الثلاثة الأولى التي يكون فيها للمجموعات أكبر مسافة بينها.

تنفيذ التكتل الهرمي التجميعي

باستخدام البيانات الأصلية

لقد حسبنا حتى الآن العدد المقترح للمجموعات لمجموعة البيانات الخاصة بنا والتي تدعم تحليلنا الأولي وتحليل PCA الخاص بنا. الآن يمكننا إنشاء نموذج التجميع الهرمي التكتلي باستخدام Scikit-Learn AgglomerativeClustering واكتشف تسميات نقاط التسويق باستخدام labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

وينتج عنه:

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

لقد بحثنا كثيرًا للوصول إلى هذه النقطة. وماذا تعني هذه التسميات؟ هنا ، لدينا كل نقطة من بياناتنا مصنفة كمجموعة من 0 إلى 4:

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

IMG

هذه هي بياناتنا المجمعة النهائية. يمكنك رؤية نقاط البيانات ذات الترميز اللوني في شكل خمس مجموعات.

نقاط البيانات في أسفل اليمين (التسمية: 0، نقاط البيانات الأرجواني) للعملاء ذوي الرواتب المرتفعة ولكن الإنفاق المنخفض. هؤلاء هم العملاء الذين ينفقون أموالهم بعناية.

وبالمثل ، العملاء في أعلى اليمين (التسمية: 2، نقاط البيانات الخضراء) ، هم العملاء ذوو الرواتب المرتفعة والإنفاق المرتفع. هؤلاء هم نوع العملاء الذين تستهدفهم الشركات.

العملاء في المنتصف (التسمية: 1، نقاط البيانات الزرقاء) ذات متوسط ​​الدخل ومتوسط ​​الإنفاق. ينتمي أكبر عدد من العملاء إلى هذه الفئة. يمكن للشركات أيضًا استهداف هؤلاء العملاء نظرًا لحقيقة أنهم بأعداد كبيرة.

العملاء في أسفل اليسار (التسمية: 4، أحمر) هم العملاء الذين يتقاضون رواتب منخفضة وإنفاق منخفض ، وقد ينجذبون من خلال تقديم العروض الترويجية.

وأخيرًا ، العملاء في الجزء العلوي الأيسر (التسمية: 3، نقاط البيانات البرتقالية) هي تلك ذات الدخل المرتفع والإنفاق المنخفض ، والتي يستهدفها التسويق بشكل مثالي.

استخدام النتيجة من PCA

إذا كنا في سيناريو مختلف ، حيث كان علينا تقليل أبعاد البيانات. يمكننا أيضًا رسم نتائج PCA العنقودية بسهولة. يمكن القيام بذلك عن طريق إنشاء نموذج تجميع تكتلي آخر والحصول على ملصق بيانات لكل مكون رئيسي:

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

IMG

لاحظ أن كلا النتيجتين متشابهتان جدًا. الاختلاف الرئيسي هو أن النتيجة الأولى مع البيانات الأصلية أسهل بكثير في التفسير. من الواضح أن العملاء يمكن تقسيمهم إلى خمس مجموعات حسب دخلهم السنوي ودرجة الإنفاق. بينما ، في نهج PCA ، نأخذ جميع ميزاتنا في الاعتبار ، بقدر ما يمكننا النظر إلى التباين الذي أوضحه كل منهم ، يعد هذا مفهومًا يصعب فهمه ، خاصة عند تقديم التقارير إلى قسم التسويق.

أقل ما يتعين علينا تحويل بياناتنا ، كان ذلك أفضل.

إذا كان لديك مجموعة بيانات كبيرة جدًا ومعقدة يجب عليك فيها إجراء تقليل الأبعاد قبل التجميع - فحاول تحليل العلاقات الخطية بين كل من الميزات وبقاياها لدعم استخدام PCA وتعزيز قابلية شرح العملية. من خلال إنشاء نموذج خطي لكل زوج من الميزات ، ستتمكن من فهم كيفية تفاعل الميزات.

إذا كان حجم البيانات كبيرًا جدًا ، يصبح من المستحيل رسم أزواج الميزات ، وتحديد عينة من بياناتك ، بحيث تكون متوازنة وقريبة من التوزيع الطبيعي قدر الإمكان وإجراء التحليل على العينة أولاً ، وفهمها ، والضبط الدقيق - وقم بتطبيقه لاحقًا على مجموعة البيانات بأكملها.

يمكنك دائمًا اختيار تقنيات مختلفة لتصور المجموعات وفقًا لطبيعة بياناتك (خطية ، غير خطية) ودمجها أو اختبارها جميعًا إذا لزم الأمر.

وفي الختام

يمكن أن تكون تقنية التجميع مفيدة للغاية عندما يتعلق الأمر بالبيانات غير المسماة. نظرًا لأن معظم البيانات في العالم الحقيقي غير مسماة وأن التعليقات التوضيحية على البيانات لها تكاليف أعلى ، يمكن استخدام تقنيات المجموعات لتسمية البيانات غير المسماة.

في هذا الدليل ، قدمنا ​​مشكلة حقيقية في علم البيانات ، حيث تُستخدم تقنيات المجموعات بشكل كبير في تحليل التسويق (وأيضًا في التحليل البيولوجي). لقد أوضحنا أيضًا العديد من خطوات التحقيق للوصول إلى نموذج تجميع هرمي جيد وكيفية قراءة مخططات التخطيط وتساءلنا عما إذا كانت PCA خطوة ضرورية. هدفنا الرئيسي هو تغطية بعض المخاطر والسيناريوهات المختلفة التي يمكن أن نجد فيها مجموعات هرمية.

تجمع سعيد!

الطابع الزمني:

اكثر من ستاكابوز