Python for Data Science — Botnoi Classroom

Preeyanuch Leelapisuth
botnoi-classroom
Published in
4 min readNov 3, 2019

สวัสดีค่า วันนี้จะมาพูดถึงหลักสูตร Python for Data Science ของ Botnoi classroom ซึ่งคลาสเรียนนี้จะเน้น library ที่จำเป็นสำหรับงาน Data science โดยเฉพาะ Pandas ซึ่งถือว่าเป็น 1 ใน library Python ที่สำคัญมากๆ

โดยรูปแบบการสอนของ botnoi classroom จะเป็นการสอนทฤษฎี 1 ชั่วโมง และ Workshop 2 ชั่วโมง ซึ่งในบทความนี้ก็จะนำเนื้อหาและ exercise ส่วนหนึ่งในคลาสมาเล่าให้ทุกคนฟังกันค่า

Library ที่นิยมใช้กันบ่อยๆในงาน Data Science ก็จะมีอยู่ 3 ตัวหลักๆคือ numpy , pandas และก็ matplotlib

Import Library

ก่อนอื่นเราก็ import library กันก่อน

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

Load Data set

ในบทความนี้ทุกคนสามารถดาวน์โหลดชุดข้อมูลและทำตามได้เลยค่าที่ link → https://drive.google.com/openid=1tltwco2WkDMXnyhmUOz5FDG0P7 X42VbF

Data set ที่เราจะใช้กันจะเป็น data เกี่ยวกับ Digimon ต่างๆ ซึ่งเมื่อโหลด data set เข้ามาเราสามารถดูข้อมูลคร่าวๆด้วย คำสั่ง ‘.head()’

โดยหากไม่ใส่ argument by default จะshow 5 แถวแรก ซึ่งถ้าหากต้องการให้แสดงผล 10 แถวแรกก็สามารถทำได้โดยใส่จำนวนแถวที่ต้องการเข้าไป ในที่นี้คือ ‘.head(10)’

file_id='1tltwco2WkDMXnyhmUOz5FDG0P7X42VbF'
link='https://drive.google.com/uc?export=download&id={FILE_ID}'
csv_url=link.format(FILE_ID=file_id)
df = pd.read_csv(csv_url)
df.head()

Count NA/NaN values in each column

df.isna().sum()

เราสามารถจัดการกับ missing value ได้หลายแบบขึ้นอยู่กับข้อมูลแต่ละชุด แต่หนึ่งในวิธีที่นิยมใช้คือ เติม missing value ด้วยค่า mode

for col in df.columns:
col_mode = df[col].mode()[0]
df[col] = df[col].fillna(col_mode)
df.isna().sum()

Show descriptive or summary statistics

เราสามารถดูข้อมูลสถิติของ dataset คร่าวๆ ด้วยคำสั่ง ‘.describe()’

df.describe()

Count the number of digimon

df['Stage'].value_counts()

ต่อมาเราจะทำการนับจำนวน digimon ในแต่ละ stage ดูว่าในแต่ละ stage นั้นมีเท่าไหร่บ้าง ซึ่งจะเห็นว่า digimon ส่วนมากจะอยู่ในขั้น Mega

Group by / mean / iloc

อีกนึง function ที่มีประโยชน์ก็คือ groupby โดยในที่นี้ เราต้องการหาค่าเฉลี่ยของ digimon โดยแบ่งตาม status ซึ่งมีทั้งหมด 4 Types(Data, Free, Vaccine และ Virus) และต้องการให้แสดงผลเฉพาะ column Level ต่างๆ (column index ที่ 3 ถึง 8) ซึ่งสามารถทำได้ด้วย iloc

df.groupby(by='Type').mean().iloc[:,3:9]

Sort the dataframe

หากเราต้องการให้แสดงข้อมูลโดยเรียงลำดับตามค่าใน column หนึ่งๆ เราสามารถทำได้ด้วยคำสั่ง ‘.sort_values’ และระบุใน argument ว่าต้องการให้เรียงลำดับตามค่าใน column อะไร เรียงจากมากไปน้อยหรือน้อยไปมาก

df.sort_values(by='Lv 50 HP', ascending=False).head()

Select with condition

หากเราต้องการเลือกข้อมูลแบบมีเงื่อนไข สามารถใส่เงื่อนไขที่ต้องการใน [] ได้เลย เช่นเราต้องการเลือกข้อมูล Digimon เฉพาะที่ type เท่ากับ Virus เป็นต้น

df[df['Type'] == 'Virus']

Create a new column

การสร้าง column ใหม่ใน data frame สามารถทำได้โดย df[‘New_column_name] = new_column_value

ก่อนอื่นเราทำการดู column ทั้งหมดก่อน

df.columns

