광주인력개발원 일일포스팅(메모장)

16주차 월 1204(웹크롤링 > 전처리 및 시각화)

Jumbo96 2023. 12. 4. 16:53
728x90
반응형
file_path = "./data/movie_reviews.txt"
df_org = pd.read_csv(file_path, 
                     ### 구분자 알려주기
                    delimiter="\t",
                    names=["title", "score", "comment", "label"])
df_org

### 제목 : "title", 평점 : "score", 리뷰 : "comment",  "label"

	title	score	comment	label
0	서울의 봄	10	꼭 봐야 할 영화!!무능이 얼마나 무서운 일인지보여주는 영화!!영화 속 일은 현재도...	1

 

### 평점(score) 현황 데이터 확인
df_org["score"].value_counts()

score
10    2911
1      394
9      209
8      144
2       93
6       87
7       85
5       69
4       47
3       34


### 긍정/부정 현황 데이터 확인
df_org["label"].value_counts()

label
1    3264
0     568
2     241

### 중복데이터 확인하기
# - keep=False : 중복된 모든행 체크(중복이 있으면 True, 없으면 False)
df_org[df_org.duplicated(keep=False) == True]

	title	score	comment	label
59	서울의 봄	10	최고	1
125	서울의 봄	10	최고입니다	1

 

### 중복 데이터 추출하기
# - 중복 중에 하나는 제외하고 나머지 중복만 추출
df_del = df_org[df_org.duplicated() == True]
len(df_org[df_org.duplicated() == True])

40

### 중복제거하기
df_new = df_org.drop_duplicates()
len(df_new)
df_new.info()

 

데이터 탐색하기

### 영화 제목만 추출하기
df_new["title"].unique()
len(df_new["title"].unique())

10

### 영화 제목별 리뷰갯수 현황 확인하기
df_new["title"].value_counts()

title
서울의 봄                   2317
뉴 노멀                     510
더 마블스                    290
그대들은 어떻게 살 것인가           287
30일                      220
소년들                      179
싱글 인 서울                   84
프레디의 피자가게                 63
톡 투 미                     46
헝거게임: 노래하는 새와 뱀의 발라드      37

 

데이터 시각화

 

### 영화제목을 리스트 타입으로 받아오기
"""
 - array() : 넘파이(numpy)에서 사용하는 배열(파이썬의 리스트와 동일)
           : 단, 하나의 타입만 저장 가능합니다.
                 이외 사용법은 파이썬의 리스트와 동일
"""
# - unique() : numpy의 배열 타입으로 반환함
# - tolist() : 파이썬의 리스트 타입으로 변환하는 함수
movie_title = df_new["title"].unique().tolist()
# movie_title

### 영화별 평점 평균 추출하기
# - 평점평균값을 저장할 딕셔너리 변수 선언
avg_score = {}

for m_title in movie_title :
    ### 평점 평균 계산하여 딕셔너리에 넣기
    avg = df_new[df_new["title"] == m_title]["score"].mean()
    # print(f"평점평균 : {avg}")    
    
    ### 딕셔너리에 담기
    # key는 제목, value는 평점평균 값
    avg_score[m_title] = avg
    
print(f"딕셔너리 최종값 : {avg_score}")

딕셔너리 최종값 : {'서울의 봄': 9.464393612429866, '그대들은 어떻게 살 것인가': 5.397212543554007, '더 마블스': 3.7724137931034485, '프레디의 피자가게': 7.015873015873016, '소년들': 8.134078212290502, '30일': 6.786363636363636, '톡 투 미': 7.217391304347826, '헝거게임: 노래하는 새와 뱀의 발라드': 6.72972972972973, '뉴 노멀': 9.48235294117647, '싱글 인 서울': 8.273809523809524}

 

### 영화별 평점평균 시각화
# - 그래프 너비와 높이 지정
plt.figure(figsize=(20, 15))

