λ°μ—”μœΌλ‘œ μ„±μž₯쀑 🌱

Python/[기초 κ°•μ˜ 정리]

python 기초 11

써밍 2023. 3. 3. 13:01

 

✍🏻 λ°°μš΄μ 

 

데이터λ₯Ό μ‹œκ°ν™”ν•˜λŠ” 방법을 읡힐 수 μžˆμ—ˆλ‹€. 지도 μœ„ μ‹œκ°ν™”, κ·Έλž˜ν”„ μ‹œκ°ν™”λ₯Ό λ‹€λ£° 수 μžˆμ—ˆκ³  이제 λ‹€λ₯Έ 데이터듀도 μ‘μš©ν•˜μ—¬ μ‹œκ°ν™”ν•΄ λ³Ό 수 μžˆμ„ 것 κ°™λ‹€.

 

 

 

 


 

 

 

λ“€μ–΄κ°€λ©°

 

μ§€λ‚œ 편의점 데이터λ₯Ό κ°€μ§€κ³  μ‹œκ°ν™”ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ°Έκ³ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€ :)

 

 

 

 

 

assert

 

νŒŒμ΄μ¬μ—μ„œ assert λŠ” κ°€μ • μ„€μ •λ¬ΈμœΌλ‘œ, κ°œλ°œμžκ°€ μ—λŸ¬λ₯Ό λ§Œλ“€κ³  μ‹Άμ„λ•Œ μ‚¬μš©ν•œλ‹€.

 

a = 10
try:
	assert a != 10 # μ—¬κΈ°μ„œ μ—λŸ¬ λ°œμƒ
except:
	print("Assert μ—λŸ¬ 남") # except 에 ν•΄λ‹Ήν•˜λ―€λ‘œ 좜λ ₯됨

 

주둜, νŠΉμ • 버전듀을 κ°œλ°œμžμ™€ μ‚¬μš©μžκ°€ λ˜‘κ°™μ΄ λ§žμΆ°μ€„ ν•„μš”κ°€ μžˆμ„ λ•Œ μ‚¬μš©ν•œλ‹€κ³  ν•œλ‹€.

 

 

 

 

μ •κ·œ ν‘œν˜„μ‹ μΉ˜ν™˜

 

νŒŒμ΄μ¬μ—μ„œ λ¬Έμžμ—΄μ„ μ •κ·œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ—¬ νŠΉμ • 문자둜 μΉ˜ν™˜ν•  수 μžˆλ‹€.

 

import re

re.sub(μ •κ·œ ν‘œν˜„μ‹, μΉ˜ν™˜ν•˜κ³  싢은 문자, ν•΄λ‹Ή λ¬Έμžμ—΄)

 

re λͺ¨λ“ˆμ˜ sub() λ©”μ„œλ“œλ₯Ό 톡해 μ‚¬μš©ν•˜λ©΄ λ¬Έμžμ—΄μ„ νŠΉμ • 쑰건에 λ§žλŠ” 문자둜 μΉ˜ν™˜ν•  수 있게 λœλ‹€.

 

 

 

 

5개 편의점 제곡 μ„œλΉ„μŠ€ μ‘°νšŒν•˜κΈ°

 

μ•žμ—μ„œ μ§„ν–‰ν•œ 5개 λΈŒλžœλ“œ 편의점 데이터λ₯Ό μ‚¬μš©ν•˜μ—¬, μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€λ“€μ„ μ‘°νšŒν•΄λ³΄μž.

 

service = []

for x in 편의점['offeringService'].valuse:
	try:
    	if type(x) == list:
        	for y in x:
            	service.append(y)
        elif type(x) != float:
        	service.append(x)
    except:
    	pass


list(set(service))

 

5개 편의점 ν†΅ν‹€μ–΄μ„œ μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€ ν•­λͺ©λ“€μ„ λͺ¨λ‘ service 에 λ„£μ—ˆκ³  set 을 톡해 쀑볡을 μ œκ±°ν–ˆλ‹€.

 

