裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia に翻訳--238 SPSS ファイルを読む

2021年05月25日 | ブログラミング

#==========
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")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村