반응형
2022년 3월 11일자로 갖고온 데이터를 기반으로 주유소 데이터를 분석해본다.
data=pd.read_excel("서울시주유소데이터.xlsx",index_col=0, thousands=",")
import pandas as pd
import numpy as np
import matplotlib_hangle
import matplotlib.pyplot as plt
import seaborn as sns
import folium
# 데이터 정제
# 주유소 이름을 index로 설정
data = data.set_index('이름')
In [9]:
data.tail()

# 결측값 확인
data.isnull().sum()
주소 0
브랜드 0
휘발유 0
경유 0
셀프여부 0
세차장 0
충전소 0
경정비 0
편의점 0
이십사시간 0
구 0
lat 0
lng 0
dtype: int64
# 경유랑 휘발유 int로 바꾸기
data["휘발유"].astype("int64")
data["경유"].astype("int64")
data.info()
<class 'pandas.core.frame.DataFrame'>
Index: 460 entries, 현대오일뱅크(주)직영 산성셀프주유소 to 용마로주유소
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 주소 460 non-null object
1 브랜드 460 non-null object
2 휘발유 460 non-null int64
3 경유 460 non-null int64
4 셀프여부 460 non-null object
5 세차장 460 non-null object
6 충전소 460 non-null object
7 경정비 460 non-null object
8 편의점 460 non-null object
9 이십사시간 460 non-null object
10 구 460 non-null object
11 lat 460 non-null float64
12 lng 460 non-null float64
dtypes: float64(2), int64(2), object(9)
memory usage: 50.3+ KB
- barplot이용해서데이터 확인
In [12]:
sns.barplot(data=data, x= "셀프여부", y="휘발유")

- 유의미한 차이가 있는지는 분석을 해봐야 알겠지만, 막대그래프 상 셀프일때 기름값이 조금더 싸다는것을 알수는 있다
sns.barplot(data=data, x= "셀프여부", y="경유")

- 유의미한 차이가 있는지는 분석을 해봐야 알겠지만, 막대그래프 상 셀프일때 기름값이 조금더 싸다는것을 알수는 있다
- 셀프여부에 따른 휘발유와 경우의 가격차이가 있는지 검증해보자
- 대립가설 : 셀프여부에 따라 휘발유와 경우의 가격은 차이가 있다, 귀무가설 : 셀프여부에 따라 휘발유와 경우의 가격은 차이가 없다
- 셀프여부별 데이터를 나누고 t-test를 위해 정규성과 등분산성을 검증해본다
- 독립표본 t-test 실시해본다
In [14]:
from scipy import stats
# 휘발유
tg1 = data[data["셀프여부"]=="Y"]["휘발유"]
tg2 = data[data["셀프여부"]=="N"]["휘발유"]
data.groupby("셀프여부")["휘발유"].count().to_frame()

# 등분산 검정
print(stats.levene(tg1, tg2))
print(stats.fligner(tg1, tg2))
print(stats.bartlett(tg1, tg2))
LeveneResult(statistic=52.47040610760473, pvalue=1.86358163364953e-12)
FlignerResult(statistic=43.03453937416569, pvalue=5.3781948973607725e-11)
BartlettResult(statistic=261.3879671346889, pvalue=8.5501845728381e-59)
- 표본이 30개 이상이고
- "p-value"가 0.05 이상 보여주므로 등분산성과 정규성을 만족함
stats.ttest_ind(tg1, tg2, equal_var=True)
- 통계량은 -9.59, p-value는 5.69가 나왔다. 유의수준 0.05에서 귀무가설을 기각하지 못했으므로 t-test상 둘의 차이가 있다고 볼 순 없다(통계상으로)
# 경유
tg1 = data[data["셀프여부"]=="Y"]["경유"]
tg2 = data[data["셀프여부"]=="N"]["경유"]
In [19]:
data.groupby("셀프여부")["경유"].count().to_frame()

# 등분산 검정
print(stats.levene(tg1, tg2))
print(stats.fligner(tg1, tg2))
print(stats.bartlett(tg1, tg2))
LeveneResult(statistic=44.989985612521465, pvalue=5.85417982723054e-11)
FlignerResult(statistic=46.77076521666497, pvalue=7.97949322428278e-12)
BartlettResult(statistic=148.5938899406043, pvalue=3.5181251344464913e-34)
- 표본이 30개 이상이고
- "p-value"가 0.05 이상 보여주므로 등분산성과 정규성을 만족함
stats.ttest_ind(tg1, tg2, equal_var=True)
Ttest_indResult(statistic=-8.945923047969654, pvalue=9.19169996247358e-18)
- 경유도 마찬가지로 통계량은 -8.94, p-value는 9.19가 나왔다. 유의수준 0.05에서 귀무가설을 기각하지 못했으므로 t-test상 둘의 차이가 있다고 볼 순 없다
sns.barplot(data=data, x= "브랜드", y="휘발유",hue="셀프여부")