# μ§‘ν•©μœΌλ‘œ λ§Œλ“¦
master = {"λ°°μ†‘μ„œλΉ„μŠ€": {'λ¬΄μΈνƒλ°°μ ‘μˆ˜', 'νŽ˜λ±μŠ€μ„œλΉ„μŠ€', 'delivery_service', 'post'},
          "μ˜μ•½ν’ˆ" : {'drug', 'μ˜μ•½ν’ˆ'},
          "μΈμΆœμ„œλΉ„μŠ€" : {'atm', 'ATM', 'withdrawal', 'smart_atm', 'μ‹œλ””'}
          }

 

그리고, μ„±μ§ˆμ΄ 같은 μ„œλΉ„μŠ€λΌλ¦¬ λ¬Άμ–΄μ„œ μ €μž₯ν•˜μ˜€λ‹€.

 

 

이제, 편의점 지점듀이 λ°°μ†‘μ„œλΉ„μŠ€, μ˜μ•½ν’ˆ, μΈμΆœμ„œλΉ„μŠ€ 각 μ„Έ κ°€μ§€ μ„œλΉ„μŠ€λ₯Ό ν•˜λŠ”μ§€ μ•ˆν•˜λŠ”μ§€ μ²΄ν¬ν•˜μ—¬ column 에 μ €μž₯ν•  수 μžˆλ‹€.

 

편의점.loc[편의점['offeringService'].notnull(), 'λ°°μ†‘μ„œλΉ„μŠ€'] = \
편의점.loc[편의점['offeringService'].notnull(), 'offeringService'].\
apply(lambda x : 'Y' if len(set(x) & master['λ°°μ†‘μ„œλΉ„μŠ€']) > 0 else 'N')

# κ²°μΈ‘μΉ˜κ°€ μžˆλ‹€λ©΄ N 으둜 μ €μž₯ν•œλ‹€.
편의점['λ°°μ†‘μ„œλΉ„μŠ€'] = 편의점['λ°°μ†‘μ„œλΉ„μŠ€'].fillna("N")

 

λ°°μ†‘μ„œλΉ„μŠ€(key) 에 ν•΄λ‹Ήν•˜λŠ” value κ°’ 쀑 ν•˜λ‚˜λΌλ„ 있으면 λ°°μ†‘μ„œλΉ„μŠ€λ₯Ό ν•˜λŠ” 지점이닀.

λ°°μ†‘μ„œλΉ„μŠ€λ₯Ό ν•˜λŠ” μ§€μ μ—λŠ” λ°°μ†‘μ„œλΉ„μŠ€ column 에 Y, ν•˜μ§€ μ•ŠλŠ” μ§€μ μ—λŠ” N 을 μ €μž₯ν•œλ‹€.

 

편의점.loc[편의점['offeringService'].notnull(), 'μ˜μ•½ν’ˆ'] = \
편의점.loc[편의점['offeringService'].notnull(), 'offeringService'].\
apply(lambda x : 'Y' if len(set(x) & master['μ˜μ•½ν’ˆ']) > 0 else 'N')
편의점['μ˜μ•½ν’ˆ'] = 편의점['μ˜μ•½ν’ˆ'].fillna("N")

편의점.loc[편의점['offeringService'].notnull(), 'μΈμΆœμ„œλΉ„μŠ€'] = \
편의점.loc[편의점['offeringService'].notnull(), 'offeringService'].\
apply(lambda x : 'Y' if len(set(x) & master['μΈμΆœμ„œλΉ„μŠ€']) > 0 else 'N')
편의점['μΈμΆœμ„œλΉ„μŠ€'] = 편의점['μΈμΆœμ„œλΉ„μŠ€'].fillna("N")

 

μ˜μ•½ν’ˆκ³Ό μΈμΆœμ„œλΉ„μŠ€λ„ μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ μ§„ν–‰ν–ˆλ‹€.

 

 

κ·Έλ ‡λ‹€λ©΄, μ„Έ κ°€μ§€ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” 지점 λΉ„μœ¨μ„ 확인해볼 수 μžˆλ‹€.

 

편의점['λ°°μ†‘μ„œλΉ„μŠ€'].value_counts(normalize=True)
편의점['μ˜μ•½ν’ˆ'].value_counts(normalize=True)
편의점['μΈμΆœμ„œλΉ„μŠ€'].value_counts(normalize=True)

 

