ML-統計によるデータの理解

前書き

機械学習プロジェクトで作業している間、通常、次の2つの最も重要な部分を無視します。 mathematics そして data。これは、MLがデータ駆動型のアプローチであり、MLモデルが提供したデータと同じくらい良い結果または悪い結果しか生成しないことがわかっているためです。

前の章では、CSVデータをMLプロジェクトにアップロードする方法について説明しましたが、アップロードする前にデータを理解しておくとよいでしょう。データは、統計と視覚化の2つの方法で理解できます。

この章では、次のPythonレシピを使用して、統計を使用してMLデータを理解します。

生データを見る

最初のレシピは、生データを確認するためのものです。生データを見た後に得られる洞察は、MLプロジェクトのデータの処理だけでなく、より良い前処理の可能性を高めるため、生データを見ることが重要です。

以下は、ピマインディアンの糖尿病データセットで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データフレームにshapeプロパティを出力することによって実装されたPythonスクリプトです。行と列の総数を取得するために、アイリスデータセットに実装します。

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)

出力

(150, 4)

出力から、使用するアイリスデータセットが150行4列であることが簡単にわかります。

各属性のデータ型の取得

各属性のデータ型を知ることは、もう1つの良い習慣です。背後にある理由は、要件に従って、あるデータ型を別のデータ型に変換する必要がある場合があるためです。たとえば、カテゴリ値または順序値を表すために、文字列を浮動小数点またはintに変換する必要がある場合があります。生データを見ることで属性のデータ型を知ることができますが、別の方法はPandasDataFrameの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つの統計プロパティをさらに提供します。

  • Count
  • 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

上記の出力から、ピマインディアン糖尿病データセットのデータの統計的要約とデータの形状を観察できます。

クラス分布の確認

クラス分布統計は、クラス値のバランスを知る必要がある分類問題で役立ちます。クラス値の分布を知ることは重要です。なぜなら、クラス分布のバランスが非常に悪い場合、つまり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つの値を持つことができます-

  • Coefficient value = 1 −それは完全を表します positive 変数間の相関。

  • Coefficient value = -1 −それは完全を表します negative 変数間の相関。

  • Coefficient value = 0 −それは no 変数間の相関関係。

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

上記の出力から、正または負のスキューが観察されます。値がゼロに近い場合、スキューが少なくなります。