Warning) 아래 코드들은 버전이 바뀌어 정상적으로 작동되지 않을 수도 있습니다. 따로 버전을 명시하지 않았기 때문에 에러가 발생되면 조금씩 수정해 나가면서 사용하시길 바랍니다. 또한, 형편없는 저의 실력으로 코드들이 다소 비효율적일 수 있음을 미리 말씀드립니다. 우연히 이 글을 보게 되신 분들은 참고해주시기 바랍니다. 

file-merge.ipynb
0.07MB


STEP 3. 데이터 수집하기

STEP3에서는 이전 단계에서 만든 스크래핑 함수를 사용해 데이터를 수집하도록 하겠습니다. 그리고 파일 형태로 출력한 데이터들을 일부 수정하고 파일들을 합쳐 하나의 데이터 파일로 만들어 보겠습니다. 이번 스텝에서는 인내를 가지고 오랜 시간을 기다리는 것이 관건입니다. 잘 기억은 나지 않지만 저의 경우 한 개 제품에 대해 스크래핑을 진행할 때 8분 정도 소요되었던 것으로 기억합니다. 그래서 8개 제품을 진행했을 때 대략 50분 정도 걸렸다고 할 수 있습니다. 수집하게 되는 샘플 데이터 수가 적은 편이라 일반적인 텍스트 분석 프로젝트에서 데이터를 수집하는 과정에서 소요되는 시간에 비해서는 세발이 피이지만 저한테는 쉽지 않았던 과정이었습니다. 런타임이 갱신되어 도중에 중단된 적도 몇번 있었습니다. 그래서 이후에도 다시 말씀드리겠지만 중간에 발생하는 오류로 데이터를 날리는 일이 없도록 하기 위해 제품별 url을 하나의 리스트로 묶어 반복 실행하지 않고 일부러 따로 따로 독립적으로 수집하였습니다.

(1) 제품별 리뷰 데이터 수집

8개 제품에 대한 네이버 쇼핑 url을 가져와 평점 리스트와 함께 shopping_review_scraping() 함수에 넣었습니다. 그리고 함수의 결과로 반환되는 데이터프레임을 csv 파일로 변환하여 저장하였습니다. 아래는 제품별로 스크래핑을 진행한 코드들입니다. url과 평점 리스트를 제외한 나머지 부분은 같기 때문에 2개의 코드만 가져왔고 이와 같은 방식을 8번 진행했다고 보시면 됩니다. 수집 결과 아래 사진과 같이 총 8개의 csv 파일이 만들어지게 됩니다.  

#풀무원 얇은피 꽉찬속 땡초만두
pulmuone_ddaengcho_url = 'https://search.shopping.naver.com/catalog/21554501906?NaPm=ct%3Dl77a62js%7Cci%3D5a5bdf33fddab8a692dc7dc7ad7b111851a8415a%7Ctr%3Dslsl%7Csn%3D95694%7Chk%3D3b59e90756e0c9de00247557f9d560f3908617a1'
pulmuone_ddaengcho_df = shopping_review_scraping(pulmuone_ddaengcho_url, [1,2,3,4,5])
pulmuone_ddaengcho_df.to_csv('pulmuone_ddaengcho_review.csv', index=False, encoding = 'utf-8-sig')​
#CJ제일제당 비비고 수제김치만두 400g×2
bibigo_url = 'https://search.shopping.naver.com/catalog/24088993894?query=%EB%B9%84%EB%B9%84%EA%B3%A0%20%EA%B9%80%EC%B9%98%EB%A7%8C%EB%91%90&NaPm=ct%3Dl75tunb4%7Cci%3D81e459f36f72ca8812ff811e28306c972e961483%7Ctr%3Dslsl%7Csn%3D95694%7Chk%3D923a154dbf1e412d62c5544e1e9435573a05215a'
bibigo_review_df = shopping_review_scraping(bibigo_url,[3,4,5])
bibigo_review_df.to_csv('bibigo_review.csv', index=False, encoding = 'utf-8-sig')


(2) 중복된 데이터 제거 후 파일 병합

지금까지 수집한 파일들은 output_file 폴더에 저장하였고 총 8개 파일이 있습니다. 파일들이 다 파편적으로 분리가 되어 있으면 텍스트 분석을 진행하는데 있어 번거로움이 발생합니다. 따라서, 파일들을 하나로 병합하도록 하겠습니다. 그리고 파일 병합을 진행하기 전에는 중복된 파일들이 있는지 확인하고 중복된 경우에는 제거하도록 하겠습니다.

사실 정확하게 스크래핑을 진행했다면 중복된 데이터가 없어야 하긴 합니다. 그러나 제가 만든 스크래핑 함수 중간에 페이지 이동이 원할하지 않은 부분이 있어서인지 csv 파일을 확인해본 결과 중복 데이터들이 존재하였습니다. 깔끔하게 수집이 되었으면 하는 아쉬움이 있었지만 여튼 중복을 제거하는 것은 간단한 일이니 함께 진행해보도록 하겠습니다. 

