Python 데이터 분석
Python 데이터분석 기초 35 - 어느 음식점 매출 자료와 날씨 자료를 활용하여 강수 여부에 따른 매출액 평균에 차이를 검정
코딩탕탕
2022. 11. 8. 15:03
전혀 다른 데이터이지만 서로 merge 해서 데이터를 만들었다.
데이터 타입 바꾸기, 데이터 안에 들어있는 -를 공백으로 바꾸기, 두 데이터 병합 등의 내용이 들어있다.
# 어느 음식점 매출 자료와 날씨 자료를 활용하여 강수 여부에 따른 매출액 평균에 차이를 검정
# 귀무 : 강수 여부에 따른 음식점 매출액의 평균에 차이가 없다.
# 대립 : 강수 여부에 따른 음식점 매출액의 평균에 차이가 있다.
import numpy as np
import scipy.stats as stats
import pandas as pd
import matplotlib.pyplot as plt
# 데이터는 data.go.kr을 참조
# 매출 자료
sales_data = pd.read_csv("https://raw.githubusercontent.com/pykwon/python/master/testdata_utf8/tsales.csv", dtype={'YMD':'object'}) # 데이터 타입 바꾸기
print(sales_data.head(3))
print(sales_data.info()) # 328 * 3
# 날씨 자료
wt_data = pd.read_csv("https://raw.githubusercontent.com/pykwon/python/master/testdata_utf8/tweather.csv")
print(wt_data.head(3))
print(wt_data.info()) # 702 * 9
# 두 데이터를 병합 : 날짜를 사용. 그래서 wt_data의 tm을 2018-06-01 ==> 20180601 형태로 변환
wt_data.tm = wt_data.tm.map(lambda x:x.replace('-','')) # 데이터를 하나만 꺼냈기 때문에 시리즈 데이터이다. 그래서 map함수 사용
print(wt_data.head(3))
print(wt_data.tail(3))
print('merge --------')
frame = sales_data.merge(wt_data, how = 'left', left_on = 'YMD', right_on = 'tm')
print(frame.head(5))
print(frame.tail(5))
print(len(frame)) # 328행
print()
# 분석에 사용할 열만 추출
print(frame.columns) # ['YMD', 'AMT', 'CNT', 'stnId', 'tm', 'avgTa', 'minTa', 'maxTa', 'sumRn', 'maxWs', 'avgWs', 'ddMes']
data = frame.iloc[:, [0, 1, 7, 8]] # 'YMD', 'AMT' 'maxTa', 'sumRn'
print(data.head(3))
print('두 집단 간의 매출액 평균 검정 : t-test')
print(data.isnull().sum()) # 결측치 확인(없음)
print(data['sumRn'] > 0) # 비가 왔는지 안 왔는지 True False 로 반환
data['rain_yn'] = (data['sumRn'] > 0).astype(int) # rain_yn 칼럼을 int type으로 추가, 비가 오면 1, 안 오면 0
# print(True * 1, ' ', False * 1) # True, False 에 * 1을 하면 1, 0이 나온다.
# data['rain_yn'] = (data.loc[:, ('sumRn')] > 0) * 1
print(data.head(3))
# boxplot으로 강수 여부에 따른 매출액 시각화
sp = np.array(data.iloc[:, [1,4]])
# print(sp)
tgroup1 = sp[sp[:, 1] == 0, 0] # 집단1 : 비 안오는 그룹의 매출액
tgroup2 = sp[sp[:, 1] == 1, 0] # 집단2 : 비 오는 그룹의 매출액
# plt.plot(tgroup1)
# plt.show()
# plt.plot(tgroup2)
# plt.show()
plt.boxplot([tgroup1, tgroup2], meanline = True, showmeans = True, notch = True)
plt.show()
print('평균은 ', np.mean(tgroup1), ' ', np.mean(tgroup2)) # 761040.254 vs 757331.521 차이?
# 정규성 확인
print(stats.shapiro(tgroup1).pvalue) # 0.05604 > 0.05 이므로 정규성 만족
print(stats.shapiro(tgroup2).pvalue) # 0.88273 > 0.05 이므로 정규성 만족
# 등분산성 확인
print(stats.levene(tgroup1, tgroup2).pvalue) # 0.712345 > 0.05 이므로 등분산성 만족
print(stats.ttest_ind(tgroup1, tgroup2, equal_var = True))
# statistic=0.10109828602924716, pvalue=0.919534587722196
# pvalue=0.91953 > 0.05 이므로 귀무가설 채택.
# 강수 여부에 따른 음식점 매출액의 평균에 차이가 없다.
<console>
YMD AMT CNT
0 20190514 0 1
1 20190519 18000 1
2 20190521 50000 4
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 328 entries, 0 to 327
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 YMD 328 non-null object
1 AMT 328 non-null int64
2 CNT 328 non-null int64
dtypes: int64(2), object(1)
memory usage: 7.8+ KB
None
stnId tm avgTa minTa maxTa sumRn maxWs avgWs ddMes
0 108 2018-06-01 23.8 17.5 30.2 0.0 4.3 1.9 0.0
1 108 2018-06-02 23.4 17.6 30.1 0.0 4.5 2.0 0.0
2 108 2018-06-03 24.0 16.9 30.8 0.0 4.2 1.6 0.0
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 702 entries, 0 to 701
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 stnId 702 non-null int64
1 tm 702 non-null object
2 avgTa 702 non-null float64
3 minTa 702 non-null float64
4 maxTa 702 non-null float64
5 sumRn 702 non-null float64
6 maxWs 702 non-null float64
7 avgWs 702 non-null float64
8 ddMes 702 non-null float64
dtypes: float64(7), int64(1), object(1)
memory usage: 49.5+ KB
None
stnId tm avgTa minTa maxTa sumRn maxWs avgWs ddMes
0 108 20180601 23.8 17.5 30.2 0.0 4.3 1.9 0.0
1 108 20180602 23.4 17.6 30.1 0.0 4.5 2.0 0.0
2 108 20180603 24.0 16.9 30.8 0.0 4.2 1.6 0.0
stnId tm avgTa minTa maxTa sumRn maxWs avgWs ddMes
699 108 20200430 17.1 9.3 23.4 0.0 5.9 2.7 0.0
700 108 20200501 20.2 16.4 26.2 0.0 5.5 2.7 0.0
701 108 20200502 20.3 18.0 23.9 0.0 4.6 2.3 0.0
merge --------
YMD AMT CNT stnId tm ... maxTa sumRn maxWs avgWs ddMes
0 20190514 0 1 108 20190514 ... 26.9 0.0 4.1 1.6 0.0
1 20190519 18000 1 108 20190519 ... 21.6 22.0 2.7 1.2 0.0
2 20190521 50000 4 108 20190521 ... 23.8 0.0 5.9 2.9 0.0
3 20190522 125000 7 108 20190522 ... 26.5 0.0 5.4 2.4 0.0
4 20190523 222500 13 108 20190523 ... 29.2 0.0 3.5 1.7 0.0
[5 rows x 12 columns]
YMD AMT CNT stnId tm ... maxTa sumRn maxWs avgWs ddMes
323 20200424 1092500 51 108 20200424 ... 14.3 0.0 8.2 3.9 0.0
324 20200425 672500 34 108 20200425 ... 17.1 0.0 7.8 3.9 0.0
325 20200426 1123500 55 108 20200426 ... 19.0 0.0 6.5 3.2 0.0
326 20200427 819500 45 108 20200427 ... 18.3 0.0 5.5 2.8 0.0
327 20200428 950500 45 108 20200428 ... 19.9 0.0 5.5 3.0 0.0
[5 rows x 12 columns]
328
Index(['YMD', 'AMT', 'CNT', 'stnId', 'tm', 'avgTa', 'minTa', 'maxTa', 'sumRn',
'maxWs', 'avgWs', 'ddMes'],
dtype='object')
YMD AMT maxTa sumRn
0 20190514 0 26.9 0.0
1 20190519 18000 21.6 22.0
2 20190521 50000 23.8 0.0
두 집단 간의 매출액 평균 검정 : t-test
YMD 0
AMT 0
maxTa 0
sumRn 0
dtype: int64
0 False
1 True
2 False
3 False
4 False
...
323 False
324 False
325 False
326 False
327 False
Name: sumRn, Length: 328, dtype: bool
C:\Users\JEONGYEON\Desktop\Python\Python\pro1\pack8anal2\t-test3.py:44: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
data['rain_yn'] = (data['sumRn'] > 0).astype(int) # rain_yn 칼럼을 int type으로 추가, 비가 오면 1, 안 오면 0
YMD AMT maxTa sumRn rain_yn
0 20190514 0 26.9 0.0 0
1 20190519 18000 21.6 22.0 1
2 20190521 50000 23.8 0.0 0
평균은 761040.2542372881 757331.5217391305
0.056049469858407974
0.882739782333374
0.7123452333011173
Ttest_indResult(statistic=0.10109828602924716, pvalue=0.919534587722196)