데이터 분석 part

상관관계의 이해, 상관분석 / 웹시스템 이용한 마케팅 데이터 획득 이해

bleufonce 2025. 2. 25. 13:03

상관관계란?

- 한 변수의 변화가 다른 변수의 변화와 어떤 관계가 있는지 나타냄

- 한 변수가 증가할 때 다른 변수가 증가하거나 감소하는 패턴이 있는지 분석

 

상관계수

- 상관관계의 정도는 상관계수로 표현

- 가장 많이 사용되는 상관계수는 피어슨 상관계수

(기타 스피어만 상관계수, 켄달의 타우 가 있음)

- 독립변수가 많을 때 추리는 용도로 좋음

 

상관계수 해석

  • r = 1 : 완전한 양의 상관관계 (한 변수가 증가할 때 다른변수도 완전히 비례하여 증가)
  • 0.7 ≤ r < 1 : 강한 양의 상관관계    
  • 0.3 ≤ r < 0.7 : 약한 양의 상관관계
  • r = 0 : 상관관계 없음 (두 변수 간 관계가 없음)
  • - 0.3   r < 0.3 : 약한 음의 상관관계
  • - 0.7   r < - 0.3 : 강한 음의 상관관계
  • r = - 1 : 완전한 음의 상관관계 (한 변수가 증가할 때 다른변수는 완전히 반비례하여 감소)

 

상관계수 사용시 주의사항

- 반드시 인과관계가 있는 것은 아님 (외부요인과 논리적 관계 고려 필수)

- 선형관계만 측정 (비선형 관계는 측정불가)

- 극단값에 민감하여 데이터에 이상치가 많으면 왜곡될 수 있음.

- 상관계수 값이 낮다는 것은 반드시 두 변수간에 관계가 없다는 것이 아님.

 

 

 

 

상관분석을 위한 컬럼선택 코드

# pandas 라이브러리를 불러옴.
import pandas as pd

# 데이터 로드
# data라는 딕셔너리 생성.
data = {
    "광고비(만원)": [50, 60, 55, 70, 80, 90, 85, 100, 110, 120],
    "방문자 수": [500, 600, 550, 700, 800, 900, 850, 1000, 1100, 1200],
    "회원가입 수": [50, 65, 55, 75, 85, 95, 90, 110, 120, 130],
    "구매 전환율(%)": [2.5, 3.0, 2.8, 3.2, 3.5, 3.8, 3.6, 4.0, 4.2, 4.5],
    "매출(만원)": [300, 350, 330, 370, 400, 450, 420, 480, 500, 550],
}

# pandas의 데이터프레임(표)을 생성하여 df 변수에 저장.
df = pd.DataFrame(data)

# 종속변수 설정
# "매출(만원)"변수를 종속 변수(타겟)로 설정.
target_variable = "매출(만원)"

# 상관계수 계산
# df.corr()는 '피어슨 상관계수'를 계산하는 함수.
# correlation_matrix에는 모든 변수 간의 상관계수 행렬이 저장됨.
correlation_matrix = df.corr()

# 종속변수와의 상관계수 추출 (자기 자신 제외)
# correlation_matrix[target_variable] : "매출(만원)" 열을 선택해서 매출과 다른 변수들의 상관계수만 추출.
# .drop(target_variable) : "매출(만원)" 자기 자신과의 상관계수는 항상 1이므로, 제거(drop)
# .sort_values(ascending=False) : 내림차순으로 정렬
independent_variables = correlation_matrix[target_variable].drop(target_variable).sort_values(ascending=False)

# 결과 출력
print("매출과의 상관계수:\n", independent_variables)

 

 

 

 

Q1. '1인가구 관심집단.csv' 에서 "평일외출이 적은 집단"컬럼과 상관도가 높은 컬럼 선별하기

# '1인가구관심집단.csv'에서 '평일외출이 적은 집단'컬럼과 상관도가 높은 컬럼 선별하기.
import pandas as pd

# 데이터 로드 및 데이터프레임화
df = pd.read_csv("1인가구관심집단.csv")


# 종속변수 설정
target_variable = "평일_외출이_적은_집단"

# 상관계수 계산
correlation_matrix = df.corr(numeric_only=True)

