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

560

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

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

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

كما قرأت للتو، Seaborn يعتبر امتداد إلى Matplotlib ويستهدف تحديدًا التصور الإحصائي للبيانات. ولكنه يذهب إلى أبعد من ذلك. وهذا هو السبب في أنه يمكن معالجة مشاعر الإحباط من العمل مع Matplotlib. أو كما يقول مايكل واسكوم في “introduction to Seaborn”: “إذا حاول matplotlib أن تجعل الأشياء السهلة أمراً سهلاً وممكناً، فإن seaborn يحاول أن يجعل مجموعة محددة جيداً من الأشياء الصعبة سهلة أيضاً”.

المحتوي

  1. قراءة البيانات
  2. معدل الفقر لكل ولاية
  3. 15 اسم الأكثر شيوعًا أو اسمً العائلة للأشخاص الذين قتلوا
  4. معدل التخرج من المدرسة الثانوية من السكان الذين تزيد أعمارهم عن 25 في الولايات
  5. النسبة المئوية لعدد سكان الولاية حسب الأجناس التي تكون سوداء، بيضاء، أمريكية أصلية، آسيوية وإسبانية
  6. معدل التخرج من المدرسة الثانوية مقابل معدل الفقر لكل ولاية

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

1- قراءة البيانات

تأتي بيئة Python 3 هذه مع العديد من مكتبات التحليلات المفيدة المثبتة.

لنبدا باستيراد المكتبات البرمجية.

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

تتوفر ملفات البيانات في مجلد “../input/”. لنتفقد ما هي ملفات البيانات التي يحتويها هذا المجلد.

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

النتيجة.

MedianHouseholdIncome2015.csv
PercentOver25CompletedHighSchool.csv
PercentagePeopleBelowPovertyLevel.csv
PoliceKillingsUS.csv
ShareRaceByCity.csv

لنقم بقراءة الملفات كي نستطيع استعمالها لاحقا.

median_house_hold_in_come = pd.read_csv('../input/MedianHouseholdIncome2015.csv', encoding="windows-1252")
percentage_people_below_poverty_level = pd.read_csv('../input/PercentagePeopleBelowPovertyLevel.csv', encoding="windows-1252")
percent_over_25_completed_highSchool = pd.read_csv('../input/PercentOver25CompletedHighSchool.csv', encoding="windows-1252")
share_race_city = pd.read_csv('../input/ShareRaceByCity.csv', encoding="windows-1252")
kill = pd.read_csv('../input/PoliceKillingsUS.csv', encoding="windows-1252")

 

2- معدل الفقر لكل ولاية

لنتلقي نظرة علي معدلات الفقر في كل ولاية.

percentage_people_below_poverty_level.head()

النتيجة.

City poverty_rate Geographic Area
Abanda CDP 78.8 AL 0
Abbeville city 29.1 AL 1
Adamsville city 25.5 AL 2
Addison town 30.7 AL 3

Akron town

42 AL 4

 

بعض المعلومات عن البيانات.

percentage_people_below_poverty_level.info()

النتيجة.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 29329 entries, 0 to 29328
Data columns (total 3 columns):
Geographic Area    29329 non-null object
City               29329 non-null object
poverty_rate       29329 non-null object
dtypes: object(3)
memory usage: 687.5+ KB

لنعرض الولايات المتواجدة داخل البيانات دون تكرار.

percentage_people_below_poverty_level['Geographic Area'].unique()

النتيجة.

array(['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL', 'GA',
       'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA',
       'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY',
       'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX',
       'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY'], dtype=object)

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

لنستبدل قيمة معدل الفقر في الولايات التي لا تملك هذة المعلومه من “-” الي 0.0 .

percentage_people_below_poverty_level.poverty_rate.replace(['-'],0.0,inplace = True)

لنحول بيانات معدلات الفقر الى float.

percentage_people_below_poverty_level.poverty_rate = percentage_people_below_poverty_level.poverty_rate.astype(float)

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

area_list = list(percentage_people_below_poverty_level['Geographic Area'].unique())
area_poverty_ratio = []
for i in area_list:
    x = percentage_people_below_poverty_level[percentage_people_below_poverty_level['Geographic Area']==i]
    area_poverty_rate = sum(x.poverty_rate)/len(x)
    area_poverty_ratio.append(area_poverty_rate)
data = pd.DataFrame({'area_list': area_list,'area_poverty_ratio':area_poverty_ratio})
new_index = (data['area_poverty_ratio'].sort_values(ascending=False)).index.values
sorted_data = data.reindex(new_index)

و الان لنعرض النتيجة في مخطط الشرائط bar plot.

plt.figure(figsize=(15,10))
sns.barplot(x=sorted_data['area_list'], y=sorted_data['area_poverty_ratio'])
plt.xticks(rotation= 45)
plt.xlabel('States')
plt.ylabel('Poverty Rate')
plt.title('Poverty Rate Given States')

