「日経ソフトウェア2022年9月号 特集1 統計」をやってみた その1

日経ソフトウェア9月号 特集1 統計」を行ってみます。

 

はじめに

以下の手順で実行し、データの特徴を確認していきます。

 

STEP1:データの内容を確認する

・データサイズを調べる

・変数の種類を調べる

STEP2:データのおおまかな傾向をとらえる

ヒストグラムを作成する

・平均値と中央値を求める

STEP3:データのばらつきをとらえる

・分散と標準偏差を求める

・箱ひげ図を作成する

STEP4:2つの項目の関係を調べる

・散布図を作成する

相関係数を求める

 

サンプルプログラム

サンプルプログラムは日経ソフトウェアのWebからダウンロードできます。

以下URLから「本誌バックナンバーを見る」→「2022年9月号」→「「特集1 Pythonで学ぶ統計 記述統計編」(t12209.zip)

 

nkbp.jp

 

サンプルプログラムは「Google Colaboratory」上で実行していきます。

colab.research.google.com

 

Google Colabを起動したら「ノートブックを新規作成」をクリックし新しいノートブックを開きます。

Untitled.ipynbに任意の名前をつけたら、t12209.zipを解凍し、baseball_players.csvファイルをアップロードします。

アップロードは左のファイルアイコンをクリックし、アップロードボタンから読み込みます。

アップロードボタン

 

STEP1:データの内容を確認する

baseball_players.csv」ファイルの内容を確認していきます。

pandasのread_csvでファイルを読み込みます。

df.shapeで行と列の数が表示されます。

shape

df.info()で変数の一覧が表示されます。

df.info()

STEP2:データのおおまかな傾向をとらえる

変数のheight(身長)に着目して、ヒストグラムを作成し、データの大まかな傾向をつかみます。

nbinsはヒストグラムの棒の数を指定します。

ヒストグラム

グラフから大体身長は180cmが平均のように見えます。平均値と中央値を求めます。

中央値は昇順にソートしたのち、データの数が偶数の場合は、真ん中の2つの数値を足して2で割った値、奇数の場合はデータの数÷2の値となります。

平均値と中央値

STEP3:データのばらつきをとらえる

分散と標準偏差を求めます。

分散は偏差を2乗してた幸せ、データの数で割ることによって求められます。

標準偏差は分散のルートで求められます。

偏差とは、各データの値-データの平均値で求めた値を指します。

 

分散と標準偏差

pandasの分散と標準偏差を求める関数を利用しても結果は同じになります。

print("all var=",df['height'].var(ddof=0))
print("all var=",df['height'].std(ddof=0))

 

次に、日本人選手と海外選手に分けて身長の分散を求めます。

pandasの分散と標準偏差を求める関数を使って求めます。

分散と標準偏差 その2

分散の値を見ると日本30、海外25なので日本人のほうが身長のばらつきが多いことがわかります。

日本人選手と海外選手に分けたヒストグラムは以下の通りです。

ヒストグラム

オプションでbarmode='overlay’を設定すると、日本の選手と海外の選手データを重ねて表示します。

 

ヒストグラム overlay

 

日本選手、海外選手それぞれの身長を箱ひげ図で表示します。

海外選手のほうが中央値が190cmで身長が高いことがわかります。

箱ひげ図

STEP4:2つの項目の関係を調べる

身長と体重の関係を見るために散布図を表示します。

身長が高くなると体重が増加する傾向が見えます。

散布図

身長と体重に相関関係があるかを確認するため、相関係数を求めます。

#身長と体重の取得
x=df['height']
y=df['weight']

#平均値
avg_x=sum(x)/len(x)
avg_y=sum(y)/len(y)

#平方和
sxx=0
syy=0
sxy=0
for i in range(len(df)):
  sxx+=(x[i]-avg_x)**2
  syy+=(y[i]-avg_y)**2
  sxy+=(x[i]-avg_x)*(y[i]-avg_y)


r=(sxy/len(df))/*1**0.5*(syy/len(df))**0.5)
print(r)
 
0.6229955137002602
 
0.622と正の相関関係であることがわかりました。

*1:sxx/len(df

/* -----codeの行番号----- */