はじめに
データ分析や機械学習などに利用できるプログラムとして、Juliaがあると知った。
以下3点のメリットから今後利用することがあるかもしれないので、備忘録として初歩的なことから欲しかった資料をまとめていく。
[1]Pythonと同じようにライブラリを利用できる
[2]実行速度がC言語よりも速い
[3]PythonやC言語と連携することもできる
実行環境
参考資料[1]で構築したVSCにおけるWSL2で実行している。
検証したプログラム
比較検証対象のプログラム
参考資料[2]で作成した平均値補完およびkNN補完をするプログラム
python仮想環境
reuirements.txt(クリックで展開)
joblib==1.4.2
numpy==2.2.4
pandas==2.2.3
python-dateutil==2.9.0.post0
pytz==2025.2
scikit-learn==1.6.1
scipy==1.15.2
setuptools==75.8.0
six==1.17.0
threadpoolctl==3.6.0
tzdata==2025.2
wheel==0.45.1
pythonプログラム
main.py(クリックで展開)
import sys
import os
import time
# `process` ディレクトリをパスに追加
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../process")))
from read import read_csv
from completion_numeric_data import completion_mean
from knn_imputation import fill_missing_data_with_knn
def main():
#開始時刻
start = time.time()
file_path = "../data/raw/random_data_100.csv"
#CSVファイルのデータフレーム登録
df_hunter = read_csv(file_path)
column = "play_time"
#平均値で欠損値を補完
df_hunter = completion_mean(df_hunter, column)
k = 5
column = "sub_weapon"
features = ["HR", "gender", "area", "main_weapon", "play_time"]
#knnで欠損値を補う
df_hunter = fill_missing_data_with_knn(df_hunter, column, features, k)
print(df_hunter)
#終了時刻
end = time.time()
print(f"\n🕒 実行時間: {end - start:.3f} 秒")
if __name__ == '__main__':
main()
read.py(クリックで展開)
import pandas as pd
#csvファイルを読み込み、データフレームに登録
def read_csv(csv_file):
df = pd.read_csv(csv_file,encoding="utf_8")
return df
completion_numeric_data.py(クリックで展開)
import pandas as pd
def completion_mean(df, column):
# play_time列の平均値を計算(NaNを除く)
mean_play_time = df[column].mean()
# NaNを平均値で補完
df[column] = df[column].fillna(mean_play_time)
return df
knn_imputation.py(クリックで展開)
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
def fill_missing_data_with_knn(df, column, features, k):
# 欠損値が存在するか確認
if df[column].isna().sum() == 0:
print(f"[INFO] {column} に欠損値はありません。")
return df
# 特徴量とターゲット列のデータを準備
df_features = df[features + [column]].copy()
# One-Hot Encoding(欠損のある列は除いてエンコード)
df_encoded = pd.get_dummies(df_features[features])
# 欠損のない行(学習用)
train_df = df_encoded[df[column].notna()]
train_target = df.loc[df[column].notna(), column]
# 欠損のある行(予測対象)
test_df = df_encoded[df[column].isna()]
# KNN分類器で学習・予測
model = KNeighborsClassifier(n_neighbors=k)
model.fit(train_df, train_target)
predictions = model.predict(test_df)
# 元のDataFrameに予測結果を補完
df.loc[df[column].isna(), column] = predictions
return df
結果
実行結果
1つ目の画像が実行前だが、2つ目の実行画像のように欠損値が補完されていることを確認できた。
比較結果
処理時間について以下のような結果となった。
①初回実行時はPythonの方が処理時間が短かったが、2回目以降はJuliaの方が安定して高速だった。
②データ件数が10000件において、JuliaよりもPythonのほうが高速だった。
①の要因として、Pythonはキャッシュを利用しているため初回から速かったが、Juliaは2回目以降JITコンパイルした情報をITコンパイルしたネイティブコードを「プロセスのメモリ上」にキャッシュしているため、2回目以降の処理時間が早くなる。この違いによって、2回目以降はJuliaのほうが速かったと考えられる。
②について、データ件数が少なすぎるためJuliaの処理よりもPythonのほうが適切だった可能性がある。また、Pandasの中身はC/C++で記載されているため、大きく速度に差分が出なかったと考えられる。
まとめ
JuliaのほうがPythonよりも動作が速いと一般的に言われているが、データ件数が10000件程度ではPythonのほうが処理が速く、金融時系列分析や治療法のシミュレーションなど、大規模なデータや複雑な計算を解くためには有効のようだ。
参考資料
[1]svoboda, 『[Julia]VSCにおけるWSL2でのJulia 環境構築~サンプルコード実行まで』, https://qiita.com/svoboda/private/6a0ad624bc58a354edb3
[2]svoboda, 『[Julia]kNN実装と速度検証 Part2 (ソースコード~検証結果)』, https://qiita.com/svoboda/private/21d1562dd689992dd658
[3]JuliaHub, 『Pharmaceutical Development』, https://juliahub.com/industries/case-studies/pfizer
[4]JuliaHub, 『Julia for Banking & Finance』, https://juliahub.com/industries/banking-and-finance