سلسلة علم الاحصاء وتعلم الالة – الجزء الأول

870

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

  • الرسم البياني الترددي Histogram
  • القيم المتطرفة Outliers
  • مخطط صندوق البيانات Box Plot
  • إحصائيات تلخيصية Summary Statistics
  • وظيفة التوزيع التراكمي Cumulative distribution function
  • حجم التأثير Effect size
  • العلاقة بين المتغيرات Relationship Between Variables
  • علاقة الارتباط Correlation
  • التغاير Covariance
  • اختبار الفرضيات Hypothesis Testing
  • التوزيع الطبيعي Normal Distribution

في البداية, سنقوم باستعمال مكتبات برمجية مختلفة:

  • تحميل البيانات
  • رسم المخططات البيانية
  • أداء عمليات حسابية
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

# import libraries
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from pandas.tools import plotting
from scipy import stats
plt.style.use("ggplot")
import warnings
warnings.filterwarnings("ignore")
from scipy import stats

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory

import os
print(os.listdir("../input"))

# Any results you write to the current directory are saved as output.

ثم نقوم بتحميل البيانات الخاصة بتشخيص سرطان الثدي Breast Cancer Wisconsin (Diagnostic) Data Set.

# read data as pandas data frame
data = pd.read_csv("../input/data.csv")
data = data.drop(['Unnamed: 32','id'],axis = 1)

النتيجة.

['data.csv']

لنلقي نظرة على البيانات.

# quick look to data
data.head()
data.shape # (569, 31)
data.columns 

النتيجة.

Index(['diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean',
       'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',
       'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',
       'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se',
       'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se',
       'fractal_dimension_se', 'radius_worst', 'texture_worst',
       'perimeter_worst', 'area_worst', 'smoothness_worst',
       'compactness_worst', 'concavity_worst', 'concave points_worst',
       'symmetry_worst', 'fractal_dimension_worst'],
      dtype='object')

 

الرسم البياني الترددي Histogram

Histogram هو تمثيل دقيق لتوزيع البيانات يتيح لك اكتشاف التردد “عدد ظهور نقطة البيانات” لكل نقطة في مجموعة من البيانات.

يختلف Histogram عن الرسم البياني الطبيعي,  بمعنى أن الرسم البياني الطبيعي يعرض العلاقة بين متغيرين (x,y), لكن Histogram يتعامل مع متغير واحد فقط, يعبر x-axis عن نقاط البيانات بينما عبر y-axis عن التردد.

مثال, في مجموعة الأعداد هذه [1,1,1,1,2,2,2] تردد نقطة البيانات “1” هو أربعة ونقطة البيانات “2” هو ثلاثة.

لنعرض Histogram الخاص ببيانات بنصف قطر كلا من الأورام الخبيثة والحميدة.

m = plt.hist(data[data["diagnosis"] == "M"].radius_mean,bins=30,fc = (1,0,0,0.5),label = "Malignant")
b = plt.hist(data[data["diagnosis"] == "B"].radius_mean,bins=30,fc = (0,1,0,0.5),label = "Bening")
plt.legend()
plt.xlabel("Radius Mean Values")
plt.ylabel("Frequency")
plt.title("Histogram of Radius Mean for Bening and Malignant Tumors")
plt.show()
frequent_malignant_radius_mean = m[0].max()
index_frequent_malignant_radius_mean = list(m[0]).index(frequent_malignant_radius_mean)
most_frequent_malignant_radius_mean = m[1][index_frequent_malignant_radius_mean]
print("Most frequent malignant radius mean is: ",most_frequent_malignant_radius_mean)

Most frequent malignant radius mean is:  20.101999999999997

من خلال Histogram ستلاحظ أن نصف قطر الورم الخبيث أكبر, ستلاحظ أيضا أن Histogram نصف قطر الورم الحميد يتخذ شكل الجرس – سنتحدث عنه لاحقا-.

 

القيم المتطرفة Outliers

Outliers هي القيم التي تقع على مسافة غير طبيعية من أغلب القيم الأخرى في مجموعة البيانات.

يمكنك رؤيتها في Histogram.

IQR score

