Pandas: データフレームについて--06: 統計量の計算

# 統計量の計算


```python
import numpy as np
import pandas as pd

df = pd.DataFrame({
    'a': [1, 2, 3, 4, 5],
    'b': [1.2, 3.4, 5.6, 7.8, np.nan]
})
df
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>1.2</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>3.4</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>5.6</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>7.8</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>
</div>



## 1.　主要記述統計量の算出 `describe`

    describe(percentiles=None, include=None, exclude=None, datetime_is_numeric=False)

NaN を除いた[^1]有効サンプルサイズ，平均値，標準偏差，最小値，第 1 四分位数，中央値，第 3 四分位数，最大値を求める。

[^1]: 欠損値として `pd．NA` もあるが，欠損値として扱われるのは `np.NaN` である。




```python
df.describe()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>count</th>
      <td>5.000000</td>
      <td>4.000000</td>
    </tr>
    <tr>
      <th>mean</th>
      <td>3.000000</td>
      <td>4.500000</td>
    </tr>
    <tr>
      <th>std</th>
      <td>1.581139</td>
      <td>2.840188</td>
    </tr>
    <tr>
      <th>min</th>
      <td>1.000000</td>
      <td>1.200000</td>
    </tr>
    <tr>
      <th>25%</th>
      <td>2.000000</td>
      <td>2.850000</td>
    </tr>
    <tr>
      <th>50%</th>
      <td>3.000000</td>
      <td>4.500000</td>
    </tr>
    <tr>
      <th>75%</th>
      <td>4.000000</td>
      <td>6.150000</td>
    </tr>
    <tr>
      <th>max</th>
      <td>5.000000</td>
      <td>7.800000</td>
    </tr>
  </tbody>
</table>
</div>



### 1.1.　個別の記述統計量の算出


```python
print(df.count()) # サンプルサイズ（標本の大きさ）
```

    a    5
    b    4
    dtype: int64



```python
print(df.mean()) # 平均値
```

    a    3.0
    b    4.5
    dtype: float64



```python
print(df.std()) # （不偏）標準偏差 ddof=1
```

    a    1.581139
    b    2.840188
    dtype: float64



```python
print(df.std(ddof=0)) # （不偏でない）標準偏差
```

    a    1.414214
    b    2.459675
    dtype: float64



```python
print(df.min()) # 最小値
```

    a    1.0
    b    1.2
    dtype: float64


パーセンタイル値を求める 

    quantile(q=0.5, axis: 'Axis' = 0, numeric_only: 'bool' = True,
             interpolation: 'str' = 'linear')


```python
print(df.quantile(0.25)) # 第 1 四分位数
```

    a    2.00
    b    2.85
    Name: 0.25, dtype: float64



```python
print(df.quantile(0.50)) # 中央値（第 2 四分位数）
```

    a    3.0
    b    4.5
    Name: 0.5, dtype: float64



```python
print(df.quantile(0.75)) # 第 3 四分位数
```

    a    4.00
    b    6.15
    Name: 0.75, dtype: float64



```python
print(df.quantile([0, 0.25, 0.5, 0.75, 1])) # リストで複数の指定
```

            a     b
    0.00  1.0  1.20
    0.25  2.0  2.85
    0.50  3.0  4.50
    0.75  4.0  6.15
    1.00  5.0  7.80



```python
print(df.max()) # 最大値
```

    a    5.0
    b    7.8
    dtype: float64



```python
print(df.var()) # 不偏分散 ddof=1
```

    a    2.500000
    b    8.066667
    dtype: float64



```python
print(df.var(ddof=0)) # （不偏でない）分散 ddof=0
```

    a    2.500000
    b    8.066667
    dtype: float64



```python
print(df.median()) # 中央値（第 2 四分位数）
```

    a    3.0
    b    4.5
    dtype: float64


## 2.　任意の記述統計量の算出 `aggregate`

    aggregate(func=None, axis: 'Axis' = 0, *args, **kwargs) # aggregate() == agg()
    agg は aggegate の別名（エイリアス）。別名 agg を使うことが推奨されている。

