PythonでCAP曲線を描く

pyodbc, pandas, numpy, matplotlib を使ってCAP曲線を描いてみます。一般にCAP曲線はロジスティック回帰等で算出したスコアでデータを降順にソートし実際に真偽でイベントの発生を評価して書けますから以下のようになるかと思います。

import pandas
import pyodbc
import numpy
import pylab as pyl
from scipy import integrate

conn = pyodbc.connect('DSN=source')

dataSet = pandas.read_sql('SELECT * FROM TF_SCORES ORDER BY SCORE DESC',conn)

num_deads = numpy.sum(dataSet['IS_DEAD'])
num_count = len(dataSet)

rate_deads = float(num_defaults) / float(num_count)

ideal         = pandas.DataFrame({'x':[0,rate_defaults,1],'y':[0,1,1]})
x             = numpy.arange(num_count) / float(num_count - 1)
y             = numpy.cumsum(dataSet['IS_DEAD']) / float(num_deads)
sigma_ideal   = 1 * x[num_deads - 1 ] / 2 + (x[num_count - 1] - x[num_deads]) * 1
sigma_model   = integrate.simps(y,x)
sigma_random  = integrate.simps(x,x)

ar_value      = (sigma_model - sigma_random) / (sigma_ideal - sigma_random)
ar_label      = 'ar value = %s' % ar_value

pyl.hold(True)
pyl.plot(ideal['x'],ideal['y'])
pyl.plot(x,y)
pyl.plot(x,x)
pyl.legend(('Ideal','Model','Random'),'lower right')
pyl.suptitle('CAP curve')
pyl.xlabel('sample')
pyl.ylabel('death detection')
pyl.text(0.3, 0.5, ar_label)

pyl.show()

コメントを残す