Python × 『初等統計学 : ポール G.ホーエル, 浅井 晃, 村上 正康』


『初等統計学 : ポール G.ホーエル, 浅井 晃, 村上 正康』

という本で統計学を勉強中です。
この本、GW中に実家の自分の部屋を漁っていたら発見しました。

大学の時に「統計学基礎」の講義を受けた時に、買わされた買った本ですね。

当時は本当に何にもかんがえていなくて、とにかく単位を取るために受講したような記憶があります。

数学も苦手で、Σ記号が出てきただけでゲンナリしてしまって、確か結局単位も取れず、教科書代だけが飛んでいく(当時も貧乏学生だった私には手痛い出費でした。)だけに終わってしまいました。

それが今になって勉強し始めるとは、当時の自分は何をやっていたんだと、後悔の嵐ですが、とにかくこれで地道に統計学の基礎を身につけていこうと思っています。

ただ読んでいるだけでは面白くないので、本の各章最後に出てくる例題や問題を、同時並行で勉強中のPythonでやってしまおう、と思って、今日はその第一弾をやりました。

尚、環境はipython notebookです。

第2章 標本データの記述 6. 例題 例 1.

この章の例題、例1は、100人の労働者の週あたり労働時間数を分析していく問題

d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15
x 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53
f 2 1 2 1 6 7 11 12 12 17 19 9 0 0 1

xが労働時間のデータで、fが度数です。

#例1 100人の労働者の週あたりの労働時間を示すデータがある。
#(a)ヒストグラムを描け。
#(b)平均を求めよ。
#(c)標準偏差を求めよ。
#(d)(平均-標準偏差, 平均+標準偏差)、(平均-2標準偏差, 平均+2標準偏差)に含まれる
#測定値の割合(%)を求めよ。(*面倒臭いので飛ばします。)
#(e)ヒストグラムより中央値を求めよ。
#(f)ヒストグラムより第1四分位数、第3四分位数、および四分位範囲を求めよ。

(d)については、ちょっと面倒臭いので飛ばします。

#必要なモジュールを読み込む。ここではpandas、numpy、matplotlib、seabornなど
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

また、上述のテーブルをcsvで作業フォルダに追加。

これで準備 OK.

それではいざ問題を解いていきましょう。

(a)ヒストグラムを描け。
#度数分布表をcsvで読み込む。ここでindex_col=0としないと、1列目がindexとして読まれない。
fd = pd.read_csv("fd.csv", index_col=0)
#pandasで扱いやすい(個人的にですが)ようにtranspose()します。
fd = fd.transpose()
#xとfを掛け合わせたデータ列を追加
fd["xf"] = fd["x"]*fd["f"]
#(a)の答え
sns.barplot(fd.x, fd.f) #x軸に労働時間を、y軸に度数をプロット

これで、得られたグラフが下記です。

f:id:musicophilia:20160514212244p:plain

綺麗なグラフですね〜。会社でExcelを使うんですが、いっつもグラフのデザインがダサすぎてうんざりしてます。手直しするのも時間がかかって面倒だし。。。 seabornのグラフはセンスが良くて気持ちいです。

会社でもPython使いたいけど、フリーソフト禁止されてる悲しす。

まぁそれは置いておいて。どんどんいきましょう。

(b),(c),(e),(f)
#(b)の答え
mn = fd["xf"].sum()/fd["f"].sum()
print("(b)の答 : 労働者の1週間の平均労働時間は{0:.2f}時間です。".format(mn))
#{0:.2f}は、小数点3位を丸めて少数点2位まで表示するための表記。

(b)の答 : 労働者の1週間の平均労働時間は34.07時間です。

#(c)の答え
fd["dev"] = (fd["x"]-mn)**2
dis = (fd["dev"]*fd["f"]).sum()/(fd["f"].sum()-1)
std = np.sqrt(dis)
print("(c)の答 : 労働者の1週間の労働時間の標準偏差は{0:.2f}時間です。".format(std))

(c)の答 : 労働者の1週間の労働時間の標準偏差は7.92時間です。

#(e),(f)の答え
lsxf = [list(fd["x"]), list(fd["f"])]
lsxf = [[int(lsxf[0][i])]*int(lsxf[1][i]) for i in range(len(lsxf[0]))]
lsxf = pd.DataFrame([I for i in lsxf for I in i], columns=["x"]) #(*1)
second_qtr = lsxf["x"].quantile(0.5)
first_qtr = lsxf["x"].quantile(0.25)
third_qtr = lsxf["x"].quantile(0.75)
print("(e)の答 : 労働者の1週間の労働時間の中央値は{}です。".format(second_qtr))
print("(f)の答 : 労働者の1週間の労働時間の第1四分位数は{0:.2f}です。また第3四分位数は{1:.2f}です。".format(first_qtr, third_qtr))

#(*1)
#下記の表記でもいいのだが、あまりスマートではない感じがする。
#lsxf_=[]
#for i in lsxf : 
#   for I in i :
#        lsxf_.append(I)
#lsxf = lsxf_

(e)の答 : 労働者の1週間の労働時間の中央値は35.0です。
(f)の答 : 労働者の1週間の労働時間の第1四分位数は29.00です。また第3四分位数は41.00です。

この本とPythonを掛け合わせて、早くデータサイエンス超初級者を抜け出したいと思っています。