Scatter Plot คืออะไร?

Scatter Plot คือ กราฟที่ใช้แสดงความสัมพันธ์ของตัวแปร 2 ตัวใน Dataset ไอเดียของกราฟ Scatter คือ การนำ data points ทั้งหมด ของตัวแปรทั้ง 2 ตัวแปร มาวางลงในกราฟจากนั้นดูความสัมพันธ์ทั้ง 2 ตัวแปร

สิ่งที่ต้องติดตั้ง

ในบทความนี้เราใช้ Python Libraries 3 ตัว คือ Pandas, Matplotlib และ Seaborn การติดตั้งไม่ยาก เปิด tetminal และติดตั้งด้วยคำสั่งต่อไปนี้

ติดตั้ง Pandas

pip3 install pandas

ติดตั้ง Matplotlib

pip3 install matplotlib

ติดตั้ง Seaborn

pip3 install seaborn

Dataset ที่ใช้

เราใช้ dataset ที่ดาวน์โหลดมาจากเว็บไซต์ kaggle.com เป็นไฟล์ csv น้ำหนักและความสูงของกลุ่มตัวอย่าง

โหลดไฟล์ที่นี่ dataset – Weight and Height (อาจจะต้องลงทะเบียนก่อนนะ ถึงจะกดปุ่มดาวน์โหลดได้)

ก่อนทำ Scatter Plot

เครื่องมือที่เราใช้วาดกราฟ หรือ plot กราฟ คือ Eclipse IDE การวาดในที่นี้ก็คือการโค๊ด หรือเขียนโปรแกรมให้มันออกมาเป็นกราฟ เพราะงั้นเราก็ต้องมีหน้าที่ใช้เขียนโปรแกรม

หากเขียน Python เราจะเรียกมันว่า Module เรียกง่ายๆก็เหมือนกับกระดาษเปล่าๆนั่นแหละ แต่หน้ากระดาษเปล่าๆนี้เราจำเป็นต้องใช้หน้ากระดาษที่อยู่ใน Editor หรือ IDE เพื่อที่เราจะได้รันโค๊ดได้

บน Eclipse เราจะเปิดหน้า Module ใหม่ได้ดังนี้

1.สร้าง Project ใหม่

  1. สร้างโปรเจ็คใหม่ บน Eclipse ให้กดที่ File -> New -> Project…
  1. กดเปิดไฟล์ PyDev และกดเลือก PyDev Project
  1. ต่อมาหน้า wizard เพื่อสร้างโปรเจ็คจะเด้งขึ้นมา ในช่อง Project Name ให้ใส่ชื่อโปรเจ็คลงไป จากนั้นเช็คว่าช่อง Interpreter เป็น Python เวอร์ชั่นล่าสุดหรือเปล่า ถ้าเป็นเวอร์ชั่นล่าสุด ก็ให้กด Finish ได้เลย เมื่อดูที่ช่องซ้ายมือจะเห็นไฟล์โปรเจ็คปรากฏอยู่

2.สร้าง Module ที่จะใช้ plot

  1. กดคลิ้กขวาที่ไฟล์โปรเจ็คซ้ายมือ จากนั้นกด New -> PyDev Module
  1. เมื่อหน้า wizard เด้งขึ้นมา ให้กรอกชื่อ Module ที่ช่อง Name ให้เว้นช่อง Package ว่างไว้ และกด Finish
  1. เมื่อกดเปิดไฟล์โปรเจ็คด้านซ้ายมือ จะเห็น Module นี้อยู่ไฟล์โฟลเดอร์ ในตัวอย่างด้านล่าง Module ที่เราเพิ่งสร้างคือ scatterPlot.py ให้กดเปิดมันออก เราจะเห็นหน้ากระดาษว่าง ด้านบน Module จะมีคำบอกวันที่เวลาที่สร้าง และชื่อผู้สร้างอยู่ ไม่จำเป็นต้องใส่ใจมัน หรือลบออกก็ได้ เพราะมันถูก comment ไว้แล้ว (โค๊ดที่ถูก comment ไว้จะไม่รันเวลาเรารันโปรแกรม มันมีไว้เพื่อให้เราอ่าน และเข้าใจว่าเราเขียนโค๊ดอะไรไว้เท่านั้น)

