Python 数学、統計、機械学習:基本統計量、ヒストグラム
1.準備
Python環境に、以下のパッケージをインストール。
pip install {パッケージ}
パッケージ | 内容 |
numpy | 数値計算を効率的に行うための拡張モジュール |
matplotlib | グラフを描画するときなどに使われる標準的なライブラリ |
scikit-learn | オープンソース機械学習ライブラリ |
pandas | データ解析を支援する機能を提供するライブラリ |
scipy | 科学技術計算ルーチンの中核となるパッケージ |
2.サンプルソース
2.1 対象データ
scikit-learn パッケージをimportすると、Boston データセット というボストン市の住宅価格のデータを利用できる。人工知能プログラミングのための数学がわかる本 から、各カラム説明を引用。
カラム |
ボストンデータセット内容 |
CRIM | 人口一人当たりの犯罪発生回数 |
ZN | 25,000平方フィート以上の住居区画の占める割合 |
INDUS | 小売業以外の商業が占める面積の割合 |
CHAS | チャールズ川によるダミー変数 |
NOX | NOxの濃度 |
RM | 住居の平均部屋数 |
AGE | 1940年より前に建てられた物件の割合 |
DIS | 5つのボストン市の雇用施設からの距離 |
RAD | 環状高速道路へのアクセスのしやすさ(1-24の間隔尺度) |
TAX | $10,000あたりの不動産税率の総計($) |
PTRATIO | 教師1人が持つ生徒の数 |
B | 1,000×(黒人比率(%)-0.63) ^2の式で計算される指数 |
LSTAT | 給与の低い職業に従事する人口の割合 |
MEDV | 住宅価格の中央値 |
2.2 ソースコード
scikit-learn の Boston データセットをロード、指定したカラムの基本統計量と、ヒストグラムを表示させる。
from sklearn import datasets import pandas as pd import matplotlib.pyplot as plt import math title_dict = {'CRIM': 'per capita crime rate by town' ,'ZN': 'proportion of residential land zoned for lots over 25,000 sq.ft.' ,'INDUS': 'proportion of non-retail business acres per town' ,'CHAS': 'Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)' ,'NOX': 'nitric oxides concentration (parts per 10 million)' ,'RM': 'average number of rooms per dwelling' ,'AGE': 'proportion of owner-occupied units built prior to 1940' ,'DIS': 'weighted distances to five Boston employment centres' ,'RAD': 'index of accessibility to radial highways' ,'TAX': 'full-value property-tax rate per $10,000' ,'PTRATIO': 'pupil-teacher ratio by town' ,'B': '1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town' ,'LSTAT': '% lower status of the population' ,'MEDV': 'Median value of owner-occupied homes in $1000\'s'} def basic_statistics(feature_index): """ 基本統計量とヒストグラム :param feature_index:feature_index:['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT'] :return: """ boston = datasets.load_boston() df = pd.DataFrame(boston.data) df.columns = boston.feature_names x = df[feature_index] print(x.describe()) from pprint import pprint print(pprint(dir(x))) desc = """ count={0} mean={1:f} median={2:f} std={3:f} min={4:f} 25%={5:f} 50%={6:f} 75%={7:f} max={8:f} """.format( x.count(), x.mean(), x.median(), x.std(), x.min(), x.quantile(.25), x.quantile(.5), x.quantile(.75), x.max()) # ヒストグラムの柱の数をデータ数の平方根とする plt.hist(x, bins=int(round(math.sqrt(x.count()),0)), rwidth=0.8, label=desc) plt.title(title_dict[feature_index]) plt.legend() plt.show() if __name__ == "__main__": basic_statistics('RM')
2.3 出力されたヒストグラム
3.確認
3.1 基本統計量
http://www.trunktools.jp/services/analysis/basis.html
上記、x.describe() にて基本統うよb計量を一括で出力。個別に取得する場合には、メソッドを呼ぶ。
項目 | 意味 | 個別に取得 |
count | 標本数 | count() |
mean | 平均 | mean() |
std | 標準偏差 | std() |
min | 最小値 | min() |
25% | 第1四分位 | quantile(.25) |
50% | 中央値(第2四分位) | quantile(.5) |
75% | 第3四分位 | quantile(.75) |
max | 最大値(第4四分位) | max() |
四分位
3.2 ヒストグラムの出力
bins ヒストグラムの棒の数について、EXCELビジネス統計分析
絶対こうしなければいけないという決め事はありません。一般的に実務の世界では、データの個数の平方根を使って区間の数を決めます。専門的にはスタージェスの公式などがありますが、ここではより簡単で便利な方法を使っています。
に従う。ヒストグラムの範囲の決め方
matplotlib.pyplot.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, hold=None, data=None, **kwargs)
x (必須) | ヒストグラムを作成するための生データの配列。 |
bins | ビン (表示する棒) の数。階級数。(デフォルト値: 10) |
range | ビンの最小値と最大値を指定。(デフォルト値: (x.min(), x.max())) |
normed | True に設定すると正規化 (合計値が 1 になるように変換) を実施。 (デフォルト値: False) |
cumulative | True に設定すると、累積ヒストグラムを出力。 (デフォルト値: False) |
bottom | 各棒の下側の余白を数値または配列で指定。 |
histtype | ‘bar’ (通常のヒストグラム), ‘barstacked’ (積み上げヒストグラム), ‘step’ (線), ‘stepfilled ‘ (塗りつぶしありの線) から選択。 (デフォルト値: ‘bar’) |
align | 各棒の中心を X 軸目盛上のどの横位置で出力するか。 ‘left’, ‘mid’, ‘right’ から選択。(デフォルト値: ‘mid’) |
orientation | 棒の方向。’horizontal’ (水平方向), ‘vertical’ (垂直方向) から選択。(デフォルト値: ‘vertical’) |
rwidth | 各棒の幅を数値または、配列で指定。 |
log | True に設定すると、縦軸を対数目盛で表示します。 |
color | ヒストグラムの色。配列で指定し、データセット単位で色を指定することができます。 |
label | 凡例を載せる際に使用します。 |
stacked | True に設定すると積み上げヒストグラムで出力します。False に設定すると、横に並べて出力します。 |