Topic 9

目次

1) 実習課題の提出ファイル(2種類): 2) 事前準備:必要な外部パケージ 3) 事前準備:VS Code の作業フォルダの管理 4) Delimiter-separated values 5) DelimitedFiles 内部パケージ 6) DataFrames と CSV 外部パケージ 7) *実習3: 甲府の気温 8) *実習4: 甲府の気象データ Topic 8 へ移動Topic 10 へ移動共通資料:Plots全体目次

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


表形式データの処理 II: Julia

1. 実習課題の提出ファイル(2種類):

1) 自分が書いたプログラムのファイル(.jl)を提出する。

2) プログラムの最終出力画面、及びグラフを Word ファイルにまとめて提出する。

2. 事前準備:必要な外部パケージ

今回は、次の外部パケージが必要となる。またいれてない方は先にパケージのインストールをしてください。

        ► DataFrames

        ► CSV

装着済みのパケージのチェック

 • Julia を起動する。

 • ローマ字の「終わり角括弧」 ] を入力すると、画面がJuliaのパケージ管理モードとなる。

 • status という指令を書き込んで Enter を入力する。

(@v1.5) pkg> status
Status `~/.julia/environments/v1.5/Project.toml`
  [336ed68f] CSV v0.7.7
  [a93c6f00] DataFrames v0.21.8
  [91a5bcdd] Plots v1.0.14

インストール済みのパケージが表示される。

パケージ管理モードから退出

Control-c:Controlキーを押しながら、c をオスしたら、通常モードに戻る。

新しいパケージのインストル

パケージ管理モードで指令 add パケージ名 を入力。

例:


3. 事前準備:VS Code の作業フォルダの管理

作業フォルダ

 • 今回の課題のファイルを保管するフォルダを作ってください。

 • VS のOpen Folderで作業フォルダーを開く。

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

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

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

コードの実行

1)全部実行する: Alt-Enter を入力する。または次のブタンをクリックする。

 Mac の場合: option-Enter

2)一部だけ実行する:

        ► 「マウス」、または「Shift-矢印キー」で実行したい部分を選ぶ。

        ► Control-Enter を入力。

        ► またはパネルの項目「Terminal」「Run Selected Text」

        ► 注意点:一度 Control-Enter または Alt-Enter を入力して Julia のターミナルを起動する必要がある。

3)一行だけ実行する:

        ► 「マウス」または「矢印キー」でカーソルを目的まで動かす。

        ► Control-Enter を入力。

その他のShort Cut Key

https://www.julia-vscode.org/docs/dev/userguide/keyboard/


4. Delimiter-separated values

 • 区切り文字を用いたデータ形式。

 • Delimiter : 区切り文字 または デリミタ とも呼ばれる。

10, 20, "x文字", 3.4, その他

 • よく使われている区切り文字:

        ► Comma コンマ (",")

        ► Tab タブ ("\t")

        ► Space スペース (" ")

CSV: Comma-separated values カンマで区切ったデータ形式

 • 「カンマ区切り」「コンマ区切り」などとも呼ばれる。

 • テキストデータ形式。

 • デフォルト拡張子: .csv

 • 詳細は こちら(wikipedia)


5. DelimitedFiles 内部パケージ

 • 区切ったデータを「行列」として読みとる。

 • 内部パケージなので、インストルする必要がない。

使い方:

プログラムの最初の行に下記のコードを置く。

using DelimitedFiles

ファイルの読み取る:

readdlm("ファイル名", "区切る文字", skipstart = 読み込まない行数, comments = true)

*実習1:CSV ファイルを読み取る

 • 次のファイルを右クリックして「名前を付けて保存」で作業フォルダーに保存する。

        ► csv_1.txt

csv_1.txt ファイルの内容は下記の通りです。

# Example of CSV の例. 数値データは 3行からです。
x,  y,  z
1,  2,  3
4,  5,  6
7,  8,  9
# 終わり

 • 第1行目は説明文言です。読み込まない。

 • 第2行目は各列の名前です。読み込まない。

 • 最終行は データではない。幸い "#" が付いているので、comments = true で排除できる。

下記のコードを新しい .jl ファイルに書き込む(または貼りつける)。

 • Alt-Enter で全部実行する、または

 • Control-Enter または Shift-Enter で一行ずつ実行する。

using DelimitedFiles
A = readdlm("csv_1.txt", ',', skipstart = 2, comments = true)
display(A) #行列をきれいに表示する。

