คำจำกัดความของเสียง: สำรวจข้อมูลจาก Spotify Audio Features
Patch Notes 0.0.2
สมัยนี้เวลาฟังเพลง อาจจะเป็นไปได้ยากในการจำกัดความเพลงด้วยแนวเพลงเพียงไม่กี่คำ ถึงแม้ว่าเราจะมีคำที่พยายามอธิบายแนวเพลงให้มากขึ้น ก็ไม่อาจจะอธิบายซาวของเพลงนั้นได้อย่างชัดเจน
ปัญหานี้ ส่งผลมาถึงการเลือกเพลงไปเปิด ในแวดวงดีเจ บางทีเรามีสไตล์ และซาวเพลงที่เราชอบอยู่ในใจ เมื่อเลือกแนวเพลงนี้ไป กลับไปเจอซาวแบบอื่นที่เราอาจจะไม่ชอบ แต่ดันมีแนวเพลงที่เหมือนกัน ซึ่งนั่นแหละ คืองานของดีเจ ในการจะฝ่าฟันอุปสรรคนั้นไปค้นพบสิ่งที่ใช่ที่สุด ท่ามกลางเพลงนับหมื่นับแสนเพลง!!!!
แต่วันนี้เราไม่ได้มาคุยกันเรื่องการหาเพลง แต่เป็นแนวทางที่ทำให้เพลงเข้ามาหาเราแทน นั่นคือการวัดผล หรือจำกัดความเพลง ให้ละเอียดชัดเจนยิ่งขึ้น และนี่คือเบื้องหลังของอัลกอริทึ่ม ที่ไปบอกให้ Spotify (พอ)รู้ว่าเราชอบเพลงแบบไหน แล้วหาเพลงที่คล้าย ๆ กันมาให้เราฟัง
🎧 "When genre fails, data speaks."
ทำความรู้จักกับ Spotify Audio Features
Spotify มีหลักการให้คะแนนเพลงแต่ละเพลงอยู่หลายข้อ ในที่นี้ อาจจะไม่ได้นำมาเล่าให้ฟังทั้งหมด แต่อาจจะข้อหยิบบางส่วนที่น่าสนใจ โดยค่าเหล่านี้ จะมีระยะตั้งแต่ 0 ถึง 1 ในการชี้วัดตัวแปรในแต่ละค่า
Valence: วัดค่าความสดใสของเพลง ยิ่งค่าใกล้ 1 จะแสดงว่าเพลงมีความแฮปปี้สุด ๆDanceability: จังหวะเพลงน่าเต้นขนาดไหน ยิ่งมาก ยิ่งแดนซ์กระจายEnergy: วัดพลังงานและความเข้มข้นของเพลง โดยจะวัดจากความเร็ว และความดุดันของเพลงInstrumentalness: วัดค่าเสียงดนตรีในเพลง ยิ่งค่าใกล้ 1 ยิ่งบ่งบอกว่าเพลงนั้นจะมีแต่เสียงดนตรีSpeechiness: วัดเสียงพูดในเพลง เป็นขั้วตรงข้ามกับInstrumentalnessยิ่งค่าใกล้ 1 ยิ่งบ่งบอกว่าเพลงนั้นจะมีแต่เสียงพูด ส่วนมากจะเป็น podcastMode: ตัวเพลงเป็น Major หรือ Minor โดยค่า Major จะเท่ากับ 1 และ Minor เท่ากับ 0
ด้วยความสงสัยว่าเสียงของแต่ละค่ามันจะเป็นอย่างไรกันแน่ ก็ได้เวลาไปสำรวจว่าแต่ละ feature จะให้ผลลัพธ์อย่างไร
The Dataset
สำหัรบโปรเจคนี้ ผมใช้ dataset จาก Kaggle:
Spotify Dataset 1921–2020 (600k+ Tracks)
โดย dataset นี้ จะประกอบไปด้วยข้อมูลเพลงที่ดึงมาจาก Spotify API ซึ่งเป็นเพลงที่ออกมาตั้งแต่ปี 1921 จนถึงปี 2020 จำนวนมากกว่า 600,000 เพลง พร้อมข้อมูล metadata ต่าง ๆ อย่างชื่อศิลปิน แนวเพลง เทมโป้ และ features ต่าง ๆ อีกมากมาย
เราจะเริ่มต้นด้วยการทำความสะอาดข้อมูล และรวมตารางเข้าด้วยกันโดยใช้ภาษา R ดึงข้อมูลแนวเพลงกับ artist ID ให้อยู่ในรูปแบบที่ใช้งานต่อได้ แปลงข้อมูลต่าง ๆ เช่นความยาวเพลงจาก ms เป็นนาที และเปลี่ยน mode จากตัวเลข เป็น major / minor
The dataset includes 600,000+ tracks released between 1921 and 2020. Each track includes metadata like artist, genre, tempo, and various audio features.
I cleaned and merged the data using R, using tidyverse and stringr to extract primary genres and artist IDs, convert durations, and label major/minor modes.
💡 Technical details were kept in collapsible code chunks to keep the article focused on insights.
CODE: Data Cleaning
Load Data
# load library
library(tidyverse)
# load csv
tracks <- read_csv("./data/tracks.csv")
artists <- read_csv("./data/artists.csv")Convert release date to year
# convert release date to year
tracks <- tracks %>%
mutate(release_year = as.integer(substr(release_date, 1, 4))) %>%
filter(!is.na(release_year))Convert ms to minute
# convert ms to minute
tracks <- tracks %>%
mutate(duration_min = as.numeric(duration_ms / 60000))
Cleaning Artists ID
# cleaning artist ID
tracks <- tracks %>%
mutate(artist_id = str_extract(id_artists,"(?<=\\[')[^']+"))
Join Table
# join data
selected_artists <- select(artists, id, followers, genres)
merged_df <- left_join(tracks, selected_artists, by = c("artist_id" = "id"))
Clean Genres
# cleaning genres
merged_df <- merged_df %>%
filter(!is.na(valence), genres != "[]") %>%
mutate(
primary_genre = str_extract(genres, "(?<=\\[')[^']+")
)Labeling Mode
# convert mode label
merged_df <- merged_df %>%
mutate(
!is.na(mode),
mode_label = if_else(mode == 1, "Major", "Minor")
)
จังหวะ dance ของคอมพิวเตอร์
สิ่งที่ผมสงสัยที่สุด คือในแต่ละ features นั้น เพลงที่มีคะแนนสูงสุด จะมีลักษณะของเสียงเพลงเป็นอย่างไร โดยผมขอเริ่มจากสิ่งที่ใกล้ตัวที่สุด คือ danceability เพลงไหนที่เต้นได้ ในมุมของ ai นั้น จะมีลักษณะอย่างไร ผมได้คัดกรองข้อมูลมาทั้งหมด 20 อันดับ เพลงที่มีค่า danceability สูงสุด 3 อันดับแรก ก็ทำให้ผมต้องอึ้ง เพราะเป็นเพลงที่มีแนวเพลงที่ไม่เหมือนกันเลย
- Malina Olinescu – Puisorul Cafeniu (Romanian children’s music)
เพลง Puisorul cafeniu โดย Malina Olinescu เป็นเพลงสำหรับเด็กจากโรมาเนีย ออกมาในปี 2002 ที่ก็ปฏิเสธไม่ได้ว่ามันก็น่าเต้นตามจริง ๆ ด้วยจังหวะที่ชวนให้โยกตาม และเข้าใจง่าย แต่ผมก็ไม่ได้คาดคิดว่าจะเป็นเพลงแนวนี้ ซึ่งมีค่า danceability ถึง 0.991
- Tone-Loc – Funky Cold Medina (Hip hop classic)
เพลงนี้จะเป็นเพลงที่มีจังหวะฮิปฮอป Funky Cold Medina โดย Tone-Loc ออกมาในปี 1989 เป็นฮิปฮอปซาวเก่า ๆ ที่ชวนขยับตามอย่างเมามัน และอาจเป็นจังหวะคลาสสิคที่คุ้นเคยของใครหลาย ๆ คน โดยมีค่า danceability ถึง 0.988 ซึ่งก็สูงไม่แพ้กับอันดับแรกเลยทีเดียว
- Nu feat. Jo.Ke – Who Loves the Sun (Edit) (Deep house)
และอันดับสาม เป็นเพลงเฮ้าส์ ที่เรียกได้ว่าสุดคลาสสิค แม้จะออกมาในปี 2011 แต่ก็ได้รับเสียงตอบรับอย่างดี จากแฟนเพลงทั่วโลก เรียกได้ว่านี่ก็เป็นจังหวะที่คุ้นเคยสำหรับผม รับคะแนน danceability ไปเท่ากันกับอันดับสอง ก็คือ 0.988
จาก 3 เพลงนี้ ถึงแม้ว่าจะเป็นแนวที่ไม่ซ้ำกันเลย แต่ก็เห็นได้ชัดว่ามีจังหวะที่ชวนให้ขยับตามกันหมดทุกเพลง นั่นเป็นข้อสังเกตว่า การพิจารณา danceability อาจไม่ได้มีแนวเพลงมาเกี่ยวข้อง แต่กลับเป็นจังหวะเพลงมากกว่า ที่จะมีผลกับคะแนนนี้
CODE: TOP 20 Danceability
# top dance track
top_dance <- merged_df %>%
select(name, artists, genres, danceability, popularity) %>%
arrange(desc(danceability)) %>%
head(20)
🕺 "Danceability isn’t about genre—it’s about feel."
Energy ที่ไม่คาดคิด
เมื่อพูดถึงคำว่า energy สำหรับผมก็จะไปนึกถถึงเพลงที่เบสหนัก ๆ หรือมีจังหวะที่หนักหน่วงในเพลง เนื่องจากชื่นชอบในเพลง electronic จึงมีความคิดว่ามันน่าจะเป็นเพลงอะไรทำนองนั้น แต่เมื่อลองคัดกรองข้อมูลออกมาดู ก็ต้องพบกับผลลัพธ์ที่ผิดคาด
- Maurice Chevalier – Moi J'fais Mes Coups En Dessous
- Condos Brothers, Ben Bernie & His Orchestra – I'm Bubbling Over (Reprise)
- Benny Goodman – Applause / Transition Back to Finale (Live)
สามเพลงนี้มีคะแนนเท่ากัน นั่นคือ 1 คะแนน ซึ่งคือคะแนนของ energy ที่เต็มเปี่ยม แต่กลับกลายเป็นเพลงเก่า และเครื่องดนตรีมีลักษณะเป็นเครื่องสาย จะมีเพลงที่ 3 ที่เป็นเสียงปรบมือจากผู้ชมจากการบันทึกเสียงการแสดงสด ถึงแม้ว่าทั้งสามเพลง จะเป็นแนวเพลงที่ผิดคาดไป แต่มีข้อสังเกตอยู่อย่างนึงคือ สามเพลงนี้เป็นเพลงเก่า และมีเสียง noise อยู่เยอะมาก ทำให้ผมคิดว่า หลักเกณฑ์ในการให้คะแนนของ energy นั้น มาจาก noise ในเพลง ซึ่งแนวเพลงที่จะมีเสียงแบบนั้น ก็น่าจะเป็นเพลงที่มีเสียงกีต้าร์แตกพร่าอย่าง metal แขนงต่าง ๆ
Slipknot - Eyeless
นึกชื่อใครไม่ออก ก็มาจบที่ nu-metal รุ่นเก๋าอย่าง Slipknot ที่ทำคะแนน energy อยู่ที่ 0.997 ซึ่งสูงมาก ๆ เพราะเพลงเต็มไปด้วยความดุดันของกีต้าร์และเสียงร้อง จึงได้คะแนนที่เรียกว่าเกือบ 1 ไปได้อย่างไม่แปลกใจ
Sonic Youth - Hey Joni
หากพูดถึงความแตกพร่า ก็คงหนีไม่พ้นเจ้าพ่อ noise rock อย่าง Sonic Youth ที่ทำให้ว่า ไม่จำเป็นต้องดุอย่างเดียว แค่กีต้าร์กรอบเกรียว ก็สร้างพลังงานได้มากแล้ว Hey Joni รับคะแนน energy ไป 0.990 ซึ่งก็เยอะไม่แพ้กันเลย
CODE: TOP 20 Energy
# the highest energy tracks
top_energy <- merged_df %>%
select(name, artists, genres, energy, popularity) %>%
arrange(desc(energy)) %>%
head(20)
⚡ "Energy can be volume, distortion—or applause."
Valence แจกความสดใส
หลังจากทำความรู้จักสอง feature ไปแล้ว มีอีก 1 ตัวแปรที่น่าสนใจ และสามารถนำมาวิเคราะห์ข้อมูลต่อไปได้อย่าง valence หรือความสดใสในตัวเพลง ผมลองดึง 3 อันดับต้น ของเพลงที่สดใสที่สุด
- Raymond Scott – Chatter
- Raffi – Les Petites Marionettes
- Montez de Durango – Pasito Duranguense
ทั้ง 3 เพลงนี้ มีคะแนนเท่ากัน นั่นคือ 1 โดยนอกจากจะมีเมโลดี้ที่สดใส ให้ความหวัง พระอาทิตย์ยิ้มแฉ่งแล้ว ยังมีเครื่องเป่าเป็นองค์ประกอบหลักของเพลงอีกด้วย ซึ่งเป็นข้อสังเกตใหญ่อันหนึ่ง ที่น่าจะมีผลกับการให้คะแนน Valence นี้ค่อนข้างมาก
CODE: TOP 20 Valence
# high valence
high_valence <- merged_df %>%
select(name, artists, valence) %>%
arrange(desc(valence)) %>%
head(20)
☀️ "High valence = sunshine in audio form."
A Secret Relationships: ความสัมพันธ์ลับ ๆ ของแต่ละ features
จากการสำรวจข้อมูลของ Spotify Audio Features นอกจากจะได้รู้ถึงลักษณะของเพลงแต่ละ feature แล้ว เรายังสามารถนำ feature เหล่านี้ มาหาความสัมพันธ์ และศึกษา insight ของเพลงที่เราอาจคาดไม่ถึงได้ เราสามารถนำ feature แต่ละอันมาเทียบกันเอง และสามารถนำไปเทียบกับข้อมูลที่เกี่ยวกับเพลงอื่น ๆ ก็ได้เช่นกัน
Tempo Has Risen Over Time

