Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
「国と音楽」 ~spotifyrを用いて~ #muana
Search
bob3bob3
October 28, 2023
Science
690
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
「国と音楽」 ~spotifyrを用いて~ #muana
SpotifyのWebAPIから取得できるデータを使い、国ごとに流行っている曲の傾向やグループ分けを行ってみた。
#muana #R言語 #rstats
bob3bob3
October 28, 2023
More Decks by bob3bob3
See All by bob3bob3
RとLLMで自然言語処理
bob3bob3
3
1.1k
RでPSM分析
bob3bob3
1
540
Rでコンジョイント分析 2024年版
bob3bob3
0
2.8k
『改訂新版前処理大全』の話と Apache Parquet の話 #TokyoR
bob3bob3
0
1.5k
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
670
『データ可視化学入門』をPythonからRに翻訳した話(増強版)
bob3bob3
0
620
『データ可視化学入門』を PythonからRに翻訳した話
bob3bob3
1
690
qeMLパッケージの紹介
bob3bob3
0
3k
パーマーステーションのペンギンたち#3 探索的データ分析(EDA)編
bob3bob3
1
900
Other Decks in Science
See All in Science
プレイがつなぐ研究と社会:市⺠‧クリエイター‧SF作家による実践を通じて
hayataka88
1
110
SAT ソルバーの仕組みと制約ソルバーへの応用
tsoh
3
650
データベース12: 正規化(2/2) - データ従属性に基づく正規化
trycycle
PRO
0
1.8k
データベース06: SQL (3/3) 副問い合わせ
trycycle
PRO
1
1.2k
機械学習 - K近傍法 & 機械学習のお作法
trycycle
PRO
1
1.7k
プロジェクト「Azayaka」のSARの数式とジオメトリ
syuchimu
0
480
CVPR2026_VGGTとその仲間たち
mickey_0226
0
1.2k
AWS WAFのAIトラフィック収益化機能を考えてみる_20260626
masakiokuda
1
100
ハミルトン・ヤコビ方程式の解の性質と物理的意味
enakai00
0
940
[Webinaire presse] Sécheresse 2026 : quelles conséquences techniques en élevage de ruminants et quels leviers d'action ?
institudelelevage
PRO
0
240
機械学習 - 授業概要
trycycle
PRO
0
660
データベース10: 拡張実体関連モデル
trycycle
PRO
0
1.6k
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
440
Designing for Timeless Needs
cassininazir
1
520
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
540
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
The Cost Of JavaScript in 2023
addyosmani
55
10k
The browser strikes back
jonoalderson
0
1.8k
Abbi's Birthday
coloredviolet
4
10k
Documentation Writing (for coders)
carmenintech
77
5.6k
Transcript
音楽と国 ~spotifyrを用いて~ Music×Analytics Meetup Vol.11 (2023/10/28) @bob3bob3
Spotify
Spotifyとは? Spotify(スポティファイ)は、スウェーデンの 企業スポティファイ・テクノロジーによって運 営されている音楽ストリーミングサービス。 (Wikipediaより引用)
spotifyr • R言語のspotifyrパッケージを使って、SpotifyのWeb APIから楽曲や アルバム、アーティストなどの情報を一括で取得。 • spotifyrで取得できる情報の一例 ◦ アルバム単位 ▪
ジャケット画像、曲数、アルバム名、リリース日、人気度など ◦ アーティスト単位 ▪ ジャンル、関連するアーティスト、人気度など ◦ 楽曲単位 ▪ アコースティック度、ダンス度、インスト度、音圧、テンポ、キー、人気度な ど ◦ 詳しくはspotifyのwebAPIのページを参照のこと。
プレイリスト • Spotifyにはプレイリストという機能が あります。好きな曲をまとめて公開す る機能です。 • Spotify公式のプレイリストもあって、 例えば各国のTop50がプレイリストと して公開されていたりします。 •
これもspotifyrで扱えて、プレイリスト ごとに含まれる楽曲のデータなどを抽 出できます。
やってみよう! • 「各国のTop50のプレイリストから、 含まれる楽曲を抽出し、各楽曲の 特徴を用いて各国をクラスタリング する。」というのをやってみます。 • 事前準備としてSpotifyのアカウント と開発者アカウントの登録が必要で す。
• 2023年07月14日時点のデータで す。
# パッケージ読み込み library(conflicted) #関数の衝突防止 library(tidyverse) #モダンなデータ処理 library(spotifyr) #Spotifyの Web API
操作 # 開発者アカウント認証 Sys.setenv(SPOTIFY_CLIENT_ID = 'xxxxxxxxxx') Sys.setenv(SPOTIFY_CLIENT_SECRET = 'xxxxxxxxxx') access_token <- get_spotify_access_token() 準備
# プレイリスト検索 res_search <- search_spotify( q = 'top50', type =
'playlist', limit = 50 ) |> dplyr::filter(owner.id == "spotify") |> #公式プレイリストに絞る select(name, id) |> #列を絞る mutate(name = name |> str_remove("Top 50 - ")) |> #プレイリスト名の整形 dplyr::filter( #ノイズになる行を削除 !(name %in% c("Global", "Greatest Hip-Hop Beats of All Time")) ) |> rowid_to_column() #ID番号を振る Top50のプレイリストを検索
検索結果 国名とプレイリストの id。
playlists_tracks <- res_search |> pull(id) |> map( #各プレイリストに含まれる楽曲を抽出 \(id) get_playlist_tracks(id)
|> select(track.id, track.name), .progress = TRUE ) |> list_rbind(names_to = "rowid") Top50のプレイリストから各楽曲のIDを検索
プレイリストに含まれる楽曲のリスト
各楽曲の分析情報を取得 res_track <- playlists_tracks |> pull(track.id) |> unique() |> map(
\(track.id) get_track_audio_features(track.id), .progress = TRUE ) |> list_rbind() |> right_join( playlists_tracks |> left_join(res_search, by = join_by(rowid)), by = join_by(id == track.id) ) |> mutate( duration_s = duration_ms / 1000, # ミリ秒を秒に country = as.factor(name) ) |> select( country, duration_s, energy, acousticness, liveness, speechiness, valence, danceability, tempo, id, track.name)
各楽曲の分析情報を取得
各楽曲の分析情報を取得 • duration_ms: 曲の長さ(ミリ秒) • energy: 0~1。騒がしい曲か静かな曲か。 • acousticness: アコースティック度合。電気的に増幅されている程度。
• liveness: 0~1。ライブ音源かスタジオ音源か。 • speechiness: 0~1。歌ではない話し言葉の量。 • valence: 0~1。ポジティブさ。 • danceability: 0~1。踊りやすさ。 • tempo: テンポ(BPM)。
各楽曲の分析情報
分析情報に関する発表事例
EDA library(summarytools) res_track |> select(!c(country, id, track.name)) |> dfSummary() |>
summarytools::view()
EDA library(GGally) res_track |> select(!c(country, id, track.name)) |> ggpairs(aes(alpha =
0.1))
国ごとの違い res_track2 |> ggplot( aes( x = reorder( country, duration_s,
FUN = median), y = duration_s)) + geom_boxplot() + coord_flip() + labs(x = "国", y = "演奏時間(秒)") + theme(text = element_text(size = 12))
クラスタリングしよう! # 国ごとに中央値を算出し、さらに標準化する median_by_country <- res_track |> select(!c(id, track.name)) |>
group_by(country, .drop = FALSE) |> summarise(across(everything(), median)) |> column_to_rownames(var = "country") |> scale() # 階層型クラスタリング library(factoextra) library(dendextend) cluster_tree <- median_by_country |> dist() |> hclust(method = "ward.D2") cluster_tree |> fviz_dend( k=6, cex=0.5, horiz = TRUE, label_cols = "black", k_colors = c( "#ff4b00", "#990099", "#03af7a", "#005aff", "#804000", "#ff8082"), rect = TRUE, rect_fill = TRUE, rect_border = 8 )
地図! clusters <- tibble( country = median_by_country |> rownames(), cluster
= cluster_tree |> cutree(k=6) ) library(ggrepel) library(sf) library(rnaturalearth) world_map <- ne_countries( scale = "small", returnclass = "sf" ) |> left_join( clusters |> mutate( country = country |> str_replace("USA", "United States") |> str_replace("South Korea", "Republic of Korea") ), by=join_by(name_long == country) ) world_map |> ggplot() + geom_sf(aes(fill = as.factor(cluster))) + theme_light() + labs(fill = "cluster") + scale_colour_brewer(palette = "Dark2")
None
Enjoy! 次回「2010年代 King Crimson のセットリスト分析」でお会いしま しょう!