728x90
반응형
In [30]:
import tensorflow as tf
In [31]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:100% !important;}</style>"))
1. 데이터 로드¶
In [2]:
import pandas as pd
import seaborn as sns
import scipy as sp
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
df = pd.read_csv('cosmetics_.csv', encoding='utf-8')
df.head()
Out[2]:
2. 전처리¶
1 ) 성별¶
In [4]:
# 성별 전처리
from collections import Counter
Counter(df['gender'])
Out[4]:
In [5]:
# 성별 count 및 pieplot으로 시각화
from collections import Counter
group = Counter(df['gender']).values()
group_names = ['man','woman']
group_colors = ['yellowgreen', 'lightcoral']
plt.pie(group,
labels = group_names,
colors = group_colors,
autopct='%1.2f%%',)
Out[5]:
2 ) 결혼여부¶
In [6]:
# 결혼여부 전처리
Counter(df['marriage'])
Out[6]:
In [8]:
# 결혼여부 count 및 pieplot으로 시각화
group = Counter(df['marriage']).values()
group_names = ['single','married']
group_colors = ['yellowgreen', 'lightcoral']
plt.pie(group,
labels = group_names,
colors = group_colors,
autopct='%1.2f%%',)
Out[8]:
3 ) 왜도와 첨도 분석해보기¶
In [9]:
# 왜도
from scipy.stats import skew
df['amount'].skew()
Out[9]:
In [10]:
# 첨도
from scipy.stats import kurtosis
df['amount'].kurtosis()
Out[10]:
4 ) Outlier 의 탐지 및 제거와 전후 분포 비교¶
In [11]:
# amount 칼럼의 박스플롯 시각화를 통해 이상치 분포 확인
plt.boxplot(df['amount'])
Out[11]:
In [12]:
# 칼럼의 데이터 요약정보 확인
df['amount'].describe()
Out[12]:
In [13]:
# 사분위수 값 확인
df['amount'].quantile()
Out[13]:
In [14]:
# 중위값 확인
df['amount'].median()
Out[14]:
In [15]:
# Inter-Quantile == 바닥부터 75% 지점의 값 - 바닥부터 25% 지점의 값
Q1 = df['amount'].quantile(q = 0.25)
Q3 = df['amount'].quantile(q = 0.75)
IQR = Q3 - Q1
IQR
Out[15]:
In [45]:
# 상한치 : 바닥부터 75% 지점의 값 + IQR의 1.5배
# 하한치 : 바닥부터 25% 지점의 값 - IQR의 1.5배
# 그 기준을 넘기면 Outlier로 판단이 가능
upper = Q3 + IQR * 1.5
lower = Q1 - IQR * 1.5
mask_upper = df['amount'] > upper
mask_lower = df['amount'] < lower
new_df = df[~(mask_upper | mask_lower)]
In [46]:
# 변경된 데이터에 대한 박스플롯
plt.boxplot(new_df['amount'])
Out[46]:
3. 교차검정 & 평균차이검정, 상관관계 분석¶
1 ) '구매성향'을 기준으로 '피부타입'의 빈도를 분석해보기¶
- propensity : 구매 성향 (비교적 저렴한 제품, 중간 정도의 제품, 비교적 고가의 제품)
- skin : 피부 타입 (건성, 민감성, 중성, 지성/여드름성, 복합성)
In [47]:
# 구매성향 - 피부타입 간의 빈도 분석
result = pd.crosstab(new_df.propensity, new_df.skin, margins=True)
result.rename(columns = { 1 : '건성', 2 : '민감성', 3 : '중성', 4 : '지성', 5 : '여드름성', 'All' : '합계'},
index = {1 : '비교적 저렴한 제품', 2 : '중간정도의 제품', 3 : '비교적고가의 제품', 'All' : '합계'})
Out[47]:
In [55]:
# 구매성향 - 피부타입 간의 P-value값 확인
sp.stats.chisquare(new_df.propensity, f_exp=new_df.skin)
Out[55]:
In [54]:
sp.stats.power_divergence(new_df.propensity, f_exp=new_df.skin)
Out[54]:
In [70]:
new_df.propensity = new_df.propensity.replace(1,'low cost').replace(2,'middle cost').replace(3, 'high cost')
new_df.skin = new_df.skin.replace(1, 'dry skin').replace(2, 'sensitive skin').replace(3, 'neutral skin').replace(4, 'oily skin').replace(5, 'complex skin')
In [71]:
result = pd.crosstab(new_df.propensity, new_df.skin, margins=True)
result.rename(columns = { 1 : '건성', 2 : '민감성', 3 : '중성', 4 : '지성', 5 : '여드름성', 'All' : '합계'},
index = {1 : '비교적 저렴한 제품', 2 : '중간정도의 제품', 3 : '비교적고가의 제품', 'All' : '합계'})
result.plot(kind='bar')
Out[71]:
In [74]:
result.plot(kind='bar', stacked='True')
Out[74]:
2 ) 두 집단간의 평균차이를 검정해보기¶
- 독립표본 t-test 분석과 시각화
In [3]:
df = pd.read_csv('cosmetics_.csv', encoding='utf-8')
df.head()
Out[3]:
In [4]:
# 전반적인 만족도(satisf_al) 의 성별(표본집단 끼리) 비교
tmp = df.loc[:,['satisf_al', 'gender']]
#tmp.gender = tmp.gender.replace(1,'man').replace(2,'woman')
tmp.groupby('gender').describe()
Out[4]:
In [19]:
man = tmp.loc[(tmp.gender == 1) == True, 'satisf_al'].values
woman = tmp.loc[(tmp.gender == 2) == True, 'satisf_al'].values
In [20]:
#perform paired t-test
tTestResult= stats.ttest_ind(man, woman)
print("The T-statistic is %.3f and the p-value is %.3f" % tTestResult)
In [22]:
# 전반적인 만족도(satisf_al) 의 성별(표본집단 끼리)집단 시각화
tmp.boxplot(column='satisf_al', by='gender')
Out[22]:
In [23]:
# kde=False 로 해주어야 각각의 빈도 수에 따른 그래프를 가리고 평균만 나타낼 수 있음
# fit에 scipy.stats.norm을 지정하여 평균을 나타내는 그래프 선을 그릴 수 있음
# hist_kws & fit_kws 는 히스토그램과 fitting line의 서식을 지정하는 keywords
sns.distplot(man, kde=False, fit=stats.norm,
hist_kws={'color': 'r', 'alpha': 0.2}, fit_kws={'color': 'r'})
sns.distplot(woman, kde=False, fit=stats.norm,
hist_kws={'color': 'g', 'alpha': 0.2}, fit_kws={'color': 'g'})
Out[23]:
3 ) 두 집단간의 평균차이를 검정해보기¶
- 대응표본 t-test 분석과 시각화 : 동일한 모집단으로부터 추출된 두 변수의 평균값을 비교 분석
- satisf_b : 구매 가격에 대한 만족도 (5점 척도)
- satisf_i : 구매 문의에 대한 만족도 (5점 척도)
In [26]:
# 두 칼럼의 요약 정보 확인
x = df[['satisf_b', 'satisf_i']]
x.describe()
Out[26]:
In [27]:
x
Out[27]:
In [28]:
# t-test 분석
stats.ttest_rel(x["satisf_b"], x["satisf_i"])
Out[28]:
In [29]:
sns.distplot(x["satisf_b"], kde=False, fit=stats.norm,
hist_kws={'color': 'r', 'alpha': 0.2}, fit_kws={'color': 'r'})
sns.distplot(x["satisf_i"], kde=False, fit=stats.norm,
hist_kws={'color': 'g', 'alpha': 0.2}, fit_kws={'color': 'g'})
Out[29]:
728x90
반응형
'Programming > Python' 카테고리의 다른 글
f-string (0) | 2021.05.31 |
---|---|
[ 데이터 분석 실무 with python ] 1. 사드 배치의 영향으로 중국인 관광객이 얼마나 줄었을까? (0) | 2020.05.23 |
[ 모두의 데이터 분석 with python ] 3.지하철 데이터 (0) | 2020.05.08 |
[ 모두의 데이터 분석 with python ] 2. 인구 데이터 (0) | 2020.05.05 |
[ 모두의 데이터 분석 with python ] 1. 기온 데이터 (0) | 2020.05.05 |