関数は `np.xxx` または `'xxx'` で指定する。

文字列で指定しなくても受け付けられる関数もあるが，一律に，文字列で指定すれば問題ない。


```python
df.agg(np.mean)
```




    a    3.0
    b    4.5
    dtype: float64




```python
df.agg('mean')
```




    a    3.0
    b    4.5
    dtype: float64



複数の関数を指定する場合は，リストで指定する。


```python
df.agg(['count', sum, min, max, 'median', 'mean', 'var', 'std'])
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>count</th>
      <td>5.000000</td>
      <td>5.000000</td>
    </tr>
    <tr>
      <th>sum</th>
      <td>15.000000</td>
      <td>18.000000</td>
    </tr>
    <tr>
      <th>min</th>
      <td>1.000000</td>
      <td>1.200000</td>
    </tr>
    <tr>
      <th>max</th>
      <td>5.000000</td>
      <td>7.800000</td>
    </tr>
    <tr>
      <th>median</th>
      <td>3.000000</td>
      <td>4.500000</td>
    </tr>
    <tr>
      <th>mean</th>
      <td>3.000000</td>
      <td>4.500000</td>
    </tr>
    <tr>
      <th>var</th>
      <td>2.500000</td>
      <td>8.066667</td>
    </tr>
    <tr>
      <th>std</th>
      <td>1.581139</td>
      <td>2.840188</td>
    </tr>
  </tbody>
</table>
</div>



`agg` の関数が引数を持つ場合の指定法。


```python
result = df.agg('quantile', q=[0, 0.25, 0.5, 0.75, 1]) # min, q1, median, q3, max
result.index = ['min', 'q1', 'median', 'q3', 'max']
result
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>min</th>
      <td>1.0</td>
      <td>1.20</td>
    </tr>
    <tr>
      <th>q1</th>
      <td>2.0</td>
      <td>2.85</td>
    </tr>
    <tr>
      <th>median</th>
      <td>3.0</td>
      <td>4.50</td>
    </tr>
    <tr>
      <th>q3</th>
      <td>4.0</td>
      <td>6.15</td>
    </tr>
    <tr>
      <th>max</th>
      <td>5.0</td>
      <td>7.80</td>
    </tr>
  </tbody>
</table>
</div>



## 3.　パーセンタイル値（クオンタイル)の算出 `quantile`

    quantile(q=0.5, axis: 'Axis' = 0, numeric_only: 'bool' = True,
             interpolation: 'str' = 'linear')



```python
df.quantile() # q=0.5
```




    a    3.0
    b    4.5
    Name: 0.5, dtype: float64




```python
df.quantile(q=[0, 0.25, 0.5, 0.75, 1])
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0.00</th>
      <td>1.0</td>
      <td>1.20</td>
    </tr>
    <tr>
      <th>0.25</th>
      <td>2.0</td>
      <td>2.85</td>
    </tr>
    <tr>
      <th>0.50</th>
      <td>3.0</td>
      <td>4.50</td>
    </tr>
    <tr>
      <th>0.75</th>
      <td>4.0</td>
      <td>6.15</td>
    </tr>
    <tr>
      <th>1.00</th>
      <td>5.0</td>
      <td>7.80</td>
    </tr>
  </tbody>
</table>
</div>



## もっと知りたい人

    help(df.describe) # Help on method describe in module pandas.core.generic
    help(df.count)    # Help on method count in module pandas.core.frame
    help(df.mean)     # Help on method mean in module pandas.core.generic
    help(df.std)      # Help on method std in module pandas.core.generic
    help(df.min)      # Help on method min in module pandas.core.generic
    help(df.quantile) # Help on method quantile in module pandas.core.frame
    help(df.max)      # Help on method max in module pandas.core.generic
    help(df.var)      # Help on method var in module pandas.core.generic
    help(df.median)   # Help on method var in module pandas.core.generic