「入門はじめての統計解析」をPythonで写経 Vol.1 ~ 1章「はじめての平均・分散・標準偏差」①度数分布表、ヒストグラム、平均、分散、標準偏差
1章「はじめての平均・分散・標準偏差」
書籍の著者 石村貞夫 先生
この記事は、書籍「入門はじめての統計解析」1章「はじめての平均・分散・標準偏差」の Python写経活動 を取り扱います。
書籍の図・表・計算を淡々とPython化する写経シリーズです。
前編では度数分布表、ヒストグラム、平均、分散、標準偏差などを実践します。
では書籍を開いて統計解析の旅に出発です🚀

はじめに
このブログシリーズは、書籍「入門はじめての統計解析」(東京図書、「テキスト」と呼びます)の Python 写経を通じて得た「統計解析の楽しさ」をご紹介します。
書籍の紹介と引用表記はリンク先の記事に掲載しています。

1章 はじめての平均・分散・標準偏差
この記事は1章の以下のSectionを取り扱います。
1.1 度数分布表とヒストグラム
1.2 平均・分散・標準偏差
記事に用いるデータは、テキストに掲載されたデータそのものを引用しています。
データ件数の少ないものはコード上でデータを登録し、データ件数の多いものはCSVファイル化してデータを読み込みしています。
1章で用いるライブラリをインポートします。
### インポート
# 数値計算
import collections # python標準ライブラリ
import numpy as np
import pandas as pd
# 統計
import scipy.stats as stats
import pingouin as pg
# 描画
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = 'Meiryo'
Section 1.1 度数分布表とヒストグラム
テキスト p.7 表1.1.2の大学生60人のアンケート調査に相当するデータを読み込みます。
### データの読み込み 女子大生60人のアンケート調査 p.7 表1.1.2
data1 = pd.read_csv('./data/ch01/data.csv')
print('data1.shape: ', data1.shape)
data1.head()【実行結果】

要約統計量を確認します。
### 要約統計量の表示
data1.describe().round(3)【実行結果】


■ 度数分布表の目的 p.8
アンケートデータを基にして身長 cm ごとの人数(度数)をカウントします。
表1.1.3「データを大きさの順に並び替えると…」に相当します。
numpy の unique() で身長(idx)と人数(count)を取得し、身長ごとに人数を整理した pandas データフレームを作成します。
### データを大きさの順に並べ替えると... p.8 表1.1.3
# 身長のユニーク要素をカウント
idx, count = np.unique(data1['身長'], return_counts=True)
# データフレームの準備
sort_df = pd.DataFrame({'人数': 0}, index=range(idx.min(), idx.max()+1))
sort_df.index.name = '身長'
# 身長のユニーク要素のカウントをデータフレームに格納
sort_df.loc[idx, '人数'] = count
# 結果の表示
sort_df【実行結果】

表1.1.4「5cmずつ区切ってみると…」の度数分布表を作成します。
身長を 140cm から 170cm まで 5cm 刻みにして、人数をカウントします。
5cm 刻みのビン(bins)を作っておき、numpy の histogram() で人数(hist)をカウントしています。
### 5cmずつ区切ってみると... p.9 表1.1.4
# 階級幅の設定 5cm区切り
bins = np.arange(140, 171, 5)
# 度数の算出
hist, _ = np.histogram(data1['身長'], bins)
# 度数分布表の原型の表示
pd.DataFrame({'以上': bins[:-1], '未満': bins[1:], '人数': hist,})【実行結果】


■ 例題:度数分布表の作り方 p.11
p.11の度数分布表作成手順をPythonで追いかけます。
手順1:データの最小値と最大値
pandas の min()、max() を利用します。
### データの最小値と最大値(手順1) p.11
print('最小値= ', data1['身長'].min(), ' 最大値 =', data1['身長'].max())【実行結果】

手順3:階級を分ける
numpy の arange で 140 cm から 170 cm までを6つの階級に分けます。
### 170-140=30をn=6の階級に分ける(手順3) p.11
np.arange(140, 171, 30/6)【実行結果】

