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

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

การทำ EDA ทำให้สามารถสามารถหาโฟกัสเพื่อตั้งสมมุติฐานเกี่ยวกับข้อมูล เช่น อะไรบ้างที่ควรจะมีผลต่อการเปลี่ยนแปลงที่เราสนใจ และ เราจะเปรียบเทียบ หรือ วัดค่าความสำคัญของข้อมูลแต่ละส่วนได้อย่างไร เมื่อเสร็จสิ้นกระบวนการ EDA เราจะสามารถหาคำตอบให้กับสมมุติฐานบางส่วนได้ หรือ สามารถสร้างแบบจำลองทางสถิติ ที่นำไปสู่การบวนการวิเคราะห์ข้อมูลเชิงลึกต่อไปได้
วิธีการทำ EDA มีมากมากหลายหลาย ในบทความนี้จะเลือกวิธีการวิเคราะห์ความสัมพันธ์ระหว่างข้อมูล ด้วยวิธีการหาความสัมพันธ์ทางสถิติระหว่างตัวแปร หรือ Correlation โดยในการทำ EDA ในที่นี้ จะพยายามหาคำตอบให้กับคำถามต่อไปนี้
- อะโวคาโดชนิดทั่วไป และ ชนิดออแกนิกส์ มีความแตกต่างกันอย่างไร?
- ระหว่างอะโวคาโดชนิดทั่วไป และ ชนิดออแกนิกส์ ชนิดใดมีความนิยมสูงกว่า? และ อะไรคือ “แผนธุรกิจ (Business plan)” ที่เหมาะสมกับอะโวคาโด้ทั้งสองชนิดนี้?
- ฤดูกาลมีผลอย่างไรกับการค้าขายอะโวคาโด้? และ เราจะหาอะโวคาโด้ปริมาณมาก และ ถูกได้ในช่วงไหน?
- ถิ่นที่ปลูก มีผลอย่างไรกับการค้าขายอะโวคาโด้ และ ที่ไหนเอ่ย ที่เราจะหาผลิตอะโวคาโด้ปริมาณมาก และ ราคาถูกได้?

มาเริ่มกันเลยดีกว่า
5) EDA (Exploratory Data Analysis)
5.1 Correlation
ในที่นี้เราจะมาวิเคราะความสัมพันธ์ะหว่างตัวแปรในข้อมูลชุดนี้ ด้วยการคำนวณค่า Correlation กันค่ะ โดยในการคำนวณ เราจะเปรียบเทียบค่า Correlation ระหว่างตัวแปรทุกตัว บนข้อมูลที่แตกต่างกัน 2 ชุดคือ
- ชุดข้อมูลต้นฉบับ (ตัวแปร avo)
- ชุดข้อมูลที่ผ่านการตัด Outliers ออกแล้ว (ตัวแปร avo_o)
ถ้าใครยังไม่ทราบว่าค่า Correlation หมายถึงอะไร? ก็สามารถอ่านรายละเอียดได้ในบทความเก่าที่ Algoaddict ได้เขียนไว้ ด้านล่าง ก่อนที่จะอ่านบทความนี้กันต่อ
Correlation ค่ามหัศจรรย์กับการลงทุน
Math 101 : Covariance Correlation
fig, ax = plt.subplots(2, 1, figsize=(30,20))
avo_o = avo[avo['Total Volume']<50000]
sns.heatmap(avo.corr(), vmin=-1, vmax=1, cmap=sns.diverging_palette(20, 220, as_cmap=True), annot=True, ax=ax[0])
ax[0].set_title('With outliers', fontsize=20)
sns.heatmap(avo_o.corr(), vmin=-1, vmax=1, cmap=sns.diverging_palette(20, 220, as_cmap=True), annot=True, ax=ax[1])
ax[1].set_title('Without outliers', fontsize=20)
plt.show()