يمثل (IQR) والذي يُطلق عليه الانتشار المتوسط مقياسًا لمدي تشتت توزيع البيانات, عن طريق حساب الفرق بين النسب المئوية بين الربعين العلوي والسفلي.

IQR = Q3 - Q1

لحساب قيمتي الحدود العلوية والسفلية.

Q1 - 1.5IQR و Q3 + 1.5IQR

ولذلك فأي شيء خارج هذا النطاق هو Outlier.

لنحسب Outliers الخاصة ببيانات نصف قطر الورم الحميد

data_bening = data[data["diagnosis"] == "B"]
data_malignant = data[data["diagnosis"] == "M"]
desc = data_bening.radius_mean.describe()
Q1 = desc[4]
Q3 = desc[6]
IQR = Q3-Q1
lower_bound = Q1 - 1.5*IQR
upper_bound = Q3 + 1.5*IQR
print("Anything outside this range is an outlier: (", lower_bound ,",", upper_bound,")")
data_bening[data_bening.radius_mean < lower_bound].radius_mean
print("Outliers: ",data_bening[(data_bening.radius_mean < lower_bound) | (data_bening.radius_mean > upper_bound)].radius_mean.values)

النتيجة.

Anything outside this range is an outlier: ( 7.645000000000001 , 16.805 )
Outliers:  [ 6.981 16.84  17.85 ]

 

مخطط صندوق البيانات Box Plot

Boxplot هي طريقة قياسية لعرض توزيع البيانات مكون من (“الحد الأدنى”, الربع الأول (Q1), الوسيط, الربع الثالث (Q3), و “الحد الأقصى”.)

يمكنك ايضا ملاحظة Outliers من خلال Boxplot.

melted_data = pd.melt(data,id_vars = "diagnosis",value_vars = ['radius_mean', 'texture_mean'])
plt.figure(figsize = (15,10))
sns.boxplot(x = "variable", y = "value", hue="diagnosis",data= melted_data)
plt.show()

 

إحصائيات تلخيصية Summary Statistics

المتوسط الحسابي Mean

هو متوسط الأرقام” قيمة المركزية” لمجموعة من الأرقام.

التباين Variance

(σ2) هو مقياس للفرق بين نقاط البيانات. عن طريق قياس مدى بعُد كل نقطة في المجموعة عن المتوسط الحسابي Mean.

الانحراف المعياري Standard Deviation

هو مقياس مدى انتشار نقاط البيانات حول المتوسط الحسابي Mean.

print("mean: ",data_bening.radius_mean.mean())
print("variance: ",data_bening.radius_mean.var())
print("standart deviation (std): ",data_bening.radius_mean.std())
print("describe method: ",data_bening.radius_mean.describe())

النتيجة.

mean:  12.14652380952381
variance:  3.170221722043872
standart deviation (std):  1.7805116461410389
describe method:  count    357.000000
mean      12.146524
std        1.780512
min        6.981000
25%       11.080000
50%       12.200000
75%       13.370000
max       17.850000
Name: radius_mean, dtype: float64

 

وظيفة التوزيع التراكمي Cumulative distribution function

وظيفة التوزيع التراكمي (CDF) هي احتمال وجود متغير عشوائي X خلال توزيع احتمالات معين بقيمة أقل من أو تساوي x.

plt.hist(data_bening.radius_mean,bins=50,fc=(0,1,0,0.5),label='Bening',normed = True,cumulative = True)
sorted_data = np.sort(data_bening.radius_mean)
y = np.arange(len(sorted_data))/float(len(sorted_data)-1)
plt.plot(sorted_data,y,color='red')
plt.title('CDF of bening tumor radius mean')
plt.show()

