ตอนก่อนหน้า: บันทึก training data science EP 1: Intro – เครื่องมือเครื่องใช้

หวัดดีฮะ ทุกคน~

ต่อจาก EP 1 ที่ได้เล่าที่มากันพอหอมปากหอมคอแล้วนั้น EP นี้จะเล่าถึงการดูภาพรวมของข้อมูลที่เราจะเอามาวิเคราะห์นะฮะ

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

และเพื่อการนั้น เราจะมารู้จัก library ของ Python ที่สุดจะเป็นพื้นฐานของงาน data science นั่นคือ

Pandas

Pandas เป็น library ที่ใช้งานกันอย่างกว้างขวางมากๆเลยฮะ ด้วยความง่ายและครบ แค่ลงตัวนี้ตัวเดียวก็เกือบครอบจักรวาลงานที่เราต้องทำ เรามาดูโครงสร้างหลักๆ กันก่อนฮะ นั่นคือ Dataframe

ลักษณะของ Dataframe มันก็คือตารางดีๆ นี่เองฮะ โดย Columns ต่างๆ กันตามข้อมูลที่เรามี และถ้าเราเลือกข้อมูลออกมาแค่หนึ่ง column จะเรียกว่า Series ฮะ

ทีนี้มันมีอีกศัพท์นึง คือ Index ที่บอกพิกัดของค่าในตาราง แบ่งได้อีกสองคำ นั่นคือ

  • Row index เป็นค่าเฉพาะ (unique value) บอกที่อยู่ตามแถว
    จำเป็นต้องกำหนดก่อนว่า column ไหนเป็น index column เพราะมันจะอิงค่าจาก column นั้น
  • Column index เป็นค่าเฉพาะบอกที่อยู่ตาม column

สมมติจากรูปข้างบน ถ้าเรากำหนดให้ column A เป็น index column เราจะสามารถบอกได้ว่า ค่าที่ row index“A3” และ column index “C” คือค่า “C3” ฮะ

ลองเล่นกันดูดีกว่าเนอะ

dataset ที่ผมจะเล่นกันครั้งนี้ ได้รับการสนับสนุนมาจาก Kaggle.com/hesh97 ฮะ มันคือเรื่อง Titanic ชู้รักเรือล่มนั่นเอง

อ่านไฟล์

ก่อนอื่นเลย ก็ต้อง import pandas กันก่อนฮะ แล้วใช้ pandas เปิดไฟล์อันนี้มาอ่านดูคร่าวๆ

import pandas as pd
titanic = pd.read_csv("./titanicdataset-traincsv.csv")
titanic

ขอดูเพิ่มอีกหน่อย

สังเกตว่าข้อมูลมันยาวมาก จนแสดงผลไม่หมดในครั้งเดียวนะฮะ ตรงนี้ถ้าใครอยากจะให้มันแสดงผลมากกว่านี้ หรือแสดงหมดเลย ใช้คำสั่งนี้ได้ฮะ

# show 15 rows
pd.set_option('display.max_rows', 15)
# show ALL rows
pd.set_option('display.max_rows', None)

Ref:
https://dev.to/chanduthedev/how-to-display-all-rows-from-data-frame-using-pandas-dha

ใช้วงเล็บเหลี่ยม

เอาล่ะ เรามาดูความสามารถของ Dataframe กันฮะ ว่ามันทำอะไรได้บ้าง

print(type(titanic[['Sex']]))
titanic[['Sex']]

ถ้าเราใช้วงเล็บก้ามปูสองคู่แบบนี้ จะได้ผลลัพท์เป็น Dataframe ที่มี columns ตามที่เลือก

วงเล็บเหลี่ยมสองคู่ จะได้ DataFrame

ในขณะที่...

print(type(titanic['Sex']))
titanic['Sex']

ใช้วงเล็บก้ามปูคู่เดียว จะได้ Series ของ column ที่เราเลือกฮะ

วงเล็บเหลี่ยมคู่เดียว จะได้ Series

Head and tail

titanic.head()
titanic.tail()

head() แสดง 5 บรรทัดแรก ส่วน tail() แสดง 5 บรรทัดสุดท้ายของ Dataframe ฮะ ถ้าจะให้แสดงมากกว่านั้นก็ใส่ตัวเลขลงไปในวงเล็บฮะ

Columns

dataframe.columns

แสดงชื่อ column ทั้งหมดของ Dataframe ฮะ สามารถเปลี่ยนชื่อ column ด้วยการ assign ใช้เครื่องหมายเท่ากับได้เลยฮะ

Indexes

dataframe.index

แสดงชื่อ index ซึ่งเริ่มต้นจะเป็นเลขที่ของ row ฮะ

Shape

dataframe.shape

แสดงขนาดของ  Dataframe นั่นก็คือจำนวน row และ column ฮะ

ดูรายละเอียด

dataframe.info()

แสดงรายละเอียดของ Dataframe

เชิงสถิติ

dataframe.describe()

แสดงข้อมูลสถิติเบื้องต้นของ Dataframe ที่เป็นตัวเลข

พิกัด

dataframe.loc[a,b]

แสดงค่าที่ระบุพิกัดด้วยค่าของ Row Index และ Column Index

dataframe.iloc[a,b]

แสดงค่าที่ระบุพิกัดด้วยลำดับของ Row Index และ Column Index

เรียงลำดับ

dataframe.sort_values()

เรียงลำดับค่าใน Dataframe จากตัวอย่างคือ ให้เรียงตาม 'Age' และถ้าแถวไหนมี 'Age' เป็น NaN ให้เอาไว้ล่างสุด (na_position='last')