จากค่า Correlation ของข้อมูลต้นฉบับในรูปที่ 14 จะเห็นว่าค่า Correlation ที่สูง (แทนด้วยสีฟ้า) ซึ่งหมายความว่าข้อมูลมีความสัมพันธ์กันในเชิงบวก (เพิ่มหรือลดไปในทิศทางเดียวกัน) เช่น ค่า Correlation ระหว่าง Total Bags กับ Small Bags มีค่าสูงที่สุดคือ 0.99 หมายความว่า ถ้า Total Bags มีค่าเพิ่มขึ้น Small Bags ก็จะเพิ่มขึ้นด้วย เช่นเดียวกันในทางกลับกัน ถ้า Small Bags มีค่าเพิ่ม ค่า Total Bags ก็จะมีค่าเพิ่มขึ้นด้วย
จากค่า Correlation ที่สูงนี้ เราอาจจะหลงดีใจ และคิดไปว่า บิงโก!! เจอของดีเข้าแล้ว แต่ต้องระวังนะคะ ค่านี้จริงๆ แล้ว ไม่ใช่ของดีอะไรหรอกค่ะ ถ้าเราพิจารณาให้ดี มันคือค่าลวงตา หลอกให้เราดีใจเล่น เนื่องจาก ค่า Correlation ที่สูงนี้ เป็นค่าที่ได้จากตัวแปรที่ไม่เป็นอิสระต่อกัน หมายความว่า ตัวแปร Total Bags ไม่ได้เป็นอิสระต่อตัวแปร Small Bags เพราะจริงๆ แล้ว ตัวแปร Total Bags ก็มีผลการจาก ค่า Small Bags + Large Bags + XLarge Bags นั่นเอง ทำให้ตัวแปรเหล่านี้ถือเป็นตัวแปรที่เกี่ยวข้องกัน ดังนั้น การจะเพิ่มหรือลดไปด้วยกันนั้น แทบจะไม่ได้บอกข้อมูลอะไรให้เราเพิ่มเติมเลย
ถ้าสังเกตุ ดีๆ ค่า Correlation ที่สูงๆ ทั้งหลายในรูปที่ 14 ก็ตกอยู่ในลักษณะนี้ทั้งนั้น จึงแทบไม่ได้มีประโยชน์เลยค่ะ
ต่อมาเรามาลองดูค่า Correlation ที่สัมพันธ์กับตัวแปร Average Price หรือ ราคาเฉลี่ยกันค่ะ จะเห็นว่า สิ่งที่มีความสัมพันธ์กับราคาเฉลี่ยมากที่สุดมีอยู่ 2 ตัวแปรด้วยกันคือ
- เดือน (month) ซึ่งมีความสัมพันธ์ในเชิงบวกอ่อน หมายความว่าเดือนมีผลกระทบต่อการเพิ่มลดของราคาเฉลี่ยของอะโวคาโด้ในเชิงบวก แต่ถือน้อยมาก เนื่องจากมีค่า Correlation เพียง 0.16 เท่านั้น
- จำนวนรวมการขายอะโวคาโด้ (Total Volume) มีความสัมพันธ์ในเชิงลบอยู่ที่ -0.19 หมายความว่าเมื่อปริมาณการขายเพิ่ม ราคาเฉลี่ยของอะโวคาโด้จะมีแนวโน้มลดลง แต่ก็อีกเช่นกัน ค่าลบที่ไม่มาก หมายความว่าความพันธ์นี้ไม่ได้แข็งแรงมาก นั่นเอง
จากสองข้อด้านบน จะเห็นค่อนข้างสมเหตุสมผล โดยเฉพาะอย่างยิ่งในข้อที่ 2 เมื่ออะโวคาโด้มีปริมาณมากในท้องตลาด ก็สามารถส่งผลให้ราคาปรับลดลงได้ตามทฤษฏี Demand – Supply นั่นเอง

จากรูปที่ 15 ซึ่งแสดงค่า Correlation ระหว่างตัวแปรต่างๆ บนข้อมูลที่ได้รับการตัดค่า Outliers ออกเรียบร้อยแล้ว จะเห็นว่าค่า Correlation ระหว่างตัวแปรที่บ่งบอกปริมาณ (ตัวแปรที่ไม่เป็นอิสระต่อกัน) มีค่าลดลง แต่ก็ยังมีแนวโน้มคล้ายๆ เดิม ในส่วนนี้เราบอกได้แค่ว่า
- ค่า Outliers ที่ตัดออกไปส่งผลกระทบต่อค่าของตัวแปรบ่งบอกปริมาณอย่างเห็นได้ชัด และดูเหมือนกับว่าจะสามารถช่วยจัดการกับความขึ้นต่อกันของตัวแปรได้ (แต่ยังบอกไม่ได้เนื่องจากเราจะต้องพิจารณาให้ดีๆ ต่อไปก่อนว่า ค่าที่ตัดออกไป นั้นใช่ Outliers แน่นอนหรือไม่)
- ความสัมพันธ์ระหว่างราคาเฉลี่ย กับ เดือน และ ราคาเฉลี่ยกับปริมาณการขายอะโว้คาโด้ มีลักษณะเดียวกับความสัมพันธ์เมื่อพิจารณาบนข้อมูลต้นฉบับ
5.2 ความสัมพันธ์ระหว่างราคาเฉลี่ย กับ ปริมาณการซื้อขายอะโวคาโด้
หลังจากที่เราสรุปได้จากค่า Correlation ด้านบน ว่าค่า Correlation บนข้อมูลที่ได้รับการตัด Outliers ออกนั้น มีผลกระทบกับความสัมพันธ์ระหว่างราคาเฉลี่ย กับ ปริมาณการซื้อขาย ดังนั้น ในขั้นตอนนี้ เราจะมาลองพล็อตความสัมพันธ์ระหว่าง ราคาเฉลี่ย และ “ปริมาณการขายอะโวคาโด้” (ในที่นี้เราจะเลือกตัวแปร Total Bags เป็นตัวแทนปริมาณการซื้อขาย) ดูกันให้ชัดๆ แบบ Scatter plot โดยจะทำการพล็อตเปรียบเทียบระหว่างชุดข้อมูลต้นฉบับ และชุดข้อมูลที่ตัด Outliers ออกแล้วนั่นเอง
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20,8))
sns.scatterplot(x='Total Bags', y='AveragePrice', data=avo, hue='type', ax=ax1)
sns.scatterplot(x='Total Bags', y='AveragePrice', data=avo_o, hue='type', ax=ax2)

