본문 바로가기

    운영진 평가를 반영한 최종 결과는, 차주 (화)요일 공표예정입니다! 😊

      진행 중인 투표

      종료된 투표

      진행 중인 투표

      종료된 투표

      빈 제목

        팀블로그 멤버

        비멤버

        🔥앗뜨거 실시간🔥

        💬재잘재잘💬

        리스틀리로 앱 사용자 리뷰 분석하기!

        by 박소정 | 충북대 | 사회학과 | UX 2024. 7. 13.
        본 커리큘럼은, 팔랑크스 클럽을 후원하는 실무자 후원회에서 작성/소유하고 있는 사유물로서,
        정식으로 팔랑크스 클럽(동아리)의 절차에 따라, 시즌을 등록한 크루 외에는 제공, 안내되지 않습니다.

        허가되지 않는 배포/재가공/캡처 등이 이루어질 시 관련 법령에 따라
        손해배상 및 저작권 침해 소송을 제기할 수 있으니, 각별히 유의 바랍니다.
        (본 사항은 법령 자문에 따라 '모두' 가 볼 수 있는 명시적 근거를 설립하는 과정임을 재명기합니다.)

        본문을 시작하기 전, 이번 유닛을 진행하는 데에 도움을 받았던 글을 소개하고자 합니다. 저는 해당 유닛을 진행하면서 IT팀 배정윤 크루님의 리스틀리 유닛으로부터 많은 도움을 받았습니다. 이 글을 읽기 전 저는 리스틀리를 사용할 줄 몰랐는데, 해당 글에 리스틀리 사용 법이 상세히 나와있어 리스틀리 사용법을 익힐 수 있었습니다. 좋은 글 작성해주신 배정윤 크루님께 감사드리며, 리스틀리 유닛을 진행하길 원하시는 분들께는 아래 게시글을 추천드립니다.

         

        [기획 Tool] 파이썬 D+ 도 할 수 있는 데이터 분석! 기획의 강력한 도구, 웹 스크리핑

        가장 간편하지만 가장 강력한 도구, 웹 스크리핑 "리스틀리"STEP 01 .   리스틀리는 어떻게 활용하는  tool인가요?리스틀리(Listly)는 무료 웹 데이터 추출, 스크래핑, 그리고 크롤링을 위한 도구입

        phalanx-club.tistory.com

         


        STEP 01 .  리스틀리는 어떻게 활용하는  tool인가요?

        1. 리스틀리 설치 과정

        (1) 구글 크롬(Chrome)으로 리스틀리 공식 사이트(https://www.listly.io/)에 접속합니다.

         

        (2) 중앙에 있는 "크롬확장프로그램 추가"라고 적힌 초록색 버튼을 클릭합니다.

         

        (3) 우측에 있는 파란색으로 된 "Chrome에 추가" 버튼을 클릭합니다.

         

        (4) 다음과 같은 팝업이 뜨면 "확장 프로그램 추가"라는 하얀색 버튼을 클릭합니다.

         

        (5) 크롬 우측 상단에 있는 퍼즐 아이콘을 클릭합니다.

         

        (6) 우측에 다음과 같은 창이 뜨면 "Listly (리스틀리) - 웹 스크..."라고 적힌 부분을 클릭합니다.

         

        (7) 이러한 창이 뜨면 실행에 성공한 것 입니다.

         

        2. 관심있는 키워드 검색 후 리스틀리 실행해보기

        저는 팔랑크스에서 제타와 관련된 기획을 진행하기 때문에 제타 사용자 리뷰에 관심이 많았습니다. 그래서 제타의 플레이스토어 리뷰를 검색해보았습니다.

        제타(zeta) 플레이스토어 리뷰 (https://play.google.com/store/apps/details?id=com.scatterlab.messenger&hl=ko)

         

        그리고 스크롤을 내린 다음 리스틀리를 시킨 후 "전체" 버튼을 누르니 아래와 같은 화면이 나왔습니다.

        아래에 있는 카드들은 스크래핑 된 리뷰들로 보이며, 초록색 "엑셀" 버튼을 누르니 아래 데이터들을 엑셀 파일로 다운 받을 수 있었습니다.

         

        3. 리스틀리로 스크래핑한 데이터 확인해보기

        다운받은 데이터를 열어보니 아래와 같은 화면이 떴습니다.

        각 라벨의 의미는 아래와 같다고 생각합니다.

        LABEL - 1: 리뷰 링크
        LABEL - 2: 리뷰 작성자 닉네임
        LABEL - 3: "more_vert"라는 글씨가 연이어 적혀있음 (내용 파악 불가능)
        LABEL - 4: "부적절한 리뷰로 신고"라는 UI의 기본 텍스트
        LABEL - 5: 리뷰 작성 날짜
        LABEL - 6: 리뷰 내용
        LABEL - 7: 리뷰 추천 수
        LABEL - 8: "이 리뷰가 유용했나요?"라는 UI의 기본 텍스트
        LABEL - 9: "예"라는 UI의 기본 텍스트
        LABEL - 10: "아니요"라는 UI의 기본 텍스트

        LABEL - 11: "리뷰 기록 표시"라는 텍스트가 있는 행도 있고, 없는 행도 있음  (내용 파악 불가능)
        LABEL - 12: (내용없음)
        LABEL - 13: (내용없음)
        LABEL - 14: (내용없음)

         

        4. 인사이트

        위와 같이 수집된 리스틀리의 데이터를 보았을 때 리뷰 작성 날짜(LABEL - 5), 리뷰 내용(LABEL - 6) , 리뷰 추천 수(LABEL - 7)를 활용한다면 유의미한 기획 인사이트를 얻을 수 있을 것이라 생각합니다.

         

        STEP 02 .   나는 어떤 데이터를 수집하는 기획자인가요?

        1. 나는 어떤 기획자인가?

        저는 대화 AI 서비스 제타의 사용자 의견을 듣고, 더 나은 방향으로 제타를 개선하려는 기획자입니다.

         

        2. 데이터 수집 목적은 무엇인가?

        제타의 사용자 리뷰를 분석하여 제타의 개선점과 해결 방안을 찾아내는 것을 목표로합니다.

         

        3. 리스틀리를 통해서 어떤 데이터를 수집하고자 하는가?

        2024년 4월 1일(제타 출시 날짜)부터  2024년 7월 6일까지 작성된 플레이스토어 사용자 리뷰를 스크래핑하고자 합니다.

         

        STEP 03 .  이  데이터들은 어떻게 활용할 수 있나요?

        1. 내가 활용할 데이터는?

        2024년 4월 1일부터 작성된 제타의 리뷰 데이터를 활용합니다. 때문에 리뷰 내용이 포함된 LABEL - 6만 남겨두었습니다.

         

        2. 데이터 전처리는 어떻게?

        분석을 더욱 용이하게 하기 위하여 LABEL - 6은 Review Text로 이름을 변경했습니다.

         

        3.  데이터 시각화는 어떻게?

        저는 리뷰를 분석하기 위해 NMF 기법과 워드 클라우드 기법을 활용했습니다. 사용한 코드는 모두 Chat GPT를 사용하여 제작했습니다.

         

        (1) NMF 기법으로 데이터 분석 및 시각화

        저는 다음과 같은 코드를 사용하여 아래와 같은 NMF 분석을 진행했고, 각 주제군 별로 어떤 키워드가 있는지 알 수 있었습니다

         

        NMF 분석에 사용한 코드 (더보기 클릭)

        더보기
        #NMF 분석 및 품질평가

        import pandas as pd
        import nltk
        from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
        from sklearn.decomposition import NMF
        import re
        import gensim
        from gensim.models import CoherenceModel
        from gensim import corpora
        from matplotlib import font_manager, rc

        # 한글 폰트 설정
        font_path = 'NanumGothic.ttf'  # NanumGothic 폰트 경로
        font_name = font_manager.FontProperties(fname=font_path).get_name()
        rc('font', family=font_name)

        # 사용자 지정 불용어 목록 설정
        custom_stop_words = ['진짜','이게','이거','너무','그냥','아니','그리고','제가','정말','그래도','하지만','그러나']

        # nltk stopwords 다운로드
        nltk.download('punkt')

        # 엑셀 파일 로드
        file_path = '2024년4월이후리뷰.xlsx'
        df = pd.read_excel(file_path)

        # 텍스트 데이터 열 선택 (예: 'Review Text' 열)
        texts = df['Review Text'].astype(str)

        # 텍스트 전처리 함수
        def preprocess_text(text):
            text = re.sub(r'\W', ' ', text)  # 특수 문자 제거
            text = re.sub(r'\s+[a-zA-Z]\s+', ' ', text)  # 단일 문자 제거
            text = re.sub(r'\^[a-zA-Z]\s+', ' ', text)  # 시작 단일 문자 제거
            text = re.sub(r'\s+', ' ', text, flags=re.I)  # 여러 공백 제거
            text = re.sub(r'^b\s+', '', text)  # 접두사 'b' 제거
            text = text.lower()  # 소문자로 변환
            return text

        # 텍스트 전처리 적용
        processed_texts = texts.apply(preprocess_text)

        # 토큰화 및 불용어 제거
        def tokenize_and_remove_stopwords(text):
            tokens = nltk.word_tokenize(text)
            filtered_tokens = [token for token in tokens if token not in custom_stop_words and len(token) > 1]
            return filtered_tokens

        # 토큰화 및 불용어 제거 적용
        processed_texts = processed_texts.apply(tokenize_and_remove_stopwords)

        # TF-IDF 벡터화
        vectorizer = TfidfVectorizer(max_features=1000, tokenizer=lambda x: x, preprocessor=lambda x: x)
        tfidf_matrix = vectorizer.fit_transform(processed_texts)

        # NMF 모델 훈련
        num_topics = 8
        nmf_model = NMF(n_components=num_topics, random_state=1)
        W = nmf_model.fit_transform(tfidf_matrix)
        H = nmf_model.components_

        # 각 주제의 상위 단어 추출
        def get_nmf_topics(H, feature_names, n_top_words):
            topics = []
            for topic_idx, topic in enumerate(H):
                top_features_ind = topic.argsort()[:-n_top_words - 1:-1]
                top_features = [feature_names[i] for i in top_features_ind]
                topics.append(top_features)
            return topics

        # NMF 모델의 주제 추출
        feature_names = vectorizer.get_feature_names_out()
        topics = get_nmf_topics(H, feature_names, 10)

        # LDA 모델 및 Coherence Model 계산
        texts = processed_texts.tolist()  # processed_texts를 리스트로 변환
        dictionary = corpora.Dictionary(texts)
        corpus = [dictionary.doc2bow(text) for text in texts]

        lda_model = gensim.models.LdaModel(corpus, num_topics=num_topics, id2word=dictionary, random_state=1, passes=10)
        coherence_model_lda = CoherenceModel(model=lda_model, texts=texts, dictionary=dictionary, coherence='c_v')
        coherence_lda = coherence_model_lda.get_coherence()

        # 주제를 문자열로 변환하여 데이터프레임 생성
        topics_str = ['; '.join(topic) for topic in topics]
        df_topics = pd.DataFrame({"Topics": topics_str, "Coherence Score": [coherence_lda] * len(topics)})

        # 데이터프레임 출력
        print(df_topics)

        # 결과 출력
        print("Extracted Topics:")
        for idx, topic in enumerate(topics):
            print(f"Topic {idx+1}: {topic}")

        print("\nLDA Model Coherence Score:", coherence_lda)

         

        그리고 각 주제군에서 어떤 키워드가 가장 중요도가 높은지 시각화하여 확인할 수 있었습니다.

         

         

        시각화하는 데에 사용한 코드 (더보기 클릭)

        더보기
        #NMF 시각화
        import pandas as pd
        import nltk
        from sklearn.feature_extraction.text import TfidfVectorizer
        from sklearn.decomposition import NMF
        import re
        import matplotlib.pyplot as plt
        from matplotlib import font_manager, rc

        # 한글 폰트 설정
        font_path = 'NanumGothic.ttf'  # NanumGothic 폰트 경로
        font_manager.fontManager.addfont(font_path)
        font_name = font_manager.FontProperties(fname=font_path).get_name()
        rc('font', family=font_name)

        # 사용자 지정 불용어 목록 설정
        custom_stop_words = ['진짜','이게','이거','너무','그냥','아니','그리고','제가','정말','그래도','하지만','그러나']

        # nltk stopwords 다운로드
        nltk.download('punkt')

        # 엑셀 파일 로드
        file_path = '2024년4월이후리뷰.xlsx'
        df = pd.read_excel(file_path)

        # 텍스트 데이터 열 선택 (예: 'Review Text' 열)
        texts = df['Review Text'].astype(str)

        # 텍스트 전처리 함수
        def preprocess_text(text):
            text = re.sub(r'\W', ' ', text)  # 특수 문자 제거
            text = re.sub(r'\s+[a-zA-Z]\s+', ' ', text)  # 단일 문자 제거
            text = re.sub(r'\^[a-zA-Z]\s+', ' ', text)  # 시작 단일 문자 제거
            text = re.sub(r'\s+', ' ', text, flags=re.I)  # 여러 공백 제거
            text = re.sub(r'^b\s+', '', text)  # 접두사 'b' 제거
            text = text.lower()  # 소문자로 변환
            return text

        # 텍스트 전처리 적용
        processed_texts = texts.apply(preprocess_text)

        # 토큰화 및 불용어 제거
        def tokenize_and_remove_stopwords(text):
            tokens = nltk.word_tokenize(text)
            filtered_tokens = [token for token in tokens if token not in custom_stop_words and len(token) > 1]
            return ' '.join(filtered_tokens)

        # 토큰화 및 불용어 제거 적용
        processed_texts = processed_texts.apply(tokenize_and_remove_stopwords)

        # TF-IDF 벡터화
        vectorizer = TfidfVectorizer(max_features=1000)
        tfidf_matrix = vectorizer.fit_transform(processed_texts)

        # NMF 모델 훈련
        num_topics = 8
        nmf_model = NMF(n_components=num_topics, random_state=1)
        W = nmf_model.fit_transform(tfidf_matrix)
        H = nmf_model.components_

        # 주제 출력 및 시각화
        feature_names = vectorizer.get_feature_names_out()
        num_top_words = 10

        for topic_idx, topic in enumerate(H):
            top_features_ind = topic.argsort()[:-num_top_words - 1:-1]
            top_features = [feature_names[i] for i in top_features_ind]
            weights = topic[top_features_ind]
            plt.figure(figsize=(10, 5))
            plt.barh(top_features, weights, color='skyblue')
            plt.gca().invert_yaxis()
            plt.title(f"Topic {topic_idx}")
            plt.xlabel("Weight")
            plt.ylabel("Word")
            plt.show()

         

        (2) 워드 클라우드 기법으로 데이터 분석 및 시각화

        전체 리뷰 데이터에서 많이 언급된 키워드를 확인하기 위해 아래와 같이 워드 클라우드를 제작했습니다.

         

        워드 클라우드 제작에 사용한 코드 (더보기 클릭)

        더보기
        #전체 리뷰 워드클라우드

        import pandas as pd
        from wordcloud import WordCloud, STOPWORDS
        import matplotlib.pyplot as plt
        from matplotlib import font_manager

        # 엑셀 파일 불러오기
        file_path = '2024년4월이후리뷰.xlsx'  # 엑셀 파일 경로
        sheet_name = 'group'  # 시트 이름

        # 데이터 읽기
        df = pd.read_excel(file_path, sheet_name=sheet_name)

        # 텍스트 데이터가 있는 열 지정
        text_column = 'Review Text'  # 텍스트 데이터가 있는 열 이름

        # 모든 텍스트를 하나의 문자열로 결합
        text = ' '.join(df[text_column].dropna().astype(str).tolist())

        # 제외어 설정
        stopwords = set(STOPWORDS)
        additional_stopwords = {'이', '그', '저', '것', '수', '있', '하', '되', '않', '없', '나', '우리',
            '때', '년', '월', '일', '한', '그리고', '그렇지만', '그러나', '때문에',
            '그래서', '그런데', '또한', '하지만', '등', '더', '가', '의', '은', '는',
            '을', '를', '에', '에서', '에게', '로', '과', '와', '도', '으로', '하고',
            '이다', '입니다', '같은', '같이', '대해서', '같이', '때문에', '모든',
            '이러한', '이런', '저런', '그런', '진짜', '좀', '너무', '정말', '아니', '했는데', '자꾸', '다',
            '솔직히','제가','하면','갑자기','계속','점점','것도','앱','앱을','안','하는','하고','같아요','차라리','제',
            '좋은데','많이', '있는데', '또', '같네요', '거', '라고', '하네요', '하는데', '없는', '해요', '그냥','앱은',
            '이거', '전', '있습니다', '내가', '합니다', '무슨', '잘', '바로', '그게', '유저입니다', '부분이', '있는', '함',
            '아직', '그거', '그럼', '제발', '하면서', '제타', '그래도', '완전', '뭐', '있어요', '아주', '아닌', '난', '할',
            '다른건', '어떻게', '다시', '근데', '왜', '다만', '심해요', '막', '아예', '있지만', '한번', '뭔가', '하는게', '해도', '있으면', '되는', '혹시'
            ,'같습니다', '넘', '얘들이', '아', '이건', '지금', '거의', '뜨고', '보면', '애가', '안녕하세요', '보면', '너티', '별', '아니면', '이제', '하지'
            ,'건','내','되게','참','너','겁나','따로','조금','아니라','같은데','먼저','어떤','하기','게','처음엔','됩니다','뭔','같고','라는','오늘','일단'
            ,'해봤는데','약간','저도','정도','음','후','하나','안돼요','좋겠어요','ai가','문제가','별로,''이상한','이게','2','1','있고','이상한'
            ,'꼭','많아요','기능도','있었는데','많고','떠서','해서','감사합니다','이렇게','제대로','해주시면','문제는','엄청','다음','없고','점이','나서'
            ,'루다','이루다','루다랑','이루다가','루다가','고쳐주세요','별로네요','싫다고','심한','못하고','빨리','안돼고','그렇게','좋을','별로에요','자기가'
           ,'메세지','다른','있어서','저는','가끔','말도','말','보내면','좋아요','좋지만','좋겠습니다','짜증나서','짜증나요','있게','좋습니다','제타','제타는','경우가'
           ,'불편합니다','단점은','않은','대화하면','대화하다가','불편합니다','감사하겠습니다','해주세요','많은','많음','응','너티를','너티','안됩니다','루다와','쓰고','조금만'
           ,'없어요','맞는','아쉽네요','좋겠네요','부탁드립니다','못','좋네요','앱이','나옵니다','나와서','나와요','물론','했던','말을','대화','대화를','대화가','캐릭터','캐릭터가'
           ,'말이','채팅','채팅을','채팅이','캐릭터들이','캐릭터를','저한테','하니까','자기','되는데','고쳐주시면','아닌가요','사용하고','대화하고','업데이트'
           ,'꽤','같아서','하나도','나오는','한데','너티때는','딱히','지','경우도','요즘','아쉽습니다','불편해요','별로','문제','ㅠㅠ','3','ai','기능이','메시지','on'
           ,'불편하네요','너티는','제타로','너티가'}  # 추가로 제외할 단어
        stopwords = stopwords.union(additional_stopwords)

        # 한글 폰트 설정
        font_path = 'NanumGothic.ttf'  # 적절한 폰트 파일 경로 설정
        wordcloud = WordCloud(font_path=font_path, stopwords=stopwords, background_color='white', width=800, height=400).generate(text)

        # 워드클라우드 시각화
        plt.figure(figsize=(10, 5))
        plt.imshow(wordcloud, interpolation='bilinear')
        plt.axis('off')
        plt.show()

         

        그리고 이러한 분석 결과를 바탕으로 기획안을 제작했습니다.

        ▼Zeta is Watching you😶 기획안 보러가기▼

         

        Zeta is watching you 😶

        STEP 01 .   나의 기획은 ‘ 누구 ’ 에게 필요한가요 ?  제타(Zeta),  AI 챗봇과 함께 펼치는 상상의 나래   제타는 유저가 자신이 원하는 캐릭터와 함께 대화할 수 있는 ai 챗봇 서비스입니다.

        phalanx-club.tistory.com

         


        기획자로서, 리스틀리를 활용한 데이터 분석은 기획 방향성에 대한 근거를 확충하는 데에 도움을 주었다고 생각한다.

         

        리스틀리로 앱 사용자 리뷰 분석하기!_끝

        댓글

        최신글 전체

        이미지
        제목
        글쓴이
        등록일