(P (X <= x

احتمالية وجود ورم حميد نصف قطرة اقل من او يساوي 12 هي 0.5

(P (12<= x

 

حجم التأثير Effect size

Effect size هو مفهوم إحصائي يقيس قوة العلاقة بين اثنين من المتغيرات, فإذا كانت لدينا بيانات عن طول الرجال والنساء ولاحظنا أن الرجال أطول من النساء في المتوسط, فإن قيمة الفرق الطول بين الرجال و النساء تُعرف باسم Effect size. وكلما زاد الفرق , زاد Effect size.

هناك العديد من الطرق لحساب Effect size:

  • Standardized means difference
  • Cohen’s d effect size
  • Glass’s Δ method of effect size
  • Hedges’ g method of effect size

Cohen’s d effect sizeحجم تأثير كوهين  

هو حساب الفرق بين المتوسط الحسابي للمتغيرين x1, x2 ثم القسمة على الانحراف المعياري الخاص ببيناتهم. يشار إليه رياضيا:

ويتم حساب قيمة s “الانحراف المعياري” رياضيا:

كمثال, إذا كان d = 0.2, فسيكون effect size صغيرًا, d = 0.5 سيكون effect size متوسط, d = 0.8 سيكون effect size كبير.

mean_diff = data_malignant.radius_mean.mean() - data_bening.radius_mean.mean()
var_bening = data_bening.radius_mean.var()
var_malignant = data_malignant.radius_mean.var()
var_pooled = (len(data_bening)*var_bening +len(data_malignant)*var_malignant ) / float(len(data_bening)+ len(data_malignant))
effect_size = mean_diff/np.sqrt(var_pooled)
print("Effect size: ",effect_size)

النتيجة.

Effect size:  2.2048585165041428

بحساب effect size بين نصف قطر الورم الخبيث والحميد نحصل effect size = 2.2 وهذا كبير للغاية, وذلك يبين لنا أن الفرق بينهم أكبر مما نتخيل.

 

العلاقة بين المتغيرات Relationship Between Variables

حينما تمتلك القدرة على استنتاج متغير ما بمعلومية متغير آخر, تستطيع القول إن هناك علاقة بين هذين المتغيرين.

مثال, عند استعمالك تطبيق مثل Uber,عند تحديد كلاٌ من موقعي الذهاب والوصول يستطيع التطبيق اعلامك بالتكلفة وذلك عن طريق قياس المسافة بين الموقعين. لذلك نستنتج أنه يوجد علاقة بين التكلفة والمسافة, وهي ايضا علاقة طردية أي كلما طالت المسافة زادت التكلفة.

يمكنك ملاحظة العلاقة بين المتغيرات بعدة طرق, أشهرهم المخطط البياني من نوع Scatter Plot.

لنعرض العلاقة بين متوسط نصف قطر الورم مع متوسط مساحة الورم. من المنطقي أن نتوقع أنه كلما زاد نصف قطر الورم زادت مساحته.

plt.figure(figsize = (15,10))
sns.jointplot(data.radius_mean,data.area_mean,kind="regg")
plt.show()

يمكننا أيضا عرض أكثر من مخطط بياني لأكثر من متغير لنكتشف مدى العلاقة بين بعضهم البعض كلا على حدي.

# Also we can look relationship between more than 2 distribution
sns.set(style = "white")
df = data.loc[:,["radius_mean","area_mean","fractal_dimension_se"]]
g = sns.PairGrid(df,diag_sharey = False,)
g.map_lower(sns.kdeplot,cmap="Blues_d")
g.map_upper(plt.scatter)
g.map_diag(sns.kdeplot,lw =3)
plt.show()

علاقة الارتباط Correlation

Correlation هي مقياس إحصائي يحدد العلاقة المشتركة بين المتغيرات لتمثيل العلاقة الخطية بينم.

من خلال عرض خريطة حرارية لمدى علاقة الارتباط بين صفات مجموعة البيانات مع بعضها البعض, نستطيع ملاحظة مدي قوة / ضعف العلاقة بين الصفات مع بعضها البعض.

تنحصر القيمة الرقمية لتقيم العلاقة بين [1,1- ]أي من تطابق تام “1” او علاقة تطابق عكسية “1-“, وتعبر قيمة “0” عن عدم وجود علاقة تماما.

f,ax=plt.subplots(figsize = (18,18))
sns.heatmap(data.corr(),annot= True,linewidths=0.5,fmt = ".1f",ax=ax)
plt.xticks(rotation=90)
plt.yticks(rotation=0)
plt.title('Correlation Map')
plt.savefig('graph.png')
plt.show()

من خلال تعين صفات البيانات على كلا من x-axis وy-axis وبنفس الترتيب على هذه المصفوفة, اول ما ستلاحظه هو حصول الخط القطري diagonal لهذا المربع على القيمة “1” وذلك بالطبع لأنهم نفس الشيء.

القيمة بين نصف قطر الورم ومساحة الورم تساوي “1” وذلك يعني ان هناك تطابق تام بينهم.

القيمة بين كثافة الورم ونعومة سطح الورم تساوي “0” وذلك يعني عدم وجود أي علاقة بينهم.

 

التغاير Covariance

Covariance هو مقياس لمدى اختلاف بين متغيرين عشوائيين. بمعني, الى أي مدي التغيير في أحد المتغيرات يسبب التغيير في المتغير آخر.

كلما زادت قيمة Covariance كلما عبر هذا عن مدي تطابق هذين المتغيرين, وكلما اقتربت قيمة Covariance الى الصفر كلما عبر عن مدي عدم تطابق هذين المتغيرين.

كون قيمة Covariance بالساب او بالموجب فذلك يعبر عن اتجاه هذه العلاقة, أي إذا كانت بالموجب فذلك يعني ان زيادة قيمة المتغير الأول تزُيد من قيمة المتغير الثاني, وإذا كانت بالسالب فذلك يعني عن زيادة قيمة المتغير الأول تُقل من قيمة المتغير الثاني.

كمثال,

  • سنقوم بحساب قيمة Covariance بين بيانات نصف قطر الورم ومساحة الورم.
  • سنقوم بحساب قيمة Covariance بين بيانات نصف قطر الورم وابعاد الورم.
np.cov(data.radius_mean,data.area_mean)
print("Covariance between radius mean and area mean: ",data.radius_mean.cov(data.area_mean))
print("Covariance between radius mean and fractal dimension se: ",data.radius_mean.cov(data.fractal_dimension_se))

النتيجة.

Covariance between radius mean and area mean:  1224.4834093464565
Covariance between radius mean and fractal dimension se:  -0.0003976248576440626

اختبار الفرضيات Hypothesis Testing

اختبار الفرضيات هي طريقة استدلال إحصائي تستخدم لتحديد ما إذا كان هناك أدلة كافية لإثبات فرضية ما.

لتطبيق هذا الاختبار لابد من توفر الفرضيتين: فرضية العدم والفرضية البديلة. في معظم التطبيقات تكون الفرضيتين الاثنان متكاملان (أحدهما ينفي الآخر).

فرضية العدم هي افتراض أن لا شيء سيتغير, فإذا تم رفض فرضية العدم, فذلك يعني أن هناك أدلة كافية لقبول الفرضية البديلة المشار إليها قبل القيام بأي اختبار.

بالاعتماد على حساب قيمة P-value كطريقة لاختبار الفرضيات.

إذا كانت P-value أقل من المستوى الذي تم تحديده مسبقا, فسترٌفض فرضية العدم, أي أن عينة ببيانات الخاضعة للاختبار تقدم أدلة معقولة لدعم الفرضية البديلة.

يتم اختيار المستوى الذي ترفض عندها فرضية العدم P-value بشكل تعسفي. في العموم يتم استخدام المستويات 5٪ و1٪ و0.1٪ اي

(P <0.05 و0.01 >P  و0.001 >P).

مثال, فرضية العدم: كوكب الارض مسطح. الفرضية البديلة: كوكب الارض مستدير.

باجتهاد العديد من العلماء لأثبات ان كوكب الأرض مستدير, تم رفض فرضية العدم وقبول الفرضية البديلة.

ولان لنصنع مثال اخر بأنفسنا.

لمعرفة إذا كان هناك علاقة بين نصف قطر الورم ومساحته, لنضع فرضية العدم انه لا توجد علاقة بين نصف قطر الورم ومساحته, ستكون الفرضية البديلة بالطبع هي وجود علاقة بينهما.

بتوفر بيانات نصف قطر الورم ومساحته نستطيع حساب P-value للعلاقة بينهم, إذا كانت P-value منخفضة, فسنرفض فرضية العدم.

statistic, p_value = stats.ttest_rel(data.radius_mean,data.area_mean)
print('p-value: ',p_value)

النتيجة.

p-value:  1.5253492492559045e-184

قيمة P-value تساوي صفر تقريبا لذلك سنرفض فرضية العدم.

التوزيع الطبيعي Normal Distribution

هناك الكثير من الاشكال يمكن للبيانات ان تتخذها حين عرضها.

يمكن ان تميل بيانات ناحية اليمين                                                                                                                 أو تميل ناحية اليسار

                             أو تصبح في تصاعد وهبوط

وفي أحيان اخري تكون البيانات حول قيمة مركزية دون تحيز يسار أو يمين, وهذا هو “التوزيع الطبيعي”.

وغالبًا ما يطلق عليه منحني الجرس “Bell Curve” لأنه يشبه الجرس.

تتمتع بيانات التوزيع الطبيعي ببعض الخصائص:

  • المتوسط الحسابي = القيمة الوسطي.
  • التماثل حول المركز.
  • 50 ٪ من القيم أقل من المتوسط و50 ٪ أكبر من المتوسط.

من الأمثلة الكلاسيكية المستخدمة في شرح التوزيع الطبيعي هي مقياس الذكاء البشري IQ.

لنفترض أن متوسط IQ للبشر يبلغ 110. وهناك عدد قليل من الأشخاص يتمتعون بذكاء فائق وIQ أعلى من 110. ويمكن أن يكون 140 أو 150 لكنه أمر نادر الحدوث. وهناك أيضًا عدد قليل من الأشخاص يمتلكون ذكاء منخفض وIQ أقل من 110. يمكن أن يكون 40 أو 50 ولكنه أمر نادر الحدوث أيضا.

بافتراض ان متوسط IQ يساوي 110 الانحراف المعياري يساوي 20, سنقوم بنتاج بيانات عشوائية ثم نقوم بعرض Histogram.

# parameters of normal distribution
mu, sigma = 110, 20  # mean and standard deviation
s = np.random.normal(mu, sigma, 100000)
print("mean: ", np.mean(s))
print("standart deviation: ", np.std(s))
# visualize with histogram
plt.figure(figsize = (10,7))
plt.hist(s, 100, normed=False)
plt.ylabel("frequency")
plt.xlabel("IQ")
plt.title("Histogram of IQ")
plt.show()

mean:  110.00491070204598
standart deviation:  20.02931377318016

يمكنك ملاحظة ان Histogram يتخذ شكل التوزيع الطبيعي, وبناء عليه ستلاحظ أيضا أن اغلب البشر يملك IQ يقارب 110.

ولكن ما معني كلمة “أغلب” هذه, هل نستطيع تحديد إحصاء دقيق لعدد الأشخاص حاملي IQ بين 80 و140 مثلا.

بالاعتماد على حساب قيمة Z-score نستطيع ذلك.

Z-score هو عدد وحدات الانحراف المعياري التي يبعد عنها العنصر قيد الاختبار عن المتوسط الحسابي.

* z = (x - mean)/std 
* z1 = (80-110)/20 = -1.5
* z2 = (140-110)/20 = 1.5
* Distance between mean and 80 is 1.5std and distance between mean and 140 is 1.5std.
* If you look at z table, you will see that 1.5std correspond to 0.4332

لابد من مراجه Z-table لمعرفة ما يشغله Z-score من مساحة في هذا التوزيع.

سنقوم بعد ذلك بجمع مساحة كلا من (من 80 الي المتوسط) و(من 140 الي المتوسط).

* Lets calculate it with 2 because 1 from 80 to mean and other from mean to 140
* 0.4332 * 2 = 0.8664
* 86.64 % of people has an IQ between 80 and 140.

86.64% من البشر يتمتعوا بIQ بين 80 و140.

ما هي النسبة الاشخاص ذوي IQ أقل من 80؟

z = (110-80) / 20 = 1.5

دعنا ننظر إلى جدول, نسبة البشر ذوي IQ بين 80 والمتوسط (110) هي %43.32.

إذا طرحنا من %50 من %43.32 فسنجد أن نسبة الأشخاص الذين لديهم IQ أقل عن 80.

50 - 43.32 = 6.68

%6.68 من الناس لديهم IQ أقل من 80.

المصدر:(Statistical Learning Tutorial for Beginners)

تعليقات