手順4(たぶん):各階級のデータの数を数え上げて度数分布表を完成させます。
numpy の histgram() でデータの数を数え上げ、pandas のデータフレームにまとめます。
表1.1.6「度数分布表」(p.11)が出来上がります。
### 度数分布表 p.11 表1.1.6
# 階級幅の設定
bins = np.arange(140, 171, 5)
# 度数の算出
hist, _ = np.histogram(data1['身長'], bins)
# 度数分布表の作成
frequency_table = pd.DataFrame({
'以上': bins[:-1],
'未満': bins[1:],
'階級値': (bins[1:] + bins[:-1]) / 2,
'度数': hist,
'相対度数': hist / hist.sum(),
'累積度数': hist.cumsum(),
'累積相対度数': (hist / hist.sum()).cumsum()
})
# 結果の表示
frequency_table.round(3)【実行結果】


■ ヒストグラム p.12
アンケートデータを基にして図1.1.1「身長のヒストグラム」を描画します。
pandas の plot() を利用します。
### ヒストグラム p.12 図1.1.1
data1['身長'].plot.hist(bins=np.arange(140, 171, 5), edgecolor='white',
alpha=0.7, xlabel='身長 [cm]', ylabel='度数');【実行結果】


■ 理解度チェック 度数分布表とヒストグラム p.14~
度数分布作成の手順1~4をPythonコード化します。
手順1:最大値と最小値
### 手順1 最大値と最小値
print('最大値 =', data1['体重'].max(), ' 最小値 =', data1['体重'].min())【実行結果】

手順2:範囲
### 手順2 範囲
print('範囲 =', data1['体重'].max() - data1['体重'].min())【実行結果】

手順3:度数分布表の作成 表1.1.8「度数分布表」
### 手順3 度数分布表
# 階級幅の設定
bins = np.arange(40, 71, 5)
# 度数の算出
hist, _ = np.histogram(data1['体重'], bins)
# 度数分布表の作成
frequency_table = pd.DataFrame({
'以上': bins[:-1],
'未満': bins[1:],
'階級値': (bins[1:] + bins[:-1]) / 2,
'度数': hist,
'相対度数': hist / hist.sum(),
'累積度数': hist.cumsum(),
'累積相対度数': (hist / hist.sum()).cumsum()
})
# 結果の表示
frequency_table.round(3)【実行結果】

手順4:ヒストグラムの描画 図1.1.7「体重のヒストグラム」
### 手順4 ヒストグラム
sns.histplot(data=data1, x='体重', kde=True, bins=np.arange(40, 71, 5),
ec='white')
plt.xlabel('体重 [kg]')
plt.ylabel('度数');【実行結果】

「体重の3乗根のヒストグラムは正規分布に近づくとわれているでござる!」をやってみます。
アンケートデータの体重列に対して 「**(1/3)」 とすることで3乗根を算出できます。
data1['体重']**(1/3)
### (参考)ヒストグラム 体重の3乗根
sns.histplot(x=data1['体重']**(1/3), kde=True, bins=np.arange(3.4, 4.1, 0.1),
ec='white')
plt.xlabel('体重の3乗根')
plt.ylabel('度数');【実行結果】
いかがでしょう。。。


Section 1.2 平均・分散・標準偏差
Section 1.1 で利用したデータの「身長」部分を読み込みます。
p.16 の表1.2.2の大学生 60 人の身長データです。
### データの読み込み 女子大生60人の身長 p.16 表1.2.2
data2 = pd.read_csv('./data/ch01/data.csv', usecols=[0, 1], index_col=[0])
print('data2.shape: ', data2.shape)
data2.head()【実行結果】

p.16 表1.2.1「いろいろな基礎統計量」を計算してみます。
### いろいろな基礎統計量 p.16 表1.2.1
# 平均値の95%信頼区間の算出
int_low, int_high = stats.t.interval(confidence=0.95, df=len(data2) - 1,
loc=data2.mean(), scale=data2.sem())
# データフレーム化
pd.DataFrame(
[
data2.mean().values, # 平均
int_low, # 95%信頼区間の下端
int_high, # 95%信頼区間の上端
stats.trim_mean(data2, 0.05), # 5%トリム平均
data2.median().values, # 中央値
data2.var(ddof=1).values, # 分散
data2.std(ddof=1).values, # 標準偏差
data2.min().values, # 最小値
data2.max().values, # 最大値
(data2.max() - data2.min()).values, # 範囲
(data2.quantile(0.75) - data2.quantile(0.25)).values, # 四分位範囲
data2.skew().values, # 歪度
data2.kurtosis().values, # 尖度
],
index=['平均値', '2.5%', '97.5%', '5%トリム平均', '中央値', '分散', '標準偏差',
'最小値', '最大値', '範囲', '四分位範囲', '歪度', '尖度'],
columns=data2.columns
).round(2)【実行結果】
大半は pandas データフレームに対するメソッド data2….() で対応できました。
平均値の95%信頼区間 2.5%、97.5%、および、5%トリム平均は scipy.stats を利用しました。
テキストのSPSSの結果と若干異なる部分があり、気になってます。。。