出力

3×3 Matrix{Float64}:
1.0  2.0  3.0
4.0  5.0  6.0
7.0  8.0  9.0

sum 関数

sum 関数を用いて、各列と各行の合計値を求める。

using DelimitedFiles
println("--- 始め ---")
A = readdlm("csv_1.txt", ',', skipstart = 2, comments = true)
print("データ内容:\n")
display(A) #行列をきれいに表示する。

print("\n2列目の合計値:\n")
display( sum(A[:, 2]) )

println("\n各列の合計値:")
display( sum(A, dims = 1) )

println("\n各行の合計値:")
display( sum(A, dims = 2) )
--- 始め ---
データ内容:
3×3 Array{Float64,2}:
 1.0  2.0  3.0
 4.0  5.0  6.0
 7.0  8.0  9.0

2列目の合計値:
15.0

各列の合計値:
1×3 Array{Float64,2}:
 12.0  15.0  18.0

各行合計値:
3×1 Array{Float64,2}:
  6.0
 15.0
 24.0

関数 mean, std

内部統計パケージ Statistics を用い、次のコードを参考にして各列、と各行の平均または標準偏差を求める。

using DelimitedFiles
using Statistics
println("--- 始め ---")
A = readdlm("csv_1.txt", ',', skipstart = 2, comments = true)
print("データ内容:\n")
display(A) #行列をきれいに表示する。

print("\n2列目の合計値:\n")
display( sum(A[:, 2]) )

println("\n各列の合計値:")
display( sum(A, dims = 1) )
println("\n各列の平均値:")
display( mean(A, dims = 1) ) #平均


println("\n各行の合計値:")
display( sum(A, dims = 2) )
println("\n各行の標準偏差:")
display( std(A, dims = 2) ) #標準偏差
--- 始め ---
データ内容:
3×3 Array{Float64,2}:
 1.0  2.0  3.0
 4.0  5.0  6.0
 7.0  8.0  9.0

2列目の合計値:
15.0

各列の合計値:
1×3 Array{Float64,2}:
 12.0  15.0  18.0

各列の平均値:
1×3 Array{Float64,2}:
 4.0  5.0  6.0

各行の合計値:
3×1 Array{Float64,2}:
  6.0
 15.0
 24.0

各行の標準偏差:
3×1 Array{Float64,2}:
 1.0
 1.0
 1.0

6. DataFrames と CSV 外部パケージ

 • 区切ったデータを「表データ」として読みとる。

 • 外部パケージなので、インストルする必要がある。

 • 特徴:

        ► 列の名前を使って、データの抽出ができる。

        ► 表示は通常の行列より、綺麗。

        ► 区切り文字の自動認識。

使い方:

プログラムの最初の行に下記のコードを置く。

using DataFrames
using CSV

ファイルの読み取る:

CSV.read("ファイル名", DataFrame, header = 列名の行, skipto = データの行,
	comment = "コメント文字",normalizenames=true)

使い方は DelimitedFiles と多少違う。

*実習2

先ほどの csv_1.txt ファイルをもう一度使用する。内容はこちら:

# Example of CSV の例. 数値データは 3行からです。
x,  y,  z
1,  2,  3
4,  5,  6
7,  8,  9
# 終わり

 • データは 3行目から。

 • Header ヘッダー は第2行目です。

 • コメント文字は # です。

新し jl ファイルで下記のコードを実行する

using DataFrames
using CSV
println("--- start ---")

B = CSV.read("csv_1.txt", DataFrame, header = 2, skipto = 3, comment = "#", normalizenames=true)
println("データの内容:")
println(B)
--- start ---
データの内容:
3×3 DataFrame
│ Row │ x     │ y     │ z     │
│     │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1   │ 1     │ 2     │ 3     │
│ 2   │ 4     │ 5     │ 6     │
│ 3   │ 7     │ 8     │ 9     │

簡易統計報告

次のコードを追加する。

println("\nデータ分析報告")
println( describe(B) ) #簡易統計報告書。

データの抽出

println("\nデータの抽出")
println("x= ", B[:, "x"]) #列の番号ではなくて、列名で呼び出す。
println("y= ", B[:, :y])  #B["y"]の形式は 無効になった。
println("z= ", B.z)

最終出力

