見出し画像

Pythonをつかって、機械学習した1222例の乳がんデータベースの遺伝子データを音楽にしたら、なんとも物悲しい曲になった!ーーデータ可聴化とサイエンスーー

データ可聴化って?

少し前に、慶應のSFC関連のツィートで「データドリブンアート」っていうのを知ったのですが、なかでも興味を湧いたのは

生体データを用いたメディアアート

それで詳細を調べてみると

focusing on "#biological data (e.g., electromyography, electroencephalography etc), #visualization and #sonification of the #data through programming (C++, python, openFrameworks, Cycling74Max etc), and creation of artistic expressions".

筋電図や心電図などの医療データや生体データを可視化したり、可聴化したりしながら、アート表現をつくるこころみらしい!

特に興味を持ったのが

生体データの可聴化

可視化はよくみるものの可聴化ってあまり目にしたことがなく、あと音と生体データを組み合わせることで見えてくるものもありそうで、興味をもった。

そして面白そうなのが彼らが使うMaxっていうソフトウエア

これはいろいろなデバイスとPCをつなぐことで音楽表現にしてくれるソフトウエアらしく

ライブ・カメラやオーディオ入力によって、没入型やインタラクティブな体験を作り出す。
ArduinoやEobodyなどのデバイスを使って様々なセンサーをMaxに接続する。
MIDIデバイスやUSBゲーム・コントローラによって正確に意図したようにコントロールする。
MIDIやシリアル通信、そしてOpenSoundControlのようなネットワーク・プロトコルによって、多様なデバイスやソフトウェアを連携させたハイブリッド・システムを作る。
ローカル・ネットワークでのOpenSoundControlを用いて、他のコンピュータやOSC対応のモバイル・アプリを連動させる。

なんてことができるらしい。

ただこれは有料ソフトなのと、自分はまずは生体データといっても遺伝子データを使ってみたいと思ったので、その時はアイディアレベルにとどめていた。

1222例の乳がん遺伝子データ入手

最近自分の研究を行う上で、解析能力を高めるために個人的に遺伝子データ解析のプラットフォームを作ろうとpythonを勉強し始め、いくつかパイロット的に遺伝子解析をpython及びRを用いて行っている。

その一環で、1222例の乳がん(患者さんの)遺伝子データを入手、少し解析を進めてきた。

詳しくは


このサンプルは

1000あまりの乳がんのサンプルと100あまりの正常組織のサンプル

を遺伝子解析したもので、機械学習でクラスタリングさせると

6つくらいのグループによくわかれるデータである。

解析しているうちに、このサンプルの

正常と異常のラベル、

もしくは

遺伝子データをもとにクラスタリングしたラベル

を可聴化したらどうだろうかというアイディアが湧いてきた。

そこでpythonのライブラリーを検討すると、miditimeという良さそうなのが見つかった。

このライブラリーはMITの研究者が開発したもので、地震などのタイムコースのデータを可聴化するライブラリーであるが、わりと簡単なコードで動くライブラリーですぐに実装できそうなので試してみた。

環境設定して

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

ファイル読み込んで

km = pd.read_csv('kmean.txt', sep="\t",header=0, index_col=0)

ライブラリー読み込んで、セーブするファイルを入力して

from miditime.miditime import MIDITime

# Instantiate the class with a tempo (120bpm is the default) and an output file destination.
mymidi = MIDITime(120, '/Users/DESTINATION FOLDER/cancer3.mid')

# Create a list of notes. Each note is a list: [time, pitch, velocity, duration]
#midinotes = [
  ##[10, 61, 127, 4]  #At 10 beats (12 seconds from start), C#5 with velocity 127, for 4 beats
#]

# Add a track with those notes
#mymidi.add_track(midinotes)

# Output the .mid file
#mymidi.save_midi()

 数値データを音の高さに変更する関数を定義して(この時数値データの最高値と最小値を入れる必要がある。クラスとか指定すればここで数値データいれなくてよいのかも??)

