ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SK쉴더스 루키즈AI 7,8,9일차 - 데이터 전처리, EDA
    정보 보안 2025. 6. 18. 17:29

    from sklearn.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder, OneHotEncoder

     

    StandardScaler
    평균을 0, 표준편차를 1로 바꿔줌
    즉, 데이터들을 정규화해서 "표준 정규분포"처럼 만들어줌

    [100, 120, 130] → [ -1.2, 0.0, 1.2 ]  (대략)

     

    MinMaxScaler
    데이터를 0~1 사이로 비율 맞춰줌
    예: 최소값 → 0, 최대값 → 1

    [100, 120, 130] → [0.0, 0.67, 1.0]

     

    LabelEncoder
    문자(카테고리)를 숫자로 바꿔줌
    클래스 이름을 **0, 1, 2...**처럼 번호로 바꿈

    ["dog", "cat", "cat", "bird"] → [2, 1, 1, 0]

     

    OneHotEncoder
    문자를 "0/1 벡터"로 바꿔줌
    머신러닝 모델에 적합한 형태로 만들기 위함

    ["cat", "dog", "bird"] →
    [[1, 0, 0],  # cat
     [0, 1, 0],  # dog
     [0, 0, 1]]  # bird

     

     

    평균 : 다 더해서 전체 갯수로 나눔

     

    최빈값 : 가장 많이 등장

     

    중앙값: 정렬 후 중앙

     

    pandas에서 다음으로 구할 수 있다.

     

    데이터 분산성 : 데이터가 평균을 기준으로 얼마나 퍼져있는 지

    분산, 표준편차, 사분위수

     

    분산 : 값이 클수록 데이터가 퍼져있음

    각 데이터값에서 평균을 뺀 후(편차) 음수 제거를 위해 제곱한 후 이 값의 평균을 계산

     

    표준편차 : 분산은 편차를 제곱한 다음 평균을 계산했기에 이의 제곱근을 구한 게 표준편차

    분산과 달리 데이터와 동일한 단위를 사용하므로 해석하기 쉽다.

     

    사분위수 : 데이터를 네 개의 구간으로 나누는 값

     statistics 라이브러리로 이들을 사용할 수 있다.

     

     

    대표적인 데이터 분포에는 3가지가 있다.

    정규분포, 왜도, 첨도

     

    정규분포는 데이터가 평균을 중심으로 대칭되어있다.

    평균 중앙값 최빈값이 동일하고

    데이터의 68%는 평균 +-1 표준편차 내에있고

    95%가 평균 +-2 표준편차 내에있다.

    왜도는 데이터의 비대칭성을 측정하는 값이다.

    왜도가 +면 데이터가 오른쪽으로 꼬리가 길게 늘어나고 -면 그 반대다.

    왜도가 +면 평균>중앙값>최빈값이고 -면 그반대다.

     

    첨도는 분포의 꼭대기가 얼마나 뾰족한지 아니면 평평한지를 측정하는 값이다.

    첨도가 클수록 (첨도>3) 뾰족하다. 중앙에 몰려있다. 극단치가 가끔 존재한다.

    첨도가 낮을수록 (첨도<3) 평평하다. 고르게 퍼져있다. 

     

    데이터 분석을 할 때 여러 데이터셋을 합쳐야 할 때가 많은데, merge와 concat은 둘 다 데이터를 합치는

    기능을 하지만 기준에 따라서 사용방식이 다르다고 한다.

     

    merge는 기준열을 기반으로 데이터를 합친다 (sql의 join)

     

    반대로 concat은 단순히 데이터를 이어붙인다.

     

    데이터 분포 확인 방법도 2가지가 있다.

     

    EDA : 데이터 탐색적 분석

     

    데이터셋의 구조와 특성 탐색

     

    데이터를 시각적으로 관찰하고 수치로 요약하고 데이터 분포, 이상치, 결측치 등을 확인

     

    결측값은 평균값으로 대체, 삭제, 또는 예측값으로 대체

     

    변수 간 관계를 시각적으로 탐색


    나이, 성별, 연수입, 소비점수라는 4개의 열을 가지고 있는 파일을 분석하는 시간을 가졌다.
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt

    df = pd.read_csv("Mall_Customers.csv")
    df.columns = ['CustomerID', 'Gender', 'Age', 'AnnualIncome', 'SpendingScore']
    df['Gender_Num'] = df['Gender'].map({'Male': 0, 'Female': 1})

    print("기초 통계:\n", df.describe())

    corr = df[['Gender_Num', 'Age', 'AnnualIncome', 'SpendingScore']].corr()
    print("\n상관계수:\n", corr)

    plt.figure(figsize=(6, 4))
    sns.heatmap(corr, annot=True, cmap='coolwarm', fmt=".2f")
    plt.title("Correlation Matrix")
    plt.tight_layout()
    plt.show()


    나이와 소비점수는 음의 상관관계를 보여주고 있다.
    sns.countplot(data=df, x='Gender')
    plt.title("Gender Distribution")
    plt.show()

    sns.histplot(data=df, x='Age', bins=10, kde=True)
    plt.title("Age Distribution")
    plt.show()

    sns.scatterplot(data=df, x='AnnualIncome', y='SpendingScore', hue='Gender')
    plt.title("Income - Spending Score")
    plt.show()


    연수입이 50k$ 근처인 사람들은 소비점수가 50점 근처에 모여있다.
    중산층은 소비를 비슷비슷하게 하는 경향이 있는걸까?

    sns.scatterplot(data=df, x='Age', y='SpendingScore', hue='Gender')
    plt.title("Age - Spending Score")
    plt.show()


    40세를 기점으로 소비점수가 60점 이상을 넘지 않는 경향을 보인다.
    나이가 차면 사치를 멀리하고 경제관념이 잡히는 걸까?

Designed by Tistory.