สอนวิเคราะห์ข้อมูล [ฉบับจับมือทำ] ตั้งแต่เบื้องต้น ถึงการสร้างโมเดล Machine Learning ผ่านข้อมูล การ ซื้อ-ขาย ผลไม้เพื่อสุขภาพยอดฮิตอย่าง Avocado {Part 1: Descriptive Analysis}

อะโวคาโด้ (Avocado) เป็นผลไม้เพื่อสุขภาพที่กำลังได้รับความนิยมเป็นอย่างมาก ทานก็อร่อย เอาข้อมูลมาวิเคราะห์ก็สนุก 🙂 จากการที่เป็นหนึ่งในผลไม้ยอดฮิต ที่มีราคาสูงเป็นอันดับต้นๆ จึงมีการเก็บข้อมูลผลผลิต ข้อมูลราคา และการซื้อขาย อย่างแพร่หลาย เพื่อให้ได้ประโยชน์จากการค้าอะโวคาโด้มากที่สุด เราจึงจับเอาข้อมูลราคา และการซื้อขายเจ้าอะโวคาโด้มาเป็นตัวแทน เพื่อสอนการวิเคราะห์ข้อมูลตั้งแต่เบื้องต้น ไปจนถึงสามารถสร้างโมเดลเพื่อทำนายข้อมูลด้วย Machine Learning ได้

เนื่องจากการวิเคราะห์ข้อมูลมีรายละเอียดค่อนข้างมาก จึงจัดแบ่งหัวข้อ และ บทความออกเป็นส่วนๆ ดังนี้

Part 1: การอ่านข้อมูล ทำความสะอาดเบื้องต้น และการวิเคราะห์ข้อมูลเชิงบรรยาย (Descriptive Analysis)

Part 2: การวิเคราะห์ข้อมูลเพื่อสำรวจข้อมูลในเชิงความสัมพันธ์ EDA (Exploratory data analysis) เพื่อค้นหาลักษณะเฉพาะของข้อมูล และทดสอบสมมุติฐานเบื้องต้น
Part 3: การวิเคราะห์ข้อมูลเชิงลึก และการสร้างโมเดลในการทำนายข้อมูลด้วย Machine Learning

มาเริ่มกันเลยดีกว่าค่ะ

1. โหลด Library ที่จำเป็น

General libraries

ไลบรารี่พื้นฐานต่างๆ ที่ส่วนใหญ่มักจะได้ใช้ในทุกๆ งาน

import os
from datetime import datetime
import pandas as pd
import numpy as np
import pylab as pl
Data Visualization

ไลบารี่ที่เกี่ยวข้องกับการแสดงผล เช่น การพล็อตกราฟต่างๆ

import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import colors
import seaborn as sns
sns.set_style('whitegrid')
preprocessing

ไลบารี่ที่ใช้ในการจัดการข้อมูลเพื่อให้พร้อมสำหรับการใช้งานกับโมเดล Machine Learning

from sklearn.preprocessing import StandardScaler, RobustScaler, MinMaxScaler, Normalizer
from sklearn.preprocessing import OneHotEncoder

2. อ่านข้อมูลจากไฟล์ CSV

อ่านข้อมูลที่ถูกเก็บอยู่ในรูปแบบของ .csv โดยใช้ชื่อไฟล์ว่า “avocado.csv”

avo = pd.read_csv(path + '/avocado.csv')
avo.head()
รูปที่ 1 ข้อมูล

