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

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 16주차 월 1204(웹크롤링 > 전처리 및 시각화)
    광주인력개발원 일일포스팅(메모장) 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
    반응형
Designed by Tistory.