กราฟด้านซ้ายมือ คือ ความสัมพันธ์ระหว่างราคาเฉลี่ย (Avocado) กับจำนวนถุงที่ขาย (Total Bags) จากข้อมูลต้นฉบับ และ กราฟทางขวามือเป็นกราฟแสดงความสัมพันธ์เดียวกันบนชุดข้อมูลหลังจากตัด Outliers ออกเรียบร้อยแล้ว ภายในข้อมูลประกอบด้วย จุดสีส้ม (แทนข้อมูลอะโวคาโด้ทั่วไป) และ จุดสีฟ้า (แทนข้อมูล อะโวคาโด้ออแกนิกส์) มาลองวิเคราะห์ข้อมูลที่ได้จากกราฟนี้กัน
จากกราฟด้านซ้ายมือ จะเห็นว่า อะโวคาโด้ที่มีปริมาณการขายสูงมาก และ ราคาเฉลี่ยตำ่ จะเป็นอะโวคาโด้แบบทั่วไป โดยจะเห็นได้จากจุดสีฟ้าทางด้านล่างของกราฟ ส่วนอะโวคาโด้ออแกนิกส์ จะเป็นอะโวคาโด้ที่ช่วงราคาที่สูงกว่าอะโวคาโด้ทั่วไปอย่างเห็นได้ชัด แต่ยังเป็นอะโวคาโด้ที่มีปริมาณการขายน้อยกว่าอะโวคาโด้ทั่วไปอยู่อย่างมาก
จากกราด้านขวามือ จะเห็นว่าเมื่อทำการกำจัดค่าสุดโต่ง หรือ Outliers ออก กราฟความสัมพันธ์ระหว่างราคาเฉลี่ย กับ จำนวนถุงที่ขายได้ มีการเปลี่ยนแปลงอย่างมาก เราสามารถเห็นความหลากหลายของการเปลี่ยนแปลงของราคา และ ปริมาณการขายของอะโวคาโด้ออแกนิกส์ได้อย่างชัดเจมากขึ้น ส่วนอะโวคาโด้แบบทั่วไปนั้น แทบจะมองไม่เห็นเลย
จากความแตกต่างระหว่างกราฟทั้งสองนี้ในเบื้องต้น ส่ิงที่เราควรจะต้องสังเกตุและไหวตัวให้ทันก็คือ "การใช้วิธีการตัด Outliers" ที่เราใช้นั้น ไม่เหมาะสม เนื่องจากเป็นการตัดข้อมูลส่วนใหญ่ของอะโวคาโด้ทั่วไปทิ้ง ส่งผลให้ เกิดการ สูญเสียลักษณะเฉพาะของข้อมูลอะโวคาโด้ประเภททั่วไป ซึ่งเหตุการณ์นี้บ่งบอกว่า การตัด Outliers ด้วยการใช้ค่า Volume นั้น ไม่ใช่วิธีการที่เหมาะสม และค่าที่เราตัดออกก็ไม่ได้เป็น Outliers อย่างแท้จริงด้วย แต่เป็นค่าลักษณะเฉพาะ (Characteristic) ของตัวแปร! ที่ไม่สมควรตัดทิ้ง
ส่ิงสำคัญที่เห็นได้อีกอย่างก็คือ เมื่อจำนวนการซื้อขายอะโวคาโด้ (Total Bags) เพิ่มมากขึ้น ราคาเฉลี่ยของอะโว้คาโด้ทั้งสองชนิดมีแนวโน้มที่จะลดต่ำลง ซึ่งในจุดนี้เราได้ทำการกล่าวถึงกันไปแล้วในเรื่องของ Supply and Demand ด้านบน แต่เราก็จะยังไม่สรุป และจะลองพล็อตดูค่าคู่นี้เพิ่มเติมอีกในขั้นตอนนต่อไป
5.3 ความสัมพันธ์ระหว่างราคาเฉลี่ย กับ เดือนที่เกิดการซื้อขายอะโวคาโด้
หลังจากที่เราได้ข้อมูลเบื้องต้นจากการพล็อตค่า Correlation แล้วพบว่า เดือนมีผลกระทบต่อราคาเฉลี่ยของอะโวคาโด้ ในส่วนนี้เราจึงจะมาลองพล็อตดูความสัมพันธ์ระหว่าง “ราคาเฉลี่ย” กับการซื้อขายอะโวคาโด้ในแต่ละ “เดือน” กันบ้าง
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20,8))
sns.scatterplot(x='month', y='AveragePrice', data=avo, hue='type', ax=ax1)
sns.scatterplot(x='month', y='AveragePrice', data=avo_o, hue='type', ax=ax2)