النتيجة.

Text(0.5,1,'Poverty Rate Given States')

3- 15 اسم الأكثر شيوعًا أو اسمً العائلة للأشخاص الذين قتلوا

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

kill.head()

النتيجة.

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

 

signs_of_mental_illness threat_level flee body_camera
True attack Not fleeing False
False attack Not fleeing False
False other Not fleeing False
True attack Not fleeing False
False attack Not fleeing False

 

كما تري الان صفه “name” تحمل الاسم كاملا لذلك سنقوم بفصلهم اولا ثم نقوم بحساب عدد تكرار الاسم او اسم العائلة.

separate = kill.name[kill.name != 'TK TK'].str.split() 
a,b = zip(*separate)                    
name_list = a+b                         
name_count = Counter(name_list)         
most_common_names = name_count.most_common(15)  
x,y = zip(*most_common_names)
x,y = list(x),list(y)

لنعرض اكثر 15 اسم تواجدوا في القائمة في مخطط الشرائط bar plot ايضا.

plt.figure(figsize=(15,10))
ax= sns.barplot(x=x, y=y,palette = sns.cubehelix_palette(len(x)))
plt.xlabel('Name or Surname of killed people')
plt.ylabel('Frequency')
plt.title('Most common 15 Name or Surname of killed people')

النتيجة.

Text(0.5,1,'Most common 15 Name or Surname of killed people')

4- معدل التخرج من المدرسة الثانوية من السكان الذين تزيد أعمارهم عن 25 في الولايات

لنتلقي نظرة علي معدلات التخرج من الثانوية في الولايات.

percent_over_25_completed_highSchool.head()

النتيجة.

Geographic Area City percent_completed_hs
0 AL Abanda CDP 21.2
1 AL Abbeville city 69.1
2 AL Adamsville city 78.9
3 AL Addison town 81.4
4 AL Akron town 68.6

 

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

percent_over_25_completed_highSchool.info()

النتيجة.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 29329 entries, 0 to 29328
Data columns (total 3 columns):
Geographic Area         29329 non-null object
City                    29329 non-null object
percent_completed_hs    29329 non-null object
dtypes: object(3)
memory usage: 687.5+ KB

لنستبدل قيمة معدل الحاصلي علي الثانوية في الولايات التي لا تملك هذة المعلومه من “-” الي 0.0 ونحول بيانات معدلات الفقر الى float.

percent_over_25_completed_highSchool.percent_completed_hs.replace(['-'],0.0,inplace = True)
percent_over_25_completed_highSchool.percent_completed_hs = percent_over_25_completed_highSchool.percent_completed_hs.astype(float)

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

area_list = list(percent_over_25_completed_highSchool['Geographic Area'].unique())
area_highschool = []
for i in area_list:
    x = percent_over_25_completed_highSchool[percent_over_25_completed_highSchool['Geographic Area']==i]
    area_highschool_rate = sum(x.percent_completed_hs)/len(x)
    area_highschool.append(area_highschool_rate)

و اخيرا نقوم بترتيب معدلات الولايات ترتيبا تصاعديا.

data = pd.DataFrame({'area_list': area_list,'area_highschool_ratio':area_highschool})
new_index = (data['area_highschool_ratio'].sort_values(ascending=True)).index.values
sorted_data2 = data.reindex(new_index)

و الان لنعرض النتيجة في مخطط الشرائط bar plot.

plt.figure(figsize=(15,10))
sns.barplot(x=sorted_data2['area_list'], y=sorted_data2['area_highschool_ratio'])
plt.xticks(rotation= 90)
plt.xlabel('States')
plt.ylabel('High School Graduate Rate')
plt.title("Percentage of Given State's Population Above 25 that Has Graduated High School")

النتيجة.

Text(0.5,1,"Percentage of Given State's Population Above 25 that Has Graduated High School")

5- النسبة المئوية لعدد سكان الولاية حسب الأجناس التي تكون سوداء، بيضاء، أمريكية أصلية، آسيوية وإسبانية

لنتلقي نظرة علي نسب الاجناس المختلفة في كل ولاية.

share_race_city.head()

النتيجة.

Geographic area City share_white share_black share_native_american share_asian share_hispanic
0 AL Abanda CDP 67.2 30.2 0 0 1.6
1 AL Abbeville city 54.4 41.4 0.1 1 3.1
2 AL Adamsville city 52.3 44.9 0.5 0.3 2.3
3 AL Addison town 99.1 0.1 0 0.1 0.4
4 AL Akron town 13.2 86.5 0 0 0.3

 

ملخص لتفاصيل البيانات.

share_race_city.info()

النتيجة.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 29268 entries, 0 to 29267
Data columns (total 7 columns):
Geographic area          29268 non-null object
City                     29268 non-null object
share_white              29268 non-null object
share_black              29268 non-null object
share_native_american    29268 non-null object
share_asian              29268 non-null object
share_hispanic           29268 non-null object
dtypes: object(7)
memory usage: 1.6+ MB

