偏差値を出したかったが分からなかったので調べました。
環境
The version of the notebook server is: 5.4.0
Python 3.6.4 |Anaconda custom (64-bit)| [GCC 7.2.0]
前置き
今回偏差値を出しますが、分析対象のデータがすべてあるので
「母分散・母標準偏差」となります。
データ
id | name | score |
---|---|---|
1 | A | 45 |
2 | B | 32 |
3 | C | 67 |
4 | D | 40 |
5 | E | 55 |
ソース
import pandas as pd
df = pd.read_csv('./data.csv')
# dict = {'id': [1, 2, 3, 4, 5], 'name': ['A','B','C','D','E'], 'score': [45, 32, 67, 40, 55]}
# df = pd.DataFrame.from_dict(dict)
df_score = df['score']
df_score_std = df_score.std(ddof=0)
df_score_mean = df_score.mean()
df['DeviationValue'] = df_score.map(lambda x: round((x - df_score_mean) / df_score_std * 10 + 50)).astype(int)
df
説明
pandasをimportしてdfにcsvを読み込みます。
写経する場合csvを作るのも面倒なのでDataFrameをdictから作ります。
import pandas as pd
df = pd.read_csv('./data.csv')
# dict = {'id': [1, 2, 3, 4, 5], 'name': ['A','B','C','D','E'], 'score': [45, 32, 67, 40, 55]}
# df = pd.DataFrame.from_dict(dict)
対象のカラムを指定してdf_scoreという名前のSeriesを作ります
df_score = df['score']
まず標準偏差を求めますが、引数に何も指定しない場合(デフォルト)は不偏分散・不偏標準偏差の計算になります。
そこで ddof=0 という引数を指定して母分散・母標準偏差の計算にする必要があります。
df_score_std = df_score.std(ddof=0)
次に平均値を求めます。
df_score_mean = df_score.mean()
偏差値の求め方は下記となります
偏差値 = (得点 − 平均点) ÷ 標準偏差 × 10 + 50
df['DeviationValue'] = df_score.map(lambda x: round((x - df_score_mean) / df_score_std * 10 + 50)).astype(int)
ここがわかりづらいのでもう少し詳しく書くと
df_score.mapはSeriesの各要素に対して自分で定義した関数を適用する関数です。
lambdaはlambda式というPythonの無名関数です
lambda 引数:処理内容
少し式を分解しないとわかりづらいのでfor文で書くとこうなります
dfをイテレートしながら偏差値を計算し、リストに追加していきます。
その後Seriesに変換してDataFrameと結合しています。
# lambda x: round((x - df_score_mean) / df_score_std * 10 + 50)).astype(int)
dv_ary = []
for index, row in df.iterrows():
x = row['score']
a = (x - df_score_mean) / df_score_std * 10 + 50
b = round(a)
dv_ary.append(b)
# Seriesに変換
dv = pd.Series(dv_ary).astype(int)
# DataFrameと結合
df['DeviationValue'] = dv
結果
id | name | score | DeviationValue |
---|---|---|---|
1 | A | 45 | 48 |
2 | B | 32 | 37 |
3 | C | 67 | 66 |
4 | D | 40 | 44 |
5 | E | 55 | 56 |
参考
https://www.sejuku.net/blog/23677
https://note.nkmk.me/python-pandas-dataframe-for-iteration/
https://it-engineer-lab.com/archives/1065
https://note.nkmk.me/python-pandas-map-applymap-apply/