본문 바로가기

코리아IT

240528

문제

  • 판매제품(StockCode) Top 10
  • 단, 기준은 Quantity
top_selling = retail.groupby('StockCode')['Quantity'].sum().sort_values(ascending=False).head(10)
top_selling

StockCode
23843     80995
23166     77916
84077     54415
22197     49183
85099B    46181
85123A    36782
84879     35362
21212     33693
23084     27202
22492     26076
'''
  • 우수고객(CustomerID) TOP10
  • 단, 기준은 CheckoutPrice
vvip = retail.groupby('CustomerID')['CheckoutPrice'].sum().sort_values(ascending=False).head(10)
vvip

CustomerID
14646.0    280206.02
18102.0    259657.30
17450.0    194550.79
16446.0    168472.50
14911.0    143825.06
12415.0    124914.53
14156.0    117379.63
17511.0     91062.38
16029.0     81024.84
12346.0     77183.60
'''

 

 

 

상권별 업종 밀집 통계 데이터 처리하기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

shop = pd.read_csv('/content/drive/MyDrive/코리아 IT/5. 데이터 분석/데이터/shop_201806_01.csv')
shop # 데이터 가져오기

 

가져 온 데이터가 39개 컬럼을 확인

pd.set_option('display.max_columns', 40)
shop.head()

모든 컬럼 보기 위해 디스플레이 최대값늘림

shop.info()

정보 확인

shop.columns

컬럼들 확인

view_columns = ['상호명', '지점명', '상권업종대분류명', '상권업종중분류명', '상권업종소분류명', '시도명', '시군구명', '도로명', '도로명주소', '경도', '위도']

원하는 컬럼만 보고 싶을때

shop = shop[view_columns]
shop.head()

null 부분 있는지 확인

shop.isnull().sum()

 

 

그래프를 그리기 위해 한글 패치 사용

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

한글 불러 오고

plt.rc('font', family='NanumBarunGothic')

 

불러온 데이터를 확인하면

shop.plot.scatter(x='경도', y='위도', grid=True, figsize=(6,8))

서울과 부산에 집중되어 있다고 볼 수 있음

shop_seoul = shop.loc[shop['도로명주소'].str.startswith('서울')]
shop_seoul

도로 주소명으로 서울만 가져올 때

shop_except_seoul = shop.loc[~shop['도로명주소'].str.startswith('서울')]
shop_except_seoul

도로 주소명으로 서울 외의 데이터만 가져 올 떄

shop_seoul.plot.scatter(x='경도', y='위도', grid=True, figsize=(10,8))

shop_seoul만 scatter 

shop_except_seoul.plot.scatter(x='경도', y='위도', grid=True, figsize=(10,8))

서울 제외 지역만 scatter

 

 

seaborn

  • 데이터를 시각화하는 데 사용하는 라이브러리
  • Matplotlib을 기반으로 더 쉽고, 통계적으로 유의미한 그래프를 그릴 수 있도록 다양한 기능을 제공
  • 데이터 분석 및 데이터 사이언스 프로젝트에서 자주 사용
import seaborn as sns
plt.figure(figsize=(14, 10))
sns.scatterplot(data=shop_seoul, x='경도', y='위도', hue='시군구명')

shop_seoul['상권업종대분류명'].value_counts()

대분류명 종류별로 확인

shop_seoul_edu = shop_seoul[shop_seoul['상권업종대분류명'] == '학문/교육']
shop_seoul_edu

대분류에 학문/교육부분

shape을 보면 총 수와 columns

 

plt.figure(figsize=(14, 10))
sns.scatterplot(data=shop_seoul_edu, x='경도', y='위도', hue='상권업종중분류명')

상권업종중분류명으로 분류

shop_seoul_edu_computer = shop_seoul_edu[shop_seoul_edu['상권업종중분류명'] == '학원-컴퓨터']
shop_seoul_edu_computer

상권업종중분류명 에서 학원-컴퓨터 업종

shop_seoul_edu_computer.shape

shape을 보면

 

plt.figure(figsize=(14, 10))
sns.scatterplot(data=shop_seoul_edu_computer, x='경도', y='위도', hue='상권업종소분류명')

상권업종소분류명 - 컴퓨터 학원 보기

 

 

folium

!pip install folium
import folium
# folium.Map(location=[위도, 경도], zoom_start=배율, ...)
map_folium = folium.Map(location=[37.500043085219545, 127.03557801473566], zoom_start=17)
map_folium