■ 平均値 - データの位置を示す統計量 p.18
テキストの「A型のデータ」に示された平均値の数式を用いて、平均値算出関数を【Python標準縛り】で作成します。
最終行で関数を使った平均値計算を実行します。
### 平均値の定義と公式 A型 p.18
# A型のデータ用の平均値算出関数:引数はlist
def calc_mean(list):
N = len(list)
return sum(list) / N
calc_mean([1, 2, 3, 4, 5])【実行結果】


■ 平均値の欠点 p.19
平均値が外れ値の影響を受けやすいことの例題です。
numpy の mean() で平均値を算出します。
### 平均値の欠点 外れ値の影響を強く受ける p.19
data3 = [158, 154, 162, 160, 956]
x_var = np.mean(data3)
print(x_var)【実行結果】
data3 の最後の要素「956」に影響されて平均値が大きくなっています。

うさぎさんの「両端の値を切り取ると・・・」の平均値を算出します。
データを小さい順に並べて、最小値と最大値を取り除いた残りのデータで平均値を取ります。
Python標準の sorted() で昇順ソートして、[1:-1] のスライス操作で両端を除き、numpy の mean() で平均値を算出します。
### 両端の値を切り取ると p.19
np.mean(sorted(data3)[1:-1]) # 昇順で並び替えて両端を除いて平均値算出【実行結果】
[158, 160, 162] の平均値 160 が算出されました。


■ 中央値 p.20
「中央値の定義」掲載の数式を用いて、中央値算出関数を【Python標準縛り】で作成します。
最終行で関数を使った中央値計算を実行します。
### 中央値の定義 p.20
def calc_median(list):
# 設定
N = len(list) # 要素の個数
im = N // 2 # 2m+1や2mのm: 2で割った商
list = sorted(list) # listを昇順ソート
# 中央値の算出
if N % 2 == 1: # 要素が奇数個の場合
return list[im]
else: # 要素が偶数個の場合
return (list[im-1] + list[im]) / 2
calc_median([4, 2, 3, 3])【実行結果】

p.20 例1)データ数Nが奇数の場合を試します。
こちらは自作関数で。
### 例1 データ数Nが奇数の場合 p.20
calc_median([158, 154, 162])【実行結果】

こちらは numpy の median() で。
### 例1 データ数Nが奇数の場合 numpy利用 p.20
np.median([158, 154, 162])【実行結果】

続いて、例2)データ数Nが偶数の場合を試します。
こちらは自作関数で。
### 例2 データ数Nが偶数の場合 p.20
calc_median([158, 154, 162, 160])【実行結果】

こちらは numpy の median() で。
### 例2 データ数Nが偶数の場合 numpy利用 p.20
np.median([158, 154, 162, 160])【実行結果】


■ 最頻値 p.21
表1.2.5「最頻値はどれ?」のデータを登録します。
### 例1 最頻値はどれ? p.21 表1.2.5
data4 = pd.DataFrame({
'身長': np.arange(144, 170),
'人数': [1, 0, 0, 0, 1, 1, 1, 1, 2, 7, 2, 4, 7,
3, 2, 8, 1, 2, 6, 3, 2, 3, 1, 0, 0, 2]
})
print('data4.shape: ', data4.shape)
data4【実行結果】

例1)の最頻値を探してみます。
既に人数(度数)がカウントされているので、人数(度数)が最大値となる行を取得します。
pandas の idmax() で最大値のインデックスを取得して、該当行を表示します。
### 例1 人数が最大となる身長を抽出 ['人数']idxmax()で人数最大値のインデックスを取得
data4.iloc[data4['人数'].idxmax()]【実行結果】
身長 159 cm が最頻値(人数 8)です。


