Python Notes
Python関連で残しておきたいことをメモしています。
自分のように本格的なプログラマーではないけど同じような目的(心理学実験・解析等)でPythonを学習している方のご参考になれば。。。
解説や資料等ではなく,主にWebリンクや自分の感想などをただただ貼り付けています。
ご意見やご感想,アドバイス等ございましたら最下部のコメント欄にぜひご記入ください。
[このWebページ上での公開資料のリンクは最下部に]
開発環境
Rodeo
Jupyter (ipython)
開発元ページ[https://jupyter.org/]
[memo]
・anacondaを入れておいた方がスムーズ。すでにPythonをいれている,または他のバージョンのPythonも使いたい場合などは「Preference」または「Settings」から"Python command"に使用したいPythonのディレクトリを指定。
とりあえずお決まりコード ※あくまで個人用
*** よく使うモジュールのインポート (先頭はjupyter notebookで図を表示されるおまじない) ***
%matplotlib inline
import numpy as np
import pandas as pd
import scipy.stats as st
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.formula.api as smf
import statsmodels.api as sm
*** ディレクトリを取得して任意のデータファイルを読み込み(****にフォルダやファイル名) ***
import os
cur_dir = os.getcwd()
main_dir = os.path.split(cur_dir)[0]
[memo]
・インストールは pip install "ipython[notebook]" でもいいが,anacondaを入れれば最初から入っているのでそっちが便利かも。
・notebook内にそのまま図を出力した時は“%matplotlib inline”と書いておく必要がある。
・「Jupyter Notebook の Tips をまとめてみた」リンク
Anaconda
dat_file = os.sep.join([main_dir, 'data','******', '*****.csv'])
dat = pd.read_csv(dat_file)
開発元ページ[https://www.continuum.io/why-anaconda]
データ解析
*** 入出力まわり(上記と一部重複,日本語表記部は変更箇所) ***
csv関連
import pandas as pd
[データフレーム].to_csv('ファイルパス.csv')
pd.read_csv('ファイルパス.csv')
matlabファイル関連
from scipy import io
io.loadmat('ファイルパス.mat', squeeze_me=True)
io.savemat('ファイルパス.mat', {'変数名':データ})
#MATファイルの構造体メンバーを取り出したいとき(例:data.matの構造体Aにa,b,cがある場合)-----
matd = io.loadmat('ファイルパス.mat', squeeze_me=True)
a = matd['A']['a']
aからさらに内容をとりだしたいときはa.item()
pandas使ってデータフレームにするときは,a = pd.DataFrame(matd['A']['a'].item())でできる
※io.loadmatでsqueeze_me=Trueを指定しない場合:
matd = io.loadmat('ファイルパス.mat')
A = matd['A']
a = A[0,0]['a'] ※aの内容は上のa.item()と同じ
pyplotの関連
plt.savefig('ファイルパス.png')
plt.close()
Pickle関連
import pickle
with open('ファイルパス.pkl', 'wb') as web:
pickle.dump(データ, web)
pickle.load(open('ファイルパス.pkl', 'rb'))
*** pandasの関数で基本情報をサクッと ***
dat.head()
dat.describe()
dat.corr()
*** 意外と使うpandasのデータフレーム変換 ***
# dat(pandasのデータフレーム)を1列に変換:violinplotなどを書いたり,縦断データとして整理したいときに使う
# datの例
ID SEX V1 V2
0 F 10 6
1 M 5 8
2 F 3 9
(http://www.statsmodels.org/stable/index.html)
Rユーザーにとってはかなり使用感が似ていて使いやすいツール。
出力も見やすく基本的な解析であればこれが良いと思われる。GLMM等も特に別のものを必要とせず実施できる。
→New comment
Updateも随時行われており,基本的(よく見かけるような)な解析方法だけでなく最近流行りの解析やマニアックな方法など多くの解析がこれだけでできるようになってきた。
〔メモ〕
・Rっぽいモデル記述が良ければstatsmodels.apiではなく,statsmodels.formula.apiを使用する。
・Rと違いバイアス項が自動で入らないので,statsmodels.add_constant()関数を使って説明変数にバイアス項を追加する
Rとの連携
Web meetingで一緒に勉強させていただいている山根嵩史さん(HPはコチラ)が公開されている内容です。
Pythonを使った実験課題ソフトのひとつであるPsychopyにRを入れて実験課題と解析の一元化できる方法。
http://tyamane1969.net/?p=136
Rとの比較についてはコチラが分かりやすいです。
〔その他Blogで公開されている情報〕
https://gist.github.com/mia-0032/6378324
http://imaimamu.com/archives/1574
fMRIデータ解析
1.SPM/FSLとの連携
脳画像解析をするためのソフトウェアであるSPMやFSLをPythonから使いたい。。。と思って入手したnipypeというパッケージ。
mdat = pd.melt(dat, id_vars=['ID', 'SEX']) #id_varsは1列に取り込まない列ラベル
>>
ID SEX variable value
0 F V1 10
0 F V2 6
1 M V1 5
1 M V2 8
2 F V1 3
2 F V2 9
# 列ラベルを割り振り
mdat.columns = ['ID', 'SEX', 'times', 'score']
>>
ID SEX times score
0 F V1 10
0 F V2 6
1 M V1 5
1 M V2 8
2 F V1 3
2 F V2 9
開発元ページ[http://nipype.readthedocs.io/en/latest/#]
[memo]
・Windowsにインストールする際にはC++のコンパイラを忘れずに。
http://landinghub.visualstudio.com/visual-cpp-build-tools
・Github上にあるnipypeのspmインターフェイスを扱うスクリプト: https://github.com/nipy/nipype/tree/cf2d09314b9c388ed6bd38b271cc2b8c77e69b10/nipype/interfaces/spm
2.画像データ処理・scikit-learnとの連携
Nilearnは,fMRI画像を行列形式で読み込み,結合の計算やクラスタリング,機械学習(scikit-laarnが必要)など,数値的な計算処理がとてもやりやすいパッケージ。グラフィカルデザインもいくつかあり色々な方法で画像を表示したり,解析結果などを使って新しい画像に変換しなおしたりすることが簡単にできる。numpy配列でデータを読み込むので,scikit-learn等の他のPythonパッケージにそのまま持ち込んで適用することもできるのがかなり魅力的。
※ページ下部「Nilearnを使ったfMRIデータ処理…」参照
*** データの次元が多いときなど表示する列数を指定 (今回は50列まで) ***
pd.set_option('display.max_columns', 50)
*** figureのサイズ ***
plt.rcParams['figure.figsize'] = 8,6
*** Statsmodels.apiを使用した回帰 ***
Y = df['Y']
X = df['X']
X0 = sm.add_constant(X)
st_model = sm.OLS(Y, X0)
results = st_model.fit()
print(results.summary2())
*** warningを表示させない ***
import warnings
warnings.filterwarnings("ignore")
開発元ページ[http://nilearn.github.io/index.html]
[memo]
・画像ファイル(.nii)は4D形式に変換してから読み込む方が相性が良いようです。
・二人以上の被験者の場合は[masker].transform([filenames])だけではえらーになるので,データ格納用のリストを作っておき,for文で一人ずつappendしていく([ ]は任意の変数)
例:
#4D形式にしたniiデータを被験者分入れたフォルダを指定してファイル名を取得
import nilearn, os, glob
path = './data/*.nii'
fmri_filenames = []
fmri_filenames = glob.glob(path)
#niiファイルから任意のROIごとにデータを抽出するためのインスタンスを作成
from nilearn.input_data import NiftiLabelsMasker
atlas_filename = './ROI_Atlas.nii'
masker = NiftiLabelsMasker(labels_img=atlas_filename, standardize=True)
#被験者のファイルを1名ずつ順に読み込んでリストに追加
fmri_masked_data =[]
for fn in fmri_filenames:
data = masker.fit_transform(fn) #timepoints x regions
fmri_masked_data.append(data) #subj x [timepoints x regions]
汎用ライブラリ関係
[Webで公開されている色んなライブラリの関数cheat sheets]
Original page:
https://www.continuum.io/blog/developer-blog/learning-python-data-science-cheat-sheets
** Numpy **
** Pandas **
** Scikit-Learn **
** Matplotlib **
** Seaborn(https://seaborn.pydata.org/) **
上のcheat sheetにもあげたmatplotlibをベースにしたライブラリ。
きれいな図が結構簡単に描けるので重宝している。
pandasなどで作成したデータセットをそのまま使えるのもうれしい。
[関連リンク]
簡単に美しいグラフ描画ができるPythonライブラリSeaborn入門
pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る
その他
【Pythonを使うなら知っておくべき!便利なライブラリ13選】
http://programming-study.com/technology/python-library/
ベイズ統計関連
PyStan(https://pystan.readthedocs.io/en/latest/)
StanのPythonインターフェース
Rstanとの違いはコチラ
[関連リンク]
Python(PyStan)で「StanとRでベイズ統計モデリング」の5.1節を実行する
PyMC(https://pymc-devs.github.io/pymc/index.html)
ベイズ統計用のPythonライブラリ
最近(2017.04)下記の日本語本が出たので比較的扱いやすい
『Pythonで体験するベイズ推論 PyMCによるMCMC入門』(出版社リンク)
[関連リンク]
アプリ開発
1.wxPython
色々ある中でもwxPythonは素人的には分かりやすく比較的楽にデスクトップGUIアプリを作成できる。
Windows/Mac/Unixで可能で,C++ライブラリのwxWidgetsのラッパとして機能。
チュートリアルやwikiも充実している。
※ページ下部「アプリ開発をしたくてwxPythonを使ってみた(チュートリアル編)」参照
開発元ページ[https://www.wxpython.org/]
2.Pyinstaller
アプリ開発のためというよりはpythonで作成した様々なスクリプトをexeファイルにコンパイルするツールです。exeファイルにしておくと,pythonや必要なパッケージが入っていないPCでもそれを動かすことができるようにんなります。
【自分の発表資料】
*Pythonで実験課題を作ろう!~Psychopy(超入門編) @Python勉強会
*PCA,線形判別,カーネル化PCAによるデータの次元削減 @機械学習勉強会
*Nilearnを使ったfMRIデータ処理 ーscikit-learnとの連携による機械学習までー @機械学習勉強会
*アプリ開発をしたくてwxPythonを使ってみた(チュートリアル編) @Python勉強会