μ΄λ ‡κ²Œ, 5개 편의점 λ°μ΄ν„°λ‘œ 각 μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜κ³  μžˆλŠ” 지점 λΉ„μœ¨κ³Ό μ•„λ‹Œ 지점 λΉ„μœ¨μ„ 확인할 수 μžˆλ‹€.

 

 

 

 

 

κ°„νŽΈν•˜κ²Œ DB 에 μ—°κ²°ν•˜μ—¬ 데이터 μ €μž₯ν•˜κΈ°

 

νŒŒμ΄μ¬μ—μ„œλŠ”, 쿼리문을 날리지 μ•Šμ•„λ„ 데이터λ₯Ό DB 에 넣을 수 μžˆλ‹€.

 

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://user_name:user_address/db_name", echo=False)

편의점.to_sql(name="convenience", if_exists='append', con=engine)

 

λ¨Όμ €, DB λ₯Ό μ—°κ²°ν•˜κΈ° μœ„ν•΄ create_engine λͺ¨λ“ˆμ—μ„œ sqlalchemy λ₯Ό λΆˆλŸ¬μ˜¨λ‹€.

 

그리고, engine 에 κΈ°μ‘΄ db μ—°κ²° 계정과 데이터λ₯Ό 넣을 DB λ₯Ό ν‘œμ‹œν•œλ‹€.

 

to_sql() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 편의점 데이터λ₯Ό convenience λΌλŠ” ν…Œμ΄λΈ” λͺ…μœΌλ‘œ λ°”λ‘œ μ €μž₯ν•  수 μžˆλ‹€.

 

DB ꡬ쑰λ₯Ό λͺ°λΌλ„ 데이터λ₯Ό λ„£κ³  λΉΌκ³  μ‚­μ œν•˜λŠ” κ³Όμ •κΉŒμ§€ ν•  수 μžˆλ‹€.

단, 졜고의 μ„±λŠ₯은 μžλΆ€ν•  수 μ—†λ‹€.

λ˜ν•œ, ν•΄λ‹Ή data λ“€μ˜ μžλ£Œν˜•λ“€μ„ μž„μ˜λ‘œ text, bigint λ“± 으둜 λ‹€ λ•Œλ €λ°•κΈ° λ•Œλ¬Έμ— 일일이 μžλ£Œν˜•μ„ μˆ˜μ •ν•΄μ•Όν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆλ‹€.

 

 

그리고, μ΄λŸ¬ν•œ 과정을 '객체 관계 λ§€ν•‘(ORM, Object-Relation Mapping)' 이라고 ν•œλ‹€.

 

 

 

 

μ„œμšΈ 지도 뢈러였기

 

νŒŒμ΄μ¬μ—μ„œλŠ”, folium μ΄λΌλŠ” λͺ¨λ“ˆλ‘œ 지도λ₯Ό λ„μšΈ 수 μžˆλ‹€.

 

import folium # μ—†μœΌλ©΄ pip install folium

# μœ„μΉ˜μ™€ 쀌 크기λ₯Ό μ„€μ •ν•΄μ€€λ‹€.
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12)

seoul_map

 

folium 의 Map() λ©”μ„œλ“œλ₯Ό 톡해 ν•΄λ‹Ή μœ„μΉ˜μ™€ 쀌 크기λ₯Ό μ„€μ •ν•΄μ£Όλ©΄, μ›ν•˜λŠ” μ„œμšΈ μœ„μΉ˜μ˜ 지도λ₯Ό λ„μ›Œμ€€λ‹€.

 

 

 

 

 

μ„œμšΈμ‹œ 편의점 데이터λ₯Ό 지도에 μ‹œκ°ν™”ν•˜κΈ° : μ„œμšΈμ‹œ 편의점 점유율

 

μ„œμšΈμ‹œ 'ꡬ'λ₯Ό μ‹œκ°ν™” ν•  수 μžˆλŠ” 정보가 λ‹΄κΈ΄ json νŒŒμΌμ„ 톡해 μ ‘κ·Όν•΄λ³΄μž.

 

