โ๐ป ๋ฐฐ์ด์
ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ค๋ฅธ ํ์ ๋ณ์๋ฅผ ๋ง๋ค์ด ์ ์๋ฏธํ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๐ ๋ชฉ์ฐจ
1. 5๊ฐ ๋ธ๋๋ ํธ์์ ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
2. ํต๊ณ์ฒญ ์ธ๊ตฌ์(์ฐ๋ น๋ณ ์ธ๊ตฌํํฉ) ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
3. ์ธ๊ตฌ์ ๋๋น ํธ์์ ์ ์ ์จ ๊ตฌํ๊ธฐ
4. ์์ธ์ ๊ตฌ๋ณ ๊ฐ์ฅ ๋ง์ด ์กด์ฌํ๋ ํธ์์ ๋ธ๋๋ ์ฐพ๊ธฐ
๋ค์ด๊ฐ๋ฉฐ
5๊ฐ ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์งํํ์์ต๋๋ค. ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ฒฝํ์ง ์์์, ์ถํ์ ๊ฐ ํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์ ํฌ์คํ ํ ์์ ์ ๋๋ค.
5๊ฐ ๋ธ๋๋ ํธ์์ ๋ฐ์ดํฐ ํ์ธํ๊ธฐ
์ ๊ตญ 5๊ฐ ํธ์์ ์ ๋ณด ๋ฐ์ดํฐ๊ฐ ๋ด๊ธด pkl ํ์ผ์ ์ด์ด, ๋ฐ์ดํฐ๋ฅผ ํ์ํด๋ณด์.
import pandas as pd
import numpy as np
df = dp.read_pickle("./5store.pkl")
๋จผ์ , ๋ฐ์ดํฐ์ ๊ฒฐ์ธก์น์ ๊ฐ์๋ฅผ ํ์ธํด๋ณด์.
df.isnull().sum()
DataFrame ์์ null ๊ฐ์ ์ฐพ๊ณ column ๋จ์๋ก ๋ฌถ์ด ๊ฐ์๋ฅผ ํ์ธํด๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ํธ์์ ๋ธ๋๋๋ณ ์ด ์ ํฌ ๊ฐ์๋ ๊ตฌํด๋ณผ ์ ์๋ค.
df['brand'].value_counts()
๋ธ๋๋๋ณ value ๊ฐ ๊ฐ์๋ค์ ์นด์ดํธํด์ค๋ค.
ํธ์์ ๋ค์ ์ง์ญ๋ณ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํด์, ์ฃผ์ column ์์ ์ง์ญ์ ํด๋นํ๋ ๋ฌธ์์ด๋ง ๋ฝ์ ํต์ผํด์ฃผ๋ ์์ ์ด ํ์ํ๋ค.
# ๋จผ์ , ๊ณ ์ ํ ๊ฐ๋ง ์ฐพ์๋ณธ๋ค. (๋์์, ์ด์ํ ๊ฐ ์๋์ง ํ์ธ ๊ฐ๋ฅ)
df['address'].apply(lambda x : x.split()[0]).unique()
# ์/๋ ๊ฐ ๊ณ ์ ์ด ๊ฐ์ ์ฐพ๊ธฐ
df['address'].apply(lambda x : x.split()[0]).value_counts()
์ฃผ์๊ฐ ๋ด๊ธด ๋ฌธ์์ด์ ๊ณต๋ฐฑ ๊ธฐ์ค ์๋ฅด๊ณ ๋จผ์ ๋์ค๋ ๊ฐ์ด ์/๋ ๊ฐ ๋์์ผํ๋ค.
์ด์์น๋ ์ค์์ ํํ๋ค์ ํ๋๋ก ํต์ผํด์ฃผ์.
๋จผ์ , '๊ฒฝ๊ธฐ'๋ก ์์ํ๋ ๋ชจ๋ ์ฃผ์๋ฅผ ์ฐพ์๋ณด์.
# '๊ฒฝ๊ธฐ'๊ฐ 0๋ฒ์งธ index ์ ์๋ ๊ฐ์์ ์ฃผ์๊ฐ ๊ณ ์ ํ ๊ฐ ์ฐพ๊ธฐ
df[df['address'].str.find("๊ฒฝ๊ธฐ") == 0]['address'].apply(lambda x : x.split()[0]).unique()
'๊ฒฝ๊ธฐ' ๋ก ์์ํ๋ address ์ ๊ณ ์ ๊ฐ๋ง ๋์ค๊ฒ ๋๋ค.
์ด์ , ์ด์์น๋ค์ ์์์ผ๋ ๋ฐ๊ฟ์ฃผ๋๋ก ํ์.
๋ฐ๊พธ๊ธฐ ์ , ์ฃผ์๊ฐ๋ค์ ์์ ๊ณต๋ฐฑ๋ค์ ์ ๊ฑฐํด์ค๋ค.
df['address'] = df['address'].apply(lambda x: x.strip())
strip() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์๊ฐ์ ์์ ๊ณต๋ฐฑ๋ค์ ์ ๊ฑฐํ๋ค.
df.loc[df['address'].str.find("๊ฒฝ๊ธฐ") == 0, '์'] = '๊ฒฝ๊ธฐ๋'
# '์' column ํ์ธ
df['์'].value_counts()
๊ทธ๋ฆฌ๊ณ '๊ฒฝ๊ธฐ'๋ก ์์ํ๋ ์ฃผ์๋ค์ ์ฐพ๊ณ '์' column ์ ๋ง๋ค์ด '์' column ์ ๋ชจ๋ '๊ฒฝ๊ธฐ๋' ๋ก ์ ์ฅ๋๋ค.
df.loc[(df['address'].str.find("๋ถ์ฐ") == 0), '์'] = '๋ถ์ฐ๊ด์ญ์'
df.loc[(df['address'].str.find("๋์ ") == 0), '์'] = '๋์ ๊ด์ญ์'
df.loc[(df['address'].str.find("๊ด์ฃผ") == 0), '์'] = '๊ด์ฃผ๊ด์ญ์'
df.loc[(df['address'].str.find("๋๊ตฌ") == 0), '์'] = '๋๊ตฌ๊ด์ญ์'
df.loc[(df['address'].str.find("์ธ์ฐ") == 0), '์'] = '์ธ์ฐ๊ด์ญ์'
df.loc[(df['address'].str.find("์ธ์ฒ") == 0), '์'] = '์ธ์ฒ๊ด์ญ์'
df.loc[(df['address'].str.find("๊ฐ์") == 0), '์'] = '๊ฐ์๋'
df.loc[(df['address'].str.find("์ธ์ข
") == 0), '์'] = '์ธ์ข
ํน๋ณ์์น์'
df.loc[(df['address'].str.find("์ ์ฃผ") == 0), '์'] = '์ ์ฃผํน๋ณ์์น๋'
df.loc[(df['address'].str.find("๊ฒฝ๋ถ") == 0) |
(df['address'].str.find("๊ฒฝ์๋ถ๋") == 0), '์'] = '๊ฒฝ์๋ถ๋'
df.loc[(df['address'].str.find("์ ๋ถ") == 0) |
(df['address'].str.find("์ ๋ผ๋ถ๋") == 0), '์'] = '์ ๋ผ๋ถ๋'
df.loc[(df['address'].str.find("์ ๋จ") == 0) |
(df['address'].str.find("์ ๋ผ๋จ๋") == 0), '์'] = '์ ๋ผ๋จ๋'
df.loc[(df['address'].str.find("์ถฉ๋ถ") == 0) |
(df['address'].str.find("์ถฉ์ฒญ๋ถ๋") == 0), '์'] = '์ถฉ์ฒญ๋ถ๋'
df.loc[(df['address'].str.find("์ถฉ๋จ") == 0) |
(df['address'].str.find("์ถฉ์ฒญ๋จ๋") == 0), '์'] = '์ถฉ์ฒญ๋จ๋'
df.loc[(df['address'].str.find("๊ฒฝ๋จ") == 0) |
(df['address'].str.find("๊ฒฝ์๋จ๋") == 0), '์'] = '๊ฒฝ์๋จ๋'
๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฅธ ์ฃผ์๋ค๋ ์,๋ ํตํฉ์ ์งํํด์ฃผ์๋ค.
df = df[~df[['brand', 'shopName']].duplicated()].copy()
๊ทธ๋ฆฌ๊ณ ๋ธ๋๋์ ์ง์ ๋ช ์ด ๋์ผํ ์ค๋ณต๊ฐ๋ค์ ์ฐพ์ ์ ๊ฑฐํด์ค ๊ฒ์ผ๋ก ๋ค์ df ์ ์ ์ฅํ๋ค.
์ด์ , '์' column ์ null ๊ฐ์ผ๋ก ๋ค์ด๊ฐ ๋ฐ์ดํฐ๋ค์ ์ฐพ์๋ณด์.
df[df['์'].isnull()]
์ฃผ์๊ฐ์ด ์ ์ฅ๋ ํํ๊ฐ ์ด์ํ๊ธฐ ๋๋ฌธ์, '์' column ์ Nan ๊ฐ์ด ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋์ค์ ๋ฐ๋ก ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํ๋ ๊ฐ๋ค์ด๋ค. (index ์กฐ์ ํ ์งํ)
df ์ index ๋ฅผ ๋ณด๋ฉด ์์์ ์งํํ ๊ณผ์ ๋๋ฌธ์, ๋ค์ฃฝ๋ฐ์ฃฝ์ด๋ผ ์ฌ์ค์ ํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
# df index ์ฌ์ค์
# drop = True : ์๋ก์ด column ์ผ๋ก ์ถ๊ฐ๋์ง ์๋๋ค.
# inplace = True : ๋ฐ๋ก ํด๋น df ์ ์ ์ฉ๋๋ค.
df.reset_index(drop=True, inplace=True)
reset_index() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ, df ์ index ๋ฅผ ๋ค์ ์ฌ์ ์ ํ๋ค.
df.loc[24549, "address"] = "์์ธ์ ์๋๋ฌธ๊ตฌ ์ถฉ์ ๋ก7 ๊ตฌ์ธ๊ตฐ๋น๋ฉ1์ธต"
df.loc[df['address'].str.find("์ฐฝ์") == 0, "์"] = '๊ฒฝ์๋จ๋'
df.loc[30712, '์'] = '๊ฒฝ๊ธฐ๋'
df.loc[33001, '์'] = '๋ถ์ฐ๊ด์ญ์'
df.loc[33723, '์'] = '์ถฉ์ฒญ๋จ๋'
df.loc[33985, '์'] = '์ถฉ์ฒญ๋จ๋'
df[df['์'].isnull()] # null ๊ฐ ์์
๋ง์ง๋ง์ผ๋ก, ๋์ค์ ๋ฐ๋ก ์ฒ๋ฆฌํด์ฃผ๊ธฐ๋ก ํ ๊ฐ์ ์ฒ๋ฆฌํ๋ค.
์ด์ , ์, ๋ ๋ณ ๊ตฌ๋ถ์ ์๋ฃ ํ๊ธฐ ๋๋ฌธ์ ์ ๊ตญ ์,๋๋ณ ํธ์์ ์ ์ ์จ์ ๊ตฌํด๋ณผ ์ ์๋ค.
df['์'].value_counts(normalize=True) # ์, ๋๋ณ ํธ์์ ๋น์จ
17๊ฐ์ ์, ๋ ๋ณ ๋น์จ๊ฐ์ ์ ์ ์๋ค. 0๊ณผ 1 ์ฌ์ด์ ๋น์จ๋ก ๋์ค๋ฉฐ, ์ ์ฒด ๋น์จ์ ํฉ์ 1์ด๋ค.
ํต๊ณ์ฒญ ์ธ๊ตฌ์(์ฐ๋ น๋ณ ์ธ๊ตฌํํฉ) ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
์ธ๊ตฌ ์ ๋๋น ํธ์์ ์ ์ ์จ์ ๊ตฌํ๊ธฐ ์ํด, ํต๊ณ์ฒญ ์ธ๊ตฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ์.
https://jumin.mois.go.kr/ageStatMonth.do
ํด๋น ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๊ธฐ๊ฐ์ ์ ํํ๊ณ , ๊ฒ์ ๋ฒํผ์ ๋๋ฅด๋ฉด payload ๊ฐ์ ํ์ธํ ์ ์๋ค.
2023๋ 2์ ๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ์.
import requests
stat_url = "https://jumin.mois.go.kr/ageStatMonth.do"
pay = {"tableChart": "T",
"sltOrgType": "1",
"sltOrgLvl1": "A",
"sltOrgLvl2": "A",
"sltUndefType": "",
"nowYear": "2023",
"searchYearMonth": "year",
"searchYearStart": "2023",
"searchMonthStart": "02",
"searchYearEnd": "2023",
"searchMonthEnd": "02",
"sum": "sum",
"gender": "gender",
"sltOrderType": "1",
"sltOrderValue": "ASC",
"sltArgTypes": "10",
"sltArgTypeA": "0",
"sltArgTypeB": "100",}
r = requests.post(stat_url, data=pay)
korea = pd.read_html(r.text)[2]
post ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๊ณ , ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐ์ดํฐ๊ฐ html ์ table ๊ตฌ์กฐ ์์ ์๊ธฐ ๋๋ฌธ์, read_html ์ ์ฌ์ฉํ์ฌ ์ธ๊ตฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ธ๊ตฌ์ ๋๋น ํธ์์ ์ ์ ์จ ๊ตฌํ๊ธฐ
์ธ๊ตฌ์ ๋ฐ์ดํฐ์ ํธ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง์ถฐ์ฃผ๊ณ ๋ DataFrame ์ ํฉ์น๋๋ก ํ์.
# ์ธ๊ตฌ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(ํ์ ๊ธฐ๊ด ๋ฐ ํด๋น๊ธฐ๊ฐ ์ธ๊ตฌ์)
์ธ๊ตฌ = korea.iloc[1: [0, 1]]
# ์,๋๋ณ ํธ์์ ์ด ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
ํธ์์ = pd.DataFrame(df['์'].value_counts())
# ํ์ ๊ธฐ๊ด clolumn ์ index ๋ก ์ง์ ํด์ฃผ๊ธฐ
์ธ๊ตฌ.set_index("ํ์ ๊ธฐ๊ด", inplace=True)
# index ๋ก ์ ๋์๋์ง ํ์ธํ๊ธฐ
์ธ๊ตฌ.head()
์ธ๊ตฌ์ ๋ฐ์ดํฐ์ ํธ์์ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๋ง์ท์ผ๋, ์ธ๊ตฌ๋๋น ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
# ์ธ๊ตฌ df ๊ธฐ์ค์ผ๋ก, ํธ์์ df ๋ฅผ ํฉ์น๋ค.
์ธ๊ตฌ๋๋น = pd.merge(์ธ๊ตฌ, ํธ์์ , left_index=True, right_index=True, how='left')
# ์ธ๊ตฌ๋๋น columns ๋ช
์ ์ค์ ํด์ค๋ค.
์ธ๊ตฌ๋๋น.columns = ['์ธ๊ตฌ์', 'ํธ์์ ์']
# ์ธ๊ตฌ๋๋น ํธ์์ ์ ์ ์จ columns ์ ์ถ๊ฐํด์ค๋ค.
์ธ๊ตฌ๋๋น['์ ์ ์จ'] = ์ธ๊ตฌ๋๋น['์ธ๊ตฌ์'] / ์ธ๊ตฌ๋๋น['ํธ์์ ์']
์ธ๊ตฌ df ์ ํธ์์ df ๋ฅผ merge() ๋ฉ์๋๋ฅผ ํตํด df ๋ฅผ ํ๋๋ก ํตํฉํด์ฃผ๊ณ , ์ธ๊ตฌ๋๋น ํธ์์ ์ ์ ์จ column ์ ์ถ๊ฐํด์ฃผ์๋ค.
์ด์ , ์ธ๊ตฌ๋๋น ์ ์ ์จ์ด ๊ฐ์ฅ ๋์ ์,๋๋ฅผ ์์๋ณด์.
์ธ๊ตฌ๋๋น.sort_values(by=['์ ์ ์จ'], ascending=False)
ํ์ฌ(2023๋ 2์ ๋ง)๊ธฐ์ค์ผ๋ก, ์ธ์ข ํน๋ณ์์น์๊ฐ ์ธ๊ตฌ๋๋น ํธ์์ ์๊ฐ ๋ง์ ๊ฒ์ผ๋ก ๋ํ๋ฌ๋ค.
์์ธ์ ๊ตฌ๋ณ ๊ฐ์ฅ ๋ง์ด ์กด์ฌํ๋ ํธ์์ ๋ธ๋๋ ์ฐพ๊ธฐ
์ด๋ฒ์๋ ์์ธํน๋ณ์์์ ๊ตฌ๋ง๋ค ๊ฐ์ฅ ๋ง์ด ์กด์ฌํ๋ ํธ์์ ๋ธ๋๋๋ฅผ ์ฐพ์๋ณด๋๋ก ํ์.
๋จผ์ , ์์ธํน๋ณ์์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , '๊ตฌ' ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
# ์์ธํน๋ณ์์ ํด๋นํ๋ ํธ์์ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ณ ์ ์ฅํ๋ค. *copy() ํ์ง ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ฐ์
seoul = df.query("์" == "์์ธํน๋ณ์").copy()
# ์์ธ์ '๊ตฌ' ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ
seoul['๊ตฌ'] = seoul['address'].apply(lambda x : x.split()[1])
# ํ์ธ์ฉ
seoul['๊ตฌ'].unique()
๊ตฌ column ๋ ์ถ๊ฐํด์ฃผ์์ผ๋, ์ด์ ๊ตฌ ๋ณ ๊ฐ์ฅ ๋ง์ด ์กด์ฌํ๋ ํธ์์ ๋ธ๋๋๋ฅผ ์ ์ ์๋ค.
# ๊ตฌ, brand ๋ณ ํธ์์ ๊ฐ์ : ๋ฐฉ๋ฒ 1
seoul.gropuby(['๊ตฌ', 'brand'])[['๊ตฌ']].count()
# ๊ตฌ, brand ๋ณ ํธ์์ ๊ฐ์ : ๋ฐฉ๋ฒ 2
seoul_2 = seoul.groupby(['๊ตฌ', 'brand'], as_index=False)[['shopName']].count()
# ๊ฐ์ฅ ๋ง์ ํธ์์ ์๋ก, ๊ตฌ์ brand ๋ช
, ๊ฐ๊ฒ ์
seoul_2.sort_values(by=['shopName'], ascending=False)
# ๊ตฌ๋ณ ๊ฐ์ ๊ฐ์ฅ ๋ง์ ํธ์์ - ์ฒซ๋ฒ์งธ ํ๋ง ๊ฐ์ ธ์ด
seoul_2.sort_values(by=['shopName'], ascending=False).groupby(['๊ตฌ']).first()
# ๊ตฌ์์ ๊ฐ์ฅ ๋ง์ ํธ์์ - ์ฒซ๋ฒ์งธ ํ๋ง ๊ฐ์ ธ์ด
seoul_2.sort_values(by=['shopName'], ascending=False).groupby(['๊ตฌ']).nth(1)
# ๊ตฌ๋ณ ๊ฐ์ฅ ์ ์ ํธ์์ brand ์ ํด๋น brand ๋ช
- ๋ง์ง๋ง ํ๋ง ๊ฐ์ ธ์ด
seoul_2.sort_values(by=['shopName'], ascending=False).groupby(['๊ตฌ']).nth(-1)
์ ๋ ฌ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉํ๋ ๋ฉ์๋์ ๋ฐ๋ผ, ์ฌ๋ฌ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ ์ ์๋ค.
'Python > [๊ธฐ์ด ๊ฐ์ ์ ๋ฆฌ]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
python ๊ธฐ์ด 12 (3) | 2023.03.06 |
---|---|
python ๊ธฐ์ด 11 (0) | 2023.03.03 |
python ๊ธฐ์ด 9 (0) | 2023.03.01 |
python ๊ธฐ์ด 8 (0) | 2023.02.26 |
python ๊ธฐ์ด 7 (0) | 2023.02.26 |