Machine-learning-with-python-understanding-data-with-statistics
ML-統計を使用したデータの理解
前書き
機械学習プロジェクトでの作業中、通常、 _ mathematics_ および data と呼ばれる2つの最も重要な部分を無視します。 MLはデータ駆動型のアプローチであり、MLモデルが提供するデータと同じくらい良い結果か悪い結果しか生成しないためです。
前の章では、CSVデータをMLプロジェクトにアップロードする方法について説明しましたが、アップロードする前にデータを理解しておくとよいでしょう。 統計と視覚化の2つの方法でデータを理解できます。
この章では、Pythonのレシピに従うことで、MLデータと統計を理解します。
生データを見る
最初のレシピは、生データを見るためのものです。 生データを見ることで得られる洞察は、MLプロジェクトのデータの処理だけでなく、前処理を改善する可能性を高めるため、生データを見ることが重要です。
以下は、Pima Indians糖尿病データセットでPandas DataFrameのhead()関数を使用して実装されたPythonスクリプトで、最初の50行を見て理解を深めます-
例
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
print(data.head(50))
出力
preg plas pres skin test mass pedi age class
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
5 5 116 74 0 0 25.6 0.201 30 0
6 3 78 50 32 88 31.0 0.248 26 1
7 10 115 0 0 0 35.3 0.134 29 0
8 2 197 70 45 543 30.5 0.158 53 1
9 8 125 96 0 0 0.0 0.232 54 1
10 4 110 92 0 0 37.6 0.191 30 0
11 10 168 74 0 0 38.0 0.537 34 1
12 10 139 80 0 0 27.1 1.441 57 0
13 1 189 60 23 846 30.1 0.398 59 1
14 5 166 72 19 175 25.8 0.587 51 1
15 7 100 0 0 0 30.0 0.484 32 1
16 0 118 84 47 230 45.8 0.551 31 1
17 7 107 74 0 0 29.6 0.254 31 1
18 1 103 30 38 83 43.3 0.183 33 0
19 1 115 70 30 96 34.6 0.529 32 1
20 3 126 88 41 235 39.3 0.704 27 0
21 8 99 84 0 0 35.4 0.388 50 0
22 7 196 90 0 0 39.8 0.451 41 1
23 9 119 80 35 0 29.0 0.263 29 1
24 11 143 94 33 146 36.6 0.254 51 1
25 10 125 70 26 115 31.1 0.205 41 1
26 7 147 76 0 0 39.4 0.257 43 1
27 1 97 66 15 140 23.2 0.487 22 0
28 13 145 82 19 110 22.2 0.245 57 0
29 5 117 92 0 0 34.1 0.337 38 0
30 5 109 75 26 0 36.0 0.546 60 0
31 3 158 76 36 245 31.6 0.851 28 1
32 3 88 58 11 54 24.8 0.267 22 0
33 6 92 92 0 0 19.9 0.188 28 0
34 10 122 78 31 0 27.6 0.512 45 0
35 4 103 60 33 192 24.0 0.966 33 0
36 11 138 76 0 0 33.2 0.420 35 0
37 9 102 76 37 0 32.9 0.665 46 1
38 2 90 68 42 0 38.2 0.503 27 1
39 4 111 72 47 207 37.1 1.390 56 1
40 3 180 64 25 70 34.0 0.271 26 0
41 7 133 84 0 0 40.2 0.696 37 0
42 7 106 92 18 0 22.7 0.235 48 0
43 9 171 110 24 240 45.4 0.721 54 1
44 7 159 64 0 0 27.4 0.294 40 0
45 0 180 66 39 0 42.0 1.893 25 1
46 1 146 56 0 0 29.7 0.564 29 0
47 2 71 70 27 0 28.0 0.586 22 0
48 7 103 66 32 0 39.1 0.344 31 1
49 7 105 0 0 0 0.0 0.305 24 0
上記の出力から、最初の列が行番号を示していることがわかります。これは特定の観測を参照するのに非常に役立ちます。
データの次元の確認
MLプロジェクトで使用している行と列のデータ量を知ることは常に良い習慣です。 背後にある理由は-
- 行と列が多すぎる場合、アルゴリズムの実行とモデルのトレーニングに時間がかかると仮定します。
- 行と列が少なすぎると、モデルを適切にトレーニングするのに十分なデータがないと仮定します。
以下は、Pandas Data Frameのshapeプロパティを印刷することによって実装されたPythonスクリプトです。 その中の行と列の総数を取得するために、虹彩データセットに実装します。
例
from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)
出力
(150, 4)
出力から、使用するアヤメのデータセットが150行4列であることが簡単にわかります。
各属性のデータ型の取得
各属性のデータ型を知ることは、別の良い習慣です。 その理由は、要件に従って、あるデータ型を別のデータ型に変換する必要がある場合があるためです。 たとえば、カテゴリ値または順序値を表すために、文字列を浮動小数点または整数に変換する必要がある場合があります。 生データを見ると、属性のデータ型について知ることができますが、別の方法は、Pandas DataFrameの_dtypes_プロパティを使用することです _dtypes_プロパティの助けを借りて、各属性のデータ型を分類できます。 それは、次のPythonスクリプトの助けを借りて理解することができます-
例
from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.dtypes)
出力
sepal_length float64
sepal_width float64
petal_length float64
petal_width float64
dtype: object
上記の出力から、各属性のデータ型を簡単に取得できます。
データの統計的要約
形状を取得するためのPythonレシピについて説明しました。 データの行と列の数ですが、そのデータの形状から概要を確認する必要がある場合が多くあります。 それは、Pandas DataFrameの_describe()_関数の助けを借りて行うことができます。これは、各データ属性のすべての次の8つの統計プロパティを提供します-
- カウント
- Mean
- 標準偏差
- 最小値
- 最大値
- 25%
- 中央値、つまり 50%
- 75%
例
from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
print(data.shape)
print(data.describe())
出力
(768, 9)
preg plas pres skin test mass pedi age class
count 768.00 768.00 768.00 768.00 768.00 768.00 768.00 768.00 768.00
mean 3.85 120.89 69.11 20.54 79.80 31.99 0.47 33.24 0.35
std 3.37 31.97 19.36 15.95 115.24 7.88 0.33 11.76 0.48
min 0.00 0.00 0.00 0.00 0.00 0.00 0.08 21.00 0.00
25% 1.00 99.00 62.00 0.00 0.00 27.30 0.24 24.00 0.00
50% 3.00 117.00 72.00 23.00 30.50 32.00 0.37 29.00 0.00
75% 6.00 140.25 80.00 32.00 127.25 36.60 0.63 41.00 1.00
max 17.00 199.00 122.00 99.00 846.00 67.10 2.42 81.00 1.00
上記の出力から、Pima Indian Diabetesデータセットのデータの統計的要約をデータの形状とともに観察できます。
クラス分布の確認
クラス分布統計は、クラス値のバランスを知る必要がある分類問題で役立ちます。 クラス値の分布を知ることは重要です。なぜなら、クラス分布が非常に不均衡な場合、つまり 1つのクラスが他のクラスよりも多くの観測値を持っている場合、MLプロジェクトのデータ準備段階で特別な処理が必要になる場合があります。 Pandas DataFrameの助けを借りて、Pythonでクラス分布を簡単に取得できます。
例
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
count_class = data.groupby('class').size()
print(count_class)
出力
Class
0 500
1 268
dtype: int64
上記の出力から、クラス0の観測値の数はクラス1の観測値の数のほぼ2倍であることが明確にわかります。
属性間の相関の確認
2つの変数間の関係は相関と呼ばれます。 統計では、相関を計算するための最も一般的な方法は、ピアソンの相関係数です。 次のように3つの値を持つことができます-
- *係数値= 1 *-変数間の完全な*正の*相関を表します。
- *係数値= -1 *-変数間の完全な*負*相関を表します。
- *係数値= 0 *-変数間の相関がまったくないことを表します。
高度に相関する属性がある場合、線形回帰やロジスティック回帰などの一部の機械学習アルゴリズムのパフォーマンスが低下するため、データセットの属性のペアワイズ相関をMLプロジェクトに使用する前に確認することは常に有効です。 Pythonでは、Pandas DataFrameの_corr()_関数を使用して、データセット属性の相関行列を簡単に計算できます。
例
from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
correlations = data.corr(method='pearson')
print(correlations)
出力
preg plas pres skin test mass pedi age class
preg 1.00 0.13 0.14 -0.08 -0.07 0.02 -0.03 0.54 0.22
plas 0.13 1.00 0.15 0.06 0.33 0.22 0.14 0.26 0.47
pres 0.14 0.15 1.00 0.21 0.09 0.28 0.04 0.24 0.07
skin -0.08 0.06 0.21 1.00 0.44 0.39 0.18 -0.11 0.07
test -0.07 0.33 0.09 0.44 1.00 0.20 0.19 -0.04 0.13
mass 0.02 0.22 0.28 0.39 0.20 1.00 0.14 0.04 0.29
pedi -0.03 0.14 0.04 0.18 0.19 0.14 1.00 0.03 0.17
age 0.54 0.26 0.24 -0.11 -0.04 0.04 0.03 1.00 0.24
class 0.22 0.47 0.07 0.07 0.13 0.29 0.17 0.24 1.00
上記の出力のマトリックスは、データセット内の属性のすべてのペア間の相関関係を示しています。
属性分布のスキューの確認
歪度は、ガウス分布であると想定されるが、ある方向または別の方向、または左または右のいずれかに歪んだりシフトしたように見える分布として定義できます。 属性の歪度を確認することは、次の理由により重要なタスクの1つです-
- モデルの精度を高めるために、データに歪みが存在する場合は、データ準備段階での修正が必要です。
- ほとんどのMLアルゴリズムは、データがガウス分布を持っていることを前提としています。 通常のベル曲線データ。
Pythonでは、Pandas DataFrameで* skew()*関数を使用して、各属性のスキューを簡単に計算できます。
例
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
print(data.skew())
出力
preg 0.90
plas 0.17
pres -1.84
skin 0.11
test 2.27
mass -0.43
pedi 1.92
age 1.13
class 0.64
dtype: float64
上記の出力から、正または負のスキューが観察できます。 値がゼロに近い場合、スキューは少なくなります。