문제 1. 기초 통계
- statistics csv 파일을 읽고, 성별 Review Rating 에 대한 평균과 중앙값을 동시에 구해주세요. 결과는 소수점 둘째자리까지 표현해주세요. 그리고 이에 대한 해석을 간략하게 설명해주세요.
- 결과 제출형태
- 코드와 결과값
- 해석
💡 문제 풀이
`내 풀이`
# [ 문제1번 ]
import pandas as pd
import numpy as np
import scipy.stats as stats
from datetime import datetime, timedelta
statistics = pd.read_csv('statistics.csv')
statistics_gender_rating = statistics.groupby('Gender')['Review Rating'].agg(['mean','median']).round(2).reset_index()
display(statistics_gender_rating)
# 결과 해석
# 여성의 리뷰 평점 평균은 3.74이고, 중앙값은 3.7입니다.
# 남성의 리뷰 평점 평균은 3.75이고, 중앙값은 3.8입니다.
# 평균과 중앙값은 남성이 여성보다 각각 0.01, 0.1 높아 남성이 약간 더 긍정적으로 리뷰하는 경향이 있습니다.
# 그러나 그 차이가 크지 않아 통계적으로 유의미한 차이인지 살펴볼 필요가 있습니다.
💡 출력 결과
문제 2. 통계적 가설검정
- 성별, Review Rating 컬럼에 대한 T-TEST 를 진행해주세요.
- 해당 데이터셋의 컬럼들은 정규성을 만족한다고 가정하겠습니다.
- 귀무가설과 대립가설을 작성해주세요.
- t-score, P-value 를 구해주세요.
- 그리고 이에 대한 귀무가설 채택/기각 여부와 그렇게 생각한 이유를 간략하게 설명해주세요.
- 결과 제출형태
- 귀무가설, 대립가설
- 코드와 결과값
- 해석(채택여부 및 이유)
💡 문제 풀이
`내 풀이`
# [ 문제2번 ]
# 단측검정
female_rating = statistics[statistics['Gender'] == 'Female']['Review Rating']
male_rating = statistics[statistics['Gender'] == 'Male']['Review Rating']
tscore, pvalue = stats.ttest_ind(female_rating,male_rating, alternative='greater')
H0 = '리뷰 평점은 남녀 성별에 따라 차이가 없다.'
H1 = '남성의 리뷰 평점이 여성보다 높다.'
print(f"귀무가설: {H0}\n대립가설: {H1}\nt-score: {tscore}\np-value: {pvalue}")
alpha = 0.05
if pvalue < alpha:
print(f"귀무가설을 기각하고 대립가설을 채택한다. {H1}")
else:
print(f"귀무가설을 채택한다. {H0}")
# 결과 해석
# p값이 0.69로 0.05보다 크므로 귀무가설을 채택합니다.
# 리뷰 평점은 남녀 성별에 따라 차이가 없으며, 기존에 관측된 차이는 무작위로 발생한 것입니다.
양측검정도 해보았는데 결과는 마찬가지로 귀무가설 채택이었다.
# 양측검정
female_rating = statistics[statistics['Gender'] == 'Female']['Review Rating']
male_rating = statistics[statistics['Gender'] == 'Male']['Review Rating']
tscore, pvalue = stats.ttest_ind(female_rating,male_rating)
H0 = '리뷰 평점은 남녀 성별에 따라 차이가 없다.'
H1 = '리뷰 평점은 남녀 성별에 따라 차이가 있다.'
print(f"귀무가설: {H0}\n대립가설: {H1}\nt-score: {tscore}\np-value: {pvalue}")
alpha = 0.05
if pvalue < alpha:
print(f"귀무가설을 기각하고 대립가설을 채택한다. {H1}")
else:
print(f"귀무가설을 채택한다. {H0}")
# 결과 해석
# p값이 0.61로 0.05보다 작으므로 귀무가설을 채택합니다.
# 리뷰 평점은 남녀 성별에 따라 차이가 없습니다.
`오답노트`
- 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인할 때, t 검정 : `stats.ttest_ind`
- tscore, pvalue = stats.ttest_ind(female_rating,male_rating)
- `확인 필요!!` 단측검정 시 귀무가설을 '작거다 같다'가 아닌 '차이가 없다'로 해도 될까?
- 원래 아래와 같이 잘못 풀었다가 고쳤다. 문제 1번에서 데이터프레임을 그대로 활용하려고 했는데 오류가 있었음
# 이건 잘못된 풀이!
# stats.ttest_ind()가 두 개의 숫자(female_mean과 male_mean)이 아니라
# 두 개의 배열을 인수로 받아야 하기 때문에 tscore, pvalue가 np.float64(nan)으로 나옴
female_mean = statistics_gender_rating.loc[0,'mean']
male_mean = statistics_gender_rating.loc[1,'mean']
tscore, pvalue = stats.ttest_ind(female_mean,male_mean)
💡 출력 결과
문제 3. 통계적 가설검정2
- Color, Season 컬럼에 대한 카이제곱 검정을 진행해주세요.
- 귀무가설과 대립가설을 작성해주세요.
- 두 범주형 자료의 빈도표를 만들어주세요. 이를 코드로 작성하여 기재해주세요.
- 카이제곱통계량, P-value 를 구해주세요.
- 그리고 이에 대한 귀무가설 채택/기각 여부와 그렇게 생각한 이유를 간략하게 설명해주세요.
- 결과 제출형태
- 귀무가설, 대립가설
- 코드와 결과값
- 해석(채택여부 및 이유)
💡 문제 풀이
`내 풀이`
# [ 문제3번 ]
# color,season 열만 추출
sorted = statistics[['Color','Season']]
# 각 조합의 개수를 알 수 있는 value 컬럼 추가
sorted['value'] = 1
# color, season별 그룹화, 각 조합의 수량 합계 구하기
purchase = sorted.groupby(['Color','Season']).sum().reset_index()
# 피봇테이블
pivot = purchase.pivot(index='Color', columns='Season', values='value')
# 독립성 검정
chisq, pvalue, dof, expeted = stats.chi2_contingency(pivot)
chi_h0 = '고객이 구매한 상품의 색상과 계절은 관련이 없다.'
chi_h1 = '고객이 구매한 상품의 색상과 계절은 관련이 있다.'
print(f"귀무가설: {chi_h0}\n대립가설: {chi_h1}\nchisq: {chisq:.3f} \npvalue: {pvalue:.3f}")
alpha = 0.05 # 유의수준
if pvalue < alpha:
print(f"귀무가설을 기각한다. {chi_h1}")
else:
print(f"귀무가설을 채택한다. {chi_h0}")
# 결과 해석
# p값이 0.719로 0.05보다 크므로 귀무가설을 채택합니다.
# 고객이 구매한 상품의 색상과 계절은 관련이 없습니다.
`오답노트`
- 두 범주형 요소간 관계가 있는지 확인할 때, 카이제곱검정 독립성검정 : `stats.chi2_contingency(df)`
- chisq, pvalue, dof, expeted = stats.chi2_contingency(pivot)