Recent Activity
Hello, I am trying to generate a 3D chart for percent and need some help to finalize it. I have tried several things and am not able to remove the extra points in the axis1. I would also like to: Add the percent inside each bar values are 50/ 18/32 datalines; ID Greetings 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 2 13 2 14 2 15 3 16 3 17 3 18 3 19 3 20 3 21 3 22 . 23 . 24 . 25 2 ; I am using this code to generate a percent graph and wanted it to be a 3D graph. Proc format; Value Gre 1 = 'Hello' 2 = 'Hi' 3 = 'Dear'; run; Data want; Set have; Format Greetings Gre. ; run; proc Gchart Data=have; vbar3d Greetings / TYPE=PERCENT; axis1 order=(1 2 3); *not sure why this does not work; run; Thank you so much!
... View more

0
2
My code is below: what should I change if I want all 8 subjids in one page in a matrix ? proc template; define style styles.mystyle; parent=styles.default; class titlesandfooters/ color=black backgroundcolor=white; class body, data / fontfamily="Courier new" fontsize=8pt backgroundcolor=white color=black; style GraphFonts / 'GraphDataFont' = ("Courier new", 8pt) 'GraphUnicodeFont' = ("Courier new", 8pt) 'GraphValueFont' = ("Courier new", 8pt) 'GraphLabelFont' = ("Courier new", 8pt) 'GraphFootnoteFont' = ("Courier new", 8pt) 'GraphTitleFont' = ("Courier new", 8pt) 'GraphAnnoFont' = ("Courier new", 8pt) 'NodeLinkLabelFont' = ("Courier new", 8pt) 'GraphLabel2Font' = ("Courier new", 8pt) 'GraphTitle1Font' = ("Courier new", 8pt) 'NodeTitleFont' = ("Courier new", 8pt) 'NodeLabelFont' = ("Courier new", 8pt) 'NodeInputLabelFont' = ("Courier new", 8pt) 'NodeDetailFont' = ("Courier new", 8pt) ; style fonts / 'footFont' = ("Courier new",8pt) 'docFont' = ("Courier new",8pt) 'headingFont' = ("Courier new",8pt) 'headingEmphasisFont' = ("Courier new",11pt,bold italic) 'FixedFont' = ("Courier new",2) 'BatchFixedFont' = ("SAS Monospace, Courier",2) 'FixedHeadingFont' = ("Courier new",2) 'FixedStrongFont' = ("Courier new",2,bold) 'FixedEmphasisFont' = ("Courier new",2,italic) 'EmphasisFont' = ("Courier new",8pt,italic) 'StrongFont' = ("Courier new",8pt,bold) 'TitleFont' = ("Courier new",9pt) 'TitleFont2' = ("Courier new",11pt,bold italic); style GraphData1 from GraphData1 / contrastcolor=blue linestyle=2; style GraphData2 from GraphData2 / contrastcolor=red linestyle=1; style GraphData3 from GraphData3 / contrastcolor=green linestyle=2; style GraphData4 from GraphData4 / contrastcolor=green linestyle=1; end; run; ods listing close; OPTIONS nobyline nodate nonumber center orientation=landscape pagesize=max; ods rtf file='G:\Statistical Programming\Lonigutamab\TED\421-01-02\Inbound\Internal\Cohort 2 - Week 24 - N8\Programs\TLG\Outputs\f14-02-eff-chg-matrix.rtf' style=styles.mystyle nogtitle nogfootnote startpage=no image_dpi=300; title1 justify = left "" justify = right " Page &escapechar.{pageof}"; title2 justify = left "PROTOCOL: 421-01-02" justify = right "Date of Extract: &crdate_iso."; title3 justify = center "Figure 14.2" ; title4 justify = center "Cohort 2: Change from baseline for efficacy endpoints" ; footnote1 justify=left "Program Path: G:\Statistical Programming\Lonigutamab\TED\421-01-02\Inbound\Internal\Cohort 2 - Week 24 - N8\Programs\TLG\f-eff-chg.sas" " &sysdate9:&systime"; proc sgpanel data=f_eff_chg1 ; panelby usubjid/layout=lattice; band y=chg lower=0 upper=12/transparency=0.6 name="band"; colaxis label="Change from Baseline" values=(-5 to 3 by 1); colaxis label="ng/mL" values=(0 to 14000 by 1000); rowaxis label='Week' values=(0,2,4,6,8,12,16,20,24) ; series x=avisitn y=prop /lineattrs=(thickness=2px color=green pattern=1) legendlabel="Proptosis (study eye)" markers markerattrs=(symbol=circle) name="series1"; series x=avisitn y=prop2 /lineattrs=(thickness=2px color=green pattern=2) legendlabel="Proptosis (fellow eye)" markers markerattrs=(symbol=circle) name="series2"; series x=avisitn y=dip /lineattrs=(thickness=2px color=red pattern=1) legendlabel="Diplopia" markers markerattrs=(symbol=circle) name="series3"; series x=avisitn y=cas /lineattrs=(thickness=2px color=blue pattern=1) legendlabel="CAS" markers markerattrs=(symbol=circle) name="series4"; series x=avisitn y=conc / colaxis lineattrs=(thickness=2px color=black pattern=5) legendlabel="Plasma Concentration" markers markerattrs=(symbol=circle) name="series5"; text y=y1 x=x1 text=label; text y=y2 x=x1 text=label2; text y=y3 x=x1 text=label3; keylegend "series1" "series2" "series3" "series4" "series5"/ title=' ' ; by dmdose usubjid ; run;
... View more

