티스토리 뷰

반응형

범주 vs 범주는 어떻게 분석하는가?

성별별로 생존여부를 교차표로 집계해보면 된다.

 

교차표

교차표는 머신러닝 분류모델을 평가할 떄도 쓰인다.

 

교차표로부터 그래프를 그린다. 

이 교차표를 기반으로 카이제곱 검정을 한다.

 

Pandas의 교차표 함수

pd.crosstab(범주 행, 범주 열)
pd.crosstab(범주 행, 범주 열,normalize = 'columns') #위에서 아래로 비율화
pd.crosstab(범주 행, 범주 열,normalize = 'index') #왼쪽에서 오른쪽으로 비율화
pd.crosstab(범주 행, 범주 열,normalize = 'all') #전체에서 비율화

 

nomalize =를 붙이면 비율로 변환한다.

columns : 열 기준 100%

index : 행 기준 100%

all : 전체 기준 100% 이다.

 

범주 vs 범주 시각화

모자이크 플롯 혹은 stacked bar 차트로 쓴다.

from statsmodels.graphics.mosaicplot import mosaic      #mosaic plot!
mosaic(df, ['범주형 컬럼1, 범주형 컬럼2(타겟)'])

plt.axhline( 1- df['범주형 컬럼'].mean(), color='r') #평균선 하나 긋기

X축 길이는 각 범주별 비율

그 중 3에 대해서 살펴보면 y는 1과 0의 비율을 의미한다.

 

3등급에서는 평균보다 분류선이 올라가 있다. 그러면 평균보다 1이 적다는 뜻.

그리고 1등급과 2등급에서는 평균보다 높다.

 

그래서 1,2,3 분류별로 1의 비율에 차이가 있다고 평가하는 것이다.

 

만약 아무런 상관이 없다면, 범주 별 비율의 차이가 전혀 없다.

즉, 전체 평균 비율에 전부 다 가까워져 있다.

조금이라도 관련이 있다면 비율 혹은 bar의 크기에 조금이라도 차이가 난다.

 

stacked bar

이런 그래프를 stacked를 쓸 수 있다.

단, 문법을 무조건 지켜야 한다.

 100% Stacked Bar
    * 먼저 crosstab으로 집계 : pd.crosstab(**feature**, **target**, normalize = **'index'**)
    * .plot.bar(stacked = true)
    * 전체 평균선 : plt.axhline()

 

temp = pd.crosstab(df['P'], df['타겟값'], normalize = 'index')
print(temp)
temp.plot.bar(stacked=True)
plt.axhline(1-df['타겟값'].mean(), color = 'r') #사망률과 생존률을 구하기 위해서 반대로 해준다.
plt.show()

 

범주 vs 범주 수치화 : 카이제곱검정

x를 그리스에서는 카이라고 부른다.

만약 아무런 관련이 없다면, 위 아래를 계산했을 때 전체 비율과 같아야 한다.즉, 전체 비율이 20, 80이라면 범주 1에서도 20,80, 범주 2에서도 20, 80이 나와야 한다.

 

5 15 20%
20 60 80%
25 75 100

 

이런 기대 빈도가 나와야 하는 값인데, 그 기대 빈도를 기준으로, 차이를 구해야 한다.

 

카이제곱검정은 그 기대빈도로부터의 차이이다. 아무런 관련이 없는 부분으로부터 그 차이가 얼마나 큰 거냐를 구하는 게 카이제곱 검정이다.

 

x^2 = 시그마 ((관측빈도 - 기대빈도)^2 / 기대빈도)

 

관측빈도 1행 1열을 기대빈도 1행 1열과 빼서 곱한 값을 기대빈도로 나누고, 전부 더한다.

 

카이 제곱 통계량

  • 클수록 기대빈도로부터 실제 값에 차이가 크다는 의미이다.
  • 범주의 수가 늘어날 수록 값은 커지게 되어 있다.
  • 자유도의 약 2배보다 크면 차이가 있다고 본다.

범주형 변수의 자유도 = 범주의 수 -1

 

카이제곱 검정의 자유도 계산

