عالم البيانات Data Scientist – الجزء الأول

الجزء الاول

2٬384

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

يحتاج عالم البيانات إلى امتلاك هذه المهارات:

  1. الأدوات الأساسية: مثل Python أو R أو SQL. لا تحتاج إلى معرفة كل شيء. ما تحتاجه فقط هو أن تتعلم كيف تستخدم Python.
  2. الإحصاءات الأساسية: مثل الوسط أو الانحراف المعياري أو القياسي. إذا كنت تعرف الإحصاءات الأساسية، فيمكنك استخدام Python بسهولة.
  3. تحسين البيانات: العمل مع البيانات الفوضوية صعب. مثل تاريخ غير متناسق او بيانات غير مرتبة. كما تعلمون، سيساعدنا Python.
  4. المخططات البيانية: سنقوم بعرض البيانات في مخططات بيانية متعددة مع Python مثل ومكتبات matplot وseaborn البرمجية.
  5. تعلم الآلة Machine Learning: لست بحاجة إلى فهم الرياضيات وراء هذه التقنية. كل ما عليك سوى فهم أساسياتها وتعلم كيفية تنفيذها أثناء استخدام Python.

كملخص سوف تتعلم Python كي تكون عالم البيانات Data Scientist.

المحتوى:

  1. مقدمة Python:

    1. المكتبة البرمجية Matplot
    2. القواميس Dictionaries
    3. الباندا Panda
    4. أوامر المنطق والتحكم في المسار والترشيح البيانات
  2. صندوق أدوات Python لعلوم البيانات Data Science:

    1. الوظائف محددة من قبل المستخدم
    2. النطاق
    3. الوظائف المتداخلة
    4. المدخلات الافتراضية والمرنة
    5. وظيفة Lambda
    6. الوظيفة المجهولة
    7. المكررات Iterators
    8. قائمة الادراك List comprehension

قبل ان نبدأ اود ان تقوم باستيراد المكتبات البرمجية التي ستحتاجها خلال المقال وأيضا تحميل البيانات التي سنعمل عليها للتأكد من عدم وجود أي مشاكل فيما بعد.

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
import seaborn as sns # visualization tool

بافتراض ان البيانات موجودة في مجلد “.. /input/”.

from subprocess import check_output
print (check_output(["ls", "../input"]).decode("utf8"))

سنحصل على البيانات الموجودة في هذا المجلد.

combats.csv
pokemon.csv
tests.csv

نقوم بقراءة قاعدة البيانات pokemon.csv “يمكنك تحميلها من هنا”

data = pd.read_csv('../input/pokemon.csv')

ونستعرض بعض الحقائق عنها.

data.info()

النتيجة.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 800 entries, 0 to 799
Data columns (total 12 columns):
# 800 non-null int64
Name 799 non-null object
Type 1 800 non-null object
Type 2 414 non-null object
HP 800 non-null int64
Attack 800 non-null int64
Defense 800 non-null int64
Sp. Atk 800 non-null int64
Sp. Def 800 non-null int64
Speed 800 non-null int64
Generation 800 non-null int64
Legendary 800 non-null bool
dtypes: bool(1), int64(8), object(3)
memory usage: 69.6+ KB

لنستعرض العلاقة المترابطة بين البيانات.

data.corr()

 

النتيجة.

# HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
# 1.000000 0.097712 0.102664 0.094691 0.089199 0.085596 0.012181 0.983428 0.154336
HP 0.097712 1.000000 0.422386 0.239622 0.362380 0.378718 0.175952 0.058683 0.273620
Attack 0.102664 0.422386 1.000000 0.438687 0.396362 0.263990 0.381240 0.051451 0.345408
Defense 0.094691 0.239622 0.438687 1.000000 0.223549 0.510747 0.015227 0.042419 0.246377
Sp. Atk 0.089199 0.362380 0.396362 0.223549 1.000000 0.506121 0.473018 0.036437 0.448907
Sp. Def 0.085596 0.378718 0.263990 0.510747 0.506121 1.000000 0.259133 0.028486 0.363937
Speed 0.012181 0.175952 0.381240 0.015227 0.473018 0.259133 1.000000 -0.023121 0.326715
Generation 0.983428 0.058683 0.051451 0.042419 0.036437 0.028486 -0.023121 1.000000 0.079794
Legendary 0.154336 0.273620 0.345408 0.246377 0.448907 0.363937 0.326715 0.079794 1.000000