sns.barplot(data=data, x= "브랜드", y="경유",hue="셀프여부")

plt.xticks(rotation=90)
sns.barplot(data=data, x= "구", y="휘발유",hue="셀프여부")
# 이유는 모르겠지만 용산구에는 셀프주유소가 없다.
# 지역별로 봤을때 중구, 강남구, 용산구 가격이 비싸다

plt.xticks(rotation=90)
sns.barplot(data=data, x= "구", y="경유",hue="셀프여부")

- 2022년 3월 11일 기준데이터로 봤을때 유의미한차이가 있는지는 분석을 해봐야 알겠지만 막대그래프 상 셀프일때 기름값이 조금더 싸다
- 부가데이터(세차장, 충전소, 경정비, 편의점, 24시간)가 Y일경우 1점을 주고 N일경우 0점을 줘서 주유소 옵션별 데이터에 따른 금액 차이도 확인해보자
data["기능수"] = 0
for idx,rows in data.iterrows():
if rows["세차장"] == "Y":
data.loc[idx,"기능수"] += 1
if rows["충전소"] == "Y":
data.loc[idx,"기능수"] += 1
if rows["경정비"] == "Y":
data.loc[idx,"기능수"] += 1
if rows["편의점"] == "Y":
data.loc[idx,"기능수"] += 1
if rows["이십사시간"] == "Y":
data.loc[idx,"기능수"] += 1
data["기능수"].value_counts()
data["기능수"].value_counts().plot(kind="bar")

data["기능수"] = [str(i) + "개" for i in data["기능수"]]
In [30]:
sns.barplot(data=data, x= "기능수", y="휘발유")

sns.barplot(data=data, x= "기능수", y="휘발유",hue="셀프여부")

- 부가기능이 있다고 해서 주유소별 가격차이가 있는거 같진 않는거 같다
- 브랜드 기능별 휘발유 차이
# 브랜드별 기능
sns.barplot(data=data, x= "브랜드", y="휘발유",hue="세차장")

sns.barplot(data=data, x= "브랜드", y="휘발유",hue="이십사시간")

sns.barplot(data=data, x= "브랜드", y="휘발유",hue="편의점")

sns.barplot(data=data, x= "브랜드", y="휘발유",hue="경정비")

sns.barplot(data=data, x= "브랜드", y="휘발유",hue="충전소")

- boxplot이용해서데이터 만들기
# 셀프여부에 따른 휘발유 가격
plt.figure(figsize=(8,6))
sns.boxplot(data=data, x="셀프여부",y="휘발유", )

- 박스플롯 상에서도 둘의 차이를 알수 있었고, 셀프가 아닐경우, 산포가 더 큼을 알수 잇음
# 셀프여부에 경유 가격
plt.figure(figsize=(8,6))
sns.boxplot(data=data, x="셀프여부",y="경유", )

- 경유도 마찬가지로 박스플롯 상에서도 둘의 차이를 알수 있었고, 셀프가 아닐경우, 산포가 더 큼을 알수 잇음
# 회사별 휘발유, 경유 값
plt.figure(figsize=(8,6))
sns.boxplot(data=data, x="브랜드",y="휘발유", palette="Set1")

plt.figure(figsize=(12, 8))
sns.boxplot(x="브랜드", y="휘발유", hue="셀프여부", data=data, palette="Set1")
plt.grid(True)
plt.show()

- SK에너지와 GS칼텍스의 경우 차이가 있을것으로 보인다 해당 데이터만 뽑아서 차이가 있는지 확인해보자(휘발유만)
#sk 에너지
sk1 = data[data["브랜드"]=="SK에너지"]
sk0 = data[data["브랜드"]=="SK에너지"]
In [534]:
sk1.groupby("셀프여부")["휘발유"].count().to_frame()

sk1 = sk1[sk1["셀프여부"]=="Y"]["휘발유"]
sk0 = sk0[sk0["셀프여부"]=="N"]["휘발유"]
# 등분산 검정
print(stats.levene(sk1, sk0))
print(stats.fligner(sk1, sk0))
print(stats.bartlett(sk1, sk0))
LeveneResult(statistic=21.996209657489196, pvalue=6.688054359686472e-06)
FlignerResult(statistic=25.237749706678166, pvalue=5.068044906744078e-07)
BartlettResult(statistic=78.60778077362173, pvalue=7.575047052629473e-19)
등분산이 같다.
stats.ttest_ind(sk1, sk0, equal_var=True)
Ttest_indResult(statistic=-5.964039034416167, pvalue=2.0942622870448614e-08)
0.05에서 둘의 차이는 없는것을 보인다.
gs1 = data[data["브랜드"]=="GS칼텍스"]
gs0 = data[data["브랜드"]=="GS칼텍스"]
gs1.groupby("셀프여부")["휘발유"].count().to_frame()

