변수의 스케일을 0-100으로 변경


20

PCA 기술을 사용하여 소셜 자본 지수를 구성했습니다. 이 지수는 양수와 음수 값으로 구성됩니다. 해석하기 쉽도록이 인덱스를 0-100 스케일로 변환 / 변환하고 싶습니다. 가장 쉬운 방법을 제안하십시오.



물류 기능 로짓 모델에 사용도 유용하게 사용할 수 있습니다. 특정 목적에 따라 다릅니다.
Ondrej

2
기존 데이터를 0-100으로 조정하면 향후 (또는 추가) 데이터에 적용될 때 숨겨진 위험이 있습니다. 참조 consumerreports.org/cro/cars/...를 컨슈머 리포트는 "쓴 곳 ... 우리가 곤경에 직면, 예를 들어, : 테슬라가 처음 정의 (100)를지나 가지 않는 소비자 리포트 '평가 시스템, 103을 얻었습니다. 자동차는 새로운 기준을 세웠 기 때문에 점수를 변경해야했습니다. "
whuber

답변:


33

관찰 된 및 값을 가진 모든 변수 (단 변량 분포) (또는 값에 대해 사전 설정된 잠재적 한계 일 수 있음)는 다음 공식에 의해 에서 범위로 재조정 될 수 있습니다 .m i n o l d m a x o l d m i n n e w m a x n e wV나는영형에이엑스영형나는이자형에이엑스이자형

에이엑스이자형나는이자형에이엑스영형나는영형(V에이엑스영형)+에이엑스이자형

또는

에이엑스이자형나는이자형에이엑스영형나는영형(V나는영형)+나는이자형 .


18

R의 경우 scales 패키지 rescale에서 이미 사용 가능한 기능 이 있습니다 .

library(scales)
rescale(c(-10, -9, -5, 2, 6), to = c(0, 100)) ## Use scales:::rescale() if you have several packages loaded using the same function name
[1]   0.00   6.25  31.25  75.00 100.00

7

먼저 몇 가지 예제 데이터를 얻습니다.

x <- runif(20, -10, 10)

다음은 R에서 작동하는 두 가지 기능입니다.

rescale <- function(x) (x-min(x))/(max(x) - min(x)) * 100
rescale(x)

또는 다른 변환을 사용할 수 있습니다. 예를 들어, 로짓 변환은 @ondrej에 의해 언급되었습니다.

plogis(x)*100

또는 다른 변형 :

pnorm(x)*100
pnorm(x, 0, 100) * 100
punif(x, min(x), max(x))*100

4

ttnphnss의 답변에 추가하기 위해이 프로세스를 Python으로 구현하려면 (예 :)이 함수는 트릭을 수행합니다.

from __future__ import division

def rescale(values, new_min = 0, new_max = 100):
    output = []
    old_min, old_max = min(values), max(values)

    for v in values:
        new_v = (new_max - new_min) / (old_max - old_min) * (v - old_min) + new_min
        output.append(new_v)

    return output

print rescale([1, 2, 3, 4, 5])
# [0.0, 25.0, 50.0, 75.0, 100.0]

고마워,이 수식은 음수 값에도 적용됩니까 ?? 예를 들어, 원래 변수의 범위가 -10 ~ 10 인 경우.
Sohail Akram

예-모든 값에 적용됩니다 (예 : print rescale([-10, -9, -5, 2, 6]) # [0.0, 6.25, 31.25, 75.0, 100.0]
Andrew Tulloch

3

해석을 향상시키지 않고 오히려 어렵게 만들기 때문에 인덱스를 0-100 간격에 바인딩하지 않는 것이 좋습니다. 인덱스 구성 요소가 음수가 될 수 있다면 인덱스가 음이 될 가능성이 있으며 0-100 범위의 일부 낮은 값보다 구성 요소에서 발생하는 일을 반영한다고 생각합니다.


0

표준 패키지가로드 된 R의 경우 'base'패키지에서 scale ()을 사용할 수 있습니다.

x=c(2,4,8,16)
x.scaled = scale(x,FALSE,max(x))  # divide each value in x by max(x)
x.scaled = as.vector(x.scaled) 

'as.vector ()'를 사용하여 스케일 된 x를 벡터로 검색하십시오.


3
원래 값은 음수 일 수 있으므로 가장 큰 값으로 나누는 것만으로는 충분하지 않습니다. David와 Mikko가 이미 그 측면을 고려한 답변을 게시했다는 점을 감안할 때, 엄지 손가락을 올리려면 일반적으로 답변이하지 않은 것에 기여해야합니다.
Glen_b-복지 주 모니카

당신은 절대적으로 맞습니다. 죄송합니다.
user161922
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.