python-data-science-toolbox
python-data-science-toolbox

ในปัจจุบันการวิเคราะห์ข้อมูลต่างเนี่ย มันมีเครื่องมือและภาษาที่หลากหลากมากเพื่อนํามาใช้ให้ได้ผลลัพธ์ออกมา ซึ่งตัวหลักๆ ที่ยอดนิยมก็จะเป็น ภาษา R และ Python นั้นเอง

วันนี้เราจะมาพูดภาพรวมของ Python Toolbox ซึ่งเป็นเครื่องมือยอดนิยมที่ใช่ในการวิเคราะห์ข้อมูล ได้แก่

  1. Numpy
  2. Matplotlib
  3. Pandas

โดยจะอธิบายโดยรวมว่ามันมีประโยชน์ยังไงและน่าสนใจยังไงแล้วบทความต่อๆไปค่อยนํามาใช้งานเป็น workshop ให้ดูอีกที 🙂 แต่หลักๆแล้ว Eco-System ของ Python Data Science Toolbox ก็จะมีตามรูปด้านล่างนี้เลย

python data science ecosystem (https://scipy.org/)
python data science ecosystem (https://scipy.org/)

Numpy

ชื่อจริงของมันก็คือ Numeric Python แต่คนส่วนใหญ่จะเรียกว่า Numpy มันเป็น Python package ที่มีจุดเด่นด้าน Array N-Dimentsion และ มีสูตรคํานวณวิทยาศาสตร์มาให้ ไม่ว่าจะสูตรไหน mean,historical หรือ บลาๆ มันมีเตรียมมาให้ทั้งหมดเลย

รวมไปถึงความสามารถของ array ที่ในตัว python เองไม่สามารถทําได้ เช่น


list_a = [1,2,3]

list_b = [2,4,6]

# ถ้าใน python เอง มันจะไม่สามารถนํา list_c = list_a * list_b ได้

# จะขึ้นว่า TypeError: can't multiply sequence by non-int of type 'list' เพราะ list ของ python ไม่สามารถเอามาคูณได้

import numpy as np

list_c = np.array(list_a)

list_d = np.array(list_b)

list_e = list_c * list_d #output จะเป็น [4,10,18]

แต่ข้อจํากัดของ Numpy ที่มีก็คือมันเก็บ Data Type ได้เพียง Type เดียว เช่น


multiple_type = np.array(['hello',1,2])

#output: แปลงออกมาเป็น ['hello' '1' '2'] เฉยเลย

หรืออีกความหมายก็คือมันจับเป็น string หมดนั้นแหละ 🙂

Numpy N-Dimension Array

ตัวอย่างของ Numpy ที่ผ่านมาอย่างที่เห็นมันจะเป็นเรื่องของ 1-Dimension Array หมดเลย แต่จริงๆแล้วเจ้า Numpy เนี่ยมันถูกสร้างมาเพื่อจัดการ N-Dimension Array เลย แปลว่าเราจะสร้างกี่ N-Dimenion ออกมาก็ได้

ดูจากตัวอย่างข้างล่างนี้ๆ เมื่อสร้าง array 3 dimension ออกมาแล้ว


import numpy as np

array_dimension = np.array([[1,2,3],[4,5,6],[7,8,9]])

ทีนี้ผลลัพธ์เมื่อเราสร้าง Array แบบนั้นออกมาแล้วก็จะเป็นแบบรูปข้างล่างนี้

numpy-multi-dimension-array
numpy-multi-dimension-array

ทีนี้เรามี array แล้วแต่เราต้องเรียนรู้ที่จะใช้มันด้วยล่ะ โดยต้องรู้ว่าเรา access มันด้วยการ subsetting ยังไงได้บ้าง? และ นับจํานวนมันยังไง? โดยใช้วิธีการข้างล่างนี้

  • shape
    • อย่างที่รู้กันคือ N-dimension array เพราะฉะนั้นเราต้องรู้ให้ได้ว่ามีกี่ columns กี่ rows นั้นเอง เพื่อจะได้ access ถูก
    • เจ้า shape คือ function ที่จะบอกรายละเอียดของ Array ว่ามีกี่rows และcolumns โดยจากตัวอย่างข้างบนเมื่อเราสั่ง array_dimension.shape ค่าจะออกมาเป็น 3 rows 3 columns นั้นเอง เป็น 3มิติ เลย
  • subsetting
    • หรือคือการ get element แบบ list slice นั้นแหละ ซึ่งใช้ syntax เหมือนกันคือ [:] นั้นเอง เพียงแต่ถ้าหลาย dimension ก็จะเป็นแนวนี้ [:,1:3] คือ slice ได้ทั้ง column และ row
    • ยกตัวอย่างเช่น เราอยากได้ array ของ 5,6,8,9 เราก็สามารถสั่ง slice ได้ด้วย array_dimension[1:,1:] นั้นเอง ถ้ายังงง ให้ดูรูปด้านล่างนี้
    • จะเห็นเมื่อเราสั่ง array_dimension[1:,1:] มันจะเป็นการเลือก row ที่ 1 จนถึงสุดท้าย และ column ที่ 1 จนถึงสุดท้าย จะทําให้เกิด highlight สีเหลือง แล้วมันก็จะดึงค่านั้นมาเป็น array ให้เรานั้นเอง 🙂

      example-subsetting-numpy
      example-subsetting-numpy

Numpy Comparing Array

นอกจากนั้นคุณสมบัติอีกอย่างที่ควรรู้ไว้คือเรื่องของการ compare array ของ Numpy เช่น สมมุติน่ะว่าเรามี array ที่เก็บนํ้าหนักของ สาวๆอยู่ แล้วเราต้องการที่จะทราบว่าใคร overweight บ้าง เราจะจัดการยังไง? ถ้าในภาษาอื่นอาจจะต้อง iterate collection ออกมาแล้ว ยัดตัวที่ใช่กลับเข้าไป แต่ใน Numpy ใช้แบบข้างล่างเลย


import numpy as np

girl_weight_list = [45,55,30,80]
girl_weight_list_np = np.array(girl_weight_list)
print(girl_weight_list_np > 60)

# output = [False False False True]
# แค่นี้ก็จะได้ข้อมูลออกมาเลยว่าข้อมูลชุดไหนมากกว่า 60 บ้าง แะลอันไหนไม่ใช่

# ยิ่งไปกว่านั้นเราสามารถเลือกชุดข้อมูลออกมาได้ด้วย เช่น
print(girl_weight_list_np[girl_weight_list_np > 60])

# output = [80]

เห็นมะ ประโยชน์ของการใช้ Numpy มีค่อนข้างมากเลยล่ะ มันเร็วกว่าการ Iterate ข้อมูลแบบเก่าๆมากเลย มีประโยชน์เวลาจัดการ manage array มากๆ ซึ่งเราก็เอา array ไปทํา information ได้หลากหลายแบบนั้นเอง 🙂

Matplotlib

การทําการวิเคราะห์ข้อมูลสิ่งที่สําคัญอีกอย่างก็คือ การแสดงผลลัพธ์ออกมาให้คนเข้าใจ หรือ Data Visualization นั้นเอง เพราะถ้าไม่สามารถแสดงผลออกมาให้เข้าใจได้ การวิเคราะห์ข้อมูลที่ผ่านมาก็จะไร้ประโยชน์ทันที

ซึ่ง Matplotlib ตัวนี้ก็เป็นเครื่องมือที่ดีตัวนึงเลยในการทํา Data Visualization ออกมา ซึ่งมันมีความสามารถแสดงผล graph ออกมาได้หลากหลายรูปแบบตามด้านล่างนี้

matplotlib-example-graph (https://matplotlib.org/gallery/index.html)
matplotlib-example-graph (https://matplotlib.org/gallery/index.html)

เพราะฉะนั้นวันนี้เรามาดูตัวอย่างการ plot graph แบบง่ายๆกันก่อน แล้วถึงเวลาค่อยมาลงลึกกันอีกทีใน Workshop

Example of Line Plot


import matplotlib.pyplot as plot

year = [1950,1970,1990,2010]

pop = [2.519,3.629,5.263,6.972]

#as X axis and Y axis
plt.plot(year,pop) 

plt.show()

#Add label 
#plt.xlabel('Year')
#plt.ylabel('Population')

#Add title
#plt.title('World Population')

#Change axis dimension
#plt.ytick([0,2,4,6,8],['0','2B','4B','6B','8B'])

#Change Line color
#plt.plot(year, color='red')
#https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D
#https://matplotlib.org/users/colors.html

บู๊มมมม! ออกมาแบบนี้เลย ด้วยโค้ดสั้นๆแค่นั้น 🙂

example-line-plot-matplotlib
example-line-plot-matplotlib

ทีนี้เห็น Data Set ที่ใส่เข้าไปมั้ย? มันคือ List ของ Number แล้วเราพึ่งเรียนอะไรไปเมื่อกี้?​ …. Numpy ไง? มันก็คือแบบเดียวกันที่นี้ถ้าเราเปลี่ยน Python Number List เป็น Numpy เราก็จะสามารถ Manipulate value ใน list ออกมาเป็น Data Set ที่เราต้องการ แล้วก็เอามา Visualize ด้วย Matplotlib แบบสบายๆเลย 🙂

มารู้จัก Graph พื้นฐานที่ควรจะรู้กัน

อย่างที่รู้ว่าการทํา data analysis มันก็คือเรื่องของสถิตินั้นแหละ เพราะฉะนั้นพื้นฐานเราควรจะเข้าใจกราฟพื้นฐานเพื่อให้นํามาแสดงผลลัพธ์ของการวิเคราะห์ได้ถูกต้อง โดยหลักๆมี

  1. Line
  2. Scatter
  3. Histogram

Line

example-line-plot-matplotlib
example-line-plot-matplotlib

ใช้เมื่อไร?

Line Plot แสดงผล ข้อมูลที่มีความต่อเนื่อง ดูถึงการเปลี่ยนแปลงของข้อมูลต่อช่วงเวลาที่เปลี่ยนไป (trend and movement over time)

อ่านผลยังไง?

dimension ของแกน horizontal axis จะเป็นตัว ช่วงเวลา (time scale) ที่เป็น Trend เช่น เวลา,ปี,เดือน ส่วน vertical axis จะเป็น value ที่เราใช้ในการวัดค่า เช่น response time, จํานวนเงินเดือนเป็นต้น

Scatter

matplotlib-scatter
matplotlib-scatter

ใช้เมื่อไร?

เมื่อเราต้องการหา relationship กันระหว่าง 2 ตัวแปร หรือ คิดง่ายๆคือ Line มีแค่ตัวแปรเดียว แต่ Scatter มี 2 ตัวแปร

เช่น เราต้องการหาการเปลี่ยนไประหว่าง อุณหภูมิ กับ สารเคลือบผิวของถังเบียร์ ให้ horizontal axis อุณหภูมิ, vertical axis เป็น อัตราส่วนสารเคลือบผิว เราจะใช้ Scatter plot นั้นเองเมื่อเป็นหลายตัวแปร

อ่านผลยังไง?

Scatter มันจะแสดงถึงความเกี่ยวเนื่องของสองตัวแปร เช่นตัวอย่างด้านบนคือ horizontal axis คือ อุณหภูมิ ส่วน vertical axis คือ  ผิวของสารเคลือบ

จะเห็นว่าจุดเรียงตัวเป็นเส้นตรงมากขึ้น เมื่ออุณหภูมิแปลได้ว่า อุณหภูมิมีผลต่อสารเคลือบถังเบียร์ ยิ่งร้อน สารเคลือบยิ่งลดลงมากขึ้นเท่านั้นเป็น Positive Correlation นั้นเอง

ยกตัวอย่างถ้ากรณีเป็น Negative correlation แปลว่า ถึงแม้ว่าร้อนแค่ไหนก็ตาม สารเคลือบก็ไม่ได้ลดลงเลย

คําศัพท์สําคัญที่ต้องเข้าใจคือ

  •  Correlation (เรียก relationship ก็ได้เหมือนกัน)
    • Positive correlation = ทั้งสองตัวแปรไปทิศทางเดียวกัน
    • Negative correlation = ตัวแปรมีการเปลี่ยนแปลงไปคนล่ะทิศทางกัน
    • None correlation = ไม่มี relationship กันระหว่างข้อมูลเลย

Histogram

matplotlib.pyplot-example-histogram
matplotlib.pyplot-example-histogram

ใช้เมื่อไร?

Histogram เป็นการดูภาพรวมของชุดข้อมูลที่เรามีว่ามันมีการจัดกลุ่มยังไงบ้าง เหมือนการดูภาพรวมของข้อมูล ยกตัวอย่างเช่น การแจ้งยอดบัตรเครดิตในรอบหนึ่งปีว่าในแต่ละเดือนของเรามันมีการใช้จ่ายมากหน่อยเพียงใด?

จากตัวอย่างแปลว่า horizantal axis ก็จะเป็นเดือน และ vertical เป็นยอดใช้จ่ายที่เกิดขึ้นนั้นเอง และแยกยอดการใช้จ่ายตามเดือนก็จะเห็นภาพรวมของข้อมูลทั้งหมด

อ่านผลยังไง?

คําศัพท์สําคัญที่ต้องเข้าใจคือ

  • Bins
    • คือการเราจะ explore data ได้ แปลว่าเราต้องจัดกลุ่มให้มัน และ การจัดกลุ่มให้มันก็คือการเอาข้อมูลมายัดลงในช่วงแต่ละช่วงนั้นเอง ซึ่งภาษาสถิติเค้าเรียก Bins นั้นเอง

เพราะฉะนั้นเราจัดชุดข้อมูล horizantal axis ลงใน bins ที่เราตั้งใจไว้ เช่น เดือนของการจ่ายบัตรเครดิต หรือ ช่วงอายุ แล้วก็เอา vertical มาเทียบในแต่ละช่วง bins แบบนั้น

Pandas

Pandas เกิดมาเพื่อช่วยเวลาเราทํางานกับ Tabular Data เพราะเวลาเราจัดการกับข้อมูลจํานวนมหาศาล บ่อยครั้งที่มันจะมา Dataset แบบ Tabular (หรือ เข้าใจง่ายๆก็คือรูปแบบ table นั้นเอง) เช่น csv file เก็บข้อมูลของ request เป็นต้น

ปกติ Tabular data จะถูกออกแบบให้มี rows กับ columns ที่ถูกแบ่งออกกันตามสิ่งที่เราต้องการจะสังเกตุเช่น

  • rows = observations หรือ ค่าที่ต้องการจะเช็ค
  • columns = value ชอง observation นั้นๆ

ซึ่งเราอาจจะนึกถึง Numpy Array ที่เราเล่นกันข้างบนก็ได้ว่าเราสร้าง Array หลาย Dimension มาตอบสนองข้อมูลแบบ Tabular ได้ … แต่จริงๆแล้วไม่ใช่ เพราะ Numpy Array รับข้อมูลได้แค่ ONE DATA TYPE นั้นเอง แปลว่าถ้ามี int,float and string มันจะ convert เป็น String ให้เราทั้งหมดเลยนั้นเอง 🙂

นั้นเป็นเหตุผลที่มาของ Pandas ที่สามารถจัดการกับ DataFrame ได้แบบหลาย Data Type

วิธีสร้าง DataFrame

การสร้าง DataFrame มาได้จาก 2 แหล่งหลักๆ

  1. Dictionaries
  2. CSV file
Dictionaries to DataFrame Example

ตัวอย่างการแปลงจาก Python Dictionary ไปเป็น Pandas DataFrame


import pandas as pd

# Build cars DataFrame
names = ['United States', 'Australia', 'Japan', 'India', 'Russia', 'Morocco', 'Egypt']
dr = [True, False, False, False, True, True, True]
cpc = [809, 731, 588, 18, 200, 70, 45]
dict = { 'country':names, 'drives_right':dr, 'cars_per_cap':cpc }
cars = pd.DataFrame(dict)

#เมื่อ Print ออกมาจะได้ tabluar cars ว่าใครมีสิทธิ์ขับรถบ้าง
print(cars)

ซึ่งเราสามารถ specific index ของ Tabular ได้โดยไม่จําเป็นต้อง 0,1,2,3 แต่ให้เป็นชื่อได้เลย เช่น


# Definition of row_labels
row_labels = ['US', 'AUS', 'JAP', 'IN', 'RU', 'MOR', 'EG']

# Specify row labels of cars
cars.index = row_labels

CSV to DataFrame Example

ส่วนเจ้า csv ก็ไม่ได้ยากอะไร เพราะว่าเราสามารถใช้ pandas read_csv function ในการ import เข้ามาเลย โดยไม่จําเป็นต้องผ่าน python csv ทั่วไป


# Import pandas as pd
import pandas as pd

# Fix import by including index_col

#เราใส่ index_col = 0 จะหมายถึงเราปรับ index ของ csv file ให้ไม่รับ col แรก

#เพื่อเก็บไว้ทํา indexing นั้นเอง
cars = pd.read_csv('cars.csv',index_col=0)

# Print out cars
print(cars)

Index and Select Data ใน DataFrame

Column Access

การ Access Data ใน List หรือ Dictionary ถ้าเรา access ตรงๆโดยใช้ index มันจะได้ออกมาเป็น valeu ของ Index ตัวนั้นเลยใช่มั้ย? แบบ


list = [1,2,3]

print(list[0]) #output should be 1

แต่ถ้าเป็น Pandas จะไม่เพราะว่าเรามองว่ามันเป็น 1D Array เช่น


#เอาค่ามาจาก Cars ข้างบนเลยน่ะ

print(cars['country'])

#ออกมาเป็น column นั้นกับ Series เลย
#     country 
# US  United States 
# AUS Australia 
# JAP Japan 
# IN  India 
# RU  Russia 
# MOR Morocco 
# EG  Egypt 

# Name: country, dtype: object

เราเลยต้อง access แบบ array of array


#เอาค่ามาจาก Cars ข้างบนเลยน่ะ

print(cars[['country']])

# output ออกมาเป็น column ของ value นั้นๆแทน
#     country 
# US  United States 
# AUS Australia 
# JAP Japan 
# IN  India 
# RU  Russia 
# MOR Morocco 
# EG  Egypt 

# หรือจะ select หลายๆ column ก็ได้น่ะ
print(cars[['country','drives_right']])

#     country       drives_right
# US  United States True
# AUS Australia     False
# JAP Japan         False
# IN  India         False
# RU  Russia        True
# MOR Morocco       True
# EG  Egypt         True
Row Access

ในส่วนของ Row Pandas ใช้ Slicing เข้ามาจัดการเหมือนกับ Array ทั่วไป คือถ้าต้องการ element จากจุดไหนมาไหน ก็สามารถดึงมาใช้ได้เลย


print(cars[1:4])

#    cars_per_cap country   drives_right
#AUS 731          Australia False
#JAP 588          Japan     False
#IN  18           India     False

นั้นคือการ access Column and Rows แต่จริงๆแล้ว เรายังมีอีกวิธีนึงนั้นก็คือใช้ label-based หรือ loc นั้นเอง

Loc

เจ้า loc จริงๆแล้วมันคือการเรียก Label ของ Tabular data แค่นั้นแหละ โดยแบ่งออกเป็น 2 อย่างคือ

  1. loc = label
  2. iloc = index label

print(cars.loc[['AUS']])

#          cars_per_cap country   drives_right
#AUS    731               Australia False

print(cars.iloc[[1]])

#          cars_per_cap country   drives_right
#AUS    731               Australia False

#loc & loc แบบเลือก rows และ column เพื่อ slice

print(cars.iloc[[:,[0,1]]])

#       cars_per_cap country
#US   809 United States
#AUS 731 Australia
#JAP  588 Japan
#IN   18 India
#RU   200 Russia
#MOR 70 Morocco
#EG   45 Egypt

Pandas กับ Large files

เวลาที่เราทํางานกับ Data file ขนาดใหญ่ บางทีเราก็ไม่สามารถที่จะเก็บ file พวกนั้นเข้า Memory ได้ในทีเดียวเลย ดังนั้นเราเลยมีความจําเป็นที่จะต้องค่อยๆอ่านไฟล์ทีล่ะนิด ทีล่ะนิด แล้วนํามาประมวลผลนั้นเอง

 

สรุป!

จากการเรียนรู้ที่ยาวนานก็จบลงซะทีกับเครื่องมือยอดนิยมที่เราต้องใช้ในการจัดการกับ Data ด้วย python ซึ่งถ้าเราเข้าใจ Toolbox พวกนี้ มันช่วยให้เราสะดวกสบายในการจัดการมากๆ รวมไปถึงต่อไปในเรื่องอื่นๆได้อีกมากมายด้วย 🙂

เข้าใจคร่าวๆไปก่อนน่ะ แล้วเดี๋ยวจะทํา Workshop ในตอนต่อไปให้ครับ

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.