■ 分散・標準偏差 -データのバラツキを示す統計量 p.23
テキストのグループA、グループBのデータを登録します。
あわせて、各グループの標本平均を numpy の mean() で算出します。
### データの作成と平均値の算出 p.23
# データの作成
data_group_a = [30, 40, 50, 60 ,70]
data_group_b = [50, 50, 50, 50, 50]
# 平均値の算出
print('x_bar_a =', np.mean(data_group_a))
print('x_bar_b =', np.mean(data_group_b))【実行結果】
両グループの平均は 50 で同じです。

p.23 図1.2.7「平均値は同じでも…」の図をヒストグラムの形式で表現してみます。
### ヒストグラムで比較 p.23
# 設定
groups = ['A', 'B'] # グラフタイトルに表示するアルファベット
# 描画領域の設定
fig, axes = plt.subplots(1, 2, figsize=(8, 3), sharey=True, tight_layout=True)
# グループごとにヒストグラム描画を繰り返し処理
for list, group, ax in zip([data_group_a, data_group_b], groups, axes.flat):
# ヒストグラムの描画
ax.hist(list, bins=np.arange(30, 81, 10) - 5, ec='white', alpha=0.7)
# 修飾
ax.set_xlabel('点数', fontsize=12)
ax.set_title(f'グループ{group}の成績')
# 修飾
axes[0].set_ylabel('人数', fontsize=12);【実行結果】
グループAのバラツキが大きいことが一目瞭然です!
平均値が同じデータであっても、データの分布・広がりが同じになるわけではありません。

p.24 の分散の定義と公式における「A型のデータ」に示された不偏分散の「定義式」と「公式」を用いて、分散算出関数を【Python標準縛り】で作成します。
最終行で関数を使った分散計算を実行します。
### 分散の定義と公式 p.24
# A型のデータの定義式による不偏分散算出関数
def calc_variance1(list, ddof=1):
N = len(list)
x_bar = sum(list) / N
return sum([(x_i - x_bar)**2 for x_i in list]) / (N - ddof)
# A型のデータの公式による不偏分散算出関数
def calc_variance2(list):
N = len(list)
x_bar = sum(list) / N
return (N * sum([x_i**2 for x_i in list]) - sum(list)**2) / (N * (N - ddof))
# テスト
calc_variance1(data2['身長'])【実行結果】

p.27 の大学生の身長の平均値と分散を求めます。
平均値は pandas の mean() で、分散は自作関数で求めます。
### 女子大生の身長の平均値と分散 p.27
print(f"平均値 {data2['身長'].mean():.2f}cm, ",
f"分散 {calc_variance1(data2['身長']):.3f}(cm)×(cm)")【実行結果】

p.27 の標準偏差の定義と公式における数式(分散の平方根)を用いて、標準偏差算出関数を【Python標準縛り】で作成します。
### 標準偏差の定義と公式 p.27
def calc_standard_deviation(list, ddof=1):
return calc_variance1(list, ddof)**(1/2)身長データで標準偏差算出関数を試します。
### 女子大生の身長の平均値と標準偏差
print(f"平均値 {data2['身長'].mean():.2f}cm, ",
f"標準偏差 {calc_standard_deviation(data2['身長']):.3f}cm")【実行結果】


■ 平均偏差 p.28
p.28 の平均偏差の定義における数式を用いて、平均偏差算出関数を【Python標準縛り】で作成します。
### 平均偏差の定義 p.28
def mean_deviation(list):
N = len(list)
x_bar = sum(list) / N
return sum(abs(x_i - x_bar) for x_i in list) / N
# 表1.1.2の身長でテスト
mean_deviation(data2['身長'])【実行結果】
表1.1.2の身長データの平均偏差です。

p.28 に「正規分布に似た分布では、平均偏差 $${Md}$$ は標準偏差 $${S}$$ のほぼ $${4/5}$$ 倍になる」と記載があります。
このことを試します。
表1.1.2 の身長データが正規分布に似た分布かヒストグラムを描画して確認します。
### 例) 表1.1.2のデータの場合 p.28
# ヒストグラムの描画
sns.histplot(data=data2, x='身長', bins=8, kde=True, ec='white', alpha=0.7);【実行結果】
正規分布に似ています(たぶん)。

