배고픈 개발자 이야기

[2021/07/19] 정형/비정형 데이터 처리 본문

인포섹 아카데미

[2021/07/19] 정형/비정형 데이터 처리

이융희 2021. 7. 19. 16:14
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")

 

 

Comments