SoftWare

[빅데이터분석기사] 코드예시

chesleashin 2024. 10. 17. 14:05
# 작업형 1유형
import pandas as pd

df = pd.read_csv("data/mtcars.csv")
# 데이터 확인
# print(df.info())
# print(df.head())

from sklearn.preprocessing import MinMaxScaler

mm = MinMaxScaler()
df['qsec'] = mm.fit_transform(df[["qsec"]])
# ["컬럼명"] - 1차원 시리즈 형태
# [["컬럼명"]] - 2차원 데이터프레임 형태 (선택!)
# print(df['qsec'])

result = df['qsec'] > 0.5
print(result)   # True: 1 / False: 0

# 정답
print(result.sum())    # 답: 9

##########################################################
# 작업형 2유형(분류)

import pandas as pd

# 1. 데이터 수집
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

# 2. 데이터 정규화(결측값 또는 라벨 인코딩, 문자열 >> 수치형)
# 결측값 대체
train.fillna(train["환불금액"].mode()[0], inplace=True)   # inplace=True: 원본에 반영
test.fillna(train["환불금액"].mode()[0], inplace=True)   # inplace=True: 원본에 반영

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
train["주구매상품"] = le.fit_transform(train["주구매상품"])
train["주구매지점"] = le.fit_transform(train["주구매지점"])
test["주구매상품"] = le.fit_transform(test["주구매상품"])
test["주구매지점"] = le.fit_transform(test["주구매지점"])
# print(train.info())
# print("#########################")
# print(test.info())

# 3. 정답 데이터 지정
from sklearn.model_selection import train_test_split

X = train.drop(columns=["성별", "회원ID"])    # 독립변수
y = train["성별"]                            # 종속변수y = train["성별"]                            # 종속변수


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2024)

# 4. 모델 생성
from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=150, max_depth=20, random_state=2024)

# 5. 모델 학습
rfc.fit(X_train, y_train)
pred1 = rfc.predict(X_test)

# 성능평가
from sklearn.metrics import roc_auc_score, accuracy_score

roc = roc_auc_score(y_test, pred1)
acc = accuracy_score(y_test, pred1)
#print(roc, acc)

# 6. 모델 예측
test_X = test.drop(columns=["회원ID"])    # 독립변수
pred2 = rfc.predict(test_X)
#print(pred2)

# 7. 정답 제출
pd.DataFrame({'pred': pred2}).to_csv('result.csv', index=False)
result = pd.read_csv('result.csv')
print(result.tail())

###############################################################
# 작업형 2유형(회귀)
import pandas as pd

# 데이터 불러오기

# 데이터 전처리(결측값, 라벨인코딩)
df["fuel_type"].fillna(df["fuel_type"].mode()[0], inplace=True)
df["accident"].fillna(df["accident"].mode()[0], inplace=True)
df["clean_title"].fillna(df["clean_title"].mode()[0], inplace=True)

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()    # 라벨인코딩
df["brand"] = le.fit_transform(df["brand"])
df["model"] = le.fit_transform(df["model"])
df["milage"] = le.fit_transform(df["milage"])
df["fuel_type"] = le.fit_transform(df["fuel_type"])
df["engine"] = le.fit_transform(df["engine"])
df["transmission"] = le.fit_transform(df["transmission"])
df["ext_col"] = le.fit_transform(df["ext_col"])
df["int_col"] = le.fit_transform(df["int_col"])
df["brand"] = le.fit_transform(df["brand"])
df["brand"] = le.fit_transform(df["brand"])
df["accident"] = le.fit_transform(df["accident"])
df["clean_title"] = le.fit_transform(df["clean_title"])
df["price"] = le.fit_transform(df["price"])
#df.info()

train = df.iloc[:3800,:]
test = df.iloc[-209:,:]
# print(train.info())
# print(test.info())

# 데이터 분할
from sklearn.model_selection import train_test_split

