Topic 11

目次

1) 実習課題(4問)について 2) *事前作業 3) 量的データ 4) 質的データ 5) 多次元データ 6) 時系列データ 7) 統計代表値: Mean, Median, Mode 8) ばらつきの尺度:標準偏差など 9) 標本標準偏差 Sample Standard Deviation 10) ヒストグラム Histogram 11) DataFrameで分析 12) 相関係数 Correlation coefficient 13) 甲府の気象データ

データサイエンス CDS009    (チェン leechuin@yamanashi.ac.jp) 更新日: 2024-02-02


統計学入門 I:一般基礎&相関係数

1. 実習課題(4問)について

VSCode の Web版を使って実習課題のコードを書いてください。

 • VSCode のリンクはこちら:https://vscode.dev/

各課題につき、1つのプログラム(.jl)ファイルを使ってください。

 • jlファイルを全て提出してください。

Juliaのターミナで include の方法で、コードを実行してください。

 • 重要な出力画面 & グラフは,1つの Word ファイルにまとめて提出してください。

注意点:

 • グラフをplotする場合、コードの冒頭に、using Plots を挿入してください。

using Plots

2. *事前作業

(1) 実習課題用のフォルダーの作成

各自の「ドキュメント」 のフォルダーに今回の授業のためのフォルダーを作成してください。

 • フォルダー名は任意です。(既存のものを使ってもOK)

今回の授業に使う、プログラムファイル( .jl)及びデータファイル (.txt)をこのフォルダーの中に保存してください

VSCode で作業フォルダを開く

 • VScode を立ち上げて、Open Folderで作業フォルダーを開く。

プラグラムのファイルを保存

 • New Fileで新しいファイルを作る。

 • Saveで 拡張子.jlをつけて、任意な名前でファイルを保存する。

cd で作業空間の変更

 • Julia ターミナル(REPL)を開き、下記のとおりに、cd のコマンドを使って、Julia の作業フォルダーを自分が作ったフォルダーに指定する

julia> cd("U:\\Documents\\あなたのフォルダー名")

ターミナルの出力の例:

作業空間が確実に変更されたかどうか次のコマンドで確認できる。

julia> pwd()

表示されたフォルダー名が、あなたが作ったものと一致すれば大丈夫です。

例:

include 関数で .jl ファイルを実行する

 • Julia端末でinclude 関数を使って .jl ファイルを実行する。

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つのカテゴリーだけ与える。

そのようなデータは 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, 3, 4, 7, 9] の平均値は4ですが、中央値は 3 です。

例: [1, 2, 2, 3, 4, 7] の中央値は 2.5 です。

最頻値 Mode

例: [1, 2, 2, 3, 4, 7, 9] の最頻値は 2 です。

練習

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 の共分散 (covariance)

\[ \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 の相関係数 (correlation coefficient)

\[ \mathrm{cor}(X,Y) = \frac{\mathrm{cov}(X,Y)}{s_X s_Y}\]

図の元: wikipedia


*実習3:相関係数

関数 cor()を使って、相関係数を求める

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("甲府の気象データ")
⋮ #また未完成のコードです