統計学入門 I:一般基礎&相関係数
1. 実習課題(4問)について
VSCode の Web版を使って実習課題のコードを書いてください。
• VSCode のリンクはこちら:https://vscode.dev/
各課題につき、
• jlファイルを全て提出してください。
Juliaのターミナで include の方法で、コードを実行してください。
• 重要な出力画面 & グラフは,
注意点:
• グラフをplotする場合、コードの冒頭に、using Plots を挿入してください。
using Plots
2. *事前作業
(1) 実習課題用のフォルダーの作成
各自の
• フォルダー名は任意です。(既存のものを使ってもOK)
今回の授業に使う、
VSCode で作業フォルダを開く
• VScode を立ち上げて、

プラグラムのファイルを保存
•
•
cd で作業空間の変更
• Julia ターミナル(REPL)を開き、下記のとおりに、
julia> cd("U:\\Documents\\あなたのフォルダー名" )
ターミナルの出力の例:

作業空間が確実に変更されたかどうか次のコマンドで確認できる。
julia> pwd()
表示されたフォルダー名が、あなたが作ったものと一致すれば大丈夫です。
例:

include 関数で .jl ファイルを実行する
• Julia端末で
julia> include("あなたのファイル名.jl" )
実行例:

今回の実習は次の Julia パケージを使います:
► DataFrames 表データの取り扱い
► CSV テキストファイルをDataFrameに読み込む
► Plots グラフの作成
► Statistics 平均値、標本標準偏差、相関係数など
各プログラムの冒頭に下記のコードを挿入する。
using DataFrames
using CSV
using Plots
using Statistics
3. 量的データ
Quantitative Data
例:学生15人の身長
学生 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
身長 cm | 178 | 165 | 168 | 152 | 175 | 175 | 165 | 162 | 164 | 170 | 169 | 155 | 153 | 162 | 168 |
• 測定できる数値
• 他の例:時間、長さ、重さ、体積、面積、金額、温度、湿度など
4. 質的データ
Qualitative Data
学生 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
性別 | 男 | 男 | 男 | 女 | 男 | 男 | 女 | 女 | 男 | 男 | 男 | 女 | 女 | 女 | 男 |
• 測定数値ではない。
• あるカテゴリーに属している。
• 他の例:学歴
► 大学卒、高校卒、中学卒など
• 他の例:天気
► 晴、曇り、雨、雪など
5. 多次元データ
1次元データ
上記の例は一人の学生に対し、1つの値、または1つのカテゴリーだけ与える。
そのようなデータは
多次元データ
2次元以上のデータを多次元データと呼ぶ。
例
学生 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
身長 cm | 178 | 165 | 168 | 152 | 175 | 175 | 165 | 162 | 164 | 170 | 169 | 155 | 153 | 162 | 168 |
体重 kg | 63 | 62 | 69 | 41 | 71 | 61 | 62 | 48 | 52 | 55 | 69 | 48 | 44 | 49 | 69 |
性別 | 男 | 男 | 男 | 女 | 男 | 男 | 女 | 女 | 男 | 男 | 男 | 女 | 女 | 女 | 男 |
成績 | 51 | 74 | 87 | 66 | 90 | 74 | 73 | 81 | 81 | 66 | 87 | 72 | 65 | 70 | 82 |
• 一人の学生に対し、2つ以上の観測値が得られる。
6. 時系列データ
Time series data
例


