셀프스터디/빅데이터 분석기사

빅데이터 분석기사 실기 1유형 문제풀이

티로즈 2021. 11. 27. 20:29

 

[개념복습] object타입 => 연,월,일,시간 타입으로 변경
df['컬럼명'] = pd.to_datetime(df['컬럼명'], format='포맷형태')

<format>
%Y : 4글자 년도
%y : 2글자 년도
%m : 2글자 월
%d : 2글자 일
%X : 00:00:00 형태 시간

 

[유형1 문제1]

import pandas as pd
df.head(5)

#Q1. 여름철(6월,7월,8월) 이화동이 수영동보다 높은 기온을 가진 시간대는 몇개인가?
df['time'] = pd.to_datetime(df['time'],format='%Y-%m-%d %X')
df.loc[(df['time'].dt.month.isin([6,7,8])) & (df['이화동기온'] > df['수영동기온']), 'time'].count()

# Q2. 이화동과 수영동의 최대강수량의 시간대를 각각 구하여라
df.loc[df['이화동강수']==df['이화동강수'].max(), 'time']
df.loc[df['수영동강수']==df['수영동강수'].max(), 'time']

 

[dir, help 사용방법]

dir() : 함수 리스트 확인 할 때 사용
ex)
import pandas as pd
dir(pd)

[출력결과] ['BooleanDtype', 'Categorical', 'CategoricalDtype', 'CategoricalIndex', 'DataFrame', 'DateOffset', 'DatetimeIndex', 'DatetimeTZDtype', 'ExcelFile', 'ExcelWriter', 'Float64Index',... 후략] 
help() : 해당 함수를 어떻게 사용하는 지 확인할 때 사용
ex) 
help(pd.to_datetime)

[출력결과] 파라메터, 리턴값, 사용예시가 (영어로) 나온다.
Examples --------
Assembling a datetime from multiple columns of a DataFrame. The keys can be common abbreviations like ['year', 'month', 'day', 'minute', 'second', 'ms', 'us', 'ns']) or plurals of the same
>>> df = pd.DataFrame({'year': [2015, 2016], ... 'month': [2, 3], ... 'day': [4, 5]})
>>> pd.to_datetime(df) 0 2015-02-04 1 2016-03-05 dtype: datetime64[ns]

자동완성에 익숙한 사람이 많을테니, 적어도 dir, help 사용법이라도 익히고 가면 전체 명령어를 굳이 다 외우지 않아도 충분히 찾아서 풀 수 있을 것 같다. 다만 import문은 도움 받을 수도 없으니, 자주 쓰는 건 무조건 외워가야^^

 

[유형1 문제2]

import pandas as pd
df.head(5)

#Q1.  남성 이탈(Exited)이 가장 많은 국가(Geography)는 어디이고 이탈 인원은 몇명인가?
result = df.loc[df.Gender=='Male'].groupby('Geography')[['Exited']].sum()
내 방식대로 풀어도 답은 알 수 있긴 한데, 정렬이 맘대로 안되넹
#df.loc[df.Gender=='Male'].groupby(['Geography']).sum().Exited <- 이건 카페 풀이

#Q2. 카드를 소유(HasCrCard ==1)하고 있으면서 활성멤버(IsActiveMember ==1) 인 고객들의 평균나이는? 
df.loc[(df['HasCrCard']==1) & (df['IsActiveMember']==1), 'Age'].mean()
<=> df.loc[(df.HasCrCard==1) & (df.IsActiveMember==1)].Age.mean() 
빅분기 인강에서는 컬럼을 문자열 방식으로 접근했는데, 카페에서는 변수처럼 접근해서 풀이하더라.
찾아보니 영어만 되는거넹

#Q3. Balance 값이 중간값 이상을 가지는 고객들의 CreditScore의 표준편차를 구하여라
df.loc[df['Balance'] >= df['Balance'].median(),'CreditScore'].std()
<-> df.loc[df.Balance >= df.Balance.median].CreditScore.std()

 

[유형1 문제3]

[t-검정]
- 개념 : 모집단의 분산이나 표준편차가 알려지지 않았을때, 정규분포의 모집단에서 모은 표본(샘플)의 분산이나 표준편차를 이용하여 두 모집단 간의 평균 차이를 통해 두 집단이 같은지 다른지 알아보는 검정 방법

- 사용 조건 : 1. 독립성
(독립변수 그룹군은 서로 독립적) 2. 정규성(종속변수는 정규분포를 따름) 3. 등분산성

- 집단의 수는 최대 2개까지 비교 가능, 3개 이상인 경우 ANOVA 사용

- t-검정 과정
①귀무가설 설정(H0) ②대립가설 설정(H1) ③신뢰도 설정(모수가 신뢰구간 안에 포함될 확률)
④p-value 확인(신뢰도 95% 기준 p-value<0.05 이면 귀무가설 기각 = 기존 가설을 폐기하고 대립가설 채택)

- t-검정 사용 조건
①종속변수가 양적 변수(Numerical)일 때 ②모집단의 표준편차를 모를 때 ③모집단의 분포가 정규분포일 때
④평균의 차이로 집단의 유사성을 확인할 때

#1. 시력(좌) 와 시력(우)의 값이 같은 남성의 허리둘레의 평균은?
df.loc[(df['시력(좌)']==df['시력(우)']) & (df['성별코드']=='M'), '허리둘레'].mean()
# Q2. 40대(연령대코드 40,45) 여성 중 '총콜레스테롤'값이 40대 여성의 '총콜레스테롤' 중간값 이상을  가지는 그룹과 
 50대(연령대코드 50,55) 여성 중 '총콜레스테롤'값이 50대 여성의 '총콜레스테롤' 중간값 이상을 가지는 두 그룹의
 '수축기혈압'이 독립성,정규성,등분산성이 만족하는것을 확인했다. 두 그룹의 '수축기혈압'의 독립표본 t 검증 결과를 통계값, p-value 구분지어 구하여라