import json

geo_data = json.load(open("./skorea_municipalities_geo_simple.json", "r", encoding="utf-8"))

 

지리 데이터와 편의점 데이터λ₯Ό λ„£μ–΄ folium 을 톡해 μ„œμšΈμ‹œ 편의점 μ μœ μœ¨μ„ μ‹œκ°ν™”ν•΄λ³΄μž.

 

folium.Choropleth(geo_data = geo_data,
                  data = μ„œμšΈνŽΈμ˜μ ,
                  columns = [μ„œμšΈνŽΈμ˜μ .index, 'shopName'],
                  fill_color='YlOrRd', fill_opacity=0.7, line_opacity=0.3,
                  key_on = 'feature.properties.name').add_to(seoul_map)

 

folium 의 Choropleth() λ©”μ„œλ“œλ₯Ό 톡해, seoul_map 에 μ „κ΅­ 편의점 μ μœ μœ¨μ„ μ‹œκ°ν™” ν•  수 μžˆλ‹€.

 

 

 

 

μ„œμšΈμ‹œ 편의점 데이터λ₯Ό 지도에 μ‹œκ°ν™”ν•˜κΈ° : μ„œμšΈμ‹œ GS 편의점 μ’Œν‘œ

 

μ΄λ²ˆμ—λŠ” 마컀 ν˜•νƒœλ‘œ μ„œμšΈμ‹œμ˜ GS 편의점 μœ„μΉ˜λ₯Ό μ‹œκ°ν™”ν•΄λ³΄μž.

 

# λ‹€μ‹œ μ΄ˆκΈ°ν™”
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12)

# μ„œμšΈ 데이터λ₯Ό 톡해 μ„œμšΈ GS25 편의점 지도에 마컀 ν‘œμ‹œν•˜κΈ°
for idx, row in μ„œμšΈ[['brand', 'lat', 'longs']].iterrows():
	try:
    	if row.brand == 'GS25':
        	folium.Marker([row.longs, row.lat], popup=row.brand).add_to(seoul_map)
    except:
    	pass

 

folium 의 Marker() λ©”μ„œλ“œλ₯Ό 톡해 ν•΄λ‹Ή 편의점의 μœ„λ„, 경둜 데이터λ₯Ό λ„£μ–΄ seoul_map 에 마컀λ₯Ό λ„μšΈ 수 μžˆλ‹€.

 

 

 

 

 

mataplotlib.pylot (plt) κ·Έλž˜ν”„ ν•œκΈ€ 깨짐 ν˜„μƒ 영ꡬ ν•΄κ²°ν•˜κΈ° 

 

이제, κ·Έλž˜ν”„ ν˜•νƒœλ‘œλ„ ν™•μΈν•˜κΈ° μœ„ν•΄ mataplotlib.pylot (as plt) λ₯Ό μ‚¬μš©ν•  것이닀.

 

본격적으둜 μ‹œμž‘ν•˜κΈ° μ „, plt κ·Έλž˜ν”„λŠ” 아직 ν•œκΈ€μ„ μ œλŒ€λ‘œ μ§€μ›ν•˜μ§€ μ•Šμ•„μ„œ, ν•œκΈ€ 깨짐 ν˜„μƒ λ¬Έμ œκ°€ μžˆλ‹€.

 

이λ₯Ό μ½”λ“œλ₯Ό 계속 μ‹€ν–‰μ‹œμΌœμ„œ ν•œκΈ€ 깨짐 ν˜„μƒμ„ μΌμ‹œμ μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμ§€λ§Œ, 계속 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ”λ°μ— λ²ˆκ±°λ‘œμ›€μ΄ μžˆκΈ°μ— 영ꡬ ν•΄κ²° 방법을 톡해 μ„€μ •ν•΄λ‘μž.

 

[ μ£Όν”Όν„° λ…ΈνŠΈλΆ plt ν•œκΈ€ 깨짐 영ꡬ ν•΄κ²°ν•˜κΈ° ]

 

μ£Όν”Όν„° λ…ΈνŠΈλΆ(Jupyter notebook) - Matplotlib ν•œκΈ€ 깨짐 ν˜„μƒ ν•΄κ²°