7. 統計代表値: Mean, Median, Mode
•
平均値 mean
• 最もよく知られている代表値。
\[ \bar{x} = \frac{x_1 + x_2 + \cdots + x_N}{N}\]
中央値 Median
例: [1, 2, 2,
例: [1, 2, 2, 3, 4, 7] の中央値は 2.5 です。
最頻値 Mode
例: [1,
練習
Julia の Statistics パケージを使って、平均値、中央値を求める。
julia> using Statistics
julia> A = [1,1 ,2,3 ,4 ]
5 -element Array{Int64,1 }:
1
1
2
3
4
julia> mean(A)
2.2
julia> median(A)
2.0
*実習1:平均値、中央値
• 15名の学生の身長と体重の平均値を中央値を求める。
• 次のデータファイルを「右クリック」して「名前を付けて保存」で作業フォルダーに保存する
► データ:student.txt
• 次のコードでデータを読み込む。
using DataFrames
using CSV
using Plots
using Statistics
A = CSV.read("student.txt" , DataFrame) #データを読み込む
println(A) #データを表示する
println("-" ^30 )#改行
出力:

• 次のコートを追加し、未完成のところを完成させる。
println("身長平均値 :" , mean( A.身長 ))
println("身長中央値 :" , median( A.身長 ))
println("体重平均値 :" , mean( ❓ ))
println("体重中央値 :" , median( ❓ ))
println("成績平均値 :" , ❓)
println("成績中央値 :" , ❓)
身長平均値 :165.4
身長中央値 :165.0
体重平均値 :57.53333333333333
体重中央値 :61.0
成績平均値 :74.6
成績中央値 :74.0
8. ばらつきの尺度:標準偏差など

範囲 Range
• 範囲 = 最大値 ー 最小値
平均偏差 mean diviation
\[ d = \frac{|x_1 - \bar{x}| + |x_2 - \bar{x}| ~+ \cdots ~+ |x_n - \bar{x}|}{N} \]
分散 variance (var)
\[ 分散~~\sigma^2 = \frac{(x_1 - \bar{x})^2 + \cdots + (x_N - \bar{x})^2}{N} = \frac{1}{N}\sum_{i=1}^N (x_i - \bar{x})^2\]
標準偏差 Standard deviation (std)
\[ 標準偏差~~\sigma = \sqrt{ \frac{(x_1 - \bar{x})^2 + \cdots + (x_N - \bar{x})^2}{N} } = \sqrt{\frac{1}{N}\sum_{i=1}^N (x_i - \bar{x})^2}\]
*実習1の続き:母集団標準偏差
次のコードを追加し、15人の学生の身長の平均値、標準偏差を求め、身長の散布図グラフを作成する。
⋮
MEAN = mean(A.身長) #もう一度、身長の平均を計算する。
N = length(A.身長) #母集団の数
STD = sqrt( sum( (A.身長 .- MEAN).^2 )/N ) #標準偏差を計算する。
println("標準" )
#身長の散布図を作成する
scatter(A.身長,
markersize = 10 , # データ点のサイズ
xlabel = "Student No." ,
ylabel ="height (cm)" ,
ylim = (120,180 ), #縦軸の範囲を指定する
legend = false)
#平均値と標準偏差の直線を追加する
plot!([0,15 ], [MEAN, MEAN], linewidth = 2 , linecolor = :red)
plot!([0,15 ], [MEAN + STD, MEAN + STD], linestyle = :dash, linecolor = :green, linewidth = 2 )
plot!([0,15 ], [MEAN - STD, MEAN - STD], linestyle = :dash, linecolor = :green, linewidth = 2 )

9. 標本標準偏差 Sample Standard Deviation
• Julia の Statistics Package に std という標準偏差の関数がある。
• それは「標本標準偏差」s のことです。

母集団から n 個の標本を抽出して、その標本平均は:
\[\bar{x} = \frac{1}{n}\sum_{i=1}^n x_i\]
その標本標準偏差は:
\[s = \sqrt{\frac{1}{n-1}\sum_{i=1}^n (x_i - \bar{x})^2}\]
• 母集団標準偏差の計算と違って、(n-1)で割る。
• それは bessel correction と呼ぶ。
• 目的:少ない標本を使って求めた「標本標準偏差 s」を「母集団標準偏差 σ」に近づける。
例:15名の学生から5個の標本を抽出する
N = 15 #母集団の数
println("母集団 Population" )
println("成績の母集団平均\t= " , mean(A.成績))
println("成績の母集団標準偏差\t= " , sqrt(sum(((A.成績 .- mean(A.成績)).^2 )/N)))
n = 5 #標本の数
ランダム = rand(1:15 , n) #1から15までの整数、n作る。
標本 = A.成績[ランダム]
println("\n標本:\t" , ランダム)
println("成績の標本平均\t= " , mean(標本))
println("成績の標本標準偏差\t= " , std(標本))
println("補正しない標準偏差\t= " , sqrt(sum(((標本 .- mean(標本)).^2 )/n)))
結果:

10. ヒストグラム Histogram
• 縦軸に度数、横軸に階級をとった統計グラフ
練習:15名の学生の成績ヒストグラム
using DataFrames
using CSV
using Plots
using Statistics
A = CSV.read("student.txt" , DataFrame) #データを読み込む
histogram(A.成績, ylabel = "Frequency" , xlabel = "Grade" , legend = false)

• 山が1つの単純分布。それは 単峰性 unimodal という。
例:15名の学生の体重ヒストグラム
histogram(A.体重,
bins = 40:10 :80 , #棒(ビン)の範囲、幅の指定
legend=false,
ylabel = "Frequency" ,
xlabel = "Weight (kg)" )

histogram(A.体重,
bins = 40:5 :80 , #棒(ビン)の幅を変える
legend=false,
ylabel = "Frequency" ,
xlabel = "Weight (kg)" )

• 山が2つ。それは 双峰性 bimodal という。このような場合は、通常、性質の異なるデータが混在している。
11. DataFrameで分析
条件付で、データの抽出ができる。
練習
例:[性別 .== "女"]という条件で、女性学生の身長データだけを抽出する

julia> A.身長[A.性別 .== "女" ]
6 -element Vector{Int64}:
152
165
162
155
153
162
*実習2:性質の異なるデータの解析
DataFrame を用いて15名の学生の成績、身長、体重を分析する。
出力:
下記のコードを追加して、男女ごとで色をつけて、散乱図を作成する。
#P1のグラフに まずは学生全員の散布図を作成する
P1 = scatter(A.身長, A.体重, legend = false,
xlabel = "height" , ylabel = "weight"
)
#P2 のグラフに男性学生の散布図を作成(デフォルトでは色が青)
P2 = scatter(A.身長[A.性別 .== "男" ], A.体重[A.性別 .== "男" ])
#P2 のグラフに女性学生の散布図を追加する。(色がオレンジに変わる)
scatter!(A.身長[A.性別 .== "女" ], A.体重[A.性別 .== "女" ])
scatter!(legend = false,xlabel = "height" , ylabel = "weight" )
#最後は2つのグラフをまとめる
plot(P1, P2, layout = (2,1 ), size = (400,300 ))

下記のコードを追加し、男女ごとで色をつけて、ヒストグラムを作成する。
#まずは、男性学生のヒストグラムを作成する。
histogram(A.体重[A.性別 .== "男" ],
bins = 40:5 :80 , label = "male" ,
xlabel = "Weigth (kg)" , ylabel = "Frequency" )
#次は、女性学生のヒストグラムを追加する。
histogram!(A.体重[A.性別 .== "女" ],
bins = 40:5 :80 , label = "female" )

12. 相関係数 Correlation coefficient
2つの確率変数の間にある線形な関係の強弱を測る指標である
X と Y の共分散 (
\[ \mathrm{cov}(X,Y) = \frac{1}{n}\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})\]
X の標準偏差 (standard deviation)
\[ s_X = \sqrt{ \frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})^2 }\]
Y の標準偏差 (standard deviation)
\[ s_Y = \sqrt{ \frac{1}{n} \sum_{i=1}^n (y_i - \bar{y})^2 }\]
X と Y の相関係数 (
\[ \mathrm{cor}(X,Y) = \frac{\mathrm{cov}(X,Y)}{s_X s_Y}\]

図の元: wikipedia
*実習3:相関係数
関数
using DataFrames
using CSV
using Plots
using Statistics
A = CSV.read("student.txt" , DataFrame) #データを読み込む
println("身長と身長の相関係数 = " , cor(A.身長, A.身長))
println("身長と体重の相関係数 = " , cor(A.身長, A.体重))
println("身長と成績の相関係数 = " , cor(A.身長, A.成績))
P1 = scatter(A.身長, A.身長, title = "Correlation = 1.00" , ylabel = "Height" )
P2 = scatter(A.身長, A.体重, title = "Correlation = 0.80" , ylabel = "Weight" )
P3 = scatter(A.身長, A.成績, title = "Correlation = 0.13" , ylabel = "Grade" )
#グラフをまとめる
plot( P1, P2, P3, layout = (3,1 ), legend = false,
titlefontsize = 10 , xlabel = "Height" ,
labelfontsize = 8 , size = (300,500 )
)

13. 甲府の気象データ
*実習4:気温と、気圧、降水量、湿度の相関関係
再び甲府の気象データ(2019年)を使う。
データはこちら:kofu2019.txt

出力結果:
気温と気圧の相関 = -0.6097151168866921
気温と降水量の相関 = 0.49210999942308775
気温と最高気温の相関 = 0.9961276187899986
気温と湿度の相関 = 0.6752453956695764

上記の出力とグラフを作成するために、次のコードを完成させる。
using DataFrames
using CSV
using Plots
using Statistics
B = CSV.read("kofu2019.txt" , DataFrame, header = 3 , skipto = 4 , comment = "#" , normalizenames=true)
println("甲府の気象データ" )
⋮ #また未完成のコードです