SE1年目の初心者プログラマーが統計WEBの問題をPythonで解いてみる。


はじめに

こんにちは。自分は現在SE1年目でJavaを業務で扱っています。

データ系の業務へのキャリアチェンジのために統計検定2級を取得しようと考えたのですが、
統計検定2級の勉強+pythonの勉強ができれば一石二鳥だと思い、統計WEBの練習問題をpythonを使って解くことにしました。

同じように統計学pythonも初心者だという方の参考になれば幸いです。
また、書いてるコードがおかしかったり、もっと良い書き方や慣習等があれば経験者の方のご意見をお聞きしたいです。

目次

  1. 具体的な学習方法
  2. 練習問題の解答
  3. 参考文献

具体的な学習方法

統計WEB:統計学の時間(https://bellcurve.jp/statistics/course/
の練習問題をPythonで解いていきます。
学習のためにあえてライブラリを使わずに解いたり、NumPy等を使ってみたり色々な方法で問題を解いていきたいです。
他にもこういう書き方がある、等ありましたらご指摘いただければ幸いです。

※学習が進み次第随時更新していきます。

練習問題の解答

Pythonで解けそうだと感じた問題のみ扱うので、順番は飛び飛びになりますがご了承ください。

3. さまざまな代表値

問題本文「引用元:練習問題(3. さまざまな代表値)」
https://bellcurve.jp/statistics/course/146.html

3-2

次の表はあるクラス50人の100点満点の国語のテストの結果をまとめたものである。この結果からクラスの平均点、中央値、モードを求めよ。
3-2

回答例

回答
import statistics as stat
scores = [64, 56, 51, 77, 45, 73, 64, 44, 69, 66, 63, 53, 83, 72, 58, 68, 66, 74, 62, 60, 44, 48, 47, 78, 54, 59, 48, 57, 58, 71, 61, 51, 41, 64, 57, 42, 54, 45, 61, 52, 57, 54, 60, 52, 54, 70, 73, 72, 61, 73]

mean = sum(scores) / len(scores)
# mean = stat.mean(scores)

scores.sort()
off = len(scores) // 2
median = (scores[off] + scores[-(off + 1)]) / 2
# median = stat.median(scores)

mode = stat.mode(scores)

print(f'''\
平均:{mean}
中央値:{median}
最頻値:{mode}''')
実行結果
平均59.72
中央値59.5
最頻値54

3-3

次の表は、2011年から2015年までの日本の年間GDPの前年比である。 このデータを用いて、5年間のGDPの平均成長率を求めよ。
3-3

回答例

回答
import math
GDP_list = [0.987, 1.000, 1.017, 1.015, 1.022]
sum = 1
for GDP in GDP_list:
    sum *= GDP
mean = math.pow(sum, 1/5)

print(f'平均:{mean}')
実行結果
平均1.008117163331727

3-4

ある100kmの道を、はじめの20kmは時速50kmで、次の50kmは時速40kmで、最後の30kmは時速60kmで走った。この時の平均時速を求めよ。

回答例

回答
mean = 100  / (20 / 50 + 50 / 40 + 30 / 60)
print(f'平均時速:{mean}')
実行結果
平均時速46.5116279069767

3-5

午前と午後でそれぞれ3000匹ずつのひよこを鑑定するノルマを課された 、一人のひよこ鑑定士について考える。ある日、午前中には1時間当たり1200匹のペースで鑑定し、午後は1時間当たり800匹のペースで鑑定した。

このひよこ鑑定士は、1日で平均すると一時間に何匹のペースでひよこを鑑定したことになるか。

回答例

回答
mean = 2 // (1 / 1200 + 1 / 800)
print(f'調和平均:{mean}')
実行結果
調和平均960.0

4. 箱ひげ図と幹葉表示

問題本文「引用元:練習問題(4. 箱ひげ図と幹葉表示)」
https://bellcurve.jp/statistics/course/5592.html

4-2

次のデータから、四分位範囲(IQR)を求めよ。
「56, 48, 78, 81, 86, 71, 72, 88, 46, 47, 89, 58, 43, 79, 48, 41」

回答例

回答
data_list = [56, 48, 78, 81, 86, 71, 72, 88, 46, 47, 89, 58, 43, 79, 48, 41]
data_list.sort()
def median_calc(target):
    off = len(target) // 2
    median = target[off] + target[-(off + 1)]
    return median / 2
low_group = data_list[: len(data_list) // 2]
high_group = data_list[-(-len(data_list) // 2 ) :]
first_iq = median_calc(low_group)
third_iq = median_calc(high_group)
IQR = third_iq - first_iq
print(f'IQR:{IQR}')
実行結果
IQR32.5

参考文献