# Marker(): location 속성으로 지정한 위치에 마커를 생성
# popup(): 마커를 클릭했을 때 표시할 문자열을 설정
# add_to(): 작성된 마커를 지도에 추가
map_folium = folium.Map(location=[37.500043085219545, 127.0355780147356], zoom_start=17)
popup = folium.Popup('코리아IT아카데미', max_width=200)
folium.Marker([37.500043085219545, 127.0355780147356], popup=popup).add_to(map_folium)
map_folium

# 지도: 37.56652479270633, 126.9779129116262
# 서울특별시청: 37.56652479270633, 126.9779129116262
# 덕수궁: 37.56585320879458, 126.97514572197248
# 서울지방경찰청: 37.57504045678939, 126.97195576938117
# 광화문: 37.57617987638928, 126.97694467807803
# 영풍문고-종로본점: 37.56999947440024, 126.98228391170936

map_folium = folium.Map(location=[37.56652479270633, 126.9779129116262], zoom_start=17)
popup = folium.Popup('서울특별시청', max_width=200)
folium.Marker([37.56652479270633, 126.9779129116262], popup=popup).add_to(map_folium)

popup = folium.Popup('덕수궁', max_width=200)
folium.Marker([37.56585320879458, 126.97514572197248], popup=popup).add_to(map_folium)

popup = folium.Popup('서울지방경찰청', max_width=200)
folium.Marker([37.57504045678939, 126.97195576938117], popup=popup).add_to(map_folium)

popup = folium.Popup('광화문', max_width=200)
folium.Marker([37.57617987638928, 126.97694467807803], popup=popup).add_to(map_folium)

popup = folium.Popup('영풍문고-종로본점', max_width=200)
folium.Marker([37.56999947440024, 126.98228391170936], popup=popup).add_to(map_folium)


map_folium

from folium.features import CustomIcon
icon_image = '/content/drive/MyDrive/코리아 IT/5. 데이터 분석/데이터/police.png'
icon = CustomIcon(icon_image, icon_size=(45,45))
map_folium = folium.Map(location=[37.56652479270633, 126.9779129116262], zoom_start=15)
popup = folium.Popup('서울특별시청', max_width=200)
folium.Marker(location=[37.56652479270633, 126.9779129116262], popup=popup,
              icon=folium.Icon(icon='star', color='red')).add_to(map_folium)
popup = folium.Popup('덕수궁', max_width=200)
folium.Marker(location=[37.56585320879458, 126.97514572197248], popup=popup,
              icon=folium.Icon(icon='ok', color='pink')).add_to(map_folium)
popup = folium.Popup('서울지방경찰청', max_width=200)
folium.Marker(location=[37.57504045678939, 126.97195576938117], popup=popup,
              icon=icon).add_to(map_folium)
popup = folium.Popup('광화문', max_width=200)
folium.Marker(location=[37.57617987638928, 126.97694467807803], popup=popup).add_to(map_folium)
# CircleMarker(): 원의 범위를 마커로 설정
popup = folium.Popup('내땅', max_width=200)
folium.CircleMarker(location=[37.56999947440024, 126.98228391170936], popup=popup,
                    radius=30, color='red', fill_color='#EC4074').add_to(map_folium)
map_folium

 

문제

  • shop_seoul_edu_computer 데이터프레임에 있는 모든 데이터를 지도에 표기
  • 단, 일반 마커로 표기하며 클릭하면, "상호명-주소" 형태의 팝업을 보여줌
data = shop_seoul_edu_computer
edu_map = folium.Map(location=[data['위도'].mean(), data['경도'].mean()], zoom_start=12)
for i in data.index:
  edu_name = data.loc[i, '상호명'] +'-' + data.loc[i, '도로명주소']
  popup = folium.Popup(edu_name, max_width=500)
  folium.Marker([data.loc[i, '위도'], data.loc[i, '경도']], popup=popup).add_to(edu_map)
edu_map

 

문제

  • 상권업종중분류명이 '커피점/카페'인 데이터 중 '구군'이 '강남구'인 데이터만 지도에 표기
  • 단, 일반 마커로 표기하며 클릭하면 "상호명-주소" 형태의 팝업을 보여줌
shop_seoul_coffee = shop_seoul[(shop_seoul['상권업종중분류명'] == '커피점/카페')]
shop_seoul_coffee

shop_seoul_coffee.shape

data = shop_seoul_coffee[shop_seoul_coffee['시군구명'] == '강남구']
coffee_map = folium.Map(location=[data['위도'].mean(), data['경도'].mean()], zoom_start=14)