X = train.drop(columns=['price'])   # 독립변수
y = train["price"]                  # 종속변수
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2024)

# 모델링 및 학습
from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=169, max_depth=20, random_state=10)   # 옵션 암기 필수
rfr.fit(X_train, y_train)
pred1 = rfr.predict(X_test)

# 모델 성능평가
from sklearn.metrics import mean_squared_error
import numpy as np

mse = mean_squared_error(y_test, pred1)
print('mse:', mse)     # 120756.5011278152 >> 우리 예측값과 실제값이 얼마나 차이나는지를 보여줌, >> 작으면 작을수록 좋음 >> 제곱값이므로 루트 씌워줘야 함
rmse = np.sqrt(mse)
print("rmse:", rmse)    # 347.500361334798 >> 루트 씌운 값 확인

# 최종결과 예측
test_X_data = test.drop(columns=['price'])
pred2 = rfr.predict(test_X_data)

# 결과 제출
pd.DataFrame({'price': pred2}).to_csv('result.csv', index=False)
res = pd.read_csv('result.csv')
# print(res)


##############################################################
# 작업형 3유형
# 독립성 검정: 변수가 두 개 이상의 범주로 분할되어 있을 때 사용되며, 각 범주가 서로 독립적인지 연관성이 있는지 검정하는 방법

# 귀무가설(H0): 두 변수는 서로 독립적이다.(연관X)
# 대립가설(H1): 두 변수는 서로 독립적이지 않다.(연관O)
# p-value < 0.05 귀무가설 기각(연관O), 대립가설 채택

# 로지스틱 회귀분석
# 독립 변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는 데 사용되는 통계 기법
from statsmodels.formula.api import logit

# logit 함수 전체 결과 확인 코드
# logit('종속변수명 ~ 독립변수명1 + 독립변수명2 + 독립변수명3', data=데이터프레임명).fit().summary()
# logit함수 summary 결과에서 coef(coefficient 계수)는
# 각 독립변수의 오즈비에 log(상용로그가 아닌 자연상수 e에 대한 로그)를 씌운 값(즉, log(오즈비))
# 오즈비를 보면 해당 독립변수가 종속변수에 미치는 영향을 더 직관적으로 확인할 수 있음.

# logit함수의 계수들을 하나의 array로 확인하는 코드
# logit('종속변수명 ~ 독립변수명1 + 독립변수명2 + 독립변수명3', data=데이터프레임명).fit().params
# 위의 결과에 np,exp() 처리를 해주면 각각의 회귀계수들을 밑이 자연상수 e인 지수함수로 변환할 수 있음

import pandas as pd
df = pd.read_csv("data/Titanic.csv")
#print(df.info())

# 1번 문제
# 카이제곱 검정방법 순서
# 1. 패키지 추가
from scipy.stats import chi2_contingency

# 2. 데이터 테이블로 만들기(범주형: pd.crosstab / 수치형: np.array)
table = pd.crosstab(df.Gender, df.Survived)
#print(help(chi2_contingency))

# 3. 만든 table로 chi2검정(chi2, p_val, dof(자유도), exp(기대치))
chi2, pval, dof, exp = chi2_contingency(table)
#print(chi2, pval, dof, exp)
#print(round(chi2,3))    # 260.717
#print(pval)    # pvalue가 0에 거의 가까운 값이니, 0.05보다 작으므로 귀무가설 기각(연관O) >> Gender & Survived 변수 간에 연관성이 있다!

# 2번문제
from statsmodels.formula.api import logit
result1 = logit('Survived ~ Gender + SibSp + Parch + Fare', data=df).fit().summary()
#print(result1)    # Parch변수의 계수(coef): -0.201

# 3번문제
import numpy as np
result2 = logit('Survived ~ Gender + SibSp + Parch + Fare', data=df).fit().params     # 로그함수가 취해진 상태
print(result2)
print(np.exp(result2))    # 밑이 e인 지수함수로 변환
# SibSp의 오즈비: 0.702