Pythonにおける統計量の計算(平均, 分散, 標準偏差 など)の, データ型による相違点 

pythonでは、数列を格納する仕組みがいくつか存在する。そのうえ、平均値などの統計量を計算する文法も各データ型に応じて異なっている。
ここに、**リスト型**・**Numpyによる配列(ndarray)**・**Dataframe形式**の3つのデータ型に対して、基本統計量を計算する文法をまとめる。
## 1. リスト型の場合
### 1.0. サンプルデータの準備
```python
list_ = [1,2,3,4,5]
```
### 1.1. 総和・最大値・最小値
これらについては、組み込み関数を使えば計算できる。
```python
print(sum(list_)) # 総和
print(max(list_)) # 最大値
print(min(list_)) # 最小値
```
```python:出力
15 
5 
1 
```

### 1.2. 平均・分散・標準偏差
これらを1行で計算するには、statisticsモジュールをインポートする必要がある。

```python
import statistics
print(statistics.mean(list_)) # 平均
print(statistics.variance(list_)) # 不偏分散
print(statistics.stdev(list_)) # 不偏標準偏差
```
```:出力
3
2.5
1.5811388300841898
```

標本分散と標本標準偏差を求める場合は、以下のように計算する。ここでの標本○○の定義は、サンプルを母集団と考えたときの推定量(nで割る)とする。
```python
print(statistics.pvariance(list_)) # 標本分散
print(statistics.pstdev(list_)) # 標本標準偏差
```
```:出力
2
1.4142135623730951
```
## 2. Numpyによる配列の場合
### 2.0. サンプルデータの準備
```python
import numpy as np
array_ = np.array([1,2,3,4,5])
```
### 2.1. 総和・最大値・最小値
```python
print(np.sum(array_)) # 総和
print(np.max(array_)) # 最大値
print(np.min(array_)) # 最小値
```
```:出力
15
5
1
```
### 2.2.　平均・分散・標準偏差
```python
print(np.mean(array_)) # 平均
print(np.var(array_)) # 標本分散
print(np.std(array_)) # 標本標準偏差
```
```:出力
3.0
2.0
1.4142135623730951
```
### 2.3. パーセンタイル

```python
print(np.percentile(array_, 25)) # 第一四分位数
print(np.percentile(array_, 50)) # 中央値
print(np.percentile(array_, 75)) # 第三四分位数
print(np.percentile(array_, 95)) # 下から数えて95%の点
```
```:出力
2.0
3.0
4.0
4.8
```
### 2.4. 多次元配列に対する平均・分散・標準偏差の計算
以上は配列が1次元だった場合についての計算例であるが、2次元以上の場合では行ごと/列ごとに統計量を集計できる。第2引数のaxisを指定する。
```python
array_ = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
]) # サンプルデータの準備

print(np.mean(array_, axis = 0)) # 列ごとに集計した平均
print(np.var(array_, axis = 0)) # 列ごとに集計した標本分散
print(np.std(array_, axis = 0)) # 列ごとに集計した標本標準偏差

print(np.mean(array_, axis = 1)) # 行ごとに集計した平均
print(np.var(array_, axis = 1)) # 行ごとに集計した標本分散
print(np.std(array_, axis = 1)) # 行ごとに集計した標本標準偏差
```
```:出力
[5. 6. 7. 8.]
[10.66666667 10.66666667 10.66666667 10.66666667]
[3.26598632 3.26598632 3.26598632 3.26598632]
[ 2.5  6.5 10.5]
[1.25 1.25 1.25]
[1.11803399 1.11803399 1.11803399]
```
axisが大きくなればなるほど配列の入れ子構造の奥から計算するようになると考えればよい。
なお、axisを指定しない場合は、すべての要素について集計される。
```python
array_ = np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
]) # サンプルデータの準備

print(np.mean(array_)) # すべての要素の平均
print(np.var(array_)) # すべての要素の標本分散
print(np.std(array_)) # すべての要素の標本標準偏差
```
```:出力
6.5
11.916666666666666
3.452052529534663
```

## 3. Dataframe形式の場合
### 3.0. サンプルデータの準備
```python
import numpy as np
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [6, 7, 8, 9, 10]
})
df
```
出力：
|  | A| B|
|:--|--:|:--:|
| 1| 1| 6|
| 2| 2| 7|
| 3| 3| 8|
| 4| 4| 9|
| 5| 5| 10|

### 3.1. 総和・最大値・最小値
```python
print(df.sum()) # 総和
print(df.max()) # 最大値
print(df.min()) # 最小値
```
```:出力
A    15
B    40
dtype: int64
A     5
B    10
dtype: int64
A    1
B    6
dtype: int64
```
### 3.2. 平均・分散・標準偏差
```python
print(df.mean()) # 平均
print(df.var()) # 不偏分散
print(df.std()) # 不偏標準偏差
print(df.var(ddof = 0)) # 標本分散
print(df.std(ddof = 0)) # 標本標準偏差
```
```:出力
A    3.0
B    8.0
dtype: float64
A    2.5
B    2.5
dtype: float64
A    1.581139
B    1.581139
dtype: float64
A    2.0
B    2.0
dtype: float64
A    1.414214
B    1.414214
dtype: float64
```
### 3.3. パーセンタイル
Numpyのときと異なり、パーセンタイルの引数には0以上1以下の値を入れる。
```python
print(df.quantile(0.25)) # 第一四分位数
```
```:出力
A    2.0
B    7.0
Name: 0.25, dtype: float64
```
パーセンタイルに複数の引数を指定することによって、データフレーム形式で結果を表示することができる。
```python
df.quantile([0, 0.75, 0.99])
```
出力：
|  | A| B|
|:--|--:|:--:|
| 0.00| 1.00| 6.00|
| 0.75| 4.00| 9.00|
| 0.99| 4.96| 9.96|
### 3.4. 列を指定して集計
データフレームの列を指定して統計量を集計することもできる。
```python
print(df["A"].mean()) # 平均
print(df["A"].var()) # 不偏分散
print(df["A"].std()) # 不偏標準偏差
print(df["A"].var(ddof = 0)) # 標本分散
print(df["A"].std(ddof = 0)) # 標本標準偏差
```
```:出力
3.0
2.5
1.5811388300841898
2.0
1.4142135623730951
```