Pythonでヒストグラムを作成してグラフと表を並べて出力【統計解析】

ヒストグラムの作成練習をする目的

科学研究において、実験結果の妥当性を示すためには数字で示すことが最も説得力があります。しかし、数字を使う上で避けて通れないのが統計になります。

統計解析というとなかなか難しくとっつきにくいのですが、そんなことも言っていられません。
統計解析をしっかり勉強するかつ解析方法を身につけるという欲張りな考え方で、Pythonを使ってどちらも達成していこうということで、まずはデータの特徴を可視化して理解するためのヒストグラムについて学習したことについてアウトプットします。

ちなみにこれまでに、
データ解析補助ツールの作成など研究に使えるようなツールを作成達成するなどで、研究にpythonを取り入れることによって研究効率がだいぶ良くなってきました。
統計解析も快適になることを期待して学習していきます。

参考図書

今回の学習のために下記の図書を参考にしました。

Pythonで理解する統計解析の基礎、技術評論社

谷合廣紀 著、辻 真吾 監修

環境

OS:Mac
使用環境:Python3.7、VS Code
使用ライブラリ:pandas、matplotlib

実際に書いたコード

実際に書いたコードは下記の通りとなります。


import matplotlib
matplotlib.use('Qt4Agg')

import matplotlib as mpl
font = {"family":"IPAexGothic"}
mpl.rc('font',**font)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

pd.set_option('precision', 3)
df = pd.read_csv('使用するデータのパス')

scores = np.array(df['ヒストグラムを作りたいデータ'])

freq, _ = np.histogram(scores, bins=10, range=(0, 100))

#階級値を決める
freq_class = [f'{i}~{i+10}' for i in range(0, 100, 10)]
#階級値
class_value = [(i+(i+10))//2 for i in range(0, 100, 10)]
#相対度数
rel_freq = freq / freq.sum() 
#累積相対度数
cum_rel_freq = np.cumsum(rel_freq)
#DetaFrameを作る
freq_dict_df = pd.DataFrame({'度数':freq})
#階級値、相対度数、累積相対度数を度数分布表に付け加える
freq_dict_df['階級'] = freq_class 
freq_dict_df['階級値'] = class_value
freq_dict_df['相対度数'] = rel_freq
freq_dict_df['累積相対度数'] = cum_rel_freq
freq_dict_df = freq_dict_df[['階級', '階級値', '度数', '相対度数', '累積相対度数']]

#ヒストグラムの書き方

fig = plt.figure(figsize=(10, 6))

fig.subplots_adjust(wspace=0.3)

ax1 = fig.add_subplot(121)
ax2 = ax1.twinx() #ax2をax1のグラフと重ねて表示する

weights = np.ones_like(english_scores) / len(english_scores)
freq, _, _ = ax1.hist(english_scores, bins=10, range=(0, 100), weights=weights)
ax2.plot(class_value, cum_rel_freq, marker='o', color='black' )

ax1.set_xlabel('点数')
ax1.set_ylabel('度数')
ax2.set_ylabel('累積相対度数')
ax1.set_xticks(np.linspace(0, 100, 10+1))


ax3 = fig.add_subplot(122)
ax3.axis('off')
ax3.axis('tight')
ax3.table(cellText=freq_dict_df.values, colLabels=freq_dict_df.columns, loc='center')

plt.show()

データは下記のようなものを使用しました。

’ヒストグラムを作りたいデータ’ のところには ’点数’ と入力します。

出力結果

出力した結果は下図のような感じで、グラフと表が並んで表示することができます。

グラフだけ欲しいという時は、

ax1 = fig.add_subplot(121)

ax1 = fig.add_subplot(111)

に変更し、
ax3の部分を無効化するとグラフのみを出力することができます。

表だけ欲しい時は

ax3 = fig.add_subplot(122)

ax3 = fig.add_subplot(111)

に変更し、
ax1とax2の部分を無効化すると表のみを出力することができます。

まとめ

上記のように目的である、データの初歩的な可視化方法である、ヒストグラムの作成をPythonで達成することができました。
追加機能として、グラフと表を同時にみたいという欲望を叶えるため、matplotlibで両方を同時に出力する方法も取り入れてみました。
なかなか上手くできなかったので、達成できて嬉しいですね。

引き続きpythonを用いて統計解析の学習を進めていきます。

余談として、
今回の方法で妥協した部分はDataFrameの作成段階になります。
本当は階級をインデックスにしていたのですが、それだと表を出力する際に階級を表に盛り込むことができなかったため、今回のような形になっています。
DataFrameについてまだ理解が追いついていないため、この方法がどのような影響を与えるかわからないので、これからもっと勉強して理解していきます。

コメント

タイトルとURLをコピーしました