Taking too long? Close loading screen.

การวิเคราะห์ความสัมพันธ์กับข้อมูลขนาดใหญ่

Jul 8, 2021

         การวิเคราะห์ข้อมูลนั้นมิใช่เรื่องใหม่หรือเป็นปรากฎการณ์ใหม่ที่เพิ่งเกิดขึ้นในยุคดิจิทัล เพียงแต่ปัจจุบันเรามีข้อมูลมากมายมหาศาล ดังนั้นจึงไม่แปลกที่การวิเคราะห์ข้อมูลในปัจจุบันของหลายหน่วยงาน ไม่ว่าจะเป็นหน่วยงานรัฐหรือหน่วยงานเอกชนได้กลายมาเป็นการวิเคราะห์ข้อมูลจากข้อมูลที่มีขนาดใหญ่ (Big Data)

         ในบทความนี้ผู้เขียนอยากแนะนำวิธีทางสถิติและโค้ดในภาษา R และ Python ที่สามารถนำมาใช้วิเคราะห์ความสัมพันธ์กับข้อมูลขนาดใหญ่ (Correlation Analysis in Big Data) ได้ดังนี้

  • การหาค่าสัมประสิทธิ์สหสัมพันธ์ (Correlation) ประเภทต่าง ๆ
  • การหาค่า Maximal Information Coefficient (MIC)

การหาค่าสัมประสิทธิ์สหสัมพันธ์ (Correlation Coefficient) ประเภทต่าง ๆ

          ค่า Pearson Correlation เป็นวิธีทางสถิติที่นิยมนำมาใช้วิเคราะห์เพื่อหาความสัมพันธ์ของข้อมูลมากที่สุดวิธีหนึ่ง เนื่องจากเป็นวิธีที่เข้าใจง่ายและสามารถคำนวนได้ไม่ยาก โดยค่า Pearson Correlation จะมีค่าอยู่ระหว่าง -1.0 ถึง +1.0 ซึ่งหากมีค่าใกล้ -1.0 นั้นหมายความว่าตัวแปรทั้งสองตัวมีความสัมพันธ์กันอย่างมากในเชิงตรงกันข้าม หากมีค่าใกล้ +1.0 นั้นหมายความว่า ตัวแปรทั้งสองมีความสัมพันธ์กันอย่างมากในทิศทางเดียวกัน และหากมีค่าเป็น 0 นั้นหมายความว่า ตัวแปรทั้งสองตัวไม่มีความสัมพันธ์ต่อกัน ทั้งนี้ค่าสัมประสิทธิ์สหสัมพันธ์เป็นการวิเคราะห์ความสัมพันธ์ของข้อมูลในลักษณะแบบเส้นตรงเท่านั้น ดังนั้นค่า Pearson Correlation จึงขาดความน่าเชื่อถือในกรณีที่ข้อมูลที่นำมาวิเคราะห์นั้นมิได้มีลักษณะความสัมพันธ์แบบเส้นตรง (โปรดดูภาพที่ 1 ประกอบ)