0
1
Hello, I am working with personnel records for 80,000+ individuals across about 15 years. A minimum of 1 record per month is generated for each employee, but multiple additional records can also be generated during any month. The records include a pay grade variable (coded 0 to 10, with 0=most junior and 10=most senior). I need to accurately identify records that document demotions. As with most administrative records, the data are mostly clean - except when they are not. I've included some sample datalines below that reflect the 3 most common data patterns: 1. a single pay grade change that reflects a demotion (see id=23456) 2. a single pay grade change that appears to reflect a random bad record, but not a demotion (see id=12345) 3. a flurry of records that bounce between 2 pay grades, but finally begin to reflect the same pay grade consistently, which appears to reflect a demotion (see id=34567) I am using a lag variable to identify records where paygrade < lag_paygrade, and the resulting new variable "demotion" currently acts like a general flag for records that require further QA checks. If anyone has a recommendation for how to better differentiate between the 3 patterns of pay grade values, I'd really appreciate the help. Thanks! data have;
input id date paygrade; format date date9.;
datalines;
23456 01JAN2021 7
23456 01FEB2021 7
23456 01MAR2021 7
23456 01APR2021 7
23456 05APR2021 7
23456 10APR2021 7
23456 15APR2021 6
23456 01MAY2021 6
23456 01JUN2021 6
12345 01JAN2021 3
12345 01FEB2021 3
12345 01MAR2021 3
12345 01APR2021 3
12345 05APR2021 3
12345 10APR2021 2
12345 15APR2021 3
12345 01MAY2021 3
12345 01JUN2021 3
34567 01JAN2021 5
34567 01FEB2021 5
34567 01MAR2021 5
34567 01APR2021 4
34567 05APR2021 5
34567 10APR2021 5
34567 15APR2021 4
34567 01MAY2021 4
34567 01JUN2021 4
run;
proc sort data=have; by id date; run;
data have1; set have;
by id date;
lag_paygrade=lag(paygrade); if first.ssn then lag_paygrade=.;
if paygrade<lag_paygrade then demotion='yes';
run;
... View more

0
1
Hi team,
I'm very confused and I think SAS Management console is acting weird these days!
I have created one flow and added a deployed jobs and scheduled it, but after few days I found my flow empty however it is still running successfully and generating the logs for me without error.
I thought maybe someone deleted it, so I went to check from backend, and I have checked the logs, and I found nothing suspicious or deleted.
It looks like this:
Can anyone help!
I need to redeploy my SAS job.
... View more