CODE: Chart
# Average tempo by year
tracks %>%
filter(release_year > 1921) %>%
group_by(release_year) %>%
summarise(avg_tempo = mean(tempo, na.rm = TRUE)) %>%
ggplot(aes(x = release_year, y = avg_tempo)) +
geom_line() +
labs(title = "Average Tempo Over Time",
x = "release year", y = "average tempo") +
theme_minimal()
จากข้อมูลค่าเฉลี่ยของ BPM ของเพลงที่ออกมาในแต่ละปี เมื่อลองเอามาพลอตเรียงปีแล้ว จะเห็นว่าในช่วงปี 1921 - ประมาณ 1940 เทรนด์ความเร็วของเพลงมีความผันผวนค่อนข้างมาก แต่หลังจากนั้น เทรนด์จะค่อย ๆ ไต่ขึ้นไปเร็วขึ้นเรื่อย ๆ จนถึงปี 2020 ที่ดูแล้วมีแนวโน้มที่จะลดลงไป ซึ่งอาจหมายความว่าเพลงเร็ว ๆ อาจถึงจุดอิ่มตัว หรืออาจจะกลับมาในช่วงหลังก็เป็นได้ โดยส่วนตัวแล้ว ผมก็ยังได้ยินเพลงที่มีจังหวะที่รวดเร็วอยู่เป็นประจำ แต่ก็คิดว่ามันก็ถึงเวลาที่ความนิยมของมันกำลังจะลดลงแล้วเช่นกัน
Instrumental Tracks and Popularity