x변수의 자유도 * y변수의 자유도

x-1 * y-1

 

교차표를 집계하고 쓴다. 단, normalize는 쓰면 안된다.

table = pd.crosstab(df['범주1'],df['범주2'])

scipy.chi2_contingency(table)

 

Chi2ContingencyResult(statistic=289.1953165452417, pvalue=2.318405007221846e-61, dof=4, expected_freq=array([[ 25.26262626,  15.73737374],
       [113.98989899,  71.01010101],
       [322.25252525, 200.74747475],
       [ 78.86868687,  49.13131313],
       [  8.62626263,   5.37373737]]))

 

자유도가 나오고, p-value는 역시 귀무가설 기각이다(차이가 없다를 기각)

생각해볼 것 - 무조건 차이가 있는 것 아닌가?

 

statistic가 25여도 관련이 있긴 있다.

카이제곱을 비교할 때는 자유도가 다르면 조금 곤란하기는 하다. 그러나 그럼에도 289는 staticstic이 크다.

 

자유도는 선택의 자유다.

 

실제 범주가 3개면, 자유롭게 선택할 수 있는 건 2개 뿐이다. (A를 고르고, B를 고르면 C는 선택지가 없다)

3*2면, 집계된 값이 6개인데, 총 개수가 정해져 있다.

 

ttest에서 쓰는 자유도 n-1 불편추정량

 

눈으로보 보고, 숫자로도 봐서 종합적으로 계산해보자.

p-value가 0.05보다 작다고 하면, 결국에는 차이가 있다고 판단해서 종합적으로 판단하는 것이다.

 

범주 vs 범주

기대빈도와 실제값의 교차표와의 차이를 비교한다.

두 범주간 자유도의 2배 이상인 경우 관계가 있다고 판단

p-value : 0.05보다 작으면 관계가 있다고 판단한다.

기대빈도는 무조건 값으로 정해진다.

 

 

&&&

hype cycle -> x축은 시간의 흐름, y축은 시장의 기대심리(어떤 기술에 투자가 몰리는가)

 

비어있으면 2년 내에 성숙기 단계

GenAI 성숙기까지 2~5년

computer vision은 2년 후 성숙기

 

aritificial general inteligence (AGI)

 

모든 기술들을 두 가지로 요약

 

중심에 GenAI가 있고,

1. 생성형 AI로 인해 발전된 기술.

2. 생성형 AI 떄문에 발전될 기술.

 

생성형 AI를 발전시키는 기술과, 이를 비간으로 비즈니스를 혁신할 사람들이 JOB의 개수로 보면 더 많다.

조금만 있으면 누구나 하지 않으면 안되는 영역이 되버릴 것이다.

 

전공 분야에 인공지능을 활용 한다.

&&&

 

이변량 분석 숫자 - 범주

x가 숫자, Y가 범주일 때는 그래프만 그린다.

 

히스토그램, kdeplot을 그린다.

common_norm = False: 각각 그리기

multiple ='fill' : 모든 구간에 대한 100% 비율로 kde 그리기

 

히스토그램을 hue를 이용해서, 어떤 범주형으로 나눠서 그려봅시다.

즉, 범주형으로 groupby한 그래프를 그린다.

sns.histplot(x='A', data = df, hue = '범주형')
plt.show()

보라색은 겹치는 구간이다.

 

kde도 마찬가지.

sns.kdeplot(x='A', data = df, hue = '범주형')
plt.show()

common_norm = False를 하면, 전체 면적이 1이 아니라 각각 범주의 그룹별(A,B) 아래 면적이 1이 된다.

원래는 A+B 해서 1로 그린다.

sns.kdeplot(x='A', data = df, hue = '범주형',
	common_norm = False)
plt.show()

 

그러면 이렇게 kde plot을 잘랐을 때에는 원래 구간에서 어떤 구간을 잘라도 전체 평균하고 같은 비율이다.

즉, common_norm으로 그린 그래프가 완전 겹치게 나온다면, 전혀 관련이 없다는 것이다.

 