จากกราฟจะเห็นได้ว่า เรายังไม่สามารถระบุ Trend หรือ แนวโน้มของราคาอะโวคาโด้ทั้งสองชนิดที่เปลี่ยนแปลงไปในแต่ละเดือนได้อย่างชัดเจน สิ่งที่เรามองเห็นเบื้องต้นได้ มีดังนี้
- ราคาของอะโวคาโด้ชนิดทั่วไปต่ำกว่าอะโวคาโด้ออแกนิกส์อย่างมากในทุกเดือน
- ราคาของอะโวคาโด้ช่วงต้นปีจะต่ำกว่าราคาของอะโวคาโด้ในเดือนอื่นๆ อยู่เล็กน้อย
ตามที่กล่าวไว้แล้ว ว่าจากการแสดงความสัมพันธ์ในกราฟที่ 16-17 เราจะเห็นได้ว่า การกำจัดค่า Outliers จากชุดข้อมุลชุดนี้ที่เราทำกันนั้น (กรองค่า Total Volume) ไม่เหมาะสม แล้ว เราควรจะทำยังไงดี?
5.4 Normalization
ในที่นี้ เราสามารถใช้การ Normalization หรือ การทำให้ข้อมูลเป็นค่ามาตรฐาน เข้ามาช่วยได้ เดี๋ยวเรามาลองทำ Normalization และพล็อตดูความสัมพันธ์ระหว่างตัวแปร ราคาเฉลี่ย และ ปริมาณถุงกันใหม่ ด้วยความคาดหวังที่ว่า เราจะได้เห็นความสัมพันธ์ระหว่าง ราคาเฉลี่ย และ ปริมาณการขายที่ชัดเจนขึ้น โดยไม่ได้ต้องทำการกำจัด Outliers ที่เราไม่แน่ใจอีกด้วย
scaler = Normalizer()
scaler.fit(avo[['Total Bags', 'AveragePrice']].values)
avo['Total Bags_scaled'] = scaler.transform(avo[['Total Bags', 'AveragePrice']].values)[:,0]
avo['AveragePrice_scaled'] = scaler.transform(avo[['Total Bags', 'AveragePrice']].values)[:,1]
sns.regplot(x='Total Bags_scaled', y='AveragePrice_scaled', data=avo, color='g')
plt.show()

จากรูปที่ 18 จะเห็นได้ว่า การทำ Normalization สามารถช่วยเราได้มากในการวิเคราะห์ความสัมพันธ์ของ ราคาเฉลี่ย และ ปริมาณการขาย ว่ามีความสัมพันธ์กันในเชิงลบ หรือ ในทางตรงกันข้ามจริงๆ คือ เมื่ออะโวคาโด้มีปริมาณการซื้อขายเพิ่มขึ้น (ก็หมายความว่ามีผลผลิตอะโวคาโด้ในท้องตลาดมากขึ้น) จะส่งผลให้ราคาเฉลี่ยของอะโวคาโด้ต่ำลง ตามหลัก Demand and Supply จริง
5.5 ความสัมพันธ์ระหว่างราคาเฉลี่ย และ ปริมาณการการซื้อขาย กับ เดือน
จากค่า Correlation ในหัวข้อที่ 5.1 ที่บ่งบอกว่ามีความสัมพันธ์ระหว่างราคาเฉลี่ย และ เดือนในการซื้อขายอะโวคาโด้ เราจะลองมาพล็อตกราฟ เพื่อดูผลกระทบต่อ ราคาเฉลี่ย ที่มีเดือนที่เกิดการซื้อขายอะโว้คาโด้ โดยจะดูควบคู่ไปกับผลกระทบของปริมาณการขายด้วย
fig, ax = plt.subplots(2, 1, figsize=(23,10))
avo['year_month'] = avo['Date'].dt.to_period('M')
grouped = avo.groupby('year_month')[['AveragePrice', 'Total Volume']].mean()
ax[0].plot(grouped.index.astype(str), grouped['AveragePrice'])
ax[0].tick_params(labelrotation=90)
ax[0].set_ylabel('AveragePrice')
ax[1].plot(grouped.index.astype(str), grouped['Total Volume'])
ax[1].tick_params(labelrotation=90)
ax[1].set_ylabel('Total Volume')
plt.show()

