5 データの可視化

Author
Affiliation

𠮷田政之

近畿大学経営学部

Published

2026/04/30

Modified

2026/05/27

1 準備

1.1 必要なパッケージ

可視化には seaborn と matplotlib を使う。

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

Code
!pip install japanize-matplotlib

パッケージの読み込み (japanize_matplotlibを読み込むときは、さっきと-_が違うので注意)

Code
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
import scipy

1.2 データを準備する

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

Code
df_fin = pd.read_csv(
    "drive/MyDrive/自分で作ったフォルダの名前/findata.csv",
    encoding="cp932"
)
df_ind = pd.read_csv(
    "drive/MyDrive/自分で作ったフォルダの名前/inddata.csv",
    encoding="cp932"
)
Code
# 2つのデータを結合する
df_fin_ind = pd.merge(df_fin, df_ind, on=["銘柄コード", "会社名"])
df_fin_ind["営業利益"] = df_fin_ind["売上高"] - df_fin_ind["売上原価"] - df_fin_ind["販管費"]
df_fin_ind["roa"] = df_fin_ind["営業利益"] / df_fin_ind["総資産"]

2 データの可視化

2.1 散布図

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

  • パラメータ:
    • data: どのデータを使うか
    • x: x軸にする列名
    • y: y軸にする列名
Code
sns.scatterplot(
    data=df_fin_ind,
    x="売上原価",
    y="販管費"
)

2.2 回帰直線付き散布図

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

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

軸を回転させたほうが見やすいこともある。

Code
g = sns.lmplot(
    data=df_fin_ind,
    x="売上高",
    y="販管費"
)

for ax in g.axes.flat:
    ax.ticklabel_format(style="plain", axis="x")

plt.xticks(rotation=45)
1
e表記 (指数表記を止める)
2
x軸の文字を回転させる
(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')])


2.2.1 業界別の回帰直線

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

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

2.3 ヒストグラム

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

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

2.4 バイオリンプロット

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

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

2.5 折れ線グラフ

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

  • 色の見分けが不自由な人は多い
  • そうでなくても出力環境によっては色の区別がつかない
  • 形を変えれば白黒印刷でもわかる

今回のサンプルデータには時間に関する列がないので別の列で代替する

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

2.6 折れ線グラフ + 散布図

折れ線グラフだけだとデータの場所が分かりづらいので点もうつ sns.lineplotsns.scatterplot同じセルに書いて実行するだけ

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

sns.scatterplot(
    data=df_fin_ind,
    x="売上高",
    y="販管費",
    hue="業界",
    style="業界",
    s=50
)

3 t検定

3.1 t検定

可視化とは関係ありません

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

Code
drug_df = df_fin_ind.loc[df_fin_ind["業界"] == "ドラッグストア"]
elec_df = df_fin_ind.loc[df_fin_ind["業界"] == "家電"]

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グループの平均値に統計的に有意な差があると解釈する。

3.2 相関の検定

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

Code
(
    scipy
    .stats
    .pearsonr(
        df_fin_ind["売上高"],
        df_fin_ind["販管費"]
    )
    .correlation
)
np.float64(0.9804563625540141)