# 종속변수와의 상관계수 추출 (자기 자신 제외)
independent_variables = correlation_matrix[target_variable].drop(target_variable).sort_values(ascending=False)

# 결과 출력
print("평일_외출이_적은_집단 컬럼과의 상관계수:\n", independent_variables)

 

- 사전에 종속변수의 정확한 컬럼명과 전체 데이터 정보를 확인하자.

df.columns : 컬럼명 확인

df.info() : 데이터 정보 확인 (데이터 타입, 값 개수, 데이터에 NAN(결측치) 여부 등)

df.dtypes : 각 컬럼의 데이터 타입 확인

df.count() : 컬럼별 데이터 개수 확인

df["컬럼명"].astype(변경할_타입) : 컬럼의 데이터 타입 변환

 

- pd.read_csv() 함수 자체에 CSV 파일을 데이터프레임으로 불러오는 기능이 포함되어 있음.

 

 

 

 

Q2. 상관도가 높은 3개의 컬럼을 선정해 독립변수로 만들고 회귀식과 결정계수 산출.

#2번 문제

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

df = pd.read_csv("1인가구관심집단.csv")


# 독립변수(X)와 종속변수(y)설정
X = df[['출근소요시간_및_근무시간이_많은_집단','동영상서비스_이용이_많은_집단','커뮤니케이션이_적은_집단']]
y = df['평일_외출이_적은_집단']

# 다중 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X, y)

# 예측 및 결정계수 계산
predicted_sales = model.predict(X)
r2 = r2_score(y, predicted_sales)

# 4. 모델 회귀식 및 결정계수(R²) 출력
print("회귀식: 평일_외출이_적은_집단 = {:.3f} + {:.5f} * 출근소요시간_및_근무시간이_많은_집단 + {:.5f} * 동영상서비스_이용이_많은_집단 + {:.5f} * 커뮤니케이션이_적은_집단".format(
    model.intercept_, model.coef_[0], model.coef_[1], model.coef_[2]
))
print("결정계수 (R²): {:.4f}".format(r2_score(y, model.predict(X))))

결과 : 

회귀식: 평일_외출이_적은_집단 = 0.003 + 0.60902 * 출근소요시간_및_근무시간이_많은_집단 + 0.33118 * 동영상서비스_이용이_많은_집단 + 0.05921 * 커뮤니케이션이_적은_집단
결정계수 (R²): 0.9207

 

 

 

 

광고비와 매출 간의 상관관계를 분석하고 시각화

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import koreanize_matplotlib
import seaborn as sns
from scipy.stats import pearsonr

# 데이터 생성
data = {
    "날짜": pd.date_range(start="2024-02-01", periods=10, freq="D"),
    "광고비": [50, 60, 55, 70, 65, 80, 75, 90, 85, 100],
    "매출": [300, 350, 320, 400, 390, 450, 420, 500, 470, 550]
}

df = pd.DataFrame(data)

# 상관계수 계산
correlation, p_value = pearsonr(df["광고비"], df["매출"])

# 데이터 시각화
plt.figure(figsize=(8, 6))
sns.regplot(x="광고비", y="매출", data=df)
plt.title(f"광고비 vs 매출 (상관계수: {correlation:.2f})")
plt.xlabel("광고비 (만원)")
plt.ylabel("매출 (만원)")
plt.show()

# 상관계수 출력
print(f"Pearson 상관계수: {correlation:.2f}")

# ROI(투자수익률) 계산
df["ROI"] = (df["매출"] - df["광고비"]) / df["광고비"] * 100
print("\nROI 데이터:")
print(df[["날짜", "광고비", "매출", "ROI"]])

  • 상관계수가 1.00으로 광고비와 매출은 강한 양의 상관관계를 나타낸다.
  • 즉, 광고비가 증가할수록 매출도 증가하는 경향을 보인다.
  • ROI = (매출 - 광고비) / 광고비 × 100
  • regplot() 함수는 산점도회귀 직선을 동시에 보여주기 때문에 두 변수 간의 선형 관계를 쉽게 확인가능.

 

 

 

 

이메일 오픈율과 구매 전환율 간의 상관관계를 분석하고 시각화

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import pearsonr