# - 그래프 제목
plt.title("영화별 평점 평균 막대그래프", fontsize=17, fontweight="bold")

### 각 영화별 평점 평균 막대그래프 그리기
for k, v in avg_score.items() :
    ### 컬러값 지정하기
    # - array_str() : 문자열로 변환하는 함수
    # - where() : 파이썬에서 if문과 동일한 조건문
    # - where(조건, 참, 거짓) : 조건이 참이면 첫번째 값, 거짓이면 두번째 값 처리
    color = np.array_str(np.where(v==max(avg_score.values()), "orange", "lightgray"))
    # print(color)

    ### 막대 그래프 그리기
    plt.bar(k, v, color=color)

    ### 막대 그래프 상단에 평점평균 텍스트 표시하기
    # - "%.2f"%v : 표시할 값 (소숫점 2자리까지 표현)
    plt.text(k, v, "%.2f"%v, horizontalalignment="center",
                            verticalalignment="bottom")

    
###  x축과 y축 제목 넣기
plt.xlabel("영화제목", fontweight="bold")
plt.ylabel("평점평균", fontweight="bold")

plt.xticks(rotation=300)

### 그래프를 이미지로 저장시키기
# - savefig() 함수는 plt.show() 이전에 있어야함
plt.savefig("./img/영화별 평점 평균 막대그래프.png")

plt.show()

 

 

점(분포) 그래프 그리기

 

### 각 영화별 평점 분포도 그리기
# - 하나의 큰 그래프 안에 10개의 그래프를 넣어서 표현
#  --> 이를 subplot 이라고 칭합니다.
# - 5행 2열의 subplot 생성하여 구현하기
# - subplots(행갯수, 열갯수, 전체 그래프 크기)
# - fig : 클 그래프 정보
# - axs : 5행 2열의 내부 그래프 공간 정보
fig, axs = plt.subplots(5, 2, figsize=(15, 25))

### 여러개의 그래프를 for문을 이용해서 표현하고자 할 때 아래먼저 수해
# - flatten() : 틀 정렬하기 -> 5행 2열의 틀을 정렬해 놓기..
# - for문 돌리기 전에 정렬해서 넣어야 하는 문법적 순서...
# - 리스트 화 되어있음
axs = axs.flatten()

### 각 그래프를 행렬 공간의 subplot에 넣기
# - 셋다 리스트라 집으로 묶고 언팩하여 사용 (셋다 갯수가 같아야 함)
for title,avg, ax in zip(avg_score.keys(), avg_score.values(), axs) :
    # print(f"{title}/ {score} / {ax}")
    ### x축에는 영화 리뷰 갯수, y축에는 평점평균
    ### 리뷰 갯수 추출하기
    # - x축은 데이터가 없기에 갯수를 뽑고 arange를 이용해서 쭉 뽑아내고 범주형으로 만든다, x축 1번그래프를 보면 500개씩 범주를 만듬
    num_reviews = len(df_new[df_new["title"] == title])
    # - arange(num) : 0부터 num까지의 값을 순차적으로 만들기
    x = np.arange(num_reviews)
    # print(f"x--------> {x}")

    ### y축에는 평점 추가
    y = df_new[df_new["title"] == title]["score"]
    # print(f"y------------> {y}")

    ### 각 그래프에 제목 넣기
    # - 이름을 만들고 set_title로 넣음
    subtitle= f"{title}({num_reviews}명)"
    ax.set_title(subtitle, fontsize=15, fontweight="bold")
    ### 점 그래프 그리기
    # - "o" : 점으로 표현하는 마커 기호
    ax.plot(x, y, "o" )

    ### 각 영화별 평점평균을 빨강색 점선으로 표시하기
    # - axhline() : 각 subplot 공간에 수평선 그리기
    ax.axhline(avg, color="red", linestyle="--")

plt.savefig("./img/각 영화별 평점 분포도.png")

plt.show

728x90
반응형