제 1유형 (30점)
- 1번 문제(10점) : 소주제 중 정답률이 높은 3번째 정답률 구하기
데이터 : 대주제 | 소주제 | 정답여부(0, 1) ( + 학생 ID, 문제 ID, 등등.. 데이터는 불필요)
df_corr = df.groupby(‘소주제’)[‘정답여부’].sum()
df_total = df.groupby(‘소주제’)[‘정답여부’].count()
df_ratio = df_corr / df_total
print(df_ratio.round(3).sort_values(ascending=False))
# 정답률이 1, 2등의 값이 같아서 결국 4번째 높은 값(중복 제거 시 3번째 높은 값)을 제출
답 : 0.568
- 2-1번 문제(5점) : 연도 / 월 별 매출 중 두번째로 큰 가격
데이터 : date | category | item | price
df[“date”] = pd.to_datetime(df[“date”])
df[“year”] = df[“date”].dt.year
df[“month”] = df[“date”].dt.month
print(df.groupby([“year”, “month”])[‘price’].sum().sort_values(ascending=False))
답 : 465500
- 2-2번 문제(5점) : 4번째로 매출이 높은 연/월에 가장 매출이 높은 카테고리의 매출액
4번째로 매출이 높았던 연월 : 2024.08
print(df[(df[‘year’]==2024)&(df[‘month’]==8)].groupby(‘category’)[‘price’].sum().sort_values(ascending=False))
답 : 200000
- 3번 문제(10점) : 스팸 / 햄의 단어 개수 평균 차이(절대값) 구하기
데이터 : 레이블(spam, ham) | 메시지(칼럼명 부정확)
df[“단어수”] = df[“메시지”].map(lambda x: len(x.split(“ “)))
spam_mean = df[df[“레이블”] == “spam”][“단어수”].mean()
ham_mean = df[df[“레이블”] == “ham”][“단어수”].mean()
print(abs(spam_mean - ham_mean).round(3))
답 : 9.747
제 2유형 (40점)
데이터 : 상권 유형(범주형) | 여러 수치형 변수들 | Target : 총 가스 소비량(GAS_TOTL)
# 주어진 데이터 : train(target 포함), test(target 미포함), target은 수치형
# train : 결측치 처리
train = train.target.replace(0, np.NaN)
train.dropna("target", inplace = True)
train_X = train.drop(["target"], axis=1)
train_y = train.target
test_X = test
from sklearn.model_selection import train_test_split
train_X, valid_X, train_y, valid_y = train_test_split(train_X, train_y, test_size = 0.3, random_state = 1)
# 인코딩 : OneHotEncoder
cat = train_X.select_dtypes("object").columns.to_list() # 범주형 변수 칼럼명 리스트
num = train_X.select_dtypes("number").columns.to_list() # 수치형 변수 칼럼명 리스트
from sklearn.preprocessing import OneHotEncoder
oh = OneHotEncoder(sparse_output = False, handle_unknown = 'ignore').set_output(transform='pandas')
train_X_pp = oh.fit_transform(train_X[cat])
valid_X_pp = oh.transform(valid_X[cat])
test_X_pp = oh.transform(test_X[cat])
train_X_pp = pd.concat([train_X_pp, train_X[num]], axis=1)
valid_X_pp = pd.concat([valid_X_pp, valid_X[num]], axis=1)
test_X_pp = pd.concat([test_X_pp, test_X[num]], axis=1)
# Model : RandomForestRegressor
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(random_state = 1)
rf.fit(train_X_pp, train_y)
# 성능 측정 지표 : RMSE
from sklearn.metrics import mean_squared_error
pred_val = rf.predict(valid_X_pp)
print(mean_squared_error(valid_y, pred_val, squared = False))
# 성능 측정 지표 : R2 (RMSE보다 직관적으로 평가할 수 있어서 활용)
from sklearn.metrics import r2_score
print(r2_score(valid_y, pred_val))
# test 예측값 제출
pred = rf.predict(test_X_pp)
pred = pd.DataFrame(pred, columns = ["pred"])
pred.to_csv("result.csv", index = False)
# 잘 제출 되었는지 확인
check = pd.read_csv("result.csv")
print(check) # 조건에 맞는 폼인지, test 데이터 개수와 일치하는지 확인
- 결측치 처리 (GAS_TOTL 결측치가 0으로 채워짐)
- 별도 처리 없음
- 0인 데이터 -> np.NaN으로 변환 후 mean값으로 채우기
- 0인 데이터 -> np.NaN으로 변환 후 median값으로 채우기
- 0인 데이터 -> np.NaN으로 변환 후 dropna
- 결측치를 아예 드랍시켰을 때 성능이 가장 괜찮았습니다.
- 인코딩 : OneHotEncoder
- 모델 : RandomForestRegressor
- 평가지표
- RMSE : 538
- R2 : 0.63
제 3유형 (30점)
3-1 : 로지스틱 회귀
데이터 : Attrition(이직0/잔류1) | Age | Income | 변수3
- 3-1-1번 문제(5점) : 유의미한 변수의 회귀계수 소수점 셋째까지 반올림
from statsmodels.formula.api import logit
formula = "Y ~ X1 + X2 + X3"
model = logit(formula, data = df).fit()
print(model.pvalues.round(3))
답 : -0.002 (유의미한 변수 : Income 1개)
- 3-1-2번 문제(5점) : Age가 1 증가할 때 이직/잔류 오즈비
print(np.exp(model.params.round(3))
답 : 0.967
- 3-1-3번 문제(5점) : 확률 예측
test = {X1 : [value1], X2 : [value2], X3 : [value3]}
test = pd.DataFrame(test)
print(model.predict(test).round(3))
답 : 0.724
3-2 : 다중회귀
데이터(기억이 안나서 생략하겠습니다)
- 3-2-1번 문제(5점) : 절편 제외한 회귀계수 합
from statsmodels.formula.api import ols
formula = "Y ~ X1 + X2 + X3"
model = ols(formula, data = df).fit()
print(model.params[1:].sum().round(3))
답 : -40.261
- 3-2-2번 문제(5점) : 유의미한 변수로 모델 만들어서 결정계수 구하기
print(model.pvalues < 0.05)
formula = "Y ~ X1 + X3" # pvalue가 0.05보다 큰 변수인 X2(실제 문제에서 Wall) 제거
model = ols(formula, data = df).fit()
print(model.rsquare.round(3))
답 : 0.913
- 3-2-3번 문제(5점) : 예측값 구하기
test = {X1 : [value1], X2 : [value2], X3 : [value3]}
test = pd.DataFrame(test)
print(model.predict(test).round(3))
답 : 24.702
시험 치신 분들 고생 많으셨습니다 😎