投資のためのデータサイエンス

個人の投資活動に役立つデータ分析にまつわる話題を綴ります。

Pythonによる分散分析のデモ

ある変量の変動の要因を分析する場合には、母集団のサブグループ別に分布や平均値を比較して、グループ間で差があるかどうかをみる、ということはよく行われます。これをより系統的に行う手法が分散分析です。分散分析は、原理的にはダミー変数を用いた回帰分析と同じですが、例えば「性別」や「年齢階級」といった要因単位で指標値に有意に影響を及ぼしているかを見るような場合に便利です。ここでは都道府県別の各種指標値を例題として、「(地理的に隣接した)地方」や「大都市があるか」といった要因で異なるかどうかを見ることにします。
まず、必要なライブラリをインポートします。

# ライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font=['IPAexGothic'])
import japanize_matplotlib # matplotlib日本語
from google.colab import files # 画像ファイルダウンロード用

ここでは、日本の47都道府県をクロスセクションデータとして用いることにします。まず、エクセルファイルからPandasデータフレームに都道府県の属性データを読込みます。

# ファイルからデータを読み込む
df01 = pd.read_excel('/content/drive/My Drive/Colab Notebooks/データ解析講座一日目演習.xlsx',sheet_name='都道府県')
df01.head()

f:id:nicjps230:20210902182435p:plain
上記のデータ列のうち、「都市化」は政令指定都市がある道府県から北海道を除いて東京都と香川県(四国経済の拠点が多く存在)を加えたものを「都市県」、その他を「郊外県」としました。また、「メディア」は以下の記事にあるメディア接触の特徴に関する分類です。 https://news.livedoor.com/article/detail/9064551/
同様に、公的ウェブサイトに掲載されている、47都道府県の家計指標データを読込みます。

# ファイルからデータを読み込む
df02 = pd.read_excel('/content/drive/My Drive/Colab Notebooks/データ解析講座一日目演習.xlsx',sheet_name='家計指標')
df02.head()

f:id:nicjps230:20210902182854p:plain
そして、読み込んだ2つのデータフレームを、県名をキーとして横に連結します。

# 県名をキーにして横連結する
df1 = pd.merge(df01, df02, left_on='県名', right_on='県名')
df1.drop(columns=['コード_x','コード_y'],inplace=True)

一元配置分散分析
ここでは都道府県の食料費割合の変動に及ぼす「地域」等の属性要因の影響をみるために、一元配置分散分析を実行します。statsmodelsライブラリを用います。

# 一元配置分散分析
import statsmodels.formula.api as smf
import statsmodels.api as sm
oneway_anova = smf.ols(formula='食料費割合~地域+都市化+メディア',data=df1).fit()
sm.stats.anova_lm(oneway_anova,typ=2).round(2)

これにより、以下のように各要因についてのF検定統計量が出力されます。
f:id:nicjps230:20210902183641p:plain
尚、交互作用項を加える場合はモデル式に"地域*都市化"のように*でつないだ項を追加します。
有意な主効果の様子を見る
ここではseabornライブラリのcatplot()を用いて、各水準毎の指標値の平均を棒グラフで比較します。

# 有意差のある効果についてその中身をみる
import matplotlib.pyplot as plt
import seaborn as sns
p = sns.catplot(x='食料費割合',y='都市化',data=df1,kind='bar',height=4,aspect=2)
p.set(title='食料費割合の都市化による差')

以下のような形で平均の違いを比較することができます。
f:id:nicjps230:20210902184340p:plain
交互作用の様子を見る
交互作用(ある要因による指標への影響が、他の要因の水準によって異なるかどうか)の様子を見るためには、statsmodelsライブラリのinteraction_plotを用います。

from statsmodels.graphics.factorplots import interaction_plot
fig=interaction_plot(df1.地域,df1.都市化,df1.食料費割合,colors=['red','blue'],ms=10)
plt.title('地域別食料費割合と都市化')
plt.legend(bbox_to_anchor=(1.05,1.0),loc='upper left')

これにより交互作用の様子がひと目でわかるようになります。近畿地方において、都市部と郊外部で食料費割合の差が大きいことがわかります。
f:id:nicjps230:20210902184835p:plain