CODE: Chart
tracks %>%
sample_n(300000) %>%
filter(!is.na(instrumentalness), instrumentalness > 0.1) %>%
ggplot(aes(x = instrumentalness, y = popularity)) +
geom_point(alpha = 0.4, color = "#1DB954", size = 1) +
geom_smooth(method = "loess", se = FALSE, color = "black") + # trend line
scale_x_continuous(labels = scales::percent_format(accuracy = 1)) +
labs(
title = "Does Instrumentalness Affect Popularity?",
subtitle = "Tracks with instrumentalness > 10%",
x = "Instrumentalness",
y = "Popularity (0–100)",
caption = "Sample of 300,000 tracks from Spotify dataset"
) +
theme_minimal(base_size = 13)
ปฏิเสธไม่ได้ว่า เพลงที่มีสัดส่วนของเสียงร้องมากกว่าเสียงดนตรีจะได้รับความนิยมมากกว่าเพลงที่มีแต่เสียงดนตรีเพียงอย่างดียว จากกราฟนี้ เมื่อลองพลอต trend line ดูแล้ว จะพบว่ายิ่งสัดส่วนของเสียงดนตรีมากขึ้น ความนิยมจะลดลง แต่ก็ไม่ได้มากจนเกินไป หากลองพิจารณาเพลงที่มีสัดส่วนของเครื่องดนตรี ก็มีเพลงจำนวนไม่น้อย ที่ได้รับความนิยมอยู่มากเช่นเดียวกัน โดยสังเกตได้จากจุดเขียว ๆ ที่หนาแน่นทางขวา
🎻 "Lyrics help—but grooves still move."
Major ≠ Happy