# 데이터 생성
data = {
    "날짜": pd.date_range(start="2024-02-01", periods=10, freq="D"),
    "이메일 오픈율": [15, 18, 20, 22, 25, 30, 28, 35, 38, 40],
    "구매 전환율": [2.5, 3.0, 3.8, 4.1, 4.8, 5.5, 5.2, 6.5, 7.0, 7.5]
}

df = pd.DataFrame(data)

# 상관계수 계산
correlation, p_value = pearsonr(df["이메일 오픈율"], df["구매 전환율"])

# 데이터 시각화
plt.figure(figsize=(8, 6))
sns.regplot(x="이메일 오픈율", y="구매 전환율", data=df)
plt.title(f"이메일 오픈율 vs 구매 전환율 (상관계수: {correlation:.2f})")
plt.xlabel("이메일 오픈율 (%)")
plt.ylabel("구매 전환율 (%)")
plt.show()

# 상관계수 출력
print(f"Pearson 상관계수: {correlation:.2f}")
print(f"P-value: {p_value:.4f}")

# ROI(이메일 캠페인 효과 분석) 계산
df["ROI"] = df["구매 전환율"] / df["이메일 오픈율"] * 100
print("\nROI 데이터:")
print(df[["날짜", "이메일 오픈율", "구매 전환율", "ROI"]])

  • 상관계수가 1.00이고 p-value값이 0.0000이다.
  • 이메일 오픈율과 구매 전환율 간에는 매우 강한 양의 상관관계를 가지며
  • p-value값으로 보면 통계적으로 유의미하다고 볼 수 있다.
  • 이메일 오픈율이 증가할수록 구매 전환율도 증가하는 경향.

 

 

 

고객 리뷰 개수와 매출 간의 상관관계를 분석하고 시각화

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import pearsonr

# 데이터 생성
data = {
    "제품 ID": ["P001", "P002", "P003", "P004", "P005", "P006", "P007", "P008", "P009", "P010"],
    "리뷰 개수": [120, 200, 150, 90, 250, 300, 180, 75, 220, 50],
    "평균 평점": [4.5, 4.7, 4.2, 4.1, 4.8, 4.9, 4.6, 4.0, 4.3, 3.8],
    "매출": [500, 800, 600, 450, 950, 1200, 700, 400, 850, 300]
}

df = pd.DataFrame(data)

# 상관계수 계산
correlation_reviews, p_value_reviews = pearsonr(df["리뷰 개수"], df["매출"])
correlation_rating, p_value_rating = pearsonr(df["평균 평점"], df["매출"])

# 데이터 시각화 (리뷰 개수 vs 매출)
plt.figure(figsize=(8, 6))
sns.regplot(x="리뷰 개수", y="매출", data=df)
plt.title(f"리뷰 개수 vs 매출 (상관계수: {correlation_reviews:.2f})")
plt.xlabel("리뷰 개수")
plt.ylabel("매출 (만원)")
plt.show()

# 데이터 시각화 (평균 평점 vs 매출)
plt.figure(figsize=(8, 6))
sns.regplot(x="평균 평점", y="매출", data=df)
plt.title(f"평균 평점 vs 매출 (상관계수: {correlation_rating:.2f})")
plt.xlabel("평균 평점")
plt.ylabel("매출 (만원)")
plt.show()

# 상관계수 출력
print(f"리뷰 개수 vs 매출 Pearson 상관계수: {correlation_reviews:.2f}, P-value: {p_value_reviews:.4f}")
print(f"평균 평점 vs 매출 Pearson 상관계수: {correlation_rating:.2f}, P-value: {p_value_rating:.4f}")

# 리뷰 효과 분석
df["리뷰당 매출 기여도"] = df["매출"] / df["리뷰 개수"]
print("\n리뷰당 매출 기여도 데이터:")
print(df[["제품 ID", "리뷰 개수", "매출", "리뷰당 매출 기여도"]])

  • 리뷰개수와 평균평점 모두 매출과 강한 양의 상관관계를 나타낸다.
  • p-값도 둘다 유의미한 결과임을 나타낸다.
  • 다만 평균평점과 매출 간의 그래프를 보면 일부 데이터가 잔차의 형태로 약간의 변동이나 예외가 있을 가능성이 있다.

 

 

 

☆ 1인 가구와 온라인 서비스 이용행태의 관계 파악