จัดการค่า NaN

dataframe.dropna()

ลบข้อมูล NaN ทิ้งไป จากตัวอย่างคือ ลบทั้งแถว (axis=0) ถ้าพบว่ามี NaN ในแถวแม้แต่ค่าเดียว (how='any')

dataframe.fillna()

เติมค่าเมื่อเจอ NaN จากตัวอย่างคือ ใส่เลข 0 ทุกที่ที่เจอ NaN

จัดกลุ่ม

dataframe.groupby()

รวมกลุ่มข้อมูลของ Dataframe ออกมาโดยระบุ columns จากตัวอย่างคือให้รวมกลุ่มตามค่า 'Pclass'

จัดการ indexes

dataframe.set_index()

กำหนด Row Index จากค่า column ที่กำหนด เช่น ตัวอย่างให้กำหนด Row Index จากค่าของ 'PassengerId'

dataframe.reset_index()

ยกเลิก Row Index และจะได้ column ใหม่ชื่อ index ฮะ

ตัวอย่าง 1

เติมค่าลงไปใน column ที่เลือก เมื่อเจอค่า NaN ตัวอย่างคือเติมข้อความเมื่อ 'Cabin' เป็น NaN และให้มีผลกับ Dataframe เดิม (inplace=True)

dataframe.single_column.fillna()

ตัวอย่าง 2

ให้จัดกลุ่มตาม columns ที่กำหนด แล้วหาค่าเฉลี่ยของ column ที่เลือก จากตัวอย่างคือให้แบ่งกลุ่ม Dataframe ด้วยค่า 'Pclass' และ 'Sex' แล้วหาค่าเฉลี่ยของ 'Age'

dataframe.groupby().single_column.mean()

เอกสารเพิ่มเติม

สำหรับความสามารถของ Dataframe แบบเต็มๆ เข้าไปดูได้ที่ลิ้งก์นี้เลยฮะ มีครบทุกฟังก์ชันเลยทีเดียว

matplotlib

ทีนี้เราหันมาใช้ matplotlib ซึ่งเป็น library เริ่มต้นที่ใช้หากินอีกเหมือนกันฮะ เพื่อบอกให้พี่คนนี้ plot graph แบบด่วนๆ ได้เลย ถ้าให้เวลาสักหน่อย ก็สามารถอัพเกรดเป็นกราฟสวยๆ ซับซ้อนๆ ได้เหมือนกันฮะ

จริงๆ แล้วเราสามารถใช้ matplotlib ได้โดยตรงเลยนะฮะ แต่คราวนี้เราได้รู้จัก pandas ไปแล้ว เราก็จะทำคอมโบสองตัวนี้เข้าด้วยกัน เพื่อให้ชีวิตเราง่ายขึ้นฮะ

เริ่มต้นจาก import มันมาก่อน โดยคราวนี้เราจะใช้แค่ module pyplot แล้วย่อชื่อให้เหลือแค่ plt ฮะ

import matplotlib.pyplot as plt
%matplotlib inline

ส่วน %matplotlib inline เอาไว้แสดงผลกราฟผ่านทาง Jupyter ฮะ เพราะถ้าเราไม่ใส่บรรทัดนี้ เราจะต้องเพิ่มคำสั่ง show() เข้าไปด้วย

จาก Dataframe Titanic ข้างบน เรามาลองตั้งคำถามกันแบบเบาๆ กันฮะ

1. ส่วนใหญ่แล้วคนบนเรือมีอายุเท่าไหร่กันบ้างนะ

titanic[['Age']].plot.hist()

histogram เป็นกราฟความถี่ จะเห็นได้เลยฮะว่า ส่วนใหญ่คนในเรือนั้นมีอายุอยู่ในช่วง 20-30 ปี

2. ในเรือมีผู้หญิงหรือผู้ชายมากกว่ากัน

titanic['Sex'].value_counts().plot(kind='bar')

value_counts() คือ การนับจำนวนของแต่ละค่าใน Series เราใช้นับจำนวนลูกเรือแต่ละเพศแล้วเอาไปพล็อต bar graph หรือกราฟแท่งนั่นเองฮะ

3. สัดส่วนของเพศกับคนที่รอดตาย

ตรงนี้เราใช้ Pie chart เนื่องจากต้องการแสดงสัดส่วน โดยข้อมูลคือ เพศและสถานะการรอดชีวิต เอามาแบ่งกลุ่ม จากนั้นก็นับจำนวนข้อมูลแต่ละกลุ่มก่อนพล็อตกราฟฮะ

4. อายุกับค่าตั๋วของลูกเรือ

เราสร้าง Scatter graph หรือแผนภาพกระจายของ Dataframe โดยให้แกน x คืออายุ ส่วนแกน y คือค่าตั๋วฮะ


ข้างบนเป็นแค่น้ำจิ้มฮะ เนี่ยเราสามารถเขียนบรรทัดเดียวสร้างกราฟแบบง่ายๆ จาก Dataframe ได้เลยนะฮะ

สำหรับตัวเต็ม สำหรับคนชอบจัดเต็มให้กราฟตัวเอง ก็ไปดูได้ที่ https://matplotlib.org/contents.html นะฮะ

ตอนต่อไป จะเป็นอะไรนั้น รอติดตามกันนะฮะ

บาย~

ตอนต่อไป: บันทึก training data science EP 3: Matplotlib & Seaborn – แผนที่ดูแพง