والان في مخطط بياني.

#correlation map
f,ax = plt.subplots(figsize=(18, 18))
sns.heatmap(data.corr(), annot=True, linewidths=.5, fmt= '.1f',ax=ax)
plt.show()

النتيجة.

لنستعرض اول 10 صفوف في البيانات.

data.head(10)

النتيجة.

# Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
0 1 Bulbasaur Grass Poison 45 49 49 65 65 45 1 False
1 2 Ivysaur Grass Poison 60 62 63 80 80 60 1 False
2 3 Venusaur Grass Poison 80 82 83 100 100 80 1 False
3 4 Mega Venusaur Grass Poison 80 100 123 122 120 80 1 False
4 5 Charmander Fire NaN 39 52 43 60 50 65 1 False
5 6 Charmeleon Fire NaN 58 64 58 80 65 80 1 False
6 7 Charizard Fire Flying 78 84 78 109 85 100 1 False
7 8 Mega Charizard X Fire Dragon 78 130 111 130 85 100 1 False
8 9 Mega Charizard Y Fire Flying 78 104 78 159 115 100 1 False
9 10 Squirtle Water NaN 44 48 65 50 64 43 1 False

لنستعرض أسماء الصفات في البيانات.

data.columns

النتيجة

Index(['#', 'Name', 'Type 1', 'Type 2', 'HP', 'Attack', 'Defense',
'Sp. Atk','Sp. Def', 'Speed', 'Generation', 'Legendary'],
dtype='object')

1- مقدمة Python:

i- المكتبة البرمجية Matplot

Matplot هي مكتبة برمجية python ستساعدنا على عرض البيانات في مخططات بيانية. مثل مخطط الخط، المخطط المبعثر ومخطط التكرار.

الخط أفضل عندما تريد عرض البيانات مع متغير الوقت.

المبعثر أفضل عندما يكون هناك ارتباط بين متغيرين.

التكرار أفضل عندما نحتاج إلى رؤية توزيع البيانات الرقمية.

التخصيص: يمكنك تغير العديد من الصفات في هؤلاء المخططات مثل الألوان، المسميات، سمك الخط، العنوان، درجة التعتيم، الشبكة، الحجم، سٌمك المحور ونمط الخط.

لنقم بتجربة مخطط الخط على البيانات التي حملناها سابقا لاثنان من الصفات.

data.Speed.plot(kind = 'line', color = 'g',label = 'Speed',linewidth=1
alpha = 0.5, grid = True,linestyle = ':')
data.Defense.plot(color = 'r',label = 'Defense',linewidth=1, alpha = 0.5,grid = True,linestyle = '-.')
plt.legend(loc='upper right') # legend = puts label into plot
plt.xlabel('x axis') # label = name of label
plt.ylabel('y axis')
plt.title('Line Plot') # title = title of plot
plt.show()

المخطط المبعثر.

data.plot(kind='scatter', x='Attack', y='Defense',alpha = 0.5,color = 'red')
plt.xlabel('Attack') # label = name of label
plt.ylabel('Defence')
plt.title('Attack Defense Scatter Plot') # title = title of plot

وأخيرا مخطط التكرار Histogram.

data.Speed.plot(kind = 'hist',bins = 50,figsize = (12,12))
plt.show()

ii- القواميس Dictionaries

