[프로디에스ASSO] 실기python_안경추천을 위한 고객 성별분류(이분산검정,train_test_split,LR,성능평가)

Hyejin Beck·2023년 11월 21일
0

통계학

목록 보기
5/13

답안코드

# 초기환경셋팅 (진행후 주석처리함)
# !pip install -r requirements.txt

# 처음 불러오기
import pandas as pd 
data = pd.read_csv('./Dataset/Dataset_03.csv')

# q1문제를 위한 원본 복사 
q1 = data.copy()

# 이마폭,이마높이의 비율에 대한 변수 생성
q1['forehead_ratio'] = q1['forehead_width_cm']/q1['forehead_height_cm']

# 평균, 표준편차 단위 구하기
mean = q1['forehead_ratio'].mean()
std = q1['forehead_ratio'].std()

# 평균으로부터 3 표준편차(std) 밖 구간 
# -3std <---me|an---> +3std
up3std = mean + (3 * std)  # 상위 
down3std = mean - (3*std)  # 하위 

# 구간 내 (이상치) 갯수 
q1['forehead_ratio']< down3std  
q1['forehead_ratio']> up3std

(q1['forehead_ratio']< down3std ) | (q1['forehead_ratio']> up3std)   # or 
out = (q1['forehead_ratio']< down3std ) | (q1['forehead_ratio']> up3std)
out.sum() 
print(f'outlier의 갯수는 {out.sum()}')

# q2문제를 위한 원본 복사
q2 = q1.copy()

# 성별에 따른 forehead_ratio평균(위에 만든변수)구하기 
q2.gender.unique() 
# array(['Male', 'Female'], dtype=object)

q2[q2.gender=='Male']
q2[q2.gender=='Male']['forehead_ratio'] 
group_m = q2[q2.gender=='Male']['forehead_ratio'] # 남자그룹별 평균 

q2[q2.gender=='Female']
q2[q2.gender=='Female']['forehead_ratio'] 
group_f = q2[q2.gender=='Female']['forehead_ratio'] # 여자그룹별 평균

# 통계검정을 위한 함수 불러오기
from scipy.stats import ttest_ind ,  bartlett
# ttest_ind 이표본T검정 = 독립성 
# ttest_rel 이표본T검정 = 관계성 
# bartlett 등분산 검정용 

# 등분산검정 (등분산이다 vs 등분산이 아니다(이분산이다)) 
bartlett(group_m, group_f)

# T-Test검정
ttest_ind(group_m, group_f, equal_var=False)
# equal_var = True 등분산 
# equal_var = False 이분산 
q2_out = ttest_ind(group_m, group_f, equal_var=False)
q2_out
print(q2_out)

# pvalue가 유의수준0.05보다 작다면 대립가설(등분산이 아니다 = 이분산이다) 
# pvalue=0.002718670239065719 이므로 이분산이다. 

# 검정통계량 구하기 
q2_out.statistic
print(f'검정통계량은 {q2_out.statistic:.3f}')

# q3문제를 위한 원본 복사
q3 = data.copy()

# 데이터셋 분리를 위한 함수 
from sklearn.model_selection import train_test_split

# 데이터셋 분리
train_test_split(q3, test_size=0.3, random_state=123)

train, test = train_test_split(q3, test_size=0.3, random_state=123)

# 데이터셋 분리후 확인

train # 3500 
test # 1501 
q3.info() # 5001 
# len(q3), len(train), len(test)

# 참고로 len()했을때 error 가 나오는데, 
# 이전 실수로 len = 이렇게 변수지정을 했기 때문에 그럽니다. 
# del len 한다음 len(train) 하니 정상적으로 출력되었습니다. 

# 7개변수 Feautres 정의 (label인 gender만 제외)
features = train.columns.drop('gender')

# 로지스틱회귀분석 함수 
from sklearn.linear_model import LogisticRegression

# 로지스틱회귀분석 모델 
# model = LogisticRegression()

# 조건추가 
# 조건1. penalty = 'L2'
# 조건2. Inverse of Regularization = 10000
# 조건3. solver = newton-cg
# 조건4. seed(random_state) = 123 

# 로지스틱 회귀분석 모델 with 위의 조건 
model = LogisticRegression(
    C = 100000, 
    solver='newton-cg', 
    random_state=123
)

