前回のPython Tutorial:PandasシリーズとPandasデータフレームの続きをこのサイトを参照してやる。今回はデータをプロットして視覚化する方法を学習する。
Loading and writing data¶
Read csv into a dataframe with
pd.ead_csv()
pd.ead_csv()を使ってCSVファイルのデータをデータフレームに取り込む
pd.ead_csv() can load a local .csv file or the one from the specified URL.
pd.ead_csv()は、ローカルドライブに保存された物以外に、指定URLのCSVファイルも取り込める。
# jupyter magics
%matplotlib inline
%config IPCompleter.greedy=True
# multiple output
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
csv_df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/fmri.csv')
csv_df.head()
csv_df.columns
csv_df_subset10 = csv_df[:10]
Write dataframe into .csv, .txt, .pickle or .xls
データフレームを、.csv, .txt, .pickle、もしくは、.xlsに書き込む
csv_df_subset10.to_csv('./temp_fmri_subset10.csv')
# csv_df_subset10.to_csv('./temp_fmri_subset10.txt')
# csv_df_subset10.to_excel('./temp_fmri_subset10.xls')
# csv_df_subset10.to_pickle('./temp_fmri_subset10')
csv_df.dtypes
Display the columns in the data:
データの列を表示
csv_df.columns
Find unique values in [‘subject’], [‘event’] and [‘region’]:
[‘subject’],[‘event’],[‘region’]の固有の値を探し出す。
csv_df['subject'].unique()
csv_df['event'].unique()
csv_df['region'].unique()
Access data based on conditions in other columns:
各条件に基づいて他の列のデータにアクセスする。
csv_df['event'][csv_df['subject']=='s1'][::5] # subsample output every 5
Categorical values can easily ba mapped to dummy variables using .map().
カテゴリー値は、.map()を用いて簡単にダミー変数にマッピングできる。
You can also use .apply() and a custom-made function to define a transformation to apply to a column of a dataframe
データフレームの列に適用するための変換を定義するために、.apply()や自前の関数を使うことできる。
csv_df['event'] = csv_df['event'].map({'cue': 0, 'stim': 1})
csv_df['event'][::75] # subsample output every 75
Subselect data and sort
データをサブセレクトしてソートする
1
2
3
4
5
6 Below we want to select all fmri signal data from subject == s1 during event == 1 (stim) in region == frontal.
以下で、event == 1 (stim)の間、region == frontalのsubject == s1から全fMRI信号データを選択したい。
We will ouput the signal values together with the corresponding timepoint values.
対応するtimepoint値と共に、信号値を出力する。
Finally we will sort the data by the timepoint value.
最後に、timepoint値でデータをソートする。
csv_df[['timepoint', 'signal']][(csv_df['subject']=='s1') & (csv_df['event']==1) & (csv_df['region']=='frontal')].sort_values(by='timepoint')
This output can be saved as a np.array and be processed further on separately:
この出力は、np.arrayとして保存でき、今後個別に処理することができる。
data0 = csv_df[['timepoint', 'signal']][(csv_df['subject']=='s1') & (csv_df['event']==1) & (csv_df['region']=='frontal')].sort_values(by='timepoint').values[:, 1]
Basic descriptive statistics about the dataframe can ba accessed by calling df.describe(). Only valid for numerical dtype columns
df.describe()を呼び出すことで、データフレームに関する基本的な記述統計にアクセスできるが、これは、数値dtype列に対してのみ有効である。
csv_df.describe()
Basic operations can be run on column data as well as the entire dataframe:
基礎演算は、全データフレーム同様、列データに対し実行することが可能だ。
csv_df.sum()
csv_df['signal'].mean()
csv_df['signal'].sum()
csv_df[['signal']][(csv_df['timepoint']==10) & (csv_df['event']==1) & (csv_df['region']=='frontal')].corr()
Basic visualization¶
Histofram of data can be plotted using .hist():
.hist()を使えば、データのヒストグラムをプロットすることができる。
csv_df['signal'].hist();
Categorical data can be easily plotted using .value_counts() (it counts unique values). Below is a histogram over the subjects
(固有値を数える).value_counts()を使って、カテゴリー値を簡単に描画できる。以下は、サブジェクトに対するヒストグラムだ。
csv_df['subject'].value_counts().plot(kind='bar');
csv_df[['signal']][(csv_df['timepoint']==10) & (csv_df['event']==1) & (csv_df['region']=='frontal')].plot();
csv_df[['signal']][(csv_df['timepoint']==9) & (csv_df['event']==1) & (csv_df['region']=='frontal')].plot();
Exercise (練習問題)¶
[‘subject’] == s1に属する全データを検出する。
csv_df[['timepoint','signal','event','region']][csv_df['subject']=='s1'].sort_values(by='timepoint')[::10]
[‘region’]をダミー変数に変換する。
csv_df['region'] = csv_df['region'].map({'parietal': 0, 'frontal': 1})
csv_df['region'][::75]
頭頂部刺激の間、18のtimepointsに対する全被験者の平均信号値をプロットする。タイムポイント別の全被験者の信号平均値は以下のようになる。
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize']=12,8
plt.rcParams["font.size"] = "17"
mean_signal=[]
timepoint=[]
for i in range(0,19):
timepoint.append(i)
a = csv_df[['signal']][(csv_df['timepoint']==i) & (csv_df['event']==1) & (csv_df['region']==1)].mean()
mean_signal.append(a)
_ = plt.xlabel('timepoint', fontsize=18, color='Blue')
_ = plt.ylabel('mean signal', fontsize=18, color='Blue')
_ = plt.xlim(0,18)
_ = plt.xticks(list(range(0,19)),[str(i) for i in range(0,19)])
_ = plt.grid(which='major',color='gray',linestyle='-')
_ = plt.plot(timepoint,mean_signal)
plt.show()
被験者別全タイムポイントの信号の平均値は以下のようになる。
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize']=12,8
plt.rcParams["font.size"] = "17"
from natsort import natsorted, ns
sub = natsorted(csv_df['subject'].unique(), key=lambda y: y.lower())
mean_signal=[]
subject=[]
for i in sub:
subject.append(i)
a = csv_df[['signal']][(csv_df['subject']==i) & (csv_df['event']==1) & (csv_df['region']==1)].mean()
mean_signal.append(a)
_ = plt.xlabel('subject', fontsize=18, color='Blue')
_ = plt.ylabel('mean signal', fontsize=18, color='Blue')
_ = plt.plot(subject,mean_signal)
_ = plt.xticks(sub,[str(i) for i in sub])
_ = plt.xlim(sub[0],sub[-1])
_ = plt.grid(which='major',color='gray',linestyle='-')
plt.show()
タイムポイント18の被験者別の信号平均値は以下のようになる。
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize']=12,8
plt.rcParams["font.size"] = "17"
from natsort import natsorted, ns
sub = natsorted(csv_df['subject'].unique(), key=lambda y: y.lower())
mean_signal=[]
subject=[]
for i in sub:
subject.append(i)
a = csv_df[['signal']][(csv_df['subject']==i) & (csv_df['event']==1) & (csv_df['region']==1) & (csv_df['timepoint']==18)].mean()
mean_signal.append(a)
_ = plt.xlabel('subject', fontsize=18, color='Blue')
_ = plt.ylabel('mean signal', fontsize=18, color='Blue')
_ = plt.plot(subject,mean_signal)
_ = plt.xticks(sub,[str(i) for i in sub])
_ = plt.xlim(sub[0],sub[-1])
_ = plt.grid(which='major',color='gray',linestyle='-')
plt.show()
前頭部における刺激vsキューの、全タイムポイントに対する被験者の信号の平均値と標準偏差を検出する。刺激に対する被験者別の信号平均値と標準偏差は以下のようになる。
import numpy as np
mean_signal=[]
std_signal=[]
subject=[]
for i in sub:
subject.append(i)
a = csv_df[['signal']][(csv_df['subject']==i) & (csv_df['event']==1) & (csv_df['region']==1)].mean()[-1]
b = csv_df[['signal']][(csv_df['subject']==i) & (csv_df['event']==1) & (csv_df['region']==1)].std()[-1]
mean_signal.append(a)
std_signal.append(b)
df1 = pd.DataFrame(np.reshape(mean_signal,(1, 14)),index=["mean"], columns=sub)
df2 = pd.DataFrame(np.reshape(std_signal,(1, 14)),index=["std"], columns=sub)
df1.append(df2)
キューに対する被験者別の信号平均値と標準偏差は以下のようになる。
mean_signal=[]
std_signal=[]
subject=[]
for i in sub:
subject.append(i)
a = csv_df[['signal']][(csv_df['subject']==i) & (csv_df['event']==0) & (csv_df['region']==1)].mean()[-1]
b = csv_df[['signal']][(csv_df['subject']==i) & (csv_df['event']==0) & (csv_df['region']==1)].std()[-1]
mean_signal.append(a)
std_signal.append(b)
df1 = pd.DataFrame(np.reshape(mean_signal,(1, 14)),index=["mean"], columns=sub)
df2 = pd.DataFrame(np.reshape(std_signal,(1, 14)),index=["std"], columns=sub)
df1.append(df2)
刺激vsキューは以下のようになる。
a=csv_df[['signal']][(csv_df['event']==0) & (csv_df['region']==1)].mean()[-1]
b=csv_df[['signal']][(csv_df['event']==0) & (csv_df['region']==1)].std()[-1]
c=csv_df[['signal']][(csv_df['event']==1) & (csv_df['region']==1)].mean()[-1]
d=csv_df[['signal']][(csv_df['event']==1) & (csv_df['region']==1)].std()[-1]
e = {'cue': [a, b], 'stim': [c, d]}
pd.DataFrame(data=e,index=["mean","std"])
被験者5に対する頭頂部と前頭部における刺激の全タイムポイントにおける信号の平均値を棒グラフ化する。頭頂部の信号の平均値は以下のようになる。
mean_signal=[]
timepoint=[]
for i in range(0,19):
timepoint.append(i)
a = csv_df[['signal']][(csv_df['subject']=='s5') & (csv_df['timepoint']==i) & (csv_df['event']==1) & (csv_df['region']==0)].mean()[-1]
mean_signal.append(a)
_ = plt.xlabel('timepoint', fontsize=18, color='Blue')
_ = plt.ylabel('mean signal', fontsize=18, color='Blue')
_ = plt.xlim(0,18)
_ = plt.xticks(list(range(0,19)),[str(i) for i in range(0,19)])
_ = plt.bar(timepoint,mean_signal)
plt.show()
前頭部の信号の平均値は以下のようになる。
mean_signal=[]
timepoint=[]
for i in range(0,19):
timepoint.append(i)
a = csv_df[['signal']][(csv_df['subject']=='s5') & (csv_df['timepoint']==i) & (csv_df['event']==1) & (csv_df['region']==1)].mean()[-1]
mean_signal.append(a)
_ = plt.xlabel('timepoint', fontsize=18, color='Blue')
_ = plt.ylabel('mean signal', fontsize=18, color='Blue')
_ = plt.xlim(0,18)
_ = plt.xticks(list(range(0,19)),[str(i) for i in range(0,19)])
_ = plt.bar(timepoint,mean_signal)
plt.show()
頭頂部と前頭部の信号の平均値は以下のようになる。
mean_signal=[]
timepoint=[]
for i in range(0,19):
timepoint.append(i)
a = csv_df[['signal']][(csv_df['subject']=='s5') & (csv_df['timepoint']==i) & (csv_df['event']==1)].mean()[-1]
mean_signal.append(a)
_ = plt.xlabel('timepoint', fontsize=18, color='Blue')
_ = plt.ylabel('mean signal', fontsize=18, color='Blue')
_ = plt.xlim(0,18)
_ = plt.xticks(list(range(0,19)),[str(i) for i in range(0,19)])
_ = plt.bar(timepoint,mean_signal)
plt.show()
頭頂部と前頭部の信号の平均値は以下の通り。
a=csv_df[['signal']][(csv_df['event']==1) & (csv_df['region']==0)].mean()[-1]
b=csv_df[['signal']][(csv_df['event']==1) & (csv_df['region']==1)].mean()[-1]
x = np.arange(2)
mean_signal=[a,b]
_ = plt.xlabel('region', fontsize=18, color='Blue')
_ = plt.ylabel('mean signal', fontsize=18, color='Blue')
_ = plt.bar(x, mean_signal)
_ = plt.xticks(x, ('parietal','frontal'))
plt.show()