통계 및 머신러닝 과제 내용 정리

Data_Student·2024년 12월 11일
0

개인 과제 정리

목록 보기
1/1

통계 및 머신러닝 과제 내용 정리

# 기본 라이브러리
import pandas as pd
import numpy as np 
import scipy.stats as stats
from datetime import datetime, timedelta

필수 1 기초 통계

  • statistics csv 파일을 읽고, 성별 Review Rating 에 대한 평균과 중앙값을 구해주세요.
    결과는 소수점 둘째자리까지 표현해주세요.
  • 그리고 이에 대한 해석을 간략하게 설명해주세요.
import pandas as pd
import numpy as np 
import scipy.stats as stats
from datetime import datetime, timedelta

# 파일 읽기
df = pd.read_csv('statistics.csv')

# 성별 Review Rating 에 대한 평균과 중앙값 ( 소수점 둘째자리까지 표현 )
df.groupby(['Gender'])[['Review Rating']].agg(['mean','median']).round(2)

필수 2. 통계적 가설검정

  • 성별, Review Rating 컬럼에 대한 T-TEST 를 진행해주세요.
    • 귀무가설과 대립가설을 작성해주세요.
    • t-score, P-value 를 구해주세요.
    • 그리고 이에 대한 귀무가설 채택/기각 여부와 그렇게 생각한 이유를 간략하게 설명해주세요.
# 귀무가설 : 성별에 따른 Review Rating은 차이가 없을 것이다.
# 대립가설 : 성별에 따른 Review Rating은 차이가 있을 것이다.

# t-score, P-value 구하기
m_df = df[df['Gender']=='Male']
f_df = df[df['Gender']=='Female']
m_df = m_df[['Review Rating']]
f_df = f_df[['Review Rating']]
t, pvalue = stats.ttest_ind(m_df,f_df)
t, pvalue


# 귀무가설 : 성별에 따른 Review Rating은 차이가 없을 것이다.
# 대립가설 : 성별에 따른 Review Rating은 차이가 있을 것이다.

# 귀무가설 채택/기각 여부와 그렇게 생각한 이유
# 귀무가설 채택
# t-score가 크지 않기 때문에 그룹 간 차이가 크지 않다는 것을 의미한다.
# p-value 값이 0.05보다 높으면 우연히 일어났을 가능성이 높으며, 연관성이 없다고 추정할 수 있다.
# 그렇기 때문에 대립가설을 기각하고 귀무가설을 채택한다.

필수 3. 통계적 가설검정2

  • Color, Season 컬럼에 대한 카이제곱 검정을 진행해주세요.
    • 귀무가설과 대립가설을 작성해주세요.
    • 두 범주형 자료의 빈도표를 만들어주세요. 이를 코드로 작성하여 기재해주세요.
    • 카이제곱통계량, P-value 를 구해주세요.
    • 그리고 이에 대한 귀무가설 채택/기각 여부와 그렇게 생각한 이유를 간략하게 설명해주세요
# 가설 설정
# 귀무가설 : Color과 Season에는 관련성이 없을 것이다.
# 대립가설 : Color과 Season에는 관련성이 있을 것이다.

# 두 범주형 자료의 빈도표를 만들어주세요. 이를 코드로 작성하여 기재해주세요.
table = pd.crosstab(df['Color'],df['Season'])
table

# 카이제곱통계량, P-value를 구해주세요
stats.chi2_contingency(observed=table)[0:2]

# 귀무가설 채택/기각 여부와 그렇게 생각한 이유
# P-value 값이 0.05보다 높으면 우연히 일어났을 가능성이 높으며, 연관성이 없다고 추정할 수 있다.
# 그렇기 때문에 대립가설을 기각하고 귀무가설을 채택한다.

필수 4. 머신러닝1

  • 아래와 같은 데이터가 있다고 가정하겠습니다.데이터를 바탕으로 선형 회귀 모델을 훈련시키고, 회귀식을 작성해주세요.
    • 독립 변수(X): 광고예산 (단위: 만원)
    • 종속 변수(Y): 일일 매출 (단위: 만원)
    • X=[10, 20, 30, 40, 60, 100]
    • Y=[50, 60, 70, 80, 90, 120]
  • 회귀식을통해, 새로운 광고예산이 1,000만원일 경우의 매출을 예측(계산)해주세요.
from sklearn.linear_model import LinearRegression

# 주어진 데이터 셋
X=[10, 20, 30, 40, 60, 100]
Y=[50, 60, 70, 80, 90, 120]

# 선형회귀 모델
model = LinearRegression()

# 리스트 → array 형식 → 2차원
X = np.array(X).reshape(-1,1)

# 학습
model.fit(X,Y)

# 회귀식 구하기 ( coef_ : 기울기 / intercept_ : 절편)
a = model.coef_[0]
b = model.intercept_

