LoginSignup
10
11

More than 5 years have passed since last update.

Pandasで偏差値を出す

Last updated at Posted at 2018-06-14

偏差値を出したかったが分からなかったので調べました。

環境

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/

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11