Python for Data Science — Botnoi Classroom
สวัสดีค่า วันนี้จะมาพูดถึงหลักสูตร 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