SW과정 머신러닝 1018(9)

JongseokLee·2021년 10월 18일
0
post-thumbnail

SW과정 머신러닝 1018(9)

1. Pandas 문제 해설

  1. 202012202012주민등록인구및세대현황_연간.csv를 가지고 와서 데이터 프레임으로 작성합니다.
import pandas as pd
data = pd.read_csv('202012_202012_주민등록인구및세대현황_연간.csv',encoding='cp949')
data
  1. 인구정보 데이터 프레임의 컬럼명을 행정구역, 총인구수, 세대수, 세대당인구, 남자, 여자, 남녀비율 로 변경하세요
data.info()
data.columns
data.columns=['행정구역', '총인구수', '세대수', '세대당인구', '남자','여자', '남여비율']
data.info()
data = data.rename(columns={'2020년_거주자 인구수':'총인구수', 
                     '2020년_세대수':'세대수',
                     '2020년_세대당 인구':'세대당인구수', 
                     '2020년_남자 인구수':'남자',
                     '2020년_여자 인구수':'여자', 
                     '2020년_남여 비율':'남여비율'})
data.info()
  1. 남녀비율 컬럼을 제거합니다.
data.drop('남여비율',axis=1,inplace=True)
data.info()
  1. 행정구역 컬럼의 ‘(’ ‘)’를 제거하고 시,구,동 컬럼을 만들어 분리해 넣고 부산지역의 값만 가지고 와서 인덱스를 새로 부여합니다.
data.행정구역
data.행정구역 = data.행정구역.str.split('(').str.get(0)
data.행정구역
data['시'] = data.행정구역.str.split().str.get(0)
data.시
data['구'] = data.행정구역.str.split().str.get(1)
data['동'] = data.행정구역.str.split().str.get(2)
data.sample(3)
data.head(3)
busan = data[data['시']=='부산광역시']
busan.reset_index(drop=True,inplace=True)
busan.head(2)
  1. 총인구수, 남자, 여자 컬럼의 데이타 타입을 정수형으로 변경합니다.
busan.info()
busan.sample()
busan.총인구수 = busan.총인구수.str.replace(',','').astype('int')
busan.남자 = busan.남자.str.replace(',','').astype('int')
busan.여자 = busan.여자.str.replace(',','').astype('int')
busan.info()
  1. 동별로 부산 인구를 차트로 표시합니다.
import matplotlib.pyplot as plt
import seaborn as sns
busan.head(2)
busan.dropna(inplace=True)
busan.head(2)
data_c = busan.groupby('구')['총인구수'].sum().sort_values(ascending=False)
data_c = data_c.reset_index()
data_c
plt.figure(figsize=(10,5))
sns.barplot(data=data_c,x='구',y='총인구수')
data_c = busan.groupby('동')['총인구수'].sum().sort_values(ascending=False)
data_c = data_c.reset_index()
data_c = data_c.head(20)
plt.figure(figsize=(10,8))
sns.barplot(data=data_c,y='동',x='총인구수')
  1. 동별 남,여 인구를 차트로 표시합니다.
data_c = busan.groupby('동')['남자'].sum().sort_values(ascending=False)
data_c = data_c.reset_index()
data_c = data_c.head(10)
plt.figure(figsize=(10,5))
sns.barplot(data=data_c,y='동',x='남자')
  1. Choropleth, geojson 등을 이용하여 동별 인구수를 색상별로 지도에 나타내시오
import json
jsonfile = open('HangJeongDong_ver20210701.geojson','r',encoding='utf8').read()
jsonfile
jsondata = json.loads(jsonfile)
jsondata
json_busan = {'type': 'FeatureCollection'}
json_pick_list=[]
json_dong=[]
for idx in jsondata['features']:
    if idx['properties']['sidonm']=='부산광역시':
        dong = idx['properties']['adm_nm'].split()[-1].strip()
#         print(idx['properties']['sidonm'])
#         print(dong)
        idx['id']=dong
        json_dong.append(dong)
        json_pick_list.append(idx)
json_busan['features'] = json_pick_list
f = open('busan.json','w',encoding='utf8')
json.dump(json_busan,f)
import folium
map = folium.Map([35.2105115,129.128414])
jsonfile = open('busan.json','r',encoding='utf8').read()
jsondata = json.loads(jsonfile)
folium.Choropleth(geo_data=jsondata,data=busan,columns=['동','총인구수'],key_on='feature.id').add_to(map)
map
df_dong = sorted(busan['동'])
len(df_dong)
j_dong = sorted(json_dong)
len(j_dong)
for i, item in enumerate(zip(df_dong,j_dong)):
    print(i,' : ',item)
json_busan = {'type': 'FeatureCollection'}
json_pick_list=[]
json_dong=[]
for idx in jsondata['features']:
    if idx['properties']['sidonm']=='부산광역시':
        dong = idx['properties']['adm_nm'].split()[-1].strip()
        if dong == '가야제1동':
            dong = '가야1동'
#         print(idx['properties']['sidonm'])
#         print(dong)
        idx['id']=dong
        json_dong.append(dong)
        json_pick_list.append(idx)
json_busan['features'] = json_pick_list
f = open('busan.json','w',encoding='utf8')
json.dump(json_busan,f)
df_dong = sorted(busan['동'])
j_dong = sorted(json_dong)
for i, item in enumerate(zip(df_dong,j_dong)):
    print(i,' : ',item)