สร้าง Scatter Plot

  1. import libraries ที่จำเป็นก่อนที่ด้านบนสุดของ module
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

เรา import pandas, matplotlib และ seaborn ในบรรทัดที่ 6,7,8 ตามลำดับ โดยใช้ชื่อว่า pd, plt และ sns

  1. import dataset ในที่นี้เป็นจะเป็นข้อมูลหรือ dataset ที่เรานำเข้าจากภายนอก เพราะเราไม่ได้สร้างข้อมูลในหน้า Module นี้เอง แต่เราใช้ไฟล์ที่อยู่บนเว็บไซต์อื่น หรือไฟล์ที่อยู่บนเครื่องของเรา (กดที่นี่เพื่ออ่านวิธีนำเข้าข้อมูลจากภายนอก)
    จากนั้นใช้คำสั่ง print เพื่อดูข้อมูล dataset ที่เรามี
weight_height = pd.read_csv('/Users/maria/eclipse-workspace/weight-height.csv')
print(weight_height)

เมื่อรันโปรแกรมแล้วเราควรจะได้ข้อมูลดังต่อไปนี้

      Gender     Height      Weight
0       Male  73.847017  241.893563
1       Male  68.781904  162.310473
2       Male  74.110105  212.740856
3       Male  71.730978  220.042470
4       Male  69.881796  206.349801
...      ...        ...         ...
9995  Female  66.172652  136.777454
9996  Female  67.067155  170.867906
9997  Female  63.867992  128.475319
9998  Female  69.034243  163.852461
9999  Female  61.944246  113.649103
[10000 rows x 3 columns]

จะเห็นว่าใน dataset นี้มีทั้งหมด 3 คอลัมน์ คือ Gender, Height, และ Weight ข้อมูลที่เราสนใจคือคอลัมน์ Height และ Weight เนื่องจากเราต้องการทราบว่าความสูงและน้ำหนักมีความสัมพันธ์กันหรือไม่ และมีความสัมพันธ์กันอย่างไร ดังนั้นเราต้องเลือกเอาแค่ 2 คอลัมน์มาสร้าง dataframe

  1. สร้าง Series สำหรับ weight และ height คอลัมน์
weight_series = weight_height.loc[:,'Weight']
print(weight_series)
height_series = weight_height.loc[:,'Height']
print(height_series)

เมื่อรันโปรแกรม เราจะได้ output แบบด้านล่างนี้

0       241.893563
1       162.310473
2       212.740856
3       220.042470
4       206.349801
           ...    
9995    136.777454
9996    170.867906
9997    128.475319
9998    163.852461
9999    113.649103
Name: Weight, Length: 10000, dtype: float64
0       73.847017
1       68.781904
2       74.110105
3       71.730978
4       69.881796
          ...    
9995    66.172652
9996    67.067155
9997    63.867992
9998    69.034243
9999    61.944246
Name: Height, Length: 10000, dtype: float64

จะเห็นว่าในโปรแกรม เราใช้ .loc[] มันเป็น method ที่ใช้เข้าถึงข้อมูลใน dataset หรือ dataframe ของ pandas (อ่านเพิ่มเติมเกี่ยวกับ method .loc[] ได้ที่นี่)

  1. นำ Series ที่สร้าง มาทำ data frame
frame = {'Weight': weight_series, 'Height': height_series}
new_df = pd.DataFrame(frame)
print(new_df)

ตัวแปร frame เป็น dictionary ที่ได้มาจาก series ทั้ง 2 ตัวที่เราสร้าง

