python × 統計学の2回目です
前回は、基本的な代表値である平均値・中央値・最頻値を学び、取得プログラムを作り、csvモジュールで作成しました
今回は、ほかの平均値と中央値を学習していきます
はじめに
前回記事で説明した通り、異常値の存在で、1つの代表値では都合の悪いことが多いです。
今回はその他の平均値と中央値を学びます。
まずは中央値からです
中央値
n分位範囲
nには任意の整数が入ります。入門でよく使われる数字は4,8,10,16だと思います。
n分位範囲は簡単に言うと、小さい順(または大きい順)に並べた数字をn等分した、それぞれの中央値です。
例えば、1~99の整数値が並んでいる場合で、4分位範囲であれば、25が第1分位点、50が中央値(第2分位点)、75が第3分位点と呼び、区切ることができます。
四分位範囲をプログラミングする
上記で説明した通り、四分位範囲はデータの配列に対して、25%地点、50%地点、75%地点で分けることができます
前回作成した「representativeValue.py」に追記しましょう。
def interquartile_range(datas):
四分位範囲は前回の中央値関数で第2分位点を取得できそうです。
そして、中央値を基準に中央値より小さい数をLower range、大きい数をHigher Rangeとして分割し、それぞれレンジに再び中央値関数を使えば簡単にできそうです。
def interquartile_range(datas):
datas.sort() #昇順に並べ替え
datas_len = len(datas) #データ数
dev_number = datas_len / 2 #データ数の半分(データの中央)
median_value = median(datas) #median関数を呼び出し、中央値を格納
if datas_len % 2 == 0: #データ数を2で割ったときの余りが0の場合(※つまり偶数)
lower_datas = datas[:int(dev_number)] #[開始番号:終了番号-1]の構文 真ん中より下のリスト
higher_datas = datas[int(dev_number):] # 真ん中より上のリスト
else:
lower_datas = datas[:int(math.floor(dev_number))]
higher_datas = datas[int(dev_number)+1:]
firstQuartile = median(lower_datas)
thirdQuartile = median(higher_datas)
return '第1四分位点: ' + str(firstQuartile) + ' 第2四分位点: ' + str(median_value) + ' 第3四分位点: ' + str(thirdQuartile)
値を入れて、正しく動作するか見てみましょう。
データを視覚的に確認するために関数の中にprint関数を差し込んで確認します。
def interquartile_range(datas):
datas.sort() #昇順に並べ替え
datas_len = len(datas) #データ数
dev_number = datas_len / 2 #データ数の半分(データの中央)
median_value = median(datas) #median関数を呼び出し、中央値を格納
if datas_len % 2 == 0: #データ数を2で割ったときの余りが0の場合(※つまり偶数)
lower_datas = datas[:int(dev_number)] #[開始番号:終了番号-1]の構文 真ん中より下のリスト
higher_datas = datas[int(dev_number):] # 真ん中より上のリスト
else:
lower_datas = datas[:int(math.floor(dev_number))]
higher_datas = datas[int(dev_number)+1:]
firstQuartile = median(lower_datas)
thirdQuartile = median(higher_datas)
print(dev_number)
print(int(dev_number))
print(datas)
print(lower_datas)
print(higher_datas)
return '第1四分位点: ' + str(firstQuartile) + ' 第2四分位点: ' + str(median_value) + ' 第3四分位点: ' + str(thirdQuartile)
datas1 = [1,2,3,2,5,2,3,4,1]
datas2 = [1,2,3,2,5,3,1,3,2,2]
print(interquartile_range(datas1))
print(interquartile_range(datas2))
正しく実行できているでしょうか。次回は簡単な4分位点以外の扱いと、中央値関数と四分位範囲関数で重複している記述があるので整理します
平均値
相乗平均(幾何平均)
総和を個数で割る平均値(相加平均)と異なり、相乗平均の場合は、それぞれの値をある母数に掛け、個数乗根する方法です。
例えば元本1万円に1年目の金利2%、2年目の金利5%などの場合の1年あたりの平均増加率を求めるときなどに使用します
def geometrical_mean(datas):
datas.sort() #昇順に並べ替え
datas_len = len(datas) #データ数
Infinite_product = 1
for data in datas:
Infinite_product = data * Infinite_product
geometrical_mean_value = pow(Infinite_product,1/datas_len ) #n乗するデフォルト関数 n乗根=1/n乗
return '総乗値:' + str(Infinite_product) + ' ' + '相乗平均値:' + str(geometrical_mean_value)
datas1 = [1,2,3,4,5,6,7,8,9]
print(geometrical_mean(datas1))
調和平均
平均の中でもあまり馴染みがないのが調和平均です。
調和平均は速さの平均でよく使われます。以下のような問題です
Q.現在地点Aにいます。1km離れたB地点まで往復します。
往路は時速40km、復路30kmで行き来した場合、平均時速は何kmでしょう?
このような問題の場合、パッと思いつくのは35kmだと思いますが、実は違います。
行きは時速40kmなので、帰りよりかかった時間が短いからです。
小学校のころ習ったように、「距離(D)=速さ(S)×時間(T)」ですので
合計時間=行きの時間(1km/40km)+帰りの時間(1km/30km)
合計距離=行きの距離(1km)+帰りの距離 (1km)
ゆえに、は(速さ)じ(時間)き(距離)の公式に照らすと
距離(2Km)=速さ(S)×合計時間(7km/120km)
速さ(S)=2*120/7=34.28km/1時間となります
往復の平均を一般化すると、
調和平均=合計距離(D)÷合計時間=2÷(1/行きの速さ+ 1/帰りの速さ)
となります。往復(2区間)だけでなくn区間の場合は
調和平均=n÷(1/1区間目の速さ+1/2区間目の速さ+…+1/n区間目の速さ)
プログラムを書くと
def harmonic_mean(datas): #それぞれの区間距離は1kmとする
datas_len = len(datas) #データ数かつ距離(km)
total_time = 0
for data in datas:
total_time = total_time + (1 / data)
harmonic_mean_value = datas_len / total_time
return '総時間:' + str(total_time) + ' ' + '調和平均値:' + str(harmonic_mean_value)
datas1 = [30,40] #1区間目時速30km 2区間目時速40km
print(harmonic_mean(datas1))
datas2 = [30,40,60] #1区間目時速30km 2区間目時速40km 3区間目時速60km
print(harmonic_mean(datas2))
このような感じにしました。
以上で、python×統計学2回目を終了します。
次回は他の基本値と実際にグラフを使った統計を行います。
コメント
[…] 前回、前々回と代表値を進めたので、今回のプログラミングは簡単です […]