def mag_to_pitch_tuned(magnitude):
    # Where does this data point sit in the domain of your data? (I.E. the min magnitude is 3, the max in 5.6). In this case the optional 'True' means the scale is reversed, so the highest value will return the lowest percentage.
    scale_pct = mymidi.linear_scale_pct(1, 6, magnitude)

    # Another option: Linear scale, reverse order
    # scale_pct = mymidi.linear_scale_pct(3, 5.7, magnitude, True)

    # Another option: Logarithmic scale, reverse order
    # scale_pct = mymidi.log_scale_pct(3, 5.7, magnitude, True)

    # Pick a range of notes. This allows you to play in a key.
    c_major = ['C', 'D', 'E', 'F', 'G', 'A', 'B']

    #Find the note that matches your data point
    note = mymidi.scale_to_note(scale_pct, c_major)

    #Translate that note to a MIDI pitch
    midi_pitch = mymidi.note_to_midi_pitch(note)

    return midi_pitch

あとはラベルの最初からよんでデータを音にかえ、それを順番にリストにする

note_list = []

for i in range(len(mag)):
    note_list.append([
        i +1,
        mag_to_pitch_tuned(mag[i]+1),
        100,  # velocity
        1  # duration, in beats
    ])

セーブして終わり!

# Add a track with those notes
mymidi.add_track(note_list)

# Output the .mid file
mymidi.save_midi()

こんな風に簡単にデータの可聴化ができる!

このMIDIファイルをPCに備え付けのソフトでMP3に変えTunesToTubeでyoutubeにアップ

出来上がった音楽がこんな形である

ちょっと長いので短いバージョンも

なんとも物悲しい曲が出来上がった。

これは拍数や繰り返しなどの効果をもう少し工夫して、歌などを重ねたり、効果音を重ねたりすると、メディアアートになるのかもしれない!(アートの素養がある人がいれば一緒にやってみたい笑)

なんて思ったりした(ちなみに家族には「なんでもやればいいってもんじゃないのよ」と不評でした)。

あと個人的に面白いと思うのが正常と異常(がん)を音で表現したもの。

このサンプルはほとんどががん細胞なので、踏切の警報器のように高い音が続き、なんだかアラームを聞いているような不安な気持ちになる。

こんな正常と異常を音で知らせる技術は、アートだけでなく、テクノロジーやビジネスとしても有用かもしれない

たとえば画像の機械学習特に予測と可聴化を胃カメラなどの医療機器と組み合わせて、今胃カメラの視野の先にがんと考えられる組織が多いか少ないかを音で術者に教える技術なんて面白い!

データの可聴化とサイエンス

それで少しこのデータの可聴化についてしたべてみた!

「百聞は一見にしかず」というように,人間は視覚に多くを依存している生物だが,実は聴覚には情報処理の点で視覚に勝る優れた特徴がある。目で識別できる光の点滅は毎秒50回から60回くらいまでだが,耳はわずか数ミリ秒間に生じた音の変化を検出できる。つまり時間分解能が高いのだ。これを科学データの解析に生かす試みが進んでいる。数値やグラフのデータを音に変換する「データ可聴化」という手法で,例えば1年分の時系列観測データを数時間の音声ファイルに圧縮して聴くことにより,目では決してとらえられないパターンを耳で検出できる。すでに天文データの解析やがん細胞の識別などに利用が始まっている

なんてはなしもある。

とくにがんについては、

がん細胞と通常の細胞の音の違いを聞き分けてみよう

といったテーマで

少し似たようなことがこころみられてはいるようだ(上のサイトに音源がリンクしてあるので、これまた違ったがんの音楽が聞けて面白いですよ)。

またPython Data Sonification for Science and Discovery

っていうセミナーの動画もYoutubeにあがっていて興味深い。

とはいうものの、データの可聴化は、可視化に比べて、やっている人がまだまだ少なく、論文もpubmed探しても59と少ないのも事実だ。

メディアアート、医療テクノロジー、サイエンスを絡め、機械学習とデータの可聴化をビジネス的に展開する試みって、意外とブルーオーシャン?ニッチで面白いのかな?

いずれにせよpythonがあると手持ちのデータを手軽に音楽にすることができるので、興味のある方はぜひ試してみてください。ひょっとすると意外な発見があるかも??




この記事が気に入ったらサポートをしてみませんか?