#output_file 폴더에 있는 리뷰 데이터 파일 리스트를 가져오기
path = './output_file'
file_list = os.listdir(path)
print ("file_list: {}".format(file_list))

#새로운 데이터 프레임 생성
df_all_review = pd.DataFrame()

#각 파일을 불러와 읽어낸 후 df_all_review에 결합
for file_name in file_list:
    df_new = pd.read_csv(path + '/' + file_name)
    df_all_review = pd.concat([df_all_review, df_new], ignore_index= True)

8개 파일에 있는 내용들을 새로운 데이터프레임 한 곳에 모은 후에는 중복된 리뷰 데이터들을 제거하겠습니다. 중복이 제거된 데이터프레임은 다시 새로운 파일로 저장하겠습니다. 

#중복된 리뷰 제거
df_all_review.drop_duplicates(subset=None, keep='first', inplace=True, ignore_index=True)
df_all_review = df_all_review.reset_index(drop=True)
df_all_review = df_all_review.rename(columns={'Reveiw':'Review'})

#병합한 데이터프레임을 새로운 파일로 저장
df_all_review.to_csv('./output_file/all_review.csv', index=False)

중복 제거까지 진행한 결과 최종 수집된 데이터는 19445개로 당초 예상했던 2만개에는 조금 못 미치는 정도입니다. 중복된 내용 때문에 계획한 샘플 수를 충족시키지는 못했지만 결과에는 큰 영향을 주지 않을 것 같아 그냥 진행하도록 하겠습니다. 


(3) 쇼핑몰별 리뷰 데이터 수 확인

조금은 쓸데없는 과정이기는 하지만 쇼핑몰별로 수집된 리뷰 데이터의 수를 확인해보도록 하겠습니다. 앞서 프로젝트 계획 단계에서 편향되지 않은 분석 결과를 도출하기 위해 가능한 다양한 쇼핑몰에서의 리뷰를 가져오겠다고 말씀드린 적이 있습니다. 사실 리뷰의 출처가 되는 쇼핑몰이 다양할수록 리뷰 또한 다양하고 편향되지 않는다고 말할 수는 없습니다. 쇼핑몰과 리뷰 내용의 편향성은 상관관계가 높지 않을 것입니다. 하지만 한쪽 쇼핑몰의 리뷰만 가져올 경우에는 분명 해당 쇼핑몰만의 문제들이 분석 결과에 다소간 영향을 끼칠 수도 있는 있을 것입니다. 때문에 제 생각에는 쇼핑몰의 다양성을 유지하는 것이 그리 나쁜 선택은 아닌 것 같습니다. 

#all_review 파일을 불러와 'Mall'에 대해 value_counts()를 적용
df_all_review.to_csv('./output_file/all_review.csv', index=False)
df_mall = pd.DataFrame(df_all_review['Mall'].value_counts())
print(df_mall)

#쇼핑몰별 리뷰 수에 대해 수평 막대 그래프 그리기
df = df_mall.sort_values(by=['Mall'], ascending=True)
df.plot.barh(y = 'Mall',
             figsize=(8, 8),
             xlabel="Mall Name",
             title="Reveiw Counts from Each Mall",
             width=0.8, 
             color=['#2a9d8f', '#e9c46a', '#f4a261', '#e76f51'], 
             legend=False)
plt.tight_layout()
plt.show()

아래 결과를 보면 이건 쫌... 이라는 생각이 드실 것 같습니다. 생각보다 쇼핑몰간 편차가 커 보입니다. SSG닷컴이 거의 전체 샘플 데이터의 절반 이상을 차지하고 있고 11번가까지 정도만 천단위 샘플이 수집되었고 나머지는 거의 미미한 수준입니다. 한편, 쿠팡이나 마켓컬리와 같이 최근 많은 매출을 기록하고 있는 쇼핑 플랫폼의 데이터가 없는 것이 아쉬움이 남습니다. 쿠팡 같은 경우는 네이버 쇼핑과 연동이 되지 않아 따로 수집해야 되는 것으로 보입니다. 여튼 분포 결과가 샘플의 균형을 맞추기에는 다소 부족한 부분이 있지만 실제로 결과물을 가져와 보아야 정확히 알 수 있을 듯 싶습니다. 

다음 단계에서는 이번 프로젝트의 첫번째 핵심이라고 할 수 있는 텍스트 전처리를 진행하도록 하겠습니다. 전처리 수준에 따라 결과물의 내용이 달라질 수 있기 때문에 많은 심혈을 기울여야 될 것 입니다. 다음 스텝에서 뵙도록 하겠습니다. 

+ Recent posts