Bootcamp/KT aivle school

04.02 kt 에이블 스쿨 6일차 이변량 분석

Nyamggoon 2025. 4. 3. 00:09

이변량 분석에는 총 네가지가 있다

서로 다른 타입의 변수를 비교하는 것 

수치형 -> 수치형

시각화 : 산점도

# pyplot을 이용
plt.scatter(x='', y='', data=, s=20, c='b') # s는 점의 크기, c 는 컬러

# seaborn을 이용
sns.scatterplot(x='', y='', data=, s=15, edgecolor=T/F) # edgecolor는 점 테두리선

# 추가적인 시각화
sns.pairplot() # dataframe 내 전체 변수에 대한 비교

sns.jointplot(x='', y='', data=, kind=, marginal_kws={ : })
# marginal_kws : dictionary 형태로 파라미터 값을 지정해줄 수 있음 ex. {'bins' : 15}
# kind=reg : 회귀선, kind=hex : 벌집모양?, kind=kde : kdeplot

수치화 : 상관계수 

spicy 라이브러리의 stats 패키지 이용 or pandas corr 이용

mport spicy.stats as spst
result = spst.pearsonr(df['column1'], df['column2'])

# result 의 0번 인덱스 값이 상관계수
result[0]

# 1번 인덱스 값이 p-value임
result[1]

# pandas의 corr() 메서드
df.corr(numeric_only=True)

#.style.background_gradient(cmap=, vmin=, vmax=) 등을 이용하면 heatmap 처럼 색칠도 가능

# seaborn heatmap()
sns.heatmap(df.corr(numeric_only=True),
			annot=T/F, fmt, cmap, vmin, vmax...)

heatmap도 출력이 가능하다!

 

수치형 -> 범주형

시각화 : 히스토그램 histplot, 확률밀도함수 kdeplot

# histogram
sns.histplot(x='범주형col', hue='수치형col', data=, bins=15)

# 확률밀도함수 그래프 kdeplot
sns.kdeplot(x='범주형col', hue='수치형col', data=) #common_norm=T/F 그래프 면적 합이 1 OR 각각의 합이 1
# multiple='fill' 해주면 비율로 비교 가능

수치화 : 맞는 가설검정 도구가 X, 로지스틱 회귀모델

model = sm.Logit(df['범주형'], df['수치형'])
result = model.fit()
result.pvalues # p value를 볼수 있다.

p value로 통계적 유의성 검증 

범주형 -> 수치형

시각화 : Barplot, Boxplot

# barplot
sns.barplot(x='범주형', y='수치형', data=, palette='') # palette 옵션으로 예쁘게 색칠 가능

# boxplot
sns.boxplot(x='범주형', y='수치형', data=, palette='')

x 범주에 따라서 y의 평균이 차이가 나는지 확인~

수치화 : t-검정, ANOVA

# 결측치가 있다면 df['col'].notnull() 로 제거해주고 수치화

c1 = df.loc[df['범주형']=='c1', '수치형']
c2 = df.loc[df['범주형']=='c2', '수치형']

# t 검정
t_test = spst.ttest_ind(c1, c2)

# t_test[0] = t-통계량
# t_test[1] = p-value

# anova
c1 = df.loc[df['범주형']=='c1', '수치형']
c2 = df.loc[df['범주형']=='c2', '수치형']
c3 = df.loc[df['범주형']=='c3', '수치형']

anova = spst.f_oneway(c1, c2, c3)
# anova[0] == f 통계량
# anova[1] == p-value

집단이 2개 일 때는 t 검정 / 집단이 3개 이상일 때는 ANOVA

t 검정은 두 평균의 차이 // -2 > t-statistics or t-statistics > 2 일 때 차이가있음!

anova는 표본들의 평균과, 표본들의 평균의 평균간의 차이 

집단 내 차이(각 집단 내 평균과 각 집단내 값 간의 차이) 와 집단 간 차이 (모평균과 집단 평균 간 차이)를 비교 함

강사님이 첨부해주신 이미지 보고 이해했습니다 ㅋㅋ쿠 여러분도 한 번 찾아보시길..

 

범주형 -> 범주형

시각화 : 100% stacked bar, 모자이크 플롯

# 먼저 crosstab을 만들어줘야

table = pd.crosstab(df['col1'], df['col2'], normalize='index') # normalize 파라미터 값에 따라 다른 비율로 설정 가능 각 행 값의 합이 1