ولان سنقوم بتجميع عدد الاجناس المختلفة لكل ولاية, حيث ان من الطبيعي ان تحتوي الولاية الواحدة علي اكثر من جنس واحد من البشر, لذلك سنقوم بحساب عدد افراد الجنس الواحد لكل ولاية ثم نقوم بعرض كل الاجناس للولاية الواحدة. و نتكرر ذلك مع كل الولايات.

كالعادة نقوم بعملية تنظيف للبيانات. سنستبدل العلامات مثل “-” و “x” بقيمة 0.0 كي نستطيع اجراء الحسابات عليها.

share_race_city.replace(['-'],0.0,inplace = True)
share_race_city.replace(['(X)'],0.0,inplace = True)

ولان سنقوم بعملية الحساب التى تحدثنا عليها سابقا.

share_race_city.loc[:,['share_white','share_black','share_native_american','share_asian','share_hispanic']] = share_race_city.loc[:,['share_white','share_black','share_native_american','share_asian','share_hispanic']].astype(float)
area_list = list(share_race_city['Geographic area'].unique())
share_white = []
share_black = []
share_native_american = []
share_asian = []
share_hispanic = []
for i in area_list:
    x = share_race_city[share_race_city['Geographic area']==i]
    share_white.append(sum(x.share_white)/len(x))
    share_black.append(sum(x.share_black) / len(x))
    share_native_american.append(sum(x.share_native_american) / len(x))
    share_asian.append(sum(x.share_asian) / len(x))
    share_hispanic.append(sum(x.share_hispanic) / len(x))

و الان لنعرض النتيجة في مخطط الشرائط المتعدد multiple bar plot كي نتمكن من رؤية الاجناس المختلفة في كل ولاية و عدد البشر في كل جنس منهم.

f,ax = plt.subplots(figsize = (9,15))
sns.barplot(x=share_white,y=area_list,color='green',alpha = 0.5,label='White' )
sns.barplot(x=share_black,y=area_list,color='blue',alpha = 0.7,label='African American')
sns.barplot(x=share_native_american,y=area_list,color='cyan',alpha = 0.6,label='Native American')
sns.barplot(x=share_asian,y=area_list,color='yellow',alpha = 0.6,label='Asian')
sns.barplot(x=share_hispanic,y=area_list,color='red',alpha = 0.6,label='Hispanic')

ax.legend(loc='lower right',frameon = True)     # legendlarin gorunurlugu
ax.set(xlabel='Percentage of Races', ylabel='States',title = "Percentage of State's Population According to Races ")

النتيجة.

[Text(0,0.5,'States'),
 Text(0.5,0,'Percentage of Races'),
 Text(0.5,1,"Percentage of State's Population According to Races ")]

6- معدل التخرج من المدرسة الثانوية مقابل معدل الفقر لكل ولاية

لنجري مقارنة بين نسبة معدل التخرج من المدرسة الثانوية مقابل معدل الفقر لكل ولاية, في البداية لابد من حساب النسب لكل متغير.

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

 

ثم نقوم بعرض المقارنة في مخطط النقاط كي يظهر لنا الفرق بشكل واضح.

f,ax1 = plt.subplots(figsize =(20,10))
sns.pointplot(x='area_list',y='area_poverty_ratio',data=data,color='lime',alpha=0.8)
sns.pointplot(x='area_list',y='area_highschool_ratio',data=data,color='red',alpha=0.8)
plt.text(40,0.6,'high school graduate ratio',color='red',fontsize = 17,style = 'italic')
plt.text(40,0.55,'poverty ratio',color='lime',fontsize = 18,style = 'italic')
plt.xlabel('States',fontsize = 15,color='blue')
plt.ylabel('Values',fontsize = 15,color='blue')
plt.title('High School Graduate  VS  Poverty Rate',fontsize = 20,color='blue')
plt.grid()

النتيجة.

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

g = sns.jointplot(data.area_poverty_ratio, data.area_highschool_ratio, kind="kde", size=7)
plt.savefig('graph.png')
plt.show()

النتيجة.

/opt/conda/lib/python3.6/site-packages/seaborn/axisgrid.py:2262: UserWarning: The `size` paramter has been renamed to `height`; please update your code.
  warnings.warn(msg, UserWarning)
/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

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

kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }

لنجرب عرض مخطط اخر لنفس المقارنة السابقم مع تغير شكلها فقط.

g = sns.jointplot("area_poverty_ratio", "area_highschool_ratio", data=data,size=5, ratio=3, color="r")

النتيجة.

 

بهذا نكون قد انتهينا من الجزء الاول و نستكمل بعض الاساليب الاخري لعرض البيانات في الجزء الثاني

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

تعليقات