表1.1.2 の身長データについて、標準偏差、平均偏差、標準偏差 $${\times 4/5}$$ を比べてみます。
# 標準偏差の算出 ※不偏分散の標準偏差でない方
S = calc_standard_deviation(data2['身長'], ddof=0)
# 平均偏差の算出
Md = mean_deviation(data2['身長'])
# 結果表示
print(f'標準偏差 = {S:.3f}')
print(f'平均偏差 = {Md:.3f}')
print(f'標準偏差 x 4/5 = {S*4/5:.3f}')【実行結果】
平均偏差は標準偏差の約 $${4/5}$$ になりました。
なお標準偏差は不偏分散ではない方の分散の平方根です(分母がデータ数 $${N}$$)。


■ 四分位範囲 p.29
p.29 の 例)表1.1.2のデータの場合で四分位数・四分位範囲を計算し、箱ひげ図(表1.2.12)を描画します。
四分位数の算出には pandas の quantile() を利用します。
### 例) 表1.1.2のデータの場合 p.29 pandasのquantile利用
# 第1四分位点、第3四分位点の算出
q1, q3 = data2['身長'].quantile(q=[0.25, 0.75])
# 結果表示
print(f'第1四分位点 = {q1}')
print(f'第3四分位点 = {q3}')
print(f'四分位範囲 = {q3 - q1}')【実行結果】

### 箱ひげ図 p.29 図1.2.12
plt.boxplot(data2['身長'])
plt.xticks([])
plt.ylabel('身長');【実行結果】


■ 歪度 p.30
p.30 の「歪度の定義」と「Excel・SPSSによる歪度と尖度の定義」の数式を用いて、歪度算出関数を【Python標準縛り】で作成します。
### 歪度の定義 p.30
# テキストの定義 正規分布の歪度=0
def calc_skewness1(list):
N = len(list)
x_bar = sum(list) / N
numerator = sum([(x_i - x_bar)**3 for x_i in list])
denominator = sum([(x_i - x_bar)**2 for x_i in list])**(3/2)
return (numerator / denominator) * N**(1/2)
# Excel・SPSSの定義 正規分布の歪度=0
def calc_skewness2(list):
N = len(list)
x_bar = sum(list) / N
MN3 = sum([(x_i - x_bar)**3 for x_i in list])
s3 = calc_standard_deviation(list, ddof=1)**3
return (N * MN3) / ((N - 1) * (N - 2) * s3)
# 表1.1.2の身長の歪度(Excel・SPSSの定義)
calc_skewness2(data2['身長'])【実行結果】
Excel・SPSSの定義の関数で身長データを試した結果です。

pandas の skew() で歪度を計算してみます。
# pandasで歪度を算出
data2['身長'].skew()【実行結果】
pandas の計算結果は Excel・SPSSの定義 と近い結果となりました。

平均 10、分散 5 の正規分布乱数の歪度を算出してみます。
データを作成します。
### 平均10, 分散5の正規分布乱数の歪度を算出
# 平均10, 分散5の正規分布乱数の生成
rng = np.random.default_rng(seed=123)
norm_val = rng.normal(loc=10, scale=5, size=1000000)
# ヒストグラムの描画
sns.histplot(x=norm_val, kde=True, ec='white');【実行結果】
作成したデータのヒストグラムです。
正規分布の形状になっています。

歪度を計算します。
# 歪度の算出
print(f'テキストの定義: {calc_skewness1(norm_val):.6f}')
print(f'Excel・SPSS : {calc_skewness2(norm_val):.6f}')
print(f'pandas : {pd.Series(norm_val).skew():.6f}')【実行結果】
3つの方法で計算し、一致しています。