จากรูปที่ 19 จะเห็นได้ชัดว่า ข้อมูลคอนเฟิร์มไปทางเดียวกันกับที่เราได้สรุปข้อมูลมาทั้งหมด ก็คือ
- ราคาเฉลี่ยของอะโวคาโด้ มีความสัมพันธ์ไปในทิศทางตรงกันข้ามกับปริมาณการขาย ซึ่งจะเห็นได้จาก ณ จุดที่กราฟของราคาเฉลี่ยเพิ่มสูงขึ้น (รูปบน) ปริมาณการขาย (รูปล่าง) จะปรับตัวลดต่ำลง และในทางกลับกัน เมื่อปริมาณการขายเพิ่มมากขึ้น ราคาเฉลี่ยก็มีการปรับตัวลดต่ำลงเช่นกัน
- ราคาเฉลี่ยของอะโวคาโด้จะลดต่ำลงในช่วงประมาณต้นปี ในเวลาที่ปริมาณการซื้อขายปรับสูงขึ้น ซึ่งไปได้ว่าในช่วงนั้นมีผลผลิตออกมาค่อนข้างมาก ซึ่งถ้าเราลอง Search ดูจะพบว่า ในช่วงเดือน มค. – มีค. เป็นช่วงที่ผลผลิตอะโวคาโด้มีปริมาณมาก (ถึงแม้ว่าจะไม่ได้มากที่สุด) แต่ ในช่วงนั้นถือเป็นช่วงที่อะโวคาโด้มีรสชาติดีที่สุด หรือถือได้ว่าเป็นช่วงที่เป็น Best time ในแง่รสชาติของอะโวคาโด้ในอเมริกา อะโวคาโด้จึงได้รับความนิยม และเกิดการแข่งขันทางธุรกิจส่งผลให้ราคาปรับตัวต่ำลงตามไปด้วยนั่นเอง
- เราสามารถมองเห็น Seasonality หรือ ฤดูกาลที่ส่งผลต่อการซื้อขายและราคาเฉลี่ยของอะโวคาโด้ได้จากสองกราฟนี้ ซึ่งชี้ให้เห็นว่า ช่วงเวลา (Dates) สามารถเป็นประโยชน์ในการทำนายค่าต่อไปในอนาคตได้ ซึ่งเราจะวิเคราะห์การใช้ข้อมูลส่วนนี้สำหรับการทำนายอย่างละเอียดกันอีกครั้งในบทความที่ 3 เรื่องการสร้างโมเดล Machine Learning

6) Q & A
หลังจากเราได้ทำการวิเคราะห์ EDA กันไปแล้วพอสมควร ในส่วนต่อไป เราจะมาตั้งสมมุติฐาน และหาคำตอบจากข้อมูลชุดนี้กันค่ะ
6.1 อะโวคาโด้ชนิดไหนขายดีกว่ากัน?

คำถามแรก ง่ายๆเลยคือ มีอะโวคาโด้ที่ขายอยู่ในท้องตลาด 2 ประเภท คือ อะโว้คาโด้ทั่วไป และ อะโวคาโด้ออกแกนิกส์ …. อะโวคาโด้ชนิดใดที่ขายดีกว่ากัน???
ก่อนจะหาคำตอบว่าอะไรขายดีกว่า มาดูความแตกต่างในด้านราคาของอะโวคาโด้ทั้งสองชนิดนี้กันก่อนด้วยการพล็อตกราฟประเภท Boxplot
sns.boxplot(y="type", x="AveragePrice", data=avo, palette = 'pink')

จาก boxplot จะเห็นว่า เปอร์เซ็นไทร์ที่ 25 และ 75 (ตัวของ box) ของฝั่ง organic มีราคาสูงกว่า ตัวของ box ของฝั่ง conventional ขณะที่หางของ box organic ก็สูงกว่าหางของ conventional เช่นกัน เราสรุปได้ว่าราคาของการปลูกแบบ organic มีราคาที่สูงกว่า ขณะที่เราเห็น outlier อยู่บ้างอันที่จริงมันเป็นการเทียบแบบข้อมูลทั้งหมดต่อกัน ซึ่งการที่เราเห็นว่ามีหลายส่วนที่ดูเหมือน หางของ box organic ต่ำกว่าตัวของ box แบบ conventional นั้นอาจจะมาจาก ราคาในเดือนที่ต่ำของผลไม้ชนิดนี้(เดือน? – ?)เลยทำให้แบบ organic ในรอบปีถูกนำไปเปรียบเทียบกับช่วงราคาสูงของผลไม้ชนิดนี้จึงดูเหมือนหลายส่วนที่เป็น conventional ก็มีราคาสูงกว่า และเนื่องจาก boxplot เป็นการสรุปรวม data ไม่ได้ดูดาต้าเทียบกันตามช่วงเวลานั่นเอง อย่างไรก็ดี เราจะเห็นถึงความสัมพันธ์เชิงปริมาณของเศรษฐศาสตร์แบบ Economics of Scale ในระดับเล็กน้อย คือ ยิ่งผลิตเยอะยิ่งมีราคาถูก ยิ่งซื้อเยอะก็จะยิ่งได้ราคาถูกเช่นกัน ในเดือนเดียวกัน ถ้าเราซื้อแบบ conventional 1 ลูกก็อาจจะแพงกว่า การที่มีคนมาเหมาซื้อ Organic 100,000 ลูกก็ได้(Economic of Scale)
เมื่อดูราคากันแล้ว มาลองดูปริมาณการขาย เปรียบเทียบกับราคากันบ้างค่ะ
fig, ax = plt.subplots(1, 2, figsize=(14,5))
sns.barplot(x='type', y='AveragePrice', data=avo, palette='Set3', ax=ax[0])
sns.barplot(x='type', y='Total Volume', data=avo, palette='Set3', ax=ax[1], estimator=sum, ci=None)
plt.show()
display(avo.groupby('type')['AveragePrice'].mean())
display(avo.groupby('type')['Total Volume'].sum())

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

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