ตัวแปร new_df เป็นการสร้าง Pandas DataFrame โดยการส่ง dictionary ในตัวแปร frame เข้าไป

กดที่นี่เพื่อดูการสร้าง Pandas Series และ Pandas DataFrame

เมื่อรันโปรแกรม จะได้ output ดังต่อไปนี้

          Weight     Height
0     241.893563  73.847017
1     162.310473  68.781904
2     212.740856  74.110105
3     220.042470  71.730978
4     206.349801  69.881796
...          ...        ...
9995  136.777454  66.172652
9996  170.867906  67.067155
9997  128.475319  63.867992
9998  163.852461  69.034243
9999  113.649103  61.944246
[10000 rows x 2 columns]
  1. กำหนดแกน x, y สำหรับ Scatter plot
x = new_df['Weight']
y = new_df['Height']
plt.title("Relationship between weight and height")
plt.xlabel("Weight")
plt.ylabel("Height")

ตัวแปร x คือ การกำหนดข้อมูลบนแกน x ในที่นี้จะใช้ข้อมูล Weight จาก dataframe new_df

ตัวแปร y คือ การกำหนดข้อมูลบนแกน y ในที่นี้จะใช้ข้อมูล Height จาก dataframe new_df

plt.title คือ การกำหนดชื่อของกราฟ ชื่อนี้จะอยู่ด้านบนสุด

plt.xlabel และ plt.ylabel คือ การใส่ชื่อกำกับแกน x และ แกน y

  1. สร้าง Scatter plot
plt.scatter(x, y, alpha=0.5)

plt.scatter เป็นคำสั่งสร้างกราฟ scatter โดยใช้แกน x,y ตามที่กำหนดไว้

alpha คือ ความเข้มของ data points แต่ละตัว ซึ่งมีค่าความเข้มอยู่ที่ 0 และ 1 โดย 0 จะจาง และ 1 จะเข้ม ส่วนใหญ่เราจะให้ค่า alpha อยู่ที่ 0.5 เพราะบางที data points มันซ้อนกัน เราอาจจะมองไม่ชัดว่ามี data points ซ้อนกันอยู่ และถ้ามี data points ซ้อนกันเยอะๆ มันจะติดกันกลายเป็นปื้ดใหญ่ๆ ไม่สวย เพราะงั้นเอาจางๆหน่อยจะดีกว่า

ถ้าทำมาถึงขั้นตอนนี้คือเราสร้างกราฟ scatter เรียบร้อยแล้ว

ต่อมา หากคุณใช้ interactive python command shell เช่น IPython หรือ ใช้ notebook เช่น Jupyter notebook มันจะแสดงกราฟให้เราทันที ยกเว้นกรณีที่คุณโค๊ดใน terminals หรือ scripts บน IDE จะต้องใช้คำสั่งต่อไปนี้เพื่อแสดงกราฟ (หรือ figure)

plt.show()

ภาพที่ได้จะออกมาตามตัวอย่างด้านล่างนี้

สร้าง Linear Regression

Linear Regression เป็นวิธีวิเคราะห์เชิงคาดการณ์ เราจะใช้ในการทำนายหรือคาดการณ์ค่าของตัวแปรหนึ่ง เมื่ออีกตัวแปรหนึ่งมีการเปลี่ยนแปลง ตัวแปรที่เราต้องการทำนาย จะเรียกว่า dependent variable (ตัวแปรตาม)

Linear regression จะมีหน้าตาเป็นเส้นที่ลากตรงออกไป จะลากขึ้นหรือลากลงก็จะขึ้นอยู่กับข้อมูลว่ามีการเปลี่ยนแปลงไปในทิศทางใด

ในบทความนี้เราจะใช้ library seaborn ในการวาด linear regression นี้ และ method ที่ใช้เรียกว่า regplot()

regplot() จะวาง data points ให้เรา และวางเส้น linear ให้เราด้วย (ผลลัพธ์จะได้เป็น scatter plot ที่มีเส้น linear regression วางอยู่) ทำให้เราสามารถเห็นคาดการณ์คร่าวๆได้เลย