# 로지스틱 회귀분석 학습 
model.fit(train[features], train.gender)

# 로지스틱 회귀분석 예측값 
pred = model.predict(test[features])

# (이건 그냥 추가가정) 참고로 만약 확률로 예측한다면? 
pred_pr = model.predict_proba(test[features])

# pred 와 pred_pr 
print(pred) # 각각 레이블로 예측 
print(pred_pr) # 각각 확률이 구해짐 = 알파벳순 = 여기에서는 array[Female, Male] 순 

# 로지스틱 회귀분석 결과 = 성능평가 모듈 함수
from sklearn.metrics import classification_report, precision_score

# 성능평가 (실제값, 예측값)
classification_report(test.gender, pred)
print(classification_report(test.gender, pred))

# Male의 Precision 값은 ? 
print(f'Male의 Precision 값은 0.96입니다.')

풀이과정






답안정리

손공부

이대로 외워라

# 초기설치 
# !pip install -r requirements.txt

# 불러오기 
import pandas as pd 
data = pd.read_csv('./Dataset/Dataset_03.csv')
data.info()

############################ 1번문제를 위한 원본 복사
q1 = data.copy()

# 이마의 폭과 높이 사이의 비율 = 변수생성 
q1['forehead_ratio'] = q1['forehead_width_cm'] / q1['forehead_height_cm']

# 이마의 폭과 높이 사이의 비율을 기준으로, 평균값과 표준편차 구하기 
q1_mean = q1['forehead_ratio'].mean()
q1_std = q1['forehead_ratio'].std()

# 평균으로부터 3 표준편차 밖의 경우 구하기 
up = q1_mean + (3 * q1_std)
down = q1_mean - (3 * q1_std)

# 3 표준편차 기준으로 이상치 
q1['forehead_ratio'] < down 
q1['forehead_ratio'] > up 
(q1['forehead_ratio'] < down ) | (q1['forehead_ratio'] > up )    # or = 하나라도 적용되면 
(q1['forehead_ratio'] < down ) | (q1['forehead_ratio'] > up ).sum()
((q1['forehead_ratio'] < down ) | (q1['forehead_ratio'] > up )).sum()

############################ 2번문제를 위한 원본 복사
q2 = q1.copy()

# 성별의 그룹내 갯수 
q2.gender.unique()        # array(['Male', 'Female'], dtype=object) --> 2개

# 성별에 따른 forehead_ratio평균 각각 그룹 구하기 
q2[q2.gender=='Male']
q2[q2.gender=='Male']['forehead_ratio'] 
group_m = q2[q2.gender=='Male']['forehead_ratio'] # 남자그룹별 평균 

q2[q2.gender=='Female']
q2[q2.gender=='Female']['forehead_ratio'] 
group_f = q2[q2.gender=='Female']['forehead_ratio'] # 여자그룹별 평균

# 그룹내 갯수가 2개면       t-test 검정 
# 그룹내 갯수가 3개이상이면   ANOVA  검정  (2개일때 사용하기도함)

# 통계검정을 위한 함수 불러오기
from scipy.stats import ttest_ind ,  bartlett
# ttest_ind 이표본T검정 = 독립성 
# ttest_rel 이표본T검정 = 관계성 
# bartlett 등분산 검정용 

# 여기에서는 이분산을 가정하고 있으나, 해당 조건이 주어지지 않을 때 등분산 검정부터 먼저 해야함. 
# 검정을 위한 함수 불러오기
from scipy.stats import ttest_ind ,  bartlett
# ttest_ind 이표본T검정 = 독립성 
# ttest_rel 이표본T검정 = 관계성 
# bartlett 등분산 검정용 

# 등분산검정 (등분산이다 vs 등분산이 아니다(이분산이다)) 
bartlett(group_m, group_f)

# T-Test검정
ttest_ind(group_m, group_f, equal_var=False)
# equal_var = True 등분산 
# equal_var = False 이분산 
q2_out = ttest_ind(group_m, group_f, equal_var=False)
q2_out
print(q2_out)

# pvalue가 유의수준0.05보다 작다면 대립가설(등분산이 아니다 = 이분산이다) 
# pvalue=0.002718670239065719 이므로 이분산이다. 

# 검정통계량 구하기 
q2_out.statistic
print(f'검정통계량은 {q2_out.statistic:.3f}')