for i in data.index:
    coffee_name = data.loc[i, '상호명'] + ' - ' + data.loc[i, '도로명주소']
    popup = folium.Popup(coffee_name, max_width=500)
    folium.Marker(location=[data.loc[i, '위도'], data.loc[i, '경도']], popup=popup).add_to(coffee_map)

coffee_map

 

 

전국도시공원 데이터 둘러보기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
park = pd.read_csv('/content/drive/MyDrive/코리아 IT/5. 데이터 분석/데이터/전국도시공원표준데이터.csv', encoding='ms949')
park.head()

 

CSV 파일의 한글을 encoding='ms949 으로 정확하게 읽어오게 함.

불러온 데이터 확인

!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf

Matplotlib을 사용할 때 한글 폰트를 깨지지 않고 사용하게 하기 위해 나눔 폰트를 설치하고, 캐시를 갱신하며, matplotlib의 캐시를 삭제하는 과정

plt.rc('font', family='NanumBarunGothic')

폰트 사용

park.info()

정보 확인

park.drop(columns=['공원보유시설(운동시설)', '공원보유시설(유희시설)', '공원보유시설(편익시설)', '공원보유시설(교양시설)', '공원보유시설(기타시설)', '지정고시일', '관리기관명', 'Unnamed: 19'], inplace=True)

columns 수가 너무 많아 일부 드랍스킴 inplace=True로 즉시 반영

park.plot.scatter(y='위도', x='경도', figsize=(8, 10), grid=True)

 

 

boxplot

  • 데이터의 분포를 시각화하는데 유용
  • 주로 데이터의 중앙값(중위수, median),  사분위수(Q1 [25%], Q2[50%], Q3[75%], Q4[100%], 이상치 등을 표현하는데 활용
  • 상자: Q1과 Q3 사이의 범위
  • 상자 내부 선: Q2(중앙값)
  • 수염: 데이터의 최소값과 최대값, 아래 수염(Q1 - 1.5*IQR), 위쪽 수염(Q3 + 1.5 * IQR)
  • IQR = Q3 - Q1, 데이터의 변동성을 평가하는데 사용
  • 수염을 벗어나는 값들은 이상치로 간주됨
sns.boxplot(y=park['위도'])

 

sns.boxplot(y=park['경도'])

 

수염을 벗어나는 이상치로 간주되는 값들을 확인

# 위도와 경도의 이상치로 판별되는 데이터를 확인
park.loc[(park['위도'] < 32) | (park['경도'] > 132)]

범위 설정하여 이상치가 나타나는 값이 어떤 항목인지 확인

park_loc_error = park.loc[(park['위도'] < 32) | (park['경도'] > 132)]
park_loc_error

두 데이터를 에러 처리

 

# '소재지도로명주소'가 입력되지 않고, '소재지지번주소'만 입력된 데이터를 확인
park.loc[park['소재지도로명주소'].isnull() & park['소재지지번주소'].notnull()]

 

# '소재지도로명주소' 와 '소재지지번주소'가 모두 입력되지 않은 데이터를 확인
park.loc[park['소재지도로명주소'].isnull() & park['소재지지번주소'].isnull()]

# '소재지도로명주소'가 입력되지 않은 데이터는 '소재지지번주소' 로 대신 채움
park['소재지도로명주소'].fillna(park['소재지지번주소'], inplace=True)

park.loc[park['소재지도로명주소'].isnull() & park['소재지지번주소'].notnull()]

# park['소재지도로명주소'].str.split(' ')
# 예) [부산광역시, 강서구, 구랑동, 1199-7]
# park['소재지도로명주소'].str.split(' ', expand=True)
# 데이터프레임으로 데이터가 분리되고 인덱싱과 슬라이싱이 가능
park['소재지도로명주소'].str.split(' ', expand=True)

# '소재지도로명주소'에서 '시도'만 추출하여 '시도' 파생변수를 생성
park['시도'] = park['소재지도로명주소'].str.split(' ', expand=True)[0]
park.head()

park['시도'].value_counts()

# '시도'에 '강원'을 '강원도'로 변경
park['시도'] = park['시도'].replace('강원', '강원도')
park['시도'].value_counts()

park_sido = pd.DataFrame(park['시도'].value_counts())
park_sido

'코리아IT' 카테고리의 다른 글

240604  (0) 2024.06.04
240603  (0) 2024.06.03
240527  (0) 2024.05.27
240523-24  (0) 2024.05.24
240522  (0) 2024.05.22