#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
TALIS 2018
https://oku.edu.mie-u.ac.jp/~okumura/python/talis2018.html
ファイル名: .jl 関数名:
翻訳するときに書いたメモ
==========#
# import Pkg; Pkg.add("StatFiles")
using StatFiles, DataFrames, CSV
StatFiles で,Stata, SPSS, SAS ファイルを DataFrame へ読み込むことができる
@time df = DataFrame(load("SPSS_2018_international/BTGINTT3.sav"))
かなり処理時間が掛かる 610.987733 seconds 別の機会にやったら 2008.776553 seconds。これは,どげんかせんといかん
153,682 rows × 493 columns だったが?
長時間がかかったので,csv ファイルに書きだしておく。
@time CSV.write("SPSS_2018_international/BTGINTT3.csv", df)
# 35.790314 seconds
@time df = CSV.read("SPSS_2018_international/BTGINTT3.csv", DataFrame)
# 24.544577 seconds 毎回 *.sav ファイルを読むなどと言う愚行は避けるべし
CNTRY 別のグループデータフレームにする
@time gdf = groupby(df, :CNTRY)
# 0.134826 seconds
国別の行数
combine(gdf, nrow)
日本の行数
using FreqTables
freqtable(df[!, :CNTRY])["JPN"] # 3555
日本のデータを取り出す
クエリーで直接データフレームを処理することもできるが,
using Query
@time jpn = df |> @filter(_.CNTRY == "JPN") |> DataFrame
# 86.142237 seconds 遅い!!
TT3G34M への回答状況(日本)
freqtable(jpn[!, :TT3G34M])
#===
5-element Named Vector{Int64}
Dim1 │
────────┼─────
1.0 │ 835
2.0 │ 1478
3.0 │ 784
4.0 │ 428
missing │ 30
===#
groupby() に引き続いての処理時間でも,こちらの方が速い
@time jpn = gdf[(CNTRY="JPN",)];
# 0.468942 seconds
TT3G34M への回答状況(日本)
freqtable(jpn[!, :TT3G34M])
#===
5-element Named Vector{Int64}
Dim1 │
────────┼─────
1.0 │ 835
2.0 │ 1478
3.0 │ 784
4.0 │ 428
missing │ 30
===#
TT3G34M への回答状況(各国)
freqtable(df[!, :CNTRY], df[!, :TT3G34M])
#===
47×5 Named Matrix{Int64}
Dim1 ╲ Dim2 │ 1.0 2.0 3.0 4.0 missing
────────────┼────────────────────────────────────────────
ABA │ 143 595 691 613 57
ARE │ 135 882 2227 5170 234
AUS │ 39 755 1291 1155 333
AUT │ 302 1581 1242 1006 124
BEL │ 688 1441 1584 1343 201
⋮ ⋮ ⋮ ⋮ ⋮ ⋮
VNM │ 186 1227 1483 920 9
ZAF │ 538 493 441 527 47
===#
国ごとの平均値(欠損値を除いて)
using Statistics
df2 = df[completecases(df, [:CNTRY, :TT3G34M]), :]
gdf2 = groupby(df2, :CNTRY)
result = combine(gdf2, nrow, :TT3G34M => mean)
#===
46 rows × 3 columns
CNTRY nrow TT3G34M_mean
String Int64 Float64
1 ABA 2042 2.86876
2 ARE 8414 3.47754
3 AUS 3240 3.09938
4 AUT 4131 2.7146
5 BEL 5056 2.70847
6 BGR 2821 3.00425
7 BRA 2371 2.90468
8 CAB 974 3.19713
9 CHL 1930 3.1658
10 COL 2354 3.18182
:
===#
result2 = sort(result, :TT3G34M_mean)
#===
46 rows × 3 columns
CNTRY nrow TT3G34M_mean
String Int64 Float64
1 JPN 3525 2.22837
2 ZAF 1999 2.47874
3 FRA 2846 2.47892
4 EST 2930 2.66689
5 TWN 3811 2.70323
6 BEL 5056 2.70847
7 SVN 2046 2.71017
8 AUT 4131 2.7146
9 HRV 3269 2.72316
10 ISR 2349 2.73052
:
===#
図を描く
using Plots
pyplot()
scatter(result2[!, :TT3G34M_mean], result2[!, :CNTRY],
tick_direction=:out, size=(500, 600), xlims=(1, 4), label="")
countryname = CSV.read("countryname.csv", DataFrame);
name = fill("", length(result2[!, :CNTRY]));
for (i, abb3) in enumerate(result2[!, :CNTRY])
j = indexin([abb3], countryname[!, :abb3])[1]
name[i] = isnothing(j) ? abb3 : countryname[j, :nameJ]
end
yticks!(0.5:length(name), name)
savefig("fig.png")