العرض المرئى للبيانات مجموعة Seaborn -الجزء الثاني-

513

في هذا المقال سنكمل الحديث عن المكتبة البرمجية Seaborn كي نتعلم سوياً الطرق المختلفة لعرض البيانات التي يحتاج اي عالم بيانات Data Scientist ان يتعرف عليها.

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

المحتوى

  1. معدلات أجناس القتلى وفقا للحالات في البيانات
  2. خصائص القتل
    1. طريقة الوفاة
    2. سلاح الجريمة
    3. أعمار القتلى
    4. أجناس القتلى
    5. معظم المدن الخطيرة
    6. معظم الولايات الخطيرة
    7. وجود امراض العقلية أم لا للقتلى
    8. أنواع التهديد
    9. أنواع الهروب
    10. وجود صور لأجسام القتلى أو لا للشرطة
    11. أرقام حالات القتل في الولايات في البيانات

 

1- معدلات أجناس القتلى وفقا للحالات في البيانات

لنلقي نظرة علي بيانات أجناس القتلى وفقا لحالات القتل في الولايات.

kill.race.head(15)

النتيجة.

0     A
1     W
2     H
3     W
4     H
5     W
6     H
7     W
8     W
9     B
10    W
11    B
12    B
13    W
14    B
Name: race, dtype: object

والان لنعرف عدد القتلى من كل جنس من الاجناس.

kill.race.value_counts()

النتيجة.

W    1201
B     618
H     423
A      39
N      31
O      28
Name: race, dtype: int64

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

kill.race.dropna(inplace = True)
labels = kill.race.value_counts().index
colors = ['grey','blue','red','yellow','green','brown']
explode = [0,0,0,0,0,0]
sizes = kill.race.value_counts().values

و الان لنعرض المخطط الدائري.

plt.figure(figsize = (7,7))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%')
plt.title('Killed People According to Races',color = 'blue',fontsize = 15)

النتيجة.

Text(0.5,1,'Killed People According to Races')

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

data = pd.DataFrame({'area_list': area_list,'area_poverty_ratio':area_poverty_ratio, 'area_highschool_ratio':area_highschool_ratio})
sorted_data['area_poverty_ratio'] = sorted_data['area_poverty_ratio']/max( sorted_data['area_poverty_ratio'])
sorted_data2['area_highschool_ratio'] = sorted_data2['area_highschool_ratio']/max( sorted_data2['area_highschool_ratio'])
data = pd.concat([sorted_data,sorted_data2['area_highschool_ratio']],axis=1)
data.sort_values('area_poverty_ratio',inplace=True)
data.head()

النتيجة.

area_list area_poverty_ratio area_highschool_ratio
30 NJ 0.303558 0.983615
50 WY 0.337139 0.912479
6 CT 0.339883 0.995254
21 MA 0.355090 1.000000
20 MD 0.382097 0.957107

 

والان حان وقت ادخال Machine Learning سنقوم بعرض مخطط الإنحدار الخطي linear regression, و يعتبر هذا المخطط او للتدقيق في الوصف “الخوارزمية” من أحد خوارزميات Machine Learning المعروفة جدا و افضل تعبير عن هذه الخوارزمية هو هذا المخطط.

sns.lmplot(x="area_poverty_ratio", y="area_highschool_ratio", data=data)
plt.show()

النتيجة.

/opt/conda/lib/python3.6/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval

و نكمل مع عرض هذه المقارنة بطريقة مختلفة اخرى. سبق و ان قمنا بعرض العملية حسابية شهيرة“تقدير كثافة النواة” ” Kernel density estimation” عن طريق مخطط المشترك joint plot. الان سنقوم بعرض نفس المخطط مرة اخري عن طريق مخطط kde الملحق في المكتبة البرمجية Seaborn.

sns.kdeplot(data.area_poverty_ratio, data.area_highschool_ratio, shade=True, cut=3)
plt.show()

النتيجة.

/opt/conda/lib/python3.6/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval

و نكمل مع عرض هذه المقارنة بطريقة مختلفة اخري مجددا. نتقوم بعض المقارنة هذة المرة عن طريق مخطط الكمان Violin Plot, و يمكنك التعرف علية اكثر من هنا.

pal = sns.cubehelix_palette(2, rot=-.5, dark=.3)
sns.violinplot(data=data, palette=pal, inner="points")
plt.show()

النتيجة.

و الان لننشئ علاقة مترابطة بين معدلات الفقر مع معدلات الحصول علي الثانوية في الولايات.

data.corr()

النتيجة.

area_poverty_ratio area_highschool_ratio
area_poverty_ratio 1.000000 -0.805761
area_highschool_ratio -0.805761 1.000000

 

و نقوم بعرض هذه العلاقة علي مخطط الخريطة الحرارية.

f,ax = plt.subplots(figsize=(5, 5))
sns.heatmap(data.corr(), annot=True, linewidths=0.5,linecolor="red", fmt= '.1f',ax=ax)
plt.show()

النتيجة.

و اخر مخطط سنقوم بعرضه على هذه المقارنة هو المخطط الزوجي pairplot. ليعرض لنا المخطط الزوجي pairplot اربعة مخططات 2 مخطط الصندوق و 2 مخطط النقط لاثنين من المتغيرات.

sns.pairplot(data)
plt.show()

النتيجة.

2-خصائص القتل

a- طريقة الوفاة

لنخفي تكرار طرق الوفاة في البيانات.

kill.manner_of_death.unique()