print(f'회귀식 : y = {a.round(5)}x + {b.round(4)}')
print('광고 예산이 1,000만원일 경우 매출액 :', a.round(5)*1000 + b.round(4))

도전 1. 머신러닝2

  • Review Rating, Age, Previous Purchases 컬럼을 활용하여, 고객이 할인(Discount Applied)을 받을지 예측하는 RandomForest모델을 학습시켜 주세요. 그리고 모델 정확도를 계산해주세요.
    • y(종속변수)는 Yes/No 로 기재된 이진형 데이터입니다. 따라서, 인코딩 작업이 필요합니다. 구현을 위해 LabelEncoder를 사용해주세요.
    • 머신러닝시, 전체 데이터셋을 Train set과 Test set 으로 나눠주세요. 해당 문제에서는Test set비중을 30%로 설정해주세요. random_state는 42로 설정해주세요.
      • Train Set: 모델을 학습하는데 사용하는 데이터셋
      • Test Set: 적합된 모델의 성능을 평가하는데 사용하는 데이터셋
      • RandomForestClassifier 를 활용하여 모델 학습을 진행해주세요. random_state는 42로 설정해주세요.
      • 참고) https://www.ibm.com/kr-ko/topics/random-forest
# 라이브러리 불러오기
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder

# 원본 데이터 copy
df2 = df.copy()

# Label encoding
le2 = LabelEncoder()

# X값과 y값 설정
X2 = df2[['Review Rating','Age','Previous Purchases']]
y2 = le2.fit_transform(df2['Discount Applied'])

# Train 및 Test 데이터로 분리
X2_train, X2_test, y2_train, y2_test = train_test_split(X2, y2, test_size=0.3, random_state=42)

# RF 실험 및 정확도 확인
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X2_train, y2_train)
accuracy = rf_model.score(X2_test, y2_test)
print(accuracy)

도전 2. 머신러닝3

  • Subscription Status 컬럼을 종속변수로 사용하여 고객의 이탈 여부를 예측하는 로지스틱 회귀 모델 학습을 진행해주세요. Age, Purchase Amount, Review Rating을 활용하여 모델을 훈련한 후, 연령 30세, 구매 금액 50 USD, 리뷰 평점 4.0인 고객의 이탈 확률을 계산해주세요.
    • y(종속변수)는 Yes/No 로 기재된 이진형 데이터입니다. 따라서, 인코딩 작업이 필요합니다. 구현을 위해 LabelEncoder를 사용해주세요.
    • 머신러닝시, 전체 데이터셋을 Train set과 Test set 으로 나눠주세요. 해당 문제에서는Test set비중을 30%로 설정해주세요. random_state는 42로 설정해주세요.
      • Train Set: 모델을 학습하는데 사용하는 데이터셋
      • Test Set: 적합된 모델의 성능을 평가하는데 사용하는 데이터셋
    • 연령 30세, 구매 금액 50 USD, 리뷰 평점 4.0 인 고객을 new_customer 라는 변수에 지정해주세요. 1차원이 아닌 이중 대괄호[[...]]로 지정해주세요. (모델 입력 형식은 2차원 배열이어야 하므로)
    • model.predict_proba 를 사용하여 이탈 확률을 구해주세요.
      • predict_proba의 반환값: 모델이 각 클래스에 속할 확률을 계산합니다. 결과는 다음과 같은 배열로 반환됩니다.
      • [[P(클래스 0), P(클래스 1)]]
      • P(클래스 0): 이 고객이 이탈하지 않을 확률.
      • P(클래스 1): 이 고객이 이탈할 확률.
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

# 원본 데이터 copy
df3 = df.copy()

# label 인코딩
le3 = LabelEncoder()

# 로지스틱 모델
lor = LogisticRegression()

# X값과 y값 설정
X3 = df3[['Age','Purchase Amount (USD)','Review Rating']]
y3 = le3.fit_transform(df3['Subscription Status'])

# 데이터 분리
X3_train, X3_test, y3_train, y3_test = train_test_split(X3, y3, test_size=0.3, random_state=42)

# 모델 학습
lor.fit(X3_train,y3_train)

# new_customer 변수 생성
nc = [[30, 50, 4.0]]
nc_col = ['Age','Purchase Amount (USD)','Review Rating']
new_customer = pd.DataFrame(nc, columns=nc_col)
new_customer

# 이탈 확률 구하기
lor.predict_proba(new_customer)
p0 = lor.predict_proba(new_customer)[0][0]
p1 = lor.predict_proba(new_customer)[0][1]

print(p0.round(2), ': 이 고객이 이탈하지 않을 확률입니다.')
print(p1.round(2), ': 이 고객이 이탈할 확률입니다.')

0개의 댓글