لماذا نحتاج القاموس Dictionary؟

  1. لان لديها “مفتاح” “Key” و “قيمة” “Value”.
  2. أسرع من القوائم Lists.

ما هو المفتاح key والقيمة value مثال:

dictionary = {'spain': 'madrid'}.

المفتاح ” “Key” هو spain.

القيمة “Value” هي madrid.

ولان لنجرب سويا بعض الخصائص والوظائف الأخرى مثل keys ()، values () والتحديث والإضافة والتحقق وإزالة المفتاح وإزالة كافة الوحدات وإزالة القاموس dictionary كاملا ايضا.

لنقم بأنشاء قاموس dictionary وادخال بعض البيانات فيه.

dictionary = {'spain' : 'madrid','usa' : 'vegas'}
print(dictionary.keys())
print(dictionary.values())

النتيجة.

dict_keys(['spain', 'usa'])
dict_values(['madrid', 'vegas'])

نغير قيمة وحدة متواجدة ببيانات جديدة.

dictionary['spain']="barcelona"#updateexisting entry
print(dictionary)

النتيجة.

{'spain': 'barcelona', 'usa': 'vegas'}

ونضيف وحدة جديدة.

dictionary['france'] = "paris" # Add new entry
print(dictionary)

النتيجة.

{'spain': 'barcelona', 'usa': 'vegas', 'france': 'paris'}

ثم نحذف وحدة اخري.

del dictionary['spain'] # remove entry with key 'spain'
print(dictionary)

النتيجة.

{'usa': 'vegas', 'france': 'paris'}

نتأكد من تواجد وحدة ما.

print('france' in dictionary) # check include or not

النتيجة.

True

في النهاية نقوم بحذف كل الوحدات داخل القاموس. dictionary

dictionary.clear() # remove all entries in dict
print(dictionary)

النتيجة.

{}

لإزالة القاموس dictionary من الذاكرة.

del dictionary # delete entire dictionary

iii- الباندا Panda

في البداية ستحتاج ان تعرف كيف تقرا البيانات من خلال الباندا panda.

data = pd.read_csv('../input/pokemon.csv')

وأيضا تحتاج ان تعرف الفرق بين سلسلة البيانات series وأطار البيانات data frame الذي سنتعامل به مع الباندا panda.

series = data['Defense'] # data['Defense'] = series
print(type(series))
data_frame = data[['Defense']] # data[['Defense']] = data frame
print(type(data_frame))

النتيجة.

<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>

iv- أوامر المنطق والتحكم في المسار والترشيح البيانات

قبل الاستمرار مع الباندا Panda، نحن بحاجة إلى تعلم المنطق، التحكم في المسار.

مشغل المقارنة: ==، <،>، <=.

العوامل المنطقية: و and، أو or، أو لا not.

ترشيح البيانات عن طريق الباندا Panda.

# Comparison operator
print(3 > 2)
print(3!=2)
# Boolean operators
print(True and False)
print(True or False)

النتيجة.

True
True
False
True

لنعرض بعض البيانات بناء علي شرط معين

# There are only 3 pokemons who have higher defense value than 200
x = data['Defense']>200 
data[x]

النتيجة.

# Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
224 225 Mega Steelix Steel Ground 75 125 230 55 95 30 2 False
230 231 Shuckle Bug Rock 20 10 230 10 230 5 2 False
333 334 Mega Aggron Steel NaN 70 140 230 60 80 50 3 False

مثال اخر لترشيح الباندا باستخدام المنطق عن طريق عدة شروط.

# There are only 2 pokemons who have higher defence value than 2oo and higher attack value than 100
data[np.logical_and(data['Defense']>200, data['Attack']>100 )]
# Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
224 225 Mega Steelix Steel Ground 75 125 230 55 95 30 2 False
333 334 Mega Aggron Steel NaN 70 140 230 60 80 50 3 False

نفس المثال بطريقة اخري.