و نعرض النتيجة في مخطط الصندوق.

sns.boxplot(x="gender", y="age", hue="manner_of_death", data=kill, palette="PRGn")
plt.show()

لنعرض بيانات القتلى.

kill.head()

النتيجة.

id name date manner_of_death armed age gender race city
0 3 Tim Elliot 02/01/15 shot gun 53.0 M A Shelton
1 4 Lewis Lee Lembke 02/01/15 shot gun 47.0 M W Aloha
2 5 John Paul Quintero 03/01/15 shot and Tasered unarmed 23.0 M H Wichita
3 8 Matthew Hoffman 04/01/15 shot toy weapon 32.0 M W San Francisco
4 9 Michael Rodriguez 04/01/15 shot nail gun 39.0 M H Evans

 

state signs_of_mental_illness threat_level flee body_camera
WA True attack Not fleeing False
OR False attack Not fleeing False
KS False other Not fleeing False
CA True attack Not fleeing False
CO False attack Not fleeing False

 

و الان لنستعمل مخطط السرب swarmplot, من مميزات مخطط السرب swarmplot هو امكانية عرض متغيرات متعددة ذات علاقة ببعضها البعض. لنعرض اعداد القتلى من كل نوع ذكر او انثى, و اعمار القتلى و طريقة القتل.

sns.swarmplot(x="gender", y="age",hue="manner_of_death", data=kill)
plt.show()

النتيجة.

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

kill.gender.value_counts()

النتيجة.

M    2428
F     107
Name: gender, dtype: int64

و لكن  المكتبة البرمجية Seaborn تتيح لنا استخدام هذة الخاصيه و عرض النتيجة مباشرة و ذلك يسمى مخطط العدد countplot.

sns.countplot(kill.gender)
plt.title("gender",color = 'blue',fontsize=15)

النتيجة.

Text(0.5,1,'gender')

b- سلاح الجريمة

لنقوم باحصاء عدد الأسلحة المستخدمة لكل نوع من انواع الاسلحة ثم نعرض النتيجة في مخطط الشرائط barplot.

armed = kill.armed.value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=armed[:7].index,y=armed[:7].values)
plt.ylabel('Number of Weapon')
plt.xlabel('Weapon Types')
plt.title('Kill weapon',color = 'blue',fontsize=15)

النتيجة.

Text(0.5,1,'Kill weapon')

c- أعمار القتلى

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

df = pd.DataFrame({'age':above25})
sns.countplot(x=df.age)
plt.ylabel('Number of Killed People')
plt.title('Age of killed people',color = 'blue',fontsize=15)

النتيجة.

Text(0.5,1,'Age of killed people')

d- أجناس القتلى

لنعرض اجناس القتلى المختلفة و عدد القتلى لكل جنس منهم في مخطط العدد .countplot الذي سيساعدنا علي اختيار صفة “الجنس” من بيانات القتلى و طبعا سيقوم بإحصاء عدد القتلى لكل جنس منهم.

sns.countplot(data=kill, x='race')
plt.title('Race of killed people',color = 'blue',fontsize=15)

النتيجة.

Text(0.5,1,'Race of killed people')

e- معظم المدن الخطيرة

سنقوم بإحصاء عدد القتلى لكل مدينة ثم نعرض اول 12 مدينة في الترتيب كأكثر المدن الخطيرة في مخطط الشرائط barplot.

city = kill.city.value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=city[:12].index,y=city[:12].values)
plt.xticks(rotation=45)
plt.title('Most dangerous cities',color = 'blue',fontsize=15)

النتيجة.

Text(0.5,1,'Most dangerous cities')

f- معظم الولايات الخطيرة

بنفس الطريقة سنعرض اخطر الولايات.

state = kill.state.value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=state[:20].index,y=state[:20].values)
plt.title('Most dangerous state',color = 'blue',fontsize=15)

النتيجة.

Text(0.5,1,'Most dangerous state')

g- وجود امراض العقلية أم لا للقتلى

لنعطي مخطط العدد countplot البيانات و ندعه يتولي امر الإحصاء و العرض.

sns.countplot(kill.signs_of_mental_illness)
plt.xlabel('Mental illness')
plt.ylabel('Number of Mental illness')
plt.title('Having mental illness or not',color = 'blue', fontsize = 15)

النتيجة.

Text(0.5,1,'Having mental illness or not')

h- أنواع التهديد

sns.countplot(kill.threat_level)
plt.xlabel('Threat Types')
plt.title('Threat types',color = 'blue', fontsize = 15)

النتيجة.

Text(0.5,1,'Threat types')

i- أنواع الهروب

sns.countplot(kill.flee)
plt.xlabel('Flee Types')
plt.title('Flee types',color = 'blue', fontsize = 15)

النتيجة.

Text(0.5,1,'Flee types')

j- وجود صور لأجسام القتلى أو لا للشرطة

sns.countplot(kill.body_camera)
plt.xlabel('Having Body Cameras')
plt.title('Having body cameras or not on Police',color = 'blue',fontsize = 15)

النتيجة.

Text(0.5,1,'Having body cameras or not on Police')

k- أرقام حالات القتل في الولايات في البيانات

sta = kill.state.value_counts().index[:10]
sns.barplot(x=sta,y = kill.state.value_counts().values[:10])
plt.title('Kill Numbers from States',color = 'blue',fontsize=15)

النتيجة.

Text(0.5,1,'Kill Numbers from States')

المصدر: Seaborn Tutorial for Beginners, Kaggle

تعليقات