[빅데이터분석기사] 제 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이 더 합리적이라고 생각하지만 어떨지 모르겠네요
'빅데이터 분석기사' 카테고리의 다른 글
내가 보려고 만든 빅분기 꼭 알아야할 명령어 (0) | 2023.06.24 |
---|---|
[빅데이터분석기사] 제 1유형 기출 파해치기 - 2 | 풀이 모음 | 여러 방식 | 핵심정리 (0) | 2023.06.22 |
DataFrame을 다른 데이터 타입으로 바꾸는 방법 (CSV파일로 저장하는 방법 포함) (0) | 2023.06.20 |
[빅데이터 분석기사] 제2유형 문제 풀기 - 체험하기 문제 (0) | 2023.06.19 |
[빅데이터 분석기사] python 기본 데이터 다루기 (0) | 2023.06.19 |
댓글