■ 尖度 p.31
p.31 の「歪度の定義」とp.30 の「Excel・SPSSによる歪度と尖度の定義」の数式を用いて、、尖度算出関数を【Python標準縛り】で作成します。
### 尖度の定義 p.31
# テキストの定義 正規分布の尖度=3
def calc_kurtosis1(list):
N = len(list)
x_bar = sum(list) / N
numerator = sum([(x_i - x_bar)**4 for x_i in list])
denominator = sum([(x_i - x_bar)**2 for x_i in list])**2
return (numerator / denominator) * N
# Excel・SPSSの定義 正規分布の尖度=0
def calc_kurtosis2(list):
N = len(list)
x_bar = sum(list) / N
MN4 = sum([(x_i - x_bar)**4 for x_i in list])
s4 = calc_standard_deviation(list, ddof=1)**4
return (1/N * MN4/s4 * (N*N*(N+1))/((N-1)*(N-2)*(N-3))
- 3 * ((N-1)*(N-1))/((N-2)*(N-3)))
# 表1.1.2の身長の歪度(Excel・SPSSの定義)
calc_kurtosis2(data2['身長'])【実行結果】
Excel・SPSSの定義の関数で身長データを試した結果です。

pandas の kurt() で尖度を計算してみます。
# pandasで尖度を算出
data2['身長'].kurt()【実行結果】
pandas の計算結果は Excel・SPSSの定義 と一致しました。

平均 10、分散 5 の正規分布乱数の尖度を算出してみます。
# 平均10, 分散5の正規分布乱数の歪度を算出
# 尖度の算出
print(f'テキストの定義: {calc_kurtosis1(norm_val):.6f}')
print(f'Excel・SPSS : {calc_kurtosis2(norm_val):.6f}')
print(f'pandas : {pd.Series(norm_val).kurt():.6f}')【実行結果】
テキストは3が正規分布、Excel・SPSS・Pandasは0が正規分布という感じです。


■ 例題:平均・分散・標準偏差の求め方 p.33
平均・分散・標準偏差を求める手順1~2をPythonコード化します。
手順1の表1.2.9「統計量」のデータを作成します。
### 手順1 データの登録 p.33 表1.2.9
x_val = [158, 154, 162, 160, 153, 155, 163, 157, 155, 148]
data5 = pd.DataFrame({'x': x_val, 'x^2': [x**2 for x in x_val]},
index=range(1, 11))
data5【実行結果】
x^2 は $${x^2}$$ のことです。

# 合計チェック
data5.sum(axis=0)【実行結果】

手順2の平均・分散・標準偏差を求めます。
【Python標準縛り】です。
### 手順2 平均・分散・標準偏差を求める p.33
## 計算
# 標本サイズ
N = len(data5)
# 標本平均
x_mean = sum(data5.x) / N
# 標本分散(不偏分散) p.24の公式を利用
x_var = (N * (sum(data5.x**2)) - sum(data5.x)**2) / (N * (N - 1))
# 標準偏差(不偏分散の標準偏差)
x_std = x_var**(1/2)
## 結果の表示
print(f'平均 = {x_mean:}')
print(f'分散 = {x_var:.3f}')
print(f'標準偏差 = {x_std:.2f}')【実行結果】

pandas による平均・分散・標準偏差の計算結果と比べてみます。
### pandasで算出
## 結果の表示
print(f'平均 = {data5.x.mean():}')
print(f'分散 = {data5.x.var(ddof=1):.3f}')
print(f'標準偏差 = {data5.x.std(ddof=1):.2f}')【実行結果】
一致してます。


■ 理解度チェック 平均・分散・標準偏差
【問題1】p.34
表1.2.10「カサの紫外線カット率」を埋めて、平均・分散・標準偏差を求めます。
### データの作成 p.34 表1.2.10
# xをデータフレーム化
data6 = pd.DataFrame(
{'x': [0.74, 0.65, 0.62, 0.72, 0.61, 0.58, 0.70, 0.64, 0.68]},
index=range(1, 10))
# x^2列を追加
data6['x^2'] = data6['x']**2
# 結果表示
print('data6.shape: ', data6.shape)
data6【実行結果】

# 合計
sum_x, sum_x2 = data6.sum(axis=0)
print(sum_x, sum_x2)【実行結果】