คำถามข้อที่ 2 คือ อะโวคาโด้ชนิดไหนมีแนวโน้มที่กำลังได้รับนิยม หรือ พูดง่ายๆ คือ เทรนกำลังมานั่นเอง เดี๋ยวเรามาลองตอบคำถามข้อนี้ด้วยค่า เปอร์เซ็นต์การเปลี่ยนแปลง (Percentage Change) ของปริมาณการขายกันค่ะ
group = avo.groupby(['type', 'year_month'])['Total Volume'].sum()
organic = group['organic']
organic = pd.DataFrame(organic)
organic['Total Volume % change'] = np.round(organic['Total Volume'].pct_change() * 100, 2)
conventional = group['conventional']
conventional = pd.DataFrame(conventional)
conventional['Total Volume % change'] = np.round(conventional['Total Volume'].pct_change() * 100, 2)
conventional['Total Volume % change'].mean()
print("The sum of percentage change of Organic is: {}".format(np.around(organic['Total Volume % change'].sum(), 2)))
print("The sum of percentage change of Conventional is: {}".format(np.around(conventional['Total Volume % change'].sum(), 2)))

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

ในรูปที่ 19 ส่วนที่ 5.5 เราได้เห็นข้อมูลกันคร่าวๆ แล้วว่า อะโวคาโด้มีจำนวนการผลิตที่สูงในช่วงต้นปี ในส่วนนี้เราจะมาวิเคราะห์เพิ่มเติมในส่วนของ Seasonality หรือ ฤดูกาลของอะโวคาโด้กันค่ะ ว่ามีช่วงฤดูใดหรือไม่ ที่เราจะสามารถหาอะโวคาโด้ได้ง่าย และ มีราคาถูก
fig, ax = plt.subplots(1, 2, figsize=(12,5))
avo['quarter'] = avo['Date'].dt.quarter
sns.barplot(x='quarter', y='Total Volume', data=avo, palette='Greens_r', ci=None, ax=ax[0])
sns.barplot(x='quarter', y='AveragePrice', data=avo, palette='Greens_r', ci=None, ax=ax[1])
plt.show()
quarter = avo.groupby('quarter')[['Total Volume', 'AveragePrice']].mean()
display(quarter)

จากกราฟจะเห็นได้ว่า
- ใน Quarter แรกของปีจะเป็นช่วงที่อะโวคาโด้ขายดีที่สุด และเป็นช่วงนี้อะโวคาโด้มีราคาต่ำที่สุดด้วย
- หลังจากผ่าน Q1 ของปีไปแล้ว ปริมาณการขายอะโวคาโด้จะเริ่มลดลง พร้อมๆ กับราคาที่ปรับสูงขึ้น ถ้าพิจารณาจากความต้องการอะโวคาโด้ในช่วงที่ผลผลิตของอะโวคาโด้ใน USA มีน้อย กับราคาที่สูงขึ้นแล้ว การเริ่มมอง การนำเข้าอะโวคาโด้ในช่วงเวลาดังกล่าว ก็เป็นเรื่องที่น่าสนใจอยู่ไม่น้อย
6.4 แหล่งผลิตอะโวคาโด้ ที่ไหนที่เราจะสามารถหาอะโวคาโด้ได้ง่าย และมีราคาถูกกว่า

ในส่วนนี้เราจะดูเรื่องของแหล่งซื้อขายอะโวคาโด้กันบ้างว่า ที่เมืองหรือเขตไหนใน USA ที่เราจะสามารถหาอะโวคาโด้ได้ง่าย และราคาถูกันค่ะ
พิจารณาในแง่ราคา (price)
มาลองค้นหากันดูว่าเมืองใดที่มีราคาเฉลี่ยของอะโวคาโด้สูง และต่ำที่สุด
fig, ax = plt.subplots(1, 2, figsize=(18,5))
regionP = avo.groupby('region')['AveragePrice'].mean()
expensive = regionP.sort_values(ascending = False).iloc[:10]
cheap = regionP.sort_values().iloc[:10]
sns.barplot(x='AveragePrice', y='region', data = avo, order=expensive.index, ci=None, palette='Greens_r', ax=ax[0])
sns.barplot(x='AveragePrice', y='region', data = avo, order=cheap.index, ci=None, palette='Greens_r', ax=ax[1])
plt.show()
cheap = pd.DataFrame(cheap).reset_index()
expensive = pd.DataFrame(expensive).reset_index()
print('the most expensive avocados can be found in {} '.format(list(expensive.iloc[:5,0])))
print('the cheapest avocados can be found in {} '.format(list(cheap.iloc[:5,0])))

