4 データの可視化

𠮷田政之

近畿大学経営学部

2026/04/30

1 必要なパッケージを読み込む

可視化には seaborn と matplotlib を使う。また、グラフに日本語を表示するために japanize-matplotlib が必要(Colabでは毎回インストールが必要)。

!pip install japanize-matplotlib
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
import scipy

2 データを準備する

前回と同じ手順で財務データと業界データを読み込み・結合し、ROAを計算する。

df = pd.read_csv("drive/MyDrive/自分で作ったフォルダの名前/findata.csv", encoding="cp932")
df_ind = pd.read_csv("drive/MyDrive/自分で作ったフォルダの名前/inddata.csv", encoding="cp932")
df2 = pd.merge(df, df_ind, on=["銘柄コード", "会社名"])
df2["営業利益"] = df2["売上高"] - df2["売上原価"] - df2["販管費"]
df2["roa"] = df2["営業利益"] / df2["総資産"]

3 散布図

2つの変数の関係を視覚的に確認するための第一歩。統計的な分析に進む前に、まずグラフで全体像をつかむことが重要。

sns.scatterplot(data=df2, x="売上原価", y="販管費")

4 回帰直線付き散布図

散布図に回帰直線を重ねると、相関の強さと方向を直感的に把握できる。lmplot が自動で直線を描いてくれる。

大きな数字が指数表示(例:2e+05)になってしまう場合は ticklabel_format で通常の数字表示に切り替える。

g = sns.lmplot(data=df2, x="売上高", y="販管費")
for ax in g.axes.flat:
    ax.ticklabel_format(style='plain', axis='x')
plt.xticks(rotation=45)
(array([-200000.,       0.,  200000.,  400000.,  600000.,  800000.,
        1000000., 1200000., 1400000., 1600000., 1800000.]),
 [Text(-200000.0, 0, '−200000'),
  Text(0.0, 0, '0'),
  Text(200000.0, 0, '200000'),
  Text(400000.0, 0, '400000'),
  Text(600000.0, 0, '600000'),
  Text(800000.0, 0, '800000'),
  Text(1000000.0, 0, '1000000'),
  Text(1200000.0, 0, '1200000'),
  Text(1400000.0, 0, '1400000'),
  Text(1600000.0, 0, '1600000'),
  Text(1800000.0, 0, '1800000')])

4.1 業界別の回帰直線

hue でグループを色分けすることで、業界ごとのパターンの違いが見えてくる。全体でひとつの直線を引くだけでは見落としていた業界間の差を確認できる。

sns.lmplot(data=df2, x="売上原価", y="販管費", hue="業界", ci=None)

5 ヒストグラム

変数の分布の形状(正規分布か、右寄り・左寄りの偏りがあるかなど)を確認する。multiple="dodge" でグループを横に並べて比較しやすくする。

sns.histplot(data=df2, x="売上原価", hue="業界", multiple="dodge")

6 バイオリンプロット

箱ひげ図と密度分布を組み合わせたグラフ。グループ間の分布の違い(中央値・ばらつき・形状)を一度に比較できる。

sns.violinplot(data=df2, x="業界", y="販管費")

7 折れ線グラフ

変数の連続的な変化やトレンドを表すのに適している。huestyle を組み合わせると、グループを色と線の種類の両方で区別できる。

sns.lineplot(data=df2, x="売上高", y="販管費", hue="業界", style="業界")

8 t検定

2グループの平均値の差が「偶然のばらつき」で説明できるのか、それとも真の差があるのかを統計的に検証する方法。ここではドラッグストアと家電量販店のROAに有意な差があるかを確かめる。

drug_df = df2.loc[df2["業界"] == "ドラッグストア"]
elec_df = df2.loc[df2["業界"] == "家電"]
scipy.stats.ttest_ind(drug_df["roa"], elec_df["roa"])
TtestResult(statistic=np.float64(3.784858741407354), pvalue=np.float64(0.001623789557196223), df=np.float64(16.0))

出力の pvalue が 0.05 より小さければ、2グループの平均値に統計的に有意な差があると解釈する。

9 相関の検定

2つの変数の間に線形の関係があるかを検定する。相関係数(-11)だけでなく、その相関がゼロかどうかの p 値も同時に得られる。

scipy.stats.pearsonr(df2["売上高"], df2["販管費"])
PearsonRResult(statistic=np.float64(0.9804563625540141), pvalue=np.float64(1.0066280409031412e-12))