--- start ---
データの内容:
3×3 DataFrame
│ Row │ x     │ y     │ z     │
│     │ Int64 │ Int64 │ Int64 │
├─────┼───────┼───────┼───────┤
│ 1   │ 1     │ 2     │ 3     │
│ 2   │ 4     │ 5     │ 6     │
│ 3   │ 7     │ 8     │ 9     │

データ分析報告
3×8 DataFrame
│ Row │ variable │ mean    │ min   │ median  │ max   │ nunique │ nmissing │ eltype   │
│     │ Symbol   │ Float64 │ Int64 │ Float64 │ Int64 │ Nothing │ Nothing  │ DataType │
├─────┼──────────┼─────────┼───────┼─────────┼───────┼─────────┼──────────┼──────────┤
│ 1   │ x        │ 4.0     │ 1     │ 4.0     │ 7     │         │          │ Int64    │
│ 2   │ y        │ 5.0     │ 2     │ 5.0     │ 8     │         │          │ Int64    │
│ 3   │ z        │ 6.0     │ 3     │ 6.0     │ 9     │         │          │ Int64    │

データの抽出
x= [1, 4, 7]
y= [2, 5, 8]
z= [3, 6, 9]

7. *実習3: 甲府の気温

下記、甲府2019年の気象データのァイルを「名前を付けて保存」で作業フォルダに保存

        ► kofu2019.txt

データの元は 気象庁 です。

ファイルの内容の一部はこちら:

甲府 2019年(月ごとの値) 主な要素								
単位	hPa	mm	度	度	度	%	m/s	h
月	気圧	降水量	気温	最高気温	最低気温	湿度	風速	日照時間
1	982.6	6	3.6	10.1	-2.3	43	2.7	231.5
2	983.7	33	6.1	12.6	0.8	50	2.3	173.9
⋮
12	986	42.5	6.9	12.3	2.2	69	1.8	167.9

 • 区切り文字は タブ です。

 • ヘッダー行(列名)は 3行目

 • 数値データは 4行目から

新しいファイルに下記コードを実行する。

using DataFrames
using CSV
using Plots

B = CSV.read("kofu2019.txt", DataFrame, header = 3, skipto = 4, comment = "#", normalizenames=true)
println("甲府の天気:")
println(B)

出力

下記のコードを追加して実行。

println("\n年間平均など")
println( describe(B) ) #簡易統計報告書。

追加された出力:

下記のコードを追加して、グラフを描く

plot(B.月, B.気温, marker = 5, markershape = :square, label="Ave")
plot!(B.月, B.最高気温, marker = 5,markershape = :circle, label = "Max")
plot!(B.月, B.最低気温, marker = 5, markershape = :utriangle, label = "Min")
plot!(xlabel = "Month", ylabel = "degree", title = "Kofu's annual temperature (2019)")
plot!(xticks = (1:1:12))

出力:

下記のコードを追加して、x軸の表示を任意の文字にする。

Mon = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Apr", "Sep", "Oct", "Nov", "Dec"]
plot!(xticks = (1:1:12, Mon))
display(plot!())#plot! が最後の行じゃなかったら、displayの関数に入れて、強制的に表示をさせる。
savefig("mykofutemp.png") #保存。 plotly の場合、この指令は不要です。

8. *実習4: 甲府の気象データ

 • 先ほどのファイルを Save で保存して、そしてもう一度 Save as で別ファイル名で保存してください。

 • 下記のコードを参考にして、4つの気象データを plot する。

using DataFrames
using CSV
using Plots

B = CSV.read("kofu2019.txt", DataFrame, header = 3, skipto = 4, comment = "#", normalizenames=true)       

#自由にスタイルを変えてみる。
Temperature = plot(B.月, B.気温, marker = 3)
plot!(B.月, B.最高気温, marker = 3)
plot!(B.月, B.最低気温, marker = 3)
plot!(title = "Temperature (Celsius)", legend = false, xticks = (2:2:12))

#主な追加部分:
Rain = scatter(B.月, B.降水量, legend = false, title = "Rain fall (mm)",xticks = (2:2:12))
Pressure = scatter(B.月, B.気圧, title = "Pressure (hPa)",xticks = (2:2:12), legend = false)
Humidity = plot(B.月, B.湿度, title = "Humidity (%)", xticks = (2:2:12), legend = false)

#4つのグラフを一斉に描く
plot(Temperature, Rain, Pressure, Humidity, layout = (2,2))

最後は任意のファイ名で下記のコードを実行してグラフを保存する。

savefig("mykofu_meteorological_data.png")