반응형

넘파이
판다스
scipy
시계열 데이터 함수
시각화

데이터 유형별 코드 작성


Numpy

👉 여기서 numpy list를 편의상 n1, n2...로 칭함

속성 혹은 메서드 설명
np.array(리스트) 리스트를 넘파이 리스트로 변경
np.array(리스트, dtype=np.float64) 리스트 변환 시 타입 결정
np.arange(1,7) 1부터 7 전까지의 정수로 이뤄진 넘파이 배열 생성
n1.shape 축을 기준으로 몇개씩 있는지 알려줌
n1.ndim 몇차원인지 알려줌
n1.size 총 배열의 크기가 몇인지 알려줌
n1[:, 2] 슬라이싱(이 예시의 경우 모든 행의 index가 2인 원소 추출)
n1[n1>=3] Boolean Indexing(조건에 따른 추출)
n1.astype(dtype=np.float64) 배열의 타입 변경
n1.reshape(3, -1) 행이 3개인 배열로 재정의(이때 size가 바뀌면 안됨)
np.zeros((행, 열)) 해당 행 열의 크기로 0을 꽉채운 넘파이 배열 생성
np.ones((행, 열)) 1로 채워진 배열
np.full((행, 열), 특정값) 특정 값으로 채워진 배열
np.eye(n) 크기가 n인 단위 행렬
np.random.random((행, 열)) 랜덤값으로 채운 배열 생성
n1.add(n2) +
n1.subtract(n2) -
n1.multiply(n2) *
n1.divide(n2) /
n1**(n2) 제곱
n1.sqrt 제곱근
np.sum(n1, axis) 합(axis= 값을 통해 방향 설정)
np.mean(n1) 평균(axis= 값을 통해 방향 설정)
np.std(n1) 표준편차(axis= 값을 통해 방향 설정)
np.min(n1) 최솟값(axis= 값을 통해 방향 설정)
np.max(n1) 최댓값(axis= 값을 통해 방향 설정)
np.argmax(n1, axis =) 가장 큰 값의 인덱스 반환
np.argmin(n1, axis =) 가장 작은 값의 인덱스 반환
np.where(조건문, 참, 거짓) 조건에 따라 값을 바꿔 출력해줌
np.linspace(0, 10, 5) 0부터 10까지의 수를 5등분하는 값

Pandas

👉 pandas DataFrame을 편의상 df1, df2 와 같은 형식으로 표기
👉 *는 여러 컬럼들을 받을 수 있다는 뜻(리스트형태로)

