新着記事一覧

IT・プログラミング Python

2024/4/21

【Python】Pythonでの自然言語処理(日本語)

こちらの記事では、自然言語処理についてまとめています。 Contents1 自然言語処理とは?2 自然言語処理の実装 自然言語処理とは? 自然言語とは、日本語や英語のような自然発生的に生まれた言語です。日常的に使用している自然言語について、言葉が持つ意味を解析し処理します。活用事例としては、チャットボット、音声認識AI、文字認識(手書き文字をカメラが認識し文字データへと変換する技術)、検索エンジン、翻訳、感情分析、文章要約などがあります。 文章の意味を機械に理解させるには、単語分割を行う必要があります。手 ...

続きを読む

IT・プログラミング Python

2024/4/8

【Python】統計学的モデル 時系列分析の実装

こちらの記事では、時系列分析の実装についてまとめています。 Contents1 時系列分析とは?2 定常性とは?3 時系列データの分析方法4 SARIMAモデルの実装 時系列分析とは? 時系列分析では、時間経過とともに変化する時系列データを扱います。時系列データの例としては、毎時間の気温、株価の推移等がこれにあたります。売上予測、来店者予測等、ビジネスにおいて重要な分析技術です。 時系列データには以下3種類があります。 1.トレンドデータの長期的な傾向。時間の経過とともに値が上昇・下降している時系列データ ...

続きを読む

IT・プログラミング Python

2024/4/1

【Python】主成分分析の実装

こちらの記事では、主成分分析を実装していきます。 Contents1 主成分分析とは2 主成分分析の手順について 主成分分析とは 主成分分析とは、次元削減を行う時によく使う手法です。例えば、いくつかの特徴量があるデータを2次元データに変換すると、できるだけ情報を保ったまま2軸での描画が可能になり、全てのデータを見やすく示すことができます。 主成分分析の実用例として、製品やサービスのスコアリングや比較(1次元に圧縮)、データの可視化(2,3次元に圧縮)、回帰分析の前処理などが挙げられます。 主成分分析の手順 ...

続きを読む

IT・プログラミング Python

2024/4/1

【Python】カーネル主成分分析の実装

こちらの記事では、カーネル主成分分析の手順についてまとめています。 Contents1 カーネル主成分分析とは2 カーネル主成分分析の実装 カーネル主成分分析とは 回帰分析等、機械学習の多くのアルゴリズムは線形分離できるデータが与えられることを前提としていますが、現実的には線形分離できないデータ、つまり非線形分離する必要があるデータがほとんどです。非線形分離する必要があるデータに対処できるのが、カーネル主成分分析(kernel PCA)です。 カーネル主成分分析ではN×M(データの数×特徴の種類)のデータ ...

続きを読む

IT・プログラミング Python

2024/3/29

【Python】機械学習(教師なし) クラスタリング DBSCANの実装

こちらの記事では、機械学習(教師なし)の非階層的クラスタリング DBSCAN法についてまとめていきます。 Contents1 クラスタリングとは2 DBSCANでの実装 クラスタリングとは データをクラスター(塊)に分割する操作のことです。クラスタリングの中でも階層的クラスタリングと、非階層的クラスタリングの2種に分けられています。 1.階層的クラスタリングデータの中から最も似ている組み合わせを探し出して、順番にクラスターにしていく方法です。最終的に全データをまとめるクラスターに行くつけば終了です。 2. ...

続きを読む

IT・プログラミング Python

2024/3/28

【Python】機械学習(教師なし) クラスタリング k-meansの実装

こちらの記事では、機械学習(教師なし)の非階層的クラスタリング k-means法についてまとめていきます。 Contents1 クラスタリングとは2 k-means法での実装 クラスタリングとは データをクラスター(塊)に分割する操作のことです。クラスタリングの中でも階層的クラスタリングと、非階層的クラスタリングの2種に分けられています。 1.階層的クラスタリングデータの中から最も似ている組み合わせを探し出して、順番にクラスターにしていく方法です。最終的に全データをまとめるクラスターに行くつけば終了です。 ...

続きを読む

IT・プログラミング Python

2024/3/28

【Python】機械学習のデータ前処理 外れ値の扱いについて