ภาพที่ 1: ทุกกราฟให้ค่า Pearson Correlation = 0.816 (โปรดดู Anscombe’s Quartet เพิ่มเติม)
ที่มาภาพ: https://en.wikiversity.org/wiki/Survey_research_and_design_in_psychology/Tutorials/Correlation/Correlations_and_non-linear_relations

         ค่า Spearman Correlation เป็นการหาความสัมพันธ์ระหว่างตัวแปร 2 ตัวที่อยู่ในมาตราการวัดระดับ Ordinal Scale โดยค่า Spearman Correlation จะมีค่าอยู่ระหว่าง -1.0 ถึง +1.0 เช่นเดียวกับ ค่า Pearson Correlation ส่วนการแปลความหมายก็ไม่ต่างจากการแปลความหมายของค่า Pearson Correlation นั้นคือ หากค่า Spearman Correlation ใกล้ -1.0 นั้นหมายความว่าตัวแปรทั้งสองตัวมีความสัมพันธ์กันอย่างมากในเชิงตรงกันข้าม หากค่า Spearman Correlation ใกล้ +1.0 นั้นหมายความว่า ตัวแปรทั้งสองมีความสัมพันธ์กันอย่างมากในทิศทางเดียวกัน และหากค่า Spearman Correlation เป็น 0 นั้นหมายความว่า ตัวแปรทั้งสองตัวไม่มีความสัมพันธ์ต่อกัน

         ค่า Kendall Correlation เป็นการหาความสัมพันธ์ระหว่างตัวแปร 2 ตัวที่อยู่ในมาตราการวัดระดับ Ordinal Scale โดยค่า Kendall Correlation จะมีค่าอยู่ระหว่าง -1.0 ถึง +1.0 เช่นเดียวกับ ค่า Pearson Correlation และ ค่า Spearman Correlation ส่วนการแปลความหมายก็ไม่ต่างจากการแปลความหมายของค่า Pearson Correlation และ ค่า Spearman Correlation นั้นคือ หากค่า Kendall Correlation ใกล้ -1.0 นั้นหมายความว่าตัวแปรทั้งสองตัวมีความสัมพันธ์กันอย่างมากในเชิงตรงกันข้าม หากค่า Kendall Correlation ใกล้ +1.0 นั้นหมายความว่า ตัวแปรทั้งสองมีความสัมพันธ์กันอย่างมากในทิศทางเดียวกัน และหากค่า Kendall Correlation เป็น 0 นั้นหมายความว่า ตัวแปรทั้งสองตัวไม่มีความสัมพันธ์ต่อกัน อย่างไรก็ตาม ค่า Kendall Correlation จะสามารถใช้ในการบ่งบอกถึงระดับความเข้มข้น (strength) ของความสัมพันธ์ระหว่างตัวแปรทั้งสองได้ดีกว่าค่า Pearson Correlation และ ค่า Spearman Correlation[1] ดังนั้นโดยปกติค่า Kendall Correlation จะน้อยกว่า ค่า Pearson Correlation และ ค่า Spearman Correlation เสมอ (โปรดดูภาพที่ 2 ประกอบ)