# 필요한 라이브러리 임포트
import pandas as pd

# 데이터 불러오기

df = pd.read_csv("2024_12_29개_통신정보.csv")

# 분석 대상 변수 설정
single_household = "1인가구수"
services = ["배달 서비스 사용일수", "쇼핑 서비스 사용일수", "금융 서비스 사용일수", "동영상/방송 서비스 사용일수"]
age_col = "연령대"

# 데이터 타입 변환 (쉼표 제거 후 숫자로 변환)
for col in [single_household] + services:
    df[col] = df[col].astype(str).str.replace(",", "").str.strip()
    df[col] = pd.to_numeric(df[col], errors='coerce')

# 1. 1인 가구 수와 주요 온라인 서비스 사용일수 간의 피어슨 상관계수 계산
correlations = df[[single_household] + services].corr()[single_household].drop(single_household)

# 2. 1인 가구 비율이 높은 지역과 낮은 지역의 서비스 이용 패턴 비교
q1 = df[single_household].quantile(0.25)  # 하위 25%
q3 = df[single_household].quantile(0.75)  # 상위 25%

high_single_df = df[df[single_household] >= q3]  # 1인 가구 비율이 높은 지역
low_single_df = df[df[single_household] <= q1]  # 1인 가구 비율이 낮은 지역

# 두 그룹의 서비스 이용 평균 비교
service_means_high = high_single_df[services].mean()
service_means_low = low_single_df[services].mean()

# 3. 연령대별 1인 가구 수와 서비스 이용 패턴 분석
if age_col in df.columns:
    age_single_service_means = df.groupby(age_col)[[single_household] + services].mean()
else:
    age_single_service_means = None

# 결과 출력
print("\n1. 1인 가구 수와 온라인 서비스 사용일수 간의 피어슨 상관계수")
print(correlations)

print("\n2. 1인 가구 비율이 높은 지역과 낮은 지역의 서비스 이용 평균 비교")
print("1인 가구 비율이 높은 지역 (상위 25%):")
print(service_means_high)
print("\n1인 가구 비율이 낮은 지역 (하위 25%):")
print(service_means_low)

print("\n3. 연령대별 1인 가구 수와 서비스 이용 평균")
print(age_single_service_means)

 

1) 1인 가구 수와 온라인 서비스 사용일수 간의 피어슨 상관계수

  • 배달 서비스 사용일수와 1인 가구 수는 약한 양의 상관관계(0.1257)를 가지고 있다. 즉, 1인 가구 수가 많을수록 배달 서비스 사용일수가 약간 증가하는 경향이 있을 수 있음.
  • 쇼핑 서비스 사용일수와 1인 가구 수는 거의 상관관계가 없음(-0.0336). 즉, 1인 가구 수와 쇼핑 서비스 사용일수는 거의 관계가 없다.
  • 금융 서비스 사용일수와 1인 가구 수도 거의 상관관계가 없는 수준(0.0187).
  • 동영상/방송 서비스 사용일수와 1인 가구 수는 상관관계가 없음(-0.0067).

2) 1인 가구 비율이 높은 지역과 낮은 지역의 서비스 이용 평균 비교

  • 배달 서비스 사용일수는 1인 가구 비율이 높은 지역과 낮은 지역 간에 차이가 거의 없고 비슷한 수준(11.95일 vs 11.72일).
  • 쇼핑 서비스 사용일수는 1인 가구 비율이 높은 지역에서는 184.77일, 1인 가구 비율이 낮은 지역에서는 209.40일로, 낮은 지역에서 더 많이 사용되는 경향이 있음.
  • 금융 서비스 사용일수는 낮은 지역에서 153.59일로 더 많이 사용되고, 높은 지역에서는 136.61일로 사용이 적음.
  • 동영상/방송 서비스 사용일수는 낮은 지역에서 70.96일, 높은 지역에서 64.14일로 약간 낮은 지역이 더 많이 사용되는 경향이 있음.

