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軸に度数をプロット
これで、得られたグラフが下記です。
綺麗なグラフですね〜。会社で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を掛け合わせて、早くデータサイエンス超初級者を抜け出したいと思っています。