บันทึก training data science EP 2: Pandas & Matplotlib – ดูแผนที่ก่อนเดินทาง
ตอนก่อนหน้า: บันทึก 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 ตามที่เลือก
ในขณะที่...
print(type(titanic['Sex']))
titanic['Sex']
ใช้วงเล็บก้ามปูคู่เดียว จะได้ Series
ของ column ที่เราเลือกฮะ
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 – แผนที่ดูแพง