外れ値の処理についてまとめています。 Contents1 外れ値とは?2 外れ値の検知方法について 外れ値とは? 外れ値とは、他のデータと著しく乖離したデータのことを指します。データ内に外れ値が混在していると、分析結果に影響を及ぼしたり、機械学習モデルの学習過程で影響がでてしまい学習が進みにくくなる、などの影響が出てしまいます。 外れ値の検知方法について 外れ値の検知方法について、可視化、LOF(Local Outlier Factor )、Isolation Forestの3つの手法について紹 ...

続きを読む

IT・プログラミング Python

【Python】機械学習のデータ前処理 欠損値の扱いについて

こちらの記事では、欠損値の処理について紹介していきます。

欠損値が発生するケースと対応について

機械学習において欠損値がある場合は前処理が必要になります。前処理を行わないと、統計情報が正しく計算できなかったり、適切に分析ができません。
以下のようなケースで欠損値が発生します。

1.MCAR(Missing Completely At Random)
あるデータが欠損する確率がデータと全く無関係である場合。例えば、アンケート結果を記録したファイルが、不具合で欠損値になってしまった場合等があります。
欠損値が無作為に発生しているので、リストワイズ削除(欠損値が含まれるデータ行を全て削除する方法)で処理してもデータに偏りが発生することはありません。ただ、削除することによりデータ件数が大幅に減ってしまう場合は、代入法を使った欠損値の補完を行うこともできます。

2.MAR(Missing At Random)
ある因子が欠損値となるかどうかがその因子自体とは関係ありませんが、その他の因子と関係がある場合。例えば高齢であればあるほど収入に関数データを報告しない(=つまり欠損)が、収入の高さは報告の有無に関係しないといった場合です。
この場合、リストワイズ削除(欠損値が含まれるデータ行を全て削除する方法)で処理をするとデータに偏りがでる可能性があります。観測されたデータから欠損値に入る真の値を予測する代入法で欠損値を補完したほうがよいです。

3.NMAR(Not Missing At Random)
ある項目が欠損する確率がその項目そのものに依存し、その項目以外のデータ項目からもその欠損している項目の欠損率を推測できない場合。例えば、アンケートで年齢が高くなるほど年齢に関して答えなくなり、しかも男性・女性であるかが年齢の欠損には影響しておらず、性別の値からも予測はできない、という場合です。
上述の通り、他のデータ項目からも欠損値を推測できないので、基本的にはデータの再収集を検討する必要があります。

欠損値の代入法について

欠損値の代入法は大きく2種あります。

単一代入法

平均値代入法、確率的回帰代入法、ホットデック法を使って、欠損値を補完して完全なデータセットを1セットだけ作る方法です。

・平均値代入法:欠損しているデータ項目の平均値がわかればいい場合に使います。平均値を持つデータが増える分、対象データ項目の分散が小さくなり、分散や誤差を分析の考慮に入れたい場合は使えません。

・確率的回帰代入法
欠損しているデータ項目の分散をデータ分析で考慮にいれたい場合に使います。

・ホットデック法
質的データが多く、回帰等でパラメトリックに代入値を計算しにくい場合に使用します。

多重代入法

観測されたデータから欠損値を予測して、補完した状態を1セットとし、このセットを複数(=つまり多重)作成し、各セットごとに分析モデルを構築し、個別に構築したモデルを最終的に統合する方法です。

今回は、単一代入法であるホットデック法と、多重代入法を実装してみたいと思います。

ホットデック法の実装

#必要なライブラリをインポートする
import pandas as pd
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
import missingno as msno
import knnimpute as knnimp

#Excelを読みこみ、データと欠損値を確認する
data = pd.read_excel("sampledata.xlsx")
print(data)
data.isnull().sum()

#欠損値を可視化する
msno.matrix(data)
plt.show()

#ホットデック法で欠損値を補完する
matrix = data.values
missing_mask = np.isnan(matrix)
result = knnimp.knn_impute_few_observed(matrix, missing_mask, 3)
pd.DataFrame(result, columns = data.columns)

解説

#必要なライブラリをインポートする
import pandas as pd
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
import missingno as msno
import knnimpute as knnimp

#Excelを読みこみ、データと欠損値を確認する
data = pd.read_excel("sampledata.xlsx")
print(data.isnull().sum())
data

