본문 바로가기
빅데이터 분석기사

[빅데이터분석기사] 제 1유형 기출 문제 파해치기 - 1 | 풀이 모음 | 여러 방식 | 핵심정리

by 공불러 2023. 6. 21.
728x90
반응형

[빅데이터분석기사] 제 1유형 기출 문제 파해치기 | 풀이 모음 | 여러 방식 | 핵심정리

제 1유형 기출

목차

     

    제 1유형은 레코드수, 최소 값, 최대 값을 구하거나 특정 변수를 생성하여 저장하는 것 그리고 내림차순, 오름 차순 정렬하는 것이 주로 나오는 것 같다. 즉, 대부분 하나의 컬럼을 기준으로 데이터를 다루고 특정 정규화 혹은 중심 경향성을 계산할 줄 아는지, 그 기준으로 다시 정렬하거나 기본적인 수행이 가능한지 물어 보는 것 같다.

     

    제 1유형 과거 문제 유형

    • Q1. (정규화 후 기준을 세워 레코드 수를 찾는 문제) mtcars 데이터셋(data/mtcars.csv)의 qsec 컬럼을 최소최대 척도(Min-Max Scale)로 변환한 후 0.5보다 큰 값을 가지는 레코드 수를 구하시오.
    • Q2. 데이터셋의 'f5' 컬럼을 기준으로 상위 10개의 데이터를 구하고, f5'컬럼 10개 중 최소값으로 데이터를 대체한 후,'age'컬럼에서 80 이상인 데이터의'f5 컬럼 평균값 구하기
    • Q3. 2022년 데이터 중 2022년 중앙값보다 큰 값의 데이터 수
    • Q4. 결측치 데이터(행)을 제거하고, 앞에서부터 60% 데이터만 활용해, 'f1' 컬럼 3사분위 값을 구하시오
    • 결측치가 제일 큰 값의 컬럼명을 구하시오.
    • Q5. age 컬럼의 3사분위수와 1사분위수의 차를 절대값으로 구하고, 소수점 버려서, 정수로 출력하기
    • Q6.(loves반응+wows반응)/(reactions반응) 비율이 0.4보다 크고 0.5보다 작으면서, type 컬럼이 'video'인 데이터의 갯수 구하기
    • Q7. date_added가 2018년 1월 이면서 country가 United Kingdom 단독 제작인 데이터의 갯수 구하기

     

     

    Q1. (정규화 후 기준을 세워 레코드 수를 찾는 문제) mtcars 데이터셋(data/mtcars.csv)의 qsec 컬럼을 최소최대 척도(Min-Max Scale)로 변환한 후 0.5보다 큰 값을 가지는 레코드 수를 구하시오.

    문제 풀이 순서

    • 1. Min-Max 척도 구하기
    • 2. Min-Max 값에서 0.5보다 큰 값 찾기
    • 3. 레코드 수 계산하기

    1. Pandas만 이용하여 Min-max 직접 계산해서 구하기

    0) 문제에서 원하는 컬럼의 최소값, 최대값을 찾기

    data['qsec'].min()과 data['qsec'].max()를 계속 써도 되지만, 변수로 지정하는 게 편하므로 아래와 같이 지정

    minqsec = data['qsec'].min()
    maxqsec = data['qsec'].max()
    # 변수명은 자기 마음대로 해도됨

    1) min-max 계산하기

    min-max 계산은 ((컬럼안의 값 - 최소값) / (최대값-최소값)으로 하면된다. 그럼 위에서 지정을 했으니까.

    scale=((data['qsec']-minqsec)/(maxqsec-minqsec))
    # scale은 변수명 마음대로 지정해도 무관함

    2) 0.5 보다 큰 수 찾기

    0.5보다 크니까 특정 변수 뒤에 > 0.5를 해주면된다. min-max 0.5보다 큰 값이니까. 계산한 값 뒤에 두면 된다.

    scale=((data['qsec']-minqsec)/(maxqsec-minqsec)> 0.5)

    3) 레코드 수 계산하기

    Sum을 알맞는 위치에 쓰는 것이 중요하다. 모든 레코드를 더해야하니까 Pandas의 sum() 메서드를 쓴다.

    이 sum 메소드가 true인 값 즉, 0.5이상인 값을 합해주는 것이다. 왜냐하면 true는 숫자로 1, false는 0이기 때문입니다.

    scale=((data['qsec']-minqsec)/(maxqsec-minqsec)> 0.5).sum()

    정답을 내기 위해선 위 변수를 출력하면 됩니다.

     

    위 예시의 전체 코드

    import pandas as pd
    data = pd.read_csv('data/mtcars.csv', index_col=0)
    
    minqsec = data['qsec'].min()
    maxqsec = data['qsec'].max()
    
    scale=((data['qsec']-minqsec)/(maxqsec-minqsec)> 0.5).sum()
    
    print(scale)

    2. NumPy로 풀기 (굳이)

    과정 자체는 동일한데, 코드만 다르다. 혹시 방식을 정해줄 수도 있으니, 알아두면 좋을 것 같다.

    import numpy as np
    import pandas as pd
    
    data = pd.read_csv('data/mtcars.csv', index_col=0)
    
    qsec = data['qsec'].values //여기서 부터 다르다.
    
    // np.메서드만 기억하자
    minqsec = np.min(qsec) 
    maxqsec = np.max(qsec)
    
    scaled_qsec = (qsec - minqsec) / (maxqsec - minqsec)
    
    scale = np.sum(scaled_qsec > 0.5)
    
    print(scale)

    3. sklearn의 MinMaxScaler로 풀기

    0). Scikit-learn 불러오기

    우선, sklearn을 쓰기 위해서, 불러와야합니다.

    from sklearn.preprocessing import MinMaxScaler

    1) 데이터 2차원 배열로 변경하기

    min-max를 sklearn이 알아서 계산할 건데, 그에 용이하게 데이터를 정리해줍니다.

    qsec = data['qsec'].values.reshape(-1, 1)

    여기에서 values.reshape(-1, 1)은 Pandas Series 객체인 data['qsec']의 값을 2차원 배열 형태로 변환하는 과정입니다.

    pandas는 분명 dataframe 객체인데 왜 Series가 될까요? 그건 dataframe에서 하나의 열만 뽑았기 때문에 series가 된 것입니다.

    Pandas Series 객체는 1차원의 데이터를 가지고 있습니다. 하지만 sklearn의 MinMaxScaler는 2차원 배열 형태의 입력을 요구합니다. 따라서 values 속성을 사용하여 Pandas Series를 NumPy 배열로 변환한 뒤, reshape(-1, 1)을 적용하여 배열의 차원을 변경합니다. reshpe의 (매개변수)는 행의 차원과 열의 차원을 적는 것입니다. 여기에서 -1은 자동 정렬입니다.

    2) MinMax 계산하기

    그리고 이제, min-max를 만들어 qsec에 적용해야합니다. minmaxscaler라는 객체(min-max 계산기)를 만들고 이 객체를 qsec에 적용하면 됩니다. 객체생성은 MinMaxScaler()이며, fit_transform(데이터)는 데이터를 정규화합니다.

    scaler = MinMaxScaler()
    scaled_qsec = scaler.fit_transform(qsec)

    3) 0.5보다 높은 데이터 찾아서 갯수 세기

    scale = (scaled_qsec > 0.5).sum()

    form sklearn.preprocessing  import  MinMaxScaler 사용 전체 코드

    import pandas as pd
    data = pd.read_csv('data/mtcars.csv')
    from sklearn.preprocessing import MinMaxScaler
    
    qsec = data['qsec'].values.reshape(-1,1)
    
    scaler = MinMaxScaler() # 스케일러를 만들고
    scaled_qsec = scaler.fit_transform(qsec) # 데이터를 스케일링
    # print(scaled_qsec)
    scale = (scaled_qsec > 0.5).sum() # 0.5보다 큰걸 구한 다음 더하기 
    print(scale) # 출력

     

    Q, age 컬럼의 3사분위수와 1사분위수의 차를 절대값으로 구하고, 소수점 버려서, 정수로 출력하기

    0) 데이터 불러오기

    import pandas as pd
    data = pd.read_csv("data/basic1.csv")

    1) age 데이터에 결측치나 이상치가 없는지, 데이터형태는 무엇인지 확인하기

    이 부분은 결측치나 이상치가 있는지 .info() 메서드를 data가 아닌 age자체에 쓰면 오류가 날 것입니다. 이유는 데이터프레임에서 뽑아온 열은 시리즈이기 때문입니다.

    만약, 억지로 데이터셋 중 하나의 열에 info()를 쓰고 싶다면, 데이터프레임으로 바꿔야합니다.

    age_df = pd.DataFrame(age)
    print(age_df.info())

     

    출력 결과는 'age' 컬럼에는 100개의 유효한 값이 있고, 결측치가 없는 것을 확인할 수 있습니다. 데이터 타입이 float64이므로 해당 컬럼의 값들은 소수점을 가질 수 있는 부동 소수점 숫자임을 알 수 있습니다.

     

    아래 코드와 같이 isnull().any()를 사용하여 'age' 열에 결측치가 있는지 확인하고, 일반적으로 120세이상이 있기 어렵다는 가정과 0세 미만이 있을 수 없다라는 가정에서 ((age >= 100) | (age < 0)).any()를 사용하여 이상치를 확인했습니다.  any() 불리언 시퀀스(예: 리스트, 시리즈)에서 어떤 원소가 하나라도 True인지 확인하는 함수입니다. 작성하고 바로 print 해보면 됩니다.

    missing = age.isnull().any()
    # 결측치확인
    print(missing)
    
    #이상치 확인
    outliers =  ((age >= 100) | (age < 0)).any()
    print(outliers)

    위 명령을 했을 때, False가 나오면 결측치가 없는 것입니다. is null이 없는 거니까요. 하지만, true가 나왔으면, 다시 확인해야합니다. 총 갯수까지 확인해보니, 1개의 이상치가 있습니다.

    outliers =  ((age >= 100) | (age < 0)).any()
    num_outliers = outliers.sum()
    print(num_outliers)

    일단, 이상치를 재확인한 결과 0세 미만, 101세 초과로 변경하여 출력해보니, 3개의 이상치가 있습니다.

    outliers = age[(age < 0) | (age > 100)]
    # age[] 이부분은 조건에 맞는 index를 찾아 값을 보여주기 위함입니다.
    print("0세 이하와 100이상의 값:")
    print(outliers)

    재확인 결과

    우선, 이 이상치를 null값으로 바꾸고 진행하겠습니다. 이상치 처리 전과 후가 차이가 있는지도 함께 보도록 하죠.

    #이상치 처리 방법 : Null값 대체
    age_processed = age.copy()
    # 먼저 새로운 시리즈 생성
    age_processed[(age_processed <= 0) | (age_processed >= 100)] = np.nan
    np.nan으로 null값 변경

    2) 사분위 수 계산하기

    사분위수는 quantile() 메서드로 구합니다. quantile() 은 pandas 라이브러리의 DataFrame과 Series 객체에서 사용할 수 있는 메서드입니다.

    import pandas as pd
    import numpy as np
    data = pd.read_csv("data/basic1.csv")
    
    
    age=data['age']
    count_age = age.isnull().sum()
    # print('기존', count_age)
    df_age = pd.DataFrame(age)
    
    missing = age.isnull().any()
    
    # outliers = age[(age < 0) | (age > 100)]
    # print("0세 이하와 100이상의 값:")
    # print(outliers)
    
    age_process = age.copy()
    age_process[age_process < 0 | (age_process > 100)] =np.nan
    count_age_process = age_process.isnull().sum()
    # print('이상치처리', count_age_process)
    
    nq3 = age_process.quantile(0.75)
    nq1 = age_process.quantile(0.25)
    diff = int(abs(nq3-nq1))
    print("이상치 처리:", diff)
    
    
    q3 = age.quantile(0.75)
    q1 = age.quantile(0.25)
    diff = int(abs(nq3-nq1))
    print("이상치 처리 안함:", diff)

    3) 절대값 및 결과

    절대값은 abs를 지정해주면 됩니다.

    diff = int(abs(nq3-nq1))

    분석 결과는 다르게 나오는데, 시험장에서 어떻게 적용될지는 잘 모르겠습니다. 연구자로써는 47이 더 합리적이라고 생각하지만 어떨지 모르겠네요

    728x90
    반응형

    댓글