data[(data['Defense']>200) & (data['Attack']>100)]
# Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
224 225 Mega Steelix Steel Ground 75 125 230 55 95 30 2 False
333 334 Mega Aggron Steel NaN 70 140 230 60 80 50 3 False

ونفس النتيجة طبعا

WHILE and FOR LOOPS

سنتعلم البديهيات حولهم نظرا لأهميتهم.

سيظل يدور في هذا المثال حتى تصبح i ب 5 باستخدام while.

i = 0
while i != 5 :
	print('i is: ',i)
	i +=1

النتيجة.

i is: 0
i is: 1
i is: 2
i is: 3
i is: 4

باستخدام for للمرور على قائمة البيانات list.

lis = [1,2,3,4,5]
for i in lis:
	print('i is: ',i)

النتيجة.

i is: 1
i is: 2
i is: 3
i is: 4
i is: 5

يمكن لfor أيضا ان تمر على ” Enumerate” .

Enumerate: قائمة من الفهرس index و القيمة value.

# index : value = 0:1, 1:2, 2:3, 3:4, 4:5
for index, value in enumerate(lis):
	print(index," : ",value)

النتيجة.

0 : 1
1 : 2
2 : 3
3 : 4
4 : 5

ويمكن ل for ان تمر على القاموس dictionary.

dictionary = {'spain':'madrid','france':'paris'}
for key,value in dictionary.items():
	print(key," : ",value)

النتيجة.

spain : madrid
france : paris

وأخيرا يمكن ل for ان تمر على الباندا panda.

# For pandas we can achieve index and value
for index,value in data[['Attack']][0:1].iterrows():
	print(index," : ",value)

النتيجة.

0 : Attack 49
Name: 0, dtype: int64

2- صندوق أدوات Python لعلوم البيانات Data Science:

i- الوظائف محددة من قبل المستخدم

ما نحتاج إلى معرفته عن الوظائف:

جمل التوثيق: كتابة الجمل من اجل توثيق الوظائف. مثال:

ل () f: “” “هذا هو التوثيق للوظيفة f” “”

tuble: تسلسل كائنات objects غير قابلة للتغيير في Python.

غير قادر على تعديل القيم