속성 혹은 메서드 설명
pd.DataFrame(딕셔너리) 딕셔너리를 데이터프레임으로
pd.read_csv(파일주소 or url) csv파일을 데이터프레임으로 읽어옴
df1.head() 데이터프레임 앞부분 추출
df1.tail() 데이터프레임 뒷부분 추출
df1.shape 데이터 프레임 형태 확인
df1.values 값 정보 확인(2차원 넘파이 배열로 변경)
df1.columns 열의 이름 확인
df1.dtypes 열 자료형 확인
df1.info() 열에 대한 상세한 정보 확인
df1.describe() 기초 통계 정보 확인
df1[조건식] 조건식을 만족하는 데이터프레임 추출
df1.loc[행, 원하는 열의 이름] 행 추출(열의 이름을 적지 않으면 행 자체 추출)
df1.loc[:, 원하는 열] 열 추출
df1.iloc[행의 인덱스, 열의 인덱스] 인덱스로 행 및 열 추출
df1.sort_values(by=[*'column명'], ascending=[*bool] ) 데이터프레임 정렬(ascending=True : 오름차순)
df1.set_index(컬럼명) 해당 컬럼을 index로
df1.reset_index(drop= ) 인덱스를 초기화(drop=False라면 바뀌기전 인덱스를 남겨둠)
df1['컬럼명'].unique() 컬럼의 고유값 추출
df1['컬럼명'].values 해당 컬럼의 값을 뽑아냄(시리즈 👉 넘파이 배열로)
df1['컬럼영'].value_counts() 컬럼의 값 별 개수
df1[[*컬럼명]] 해당 컬럼명들로 데이터프레임 구성
df1['컬럼명'] 해당 컬럼명으로 시리즈 구성
df1[[*컬럼명]].sum()
df1[[*컬럼명]].max() 최댓값
df1[[*컬럼명]].mean() 평균
df1[[*컬럼명]].median() 중앙값
df1.loc[df1['컬럼명'].isin([1, 2])] 해당 컬럼에 1과 2만 추출
df1.loc[df1['컬럼명'].between([1, 2], inclusive = )] 해당 컬럼값이 1과 2사이에 있는가(inclusive로 포함관계 표현 가능)
df1.groupby([*컬럼명], as_index= )[[추출 컬럼명]].집계함수() *컬럼명들을 기준으로 집계해서 추출 컬럼명들을 집계함수(sum, mean..)된 결과를 데이터 프레임으로 추출 1. 추출 컬럼명을 [추출컬럼명]과 같이 감싸면 시리즈 2.as_index = True는 집계기준이 인덱스 열이 됨
df1.groupby(컬럼명, as_index =)[[특정컬럼]].agg({'원하는 컬럼명':집계함수, ...}) 집계함수의 결과를 원하는 형식으로 설정 가능
df1.columns=[컬럼 명 전체] 행이름을 전체 컬럼명 리스트로 변경
df1.rename(columns={'이전 컬럼명':'바꿀 컬럼명'}) 특정 컬럼명만 바꿀 경우 사용
df1['새로운 컬럼명'] = 해당 컬럼의 값 새로운 열 추가
df1.drop([*삭제할 컬럼명, axis=, inplace=True) 컬럼 삭제, inplace =True이면 실제 반영, axis=0은 행, 1은 열
df1['특정 컬럼'] = 바꾸고 싶은 값 열 전체 값 변경
df1.loc[ df1['컬럼']<10, 참일때 값] 조건 만족시 참일때의 값으로 변경
df1['컬럼'] = np.where(data['컬럼']<10, 참, 거짓) np.where를 사용해서 값 변경
df1['컬럼'] = df1['컬럼'].map({'Male':1, 'Female':0}) 딕셔너리 형식으로 특정 값에 따른 값 변경
pd.cut(df1['컬럼'], bins=[범위 쪼개기], labels=[라벨]) 범위를 기준으로 라벨의 명대로 값을 변경
pd.to_datetime(date 컬럼명, format='%d-%m-%Y') 특정 컬럼을 합쳐서 date타입의 컬럼 만들기
pd.concat([df1, df2], axis = 0, join = 'inner') 데이터 프레임을 합침(axis로 합치는 방향 설정)
pd.merge(df1, df2, how='inner', on='특정 컬럼') 특정 컬럼을 기준으로 두 데이터프레임을 합침
df1.pivot(index, column, values) index와 column을 기준으로 values에 해당하는 컬럼을 표시
df1.corr() 숫자형 - 숫자형의 상관계수 계산
pd.crosstab(행, 열, normalize) 교차표
Series.apply(function) 시리즈의 모든 데이터를 function에 적용한 결과를 출력
pd.options.display.max_columns = n n개 까지 데이터프레임의 개수를 보여줌
df[컬럼명].str.contains(문자열) 특정 컬럼명에 해당 문자열이 있으면 True, 없으면 False
df.fillna(특정값) 결측치를 특정값으로 채움 특정값 대신 사용할 수있는 방법 method='ffill' : 뒤의 결측치를 앞의 값으로 채우기 method='bfill' : 앞의 결측치를 뒤의 값으로 채우기
df.interpolate() () # Nan값을 앞뒤의 값의 동일 간격으로 채우기 (method='time') # 시계열날짜 index를 기준으로 결측값을 채움 (method='values') # 선형으로 비례하는 값들로 결측치를 채움 (method='values', limit=1) # 연속적으로 보간하는 개수를 1개로 제한함. (method='values', limit=1, limit_direction='backward') # 연속적으로 보간하는 개수가 1이면서 뒤 방향에서 채움.

스크린샷 2023-08-14 오후 1 51 23

concat과 merge

  • pd.concat()
    • 매핑 기준 : 인덱스(행), 컬럼이름(열)
    • axis = 0
      • 세로 행으로 합치기(위, 아래로 붙여라)
      • 컬럼 명 기준
    • axis = 1
      • 가로로 합치기(옆으로 붙이기)
      • 행 인덱스 기준(index가 같은것 기준으로 살릴지 말지 정함)
    • join
      • 'outer' : 모든 행과 열 합치기(기본값)
      • 'inner' : 같은 행과 열만 합치기
  • pd.merge()
    • 매핑 기준 : 특정 컬럼(key)의 값 기준으로 결합
      • 옆으로만 병합
      • 어떤 컬럼을 기준 삼을 것인가? = 키가 무엇인가?
    • 데이터베이스 테이블 조인과 같음
    • how
      • inner : 같은 값만
      • outer : 모두
      • left : 왼쪽 df는 모두, 오른쪽 df는 같은 값만
      • right : 오른쪽 df는 모두, 왼쪽 df는 같은 값만
  • pd.pivot
    • 집계된 데이터를 재구성
        1. groupby로 집계 먼저
        1. pivot
    • dataframe.pivot(index, column, values)

scipy

import scipy.stats as spst
속성 혹은 메서드 설명
spst.pearsonr(a, b) a와 b의 상관계수와 p-value 출력
spst.ttest_ind(a, b) a와 b의 t 통계량(평균차이) 이때, a와 b는 범주별로 구분이 끝난 시리즈
spst.f_oneway(*arg) a와 b의 ANOVA(분산분석) 이때 a와 b는 범주별로 구분이 끝난 시리즈
spst.chi2_contingency(pd.crosstab(행, 열)) 카이제곱검정

시계열

  • df1['컬럼명'].shift()
    • 시계열 데이터에서 시간의 흐름 전 후로 정보를 이동시킬 때 사용
  • df1.['컬럼명'].rolling().mean()
    • 시간의 흐름에 따라 일정 기간 동안 평균을 이동하면서 구하기
  • df1.['컬럼명'].rolling(n)
    • n 기본값은 1
    • min_periods : 최소 데이터수
    • rolling함수 뒤에 mean(), max(), sum()등을 붙여서 연산 가능
  • df1['컬럼명'].diff()
    • 특정 시점 데이터, 이전시점 데이터와의 차이 구하기

시각화_기본

  • plt.plot(1차원)
    • x축 : 인덱스
    • y축 : 1차원 값
  • plt.plot(x축, y축)
  • plt.plot(x축, y축, data = )
  • plt.title(제목) # 제목
  • plt.xticks(rotation = 각도) # x축의 범례 각도만큼 기울여서 작성하기
  • plt.xlabel('x축 이름') # x축 이름 지정
  • plt.ylabel('y축 이름') # y축 이름 지정
  • linestyle=
    • 'solid', 'dashed', 'dashdot', 'dotted'
    • 혹은 '-' , '--' , '-.' , ':'
  • marker
marker description
"." point
"," pixel
"o" circle
"v" triangle_down
"^" triangle_up
"<" triangle_left
">" triangle_right

  • 범례
    • plt.plot(x축, y축, label = 범례명) # 범례 추가
    • 이후 plt.legend(loc = "원하는 위치") # 레이블 표시하기
  • 그리드 추가
    • plt.grid()
  • 겹쳐 그리기
    • plt로 2개 그린 후 plt.show()
  • 축 범위 조정하기
    • plt.xlim(시작, 끝)
    • plt.ylim(시작, 끝)
  • 수평선, 수직선 추가
    • plt.axhline(40, color = 'grey', linestyle = '--') # 값, 색, 라인스타일
    • plt.axvline(10, color = 'red', linestyle = '--')
  • 그래프에 텍스트 추가
    • plt.text(5, 41, '40') # x좌표, y좌표, 텍스트
  • 여러개 그래프 한번에 그리기
    • .subplot(행, 열, 현재가 몇번째 plot인가?)
      • 순서는 왼쪽에서 오른쪽, 위에서 아래 순
    • .tight_layout() : 그래프간 간격을 적절히 맞추기


시각화 분석

1. 단변량 분석

밀집, 희박구간을 찾기

왜 이 구간이 밀집 혹은 희박할지 생각해보기

숫자형_변수

  • 숫자
    • 기초통계량 : 평균, 중앙값, 최빈값, 사분위수
    • 구간을 나눈 후 빈도수
그래프 그래프 형태 plt sns
Histogram 스크린샷 2023-08-16 오전 11 23 32 plt.hist(x축, bins = 구간수, edgecolor = 엣지색) sns.histplot(x=컬럼명, data = df명, bins = 구간 수) sns.histplot(x=컬럼명, data=df명, kde = True) kde그래프 추가
Density plot 스크린샷 2023-08-16 오전 11 29 04 - sns.kdeplot(x축데이터) sns.kdeplot(x=컬럼명, data=df명)
Box Plot 스크린샷 2023-08-16 오전 11 29 36 plt.boxplot(x축데이터, vert = ) sns.boxplot(x = x축 데이터) = 가로 sns.boxplot(y = y축데이터) = 세로

---

범주형_변수

  • 숫자
    • 범주별 빈도수 : 시리즈.value_counts()
      • value_counts(normalize = True) 0 ~ 1 사이의 수 (비율)로 표현
    • 범주별 비율
      • 범주별 빈도수 전체 count로 나누기
      • df.shape
그래프 그래프 형태 plt sns
Bar plot 스크린샷 2023-08-16 오후 2 46 06 temp = titanic['Pclass'].value_counts() plt.bar() sns.countplot(x='컬럼명', data=df1, order['컬럼명들'])
Pie chart 스크린샷 2023-08-16 오후 3 09 18 temp = titanic['Pclass'].value_counts() plt.pie(값, labels = , autopct = '%.2f%%', startangle = , counterclock = ) labels : 라벨 autopct : 그래프 표시 값 비율 startangle : 시작각도 counterclock : False(시계방향) -
Count plot 스크린샷 2023-08-17 오후 3 14 50 - sns.countplot(x= , data= )
+ Count plot : 범주별 개수 count

2. 이변량 분석

숫자형👉숫자형

수치화
  • 상관관계 : 얼마나 직선에 가깝나를 수치화 한 것
    • -1 ~ 1
  • p-value : 상관계수가 유의미한지를 검정
    • p-value < 0.05 : 두 변수 간에 관계가 있다(상관계수가 의미가 있다)
    • p-value >= 0.05 : 두 변수 간에 관계가 없다(상관계수가 의미가 없다)
import scipy.stats as spst
spst.pearsonr(수치형 시리즈1, 수치형 시리즈 2)

spst.pearsonr(air['Temp'], air['Ozone'])

# null인지 까지 체크해야 하는 경우
# .notnull() null 인지 아닌지
temp = air.loc[air['Solar.R'].notnull()] # .notna()
spst.pearsonr(temp['Solar.R'], temp['Ozone'])

# 상관계수 한번에 구하기
df1.corr()
시각화
그래프 그래프형태 plt sns
Scatter 스크린샷 2023-08-17 오후 12 01 42 plt.scatter(x = , y = , data = ) sns.scatterplot(x = , y =, data = , hue = x컬럼의 범주화)
pairplot 스크린샷 2023-08-17 오후 12 14 30 - sns.pairplot(dataframe)
jointplot 스크린샷 2023-08-17 오후 12 18 01 - sns.jointplot(x= , y=, data =)
regplot 스크린샷 2023-08-17 오후 12 29 48 - sns.regplot(x=, y=, data=)
Heatmap 스크린샷 2023-08-17 오후 1 51 29 - sns.heatmap(df1.corr(), annot = , fmt = , cmap = , vmin = , vmax = ) annot = True(상관계수 표기 여부) fmt = '.3f'(숫자 포멧) cmap = 'RdYlBu_r'(칼라맵) vmin = -1(값의 최소) vmax = 1(최댓값)
lmplot 스크린샷 2023-08-18 오후 2 50 05 - sns.lmplot(x= , y= , hue= , data=, fit_reg=True, lowess=True)

범주형👉숫자형

수치화
  • t-test : 2 그룹간 평균에 차이가 있는가?(평균차이)
    • 범주의 수 2개 일때
    • 절댓값 2 이상이면 유효
  • anova : 여러 집단 간에 차이 비교(분산 분석)
    • 범주가 3개 이상
    • 어느 그룹 간에 차이가 있는지는 알 수 없음
    • 값이 2~3 이상이라면 유효값
  • t-test 코드(ttest_ind)
  • # t-test는 기본적으로 null이 있으면 안되기 때문에 체크 titanic.isna().sum()

NaN 행 제외

temp = titanic.loc[titanic['Age'].notnull()]

두 그룹으로 데이터 저장

died = temp.loc[temp['Survived']==0, 'Age']
survived = temp.loc[temp['Survived']==1, 'Age']

#t test
spst.ttest_ind(died, survived)


<br>

+ Anova 코드(f_oneway())
```python
# 분산 분석을 위한 데이터 만들기  
# NaN 행 제외  
temp = titanic.loc[titanic['Age'].notnull()]  

# 그룹별 저장  
P_1 = temp.loc[temp.Pclass == 1, 'Age']  
P_2 = temp.loc[temp.Pclass == 2, 'Age']  
P_3 = temp.loc[temp.Pclass == 3, 'Age']

spst.f_oneway(P_1, P_2, P_3)
시각화
그래프 그래프 형태 plt sns
Bar plot 스크린샷 2023-08-17 오후 3 01 02 - sns.barplot(x= ,y=, data= )
def bivariate_analysis(data, x, y):  
    # 데이터 유효성 검사  
    if x not in data.columns:  
        print(f"Invalid column name '{x}' for x. Please check the column name.")  
        return  

    if y not in data.columns:  
        print(f"Invalid column name '{y}' for y. Please check the column name.")  
        return  

    # 데이터 시각화  
    plt.figure(figsize=(16, 6))  

    # 범주가 2개인 경우 t-검정 수행 및 시각화 (Bar Plot)    if len(data[x].unique()) == 2:  
        plt.subplot(1, 3, 1)  
        sns.boxplot(x=x, y=y, data=data)  
        plt.title(f'Box Plot: {x} vs {y}')  

        plt.subplot(1, 3, 2)  
        sns.barplot(x=x, y=y, data=data)  
        plt.title(f'Bar Plot: {x} vs {y}')  

        category1 = data[data[x] == data[x].unique()[0]][y]  
        category2 = data[data[x] == data[x].unique()[1]][y]  
        t_stat, p_value = ttest_ind(category1, category2)  
        print(f'T-Test Results (p-value): {t_stat}, {p_value}')  

    # 범주가 3개 이상인 경우 일원 분산분석 (ANOVA) 수행 및 시각화 (Violin Plot)    elif len(data[x].unique()) >= 3:  
        plt.subplot(1, 3, 1)  
        sns.violinplot(x=x, y=y, data=data)  
        plt.title(f'Violin Plot: {x} vs {y}')  

        plt.subplot(1, 3, 2)  
        sns.barplot(x=x, y=y, data=data)  
        plt.title(f'Bar Plot: {x} vs {y}')  

        categories = [data[data[x] == category][y] for category in data[x].unique()]  
        f_stat, p_value = f_oneway(*categories)  
        print(f'ANOVA Results (p-value): {f_stat}, {p_value}')  

    plt.tight_layout()  
    plt.show()

숫자형👉범주형

시각화
  • kdeplot
    • 두가지 방법
      • ① kdeplot( , hue = 'Survived')
        • 생존여부의 비율이 유지된 채로 그려짐
        • 두 그래프의 아래 면적의 합이 1
      • ② kdeplot( , hue = 'Survived', common_norm = False)
        • 생존여부 각각 아래 면적의 합이 1인 그래프
      • ③ kdeplot( , hue = 'Survived', multiple = 'fill')
        • 나이에 따라 생존여부 비율을 비교해볼 수 있음. (양의 비교가 아닌 비율!)
  • histplot
    • bin을 적절히 쪼개면 kdeplot에서 보이지 않던 경향성(내려가는 부분도 내려갔다 올라갔다 하는 것)
그래프 그래프형태 plt sns
kdeplot 스크린샷 2023-08-18 오후 3 11 37 - sns.kdeplot(x= , data=, hue= (target), common_norm = False)
kdeplot 스크린샷 2023-08-18 오후 3 11 46 - sns.kdeplot(x=, data=, hue=, multiple='fill') plt.axhline(target.mean(), color='r')
histplot 스크린샷 2023-08-18 오후 3 14 02 - sns.histplot(x=, data=, hue=, bins= , multiple='fill')

범주형👉범주형

교차표가 기본 👉 이후 수치화 혹은 시각화

교차표
  • normalize
    • 'columns' : 열 기준 집계
    • 'index' : 행 기준 집계
    • 'all' : 전체 표 기준 집계
    • pd.crosstab(행, 열, normalize = )
수치화
  • 카이제곱검정
    • 범주형 변수들 사이에 어떤 관계가 있는지, 수치화 하는 방법
    • $Σ\frac{(관측빈도 - 기대빈도)^2}{기대빈도}$
  • 카이제곱 검정 보는법
    • 카이제곱검정 값의 크기가 클수록 대립가설이 맞다는 뜻(기대빈도로 부터 실제 값에 차이가 큼)
# 1) 먼저 교차표 집계  
table = pd.crosstab(titanic['Survived'], titanic['Pclass'])  

# 2) 카이제곱검정  
spst.chi2_contingency(table)
시각화
  • mosaic plot : 범주별 양과 비율을 나타냄
    • 빨간 선 : 전체 평균(모자이크 플롯 외에 따로 선을 추가)
    • x축 길이 : Column별 비율
    • y축 길이 : 각각의 Column별 행의 범주의 비율
    • 전체 비율 평균과 각 column별 선을 이용해 두 column이 관계 있는지 없는지 확인 가능
from statsmodels.graphics.mosaicplot import mosaic

mosaic(titanic, [ 'Pclass','Survived'])  
plt.axhline(1- titanic['Survived'].mean(), color = 'r')  
plt.show()
그래프 그래프 형태 plt mosaic
mosaic plot 스크린샷 2023-08-18 오후 1 47 27 - mosaic(데이터, [행, 열])
stacked bar 스크린샷 2023-08-18 오후 1 49 19 temp = pd.crosstab(행, 열, normalize) temp.plot.bar(stacked=Ture) -
+ 위 의 경우 plot을 그리고 전체평균을 구해서 표시 후 비교하기
+ plt.axhline(1-titanic['Survived'].mean(), color = 'r')

데이터_유형별_코드

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.graphics.mosaicplot import mosaic
import scipy.stats as spst

def eda_1_n(data, var, bins = 30) :
    display(data[[var]].describe().T)
    print('-' * 70)
    plt.figure(figsize = (8,6))
    plt.subplot(2,1,1)
    sns.histplot(x=var, data = data, bins = 20, kde = True)
    plt.grid()

    plt.subplot(2,1,2)
    sns.boxplot(x=var, data = data)
    plt.grid()
    plt.tight_layout()
    plt.show()

def eda_1_c(data, var) :
    print(f'<< {var} >>')
    temp1 = data[var].value_counts()
    temp2 = data[var].value_counts()/ data.shape[0]
    temp3 = pd.DataFrame({'class':temp1.index, 'count':temp1.values, 'prop':temp2.values})
    display(temp3)
    print('-' * 70)
    sns.countplot(x = var, data = data)
    plt.grid()
    plt.show()

def eda_2_nc(data, target, var) :
    plt.figure(figsize = (8,6))

    plt.subplot(2,1,1)
    sns.kdeplot(x=var, data = data, hue =target, common_norm=False)
    plt.xlim(data[var].min(), data[var].max())
    plt.grid()

    plt.subplot(2,1,2)
    sns.kdeplot(x=var, data = data, hue =target, multiple='fill')
    plt.axhline(data[target].mean(), color = 'r')
    plt.xlim(data[var].min(), data[var].max())
    plt.grid()
    plt.tight_layout()
    plt.show()

def eda_2_cc(data, target, var) :
    print(data[target].mean())

    temp1 = pd.crosstab(data[target], data[var])
    display(temp1)

    temp2 = pd.crosstab(data[target], data[var], normalize = 'columns')
    display(temp2)

    mosaic(data, [ var,target], gap = 0.01)
    plt.axhline(data[target].mean(), color = 'r')
    plt.show()

    # 카이제곱검정
    print(spst.chi2_contingency(temp1))

def eda_2_nn(data, col1, target):  
    display(spst.pearsonr(data[col1], data[target]))  

    plt.figure(figsize = (14,7))  
    plt.subplot(1,2, 1)  
    sns.regplot(x=col1, y=target, data=data)  

    plt.subplot(1, 2, 2)  
    sns.jointplot(x=col1, y=target, data=data)  
    plt.tight_layout()  
    plt.show()  

def eda_2_nn_h(data, col1, target, h):  
    display(spst.pearsonr(data[col1], data[target]))  

    plt.figure(figsize = (21,7))  
    plt.subplot(1,3, 1)  
    sns.regplot(x=col1, y=target, data=data)  

    plt.subplot(1, 3, 2)  
    sns.scatterplot(x=col1, y=target, data=data, hue=h)  

    plt.subplot(1, 3, 3)  
    sns.jointplot(x=col1, y=target, data=data, hue=h)  
    plt.tight_layout()  
    plt.show()


def eda_2_cn_ttest(data, col1, target, checklist):  
    temp = data.loc[data[col1].notnull(), :]  

    s1 = temp.loc[temp[col1] == checklist[0], target]  
    s2 = temp.loc[temp[col1] == checklist[1], target]  
    display(spst.ttest_ind(s1 , s2))  

    plt.figure(figsize=(6,6))  
    sns.barplot(x=col1, y=target, data=temp)

def eda_2_cn_anova(data, col1, target):  
    sns.barplot(x=col1, y=target, data=temp)

데이터 처리 및 이해의 궁극적인 목표

  1. 가설검정과 이변량분석 등을 통해 X(feature)와 Y(target)사이의 관계를 확인
  2. 통계적으로 유의미한지를 확인
  3. 비지니스를 파악하고 의미있는 정보를 추출하는 단계
  4. 상관계수, t-test등에 의해 관계가 없다고 판단되는 X(feature)가 나온 경우 제거하는 작업을 진행
    • 불필요한 변수를 제거하여 모델링 단계에서 모델의 복잡도를 줄이고 성능을 개선
    • 하지만 상관계수, t-test등에 의해 해당 feature를 제거했다고 해서 모델성능이 좋아진다고 장담할 수는 없음
    • 상관계수, t-test말고도 여러요인으로 의해 해당feature와 모델성능은 관계가 있을 수도 있기 때문

단변량 => 쓸수 있나 없나 => 이변량 => 독립 1개 종속 1개, 독립을 두고 종속변수를 바꿔보기

반응형

'데이터분석&ML&DL' 카테고리의 다른 글

YOLO 이미지 직접 Annotate하기  (0) 2023.09.22
YOLO 동영상 처리  (0) 2023.09.22
시각지능 딥러닝 정리  (0) 2023.09.22
머신러닝 정리  (0) 2023.09.22

+ Recent posts