[TIL] 4일차 TIL(20230209) - 데이터 시각화, 서울시 물가정보 분석
[TIL] 4일차 TIL(20230209) - 데이터 시각화, 서울시 물가정보 분석
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
TIL¶
- 년월일시 정보 데이터에서 일자별 정보만 가져오기
- df[column].dt.date
- 문자열에 적용하는 함수를 시리즈 등 문자열 배열에 적용할 때
문자열 함수 이전에 str을 적어주면 일부 함수 사용 가능
ex) str.split(),str[0] #칼럼에서 ' '를 기준으로 첫번째 묶음만 한꺼번에 가져옴
- barplot/countplot에서 그룹별로 빈도(비율) 등 표현하기
- barplot/countplot 등을 그리고 그룹별로 막대를 나눠서 표현하는 경우 dodge를 사용하게 되면 막대를 모두 더하는 것이 아님!
그룹에서 가장 긴 막대를 기준으로 다른 막대의 빈도를 표시하는 형태이기 때문에 예를 들어 비율이 1:1이라면 막대가 하나만 보이게 됨
plt.bar()로 막대그래프를 2개 그린 뒤 하나에 bottom값을 지정해주는 형태로 그리거나
- 누적합 데이터를 만들어서 막대그래프를 그리면 해결할 수 있음
삼겹살 가격 비교를 통한 서울시 물가정보 분석¶
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style = 'whitegrid')
# 그래프를 노트북 안에 그리기 위해 설정
%matplotlib inline
# 필요한 패키지와 라이브러리 가져온다.
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
# 폰트 지정하기
plt.rcParams['font.family'] = 'NanumGothic'
df = pd.read_csv('data/생필품 농수축산물 가격 정보(2021년1월_6월).csv', encoding='cp949')
df.head()
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1673336 | 2 | 신세계백화점 | 133 | 무(세척무) | 1개 | 2980 | 2021-06 | 국내산,세척무 | 2 | 대형마트 | 140000 | 중구 | 2021-06-24 |
1 | 1667985 | 228 | 방배종합시장 | 23 | 상추 | 1봉150g | 1500 | 2021-06 | 국내산 | 1 | 전통시장 | 650000 | 서초구 | 2021-06-24 |
2 | 1666935 | 1 | 통인시장 | 266 | 고등어(생물,국산) | 1마리 | 4000 | 2021-06 | 국내산,생물 | 1 | 전통시장 | 110000 | 종로구 | 2021-06-24 |
3 | 1671116 | 25 | 방학동도깨비시장 | 268 | 고등어(냉동,국산) | 350g | 2500 | 2021-06 | 국내산 | 1 | 전통시장 | 320000 | 도봉구 | 2021-06-24 |
4 | 1667066 | 6 | 이마트 용산점 | 171 | 달걀(10개) | 15구 | 5980 | 2021-06 | 낭이생생대란 | 2 | 대형마트 | 170000 | 용산구 | 2021-06-24 |
#결측치 확인
df.isnull().sum()
일련번호 0 시장/마트 번호 0 시장/마트 이름 0 품목 번호 0 품목 이름 0 실판매규격 0 가격(원) 0 년도-월 0 비고 274 시장유형 구분(시장/마트) 코드 0 시장유형 구분(시장/마트) 이름 0 자치구 코드 0 자치구 이름 0 점검일자 0 dtype: int64
삼겹살 가격 분석¶
- 시간의 흐름에 따른 삼겹살 가격에 변화가 있는지?
- 구(지역)별로 삼겹살 가격에 차이가 있는지?
- 마트의 종류에 따라 삼겹살 가격에 차이가 있는지?
삼겹살 상품 종류 확인¶
df_sam = df[df['품목 이름'].str.contains('삼겹살')].dropna()
print('====삼겹살 이름의 종류====')
print(df_sam['품목 이름'].value_counts(), '\n')
print('====삼겹살 판매규격의 종류====')
print(df_sam['실판매규격'].value_counts(), '\n')
print('====삼겹살 원산지, 판매사의 종류====')
print(df_sam['비고'].value_counts(), '\n')
====삼겹살 이름의 종류==== 돼지고기(생삼겹살) 1547 돼지고기(삼겹살) 174 Name: 품목 이름, dtype: int64 ====삼겹살 판매규격의 종류==== 600g 1198 100g 109 1근 100 100g 97 1등급(600g) 88 (100g) 46 600g(1등급) 23 600g (100g 4,280원) 21 600g 1+ 8 600g (100g 3,380원) 5 600g (100g 3,080원) 4 600g(100g 4,280원) 4 600g(100g 3,080원) 2 600g (100g 3,280원) 2 600g 100g 3,080원) 1 600g(100g 3,280원) 1 600g (100g 2,880원) 1 600g (100g 2,980원) 1 600g (100g 3080원) 1 600g (100g 3,181원) 1 600g(100g 3,180원) 1 600g (100g 3,180원) 1 600g (100g 3,280원 1 600g (100g 2,680원) 1 600g (100g 3,480원) 1 600g (3,380원) 1 600g(생목살 1+) 1 (600g) 1 Name: 실판매규격, dtype: int64 ====삼겹살 원산지, 판매사의 종류==== 국내산 317 국내산 생삼겹살 99 국내,삼겹살 99 국내산,생삼겹살 94 국내산생삼겹 91 ... 국내산 생삼겹 음성 1 국내산 제주생삼겹 1 국내산 생삼겹음성 1 국내산 생삼겹살 1 국내산,100g1890 1 Name: 비고, Length: 224, dtype: int64
#삼겹살 원산지가 국내산이 아닌 경우가 있는지 확인
df_sam[~df_sam['비고'].str.contains('국내')]['비고']
22 선진포크 34 대전한돈 47 한돈 409 농협 목우촌 457 100g-4,280원 선진포크.도드람lpc ... 41641 국산 41667 벌집삼겹살 41727 녹차삼겹살 41957 더느림 삼겹 구이 42245 100g-2,500원 협신식품 Name: 비고, Length: 433, dtype: object
최대한 객관적인 비교를 위해 몇 가지 조건을 걸어 삼겹살의 종류를 제한함
품목 이름: 돼지고기(생삼겹살) - 냉동과의 가격차이가 존재하기 때문
실판매규격: 600g, 1근
비고: 국내 삼겹살로 범위를 제한하기 위해 '국내', '국산', '한돈'이 포함된 상품들만 사용
#조건에 해당하는 상품 데이터만 추출
condition = ((df_sam['품목 이름'] == '돼지고기(생삼겹살)') & (df_sam['실판매규격'].str.contains('600g|1근')) & (df_sam['비고'].str.contains('국내|국산|한돈')))
df_sam2 = df_sam[condition].drop_duplicates()
df_sam2.head()
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
47 | 1670116 | 98 | 롯데백화점 노원점 | 99 | 돼지고기(생삼겹살) | 600g | 26940 | 2021-06 | 한돈 | 2 | 대형마트 | 350000 | 노원구 | 2021-06-24 |
76 | 1674090 | 42 | 이마트 가양점 | 99 | 돼지고기(생삼겹살) | 600g | 15480 | 2021-06 | 국내산,생삼겹살 | 2 | 대형마트 | 500000 | 강서구 | 2021-06-24 |
86 | 1668834 | 42 | 이마트 가양점 | 99 | 돼지고기(생삼겹살) | 600g | 14880 | 2021-06 | 국내산,생삼겹살 | 2 | 대형마트 | 500000 | 강서구 | 2021-06-24 |
146 | 1667684 | 42 | 이마트 가양점 | 99 | 돼지고기(생삼겹살) | 600g | 14880 | 2021-06 | 국내산,생삼겹살 | 2 | 대형마트 | 500000 | 강서구 | 2021-06-24 |
265 | 1670922 | 78 | 자양골목시장 | 99 | 돼지고기(생삼겹살) | 600g | 18000 | 2021-06 | 국내산.팜스코 | 1 | 전통시장 | 215000 | 광진구 | 2021-06-24 |
#이상치 확인
df_sam2[df_sam2['가격(원)'] <= 5000]
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3645 | 1667404 | 27 | 이마트 창동점 | 99 | 돼지고기(생삼겹살) | 600g | 2720 | 2021-06 | 국내산 | 2 | 대형마트 | 320000 | 도봉구 | 2021-06-24 |
4052 | 1667438 | 28 | 홈플러스 방학점 | 99 | 돼지고기(생삼겹살) | 600g | 1690 | 2021-06 | 국내산 | 2 | 대형마트 | 320000 | 도봉구 | 2021-06-24 |
38285 | 1632745 | 146 | 방이시장 | 99 | 돼지고기(생삼겹살) | 600g | 1200 | 2021-01 | 국내산 | 1 | 전통시장 | 710000 | 송파구 | 2021-01-28 |
#이상치 삭제
idx = df_sam2[df_sam2['가격(원)'] <= 5000].index
df_sam2 = df_sam2.drop(index = idx)
시간의 흐름에 따른 삼겹살 가격 차이 분석¶
df_month = df_sam2.groupby('년도-월')['가격(원)'].mean().to_frame()
df_month
가격(원) | |
---|---|
년도-월 | |
2021-01 | 14440.659341 |
2021-02 | 14472.122905 |
2021-03 | 14388.830601 |
2021-04 | 14773.770492 |
2021-05 | 15567.577889 |
2021-06 | 16413.865979 |
sns.lineplot(df_month.index, df_month['가격(원)'], color = 'skyblue', marker = 'o')
plt.ylim([12000, 20000])
plt.title('월별 삼겹살 평균 가격 변화');
C:\Users\Notepc\anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation. warnings.warn(
4월부터 삼겹살 가격이 점차 상승하는 모습을 보임, 상승 폭도 점차 증가하는 모습
sns.violinplot(x = '년도-월', y = '가격(원)', data = df_sam2)
plt.title('월별 삼겹살 가격의 분포');
sns.boxplot(x = '년도-월', y = '가격(원)', data = df_sam2)
plt.title('월별 삼겹살 가격의 분포');
5-6월에 가격이 전체적으로 약간 상승한 모습 + 4~6월에 이상치로 간주되는 가격이 매우 비싼 상품들이 추가적으로 등장한 것으로 보임
자치구별 삼겹살 가격 차이 비교¶
가격의 변동이 적고 비교적 비슷했던 2021-01 ~ 2021-03까지의 데이터를 활용해서 비교
#2021-01 ~ 2021-03 데이터 추출
df_sam3 = df_sam2[df_sam2['년도-월'].isin(['2021-01', '2021-02', '2021-03'])]
df_sam3.reset_index(drop = True, inplace = True)
df_sam_gu = df_sam3.groupby('자치구 이름')['가격(원)'].mean().to_frame().reset_index(drop = False)
df_sam_gu = df_sam_gu.sort_values('가격(원)')
df_sam_gu.head()
자치구 이름 | 가격(원) | |
---|---|---|
9 | 성동구 | 11678.416667 |
4 | 금천구 | 11944.444444 |
14 | 중구 | 12073.333333 |
1 | 강서구 | 12532.125000 |
6 | 동대문구 | 13360.000000 |
sns.barplot(x = '가격(원)', y = '자치구 이름', data = df_sam_gu)
plt.title('구별 삼겹살 평균 가격');
구별로 평균 가격의 차이가 존재함. 특히 영등포구만 유난히 높은 모습을 보임. why?
df_sam3[df_sam3['자치구 이름'] == '영등포구']
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 1650518 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-03 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-03-25 |
8 | 1648407 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-03 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-03-25 |
9 | 1647457 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-03 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-03-25 |
12 | 1645925 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-03 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-03-25 |
194 | 1642533 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-02 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-02-25 |
195 | 1639181 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-02 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-02-25 |
196 | 1644240 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-02 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-02-25 |
256 | 1640689 | 130 | 롯데백화점 영등포점 | 99 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-02 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-02-25 |
409 | 1633952 | 130 | 롯데백화점 영등포점 | 202 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-01 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-01-28 |
410 | 1632492 | 130 | 롯데백화점 영등포점 | 202 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-01 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-01-28 |
448 | 1636269 | 130 | 롯데백화점 영등포점 | 202 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-01 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-01-28 |
477 | 1637681 | 130 | 롯데백화점 영등포점 | 202 | 돼지고기(생삼겹살) | 600g | 24420 | 2021-01 | 국내산 생삼겹살 | 2 | 대형마트 | 560000 | 영등포구 | 2021-01-28 |
영등포구에는 상대적으로 가격이 높을 것으로 예상되는 백화점
데이터만 존재했기 때문으로 추측
마트의 종류에 따라 실제로 가격의 차이가 존재할지 확인해보자.
마트 종류별 삼겹살 가격 비교¶
#마트종류 칼럼 생성
df_sam3['마트종류'] = 0
df_sam3.loc[df_sam3['시장/마트 이름'].str.contains('홈플러스|이마트|롯데마트|하나로|세이브'), '마트종류'] = '대형마트'
df_sam3.loc[df_sam3['시장/마트 이름'].str.contains('백화점'), '마트종류'] = '백화점'
df_sam3.loc[df_sam3['시장/마트 이름'].str.contains('시장'), '마트종류'] = '시장'
C:\Users\Notepc\AppData\Local\Temp\ipykernel_10780\1407635998.py:2: 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 df_sam3['마트종류'] = 0 C:\Users\Notepc\AppData\Local\Temp\ipykernel_10780\1407635998.py:4: 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 df_sam3.loc[df_sam3['시장/마트 이름'].str.contains('홈플러스|이마트|롯데마트|하나로|세이브'), '마트종류'] = '대형마트'
df_sam3['마트종류'].value_counts()
시장 315 대형마트 165 백화점 64 Name: 마트종류, dtype: int64
df_mart_mean = df_sam3.groupby('마트종류')['가격(원)'].mean()
df_mart_mean
마트종류 대형마트 13727.551515 백화점 20464.687500 시장 13578.031746 Name: 가격(원), dtype: float64
sns.barplot(x = df_mart_mean.index, y = df_mart_mean.values)
plt.title('마트 종류에 따른 삼겹살 평균 가격');
대형마트와 시장은 평균 가격에서 큰 차이가 없지만 백화점은 가격 차이가 크게 나는 것을 확인
sns.boxplot(x = '마트종류', y = '가격(원)', data = df_sam3);
sns.violinplot(x = '마트종류', y = '가격(원)', data = df_sam3);
백화점은 가격이 저렴한 상품부터 비싼 상품까지 골고루 존재하여 다른 마트들에 비해 가격 분포가 매우 넓음
반면 시장은 상품의 가격차이가 적어 좁게 분포되어 있음
평균 가격을 비교했을 때 시장과 대형마트는 거의 차이가 없었지만, 분포에서는 차이를 보임
구별 마트 종류 비교¶
df_mart_count = df_sam3[['자치구 이름', '시장/마트 이름', '마트종류']].drop_duplicates(keep = 'first')
df_mart_count.sort_values('자치구 이름', inplace = True)
df_mart_count.reset_index(drop = True, inplace = True)
df_mart_count.head()
자치구 이름 | 시장/마트 이름 | 마트종류 | |
---|---|---|---|
0 | 강북구 | 숭인시장 | 시장 |
1 | 강북구 | 하나로클럽 미아점 | 대형마트 |
2 | 강북구 | 수유재래시장 | 시장 |
3 | 강북구 | 롯데백화점 미아점 | 백화점 |
4 | 강서구 | 이마트 가양점 | 대형마트 |
sns.countplot(x = '자치구 이름', data = df_mart_count, dodge = False)
plt.title('구별 마트 종류 비교')
plt.xticks(rotation = 45);
sns.countplot(x = '자치구 이름', hue = '마트종류', data = df_mart_count)
plt.title('구별 마트 종류 비교')
plt.xticks(rotation = 45);
df_mart_count = df_sam3[['자치구 이름', '시장/마트 이름', '마트종류']].drop_duplicates(keep = 'first')
df_mart_count.sort_values('자치구 이름', inplace = True)
df_mart_count.reset_index(drop = True, inplace = True)
df_mart_count.head()
자치구 이름 | 시장/마트 이름 | 마트종류 | |
---|---|---|---|
0 | 강북구 | 숭인시장 | 시장 |
1 | 강북구 | 하나로클럽 미아점 | 대형마트 |
2 | 강북구 | 수유재래시장 | 시장 |
3 | 강북구 | 롯데백화점 미아점 | 백화점 |
4 | 강서구 | 이마트 가양점 | 대형마트 |
자치구별 마트는 1~5개이며, 마트의 종류가 1개인 곳도 존재했음
마트의 수/마트의 종류/백화점 유무에 따른 가격 차이가 존재한다고 할 수 있는지 살펴보자
df2 = df_mart_count.groupby(['자치구 이름', '마트종류'])['시장/마트 이름'].count().to_frame().reset_index()
df2['누적합'] = df2.groupby('자치구 이름').cumsum()
df2.head()
자치구 이름 | 마트종류 | 시장/마트 이름 | 누적합 | |
---|---|---|---|---|
0 | 강북구 | 대형마트 | 1 | 1 |
1 | 강북구 | 백화점 | 1 | 2 |
2 | 강북구 | 시장 | 2 | 4 |
3 | 강서구 | 대형마트 | 2 | 2 |
4 | 강서구 | 시장 | 2 | 4 |
sns.barplot(x = '자치구 이름', y = '누적합', hue = '마트종류', data = df2, dodge = False, hue_order = ['시장', '백화점', '대형마트'])
plt.title('구별 마트 종류')
plt.ylabel('마트 수')
plt.xticks(rotation = 45);
df_mart_per = pd.DataFrame(columns = ['자치구 이름', '마트종류', '비율'])
gu_sum = df_mart_count['자치구 이름'].value_counts()
for gu in gu_sum.index:
per = df_mart_count[df_mart_count['자치구 이름'] == gu]['마트종류'].value_counts() / gu_sum[gu]
per = pd.DataFrame(per.sort_index()).reset_index()
per['자치구 이름'] = gu
per.columns = ['마트종류', '비율', '자치구 이름']
df_mart_per = pd.concat([df_mart_per, per], axis = 0)
df_mart_per.reset_index(drop = True, inplace = True)
df_mart_per['누적비율'] = df_mart_per.groupby('자치구 이름').cumsum()
df_mart_per.head()
자치구 이름 | 마트종류 | 비율 | 누적비율 | |
---|---|---|---|---|
0 | 관악구 | 대형마트 | 0.20 | 0.20 |
1 | 관악구 | 백화점 | 0.20 | 0.40 |
2 | 관악구 | 시장 | 0.60 | 1.00 |
3 | 강북구 | 대형마트 | 0.25 | 0.25 |
4 | 강북구 | 백화점 | 0.25 | 0.50 |
sns.barplot(x = '자치구 이름', y = '누적비율', hue = '마트종류', data = df_mart_per, dodge = False, hue_order = ['시장', '백화점', '대형마트'])
plt.title('구별 마트 종류')
plt.ylabel('마트 비율')
plt.xticks(rotation = 45);
시장이 가장 많이 존재했으며, 구별로 시장/대형마트 수의 차이는 크게 다르지 않은 것으로 보임
백화점은 위치하지 않은 곳들이 있어 백화점 유무에 따른 가격 차이만 비교해보고자 함
백화점 유무에 따른 가격 차이 비교¶
department_list = df2[df2['마트종류'] == '백화점']['자치구 이름'].values
def department(x):
if x['자치구 이름'] in department_list:
return 1
return 0
df_sam3['백화점'] = df_sam3.apply(department, axis = 1)
df_sam3.head()
C:\Users\Notepc\AppData\Local\Temp\ipykernel_10780\2579920362.py:8: 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 df_sam3['백화점'] = df_sam3.apply(department, axis = 1)
일련번호 | 시장/마트 번호 | 시장/마트 이름 | 품목 번호 | 품목 이름 | 실판매규격 | 가격(원) | 년도-월 | 비고 | 시장유형 구분(시장/마트) 코드 | 시장유형 구분(시장/마트) 이름 | 자치구 코드 | 자치구 이름 | 점검일자 | 마트종류 | 백화점 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1648339 | 133 | 원당종합시장 | 99 | 돼지고기(생삼겹살) | 600g | 14800 | 2021-03 | 국내산 생삼겹 음성 | 1 | 전통시장 | 620000 | 관악구 | 2021-03-25 | 시장 | 1 |
1 | 1650382 | 133 | 원당종합시장 | 99 | 돼지고기(생삼겹살) | 600g | 14800 | 2021-03 | 국내산 생삼겹 | 1 | 전통시장 | 620000 | 관악구 | 2021-03-25 | 시장 | 1 |
2 | 1645687 | 42 | 이마트 가양점 | 99 | 돼지고기(생삼겹살) | 600g | 8322 | 2021-03 | 국내산,생삼겹살(행사) | 2 | 대형마트 | 500000 | 강서구 | 2021-03-25 | 대형마트 | 0 |
3 | 1650815 | 55 | 광장시장 | 99 | 돼지고기(생삼겹살) | 600g | 13000 | 2021-03 | 국내산,삼겹살 | 1 | 전통시장 | 110000 | 종로구 | 2021-03-25 | 시장 | 0 |
4 | 1647270 | 38 | 송화시장 | 99 | 돼지고기(생삼겹살) | 600g | 12500 | 2021-03 | 국내산,생삼겹살 | 1 | 전통시장 | 500000 | 강서구 | 2021-03-25 | 시장 | 0 |
ax = plt.subplot(2,1,1)
sns.distplot(df_sam3[df_sam3['백화점'] == 1]['가격(원)'])
plt.subplot(2,1,2, sharex = ax)
sns.distplot(df_sam3[df_sam3['백화점'] == 0]['가격(원)']);
C:\Users\Notepc\anaconda3\lib\site-packages\seaborn\distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning) C:\Users\Notepc\anaconda3\lib\site-packages\seaborn\distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms). warnings.warn(msg, FutureWarning)
백화점이 있는 구에도 저렴한 상품은 존재하긴 하지만 확실히 평균적인 가격대가 높은 편임을 확인할 수 있음.
무엇보다 고가의 삼겹살이 존재하기 때문에 가격 차이가 발생
df_sam_gu['백화점'] = df_sam_gu.apply(department, axis = 1)
df_sam_gu.head()
자치구 이름 | 가격(원) | 백화점 | |
---|---|---|---|
9 | 성동구 | 11678.416667 | 0 |
4 | 금천구 | 11944.444444 | 0 |
14 | 중구 | 12073.333333 | 0 |
1 | 강서구 | 12532.125000 | 0 |
6 | 동대문구 | 13360.000000 | 0 |
ax = plt.subplot(1,2,1)
df_d1 = df_sam_gu[df_sam_gu['백화점'] == 1]
sns.barplot(x = '자치구 이름', y = '가격(원)', data = df_d1)
plt.subplot(1,2,2, sharey = ax)
df_d2 = df_sam_gu[df_sam_gu['백화점'] == 0]
sns.barplot(x = '자치구 이름', y = '가격(원)', data = df_d2);
백화점이 있는 구의 가격이 없는 구에 비해 평균적으로 확실히 높게 분포하는 것을 확인
결론¶
구별로 삼겹살의 가격에는 차이가 있다고 볼 수 있으며, 그 원인의 하나로 '백화점의 유무'를 뽑을 수 있음
하지만 백화점이 없어도 평균 가격이 높은 자치구들이 존재하므로, 백화점 유무의 영향뿐만 아니라 해당 데이터로는 알 수 없는 추가적인 영향이 존재한다고 판단할 수 있음
소감 및 배운점¶
- 그룹별로 막대를 합하여 누적한 그래프를 그리고 싶었는데 dodge를 사용하니 원하는대로 그래프가 그려지지 않아서 해결하는데 오랜 시간이 걸렸다 ㅜ.ㅜ 그래도 해결해서 다행이다!
- 학습한 내용을 조별로 공유하는 시간이 있었는데 배운 내용을 다시 정리하고 헷갈렸던 부분을 완벽하게 이해하고 넘어가는 계기가 될 수 있었다 ㅎㅎ
- 그래프를 그리는 것보다 그래프를 올바르게 해석하는 것이 더 어렵다는걸 다시 한번 느끼는 계기가 되었다. 내가 해석한 내용이 맞는지 아직도 확신이 가진 않지만 계속 하다보면 언젠가는 날카롭고 창의적인 결과를 도출해낼 수 있을 것이라고 믿는다 :)