กราฟด้านซ้ายมือ (สีแดง) คือ กราฟแสดง 10 เมืองที่มีราคาเฉลี่ยของอะโวคาโด้สูงที่สุด แสดงว่า เราจะต้องจ่ายค่าอะโวคาโด้แพงที่สุดเลย ถ้าอาศัยอยู่ใน 3 เมืองหลัก คือ HartfordSpringfield, SanFrancisco’ และ ‘NewYork’
แต่ถ้าเราดันโชคดี อาศัยอยู่ใน Houston, DallasFtWorth หรือ SouthCentral แล้วละก็ ถือว่าโชคดีค่ะ ได้บริโภคอะโวคาโด้ราคาถูก (กราฟสีเขียวด้านขวามือ)
รูปที่ 25 เป็นการแสดงราคาโดยเฉลี่ยของอะโวคาโด้ตั้งแต่ปี 2015 – 2018 แต่ถ้าเราต้องการข้อมูลที่ละเอียดขึ้นไป โดยแยกเป็นแต่ละปีบ้างล่ะ? การแยกเป็นแต่ละปี ก็มีความสำคัญในการติดตามสถานการณ์ที่เกี่ยวข้องด้วย เช่น ถ้าปีไหนมีการแจกแจงที่แตกต่างจากปีอื่นๆ เราก็จะทำการวิเคราะห์หาต้นเหตุ และ ศึกษาผลกระทบที่เกิดขึ้น ทำให้ถ้าหากในอนาคตมีเหตุการทำนองเดียวกันเกิดขึ้น เราก็จะมีข้อมูลเพิ่มเติมที่จะช่วยให้การประมาณ หรือ ทำนายข้อมูลราคาของอะโวคาโด้ได้แม่นยำขึ้น มาลองแยกพล็อตเป็นปีกันดูค่ะ
g = sns.factorplot('AveragePrice','region',data=avo,
hue='year',
size=13,
aspect=0.8,
palette='magma',
join=False,
)

จากกราฟจะเห็นได้ว่า อะโวคาโด้จาก HartfordSpringfield, SanFrancisco’ และ ‘NewYork’ มีราคาเฉลี่ยสูงจริง ดังที่เราได้วิเคราะห์มาแล้วข้างต้น แต่ข้อมูลที่เราได้มาเพิ่มเติมจากกราฟนี้ก็คือ ราคาอะโวคาโด้พุ่งกระฉูดกว่าปกติในปี 2017 สังเกตุได้จากกราฟสีชมพู ที่มีค่ามากกว่าสีอื่นๆอยู่มาก ในหลายๆ รัฐ ทำให้เราต้องกลับมาหาสาเหตุว่า ทำไมราคาอะโวคาโด้ในปี 2017 ถึงได้มากผิดปกติ?