ส่วนตัวคิดว่า method นี้เหมาะเอามาทำ Data Visualisation แต่ไม่สมควรเอามาทำโมเดลใน Machine Learning เพราะใน Machine Learning เราต้องรู้ตำแหน่งเส้น linear แล้วเอามาคำนวณว่ามี score เท่าไหร่ มี accuracy rate เท่าไหร่ หากค่าความถูกต้องมีน้อย เราอาจต้องเปลี่ยนไปใช้โมเดลอื่น

ส่วน regplot() จะวางเส้น linear ในตำแหน่งที่ดีที่สุดให้เรา แต่เราจะไม่รู้ค่าตำแหน่งของมัน ทำให้คำนวณ score และ ค่า accuracy rate ไม่ได้ ดังนั้นเราจึงไม่แน่ใจอย่างแน่นอนว่าโมเดลนี้เป็นโมเดลที่เหมาะสมกับ dataset ที่มีแล้วหรือไม่

หากต้องการทำ Data Visualisation ด้วย regplot() เราสามารถลบฟังก์ชั่นของ matplotlib ออก แล้วใส่ method ของ seaborn แทน

บรรทัดที่ลบออก

plt.scatter(x, y, alpha=0.5)

method ของ seaborn ที่ใช้สร้าง linear

sns.regplot(x="Weight", y="Height", data=new_df)

และเหมือนเคย หากเขียนโปรแกรมบน script แบบนี้ ให้ใส่ plt.show() เพื่อแสดง figure (ถ้าไม่ใส่มันจะไม่แสดงกราฟ ไม่มีกราฟเด้งออกมาบนหน้าจอ) ถ้าเขียนใน Jupyter ไม่ต้องใส่ plt.show() พอกดรันโปรแกรม มันจะขึ้นมาในหน้านั้นนั่นแหละ

ผลลัพธ์ที่ควรได้ตามรูปด้านล่าง

ผลลัพธ์ในรูปด้านบนนี้เรียกว่า Positive Correlation คือ ยิ่งตัวแปรหนึ่งมีค่ามาก ตัวแปรตาม (dependent variable) ก็จะยิ่งมีค่ามากไปด้วย ถ้าอ่านตามกราฟ ก็จะอ่านได้ว่า เมื่อค่าความสูงเพิ่มขึ้น ค่าของน้ำหนักก็จะเพิ่มขึ้นตามค่าส่วนสูง (เรียกภาษาทั่วไป คือ คนที่สูงมาก ก็มักจะมีน้ำหนักมากไปด้วยนั่นเอง)

ผลลัพธ์ที่ได้จาก Scatter Plot ไม่ได้มีแค่ Positive Correlation เท่านั้น

  • Positive Correlation — ตัวแปรตามมีค่าเพิ่มขึ้นเมื่อตัวแปรหลักมีค่าเพิ่มขึ้น
  • Negative Correlation — ตัวแปรตามมีค่าน้อยลงเมื่อตัวแปรหลักมีค่าเพิ่มขึ้น
  • No Correlation — ตัวแปรหลักไม่มีผลใดๆกับตัวแปรตาม

ผลลัพธ์ที่เราควรให้ความสนใจคือ อันที่เป็น Positive และ Negative เพราะมันแสดงให้เห็นว่าตัวแปรทั้งสองตัวมีความสัมพันธ์กัน ทำให้เราคาดเดาเหตุการณ์ในอนาคตหากตัวแปรใดตัวแปรหนึ่งมีการเปลี่ยนแปลงได้

ส่วนผลลัพธ์แบบ No Correlation หมายความว่าตัวแปรที่นำมาทดลองนี้น่าจะไม่มีความสัมพันธ์กัน อาจจะเลือกพิจารณาเอาตัวแปรอื่นมาทดลองแทน