まず必要なライブラリをインポートし、サンプルで用意したExcelを読み込み、欠損値を確認します。今回は3カラムのサンプルデータです。
タイムに5つ欠損値があることがわかります。

#欠損値を可視化する
msno.matrix(data)
plt.show()

欠損値を可視化してみます。白い部分が欠損値です。
カラム名が日本語だったのでうまく表示されていないようですが、白い部分がある真ん中の列がタイムです。5か所白い部分=欠損値があります。

#ホットデック法で欠損値を補完する
matrix = data.values
missing_mask = np.isnan(matrix)
result = knnimp.knn_impute_few_observed(matrix, missing_mask, 3)
pd.DataFrame(result, columns = data.columns)

matrix = data.valuesでdataをNumpyの行列に変換し、"matrix"に代入します。
次に、missing_mask = np.isnan(matrix)でmatrix内の欠損値を検出し、それらの位置に対する要素が"True"であるブール型の行列を作成します。
missing_maskを表示させると以下のようになります。

result = knnimp.knn_impute_few_observed(matrix, missing_mask, 3)で、KNNアルゴリズムを用いて欠損値を補完します。
knn_impute_few_observed関数は、欠損値の数が少ない場合に使用されることが多いです。(欠損値が多い場合には向かない・・・
引数3は補完に使用される最近傍の観測値の数を指定します。
pd.DataFrame(result, columns=data.columns)は、補完された結果をdataFrameに変換し、元のデータフレームと同じカラム名を持つようにしています。中身を確認すると、欠損値が補完できていることがわかります。

多重代入法の実装

#必要なライブラリのインポート
import pandas as pd
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.imputation import mice

#Excelを読みこみ、データと欠損値を確認する
data = pd.read_excel("sampledata.xlsx")
print(data)
data.isnull().sum()

#多重代入法で欠損値を補完する
imp_data = mice.MICEData(data)
formula = "評価 ~ タイム + 距離"

#多重代入法のモデルを構築する
model = mice.MICE(formula, sm.OLS, imp_data)

#試行回数3回、データセットの作成は3回という意味
results = model.fit(3,3)
print(results.summary())

#補完した値を含むデータフレームを取得
completed_data = imp_data.data

# 補完されたデータを表示する
print(completed_data)

まず必要なライブラリをインポートし、サンプルで用意したExcelを読み込み、欠損値を確認します。今回は3カラムのサンプルデータです。
タイムに5つ欠損値があることがわかります。

#多重代入法で欠損値を補完する
imp_data = mice.MICEData(data)
formula = "評価 ~ タイム + 距離"

多重代入法(Multiple Imputation by Chained Equations)を使用して欠損値を補完するための準備を行います。

imp_data = mice.MICEData(data)にて、dataを多重代入法のオブジェクトに変換し、欠損値の補完が可能なデータ形式に整えます。
formula = "評価 ~ タイム + 距離"では、多重代入法のモデル式を指定します。評価を目的変数、タイム・距離を説明変数としてモデルを構築しています。

#多重代入法のモデルを構築する
model = mice.MICE(formula, sm.OLS, imp_data)

多重代入法のモデルを構築します。引数として、上で指定したformura式を指定。
sm.OLSは補完に使用されるモデルを指定しています。ここではstatsmodelsの最小二乗法(Ordinaly Least Squares, OLS)を使用しています。
他にも代表的なものとして、一般化線形モデル:sm.GLS(Generalized Linear Model、GLM)、ロバスト線形モデル:sm.RLM(Robust Linear Model、RLM)、重みつき最小二乗法:sm.WLS(Weighted Least Squares、WLS)などがあります。
最後にimp_dataを入れ、これに基づき補完モデルが構築されます。

#多重代入法モデルを実行し、欠損値の補完を行う
results = model.fit(3,3)
print(results.summary())

MICEを三回試行し、データセットを3回作成し、result.summary()で結果の統計量を確認してみます。

#補完した値を含むデータフレームを取得
completed_data = imp_data.data

# 補完されたデータを表示する
print(completed_data)

最後にMICEで補完された値を含むデータフレームを取得し、中身を確認してみます。補完できました。

  • この記事を書いた人

Haru

会社員。2回目の育休から仕事復帰。
職種は海外営業。
育休の過ごし方、育児、家事、プログラミング勉強について発信しています。

-IT・プログラミング, Python
-, ,