CODE: Chart
# Mode Vs Valence
merged_df %>%
filter(!is.na(valence)) %>%
ggplot(aes(x = valence, fill = mode_label)) +
geom_density(alpha = 0.5) +
labs(title = "Distribution of Valence by Mode",
x = "Valence", y = "Density") +
theme_minimal()
โดยส่วนมาก เพลงที่มีคีย์เป็น major จะได้รับการขนานนามว่าจะเป็นเพลงที่มีความสดใส แต่ชาร์ตนี้ก็ทำให้เราเห็นว่า อารมณ์ของเพลงนั้น ไม่ได้ขึ้นอยู่กับ mode เพียงอย่างเดียว จะเห็นว่าเพลงทั้ง major และ minor มีการกระจายตัวที่ค่อนข้างใกล้เคียงกัน นั่นหมายความว่า องค์ประกอบอื่น ๆ ในเพลง มีผลต่ออารมณ์มากกว่าคีย์ แต่อย่างไรก็ตาม ในช่วงเพลงที่มีค่าความสดใสสูงมาก ๆ ก็เป็นเพลงคีย์ major อยู่จำนวนไม่น้อย โดยสังเกตได้จากกราฟสีแดงที่พุ่งขึ้นไปนั่นเอง
Mood Map: Valence vs Energy

