통계란 확률을 활용해 정량적인 추정을 통해 샘플 집단을 통해 전체 집합의 특징을 알아내는 것입니다
즉 분석도구를 활용해 분석 단계를 하나씩 해결해나가며 문제를 해결하는 것입니다
데이터 분석에는 여러 단계들이 있습니다
우선 데이터 시각화와 기술적 분석, 상관관계, 인과관계를 통해 전체 데이터를 파악합니다
통계추론은 일부 데이터로 전체를 알고리즘 학습은 전체 데이터로 미래를 알고 싶을 때 활용합니다
위 활동을 통해 모델링을 만들어냅니다
마지막으로 얼마나 맞는지 가설검정(AB테스트)이 있습니다
예시로 통계는 스마트폰 색상에 따른 재고를 추정하는 알고리즘을 생성하는 것이라면 확률은 스마트폰 생상 재고량 추정을 통해 얼마나 팔릴지 비즈니스를 예측하는 것입니다
통계추론
일부 데이터로 전체 특성을 확인 > 모델 예측 > 확률적으로 전체 예측
알고리즘 학습
전체 데이터로 과거패턴 확인 > 모델예측 > 확률적으로 미래 예측
데이터 변수 구분 및 용어정리
로우 데이터 : 원 데이터 EX) 로그데이터(아무 의미없이 계속 쌓이는 데이터)
변수 : 정보가 수집되는 특정한 개체나 대상 (보통 열값들을 의미)
데이터 형태에 따른 분류
대분류
소분류
의미/예시
질적변수
명목형 변수
순위가 존재하지 않는 경우(혈액형)
범주로 분류
순위형 변수
순위가 존재하는 경우(성적)
양적변수
이산형변수
값이 셀 수 있는 경우(정수)
숫자로 분류
연속형 변수
값이 셀 수 없는 경우(실수)
더 중요한 것은 데이터 관계에 따라 분류한 것입니다
대분류
의미/예시
독립변수
다른 변수에 영향을 미치는 변수(X)
종속변수
다른 변수에 의해 영향을 받는 변수(Y)
데이터의 특성확인을 위한 기술적 분석
데이터는 여러개의 변수로 구성되어 있고 기술적분석을 통해 데이터의 특성을 파악합니다
로우 데이터에는 이상치가 많이 쌓이는 경우가 있습니다
그래서 먼저 데이터를 파악하는 것이 중요합니다
데이터 시각화, 기술적 분석, 상관관계, 인과관계를 통해 어떻게 생겼는지 알아봅니다
중심통계량
중심통계량 : 데이터의 중심경향을 측정합니다
대표적으로 평균이 있습니다
이산형 : X 값이 유한개 일때는 각 변수 값 X 값이 발생할 확률
연속형 : X값이 무한개 일때는 각 변수 값 X 값이 발생할 확률
대표적으로 중심통계량에 3개가 있습니다
평균
중앙값
최빈값
어느 마을에서 세금을 걷습니다 3년동안 인구가 1000명에서 1만명으로 는 상황에서 전체 세금양을 확인해보니 똑같이 1000만원이 모아졌습니다
평균을 통해 1인당 1만원에서 1인당 1000인 것을 알 수 있습니다
그럼 중앙값과 최빈값은 어떨때 알아봐야 할까요?
예시로 A국가에서 1인당 1만원의 세금을 내어 총 10명이므로 10만원인 것을 알 수 있습니다
B국가의 경우 1명이 10만원을 내고 나머지는 내지 않았습니다
이럴경우 B국가는 1인당 평균 1만원을 낸다고 말하기 어렵습니다 > 평균의 함정입니다
양극단적인 값이 평균을 왜곡하여 중앙값을 확인해봅니다
B국가의 중앙값은 0원이고 평균값은 1만원입니다
A 국가의 중앙값은 1만원이고 평균값도 1만원입니다
중앙값으로 더 정량적으로 파악이 가능합니다
변동통계량
중심통계량에서의 모순을 줄이기 위해 데이터가 얼마나 퍼져 있는지 알아보려고 합니다
바로 변동통계량을 통해서인데요!
기댓값에서 얼마나 퍼져 있는지를 알려주는 통계량인데요
각각의 확률 변수가 기댓값에서 퍼져있는 정도를 확률를 곱해 이산형은 유한개, 연속형은 무한개로 더한 값입니다
예를 들면 세금으로 30원, 26원, 22원이 모아졌습니다 다 합하면 78원이고 3으로 나누면 평균값인 26이 나옵니다
이 때 30원에서 26원을 빼면 4, 26원에서 26원을 빼면 0, 22원에서 26원을 빼면 -4로 모두 더하면 0입니다
이 0이 바로 편차 즉 관측값과 평균의 차이라고 할 수 있습니다
그리고 제곱을 한 번 해볼까요?
그럼 각각 16, 0, 16으로 합은 32가 됩니다 이것을 변동 즉 편차 제곱의 합입니다
원래는 3으로 나눠야 하지만 0이 있기에 2로 나눕니다(전체 집단의 평균에 더 가까워집니다)
그럼 16이 나오죠 이것이 바로 분산 편차 제곱의 합을 데이터의 수로 나눈 값입니다
여기에 제곱근을 해주면 표준편차입닌다
추가로 극단값이 있으면 평균이 왜곡이 된다고 배웠습니다
분산은 대략적인 전체의 값을 보여주기 때문에 최대값과 최소값의 차이인 범위(RANGE)를 통해 데이터 분포를 더 자세히 알 수 있습니다
예를 들면 편차가 0-5만원이 나왔지만 최소값이 0이고 최대값이 5억이 될 수도 있습니다
형태통계량
왜도(SKEWNESS) : 평균을 중심으로 좌우로 데이터가 편향되어 있는 정도를 볼 수 있습니다
첫번째 Positive Skew의 경우 적은 금액을 내는 사람들의 비율이 더 높다는 것을 알수 있습니다
예를 들면 A,B 라는 기업이 있습니다
둘다 투자 수익율이 5%입니다
이럴 때 이렇게 말씀드려야 하죠 중심통계량 말고 변동통계량 주세요!
A는 -3%~10% B도 마찬가지 입니다
음 그렇다면 왜도가 어떻게 되나요?
그림이 너무 조잡하지만....ㅎㅎ
둘다 평균이 5%입니다
근데 왜도를 보니 편향되어있는게 다르죠
이 그림을 해석하면 A의 경우 -수입보다 +수익을 내는 횟수가 많고 반대로 B의 경우 +보다 -일때가 더 많다는 것입니다
첨도(KURTOSIS) : 뾰족한 정도
이 그래프를 한번 보실까요
처음에 보이는 특징은 중심통계량인 평균, 중앙값, 최빈값이 동일하다는 점입니다
형태통계량(왜도) 또한 좌우 치우침이 동일하죠
그런데 뾰족함 정도가 다르죠 이건 무엇을 의미할까요?
사실 뾰족함 보다도 양끝의 극단값에 초점을 맞추어야 합니다
뾰족하다는 이야기는 TAIL이 두껍다는 의미입니다(검정이 가장 두껍네요)
그럼 만약 안정형을 추구하는 투자자분이라면 어떤 그래프의 파생상품을 선택해야 할까요?
바로 파란색입니다
검은색의 경우 수익률이 아주 높거나 아주 낮거나 하는 이벤트가 발생합니다
반면 파란색의 경우 극단적으로 높은 수익률이 나지 않더라도 안정적인 수익률을 기대할 수 있습니다
즉 첨도로 극단값이 많은지를 알 수 있습니다
보통 비즈니스에서 VIP라고 해서 파레토의 법칙이 많이 적용되는 것을 볼 수 있습니다
20%가 80%의 매출을 발생시킨다는 이론인데요
아마존의 경우 반대로 80% 고객층에 집중하며 지갑 점유율을 늘리는 방향으로 하는 기업입니다
즉 검은색 그래프와 비슷한 형태를 보이겠죠 그래서 TAIL BUSINESS라고도 합니다
정규분포에서 왜도는 0 첨도는 3입니다
컴퓨터가 계산을 해줍니다 이 숫자를 잘 기억해야 합니다
이상치(Outlier)
통계분포적으로 양 극단에 있는 값
예전에는 이 이상치들을 오류라고 생각했지만 현대에는 이상치를 통해 어떻게 생겼는지 이해하기 위한 요소이기도 합니다
25등과 75등의 차이를 interquartile range 이며 아웃라이어를 포함한 최대값과 최소값의 차이를 range라고 합니다
관계통계량
이번에 배울 관계통계량은 앞엣서 배운 내용들과 좀 다릅니다
앞서 배운 중심, 변동, 형태통계량은 하나가 어떻게 생겼는지를 봤다면 관계통계량은 주로 2개 이상의 확률변수가 서로 어떤 관련성으로 퍼져있는지를 확인합니다
x가 증가할 때 y가 증가하는지, 아니면 감소하는지, 아무런 변화가 없는지 등을 파악합니다
바로 공분산(Covariance) 입니다
두개의 변수에 대한 공통분산이라고 하여 공분산이라고 합니다
즉 공분산은 자기자신에서 기대값을 뺀 값과 다른 변수에서 기대값을 뺀 값을 곱한뒤 평균을 내준 값입니다
분산과 유사하죠 분산은 자기 자신을 2번 곱했다면 공분산은 다른 변수와 곱한다는게 차이점입니다
0이 나온다면 서로 독립적으로 움직인다는 의미로 상관이 없다는 의미입니다
공분산은 하나의 문제점이 있는데요
예를 들면 x1,x2가 각각 0~100 , 0~100 사이의 범위입니다
만약 x1,x2가 0~10,0~10입니다
그럼 첫번째 경우가 공분산 값이 크게 나올 수 밖에 없습니다
50x50 = 2500
5x5 = 25
숫자만 보면 1번 케이스가 더 관계가 큰 것으로 보입니다
하지만 실제로는 시험점수라고 했을 때 100점을 만점으로 기준으로 하는지 10점으로 하는지의 차이입니다
즉 공분산은 단위의 영향을 받습니다
그래서 공정한 해석을 하기 위해 정규화 작업을 거칩니다
단위를 스케일링하는게 번거롭다...
상관관계(correlation) : 각 변수들의 크기에 영향을 받지 않도록 스케일을 조정해줍니다
공분산은 -무한대에서 무한대의 범위가 나올 수 있지만 상관관계는 스케일링을 해주어 -1에서 1의 범위가 나옵니다
변수들이 서로 독립이면 상관계수는 0입니다
양의 선형관계면 1, 음의 선형관계면 -1
단점이 있다면 이상치의 영향을 받는다는 것이고 선형관계만을 측정하기 때문에 데이터가 비선형이면 부적절한 지표입니다
극단값이 잇다면 너무 수치를 믿으면 안 됩니다
비선형적인 특이한 케이스나 이상치가 많다면 상관관계를 사용할 때 주의해야 합니다
인과관계
태양으로 화상을 입은 사람들의 수가 많을 수록 아이스크림 구매량이 많아질까요?
아이스크림 판매와 화상율 간의 상관관계 아이스크림 판매량이 많아지면 화상을 입은 사람들도 증가하는 경향이 있다는 연구 결과가 있다고 해보겠습니다. 그러나 이는 인과관계가 아닌 상관관계에 불과합니다. 즉, 아이스크림 판매량이 늘어나면 화상율이 높아지는 것이 아니라, 둘 다 영향을 받는 공통적인 요인이 있을 가능성이 높습니다. 예를 들어, 더욱 따뜻한 날씨에서 아이스크림 판매량이 늘어나고, 이로 인해 보다 많은 사람들이 화상을 입을 수 있는 확률도 올라갑니다
유명 IT 유튜버인 조코딩님의 '동물상 앱 만들기' 영상을 보고 나도 한번 만들어볼까하고 시작하였습니다 하지만 영상은 3년전꺼...
그것도 모르고 거의 2시간 동안 자신과의 싸움을 했는데요 왜 안 되지 하면서 화면을 보고 있었는데 알고보니 조코딩님께서 새로 리뉴얼된 코드를 알려주는 영상을 올려주셨더라구요
근데 그것도 해봤는데 잘 안되어서(조코딩님의 코드가 잘 못된게 아니라 제가 이런걸 잘 못따라합니다...ㅎㅎ) 그냥 한번 내가 짜봐야겠다라고 생각했습니다
그때는 뚝딱했던게 지금은 먹히지 않더라구요ㅠ
심지어 BeautifulSoup도 최근에 리뉴얼을 했는지 문법이 달라졌더라구요ㅎㅎ
하지만 끈기와 집념으로 결국 구글 이미지 크롤링을 완성할 수 있었습니다
잠깐 크롤링하는 방법들에 대해 알아보고 갈까요!! 크롤링에는 크게 BeautifulSoup, Selenium, Scrapy 를 사용합니다 우선 이번 구글 이미지 크롤링은 크롤링 입문할 때 많이 사용하시는 BeautifulSoup과 Selenium을 사용하였습니다
BeautifulSoup의 경우 입문자용으로 배우기는 쉽지만 매우 느리다는 단점이 있습니다 무엇보다 자바스크립트가 들어간 웹사이트는 지원을 안 한다는 단점이 있습니다
Selenium은 웹 브라우저를 동작시켜 자바스크립트도 연동이 가능한 장점이 있습니다 Scrapy보다 배우기 쉽지만 여전히 느린 속도의 단점이 있습니다
마지막으로 Scrapy는 배우기 어렵지만 빠른 속도와 높은 완성도를 자랑합니다
그럼 하나씩 볼까요~
우선 필요한 패키지들을 임포트 합니다
# 1. 필요한 패키지를 임포트 하기
import os
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver # 크롬 웹브라우져를 자동으로 제어하기위해
from selenium.webdriver.common.keys import Keys # 키보드를 컴퓨터가 알아서 누르게 하기위해
import time
from selenium.webdriver.support.ui import WebDriverWait
그 다음 현재 컴퓨터 크롬 버전에 맞는 크롬드라이버가 다운로드된 위치를 넣어주시고 다운로드 받고 싶은 구글 이미지 키워드를 넣어줍니다
# 2. 크롬 드라이버의 위치 지정후 driver 객체 생성
driver = webdriver.Chrome('')
# 3. 구글의 이미지 검색 url 을 받아옵니다.( 키워드를 아무것도 안쳤을때의 url)
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&ei=l1AdWbegOcra8QXvtr-4Cw&ved=0EKouCBUoAQ")
# 검색어를 리스트로 선언합니다.
keywords = ['소녀시대 윤아']
그리고 검색창에 키워드를 넣어주는 작업을 하게 하고
스스로 end키를 눌러서 2번 내려갈 수 있게 했어요
저는 50장 정도만 할 거라 2번 내리게 했는데 더 많이 내리고 싶으신 분들은 숫자 3을 고쳐주시면 됩니다!
또 오류가 생길 수 있어서 time.sleep을 10초 정도 주었는데 너무 많은 것 같더라구요
한 3초 정도면 충분할 것 같습니다
for keyword in keywords:
elem = driver.find_element(By.NAME, "q")
elem.clear() # 검색창 초기화
elem.send_keys(keyword)
elem.send_keys(Keys.RETURN)
# 검색한 이미지를 다 볼 수 있게 END 키를 눌러서 스크롤을 아래로 내릴수 있게 합니다.
for i in range(1, 3):
driver.find_element(By.XPATH, "//body").send_keys(Keys.END)
time.sleep(10)
그리고 각각의 이미지 url을 가져오도록 했는데요
여기서 간혹 'lxml'이 적용이 안 될 경우도 있어요
그럴 경우 pip install lxml을 해주면 됩니다
그리고 잠깐 프롬프트나 주피터노트북 껐다가 키고 다시 돌리면 되실 거에요ㅎㅎ
# html 코드를 파싱하여 이미지 상세 url을 가져오고 저장합니다.
html = driver.page_source
soup = BeautifulSoup(html, "lxml")
params = []
imgList = soup.find_all("img", class_="rg_i Q4LuWd")
for i in imgList:
params.append(i.get("src", i.get("data-src")))
하면서 find_element_by_xpath쪽에서 자꾸 오류가 생기더라구요ㅠ
찾을 수 없다고 했나
확인해보니 최근에 BeautifulSoup이 문법을 바꾼 것 같더라구요
find_element(By.XPATH,)
이렇게 수정해주고 나머지 문법들도 수정해주었습니다!
마지막으로 저장할 이미지 경로를 저장해주고 다운로드 받을 이미지 수도 결정을 해주었습니다!
이미지 저장 경로는 keyword에 따라 새로운 폴더를 생성하게 해 이미지를 저장해주었습니다
이미지 이름도 키워드_인덱스번호 이렇게 해서 다운로드를 받았어요
이미지 저장 경로는 f'뒤에 붙여주시면 되어요!
만약 50장이 너무 많거나 적으시면 params 뒤에 숫자를 수정해주시면 됩니다
# 이미지 저장 경로
dir_path = f'{keyword}'
if not os.path.exists(dir_path):
os.makedirs(dir_path)
# 이미지 다운로드
for idx, p in enumerate(params[:50], 1):
save_path = os.path.join(dir_path, f"{keyword}_{idx}.jpg")
urllib.request.urlretrieve(p, save_path)