plt.figure().add_subplot().set_title('ν•œκΈ€ 제λͺ© ν…ŒμŠ€νŠΈ Plot') plt.plot(x, y)​ λ¬Έμ œν˜„μƒ μ£Όν”Όν„° λ…ΈνŠΈλΆμ—μ„œ Matplotlib νŒ¨ν‚€μ§€λ₯Ό μ΄μš©ν•˜μ—¬ κ·Έλž˜ν”„λ₯Ό κ·Έλ €λ‚Ό λ•Œ, λ²”λ‘€λ‚˜ μΆ•, 제λͺ©(title)λ“±μ—μ„œ ν•œκΈ€μ„ μ‚¬μš©ν•˜λ©΄ ν•œ

itisik.tistory.com

 

λ‚˜λŠ” μœ„ ν•΄λ‹Ή 링크λ₯Ό 톡해, ν•œκΈ€ 폰트 깨짐 문제λ₯Ό 영ꡬ적으둜 ν•΄κ²°ν–ˆλ‹€.

 

 

 

 

μ „κ΅­ 편의점 점유율 κ·Έλž˜ν”„ μ‹œκ°ν™”ν•˜κΈ° : λ§‰λŒ€ κ·Έλž˜ν”„

 

이제, κ·Έλž˜ν”„ ν˜•νƒœλ‘œ μ „κ΅­ 편의점 μ μœ μœ¨μ„ λ‚˜νƒ€λ‚΄λ³΄μž.

 

import matplotlib.pyplot as plt
import numpy as np

# 편의점 data 뢈러였기(편의점 수)
data = 편의점.groupby(['brand'])['shopName'].count()

# plt κ°’ μ„€μ •
plt.style.use("ggplot") # λ‹€λ₯Έ λ°©μ‹μœΌλ‘œλ„ κ°€λŠ₯: seaborn λ“±
plt.tilte("μ „κ΅­ 편의점 점유율")
x = np.arrange(data.value.size)
name = data.index
values = data.values

# plt μ„€μ •
plt.bar(x, values)
plt.xticks(x, name)
plt.legend(loc='best', labels='점유율')

# plt 좜λ ₯
plt.show()

 

λ§‰λŒ€ κ·Έλž˜ν”„ ν˜•νƒœμ˜ 편의점 μ μœ μœ¨μ„ λ³Ό 수 μžˆλ‹€.

 

 

 

 

μ „κ΅­ 편의점 점유율 κ·Έλž˜ν”„ μ‹œκ°ν™”ν•˜κΈ° : 파이 κ·Έλž˜ν”„

 

μ΄λ²ˆμ—λŠ” μ›ν˜• ν˜•νƒœμΈ 파이 κ·Έλž˜ν”„λ‘œ μ „κ΅­ 편의점 μ μœ μœ¨μ„ λ‚˜νƒ€λ‚΄λ³΄μž.

 

import matplotlib.pyplot as plt
import numpy as np

# 편의점 data 뢈러였기(편의점 수)
data = 편의점.groupby(['brand'])['shopName'].count()

# plt κ°’ μ„€μ •
plt.style.use("ggplot")
plt.figure(figsize=(15,15))
plt.title('μ „κ΅­ 편의점 점유율')
x = np.arange(data.values.size)
name = data.index
values = data.values

# plt μ„€μ •
plt.pie(values, labels=data.index) # μ›ν˜•μ˜ 파이 ν˜•νƒœ
plt.legend(loc='best', labels=data.index)

# plt 좜λ ₯
plt.show()

 

μ›ν˜•μ˜ 파이 ν˜•νƒœ κ·Έλž˜ν”„λ‘œ 편의점 μ μœ μœ¨μ„ λ³Ό 수 μžˆλ‹€.

 

'Python > [기초 κ°•μ˜ 정리]' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

python 기초 13  (0) 2023.03.12
python 기초 12  (3) 2023.03.06
python 기초 10  (0) 2023.03.03
python 기초 9  (0) 2023.03.01
python 기초 8  (0) 2023.02.26