두 그래프가 만나는 점은, 말 그대로 전체 평균과 같은 지점이다. 즉, 차이가 없는 지점이다.

옆으로 조금 넓게 퍼져 있다는 차이가(관련이) 조금 있는 것.

양 옆으로 넓게 퍼져 있다면, 차이가 큰 것이다.

이를 현장에서 발견했다면 땡잡은 것이다.

sns.histplot(x='A', data = df, bins = 16
             , hue ='범주형', multiple = 'fill')
plt.axhline(df['범주형'].mean(), color = 'r')
plt.show()

모자이크 플롯하고 보는 게 똑같다.

전체 평균과 얼마나 차이가 나있는지를 보면 된다.

 

정말 1도 관련이 없다면, 주황색과 파란색이 평균선 기준으로 잘리게 된다.

 

정말 수치형을 쓸 수 없는가?

미봉책 : 가장 쉬운 방법은 수치형을 범주형으로 바꿔서 범주-범주형으로 해보는 것이다.(카이제곱 검정)

 

두번째 - 로지스틱회귀 모델로부터 p-value를 계산하는 방법

로지스틱 회귀는 기울기를 계산한다.

가중치, 파라미터, 회귀계수라고 불린다. -> 내부에서 유의미한지를 검정한다.

그 유의미를 판단해서 p-value를 주는 걸 기반으로 검증한다.(이걸 많이 쓴다)

 

세 번쨰 - 범주->수치로 해서 t 검정, anova를 하는데 사실 말이 안된다. 참조만

 

종합 실습 3: 이변량 분석

이직률 상승

데이터 기반 직원 이직 분석

 

이건 과거의 데이터다.

 

나이

출근거리

월급

급여인상율

총 경력연수 - 숫자

 

성별

직무만족도

결혼상태

야근 여부

 

분석할 때는 단변량 분석부터 먼저 해봐야 한다.

 

숫자형 히스토그램, 바플롯, 기초통계

범주형 빈도표, countplot = value_counts(), countplot

 

관련된 일을 해야 한다면 왜 그런지에 대한 인터뷰를 해봐야 한다.

실전에는 야근을 하느냐 안하냐를 전부 물어봐야 한다. 임의로 판단하면 안된다.

data[[var]].describe().T

전치하려면 2차원으로 만들어줘야 한다.

 

인사팀하고 상담. 임금인상률이 20프로 이상 되는 사람들은 어떤 경우인지를 파악.

 

카이제곱 p-value가 0.28이면 과연 관련이 없는가?

비즈니스를 감안하면 해봄직 하다?

 

# 카이제곱검정으로는 관련이 없다고 나오나, 그래프로 볼때 약간 관련이 있다고 판단됨.

 

 

싱글이 야근을 도맡아 하는 건 아닌가?

싱글에서 야근을 비교해보면 된다.

 

30대 초반을 도달하면 이직은 안하고, 30대 초반을 도달하지 못하면 이직을 한다.

33세에서 이직률이 작아지는 경향을 보인다.

즉, 이 정도면 관련이 꽤 있다.

 

20세는 아마도 아르바이트.

이 정도면 타깃 예측력을 확실히 보일 수 있을 것 같다.

 

10~30에서 이직률이 높아진다.

혹시 출퇴근 버스가 있는가? 그런 것에 대한 관점이 필요하다.

 

0보다 작은 건 밀도함수라서 표현이 된 것이기 때문에 무시하셔도 됩니다.

 

만나는 점이 중요하다.

 

구간을 잘라서 야근 여부랑 비교

20퍼 이상 인상해도 이직률이 높다.

 

수습, 정사원인지에 대한 조사.

왜 그런지 조사를 하면서 궁금증을 해소해가야 한다.

 

모델링과의 관계

모델링을 위한 전처리

모든 셀은 값이 있어야 한다 -> NaN 준비

그 값은 모두 숫자여야 -> 가변수화

값의 범위 일치 -> 스케일링

 

모델이 왜 그런지 설명하는 것 = XAI 라는영역

설득 할 때는 그들의 언어로 설득해야 한다.

반응형