ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 머신러닝 3 / 코드카타 / 판다스
    [스파르타코딩클럽]데이터분석 과정/TIL,WIL 2024. 1. 31. 20:51

    머신러닝

    • 데이터분석 프로세스

    데이터 수집 -> 데이터 전처리 -> EDA -> 모델링 & 평가 -> 배포

    • 탐색적 데이터 분석 (EDA)
    데이터의 시각화, 기술통계 등의 방법을 통해 데이터를 이해하고 탐구하는 과정

     

    include = 'all' : 범주형 데이터 확인 가능

    countplot 범주형 자료의 빈도 수 시각화
    범주형의 데이터의 각 카테고리별 빈도수
    barplot 범주형 자료의 시각화
    범주형 데이터의 각 카테고리에 따른 수치 데이터의 평균 비교
    boxplot 수치형 & 범주형 자료의 시각화
    데이터의 분포, 중앙값, 사분위 수 이상치 표현
    histogram 수치형 자료 빈도 시각화
    연속형 분포를 나타내고, 몰려있는 구간 파악
    scatterplot 수치형끼리 자료의 시각화
    두 연속혀 변수간의 관계를 시각화
    pairplot 전체 변수에 대한 시각화
    한 번에 여러 개의 변수를 동시에 시각화
    • 이상치
    보통 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값
    -데이터가 정규분포를 따른다고 가정할 때 평균에서 표준편차의 3배 이상 떨어진 값
    -모든 데이터가 정규 분포를 따르지 않을 수 있기 때문에 다음 상황에서 제한됨
      - 데이터가 크게 비대칭일 때
      - 샘플 크기가 작을 경우

    -IQR을 이용한 이상치 처리 : boxplot

    Q1 = df['column'].quantile(0.25)
    Q3 = df['column'].qunatile(0.75)
    IQR = Q3 - Q1
    uppper_limit = Q3 + 1.5*IQR
    lower_limit = Q1 - 1.5*IQR

    -ESD를 이용한 처리

    import numpy as np
    mean = np.mean(data)
    std = np.std(data)
    upper_limit = mean + 3*std
    lower_limit = mean - 3*std
    • 결측치
    존재하지 않는 데이터

     

    -결측치 처리 방법

    • 수치형 데이터 

          -평균값 대치

          -중앙값 대치

    • 범주형 데이터

          -최빈값 대치

    • 함수

         -간단한 삭제 & 대치

    df.dropna(axis = 0)`: 행 삭제
    df.dropna(axis = 1)`: 열 삭제
    Boolean Indexing
    df.fillna(value)`: 특정 값으로 대치(평균, 중앙, 최빈값)

         -알고리즘

    sklearn.impute.SimpleImputer`:평균, 중앙, 최빈값으로 대치
    SimpleImputer.statistics_` : 대치한 값 확인 가능
    sklearn.impute.IterativeImputer`: 다변량대치(회귀 대치)
    sklearn.impute.KNNImputer`: KNN 알고리즘을 이용한 대치
    • 범주형 데이터 전처리 - 인코딩
    어떤 정보를 정해진 규칙에 따라 변환

     

    -레이블 인코딩 

    •  정의 : 문자열 범주형 값을 고유한 숫자로 할당
    •  특징 : 모델이 처리하기 쉬운 수치형으로 데이터 변환하지만 실제로 그러지 않아 잘못 해석할 수 있음
    • 사용함수
    sklearn.preprocessing.LabelEncoder`
    
    `fit`: 데이터 학습
    `transform`: 정수형 데이터로 변환
    fit_transform`: fit과 transform을 연결하여 한번에 실행
    inverse_transform` : 인코딩된 데이터를 원래 문자열로 변환
    
    classes_`: 인코더가 학습한 클래스(범주)

    -원-핫 인코딩

    • 정의 : 각 범주를 이진 형식으로 변환하는 기법
    • 특징 : 각 범주가 독립적으로 표현되어, 순서가 중요도를 잘못 학습하는 것을 방지, 명목형 데이터에 권장한다. 다만 범주 개수가 많을 경우 차원이 크게 증가해 모델의 복잡도를 증가시키고 과적합을 유발한다
    • 사용함수
    pd.get_dummies`
    sklearn.preprocessing.OneHotEncoder`
    
    categories_`: 인코더가 학습한 클래스(범주)
    get_feature_names_out()`: 학습한 클래스 이름(리스트)
    • 수치형 데이터 전처리 - 스케일링
    수치형 자료에 대한 전처리

     

    -표준화

    • 정의  각 데이터에 평균을 빼고 표준편차를 나누어 평균을 0 표준편차를 1로 조정하는 방법
    • 특징 : 이상치가 있거나 분포가 치우쳐저 있을 때 유용하고, 모든 특성의 스케일을 동일하게 맞추지만 데이터의 최대 최소값이 정해지지 않았다.
    • 함수
    sklearn.preprocessing.StandardScaler`
    
     fit : 데이터학습(평균과 표준편차를 계산)
    transform: 데이터 스케일링 진행
    
    `mean_`: 데이터의 평균 값
    `scale_`, `var_`: 데이터의 표준 편차,분산 값
    `n_features_in_`: fit 할 때 들어간 변수 개수
    `feature_names_in_`: fit 할 때 들어간 변수 이름
    `n_samples_seen_` : fit 할 때 들어간 데이터의

     

    -정규화

    • 정의 : 데이터를 0과 1 사이 값으로 조정
    • 특징 : 모든 특성의 스케일을 동일하게 맞추며 최대-최소 범위가 명확하지만 이상치에 영향을 많이 받을 수 있다.
    • 함수
    sklearn.preprocessing.MinMaxScaler
    
    data_min_`: 원 데이터의 최소 값
    data_max_`: 원 데이터의 최대 값
    data_range_` : 원 데이터의 최대-최소 범위

     

    -로버스트 스케일링

    • 정의 : 중앙값과 IQR을 사용하여 스케일링
    • 특징 : 이상치의 영향에 덜 민감하지만 표준화와 정규화에 비해 덜 사용된다.
    • 함수
    sklearn.preprocessing.RobustScaler
    
      center_: 훈련 데이터의 중앙값

     

    • 과적합
    데이터를 너무 과도하게 학습한 나머지 해당 문제만 잘 맞추고 새로운 데이터를 제대로 예측 혹은 분류하지 못한 현상

     

    -과적합의 원인

    • 모델의 복잡도
    • 데이터 양이 충분하지 않음
    • 학습 반복이 많음
    • 데이터 불균형

    -과적합 해결 : 테스트 데이터의 분리 (7:3)

    sklearn.model_selection.train_test_split
    파라미터
    test_size: 테스트 데이터 세트 크기
    train_size: 학습 데이터 세트 크기
    shuffle: 데이터 분리 시  섞기
    random_state`: 호출할 때마다 동일한 학습/테스트 데이터를 생성하기 위한 난수 값. 수행할 때 마다 동일한 데이터 세트로 분리하기 위해 숫자를 고정 시켜야 함
    반환 값(순서 중요)
    `X_train`, `X_test`, `y_train`, `y_test`

     

    • 교차검증
    데이터 셋을 여러 개의 하위 집합으로 나누어 돌아가면서 검증 데이터로 사용하는 방법
    • K-Fold Validation

    -정의 : Train Data를 K개의 하위 집합으로 나누어 모델을 학습시키고 모델을 최적화 하는 방법

    -K는 분할의 갯수

    데이터가 부족할 경우 유용

    skelarn.model_selection.KFold
    sklearn.model_selection.StrifiedKFold: 불균형한 레이블(Y)를 가지고 있을 때 사용
    • GridSearchV

     


    SQL 코드카타

    고양이와 개는 몇 마리 있을까
    보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문
    이때 고양이를 개보다 먼저 조회

     

    • 몇 마리 : count
    • 동물 종 : group by
    • 정렬 : order by
    SELECT ANIMAL_TYPE, COUNT(*) count
    FROM ANIMAL_INS
    GROUP BY 1
    ORDER BY 1;

     

    Product Sales Analysis 3
    판매된 모든 제품의 첫 해에 대한 제품 ID, 연도, 수량 그리고 가격 SQL
    • 판매된 모든 제품의 첫해 : where의 서브쿼리
    • 첫해 : min(year)
    SELECT product_id, year as first_year, quantity, price
    FROM Sales
    WHERE (product_id, year) in (
        SELECT product_id, MIN(year)
        FROM Sales
        GROUP BY PRODUCT_ID
    )

     

    Revising Aggregations - The Count Function
    인구가 100000 이상인 도시의 수
    • 인구가 100000 이상 : population >= 100000
    • 도시의 수 : count
    SELECT COUNT(*)
    FROM CITY
    WHERE POPULATION >= 100000;

     


    파이썬 코드카타

    명예의 전당(1)
    출연한 가수의 점수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면 해당 가수의 점수를 명예의 전당
    출연 가수의 점수가 기존의 명예의 전당 목록의 k번째 순위의 가수 점수보다 더 높으면, 출연 가수의 점수가 명예의 전당에 오르게 되고 기존의 k번째 순위의 점수는 명예의 전당에서 내려옴
    • 명예의 전당 순위 : a =[]
    • k개의 점수라면~ : if
    • 최하점수 저장 : .append(i)
    • 명예의 전당에서 가장 적은 점수 제거 : remove
    • 그 자리가 채워짐 : append(i)
    def solution(k, score):
        answer = []
        #명예의 전당 순위
        a=[]
        for i in score:
            #k개의 점수 중 최하 점수 저장 
            if len(a)<k:
                a.append(i)
            else:
                #가장 적은 점수 제거
                #명예의 전당 오름
                if min(a)<i:
                    a.remove(min(a))
                    a.append(i)
            answer.append(min(a))
        return answer

     

    2016
    2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일인지 리턴하는 함수
    • 요일 : thu부터 시
    • a 이전의 월 반복해서 a월의 요일 찾기 : for i in range(a-1):
    def solution(a, b):
        answer = ''
        #금 1 토 2 ... -> 나머지값이 0인 요일 : 목요일
        day=["THU","FRI","SAT","SUN","MON","TUE","WED"]
        month_len=[31,29,31,30,31,30,31,31,30,31,30,31]
        #2016년 1월 1일부터 입력 날짜까지의 전체 일 수
        total_day=0
        #a 이전의 월 반복 -> 해당 월 길이 + today_day 
        for i in range(a-1):
            total_day+=month_len[i]
        total_day+=b
        result=total_day%7
        answer=day[result]
        return answer

     

     

     

     


    판다스

    • Datetime : 시간 데이터의 전처리
    pandas.Series.dt.year: 연도
    pandas.Series.dt.month: 월
    pandas.Series.dt.day: 일
    pandas.Series.dt.hour: 시
    pandas.Series.dt.minute: 분
    pandas.Series.dt.second: 초
    pandas.Series.dt.microsecond: micro 초
    pandas.Series.dt.nanosecond: nano 초
    pandas.Series.dt.week: 주
    pandas.Series.dt.weekofyear: 연중 몇 째주
    pandas.Series.dt.dayofweek: 요일
    pandas.Series.dt.weekday: 요일 (dayofweek과 동일)
    pandas.Series.dt.dayofyear: 연중 몇 번째 날
    pandas.Series.dt.quarter: 분기
    • to_numeric: 수치형 데이터로 변환하는 방법
    • insert(컬럼 인덱스, 컬럼명, 값) : 중간에 컬럼 추가
    • drop() : 인덱스 지정하여 삭제, 범위 지정해서 삭제 가능
    • fancy indexnig을 활용하여 삭제
    • axis = 1 옵션 지정
    • 다수의 컬럼 삭제 가능
    • 바로 적용 : inplace = True
    • pd.cut() : 구간 나누기
    • pd.qcut() : 동일한 갯수를 갖도록 구간 분할하지만 간격은 일정하지 않
Designed by Tistory.