Labels:
0
0
미국 Communites Site에 게시된 글을 번역하여 공유드립니다.
가볍게 읽어보시고, 진행 중인 댓글 이벤트에도 많은 참여 부탁드립니다!
원제: Analyzing Banking Churn Rates to Optimize Customer Retention Strategies
저자: DeeMckoy
포스팅 날짜: 01-09-2025
-----------------------------------------------------------------
고객 유지 전략을 최적화하기 위해 은행 이탈률 분석
오늘날의 사회에서 고객 이탈률을 이해하는 것은 고객을 유지하고 회사의 전반적인 성과를 개선하는 데 필수적입니다. 비즈니스 산업에서 이탈 분석을 통해 프로모션 요청, 고객 만족과 관련된 특정 문제 해결, 현재 고객 또는 신규 고객에게 할인 광고와 같은 회사의 방향성을 결정할 수 있습니다.
이번 포스트에서는 Kaggle을 통해 제공하는 가상의 은행에 대한 고객 이탈률을 살펴보도록 하겠습니다. 우리는 고객이 은행에서 이탈하는 이유에 대한 몇 가지 주요 요인을 더 잘 이해하고자 합니다. 데이터 세트는 10,001개의 관측값이 있는 14개의 열로 구성됩니다. 이 데이터 세트의 일부 변수는 다음과 같이 구성됩니다.
Age(연령)
Balance(잔액)
CreditScore(신용점수)
CustomerID(고객ID)
EstimatedSalary(예상급여)
Exited(이탈여부)
Gender(성별)
Geography(지역-국가)
HasCrCard(신용카드보유여부)
IsActiveMember(활동회원여부)
NumOfProducts(제품수)
Surname(성씨)
Tenure(재직기간)
먼저 SAS Viya 소프트웨어를 사용하여 모델링을 위하여 “데이터 분할”을 설정합니다. 이때, 학습과 검증의 비율은 보통 6:4, 7:3으로 설정을 하며, 테스트는 홀드아웃 테스트를 일반적으로 진행하기 때문에 0으로 지정합니다.
그런 다음 모델링의 주목적인 타겟 변수를 식별하는 것으로 시작합니다. 이 분석의 타겟 변수는 범주형 이진 변수인 "Exited(이탈여부)"가 될 것입니다.
파이프라인의 타겟 변수를 설정한 후 다음으로 "데이터 탐색"을 사용하여 데이터를 확인하려고 합니다. 이 노드는 어떤 변수가 중요한지 더 자세히 알려주고 데이터 내의 변수에 대한 더 나은 통찰력을 제공합니다.
파이프라인 실행이 완료되면 "데이터 탐색" 노드를 마우스 오른쪽 버튼으로 클릭하고 “결과”를 확인합니다. 결과는 NumOfProducts(제품수), Tenure(재직기간), Age(연령)와 같은 변수에 대한 시각화로 구성됩니다. 이렇게 하면 파이프라인을 빌드하는 방법을 더 잘 이해하는 데 도움이 됩니다.
상대적 중요도
위의 그림에서 상대적으로 중요도가 높은 변수에 대한 통찰력을 얻을 수 있습니다. 예를 들어, Age(연령)는 상대적 중요도가 1.0이고 NumOfProducts(제품수)는 상대적 중요도가 0.987%입니다. 우리는 또한 "IsActiveMember(활동회원여부)", Balance(잔액), Geography(지역-국가) 및 CreditScore(신용점수)와 같이 중요하지만 50 % 미만인 것을 볼 수 있습니다.
위의 그림에서 발생 수준을 이해하기 위해 “범주형 변수”의 카디널리티를 살펴봅니다. 카디널리티는 데이터 속성이 데이터 세트에서 사용할 수 있는 고유 값의 수입니다. Geography(지역-나라)에 대한 카디널리티가 높다는 것을 알 수 있습니다. "HasCrCard(신용카드 보유여부)" 및 “IsActiveMember(활동회원여부)”에 대한 중간 카디널리티는 레벨 수가 3입니다. 또한, “연속형 변수”에 대한 기초 통계량은 확인할 수 있습니다.
위 그림에서 연령은 18세에서 92세의 분포를 보이며, 평균 연령은 38.9세 입니다. 또한, 재직기간은 0 ~ 10년의 분포를 보이며 평균 재직기간은 5년임을 알 수 있습니다.
다음으로, 은행 회사를 떠나는 고객의 " Exited(이탈여부) " 빈도 백분율을 살펴봅니다
우리의 주된 관심사항인 회사에서 얼마나 많은 고객이 이탈했는지(1 = 예, 0 = 아니오)를 살펴보기로 하겠습니다.
위그림에서는 은행이 고객의 80%를 유지할 수 있었고 회사에서 이탈한 사람은 20%인 것을 알 수 있습니다. 고객이 이탈했을 수 있는 이유를 이해하고 고객의 유지 수준을 평가하여 80% 이상으로 유지하는 방법을 찾으려고 합니다. 이제 섹션의 "대체" 노드를 사용하여 이상값을 대체해야 합니다.
"대체" 노드를 사용하면 지정된 값으로 모든 이상치와 알 수 없는 클래스 수준을 대체하고 제거할 수 있습니다. 이렇게 하면 데이터 세트 내에 있을 수 있는 가능한 오류를 조정하는 데 도움이 됩니다.
위 그림과 같이 범주형 또는 연속형 변수에 대하여 다양한 방법으로 대체를 수행할 수 있습니다.
이 후, 우리는 데이터 세트에서 변환 노드를 수행하며, 이 노드는 입력 변수에 숫자 또는 구간화(Binning)를 적용합니다.
각 변환에 대해 결측처리와 같이 새로운 변수가 생성됩니다. 변환을 사용하면 접두사가 사용된 변환에 따라 달라집니다. 예를 들어, 로그 변환된 변수는 LOG_로 시작합니다. 연속형 변수의 변환방법은 디폴트로 “(없음)”로 설정되며 원래 변수는 데이터 세트에서 삭제되지 않지만 기본적으로 거부됨으로 설정되므로 모델에서 사용되지 않습니다. 나머지 입력은 기본 설정으로 유지되며 WOE(희귀 차단 및 증거 가중치) 조정 값은 0.5로 유지됩니다.
“변환” 노드에 대한 매개 변수를 설정한 후 연속형 변수 "변환방법"을 “로그”로 변경하려고 합니다. 그 이유는 왜도를 줄이고 데이터 분포를 돕는 데 도움이 되는 것입니다. 변환 노드가 성공적으로 실행된 후 입력 변수 통계, 변환된 변수 요약을 볼 수 있습니다.
위의 그림에서 “대체” 노드의 왜도를 확인하기 위해 연속형 변수를 살펴봅니다. 왜도(Skewness)는 변수 분포의 대칭성을 측정하며, 이로 인해 분포가 오른쪽 또는 왼쪽 꼬리 쪽으로 늘어납니다. 대체된 Estimated Salary(예상 급여)의 경우 왜도는 0.0133으로 정규분포의 이상적인 왜도값인 0에 가깝습니다. 또한 대체된 Age(연령) 변수의 경우 왜도값은 0.9672이며, 대체된 Balance(잔액), Credit Score(신용 점수) 변수는 음의 왜도값을 확인할 수 있습니다.
위의 그림에서 변환 요약에는 대체된 입력 변수와 각 변수에 사용된 변환 공식이 표시됩니다. 공식, “n +1”을 수행하는 이유는 연속형 변수에 대한 음수 값을 제거하기 위해 설정된 메타데이터 제한으로 인해 변수 입력이 0인 경우 오류를 피하기 위한 것입니다.
이제 데이터 변환을 처리했으므로 “결측값 처리” 노드를 사용하여 범주형 및 연속형 입력변수에 대한 결측값을 확인하려고 합니다. “결측값 처리” 노드의 경우 기본 매개 변수로 입력 설정을 유지합니다.
결측값 처리의 경우 범주형 변수의 기본 방법은 “개수”가 되고 연속형 변수의 경우 설정된 “데이터 제한 백분율”(디폴트 5%)이 절삭 또는 윈저화된 데이터를 사용하여 설정된 기본방법(디폴트 “평균”)으로 결측값을 처리합니다. 지도 학습 노드 섹션과 선택된 노드를 살펴보기 전에 변수 선택 노드를 살펴보겠습니다. 변수 선택 노드는 변수 선택의 비지도 및 여러 지도 방법을 수행하여 입력 수를 줄입니다.
“변수 선택” 노드는 입력 변수를 식별하는 데 도움이 됩니다. 타겟 변수에 대한 유용한 예측을 수행하는 데 도움이 됩니다. 그런 다음 입력 변수에서 수집된 정보를 지도 학습 노드에서 더 자세히 평가할 수 있습니다.
파이프라인이 성공적으로 실행되면 “모델 비교” 노드에서 선택한 개별 알고리즘 노드를 평가할 수 있습니다. “로지스틱 회귀” 노드는 이항(Binary) 및 명목(Nominal) 변수의 값을 예측하려고 시도합니다. “로지스틱 회귀” 노드를 선택하는 이유는 개별 관측치가 타겟 변수의 관심 수준에 속하는지 여부에 대한 확률을 근사화 할 수 있는 기능이 있기 때문입니다. “의사결정트리” 노드는 하나 이상의 예측변수 데이터 항목의 값을 사용하여 값 응답 데이터 항목을 예측합니다. “의사결정트리” 노드 사용의 또 다른 이점은 누락된 데이터를 처리한다는 것인데, 이는 타겟 변수에서 예측을 생성하는 데 도움이 되는 일련의 규칙을 통해 처리할 수 있습니다. “그래디언트 부스팅” 모델은 분석 데이터 세트를 여러 번 재표본 추출하여 해당 데이터 세트의 가중 평균을 반영하여 예측 결과를 생성하는 부스팅(Boosting) 접근 방식을 제공합니다. 마지막으로, 우리는 “신경망”이 인간의 뇌를 모방하며, 은닉층이 있는 예측 변수, 타겟(또는 출력) 레이어 및 각 레이어 간의 연결로 구성되어 있음을 살펴봅니다.
우리는 상위 두 모델인 “그래디언트 부스팅(챔피언 모델)”과 “의사결정트리” 노드만 살펴볼 것입니다. 두 모델은 86%의 정확도를 보였으며, 모델 선택 기준인 “KS 통계량”이 0.5132로 “그래디언트 부스팅” 모델이 챔피언 모델로 선정되었습니다.
그래디언트 부스팅
변수 중요도에 대한 “그래디언트 부스팅” 모델을 살펴보면 연령(대체 및 변환된 값)은 상대적 중요도가 1이고 타겟 변수에 대한 상대적 중요도가 68%인 제품수(대체 및 변환된 값)를 볼 수 있습니다. 이것은 은행 회원의 연령과 그들이 회사에서 소유하고 있는 제품의 수를 살펴보는 것을 제안합니다
평균 제곱 오차에 대한 오차 플롯은 트리 수가 증가함에 따라 훈련 오류가 감소하는 것을 보여주지만, 검증 오류가 감소 후 증가를 보이거나 학습(Train)과 검증(Validate)의 차이가 많으면 이는 과적합의 징후일 수 있습니다. 이 모델의 경우 검증 데이터(Validate)의 최소 오차는 0.109이고 29개의 트리에 대해 발생하므로 검증 오류는 마지막 트리에서 계속 감소하고 있습니다. 또한, 학습(Train)과 검증(Validate)의 최소 오차 차이가 0.01으로 과적합을 방지하기 위하여 모델의 옵션이나 조기중지 옵션을 수정해야 할 수도 있습니다.
의사결정트리
데이터에 대한 더 많은 인사이트를 얻기 위해 의사결정트리 결과를 살펴봅니다. “의사결정트리” 노드는 “그래디언트 부스팅” 노드보다 정확도가 0.2% 낮았을 뿐이며, 이는 86%에서 여전히 허용 가능한 것으로 간주됩니다. 그러나, KS 통계량이 “그래디언트 부스팅” 노드보다 0.05이상 낮기 때문에 챔피언 모델로 사용하기에는 부족한 것도 사실입니다.
“의사결정트리”의 변수 중요도는 “그래디언트 부스팅” 노드 결과와 다르게 제품수(대체 및 변환된 값)가 1순위로 높았으며, 연령(대체 및 변환된 값)은 상대적 중요도가 0.8219임을 알 수 있습니다.
위의 그림에서 향상도(Lift) 보고서를 검토하여 타겟 이벤트와 관련된 누적향상도를 이해합니다. 이 결과는 모델이 모집단에서 양성 사례(퇴사한 사람)를 얼마나 잘 식별하는지 평가하는 데 사용됩니다. 누적향상도가 높을수록 모델이 특히 예측이 더 높은 확률 그룹에서 이러한 이탈고객을 더 잘 식별할 수 있습니다. 검증용(Validate) 데이터에 대한 누적향상도가 3.9098이고 학습용(Train) 데이터에 대한 누적향상도가 3.8766인 것은 모델이 고객 이탈 스코어 상위 10%에 속하는 사람들을 식별하는 데 매우 우수하다는 것을 보여줍니다. 이는 이탈할 가능성이 높은 상위 10% 고객을 선별하는 데 매우 유용하게 적용할 수 있습니다.
결론
결론적으로, 머신러닝 모델 파이프라인을 수행하여 얻은 지식은 고객이 은행을 떠나는 이유를 이해하는 데 엄청난 통찰력을 제공합니다. 지도 학습 노드(그래디언트 부스팅 및 의사결정트리)를 사용하여 이탈률을 줄이는 데 도움이 될 수 있는 주요 변수에 대한 통찰력 있는 지식을 얻었으며, 이를 통해 유지율을 크게 향상시킬 수 있었습니다. 예를 들어, 잠재적으로 젊은 고객을 타겟팅하고 데이터 세트에 나열된 지역-나라의 지리적 어려움을 해결하기 위한 광고 홍보에 초점을 맞출 수 있습니다.
자세한 정보:
지도 학습 개요
SAS Viya 파이프라인
은행 데이터셋
그래디언트 부스팅
의사결정트리
-----------------------------------------------------------------
글이 흥미로웠다면 댓글로 알려주세요!
... View more

- Tags:
- SASKorea
0
0
Unanswered topics
These topics from the past 30 days have no replies. Can you help?
Subject | Likes | Author | Latest Post |
---|---|---|---|
0 | |||
0 | |||
0 | |||
0 | |||
0 | |||
0 | |||
0 | |||
5 | |||
0 | |||
0 |