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

586

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()

النتيجة.

Citypoverty_rateGeographic Area
Abanda CDP78.8AL0
Abbeville city29.1AL1
Adamsville city25.5AL2
Addison town30.7AL3

Akron town

42AL4

 

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

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()

النتيجة.

idnamedatemanner_of_deatharmedagegenderracecitystate
03Tim Elliot02/01/15shotgun53.0MASheltonWA
14Lewis Lee Lembke02/01/15shotgun47.0MWAlohaOR
25John Paul Quintero03/01/15shot and Taseredunarmed23.0MHWichitaKS
38Matthew Hoffman04/01/15shottoy weapon32.0MWSan FranciscoCA
49Michael Rodriguez04/01/15shotnail gun39.0MHEvansCO

 

signs_of_mental_illnessthreat_levelfleebody_camera
TrueattackNot fleeingFalse
FalseattackNot fleeingFalse
FalseotherNot fleeingFalse
TrueattackNot fleeingFalse
FalseattackNot fleeingFalse

 

كما تري الان صفه “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 AreaCitypercent_completed_hs
0ALAbanda CDP21.2
1ALAbbeville city69.1
2ALAdamsville city78.9
3ALAddison town81.4
4ALAkron town68.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 areaCityshare_whiteshare_blackshare_native_americanshare_asianshare_hispanic
0ALAbanda CDP67.230.2001.6
1ALAbbeville city54.441.40.113.1
2ALAdamsville city52.344.90.50.32.3
3ALAddison town99.10.100.10.4
4ALAkron town13.286.5000.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_listarea_poverty_ratioarea_highschool_ratio
30NJ0.3035580.983615
50WY0.3371390.912479
6CT0.3398830.995254
21MA0.3550901.000000
20MD0.3820970.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

تعليقات