# stacked bar
table.plot(kind='bar', stacked=True)
# plt.axhline 추가하면 평균선 표시

# mosaic plot
mosaic(dataframe, ['col1', col2']) # data.frame.sort_values(['col1', 'col2']) 으로 순서 정렬 가능

수치화 : 카이제곱통계량

카이제곱통계량은, 그 값을 가지고 차이의 정도를 비교할 수는 없음.

ex) 섭씨 30도가 섭씨 15도 보다 2배 덥다고 하지 않는 것과 동일

result = spst.chi2_contingency(table)
# result[0] == 카이제곱통계량
# result[1] == p-value
# result[2] == 자유도
# result[3] == 기대빈도

카이제곱 통계량에서 기대 빈도란?

col1 범주 3가지 (A/B/C), col2 범주 2가지(X/Y)라고 했을 때,

A 이면서 X일 확률은 1/3 (3가지 중에서 A일 확률) * 1/2 (2가지 중에서 X일 확률) 이다.

확률과 통계에서 배운 두 독립 사건이 동시에 일어날 확률

그런데 거기다가 전체 값의 개수를 곱해주면 기대 빈도가 된다.

기대 빈도 = (해당 행의 합계 * 해당 열의 합계) / 전체 개수 합계

여러 검색을 해본결과 이렇게 이해 됐음! 근데 AICE 에서는 그렇게까지는 안 묻는 것 같다.

=> 카이제곱통계량이 자유도의 2~3배 보다 크고, p value < 0.05 를 만족하면 범주간 유의미한 차이가 존재! 


코딩테스트 입문

1. 문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public String solution(String my_string) {
        StringBuffer answer = new StringBuffer(my_string);
        return answer.reverse().toString();
    }
}

StringBuffer의 reverse() 메서드를 사용하면 쉽게 할 수 있더라구요 이후 toString() 메서드로 문자열 변환까지 완료

for 반복문으로 역순으로 문자열을 배열하는 경우도 있었습니다.

-StringBuilder 와 StringBuffer의 메서드

 


append(String str)
문자열 덧붙이기 sb.append(" world") → "hello world"
insert(int offset, String str) 특정 위치에 삽입 sb.insert(1, "ey") → "heyello"
delete(int start, int end) 범위 내 문자 삭제 sb.delete(1, 3) → "hllo"
replace(int start, int end, String str) 문자열 치환 sb.replace(0, 2, "He") → "Hello"
reverse() 문자열 뒤집기 sb.reverse() → "olleh"
toString() 문자열로 변환 sb.toString()

 

-기본형 / Wrapper 클래스 : 기본 자로형을 객체형으로 감싸주는 클래스 

int Integer
char Character
double Double
boolean Boolean
long Long
float Float
byte Byte
short Short

메서드설명예시

parseInt(String s) 문자열 → int Integer.parseInt("123") → 123
valueOf(String s) 문자열 → Integer 객체 Integer.valueOf("123")
intValue() Integer → int new Integer(5).intValue()
compare(a, b) a와 b 비교 Integer.compare(3, 5) → -1

 

2. 문자열 my_string과 문자 letter이 매개변수로 주어집니다. my_string에서 letter를 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public String solution(String my_string, String letter) {
        StringBuilder sb = new StringBuilder(my_string);
        for (int i=0; i < my_string.length(); i++) {
            String st = String.valueOf(my_string.charAt(i));
            if ( st.equals(letter)) {
                sb.delete(i, i+1);
                return sb.toString();
            } else { }
        }
    }
}


안된다.. 근데 검색해보니까 문자열 메서드를 활용하면 더 쉽게 할 수 있었다ㅠ

class Solution {
    public String solution(String my_string, String letter) {
        return my_string.replaceAll(letter, "");

    }
}

replace() 와 replaceAll() 이라는 메서드를 활용하면 됩니다! 짝짝짝

 

3. 각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int angle) {
        int answer = 0;
        if (angle == 180) {
            answer = 4;
        } else if (angle < 180 && angle > 90) {
            answer = 3;
        } else if (angle == 90) {
            answer = 2;
        } else {
            answer = 1;
        }  return answer;
    } 
}

변수를 if문 밖에서 선언해주면, return 문을 if 절마다 일일이 안 써줘도 되네요 오늘도 공부 완료.