يستخدم tubleبين قوسين مثل (tuble = (1،2،3

تفريغ tuble إلى عدة متغيرات مثل (tuble=(a, b, c

مثال.

def tuble_ex():
	""" return defined t tuble"""
	t = (1,2,3)
	return t
a,b,c = tuble_ex()
print(a,b,c)

النتيجة.

1 2 3

ii- النطاق

ما نحتاج إلى معرفته حول النطاق:

عالمي: تعريف الجسم الرئيسي في البرنامج النصي

محلي: محدد في وظيفة

بنيت في النطاق مسبقا: أسماء في وحدة بنيت مسبقا في نطاق مثل print، len

دعونا نجعل بعض الأمثلة الأساسية

x = 2
def f():
	x = 3
	return x
print(x) # x = 2 global scope
print(f()) # x = 3 local scope

النتيجة “للتوضيح x=2 للنطاق العالمي و x=3 للنطاق المحلي

2
3

ماذا لو لم يكن هناك نطاق محلي؟

دعنا نتعرف اين يبحث أولا.

النطاق المحلي ⇒النطاق العالمي⇒ بنيت في النطاق مسبقا.

x = 5
def f():
	y = 2*x # there is no local scope x
	return y
print(f()) # it uses global scope x

النتيجة “بما انه لا يوجد x في النطاق المحلي سيقوم البرنامج باستعمال x في النطاق العالمي”

10

والان لنستعرض ما قد بني في النطاق مسبقا.

import builtins
dir(builtins)

النتيجة

['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'BlockingIOError',
'BrokenPipeError',
'BufferError',
'BytesWarning',
'ChildProcessError',
'ConnectionAbortedError',
'ConnectionError',
'ConnectionRefusedError',
'ConnectionResetError',
'DeprecationWarning',
'EOFError',
'Ellipsis',
'EnvironmentError',
'Exception',
'False',
'FileExistsError',
'FileNotFoundError',
'FloatingPointError',
'FutureWarning',
'GeneratorExit',
'IOError',
'ImportError',
'ImportWarning',
'IndentationError',
'IndexError',
'InterruptedError',
'IsADirectoryError',
'KeyError',
'KeyboardInterrupt',
'LookupError',
'MemoryError',
'ModuleNotFoundError',
'NameError',
'None',
'NotADirectoryError',
'NotImplemented',
'NotImplementedError',
'OSError',
'OverflowError',
'PendingDeprecationWarning',
'PermissionError',
'ProcessLookupError',
'RecursionError',
'ReferenceError',
'ResourceWarning',
'RuntimeError',
'RuntimeWarning',
'StopAsyncIteration',
'StopIteration',
'SyntaxError',
'SyntaxWarning',
'SystemError',
'SystemExit',
'TabError',
'TimeoutError',
'True',
'TypeError',
'UnboundLocalError',
'UnicodeDecodeError',
'UnicodeEncodeError',
'UnicodeError',
'UnicodeTranslateError',
'UnicodeWarning',
'UserWarning',
'ValueError',
'Warning',
'ZeroDivisionError',
'__IPYTHON__',
'__build_class__',
'__debug__',
'__doc__',
'__import__',
'__loader__',
'__name__',
'__package__',
'__pybind11_internals_v1__',
'__spec__',
'abs',
'all',
'any',
'ascii',
'bin',
'bool',
'bytearray',
'bytes',
'callable',
'chr',
'classmethod',
'compile',
'complex',
'copyright',
'credits',
'delattr',
'dict',
'dir',
'display',
'divmod',
'enumerate',
'eval',
'exec',
'filter',
'float',
'format',
'frozenset',
'get_ipython',
'getattr',
'globals',
'hasattr',
'hash',
'help',
'hex',
'id',
'input',
'int',
'isinstance',
'issubclass',
'iter',
'len',
'license',
'list',
'locals',
'map',
'max',
'memoryview',
'min',
'next',
'object',
'oct',
'open',
'ord',
'pow',
'print',
'property',
'range',
'repr',
'reversed',
'round',
'set',
'setattr',
'slice',
'sorted',
'staticmethod',
'str',
'sum',
'super',
'tuple',
'type',
'vars',
'zip']

iii- الوظائف المتداخلة

وظيفة داخل وظيفة.

هناك قاعدة LEGB لترتيب اولوية البرنامج في البحث بين النطاقات وهي نطاق البحث المحلي، مرفق داخل الوظيفة، والنطاقات العالمية، بنيت في النطاق مسبقا على التوالي.

def square():
	""" return square of value """
	def add():
		""" add two local variable """
		x = 2
		y = 3
		z = x + y
		return z
	return add()**2
print(square())

النتيجة.

25

iv- المدخلات الافتراضية والمرنة

def f(a, b=1):

مدخل افتراضي b=1.

def f(*args):

قد يكون مدخل واحد او أكثر args.

def f(** kwargs):

kwargs عبارة عن قاموس dictionary.

مثال للمدخل الافتراضي.

def f(a, b = 1, c = 2):
	y = a + b + c
	return y
print(f(5))
print(f(5,4,3))

النتيجة.

8
12

مثال للمدخل المرن والقاموس dictionary.

def f(*args):
	for i in args:
		print(i)
f(1)
print("")
f(1,2,3,4)
# flexible arguments **kwargs that is dictionary
def f(**kwargs):
	""" print key and value of dictionary"""
	for key, value in kwargs.items(): # If you do not understand this part turn for loop part and look at dictionary in for loop
		print(key, " ", value)
f(country = 'spain', capital = 'madrid', population = 123456)

النتيجة.

1
1
2
3
4
country spain
capital madrid
population 123456

v- وظيفة Lambda

أسرع طريقة للكتابة وظيفة.

ما يسبق هذه العلامة “:” يعبر عن مدخلات الوظيفة اما ما بعدها هو جسد الوظيفة.

square = lambda x: x**2 # where x is name of argument
print(square(4))
tot = lambda x,y,z: x+y+z # where x,y,z are names of arguments
print(tot(1,2,3))

النتيجة.

16
6

vi- الوظيفة المجهولة

مثل وظيفة lambda ولكن يمكن أن يستغرق أكثر من مدخل واحدة.

يطبق الوظيفة على كل العناصر في القائمة.

map(func,seq)

مثال.

number_list = [1,2,3]
y = map(lambda x:x**2,number_list)
print(list(y))

النتيجة.

[1, 4, 9]

vii- المكررات Iterators

iterable هو كائن يمكنه المرور عليه عن طريق المكرر iterator.

iterable: كائن مقترن به وظيفة ()iter.

سبيل المثال: قائمة list، سلسلة series وقواميس dictionaries.

المكرر iterator: ينتج القيمة التالية باستخدام الطريقة ()next.

مثال.

# iteration example
name = "ronaldo"
it = iter(name)
print(next(it)) # print next iteration
print(*it) # print remaining iteration

النتيجة.

r
o n a l d o

()zip يجمع البيانات في قائمة .

مثال.

# zip example
list1 = [1,2,3,4]
list2 = [5,6,7,8]
z = zip(list1,list2)
print(z)
z_list = list(z)
print(z_list)

النتيجة.

<zip object at 0x7fd37c671888>
[(1, 5), (2, 6), (3, 7), (4, 8)]

()zip عكس ()unzip.

()unzip تعيد tuble .

مثال

un_zip = zip(*z_list)
un_list1,un_list2 = list(un_zip) # unzip returns tuble
print(un_list1)
print(un_list2)
print(type(un_list2))

النتيجة.

(1, 2, 3, 4)
(5, 6, 7, 8)
<class 'tuple'>

viii- قائمة الادراك List comprehension

واحدة من أهم الموضوعات هذه المقال.

نحن نستخدم قائمة الادراك لتحليل البيانات في كثير من الأحيان.

قائمة الادراك: نختصر المرور على القوائم في سطر واحد.

مثال.

# Example of list comprehension
num1 = [1,2,3]
num2 = [i + 1 for i in num1 ]
print(num2)

النتيجة.

[2, 3, 4]

قائمة الادراك: [i + 1 for i in num1].

صيغة قائمة الادراك: i +1.

صيغة المرور: for i in num1.

مكرر iterator: i.

القائمة التي سيتم المرور عليها: num1.

والان لنجرب وضع بعض الشروط.

# Conditionals on iterable
num1 = [5,10,15]
num2 = [i**2 if i == 10 else i-5 if i < 7 else i+5 for i in num1]
print(num2)

النتيجة.

[0, 100, 20]

لنجرب قائمة الادراك على قاعدة البينات خاصتنا.

threshold = sum(data.Speed)/len(data.Speed)
data["speed_level"] = ["high" if i > threshold else "low" for i in data.Speed]
data.loc[:10,["speed_level","Speed"]] # we will learn loc more detailed later

النتيجة.

speed_level Speed
0 low 45
1 low 60
2 high 80
3 high 80
4 low 65
5 high 80
6 high 100
7 high 100
8 high 100
9 low 43
10 low 58

 

 

 

 

 

 

 

 

 

 

 

 

 

 

سنتعرف على صفة loc لاحقا.

و بذلك ننتهي من الجزء الاول الخاص بالPython, و نسوف نتحدث في الجزء الثاني عن طريقة التعامل مع البيانات

المصدر: DATA SCIENTIST, Kaggle

 

تعليقات