CODE: Chart
# mood map (valence vs. energy)
tracks %>%
sample_n(200000) %>%
ggplot(aes(x = valence, y = energy, color = popularity)) +
geom_point(alpha = 0.7, size = 0.8) +
scale_color_viridis_c() +
labs(title = "Mood Map of Songs", x = "Happiness", y = "Energy") +
theme_minimal()
ภาพนี้เป็นการเอาความสดใส และความดุดันของเพลงมาพลอตรวมกัน พร้อมแสดงสีของความนิยมเพิ่มเข้าไปด้วย จะเห็นว่าเพลงที่ได้รับความนิยม จะเป็นเพลงที่มี energy ค่อนข้างสูง แต่มีอารมณ์ที่กลาง ๆ ยิ่งอารมณ์สุดโต่ง จะไม่ค่อยได้รับความนิยมมากนัก ซึ่งนั่นอาจเปรียบได้กับเพลง pop rap และ electronic ที่มีบีตเร้าใจ แต่ไม่รุนแรง
🎚️ "The sweet spot: energetic but emotionally balanced."
Final Thoughts
เมื่อได้สำรวจข้อมูลในรูปแบบต่าง ๆ ได้เห็นว่าโมเดลของ Spotify สามารถมองเห็นเพลงในแต่ละ feature ได้อย่างไร ก็สร้างความประหลาดใจให้ผมไม่น้อย เมื่อลองดึงเพลงที่สุดโต่งในแต่ละค่าออกมาฟัง ทำให้จุดประกายไอเดียในการนำวิธีการนี้ไปใช้ต่อได้ รวมถึงการได้ลองเปรียบเทียบความสัมพันธ์ในแต่ละค่า ทำให้ความเข้าใจบางอย่างที่เคยมีเกี่ยวกับเพลงนั้นเปลี่ยนแปลงไป เกิดคำถามใหม่ ๆ เพิ่มมามากกมาย
ส่วนตัวผมรู้สึกว่า เราสามารถนำสิ่งเหล่านี้มาครอบการทำงานของศิลปินและดีเจได้ เพื่อให้เราเห็นภาพและแนวทางที่ชัดเจนมากขึ้น เหมิอนเป็นการสอดแทรกโครงสร้างเข้าไปกับความรู้สึก เพื่อไปพัฒนาระบบในการจัดเก็บและหาเพลงของแต่ละคน รวมถึงการพัฒนาระบบในการคัดกรองเพลงที่เหมาะกับสไตล์ของตัวเอง สร้าง feature ใหม่ ๆ มาใช้ให้มากกว่าเดิม เพื่อเพิ่มเกณฑ์การคัดกรองให้มากขึ้นไปอีก