3) 연령대별 1인 가구 수와 서비스 이용 평균

  • 20대부터 30대까지는 배달 서비스, 쇼핑 서비스, 금융 서비스, 동영상/방송 서비스 모두 활발히 사용.
  • 40대 이후로 1인 가구 수는 줄어들고, 서비스 이용일수도 점차 감소하는 경향. (But 75세 이후 1인가구수 급증)
  • 특히 배달 서비스 사용일수는 50대 이상에서 현저히 감소하고, 쇼핑 서비스는 40대 이후부터 사용일수가 줄어듦.
  • 동영상/방송 서비스 사용일수는 30대 후반부터 감소하기 시작하고, 60대 이상에서는 사용일수가 더 적어짐.

결론

  • 1인 가구 수와 서비스 사용일수 간의 관계: 1인 가구 수와 서비스 사용 간에 큰 상관관계는 없고, 일부 서비스에서만 약한 양의 상관관계가 있음.
  • 1인 가구 비율에 따른 서비스 이용 차이: 1인 가구 비율이 낮은 지역에서 쇼핑 서비스와 금융 서비스 사용일수가 더 많고, 동영상 서비스 사용일수도 더 많음.
  • 연령대별 1인 가구 수와 서비스 이용: 젊은 연령대일수록 서비스 이용이 활발하고, 나이가 많아질수록 서비스 이용이 감소하는 경향이 있음.

 

☆ CSV 파일들은 기본적으로 쉼표(콤마 , )가 있으므로 이를 제거하는 작업을 필수적으로 해야한다.

 

  • 위의 데이터 타입 변환 코드는 CSV 파일에서 쉼표로 구분된 숫자들을 숫자로 처리하기 위해 먼저 문자열로 변환하고, 쉼표를 제거한 후, 숫자로 변환하는 코드이다.

 

 

 

 

 

 

웹시스템을 이용한 마케팅 데이터 획득 실습

  1. 웹페이지에서 사용자가 광고를 클릭할 때마다 클릭 데이터를 저장.
  2. MySQL(MariaDB)에서 광고 노출수(views) 및 클릭수(clicks) 를 저장하고, CTR(클릭률) 계산을 수행.
  3. Flask를 이용해 데이터 수집 및 CTR 결과를 API로 제공하며, HTML/JS를 이용해 실시간으로 CTR을 표시.

 

실습 과정

 

1) 데이터베이스 테이블 생성 (MariaDB)

- CTR을 분석하기 위해 ads 테이블을 생성하고 샘플데이터 삽입.

CREATE TABLE ads (
    id INT AUTO_INCREMENT PRIMARY KEY,
    ad_name VARCHAR(255) NOT NULL,
    views INT DEFAULT 0,
    clicks INT DEFAULT 0
);
INSERT INTO ads (ad_name, views, clicks) VALUES
('Ad A', 100, 10),
('Ad B', 200, 25),
('Ad C', 300, 40);

 

 

2) Flask 백엔드 코드 (app.py)

- Flask를 이용하여 MariaDB와 연결하고 CTR 데이터를 제공하는 API를 작성.

from flask import Flask, request, jsonify, render_template
import mysql.connector

app = Flask(__name__)

# MariaDB 연결 설정
db_config = {
    "host": "localhost",
    "user": "gabkeun",
    "password": "1234",
    "database": "backend"
}

# 광고 클릭 시 클릭수 증가
@app.route("/click", methods=["POST"])
def click_ad():
    ad_id = request.json.get("ad_id")

    conn = mysql.connector.connect(**db_config)
    cursor = conn.cursor()

    # 클릭 수 증가
    cursor.execute("UPDATE ads SET clicks = clicks + 1 WHERE id = %s", (ad_id,))
    conn.commit()

    cursor.close()
    conn.close()

    return jsonify({"message": "Click registered"}), 200

# 광고 노출 시 views 증가
@app.route("/view", methods=["POST"])
def view_ad():
    ad_id = request.json.get("ad_id")

    conn = mysql.connector.connect(**db_config)
    cursor = conn.cursor()

    # 노출 수 증가
    cursor.execute("UPDATE ads SET views = views + 1 WHERE id = %s", (ad_id,))
    conn.commit()

    cursor.close()
    conn.close()

    return jsonify({"message": "View registered"}), 200