## 平均・分散・標準偏差の計算
# 標本サイズ
N = len(data6)
# 標本平均
x_mean = sum_x / N
# 標本分散(不偏分散) p.24の公式を利用
x_var = (N * sum_x2 - sum_x**2) / (N * (N - 1))
# 標準偏差(不偏分散の標準偏差)
x_std = x_var**(1/2)
## 結果の表示
print(f'平均 = {x_mean:.3f}')
print(f'分散 = {x_var:.3f}')
print(f'標準偏差 = {x_std:.3f}')【実行結果】

## pandasで算出
print(f'平均 = {data6.x.mean():.3f}')
print(f'分散 = {data6.x.var(ddof=1):.3f}')
print(f'標準偏差 = {data6.x.std(ddof=1):.3f}')【実行結果】

【問題2】p.35
表1.2.11「地下水に含まれているヒ素濃度」を埋めて、平均・分散・標準偏差を求めます。
### データの作成 p.35 表1.2.11
# xをデータフレーム化
data7 = pd.DataFrame(
{'x': [0.007, 0.012, 0.025, 0.009, 0.006, 0.018, 0.022, 0.019]},
index=range(1, 9))
# x^2列を追加
data7['x^2'] = data7['x']**2
# 結果表示
print('data7.shape: ', data7.shape)
data7【実行結果】

# 合計
sum_x, sum_x2 = data7.sum(axis=0)
print(sum_x, sum_x2)【実行結果】

## 平均・分散・標準偏差の計算
# 標本サイズ
N = len(data7)
# 標本平均
x_mean = sum_x / N
# 標本分散(不偏分散) p.24の公式を利用
x_var = (N * sum_x2 - sum_x**2) / (N * (N - 1))
# 標準偏差(不偏分散の標準偏差)
x_std = x_var**(1/2)
## 結果の表示
print(f'平均 = {x_mean:.3f}')
print(f'分散 = {x_var:.3f}')
print(f'標準偏差 = {x_std:.3f}')【実行結果】

## pandasで算出
print(f'平均 = {data7.x.mean():.3f}')
print(f'分散 = {data7.x.var(ddof=1):.3f}')
print(f'標準偏差 = {data7.x.std(ddof=1):.3f}')【実行結果】

今回の写経は以上です。
シリーズの記事
次の記事
前の記事
目次
ブログの紹介
note で7つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!
1.のんびり統計
統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
Python、EXCELのサンプルコードの配布もあります。
2.実験!たのしいベイズモデリング1&2をPyMC Ver.5で
書籍「たのしいベイズモデリング」・「たのしいベイズモデリング2」の心理学研究に用いられたベイズモデルを PyMC Ver.5で描いて分析します。
この書籍をはじめ、多くのベイズモデルは R言語+Stanで書かれています。
PyMCの可能性を探り出し、手軽にベイズモデリングを実践できるように努めます。
身近なテーマ、イメージしやすいテーマですので、ぜひぜひPyMCで動かして、一緒に楽しみましょう!
3.実験!岩波データサイエンス1のベイズモデリングをPyMC Ver.5で
書籍「実験!岩波データサイエンスvol.1」の4人のベイジアンによるベイズモデルを PyMC Ver.5で描いて分析します。
この書籍はベイズプログラミングのイロハをざっくりと学ぶことができる良書です。
楽しくPyMCモデルを動かして、ベイズと仲良しになれた気がします。
みなさんもぜひぜひPyMCで動かして、一緒に遊んで学びましょう!
4.楽しい写経 ベイズ・Python等
ベイズ、Python、その他の「書籍の写経活動」の成果をブログにします。
主にPythonへの翻訳に取り組んでいます。
写経に取り組むお仲間さんのサンプルコードになれば幸いです🍀
5.RとStanではじめる心理学のための時系列分析入門 を PythonとPyMC Ver.5 で
書籍「RとStanではじめる心理学のための時系列分析入門」の時系列分析をPythonとPyMC Ver.5 で実践します。
この書籍には時系列分析のテーマが盛りだくさん!
時系列分析の懐の深さを実感いたしました。
大好きなPythonで楽しく時系列分析を学びます。
6.データサイエンスっぽいことを綴る
統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
統計・データサイエンス書籍にまつわる記事が多いです。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。
7.Python機械学習プログラミング実践記
書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。
最後までお読みいただきまして、ありがとうございました。
いいなと思ったら応援しよう!
応援ありがとうございます。これからもがんばって記事を作成します!