โชคดีของเราที่โลกออนไลน์เจริญก้าวหน้าไปมาก อยากทราบอะไร ค้น 1 นาทีก็เจอ ทำให้เราทราบว่า … ในปี 2017 เกิดวิกฤตราคาอะโวคาโด้พุ่งกระฉูดในอเมริการ ถือเป็นเรื่องใหญ่ทีเดียว เนื่องจากอเมริกาเป็นประหนึ่งในประเทศที่บริโภคอะโวคาโด้มากที่สุดในโลก ติดอันดับหนึ่งมาอย่างยาวนาน การเกิดปัญหาราคาอะโวคาโด้พุ่งแบบนี้ จึงส่งผลกระทบต่อคนอเมริกันทั้งประเทศ ถ้าเราลองค้นดูเพิ่มเติม ก็จะเห็นได้ว่า ในปี 2017 นั้นเป็นปีที่มีปัญหาสภาพอากาศ ทำให้ผลผลิตอะโวคาโด้ไม่เป็นไปตามคาดหมายนั่นอง
รู้สาเหตุแล้ว เราจะทำยังไงกันต่อ? จริงๆ แล้วเมื่อทราบสาเหตุ สิ่งที่ต้องทำต่อไปก็คือ “ศึกษาผลกระทบ” จากเหตุการณ์นั้นๆ เพื่อให้สามารถนำข้อมูลที่ได้มาปรับใช้อนาคต น่าเสียดายที่ข้อมูลชุดที่เรากำลังใช้อยู่นี้ มีข้อมูลเพียงแค่ถึงต้นปี 2018 เท่านั้น เราจึงยังไม่สามารถนำมาวิเคราะห์ผลกระทบในระยะยาวได้มาก ดังนั้น ถ้าหากในอนาคตเรามีข้อมูลเพิ่มเติม ก็จะสามารถนำมาวิเคราะห์ผลกระทบของเหตุการณ์นี้ในระยะยาวได้
มาดูในแง่ปริมาณกันบ้าง
พิจารณาในแง่ปริมาณ (Volume)
ในส่วนนี้เราจะมาดูกันในแง่ของปริมาณความต้องการของอะโวคาโด้แยกตามแหล่งซื้อขายกัน เพื่อให้เราได้ไอเดียคร่าวๆ เกี่ยวกับปริมาณการบริโภคอะโวคาโด้ของประชากรในแต่ละเมือง
fig, ax = plt.subplots(1, 2, figsize=(18,5))
avoStates = avo[avo['region'] !='TotalUS']
regionV = avoStates.groupby('region')['Total Volume'].sum()
most = regionV.sort_values(ascending = False).iloc[:10]
least = regionV.sort_values().iloc[:10]
sns.barplot(x='Total Volume', y='region', data = avoStates, order=most.index, ci=None, palette='Reds_r', ax=ax[0])
sns.barplot(x='Total Volume', y='region', data = avoStates, order=least.index, ci=None, palette='Greens_r', ax=ax[1])
plt.show()
most = pd.DataFrame(most).reset_index()
least = pd.DataFrame(least).reset_index()
print('States with the the biggest demand are {} '.format(list(most.iloc[:5,0])))
print('States with the least demand are {} '.format(list(least.iloc[:5,0])))

จากกราฟจะเห็นว่าได้ว่ารัฐที่มีความต้องการบริโภคอะโวคาโด้สูงที่สุดได้แค่ ‘West’, ‘California’, และ ‘SouthCentral’ ส่วนรัฐที่มีความต้องการอะโวคาโด้ต่ำที่สุดได้แก่ ‘Syracuse’, ‘Boise’ และ ‘Spokane’
สรุป EDA
หลังจากที่ได้ทำ EDA ไปบางส่วน ลองมาสรุปกันหน่อยดีกว่าว่าได้ความรู้อะไรกันมาบ้าง
- อะโวคาโด้ทั่วไปซึ่งมีราคาถูก ขายดีกว่า อะโวคาโด้ออแกนิกส์ซึ่งมีราคาสูง มากๆๆๆๆๆ ดังนั้น การใช้ตัวแปรที่เกี่ยวข้องกับปริมาณการขาย เช่น Total Volume และอื่นๆ ร่วมกับตัวแปรราคาเฉลี่ย จะได้ได้ผลดีมากในการทำโมเดลประเภท Classification (การจัดกลุ่มข้อมูล) เพื่อทำนายว่าลูกค้าแต่ละคนมีแนวโน้มที่ในการซื้ออะโวคาโด้ประเภทใด ระหว่างแบบทั่วไป กับ ออแกนิกส์
- การที่ตัวแปรราคาเฉลี่ย (Average Price) มีความสัมพันธ์กับตัวแปรบอกปริมาณเช่น Total Bags ในทิศทางตรงกันข้าม ความสัมพันธ์นี้มีประโยชน์และเหมาะสมมากในการทำ Regression analysis เพื่อทำนายราคาเฉลี่ยของอะโวคาโด้
- ในการพล็อตกราฟในลักษณะของอนุกรมเวลา (Time Series) (รูปที่ 19) การเพิ่มของปริมาณการขาย และการลดของราคาเฉลี่ย (หรือ ในทางกลับกัน) แสดงให้เห็นว่า ในข้อมูลชุดนี้มีแนวโน้ม หรือ Trend อยู่ ซึ่งจะเป็นประโยชน์ต่อนายในอนาคต
ฝากให้คิด!
ประโยชน์ที่เราได้รับจากการทำ EDA ก็คือ ทำให้เรามีความเข้าใจในตัวข้อมูลได้มากขึ้น และ สามารถใช้ข้อมูลที่ได้นี้เพื่อประโยชน์ในการวางแผนธุรกิจได้
ฝากให้ลองไปคิดตัวอย่างการนำข้อมูลนี้มาใช้ในการวางแผนธุรกิจกันหน่อย ภายในอาทิตย์เราจะมาแชร์ไอเดียกันบนหน้าเพจ AlgoAddict ค่ะ แล้วพบกันค่ะ
To be continue ….
ในบทความต่อไป บทความสุดท้ายแล้ว เราจะพาทุกท่านไปร่วมวิเคราะห์ข้อมูลขั้นสูงกันค่ะโดยอาศัยการวิเคราะห์ในเชิงทำนาย (Predictive Analytics) ด้วยเทคนิค Machine Learning แล้วพบกันในบทความหน้า