# CTR 데이터 가져오기
@app.route("/ctr", methods=["GET"])
def get_ctr():
    conn = mysql.connector.connect(**db_config)
    cursor = conn.cursor(dictionary=True)

    # CTR 계산 (CTR = 클릭수 / 노출수 * 100)
    cursor.execute("SELECT id, ad_name, views, clicks, (clicks / views) * 100 AS ctr FROM ads WHERE views > 0")
    ads_data = cursor.fetchall()

    cursor.close()
    conn.close()

    return jsonify(ads_data)

# 웹페이지 렌더링
@app.route("/")
def index():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5001, debug=True)

 

 

3) HTML/JS 프론트엔드 코드 (templates/index.html)

- HTML, JavaScript(AJAX)를 이용하여 CTR 데이터를 실시간으로 불러오고, 광고 클릭 이벤트를 서버에 전송.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CTR 분석</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; }
        .ad { margin: 20px; padding: 15px; border: 1px solid #ccc; display: inline-block; cursor: pointer; }
        .ctr-data { margin-top: 20px; }
    </style>
</head>
<body>
    <h1>광고 CTR 분석</h1>
    <div id="ads-container">
        <!-- 광고가 동적으로 추가됨 -->
    </div>

    <h2>CTR 데이터</h2>
    <table border="1" width="50%" align="center">
        <thead>
            <tr>
                <th>광고 이름</th>
                <th>노출 수</th>
                <th>클릭 수</th>
                <th>CTR (%)</th>
            </tr>
        </thead>
        <tbody id="ctr-table-body">
            <!-- 데이터가 동적으로 추가됨 -->
        </tbody>
    </table>

    <script>
        // 광고 노출 이벤트 서버로 전송
        function recordView(adId) {
            fetch("/view", {
                method: "POST",
                headers: { "Content-Type": "application/json" },
                body: JSON.stringify({ ad_id: adId })
            });
        }

        // 광고 클릭 이벤트 서버로 전송
        function recordClick(adId) {
            fetch("/click", {
                method: "POST",
                headers: { "Content-Type": "application/json" },
                body: JSON.stringify({ ad_id: adId })
            }).then(() => {
                alert("광고 클릭이 기록되었습니다!");
                fetchCTR(); // CTR 데이터 업데이트
            });
        }

        // CTR 데이터 가져오기 및 화면 갱신
        function fetchCTR() {
            fetch("/ctr")
                .then(response => response.json())
                .then(data => {
                    const ctrTableBody = document.getElementById("ctr-table-body");
                    ctrTableBody.innerHTML = ""; // 기존 데이터 초기화

                    data.forEach(ad => {
                        ctrTableBody.innerHTML += `
                            <tr>
                                <td>${ad.ad_name}</td>
                                <td>${ad.views}</td>
                                <td>${ad.clicks}</td>
                                <td>${Number(ad.ctr).toFixed(2)}%</td>
                            </tr>
                        `;
                    });
                });
        }

        // 광고 목록 생성
        function loadAds() {
            const adsContainer = document.getElementById("ads-container");
            adsContainer.innerHTML = `
                <div class="ad" onclick="recordClick(1); recordView(1)">광고 A</div>
                <div class="ad" onclick="recordClick(2); recordView(2)">광고 B</div>
                <div class="ad" onclick="recordClick(3); recordView(3)">광고 C</div>
            `;
        }

        // 페이지 로드 시 광고 불러오기 및 CTR 데이터 갱신
        window.onload = function () {
            loadAds();
            fetchCTR();
            setInterval(fetchCTR, 5000); // 5초마다 CTR 데이터 갱신
        };
    </script>
</body>
</html>

 

실습파일 넣을 lab17 폴더를 만들고 권한 부여.

데이터베이스 테이블 생성하고 샘플 데이터 삽입

index.html 파일을 넣을 templates 폴더를 lab17의 하위에 생성하고 권한부여.

파일질라를 이용하여 lab17폴더에 app.py 파일을 넣고 templates폴더에 index.html 파일을 넣는다.

그리고 python3 app.py를 입력하여 실행.

 

< http://VM인스턴스의 외부ip주소:포트번호 > 로 들어가면 창이 뜬다. 광고 A, B, C 를 누르면 데이터가 올라가고, 그 올라간 데이터를 MariaDB에서 확인할 수 있다. 상기 사진은 사이트 창과 터미널을 두개 켠 화면. (하나는 app.py 돌리는 용, 하나는 데이터 수치 올라가는 것 확인하는 용)