ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 데이터분석 기초 35 - 어느 음식점 매출 자료와 날씨 자료를 활용하여 강수 여부에 따른 매출액 평균에 차이를 검정
    Python 데이터 분석 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)

     

     

    댓글

Designed by Tistory.