😺

ydata-profiling の日本語化

2024/02/28に公開

困っていたこと

csv ファイルに日本語が含まれていた場合に、ydata-profiling による可視化のうち seaborn を使用して可視化している部分で、文字化け(豆腐化現象)が起こる。

import japanize_matplotlib/ を実行しても対応できなくて最初困った。

OS : Windows11
ydata-profiling のバージョン : 4.6.5

参考

https://qiita.com/yubiquita/items/9c056e175ccb085eb137
https://qiita.com/hazigin/items/77cedbb61c79eef9d4f0

解決方法

ydata_profiling がインストールされているディレクトリの visualisation/context.py と seaborn がインストールされているディレクトリの rcmod.py の中の font.sans-serif の先頭に "IPAexGothic" を追加して、カーネルを再起動。

下記は、context.py の中を書き換える例

"font.sans-serif": [
            "Arial",
            "Liberation Sans",
            "Bitstream Vera Sans",
            "sans-serif",
        ],

のようになっている部分を下記のように書き換える。

"font.sans-serif": [
            "IPAexGothic",
            "Arial",
            "Liberation Sans",
            "Bitstream Vera Sans",
            "sans-serif",
        ],

コードセル上で編集する

下記をコードセル上で実行して、カーネルを再起動。
上記で行っていたファイルに対する処理をコードで行っているだけ。

import os
import importlib.util

def japanize_ydata_profiling():

    def add_font(file_path):

        # ファイルを読み込む
        with open(file_path, 'r', encoding='utf-8') as file:
            lines = file.readlines()

        # "font.sans-serif" のリスト内に "IPAexGothic" が存在するかチェック
        ipaexgothic_present = False
        for line in lines:
            if '"font.sans-serif":' in line:
                if '"IPAexGothic"' in line:
                    ipaexgothic_present = True
                    break

        # "IPAexGothic" が存在しなければ、リストの開始に追加
        if not ipaexgothic_present:
            for i, line in enumerate(lines):
                if '"font.sans-serif": [' in line:
                    # [ の直後に "IPAexGothic", を追加
                    insertion_point = line.find('[') + 1
                    line = line[:insertion_point] + '"IPAexGothic", ' + line[insertion_point:]
                    lines[i] = line
                    break

        # 編集した内容でファイルを上書き保存
        with open(file_path, 'w', encoding='utf-8') as file:
            file.writelines(lines)

    # ydata_profiling のフォント設定を変更
    library_path = importlib.util.find_spec("ydata_profiling").origin
    library_dir = os.path.dirname(library_path)
    file_path = library_dir + '/visualisation/context.py'
    add_font(file_path)

    # seaborn のフォント設定を変更
    library_path = importlib.util.find_spec("seaborn").origin
    library_dir = os.path.dirname(library_path)
    file_path = library_dir + '/rcmod.py'
    add_font(file_path)
    print('japanize_ydata_profiling() is done')

japanize_ydata_profiling()

Discussion