gs1 = gs1[gs1["셀프여부"]=="Y"]["휘발유"]
gs0 = gs0[gs0["셀프여부"]=="N"]["휘발유"]
# 등분산 검정
print(stats.levene(gs1, gs0))
print(stats.fligner(gs1, gs0))
print(stats.bartlett(gs1, gs0))
LeveneResult(statistic=9.418133330837197, pvalue=0.002690198675277787)
FlignerResult(statistic=7.666907952561556, pvalue=0.005624275539955692)
BartlettResult(statistic=42.35223809576888, pvalue=7.622905199273124e-11)
- levene과 fligner 상에서는 등분산이 같다고 나오지 않았다 bartlett에 검정에서만 분산이 같다고 나왔다 분산이 같지 않다고 가정하고 진행
stats.ttest_ind(gs1, gs0, equal_var=False)
Ttest_indResult(statistic=-4.696519531238347, pvalue=1.0612734613353442e-05)
- SK,와 GS 둘다 셀프주유소에 대한 통계적으로 차이가 있다고 보여지진 않았다.
sk0.tail()
- 경유 분석
plt.figure(figsize=(12, 8))
sns.boxplot(x="브랜드", y="경유", hue="셀프여부", data=data, palette="Set1")
plt.grid(True)
plt.show()
- 피봇테이블을 이용해서 구별, 주유소별, 부가데이터별 자료 만들기
data.info()
<class 'pandas.core.frame.DataFrame'>
Index: 460 entries, 현대오일뱅크(주)직영 산성셀프주유소 to 용마로주유소
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 주소 460 non-null object
1 브랜드 460 non-null object
2 휘발유 460 non-null int64
3 경유 460 non-null int64
4 셀프여부 460 non-null object
5 세차장 460 non-null object
6 충전소 460 non-null object
7 경정비 460 non-null object
8 편의점 460 non-null object
9 이십사시간 460 non-null object
10 구 460 non-null object
11 lat 460 non-null float64
12 lng 460 non-null float64
dtypes: float64(2), int64(2), object(9)
memory usage: 66.5+ KB
pivot = pd.pivot_table(data=data, index=["구","브랜드"],columns="셀프여부",values=["경유","휘발유"])
pivot

# 폴리움을 이용한 지도 시각화
import json
import folium
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning)
In [46]:
gu_gasol= data[["구","휘발유"]]
In [47]:
gu_gasol.set_index("구",drop=True,inplace=True)
In [48]:
gu_gasol.tail()

gu_vai = data[["구","경유"]]
In [50]:
gu_vai.set_index("구",drop=True,inplace=True)
In [51]:
gu_vai.tail()

# 휘발유 시각화
geo_path = "02. skorea_municipalities_geo_simple.json"
geo_str = json.load(open(geo_path, encoding="utf-8"))
my_map = folium.Map(location=[37.5502, 126.982], zoom_start=10.5, tiles="Stamen Toner")
my_map.choropleth(
geo_data=geo_str,
data=gu_gasol,
columns=[gu_gasol.index, "휘발유"],
key_on="feature.id",
fill_color="PuRd"
)
my_map

# 경유 시각화
geo_path = "02. skorea_municipalities_geo_simple.json"
geo_str = json.load(open(geo_path, encoding="utf-8"))
my_map = folium.Map(location=[37.5502, 126.982], zoom_start=10.5, tiles="Stamen Toner")
my_map.choropleth(
geo_data=geo_str,
data=gu_vai,
columns=[gu_vai.index, "경유"],
key_on="feature.id",
fill_color="PuRd"
)
my_map

# 결론
- 시각적으로는 차이가 있어보이지만 t-test상으로는 차이가 있다고 보기 어려웠다
- 기름값너무 많이 올랐다
'파이썬 이것저것 > 파이썬 데이터분석' 카테고리의 다른 글
| [파이썬] 서울범죄율 데이터 분석 (1) | 2022.06.05 |
|---|---|
| [파이썬] 서울 CCTV 데이터 분석해보기 (0) | 2022.06.04 |
| [파이썬] ProPhet을 활용하여 삼성전자 주식 데이터 예측해보기 (0) | 2022.04.23 |
| [파이썬] ProPhet 활용하여 시계열 예측 (1) | 2022.04.23 |
| [파이썬] 수치형 변수의 요약, 기술통계 (0) | 2022.04.23 |