busan['동'] = busan['동'].str.replace('제','')
busan['동'] = busan['동'].str.replace('거1동','거제1동')
busan['동'] = busan['동'].str.replace('거2동','거제2동')
busan['동'] = busan['동'].str.replace('거3동','거제3동')
busan['동'] = busan['동'].str.replace('거4동','거제4동')
map = folium.Map([35.2105115,129.128414])
jsonfile = open('busan.json','r',encoding='utf8').read()
jsondata = json.loads(jsonfile)
folium.Choropleth(geo_data=jsondata,data=busan,columns=['동','총인구수'],key_on='feature.id',fill_color='YlOrRd').add_to(map)
map

2. 워드 클라우드

아나콘다 프롬프트 설치

pip install wordcloud
pip install soynlp

자바, 파이썬 연결 프로그램

conda install -c conda-forge jpype1
pip install konlpy

버전 다운 설치(tweepy), 주피터에서 직접 입력

!pip install tweepy==3.10.0
!pip uninstall tweepy #삭제 코드

f = open('[박경리]_토지1.txt')
story = f.read()
f.close()

print(type(story))
print(story)

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import seaborn as sns

stopwords_kr = ['그','안','있었다','다','이']

wc = WordCloud(width=400, height=200, font_path='NanumGothic.ttf', background_color='white', stopwords='stopwords_kr').generate(story)
print(wc.words_)

plt.figure(figsize=(15,10))
plt.imshow(wc) #찍히는 것
plt.axis('off')
plt.show()

displayWC(story)

from soynlp.noun import LRNounExtractor
noun_extractor = LRNounExtractor()
nouns = noun_extractor.train_extract([story])

print(type(nouns))

print(nouns)

displayWC(' '.join(nouns)) #문자를 받아서 하나로 합쳐주는 역할, 앞에 ' '를 구분자로해서 합쳐줌(띄어쓰기로 구분)

from soynlp.noun import NewsNounExtractor
noun_extractor = NewsNounExtractor()
nouns = noun_extractor.train_extract([story])
displayWC(' '.join(nouns))

from soynlp.noun import LRNounExtractor_v2
noun_extractor = LRNounExtractor_v2(verbose=True)
nouns = noun_extractor.train_extract([story])
displayWC(' '.join(nouns))

from konlpy.tag import Kkma #보통 꼬꼬마라고 얘기함, 코엔엘파이

import tweepy

tweepy.__version__

!pip install tweepy==3.7.0

from PIL import Image

import numpy as np

img = Image.open('cloud.png')
img_array = np.array(img)
img_array

def displayWC(data,img, width=600,height=300):
    stopwords_kr = ['그','안','있었다','다','이']
    wc = WordCloud(width=width,
                    height=height,
                    font_path='NanumBarunpenB.ttf',
                    mask=img,
                    stopwords=stopwords_kr).generate(data)
    plt.imshow(wc)
    plt.axis('off')
    plt.show()
    
from soynlp.noun import LRNounExtractor
noun_extractor = LRNounExtractor()
nouns = noun_extractor.train_extract([story])

displayWC(' '.join(nouns),img_array)

#Q) 텍스트를 스크래핑해서 워드 크라우드 그리기
(네이버 뉴스, 네이버 영화평, 그외 스크래핑 가능한 텍스트)

Q)텍스트를 스크래핑해서 워드 크라우드 그리기
(네이버 뉴스, 네이버 영화평, 그외 스크래핑 가능한 텍스트)

import requests
import urllib.request
from bs4 import BeautifulSoup
import re
from wordcloud import WordCloud
import matplotlib.pyplot as plt

list_records = []
for index in range(1,101):
    params = urllib.parse.urlencode({'page':index})
    url = f'https://movie.naver.com/movie/point/af/list.naver?{params}'
    res = urllib.request.urlopen(url)
    soup = BeautifulSoup(res, 'html.parser')
    table = soup.find('table',class_='list_netizen')
    #print(table)
    for i,tr in enumerate(table.select('tbody tr')): #enumaerate 함수 데이터만 뽑아 오는게 아니라 인덱스값도 같이 가져옴
        for j,td in enumerate(tr.find_all('td')):
            if j == 0:
                recode = int(td.text.strip())
                #print('글번호:',recode)
            elif j == 1:
                recode1 = td.select_one('a.movie').text.strip()
                #print('제목:',recode1)
                recode2 = int(td.select_one('em').text.strip())
                #print('점수:',recode2)
                recode3 = td.text.strip()
                recode3 = recode3.replace(recode1,'')
                recode3 = recode3.replace('신고','')
                recode3 = re.sub('별점 - 총 10점 중[0-9]{1,2}',' ',recode3).strip()
                #print('감상평:',recode3)
        movid_dic = {'제목':recode1,'점수':recode2,'감상평':recode3}
        list_records.append(movid_dic)

import pandas as pd
df = pd.DataFrame(list_records) #키값은 알아서 컬럼으로 들어감, 벨류값은 값으로 들어감
#df
review = ' '.join(df['감상평'].to_list())

def displayWC(data,width=400,height=200):
    wc = WordCloud(width=width,
                   height=height,
                   font_path='NanumGothic.ttf').generate(review)
    plt.imshow(wc)
    plt.axis('off')
    plt.show()

#displayWC([review])
    
from soynlp.noun import LRNounExtractor
noun_extractor = LRNounExtractor()
nouns = noun_extractor.train_extract([review]) #의미없는 말들은 제외하고, 명사만 추출하고 싶다.

displayWC(' '.join(nouns))
profile
DataEngineer Lee.

0개의 댓글