ภาพที่ 2: การเปรียบเทียบค่าสัมประสิทธิ์สหสัมพันธ์ทั้ง 3 ประเภท 1) Pearson 2) Spearman และ 3) Kendall จากข้อมูล Iris
(ที่มาภาพ: http://rstudio-pubs-static.s3.amazonaws.com/377463_0c897b0db2584c888aad81f7c8ac64ab.html)

         ข้างล่างเป็นตัวอย่างของโค้ดที่ใช้ในการคำนวณค่าสัมประสิทธิ์สหสัมพันธ์ทั้ง 3 ประเภทในภาษา R และ ภาษา Python

R Code:

 set.seed(1234)
 # 1000 random integers between 0 and 50
 x <- sample(c(0:50), size = 1000, replace = TRUE)
 # Positive Correlation with some noise
 y <- x + rnorm(1000, sd = 10)

 # Various correlations
 cor(x, y, method = c("pearson"))
 cor(x, y, method = c("kendall"))
 cor(x, y, method = c("spearman")) 

Python Code:

import numpy as np
from scipy import stats
  
np.random.seed(1234)
# 1000 random integers between 0 and 50
x = np.random.randint(0, 50, 1000)
  
# Positive Correlation with some noise
y = x + np.random.normal(0, 10, 1000)
# Various correlations
np.corrcoef(x, y)
stats.pearsonr(x,y)
stats.spearmanr(x, y)
stats.kendalltau(x, y) 

การหาค่า Maximal Information Coefficient (MIC)

          ค่า Maximal Information Coefficient (MIC)  เป็นวิธีทางสถิติประเภทหนึ่งในวิธีทางสถิติที่เรียกว่า Maximal Information-Based Nonparametric Exploration (MINE) โดยค่า MIC  จะให้ค่าอยู่ในช่วงระหว่าง 0 ถึง 1.0 และสามารถนำมาใช้หาความสัมพันธ์ของข้อมูลได้ทั้งแบบเส้นตรงและไม่ใช่เส้นตรง (linear and non-linear association) กล่าวคือ หากค่า MIC ใกล้ 1.0 นั้นหมายความว่า ตัวแปรทั้งสองมีความสัมพันธ์กันอย่างมาก และหากค่า MIC เท่ากับ 0 นั้นหมายความว่า ตัวแปรทั้งสองตัวไม่มีความสัมพันธ์ต่อกัน

         นอกจาก ค่า MIC จะสามารถนำมาใช้หาความสัมพันธ์ของข้อมูลได้หลากหลายรูปแบบแล้ว คุณสมบัติทางคณิตศาสตร์ของ ค่า MIC ยังสามารถนำมาใช้เป็นเกณฑ์เพื่อบ่งบอกว่าความสัมพันธ์ระหว่างตัวแปรสองตัวแปรนั้นมีความไม่เป็นเส้นตรงมากน้อยเพียงใด (degree of non-linearity)  ในกรณีที่ความสัมพันธ์ของตัวแปรสองตัวแปรมีความสัมพันธ์กันแบบเส้นตรง ค่า MIC จะมีค่าใกล้เคียงกับค่า R-squared มาก (MIC – R2 ≈ 0)  แต่หากความสัมพันธ์ของตัวแปรสองตัวแปรมีความสัมพันธ์กันแบบไม่เป็นเส้นตรง ผลต่างของ ค่า MIC กับ ค่า R-squared จะมีค่าสูงขึ้น (โปรดดูภาพที่ 3 ประกอบ)

ภาพที่ 3:  เปรียบเทียบค่า MIC กับ ค่า Pearson Correlation ในรูปแบบของความสัมพันธ์ต่าง ๆ
ที่มาภาพ: https://minepy.readthedocs.io/en/latest/

         ข้างล่างเป็นตัวอย่างของโค้ดที่ใช้ในการคำนวณค่า MIC ในภาษา R และ ภาษา Python

R-Code[2]:

install.packages("minerva")
library(minerva)
x <- 0:200 / 200
y <- sin(10 * pi * x) + x
mine(x,y, n.cores = 1)
mine_stat(x, y, measure = "mic")

Python Code[3]:

import numpy as np
from minepy import MINE
 
def print_stats(mine):
    print("MIC", mine.mic())
    print("MAS", mine.mas())
    print("MEV", mine.mev())
    print("MCN (eps=0)", mine.mcn(0))
    print("MCN (eps=1-MIC)", mine.mcn_general())
    print("GMIC", mine.gmic())
    print("TIC", mine.tic())
  
x = np.linspace(0, 1, 1000)
y = np.sin(10 * np.pi * x) + x
mine = MINE(alpha=0.6, c=15, est="mic_approx")
mine.compute_score(x, y)
  
print("Without noise:")
print_stats(mine)
print()

บทสรุป

          นอกจากวิธีการหาความสัมพันธ์ของข้อมูลด้วยค่า Correlation ประเภทต่างๆ และ ค่า Maximal Information Coefficient (MIC) ยังมีวิธิทางสถิติประเภทอื่น ๆ อีกมากมายที่ผู้เขียนมิได้กล่าวไว้ในบทความนี้ อาทิเช่น การหาค่าความสัมพันธ์เชิงดุลยภาพระยะยาว (Co-integration หรือ Granger Co-integration) ที่นิยมใช้ในการวิเคราะห์ข้อมูลอนุกรมเวลา หรือ การหาค่าความสัมพันธ์ระยะทาง (Distance correlation) เป็นต้น แต่ทุกวิธีล้วนมีข้อดีและข้อเสียที่ผู้ใช้ควรศึกษาให้เข้าใจก่อนที่จะนำมาใช้การวิเคราะห์ข้อมูล

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

อ้างอิง:

  • Reshef DN, Reshef YA, Finucane HK, Grossman SR, McVean G, Turnbaugh PJ, Lander ES, Mitzenmacher M, Sabeti PC. Detecting novel associations in large data sets. Science. 2011 Dec 16;334(6062):1518-24. doi: 10.1126/science.1205438. PMID: 22174245; PMCID: PMC3325791.
  • Davide Albanese, Michele Filosi, Roberto Visintainer, Samantha Riccadonna, Giuseppe Jurman and Cesare Furlanello. minerva and minepy: a C engine for the MINE suite and its R, Python and MATLAB wrappers. Bioinformatics (2013) 29(3): 407-408 first published online December 14, 2012 doi:10.1093/bioinformatics/bts707

[1] ผู้สนใจสามารถอ่านเพิ่มเติมได้ใน StackExchange (https://stats.stackexchange.com/questions/3943/kendall-tau-or-spearmans-rho)

[2] https://github.com/rsamantha/minerva

[3] https://github.com/minepy/minepy/blob/master/examples/python_example.py หรือ https://minepy.readthedocs.io/en/latest/python.html#first-example

เขียนโดย วรพิชญา ระเบียบโลก
ตรวจทานและปรับปรุงโดย นัทธมน มยุระสาคร

Vorapitchaya Rabiablok

Senior Data Scientist and Project Manager Government Big Data Institute (GBDi)

Natthamon Mayurasakhon

Data Scientist Government Big Data Institute (GBDi)

Sign up to join Big Data Community Thailand

Make comments, write articles, and contribute to our community.