배고픈 개발자 이야기
[2021/07/19] 정형/비정형 데이터 처리 본문
728x90
- 아파트 연도별 평당분양가격의 이상치 검출 및 그래프 분석
# 제 1사분위수
Q1 = df_last[df_last["연도"] == 2019]["평당분양가격"].quantile(0.25)
# 제 3사분위수
Q3 = df_last[df_last["연도"] == 2019]["평당분양가격"].quantile(0.75)
IQR = Q3 - Q1
# 이상치 최소 한계점
outlier_min_limit = Q1 - (IQR*1.5)
# 이상치 최대 한계점
outlier_max_limit = Q3 + (IQR*1.5)
# 최소 한계점을 넘어간 이상치 data
df_last[ (df_last["연도"]==2019) & (df_last["평당분양가격"]<outlier_min_limit) ]
# 최대 한계점을 넘어간 이상치 data
df_last[ (df_last["연도"]==2019) & (df_last["평당분양가격"]>outlier_max_limit) ]
# (60, 8)
df_last[ (df_last["연도"]==2019) & (df_last["평당분양가격"]>outlier_max_limit) ].shape
plt.figure(figsize=(12,3))
sns.boxplot(data=df_last, x="연도", y="평당분양가격", hue="전용면적")
plt.legend(bbox_to_anchor=(1.05, 0.5), borderaxespad=-3)
sns.violinplot(data=df_last, x="연도", y="평당분양가격")
pd.pivot_table(
df_last,
index=["연도"],
values=["평당분양가격"],
aggfunc="mean"
)
sns.barplot(data=df_last, x="연도", y="평당분양가격")
- 비정형 데이터 ( NAVER 블로그 게시물) 긁어오기
import requests
#API 인증 정보
client_id = "udzt3jcCA8xTKi3UjGH_"
client_secret = "HAk0g9n8cs"
url1 = "https://openapi.naver.com/v1/search/blog?query=강남역"
url2 = "https://openapi.naver.com/v1/search/blog?query=강남역$&display=20&start=50&sort=sim"
url3 = "https://openapi.naver.com/v1/search/blog?query=강남역$&display=20&start=50&sort=date"
#header에 추가될 내용
key = {'X-Naver-Client-Id':client_id, 'X-Naver-Client-Secret':client_secret}
result = requests.get(url1, headers=key)
# response json 속성값
information = result.json()
information["lastBuildDate"]
information["total"]
information["start"]
information["display"]
information["items"]
information["items"][0]
# naver openapi를 요청하여 response json으로 받아옴
def get_api_result(keyword, display, start):
url="https://openapi.naver.com/v1/search/blog?query=" + keyword \
+"&display="+str(display)\
+"&start="+str(start)
result = requests.get(url, headers=key)
return result.json()
get_api_result("동국대", 10, 1)
get_api_result("동국대", 10, 11)
# blog 게시물을 20개씩 openapi를 통해 받아와 title을 저장
blog_title_list = []
def call_end_print(keyword, page):
json_obj = get_api_result(keyword, 20, (page-1)*20+1)
if "items" in json_obj:
for item in json_obj["items"]:
title = item["title"].replace("<b>","").replace("</b>","")
global blog_title_list
blog_title_list.append(title)
# page당 20개씩 100페이지 총 2000개의 게시물 title을 호출하는 for문
for page in range(1, 100):
call_end_print("SK 인포섹", page)
import nltk
! pip install konlpy
from konlpy.tag import Twitter
twitter = Twitter()
# Twitter()객체의 pos 함수는 word와 품사로 나누어 알려주는 함수
for word, part in twitter.pos("아버지가 방에 들어가신다 그래서 슬플것이다 ! @ 1234 SK"):
print("word = ", word)
print("part = ", part)
print("*"* 100)
# 특정 조건의 word를 제외한 word를 리스트에 저장
word_list = []
for blog_title in blog_title_list:
#print("blog_title = ", blog_title)
for word, part in twitter.pos(blog_title):
#print("word = ", word, "@part = ", part)
if part in ["Punctuation", "Number", "Josa"]:
continue
if len(word) < 2:
continue
word_list.append(word)
from wordcloud import WordCloud
import matplotlib.pyplot as plt
!apt -qq -y install fonts-nanum
# word list의 빈도를 검사해주는 함수
ko = nltk.Text(word_list)
# 100위 이내의 빈도수 list 출력
ko.vocab().most_common(100)
dict(ko.vocab().most_common(100))
# word_cloud 객체 생성, input은 dict 자료형
word_cloud = WordCloud(
font_path = "/usr/share/fonts/truetype/nanum/NanumGothic.ttf"
,background_color="white"
).generate_from_frequencies(dict(ko.vocab().most_common(100)))
# 이미지 크기 조정(inch)
plt.figure(figsize=(10, 5))
plt.imshow(word_cloud)
# grid 제거
plt.axis("off")
'인포섹 아카데미' 카테고리의 다른 글
[2021/07/21] 클라우드 컴퓨팅 환경과 서비스 (0) | 2021.07.21 |
---|---|
[2021/07/20] 클라우드 컴퓨팅 환경과 서비스 (0) | 2021.07.20 |
[2021/07/16] 정형/비정형 데이터 처리 (0) | 2021.07.16 |
[2021/07/15] 정형/비정형 데이터 처리 (0) | 2021.07.15 |
[2021/07/14] 정형/비정형 데이터 처리 (0) | 2021.07.14 |
Comments