f1 = df.loc[(df['성별코드']=='F') & (df['연령대코드(5세단위)'].isin([40,45])),:]
f2 =df.loc[(df['성별코드']=='F') & (df['연령대코드(5세단위)'].isin([50,55])),:]

f1_f = f1.loc[f1['총콜레스테롤']>=f1['총콜레스테롤'].median()]['수축기혈압'] #['수축기혈압'] 추가해서 Series로 만들어주기
f2_f = f2.loc[f2['총콜레스테롤']>=f2['총콜레스테롤'].median()]['수축기혈압'

import scipy.stats #scipy 이용한 t-검정
scipy.stats.ttest_ind(f1_f, f2_f, equal_var=True) #등분산성을 만족하므로 equal_var=True 조건 주기

[출력값] Ttest_indResult(statistic=-8.954384087520708, pvalue=4.399762427897212e-19)

 

[유형1 문제4]

import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/Datamanim/datarepo/main/smoke/train.csv")

#Q1. 수축기혈압과 이완기 혈압기 수치의 차이를 새로운 컬럼('혈압차') 으로 생성하고, 
#연령대 코드별 각 그룹 중 '혈압차' 의 분산이 5번째로 큰 연령대 코드를 구하여라
df['혈압차'] = df['수축기혈압']-df['이완기혈압']
df.groupby('연령대코드(5세단위)')[['혈압차']].var().sort_values('혈압차').tail(5)
#Q2. 비만도를 나타내는 지표인 WHtR는 허리둘레 / 키로 표현한다. 일반적으로 0.58이상이면 비만으로 분류한다. 
#데이터중 WHtR 지표상 비만인 인원의 남/여 비율을 구하여라
df['WHtR'] = df['허리둘레'] / df['신장(5Cm단위)']
result = df.loc[df['WHtR']>=0.58'성별코드'].value_counts()
result['M']/result['F']

 

[3주차 예상문제1]

#Q1. Vehicle_Age 값이 2년 이상인 사람들만 필터링 하고 그중에서 Annual_Premium 값이 전체 데이터의 중간값 이상인 사람들을 찾고, 
#그들의 Vintage값의 평균을 구하여라 (Vehicle_Age : <1 Year, 1-2Year, .. Vintage : 정수) 
df_1 = df.loc[(df['Vehicle_Age']== "> 2 Years") & (df['Annual_Premium'] >= df['Annual_Premium'].median()),:]
result = df_1['Vintage'].mean()
result

[내 답] 154.43647182359118
#Q2. vehicle_age에 따른 각 성별(gender)그룹의 Annual_Premium값의 평균을 구하여 
#아래 테이블과 동일하게 구현하라 (표 구성 : Gender Vehicle_Age(1-2Year / <1 YEar / >2Years) / Female / Male) 

[내답]

[3주차 예상문제2] 

#Q1. price_range 의 각 value를 그룹핑하여 각 그룹의 n_cores 의 빈도가 가장높은 value와 그 빈도수를 구하여라
#(price_range : 1, 2, ... n_cores : 2, 3, ... ) 
다시 풀어보기

[개념 복습]

Series.size : 데이터 값의 개수 반환 = len(s)

Series.count() : NaN을 제외한 값을 반환

value_counts() : NaN을 제외하고 각 값들의 빈도를 표시

Dataframe.sort_values(0:index 기준, 1:colums 기준)

 

[4주차 예상문제1]

Q1. Arrival Delay in Minutes 컬럼이 결측치인 데이터들 중 'neutral or dissatisfied' 보다 'satisfied'의 수가 더 높은 Class는 어디 인가? (Arrival Delay in Minutes: float satisfaction : neutral or dissatisfied, satisfied) 
df_Q1 = df.loc[df['Arrival Delay in Minutes'].isna(),['Class','satisfaction']]
df_Q1.groupby(['Class','satisfaction'])['satisfaction'].count()
print('Business')

 

[4주차 예상문제2]

#Q1. ph값은 상당히 많은 결측치를 포함한다. 결측치를 제외한 나머지 데이터들 중 사분위값 기준 하위 25%의 값들의 평균값은? (ph : float) 
df_ph = df['ph'].dropna()
result = df_ph.loc[df_ph<=df_ph.quantile(0.25)].mean()
result

 

[5주차 예상문제1]

#Q1. 흡연자와 비흡연자 각각 charges의 상위 10% 그룹의 평균의 차이는? (smoker : yes, no charges:float) 
df_ph = df['ph'].dropna()
result = df_ph.loc[df_ph<=df_ph.quantile(0.25)].mean()
result

 

[5주차 예상문제2]

#Q1. bedrooms의 빈도가 가장 높은 값을 가지는 데이터들의 price의 상위 10%와 하위 10% 값의 차이를 구하여라 (bedrooms : int, price:float) 
df['bedrooms'].value_counts()
high, low = df.loc[df.bedrooms==3].price.quantile([0.90.1])
result = high - low
print(result)

 

[6주차 예상문제1]

#Q1. Serial No. 컬럼을 제외하고 'Chance of Admit'을 종속변수(Y), 나머지 변수를 독립변수(X)라 할때, 
#랜덤포레스트를 통해 회귀 예측을 할 떄 변수중요도 값을 출력하라 (시드값에 따라 순서는 달라질수 있음)
from sklearn.ensemble import RandomForestRegressor #회귀예측 : Regressor / 분류예측 : Classifier

 

 

출처: 이기적스터디카페