Python에서 데이터 분석을 위해 Google Search Console API에서 데이터 추출
게시 됨: 2022-03-01Google Search Console(GSC)은 색인 범위, 특히 현재 순위를 매기는 검색어에 대한 정보를 얻을 수 있기 때문에 SEO 전문가에게 가장 유용한 도구 중 하나입니다. 이를 알고 있는 많은 사람들은 스프레드시트를 사용하여 GSC 데이터를 분석하며 프로그래밍 언어와 같은 도구를 사용하여 개선할 여지가 훨씬 더 많다는 것을 이해하는 한 괜찮습니다.
불행히도, GSC 인터페이스는 표시되는 행(단 5000개)과 사용 가능한 기간(단 16개월) 측면에서 매우 제한적입니다. 이는 통찰력을 얻는 능력을 심각하게 제한할 수 있으며 더 큰 웹사이트에는 적합하지 않습니다.
Python을 사용하면 GSC 데이터를 쉽게 얻을 수 있고 기존 스프레드시트 소프트웨어에서 훨씬 더 많은 노력이 필요한 보다 복잡한 계산을 자동화할 수 있습니다.
이것은 Excel의 가장 큰 문제 중 하나인 행 제한 및 속도에 대한 솔루션입니다. 요즘에는 데이터를 분석할 수 있는 대안이 이전보다 훨씬 더 많아지고 바로 여기에서 Python이 사용됩니다.
이 튜토리얼을 따르기 위해 고급 코딩 지식이 필요하지 않으며, 몇 가지 기본 개념과 Google Colab에 대한 몇 가지 실습만 이해하면 됩니다.
Google Search Console API 시작하기
시작하기 전에 Google Search Console API를 설정하는 것이 중요합니다. 절차는 매우 간단하며 Google 계정만 있으면 됩니다. 단계는 다음과 같습니다.
- Google Cloud Platform에서 새 프로젝트를 만듭니다. Google 계정이 있어야 하며 계정이 있다고 확신합니다. 콘솔로 이동한 다음 상단에서 새 프로젝트를 생성하기 위한 옵션을 찾아야 합니다.
- 왼쪽 메뉴를 클릭하고 "API 및 서비스"를 선택하면 다른 화면으로 이동합니다.
- 상단의 검색 창에서 "Google Search Console API"를 찾아 활성화합니다.
- 그런 다음 "자격 증명" 탭으로 이동합니다. API를 사용하려면 일종의 권한이 필요합니다.
- 필수 항목이므로 "동의" 화면을 구성합니다. 공개 여부는 우리가 사용하려는 용도에 중요하지 않습니다.
- 애플리케이션 유형으로 "데스크톱 앱"을 선택할 수 있습니다.
- 이 튜토리얼에서는 OAuth 2.0을 사용할 것입니다. json 파일을 다운로드하면 완료됩니다.
이것은 실제로 대부분의 사람들, 특히 Google API에 익숙하지 않은 사람들에게 가장 어려운 부분입니다. 걱정하지 마십시오. 다음 단계는 훨씬 쉽고 문제가 적습니다.
Python을 사용하여 Google Search Console API에서 데이터 가져오기
Jupyter Notebook이나 Google Colab과 같은 노트북을 사용하는 것이 좋습니다. 요구 사항에 대해 걱정할 필요가 없으므로 후자가 더 좋습니다. 그래서 제가 설명드릴 내용은 구글 Colab을 기준으로 작성해 보겠습니다.
시작하기 전에 다음 코드를 사용하여 json 파일을 Google Colab으로 업데이트하세요.
google.colab 가져오기 파일에서 파일.업로드()
그런 다음 분석에 필요한 모든 라이브러리를 설치하고 이 코드 조각으로 더 나은 테이블 시각화를 만들어 보겠습니다.
%%포착 #필요한 것을 로드 !pip 설치 git+https://github.com/joshcarty/google-searchconsole pandas를 pd로 가져오기 numpy를 np로 가져오기 matplotlib.pyplot을 plt로 가져오기 google.colab에서 data_table 가져오기 !git 복제 https://github.com/jroakes/querycat.git !pip 설치 -r querycat/requirements_colab.txt !pip 설치 umap-learn data_table.enable_dataframe_formatter() #더 나은 테이블 시각화를 위해
마지막으로 긴 함수에 의존하지 않고 가장 쉬운 방법을 제공하는 searchconsole 라이브러리를 로드할 수 있습니다. 내가 사용하는 인수로 다음 코드를 실행하고 client_config가 업로드된 json 파일의 이름과 동일한지 확인합니다.
검색 콘솔 가져오기 계정 = searchconsole.authenticate(client_config='client_secret_.json',serialize='credentials.json', 흐름='console')
애플리케이션 승인을 위한 Google 페이지로 리디렉션되고 Google 계정을 선택한 다음 Google Colab 바에 입력할 코드를 복사하여 붙여넣습니다.
아직 완료되지 않았으므로 데이터가 필요한 속성을 선택해야 합니다. account.webproperties를 통해 속성을 쉽게 확인하여 무엇을 선택해야 하는지 확인할 수 있습니다.
property_name = input('GSC에 나열된 대로 웹사이트 이름을 입력하세요: ') webproperty=계정[str(property_name)]
완료되면 사용자 정의 함수를 실행하여 데이터가 포함된 객체를 생성할 것입니다.
def extract_gsc_data(웹 속성, 시작, 중지, *인수): webproperty가 None이 아닌 경우: print(f'{webproperty}에 대한 데이터 추출') gsc_data = webproperty.query.range(start, stop).dimension(*args).get() gsc_data 반환 또 다른: print('웹 속성을 찾을 수 없습니다. 올바른 속성을 선택하세요.') 반환 없음
함수의 아이디어는 차원과 함께 시작 및 종료 날짜 형식으로 이전에 정의한 속성과 기간을 가져오는 것입니다.
차원을 선택할 수 있는지 여부를 선택하는 것은 SEO 전문가에게 매우 중요합니다. 이를 통해 특정 수준의 세분화가 필요한지 여부를 이해할 수 있기 때문입니다. 예를 들어 경우에 따라 날짜 차원을 가져오는 데 관심이 없을 수 있습니다.
내 제안은 Google Search Console 인터페이스가 별도로 내보낼 수 있고 매번 병합하는 것이 매우 성가시므로 항상 쿼리와 페이지를 선택하는 것입니다. 이것은 Search Console API의 또 다른 이점입니다.
우리의 경우 시간을 고려해야 하는 몇 가지 흥미로운 시나리오를 보여주기 위해 날짜 차원도 직접 가져올 수 있습니다.
ex = extract_gsc_data(웹속성, '2021-09-01', '2021-12-31', '쿼리', '페이지', '날짜')
더 큰 속성의 경우 많은 시간을 기다려야 한다는 점을 고려하여 적절한 기간을 선택하십시오. 이 예에서는 평균적으로 대부분의 데이터 세트에서 귀중한 통찰력을 얻기에 충분한 3개월의 기간을 고려하고 있습니다.
방대한 양의 데이터를 처리하는 경우 일주일을 선택할 수 있습니다. 우리가 관심을 갖는 것은 프로세스입니다.
여기서 보여드릴 내용은 예시에 적합하도록 합성 데이터 또는 수정된 실제 데이터를 기반으로 합니다. 결과적으로 여기에서 보는 것은 완전히 현실적이며 실제 시나리오를 반영할 수 있습니다.
데이터 정리
모르시는 분들을 위해 데이터를 있는 그대로 사용할 수 없습니다. 올바르게 작동하는지 확인하기 위한 몇 가지 추가 단계가 있습니다. 우선 Python에서 데이터 분석의 기초가 되는 데이터 구조인 Pandas 데이터 프레임으로 객체를 변환해야 합니다.
df = pd.DataFrame(데이터=ex) df.head()
head 메서드는 데이터 세트의 처음 5개 행을 표시할 수 있으므로 데이터가 어떻게 생겼는지 한 눈에 보는 것이 매우 편리합니다. 간단한 기능을 사용하여 페이지가 몇 개인지 셀 수 있습니다.
중복을 제거하는 좋은 방법은 개체를 집합으로 변환하는 것입니다. 집합에는 중복 요소가 포함될 수 없기 때문입니다.
일부 코드 조각은 Hamlet Batista의 노트북과 Masaki Okazawa의 노트북에서 영감을 받았습니다.
브랜드 용어 제거
가장 먼저 할 일은 브랜드 키워드를 제거하는 것입니다. 브랜드 용어가 포함되지 않은 검색어를 찾고 있습니다. 이것은 사용자 정의 기능으로 수행하는 것이 매우 간단하며 일반적으로 일련의 브랜드 용어가 있습니다.
설명을 위해 모두 필터링할 필요는 없지만 실제 분석을 위해 수행하십시오. SEO에서 가장 중요한 데이터 정리 단계 중 하나입니다. 그렇지 않으면 잘못된 결과를 초래할 위험이 있습니다.
domain_name = str(input('쉼표로 구분된 브랜드 용어 삽입: ')).replace(',', '|') 다시 수입 domain_name = re.sub(r"\s+", "", domain_name) print('RegEx를 사용하여 모든 공백 제거:\n') df['브랜드/비브랜드'] = np.where( df['query'].str.contains(domain_name), '브랜드', '비브랜드' )
두 클래스 간의 차이점을 인식하기 위해 데이터 세트에 새 열을 추가할 것입니다. 우리는 테이블이나 막대 그래프를 통해 전체 쿼리 수를 얼마나 차지하는지 시각화할 수 있습니다.
막대 그래프는 매우 간단하고 이 경우에는 표가 더 적합하기 때문에 보여주지 않겠습니다.
brand_count_df = df['브랜드/비브랜드'].value_counts().rename_axis('고양이').to_frame('카운트') brand_count_df['백분율'] = brand_count_df['count']/sum(brand_count_df['counts']) pd.options.display.float_format = '{:.2%}'.형식 brand_count_df
브랜드 키워드와 비브랜드 키워드 간의 비율을 빠르게 확인하여 데이터 세트에서 제거할 양을 알 수 있습니다. 브랜드가 아닌 키워드의 비율을 더 높이고 싶지만 이상적인 비율은 없습니다.
그런 다음 브랜드로 표시된 모든 행을 삭제하고 다른 단계를 진행할 수 있습니다.
#비브랜드 키워드만 선택 df = df.loc[df['브랜드/비브랜드'] == '비브랜드']
누락된 값 채우기 및 기타 단계
데이터 세트에 누락된 값(또는 전문 용어로 NA)이 있는 경우 몇 가지 옵션이 있습니다. 가장 일반적인 것은 모두 삭제하거나 0 또는 해당 열의 평균과 같은 자리 표시자 값으로 채우는 것입니다.
정답은 없으며 두 접근 방식 모두 장단점과 위험이 있습니다. Google Search Console 데이터의 경우 가장 좋은 조언은 0과 같은 자리 표시자 값을 넣어 일부 측정항목의 효과를 과소평가하는 것입니다.
df.fillna(0, inplace = True)
실제 데이터 분석으로 넘어가기 전에 데이터 세트의 열이라는 기능을 조정해야 합니다. 이 위치는 일부 멋진 피벗 테이블에 사용하려고 하므로 특히 중요합니다.
목적에 맞는 정수로 위치를 반올림할 수 있습니다.
df['위치'] = df['위치'].round(0).astype('int64')
위에서 설명한 다른 모든 청소 단계를 수행한 다음 날짜 열을 조정해야 합니다.
우리는 판다의 도움으로 몇 달과 몇 년을 추출하고 있습니다. 더 짧은 시간 프레임으로 작업하는 경우 이렇게 구체적일 필요는 없습니다. 이것은 반년을 고려한 예입니다.
#날짜를 적절한 형식으로 변환 df['날짜'] = pd.to_datetime(df['날짜']) #달 추출 df['월'] = df['날짜'].dt.month #추출년 df['연도'] = df['날짜'].dt.연도
[전자책] 데이터 SEO: 다음 큰 모험
탐색적 데이터 분석
Python의 주요 이점은 Excel에서 수행하는 것과 동일한 작업을 수행할 수 있지만 더 많은 옵션과 더 쉽게 수행할 수 있다는 것입니다. 모든 분석가가 정말 잘 알고 있는 피벗 테이블부터 시작하겠습니다.
포지션 그룹별 평균 CTR 분석
평균 분석 포지션 그룹별 CTR은 웹사이트의 전반적인 상황을 파악할 수 있어 가장 통찰력 있는 활동 중 하나입니다. 피벗을 적용한 다음 플롯해 보겠습니다.
pd.options.display.float_format = '{:.2%}'.형식 query_analysis = df.pivot_table(인덱스=['위치'], 값=['ctr'], aggfunc=['평균']) query_analysis.sort_values(by=['position'], 오름차순=True).head(10) 도끼 = query_analysis.head(10).plot(종류='막대') ax.set_xlabel('평균 위치') ax.set_ylabel('CTR') ax.set_title('평균 게재순위별 CTR') ax.grid('on') ax.get_legend().remove() plt.xticks(회전=0)
그림 1: 이상 징후를 찾기 위한 위치별 CTR 표시.
여기서 이상적인 시나리오는 그래프 왼쪽에 더 나은 CTR을 갖는 것입니다. 일반적으로 결과적으로 게재순위 1의 결과는 훨씬 더 높은 CTR을 나타내야 하기 때문입니다. 하지만 처음 3개 지점의 CTR이 예상보다 낮은 경우가 있으므로 조사해야 합니다.
예를 들어 11번 위치가 1위보다 나은 경우와 같이 극단적인 경우도 고려하십시오. Search Console용 Google 문서에 설명된 대로 이 측정항목은 처음에 생각하는 순서를 따르지 않습니다.
또한 링크의 위치가 매번 바뀌고 100% 정확도를 갖는 것은 불가능하기 때문에 이 메트릭은 평균이라고 덧붙입니다.
때때로 페이지 순위는 높지만 설득력이 충분하지 않으므로 제목을 수정해 볼 수 있습니다. 이것은 높은 수준의 개요이므로 세부적인 차이를 확인하지 못할 것이므로 이 문제가 대규모인 경우 신속하게 조치를 취해야 합니다.
낮은 게재순위에 있는 페이지 그룹이 더 좋은 위치에 있는 페이지 그룹보다 평균 CTR이 더 높다는 점에 유의하세요.
이러한 이유로 이상한 패턴을 발견하기 위해 분석을 위치 15 이상까지 확장할 수 있습니다.
위치별 쿼리 수 및 SEO 노력 측정
순위를 매기는 쿼리의 증가는 항상 좋은 신호이지만 미래에 더 나은 순위를 의미하지는 않습니다. 쿼리 수는 순위를 매기는 쿼리 수를 계산하는 프로세스이며 GSC 데이터로 수행할 수 있는 가장 중요한 작업 중 하나입니다.
피벗 테이블은 다시 한 번 큰 도움이 되며 결과를 플롯할 수 있습니다.
Ranking_queries = df.pivot_table(index=['position'], values=['query'], aggfunc=['count']) Ranking_queries.sort_values(by=['position']).head(10)
SEO 전문가로서 원하는 것은 맨 왼쪽, 맨 위 지점에 더 많은 쿼리 수를 갖는 것입니다. 그 이유는 매우 자연스럽습니다. 높은 게재순위는 평균적으로 더 나은 CTR을 가져오므로 더 많은 사람들이 귀하의 페이지를 클릭할 수 있습니다.
도끼 = Ranking_queries.head(10).plot(종류='막대') ax.set_ylabel('쿼리 수') ax.set_xlabel('위치') ax.set_title('순위 분포') ax.grid('on') ax.get_legend().remove()
그림 2: 위치별로 몇 개의 쿼리가 있습니까?
관심 있는 것은 시간이 지남에 따라 최상위 위치의 쿼리 수를 늘리는 것입니다.
날짜 차원을 가지고 놀기
고려 시간 간격에 따라 클릭수가 어떻게 달라지는지 살펴보겠습니다. 먼저 클릭수 합계를 구해 보겠습니다.
clicks_sum = df.groupby('날짜')['클릭수'].sum()
날짜 차원별로 데이터를 그룹화하고 각각에 대한 클릭수 합계를 구하고 있습니다. 이는 일종의 요약입니다.
이제 우리가 얻은 것을 플롯할 준비가 되었습니다. 코드는 시각화를 개선하기 위해 꽤 길어질 것입니다. 두려워하지 마십시오.
# 기간별 클릭수 합계 %config InlineBackend.figure_format = '레티나' matplotlib.pyplot에서 그림 가져오기 그림(figsize=(8, 6), dpi=80) 도끼 = clicks_sum.plot(색상='빨간색') ax.grid('on') ax.set_ylabel('클릭수 합계') ax.set_xlabel('월') ax.set_title('월별 클릭수 변화') xlab = ax.xaxis.get_label() ylab = ax.yaxis.get_label() xlab.set_style('기울임꼴') xlab.set_size(10) ylab.set_style('기울임꼴') ylab.set_size(10) ttl = ax.title ttl.set_weight('굵게') ax.spines['오른쪽'].set_color((.8,.8,.8)) ax.spines['상단'].set_color((.8,.8,.8)) ax.yaxis.set_label_coords(-.15, .50) ax.fill_between(clicks_sum.index, clicks_sum.values, facecolor='yellow')
그림 3: 월 변수와 관련하여 클릭수 합계 표시
이것은 2021년 6월부터 시작하여 2022년 1월 반까지 이어지는 예입니다. 위에서 보고 있는 모든 선은 이 시각화를 더 예쁘게 만드는 역할을 하고 있습니다. 어떻게 되는지 보기 위해 가지고 놀 수 있습니다.
위치당 쿼리 수, 월별 스냅샷
Python으로 그릴 수 있는 또 다른 멋진 시각화는 단순한 막대 그래프보다 훨씬 더 시각적인 히트맵입니다. 시간 경과에 따라 위치에 따라 쿼리 수를 표시하는 방법을 보여 드리겠습니다.
씨본을 sns로 가져오기 sns.set_theme() df_new = df.loc[(df['위치'] <= 10) & (df['연도'] != 2022),:] # 예제 비행 데이터 세트를 로드하고 긴 형식으로 변환 df_heat = df_new.pivot_table(인덱스 = "위치", 열 = "월", 값 = "쿼리", aggfunc='개수') # 각 셀의 숫자 값으로 히트맵을 그립니다. f, ax = plt.subplots(figsize=(20, 12)) x_axis_labels = ["9월", "10월", "11월", "12월"] sns.heatmap(df_heat, annot=True, linewidths=.5, ax=ax, fmt='g', cmap = sns.cm.rocket_r, xticklabels=x_axis_labels) ax.set(xlabel = 'Month', ylabel='Position', title = '시간에 따른 위치별 쿼리 수 변화') #rotate 레이블을 더 읽기 쉽게 배치 plt.yticks(회전=0)
그림 4: 위치 및 월에 따른 쿼리 수의 진행 상황을 보여주는 히트맵.
이것은 내가 가장 좋아하는 것 중 하나입니다. 히트맵은 이 예와 같이 피벗 테이블을 표시하는 데 매우 효과적일 수 있습니다. 기간은 4개월 이상이며 가로로 읽으면 시간이 지남에 따라 쿼리 수가 어떻게 변하는지 알 수 있습니다. 위치 10의 경우 9월에서 12월 사이에 약간 증가했지만 위치 2의 경우 보라색으로 표시된 것처럼 눈에 띄게 감소했습니다.
다음 시나리오에서는 눈에 띄게 이례적인 상위 위치에 대부분의 쿼리가 있습니다. 그런 일이 발생하면 돌아가서 데이터 프레임을 분석하여 가능한 브랜드 용어가 있으면 찾아볼 수 있습니다.
코드에서 볼 수 있듯이 뒤에 논리가 있는 한 복잡한 플롯을 만드는 것은 그리 어렵지 않습니다.
"올바른" 작업을 수행하고 있는 경우 쿼리 수는 시간이 지남에 따라 증가해야 하며 서로 다른 두 기간에 걸쳐 차이를 표시할 수 있습니다. 내가 제공한 예에서는 특히 CTR이 더 높아야 하는 최상위 게재순위와 같이 그렇지 않습니다.
몇 가지 기본 NLP 개념 소개
자연어 처리(NLP)는 SEO를 위한 신의 선물이며 기본 알고리즘을 적용하기 위해 전문가가 될 필요는 없습니다. N-gram은 GSC 데이터로 통찰력을 얻을 수 있는 가장 강력하지만 간단한 아이디어 중 하나입니다.
N-gram은 문자, 음절 또는 단어의 연속된 시퀀스입니다. 우리의 분석에서는 단어가 측정 단위가 될 것입니다. n-gram은 인접한 요소가 두 개(쌍)이면 바이그램이라고 하고 세 개이면 트라이그램이라고 하는 식입니다. 다양한 조합으로 테스트하고 최대 5g까지 사용하는 것이 좋습니다.
이런 식으로 경쟁자 페이지에서 가장 일반적인 문장을 발견하거나 자신의 문장을 평가할 수 있습니다. Google은 구문 기반 인덱싱에 의존할 수 있으므로 이 주제와 관련된 Google 특허에서 볼 수 있듯이 개별 키워드보다는 문장에 대해 최적화하는 것이 좋습니다.
Bill Slawski 자신이 위 페이지에서 설명한 것처럼 관련 용어를 이해하는 것의 가치는 최적화와 사용자에게 큰 가치가 있습니다.
nltk 라이브러리는 NLP 응용 프로그램으로 매우 유명하며 영어와 같은 특정 언어에서 중지 단어를 제거할 수 있는 가능성을 부여합니다. 그것들을 제거하고 싶은 소음으로 생각하십시오. 사실 기사와 매우 자주 사용되는 단어는 텍스트를 이해하는 데 아무런 가치가 없습니다.
수입품 nltk.download('중단어') nltk.corpus에서 불용어 가져오기 stoplist = stopwords.words('영어') sklearn.feature_extraction.text에서 CountVectorizer 가져오기 c_vec = CountVectorizer(stop_words=stoplist, ngram_range=(2,3)) # ngram의 행렬 ngrams = c_vec.fit_transform(df['쿼리']) # ngram의 카운트 빈도 count_values = ngrams.toarray().sum(축=0) # ngram 목록 어휘 = c_vec.vocabulary_ df_ngram = pd.DataFrame(sorted([(count_values[i],k) for k,i in vocab.items()], reverse=True) ).이름 변경(열={0: '빈도', 1:'바이그램/트라이그램'}) df_ngram.head(20).style.background_gradient()
쿼리 열을 사용하고 bi-gram의 빈도를 계산하여 bi-gram과 발생 횟수를 저장하는 데이터 프레임을 만듭니다.
이 단계는 실제로 경쟁업체의 웹사이트도 분석하는 데 매우 중요합니다. 상위 페이지에서 다른 패턴을 발견하는지 확인하기 위해 매번 n을 조정하여 텍스트를 스크랩하고 가장 일반적인 n-그램이 무엇인지 확인할 수 있습니다.
잠시 생각해 보면 개별 키워드가 컨텍스트에 대해 아무 것도 알려주지 않기 때문에 훨씬 더 이해가 됩니다.
덜 매달린 과일
가장 사랑스러운 일 중 하나는 가능한 한 빨리 좋은 결과를 보기 위해 쉽게 개선할 수 있는 페이지인 덜 매달린 과일을 확인하는 것입니다. 이것은 모든 SEO 프로젝트의 첫 번째 단계에서 이해 관계자를 설득하는 데 중요합니다. 따라서 그러한 페이지를 활용할 기회가 있다면 그냥 하십시오!
페이지를 고려하는 기준은 노출수 및 CTR에 대한 분위수입니다. 즉, 노출수의 상위 80%에 속하지만 CTR이 가장 낮은 20%에 속하는 행을 필터링합니다. 이 행의 CTR은 나머지 행의 80%보다 낮습니다.
top_impressions = df[df['impressions'] >= df['impressions'].quantile(0.8)] (top_impressions[top_impressions['ctr'] <= top_impressions['ctr'].quantile(0.2)].sort_values('impressions', 오름차순 = False))
이제 노출을 기준으로 내림차순으로 정렬된 모든 기회가 있는 목록이 있습니다.
웹 사이트 요구 사항과 크기에 따라 다른 기준을 생각하여 덜 매달린 과일을 정의할 수 있습니다.
소규모 웹사이트의 경우 더 높은 비율을 찾는 것을 고려할 수 있지만 대규모 웹사이트에서는 내가 사용하는 기준에 따라 이미 많은 정보를 얻을 수 있습니다.
[전자책] 비기술적 사상가를 위한 기술 SEO
querycat 소개: 분류 및 연관
Querycat은 클러스터링 키워드 등을 위한 연관 규칙 마이닝을 제공하는 간단하지만 강력한 라이브러리입니다. 이러한 유형의 분석에서 더 가치 있는 연관성만 보여드리겠습니다.
querycat GitHub 리포지토리를 살펴보면 이 멋진 라이브러리에 대해 자세히 알아볼 수 있습니다.
연관 규칙 학습에 대한 짧은 소개
연관 규칙 학습은 항목 집합에서 연관 및 동시 발생을 정의하는 규칙을 찾는 방법입니다. 이것은 소위 클러스터링이라고 하는 다른 비지도 머신 러닝 방법과 약간 다릅니다.
그러나 최종 목표는 동일합니다. 키워드 클러스터를 가져와서 일부 주제에 대해 우리 웹사이트가 어떻게 작동하는지 이해하는 것입니다.
Querycat은 Apriori 및 FP-Growth의 두 가지 알고리즘 중에서 선택할 수 있는 가능성을 제공합니다. 더 나은 성능을 위해 후자를 선택할 것이므로 전자는 무시해도 됩니다.
FP-Growth는 데이터 세트에서 빈번한 패턴을 찾기 위한 Apriori의 개선된 버전입니다. 연관 규칙 학습은 전자 상거래에도 매우 유용합니다. 예를 들어 사람들이 함께 구매하는 것을 이해하는 데 관심이 있을 수 있습니다.
이 경우 우리의 초점은 모두 쿼리에 있지만 내가 언급한 다른 애플리케이션은 Google Analytics 데이터에 대한 또 다른 유용한 아이디어가 될 수 있습니다.
데이터 구조 관점에서 이러한 알고리즘을 설명하는 것은 꽤 도전적이며 제 생각에는 SEO 작업에 필요하지 않습니다. 매개변수의 의미를 이해하기 위해 몇 가지 기본 개념만 설명하겠습니다.
2가지 알고리즘의 3가지 주요 요소는 다음과 같습니다.
- 지원 – 아이템이나 아이템 세트의 인기도를 나타냅니다. 엄밀히 말하면 쿼리 X와 쿼리 Y가 함께 나타나는 트랜잭션 수를 총 트랜잭션 수로 나눈 값입니다.
또한 자주 사용하지 않는 항목을 제거하는 임계값으로 사용할 수 있습니다. 통계적 유의성과 성능을 높이는 데 매우 유용합니다. 좋은 최소 지원을 설정하는 것은 매우 좋습니다. - 신뢰도 – 용어에 대한 동시 발생 확률로 생각할 수 있습니다.
- 상승도 – (1항과 2항)에 대한 지지와 1항에 대한 지지 사이의 비율입니다. 항 간의 관계에 대한 통찰력을 얻기 위해 그 가치를 볼 수 있습니다. 1보다 큰 경우 용어는 상관 관계가 있습니다. 1보다 작으면 용어가 연관될 가능성이 낮습니다. 리프트가 정확히 1(또는 닫기)이면 유의한 관계가 없습니다.
라이브러리 작성자가 작성한 querycat에 대한 자세한 내용은 이 기사에서 제공됩니다.
이제 실용적인 부분으로 넘어갈 준비가 되었습니다.
쿼리캣 가져오기 query_cat = querycat.Categorize(df, '쿼리', min_support=10, alg='fpgrowth') dfgrouped = df.groupby('카테고리').agg(sumclicks = ('클릭수', '합계')).sort_values('sumclicks', 오름차순=거짓) #15회 미만의 클릭으로 카테고리를 필터링하는 그룹 생성(임의의 숫자) 필터 그룹 = dfgrouped[dfgrouped['sumclicks'] > 15] 필터 그룹 #필터 적용 df = df.merge(필터 그룹, on=['카테고리','카테고리'], 방법='내부')
우리는 프로세스에서 덜 빈번한 범주를 필터링했으며 제 경우에는 15개를 벤치마크로 선택했습니다. 임의의 숫자일 뿐이며 그 뒤에 기준이 없습니다.
다음 스니펫으로 카테고리를 확인해 보겠습니다.
df['카테고리'].value_counts()
가장 많이 클릭된 10개의 카테고리는 어떻습니까? 각각에 대해 몇 개의 쿼리가 있는지 확인해 보겠습니다.
df.groupby('카테고리').sum()['클릭수'].sort_values(ascending=False).head(10)
선택할 수 있는 숫자는 임의적이므로 좋은 비율의 그룹을 걸러내는 것을 선택해야 합니다. 한 가지 잠재적인 아이디어는 노출수의 중앙값을 얻고 소그룹을 제외하려는 경우 가장 낮은 50%를 줄이는 것입니다.
클러스터 가져오기 및 출력으로 수행할 작업
내 권장 사항은 FP-Growth를 다시 실행하지 않도록 새 데이터 프레임을 내보내는 것입니다. 유용한 시간을 절약하기 위해 수행하십시오.
클러스터가 있는 즉시 가장 개선이 필요한 영역을 평가하기 위해 각 클러스터에 대한 클릭 및 노출을 알고 싶습니다.
grouped_df = df.groupby('카테고리')[['클릭수', '노출수']].agg('합계')
일부 데이터 조작으로 연결 결과를 개선하고 각 클러스터에 대한 클릭 및 노출을 얻을 수 있습니다.
group_ex = df.groupby(['카테고리'])['쿼리'].apply(' | '.join).reset_index() #중복 쿼리를 제거한 다음 알파벳순으로 정렬 group_ex['쿼리'] = group_ex['쿼리'].apply(람다 x: ' | '.join(sorted(list(set(x.split('|'))))))) df_final = group_ex.merge(grouped_df, on=['카테고리', '카테고리'], 방법='내부') df_final.head()
이제 클릭수 및 노출수와 함께 모든 키워드 클러스터가 포함된 CSV 파일이 생성되었습니다.
#csv 파일을 저장하고 로컬 시스템에 다운로드합니다. Safari를 사용하는 경우 작동하지 않을 수 있으므로 이러한 파일을 다운로드하려면 Chrome으로 전환하는 것이 좋습니다. df_final.to_csv('clusters_queries.csv') files.download('clusters_queries.csv')
실제로 클러스터링을 위한 더 나은 방법이 있습니다. 이것은 쿼리캣을 사용하여 즉시 사용하기 위해 여러 작업을 수행하는 방법에 대한 예일 뿐입니다. 여기서 주요 목표는 특히 지식이 많지 않은 새로운 웹사이트에 대해 가능한 한 많은 통찰력을 얻는 것입니다.
현재 가장 좋은 접근 방식은 의미론과 관련이 있으므로 클러스터링에 집중하려면 그래프 또는 임베딩 학습을 고려하는 것이 좋습니다.
그러나 이것은 초보자이고 온라인에서 사용할 수 있는 미리 빌드된 Streamlit 앱을 사용해 볼 수 있는 경우 고급 항목입니다.
온크롤 데이터³
결론과 그 다음
Python은 웹 사이트 분석에 큰 도움을 줄 수 있으며 데이터 정리, 시각화 및 분석을 한 곳에서 결합하는 데 도움이 될 수 있습니다. GSC API에서 데이터를 추출하는 것은 고급 작업에 확실히 필요하며 데이터 자동화에 대한 "부드러운" 소개입니다.
Python으로 더 많은 고급 계산을 수행할 수 있지만 SEO 가치 측면에서 무엇이 합리적인지 확인하는 것이 좋습니다.
예를 들어, 쿼리 수는 웹사이트가 더 많은 쿼리에 대해 고려되기를 원하기 때문에 장기적으로 전체적으로 훨씬 더 중요합니다.
메모장을 사용하는 것은 주석으로 코드를 포장하는 데 큰 도움이 되며 이것이 제가 여러분에게 Google Colab에 익숙해지는 것을 제안하는 주된 이유입니다.
서로 다른 데이터 세트를 병합하는 데서 최고의 아이디어가 나오기 때문에 이것은 데이터 분석이 제공할 수 있는 것의 시작에 불과합니다.
Google Search Console은 그 자체로 강력한 도구이며 완전히 무료입니다. 좋은 손에서 얻을 수 있는 실용적인 정보의 양은 거의 무제한입니다.