############################ 3번문제를 위한 원본 복사
q3 = data.copy()

# 데이터셋 분리를 위한 함수 
from sklearn.model_selection import train_test_split

# 데이터셋 분리 조건 
train_test_split(q3, test_size=0.3, random_state=123)

# 데이터셋 분리 진행 
train, test = train_test_split(q3, test_size=0.3, random_state=123)

# 데이터셋 분리 후 확인 
print(len(train),len(test),len(q3))

# 7개변수 Feautres 정의 (label인 gender만 제외)
features = train.columns.drop('gender')

# 로지스틱회귀분석 함수 
from sklearn.linear_model import LogisticRegression

# 조건추가 
# 조건1. penalty = 'L2'
# 조건2. Inverse of Regularization = 10000
# 조건3. solver = newton-cg
# 조건4. seed(random_state) = 123 

# 위의 조건으로 로지스틱회귀분석 모델링 
model = LogisticRegression(
    C = 100000, 
    solver='newton-cg', 
    random_state=123
)

# 로지스틱 회귀분석 학습 
model.fit(train[features], train.gender)

# 로지스틱 회귀분석 예측값 
pred = model.predict(test[features])

# (이건 그냥 추가가정) 참고로 만약 확률로 예측한다면? 
pred_pr = model.predict_proba(test[features])

# pred 와 pred_pr 
print(pred) # 각각 레이블로 예측 
print(pred_pr) # 각각 확률이 구해짐 = 알파벳순 = 여기에서는 array[Female, Male] 순 

# 로지스틱 회귀분석 결과 = 성능평가 모듈 함수
from sklearn.metrics import classification_report, precision_score

# 성능평가 (실제값, 예측값)
classification_report(test.gender, pred)
print(classification_report(test.gender, pred))

# Male의 Precision 값은 ? 
print(f'Male의 Precision 값은 0.96입니다.')

이대로 풀어봐라

# 초기설치 및 불러오기 


############################ 1번문제를 위한 원본 복사

# 이마의 폭과 높이 사이의 비율 = 변수생성 


# 이마의 폭과 높이 사이의 비율을 기준으로, 평균값과 표준편차 구하기 


# 평균으로부터 3 표준편차 밖의 경우 구하기 


# 3 표준편차 기준으로 이상치 

############################ 2번문제를 위한 원본 복사

# 성별의 그룹내 갯수 


# 성별에 따른 forehead_ratio평균 각각 그룹 구하기 


# 통계검정을 위한 함수 불러오기


# 여기에서는 이분산을 가정하고 있으나, 해당 조건이 주어지지 않을 때 등분산 검정부터 먼저 해야함. 
# 검정을 위한 함수 불러오기


# 등분산검정 (등분산이다 vs 등분산이 아니다(이분산이다)) 


# T-Test검정


# T-Test검정결과 
# 유의수준0.05보다 pvalue작다면 대립가설(등분산이 아니다 = 이분산이다) 


# 검정통계량 구하기 


############################ 3번문제를 위한 원본 복사


# 데이터셋 분리를 위한 함수 


# 데이터셋 분리 조건 


# 데이터셋 분리 진행 


# 데이터셋 분리 후 확인 


# 7개변수 Feautres 정의 (label인 gender만 제외)


# 로지스틱회귀분석 함수 


# 조건추가 
# 조건1. penalty = 'L2'
# 조건2. Inverse of Regularization = 10000
# 조건3. solver = newton-cg
# 조건4. seed(random_state) = 123 

# 위의 조건으로 로지스틱회귀분석 모델링 


# 로지스틱 회귀분석 학습 


# 로지스틱 회귀분석 예측값 


# (이건 그냥 추가가정) 참고로 만약 확률로 예측한다면? 


# pred 와 pred_pr 의 차이? 
# 각각 레이블로 예측 하는 것은 ? 
# 각각 확률이 구해짐 = 알파벳순 = 여기에서는 array[Female, Male] 순으로 진행되는 것은? 

# 로지스틱 회귀분석 결과 = 성능평가 모듈 함수


# 성능평가 (실제값, 예측값 확인)


# Male의 Precision 값은 ? 
profile
데이터기반 스토리텔링을 통해 인사이트를 얻습니다.

0개의 댓글

관련 채용 정보