Julia でのデータ分析
Juliaでのデータ分析をDataFrmaes
を使用しながら使用方法について書いていきます.
なおversion
は1.5.0
#Pkgのインポート
import
using Pkg;
Pkg.add("DataFrames")
Pkg.add("CSV")
using DataFrames
using CSV
DataFrameの作成
Julia
のDataFrames
はpandas
のDataframe
と同じくテーブル形式のエクセルのようなデータ構造を持ち,各列は数値型・文字列型・ブール型などの様々な型を保持できる.
作成方法は直接作成も出来るし,CSVなどから作成するなどの方法がある.
DataFrame作成
# 直接作成する
df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])
#dictionaryから作成する
data = Dict("A" => 1:4, "B" => ["M", "F", "F", "M"])
df = DataFrame(data)
# 4×2 DataFrame
│ Row │ A │ B │
│ │ Int64 │ String │
├─────┼───────┼────────┤
│ 1 │ 1 │ M │
│ 2 │ 2 │ F │
│ 3 │ 3 │ F │
│ 4 │ 4 │ M │
#順番をソートして読み込みたい場合
df_BA = DataFrame(data) |> df_ -> permutecols!(df_, [:B,:A]) # B→Aの順
# 4×2 DataFrame
│ Row │ B │ A │
│ │ String │ Int64 │
├─────┼────────┼───────┤
│ 1 │ M │ 1 │
│ 2 │ F │ 2 │
│ 3 │ F │ 3 │
│ 4 │ M │ 4 │
#JuliaのPipe演算子とlambda関数は
5 |> x -> x*3 #15
#のように|>と->で書ける
#CSVファイルから読み込み
df = CSV.read("path/to/data.csv")
#データの構造
データへのアクセス
データへのアクセスは参照(データを直接参照するのでコピーしない)と
コピー(DataFrame
内のデータをコピーする)する方法がある.
参照はdf.col
、df."col"
、df[!, :col]
,df[!, "col"]
が
コピーはdf[:, :col]
, df[:, "col"]
が該当する.
参照を使用する場合は参照値の変更がもとのDataframeに影響するので注意が必要.
DataFrameアクセス
df.A
df."A"
df[!, :A]
#どれも同じ
[1, 2, 3, 4]
A = df.A #参照
A[1] = -1
df # 値が変わってしまう.
# 4×2 DataFrame
│ Row │ A │ B │
│ │ Int64 │ String │
├─────┼───────┼────────┤
│ 1 │ -1 │ M │
│ 2 │ 2 │ F │
│ 3 │ 3 │ F │
│ 4 │ 4 │ M │
# コピーを作成する場合
A = df[:, :A] #コピー
A[1] = 1 #もとに戻したつもり
df # コピーを作成しているので値はもとに戻らない
# 4×2 DataFrame
│ Row │ A │ B │
│ │ Int64 │ String │
├─────┼───────┼────────┤
│ 1 │ -1 │ M │
│ 2 │ 2 │ F │
│ 3 │ 3 │ F │
│ 4 │ 4 │ M │
###データの追加・削除
- 列データの追加
c = 3:6 #3,4,5,6
df.C = c #長さが既存のデータと一致する必要あり
# 4×3 DataFrame
│ Row │ A │ B │ C │
│ │ Int64 │ String │ Int64 │
├─────┼───────┼────────┼───────┤
│ 1 │ -1 │ M │ 3 │
│ 2 │ 2 │ F │ 4 │
│ 3 │ 3 │ F │ 5 │
│ 4 │ 4 │ M │ 6 │
- 列データの削除
select!(df, Not(:B)) # !は破壊演算子(dfを書き換える)
df
# 4×2 DataFrame
│ Row │ A │ C │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ -1 │ 3 │
│ 2 │ 2 │ 4 │
│ 3 │ 3 │ 5 │
│ 4 │ 4 │ 6 │
#5. 列名・サイズなどの確認
DataFrameの列名はnames
で
縦横の数はsize
で取得
列名取得
names(df)
# ["A", "B"]
# 列名をSymbolとして取得する場合はpropertynamesを使用する
propertynames(df)
#[:A, :B]
# データの大きさを取得
size(df)
#(4, 2)