โจทย์คือเราต้องการส้ราง column ใหม่ชื่อว่า total_status โดยให้ค่าเป็นผลบวกของค่าใน column ‘Lv50 SP’, ‘Lv50 Atk’, ‘Lv50 Def’, ‘Lv50 Int’ และ ‘Lv50 Spd’ ซึ่งเราก็เริ่มจากสร้าง list status_cols ขึ้นมา ซึ่งประกอบด้วยชื่อ column ทั้งหมดที่เราต้องการนำมารวม

จากนั้นทำการเขียน for loop ให้บวกค่าจาก column ทั้งหมดใน list status_cols ให้เป็นค่าใน column ใหม่ซึ่งคือ total_status

status_cols = ['Lv50 SP', 'Lv50 Atk', 'Lv50 Def', 'Lv50 Int', 'Lv50 Spd']

df['total_status'] = 0
for col in status_cols:
df['total_status'] += df[col]

Merge table

บางครั้งเราอาจจะต้อง join ข้อมูลกับ DataFrame อื่น ซึ่งในpandas ก็สามารถทำได้ด้วย function pd.merge()

df2 = df.groupby(by='Attribute').mean().reset_index()
df2 = df2[['Attribute', 'Memory']]
df2.columns = ['Attribute', 'AvgMemory']
df2

สมมติว่าเรามี data frame อื่นชื่อว่า df2 ซึ่งมีหน้าตาดังรูป

เราสามารถนำมา join กับ data frame อันเดิม (df) ได้โดยระบุว่าต้องการ join on column ไหน และ how คือระบุว่าต้องการ โดย left, right, outer, หรือ inner join

merge_df = pd.merge(df, df2, on='Attribute', how='left')
merge_df.sample(10)

Plot graph

เมื่อเราได้ผลลัพท์บางส่วนออกมาแล้ว สามารถแสดงผลให้เข้าใจง่ายขึ้นด้วยการ plot graph

Histogram

ฮิสโตแกรม คือกราฟแท่งแบบเฉพาะที่แสดงความสัมพันธ์ระหว่างข้อมูลเป็นหมวดหมู่ที่เรียกว่าชั้นข้อมูลกับความถี่ของข้อมูล เพื่อดูการกระจายของข้อมูล โดยแกนตั้งจะเป็นตัวเลขแสดง “ ความถี่ ” และแกนนอนจะเป็นข้อมูลคุณสมบัติของสิ่งที่เราสนใจ ซึ่งในตัวอย่างนี้คือ total_status

df['total_status'].hist()

หากเราต้องการ plot histogram แบบแยกตาม column หลาย column พร้อมกันก็สามารถทำได้ โดยค่า alpha จะเป็นความทึบของกราฟ ซึ่งในที่นี่ตั้งค่าเป็น 0.5 เพื่อให้เห็นการซ้อนทับกันของกราฟ

status_cols = ['Lv50 SP', 'Lv50 Atk', 'Lv50 Def', 'Lv50 Int', 'Lv50 Spd']for col in status_cols:
df[col].hist(alpha=0.5)

plt.legend(status_cols)
plt.show()

Scatter plot

ใช้เมื่อต้องการเปรียบเทียบตัวแปรหรือชุดข้อมูลอย่างน้อย 2 ชุดขึ้นไป เพื่อแสดงความสัมพันธ์ระหว่างตัวแปรหรือชุดข้อมูลนั้น ในที่นี้เราต้องการ plot เพื่อดูความสัมพันธ์ระหว่างค่า Lv50 Atk (Attack)และ Lv50 Def (Defense)

df.plot.scatter(x='Lv50 Atk', y='Lv50 Def')

โดยเราสามารถปรับสีได้ ให้เข้ม-อ่อนตามค่าตัวแปรอื่น

df.plot.scatter(x='Lv50 Atk', y='Lv50 Def', c='Memory')

Box plot

เป็นกราฟที่มีประโยชน์อีก มากๆเช่นกัน โดยใช้แสดงสาระที่สำคัญของข้อมูลคือ ค่ากลาง ค่าการกระจาย สัดส่วนข้อมูลที่มากหรือน้อยกว่าค่ากลาง ( Symmetry ) รวมทั้งข้อมูลที่อยู่ห่างจากกลุ่มมากๆ (Outlier) เช่นจากกราฟจะเห็นว่า Lv50 Atk มีการกระจายตัวของข้อมูลมากที่สุด

df[status_cols].boxplot()

และนี่ก็คือเนื้อหาส่วนนึงที่ได้เรียนรู้จาก Botnoi Classroom : Python for data science ขอบคุณที่ติดตามอ่านกันจนจบนะคะ สำหรับบทความนี้ถ้าผิดพลาดประการใดต้องขออภัย ยังไงก็สามารถ Comment ติชมกันมาได้เลยนะคะ

สุดท้ายนี้ก็ขอฝากประชาสัมพันธ์คอร์สเรียน data science -> Botnoi Classroom

--

--