จะเห็นว่าข้อมูลประกอบไปด้วยคอลัมน์ที่สำคัญดังนี้

  • Date : วันที่เก็บข้อมูล
  • AveragePrice : ราคาเฉลี่ยของอะโวคาโด้ 1 ผล
  • type : ประเภทของอะโวคาโด้
  • year : ปีที่เก็บข้อมูล
  • region : ภูมิภาค หรือ เขตที่เก็บข้อมูล
  • Total Volume : ปริมาณอะโวคาโด้ทั้งหมดในการเก็บข้อมูลนั้น
  • 4046, 4225, 4770 : จำนวนของอะโวคาโด้ที่ขายในรูปแบบต่างๆ (รายละเอียดเพิ่มเติม https://cran.r-project.org/web/packages/avocado/vignettes/a_intro.html)
  • Total Bags, Small Bags, Large Bags, XLarge Bags จำนวนรวมของอะโวคาโด้ที่ขายได้เป็นถุง, และจำนวนอะโวคาโด้ที่ขายได้โดยแบ่งตามขนาดของถุงบรรจุภัณฑ์
Cr. FB: The Happy Avocado

3. General Checking and cleaning (การตรวจสอบและทำความสะอาดข้อมูลเบื้องต้น)

ทำการตรวจสอบลักษณะทั่วไปของไฟล์ข้อมูลที่อ่านเข้ามาเบื้องต้น เช่น ขนาดของข้อมูล มิติของข้อมูล ประเภทของข้อมูล และค่าทางสถิติเบื้องต้นของข้อมูลแต่ละคอลัมน์

display(avo.head(5))
print("\n", avo.shape)
print(avo.info())
print(avo.describe())

นอกจากนั้นยังตรวจสอบความสมบูรณ์ของข้อมูลในเบื้องต้นว่ามีข้อมูลที่ขาดหายไป (Missing values) มากน้อยแค่ไหน

avo.isnull().sum()
รูปที่ 2 ตรวจสอบ null values

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

จากรูปที่ 1 เราจะเห็นว่าคอลัมน์แรก “Unnamed: 0” เป็นคอลัมน์ส่วนเกินที่ไม่ได้ใช้งาน ดังนั้นเราจะทำการลบคอลัมน์นี้ไป

avo.drop('Unnamed: 0', axis = 1, inplace = True)
avo.head()
รูปที่ 3 ข้อมูลหลังทำความสะอาดด้วยการตัดคอลัมน์ส่วนเกินเบื้องต้น

4. Descriptive Analysis (การวิเคราะห์ข้อมูลเชิงพรรณนา)

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

4.1 ตรวจสอบข้อมูลประเภท String

ก่อนอื่นเราจะมาดูข้อมูลที่มีประเภทของข้อมูลเป็น String หรือ ข้อมูลที่เป็นตัวอักษรทั้งหลายกันก่อนค่ะ เนื่องจากมีไม่เยอะ และส่วนใหญ่จะจำเป็นต้องทำการแปลงข้อมูลเพื่อใช้งานต่อในอนาคต

avo.select_dtypes('object').columns

เมื่อตรวจสอบคอลัมน์ที่เป็นสตริง พบว่ามีดังนี้ “Date” , ” type” , “region”

Date คือ วันที่เก็บข้อมูล อันนี้ต้องใช้งานในอนาคตแน่นอนในการดู Seasonality หรือ การขายอะโวคาโด้ในฤดูกาลต่างๆ กัน ในที่นี้จะดูได้ เราจะต้องมีการปรับเปลี่ยนรูปแบบของข้อมูลกันก่อน ซึ่งขอเก็บไว้ทำทีหลัง

type, region คือ ข้อมูลประเภทของอะโวคาโด้ และ พื้นที่หรือเขตที่ขายอะโวคาโด้ ส่วนนี้เดี๋ยวเราจะมาลองพล็อตดูจำนวนข้อมูลกันหน่อยค่ะ จะได้รู้ว่าข้อมูลมีความสมดุล (Balance) แค่ไหน และเหมาะสมจะนำไปใช้งานกับ Machine Learning หรือไม่

Type (ประเภทของอะโวคาโด้)
print(avo['type'].value_counts())
sns.countplot('type', data=avo, palette='Set2')
plt.show()
รูปที่ 4 จำนวนอะโวคาโด้ที่ขายได้แยกตามประเภท

จากการหาจำนวนอะโวคาโด้แต่ละประเภท จะพบว่า อะโวคาโด้มีทั้งหมด 2 ประเภท และมีจำนวนข้อมูลแยกตามประเภทดังนี้

  1. Conventional (อะโวคาโด้ทั่วไป) 9126
  2. Organic (อะโวคาโด้ออแกนิกส์) 9123

จะเห็นว่าจำนวนอะโวคาโด้แต่ละชนิดมีปริมาณที่ใกล้เคียงกันมากๆ แบบนี้ ถ้าจะสร้างโมเดล Machine Learning ถือว่าเหมาะแก่การเรียนรู้ของโมเดล ML มากๆ

Region (เมืองหรือเขตที่เก็บข้อมูลการขายอะโวคาโด้)
print(avo['region'].value_counts())
print('\n', 'There are:', len(avo['region'].unique()), 'unique values in the feature')
sns.countplot('region', data=avo, palette='Set3')
plt.show()
รูปที่ 5 จำนวนอะโวคาโด้ที่ขายได้แยกตามเมืองหรือเขตที่ขาย


จากผลที่ได้ จะเห็นว่า

  • มี region หรือ พื้นที่ในการขายอะโวคาโด้ทั้งหมด 54 เมือง และแต่ละเมืองก็มีปริมาณข้อมูลเท่าๆ กันคือ 338 แถว ซึ่งถือว่าสมมาตรมากๆ เป็นข้อมูลที่เก็บอย่างมีระบบ สมบูรณ์ เหมาะสมกับการใช้งานกับโมเดล Machine Learning
  • ข้อมูลนี้ในอนาคตสามารถทำ OneHot Encoding ได้ เพื่อให้มีความหลากหลายในการเรียนรู้ของโมเดล Machine Learning
  • ข้อมูลนี้เหมาะสม และสามารถนำไปใช้ในการวิเคราะห์การขาย และการเปลี่ยนแปลงของราคาโดยแยกตามเมือง หรือ เขตได้เป็นอย่างดี

4.2 ตรวจสอบข้อมูลประเภทตัวเลข (Numbers)

ส่วนต่อไป เราจะมาตรวจสอบข้อมูลที่เป็นประเภทตัวเลขกัน ซึ่งถือว่าเป็นข้อมูลที่มีความสำคัญเป็นอย่างมากสำหรับการวิเคราะห์ และ สร้างโมเดล Machine Learning ต่อไป

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

numbers = list(avo.select_dtypes(['float64', 'int64']).keys())
numbers

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

# removing years
numbers.remove('year')

avo[numbers].hist(figsize=(20,10), color='green', edgecolor='white')
plt.show()
display(avo[numbers].describe())
รูปที่ 6 Histogram
รูปที่ 7 ค่าสถิติพื้นฐาน

จาก Histogram จะเห็นได้ว่า ในเบื้องต้นเราสามารถอธิบายข้อมูลเพิ่มได้ ดังนี้

AveragePrice (ราคาขายเฉลี่ย)

AveragePrice หรือ ราคาขาย เป็นข้อมูลที่มีการแจกแจงใกล้เคียงกับการแจกแจงปกติมากที่สุดในจำนวนคอลัมน์ทั้งหมด สังเกตุได้จากรูปแบบของ Histogram และ การที่ค่า Mean และ Median (รูปที่ 7) มีค่าใกล้เคียงกันอย่างมาก ซึ่งหมายความว่า การแจกแจงของค่าดังกล่าว ไม่ได้เป็นผลกระทบอย่างมากจากค่าสุดโต่ง (Outliers)

ส่วนคอลัมน์อื่นๆ มีการแจกแจง เบ้ขวา อย่างเห็นได้ชัด มีค่า Mean ที่ใหญ่กว่า Median อย่างมีนัยสำคัญ หมายความว่าค่าส่วนใหญ่ได้รับอิทธิพลอย่างมากจากค่าสุดโต่ง และแต่ละคอลัมน์มีการเบ้ขวาในรูปแบบที่คล้ายกัน คือ ค่าส่วนใหญ่ตกอยู่ใน bin หรือ บาร์แรก ซึ่งจากตัวข้อมูลแล้ว สมเหตุสมผล เนื่องจากค่าในคอลัมน์เหล่านี้ส่วนมากเป็นค่าที่มีความสัมพันธ์กันในเชิงบวก (Positive Correlation) ทำให้มีแนวโน้มไปในทางเดียวกัน เช่น ถ้าค่าจำนวนการขายอะโวคาโด้ในรูปแบบ “Small Bags”, “Large Bags” หรือ “XLarge Bags” มีการเพิ่มมากขึ้นอย่างมีนัยสำคัญแล้ว ค่า “Total Bags” หรือ จำนวนถุงในการขายทั้งหมดก็จะมีค่าเพิ่มขึ้นเช่นกัน เป็นต้น ลักษณะแบบนี้ควรจะต้องระวังในอนาคต อาจจะทำให้เกิดการซ้ำซ้อน (Redundancy) และส่งผลต่อประสิทธิภาในการพัฒนาโมเดล ML ในอนาคตได้

year (ปี)

มาดูข้อมูล year (ปี) ที่เราแยกไว้กันบ้างดีกว่า

avo['year'].hist(figsize=(8,4), color='green', edgecolor='white')
plt.show()
รูปที่ 8 ข้อมูลการขายอะโวคาโด้แยกเป็นรายปี

จะเห็นว่าจำนวนอะโวคาโด้ที่ขายได้ของปี 2015, 2016 และ 2017 ใกล้เคียงกัน แต่ปริมาณการขายของปี 2018 กลับลดลงเป็นอย่างมาก เป็นที่น่าสงสัย??

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

เมื่อเราทำการตรวจสอบข้อมูลเบื้องต้นเรียบร้อยแล้ว ต่อมาจะมาลองวิเคราะห์ในส่วนของ Outliers และคอลัมน์ที่ซ้ำซ้อนกันบ้าง

4.3 Outliers (ค่าสุดโต่ง)

การจัดการกับ Outliers คือการกำจัดค่าที่มาก หรือ น้อย หรือ มีความผิดปกติจากข้อมูลของเราออกไป เพื่อคาดหวังให้สามารถเห็นการแจกแจงของข้อมูลที่ชัดเจนมากยิ่งขึ้น ในที่นี้เราจะมาลองจัดการกับข้อมูลที่มีปริมาณการขายน้อย โดยการตัดข้อมูลที่มี Total Volume น้อยกว่า 50000 ออก

avo_o = avo[avo['Total Volume']<50000]

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

avo_o[numbers].hist(figsize=(20,10), color='green', edgecolor='white')
plt.show()
รูปที่ 9 การแจกแจงหลังตัด Outliers

จะเห็นว่าการแจกแจงหลักตัด Outliers ออก มีรูปแบบที่เข้าใกล้การแจกแจงปกติมากกว่าเดิม ถามว่าจะทำแบบนี้ไปเพื่ออะไร? ทำไมต้องอยากได้ข้อมูลที่มีการแจกแจงที่เข้าใกล้การแจกแจงปกติ???

มีหลายเหตุผลมากมายที่เราต้องการข้อมูลที่มีการแจกแจงที่เข้าใกล้การแจกแจงปกติ เช่น เพื่อให้สามารถทำความเข้าใจข้อมูลได้มากขึ้น เพื่อกำจัดข้อมูลที่ผิดพลาด หรือ ค่าสุดโต่งแต่ เป็นต้น แต่ความสำคัญที่ใหญ่ที่สุดของเราในที่นี้ก็คือ “การทำงานกับ Machine Learning จะมีประสิทธิภาพดีก็ต่อเมื่อเมื่อข้อมูลที่ใช้ในการสร้างโมเดลมีการแจกแจงใกล้เคียงแบบปกติมากที่สุด” เช่น ถ้าเราทำงานกับ Time Series และต้องการทำนายการเปลี่ยนแปลงของข้อมูล แต่ในตัวข้อมูลนั้นมีลักษณะของ Trend หรือ Seasonality ก็จะต้องมีการปรับออกก่อน เพื่อให้โมเดล ML สามารถทำนายข้อมูลได้อย่างมีประสิทธิภาพ นั่นเอง

แต่เดี๋ยวก่อน….. เราจะอยู่ๆ ไล่ตัดข้อมูลที่ “เราคิดว่า” น่าจะเป็น Outliers ออกแบบนี้เสมอ ไม่ได้! การตัดข้อมูลออกต้องพิจารณาด้วยว่า ข้อมูลที่ตัดไปนั้น จะไม่ส่งผลต่อข้อมูลโดยรวม หรือ ข้อมูลที่ตัดนั้นต้องใช่ Outliers จริงๆ นั่นเอง ในส่วนนี้ เดี๋ยวเราจะมาดูกันในขั้นตอนต่อไป (EDA) ค่ะ ว่าข้อมูลของเราสามารถตัด Outliers แบบที่เราเข้าใจด้านบนได้จริงหรือไม่ …

แล้วถ้าเราไม่อยากตัด Outliers จะมีวิธีอื่นใดหรือไม่ที่จะทำให้ข้อมูลมีความแจกแจงที่เป็นปกติมากขึ้น ??? มีค่ะ มีหลายวิธีทีเดียว ในที่นี้จะขอยกตัวอย่างซัก 1 วิธี คือการใช้ Logarithm เข้ามาช่วย ในที่ขอคำนวณ Log บนข้อมูลคอลัมน์ Total Volume นะคะ แล้วมาดูกันว่า การแจกแจงดีขึ้นหรือไม่

TotalLog = np.log(avo['Total Volume'] + 1)
TotalLog.hist(color='green', edgecolor='white')
รูปที่ 10 การแจกแจงของ Total Volume

จะเห็นว่าการแจกแจงของค่า Total Volume เข้าใกล้การแจกแจงแบบปกติมากขึ้นเมื่อคำนวณค่า Logarithm นี่ก็เป็นเทคนิคเล็กๆ น้อยๆ ที่จะช่วยให้ข้อมูลของเราพร้อมมากขึ้นสำหรับการทำงานกับโมเดล Machine Learning ค่ะ (ใช้ Log แล้ว ถ้าจะทำนายอย่าลืมคำนวณ Exponential คืนค่าด้วยนะคะ)

4.4 คำซ้ำซ้อน (Redundancy)

ถ้าสังเกตุดีๆ จากตัวข้อมูล จะเห็นว่าข้อมูลนี้มีคอลัมน์ที่บอกเวลาอยู่ 2 คอลัมน์ด้วยกันคือ Date และ Year (รูปที่ 1) ซึ่งเราไม่จำเป็นต้องถึง 2 คอลัมน์ เนื่องจากข้อมูล Year หรือ ปีที่เกิดการซื้อขายนั้น ได้รวมอยู่ในคอลัมน์ Date ซึ่งแสดงค่า วัน เดือน ปี ที่ซื้อขายไว้แล้ว

ในการจัดการเราอาจจะลบข้อมูล Year ทิ้งไป แล้วคงไว้เฉพาะข้อมูล Date ก็ได้ แต่ในที่นี้ เราต้องการจะทำการวิเคราะห์ข้อมูลในลักษณะของฤดู หรือ ช่วงเวลาในการขายอะโวคาโด้ด้วย ดังนั้น จะทำการจัดข้อมูลมูลให้ โดยแยกข้อมูล วัน (Day) เดือน (Month) ปี (Year) ออกจากกัน และทำการเพิ่มคอลัมน์ “Day of week” เพื่อให้ข้อมูลว่าการซื้อขายนั้นๆ เกิดขึ้นในวันใดของอาทิตย์อีกด้วย

avo['Date'] = avo['Date'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d'))

avo['month'] = avo['Date'].dt.month
avo['day'] = avo['Date'].dt.day

avo['day of week'] = avo['Date'].dt.dayofweek
dates = ['year', 'month', 'day', 'day of week']
avo[dates]
รูปที่ 11 ข้อมูลหลังจากการจัดแยกข้อมูล day, month, year และ day of week ออกจากกัน

หลังจากที่เราได้ทำการจัดการข้อมูลข้างต้นเรียบร้อยแล้ว ทำให้สามารถวิเคราะห์ข้อมูลแยกตาม วัน เดือน ปี และ Day of week ได้ ดังนี้

fig, ax = plt.subplots(2,2, figsize=(20,10))

sns.countplot('year', data=avo, ax=ax[0,0])
sns.countplot('month', data=avo, ax=ax[0,1])
sns.countplot('day', data=avo, ax=ax[1,0])
sns.countplot('day of week', data=avo, ax=ax[1,1])

plt.show()
รูปที่ 12 ปริมาณการขายอะโวคาโด้แยกตาม วัน เดือน ปี และ Day of week

จากกราฟด้านบน เราจะเห็นว่า

Year (บนซ้าย) – ปี 2015-2017 มีปริมาณการซื้อขายใกล้เคียงกันมาก แตกต่างกับปี 2018 ที่มีปริมาณลดลง อันเนื่องมาจากการสิ้นสุดการเก็บข้อมูลที่ต้นปี อย่างที่ได้กล่าวข้างต้น ถ้าใครอยากลองทดสอบเพิ่มเติมในจุดนี้ก็ลองนำข้อมูลของปี 2018 ออกทั้งหมด แล้วพล็อตใหม่ เพื่อดูแนวโน้มว่าจะเปลี่ยนแปลงหรือไม่ อย่างไร

Month (บนขวา) – สังเกตุเห็นการลดลงของปริมาณการซื้อขาย ช่วงต้นปี มีปริมาณการซื้อขายมากที่สุด และค่อยๆ ลดลง ซึ่งอาจจะเป็นผลมาจากข้อมูลปี 2018 ที่มีเฉพาะเดือน 1-3 หรือ อาจจะเป็นเหตุผลอื่น เช่น ราคาปรับลด เป็นต้น จุดนี้ยังต้องโน้ตเก็บไว้เพื่อทำการวิเคราะห์เพิ่มเติม

Day และ day of Week – จากกราฟ Day of week (ล่างขาว) จะเห็นได้ว่าข้อมูลถูกเก็บเฉพาะวันลำดับที่ 6 ของอาทิตย์ ซึ่งคือ วันอาทิตย์เท่านั้น ดังนั้น การวิเคราะห์ในลักษณะรายวันไม่เกิดประโยชน์ คอลัมน์ Day of week ถือ เป็น Redundancy สามารถลบข้อมูลในส่วนนี้ออกได้

avo.drop('day of week', axis=1, inplace=True)

สรุป Descriptive Analysis

จากการทำการวิเคราะห์ข้อมูลเชิงพรรณนา หรือ Descriptive Analysis เราสามารถสรุปข้อมูลเบื้องต้นได้ ดังนี้

  • คอลัมน์ “Type” มีความสมดุลระหว่างข้อมูลอะโวคาโด้ทั่วไป และ แบบออแกนิกส์ ทำให้มีความเหมาะสมที่จะทำมาใช้ในการสร้างโมเดล Machine Learning ได้
  • คอลัมน์ “Region” มีการเก็บข้อมูลจากเมืองหรือเขตทั้งหมด 54 เขตด้วยกัน ข้อมูลที่เก็บได้จากแต่ละเขตมีปริมาณที่สมดุลกัน สามารถทำ OneHot encoding ได้ ถ้าต้องการความหลากหลายในการวิเคราะห์ข้อมูลเพิ่มขึ้นในอนาคต
  • คอลัมน์ “AveragePrice” มีการแจกแจงเข้าใกล้การแจกแจงแบบปกติมากที่สุดในจำนวนข้อมูลชุดนี้ จึงมีความเหมาะสมที่จะใช้เป็น Target ที่ต้องการทำนายในอนาคต
  • คอลัมน์ที่ให้ข้อมูลปริมาณการขาย มีการแจกแจงแบบเบ้ขวา แต่สามารถใช้การคำนวณ Logarithm เข้ามาช่วยเพื่อให้สามารถเพิ่มประสิทธิภาพในการทำงานของโมเดลทำนายได้
  • จากข้อมูล Day of week แสดงให้เห็นว่าข้อมูลมีการเก็บในลักษณะประจำอาทิตย์ โดยเก็ยข้อมูลทุกวันอาทิตย์

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

แต่การวิเคราะห์แบบนี้ จะยังไม่สามารถบอกอะไรได้มาก เนื่องจากยังไม่สามารถเข้าถึงส่วนที่เป็น Insight Analysis หรือ การวิเคราะห์ข้อมูลแบบเจาะลึกได้ ดังนั้น ขั้นตอนต่อไปที่เราจะต้องทำกันก็คือ การทำ EDA (Exploratory Data Analysis) ที่จะทำการวิเคราะห์ข้อมูลทางสถิติเพิ่มขึ้น ถือเป็นการวิเคราะห์ข้อมูลระดับกลาง โดยเราจะเน้นการวิเคราะห์ตัวแปรต่างๆ ที่เกี่ยวข้อง ไปจนถึงการวิเคราะห์ความสัมพันธ์ระหว่างตัวแปร เพื่อให้เห็นพฤติกรรมของข้อมูลมากขึ้น ในการทำ EDA นั้น จะนำไปสู่การหาคำตอบในกับสมมุติฐานต่างๆ ที่เราได้เจอในระหว่างการทำ Descriptive Analysis ด้วย เช่น อะโวคาโด้ชนิดใดขายดีกว่า หรือ เราจะหาซื้ออะโวคาโด้ในราคาถูกได้เมื่อไหร่ จากที่ไหน เป็นต้น

หวังว่าบทความนี้จะเป็นประโยชน์แก่ผู้ที่สนใจ แล้วพบกันในบทความต่อไป กับการทำ EDA และ ML เมื่อจบทั้งสามบทความ จะมี Source Code แจกให้ค่ะ

Next part …

สอนวิเคราะห์ข้อมูล [ฉบับจับมือทำ] ตั้งแต่เบื้องต้น ถึงการสร้างโมเดล Machine Learning ผ่านข้อมูล การ ซื้อ-ขาย ผลไม้เพื่อสุขภาพยอดฮิตอย่าง Avocado {Part 2: EDA}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s