<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>robin_dev.log</title>
        <link>https://velog.io/</link>
        <description>데이터 분석을 공부하는 🌱</description>
        <lastBuildDate>Sat, 11 Sep 2021 06:26:26 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>robin_dev.log</title>
            <url>https://images.velog.io/images/robin_dev/profile/8d8a526d-a671-4f97-bdaf-090a88a794f0/IMG_2252 (2).jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. robin_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/robin_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[SQL 정규표현식]]></title>
            <link>https://velog.io/@robin_dev/SQL-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D</link>
            <guid>https://velog.io/@robin_dev/SQL-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D</guid>
            <pubDate>Sat, 11 Sep 2021 06:26:26 GMT</pubDate>
            <description><![CDATA[<h3 id="정규표현식">정규표현식</h3>
<ul>
<li>정규표현식은 검색할 패턴을 명시하는 방법임.</li>
</ul>
<table>
<thead>
<tr>
<th>형태</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>*<em>REGEXP *</em></td>
<td>*<em>매치할 정규표현식이 뒤따름.      *</em></td>
</tr>
<tr>
<td>*<em>NOT REGEXP  *</em></td>
<td><strong>REGEXP의 부정.</strong></td>
</tr>
</tbody></table>
<p>출처: <a href="https://dev.mysql.com/doc/refman/8.0/en/regexp.html">https://dev.mysql.com/doc/refman/8.0/en/regexp.html</a></p>
<ul>
<li>정규표현식 튜토리얼: <a href="https://regexone.com/lesson/introduction_abcs">https://regexone.com/lesson/introduction_abcs</a></li>
<li>정규표현식 테스트 사이트: <a href="https://regexr.com/">https://regexr.com/</a></li>
</ul>
<p>&lt;예제&gt;
[문제]
Query the list of CITY names starting with vowels (i.e., a, e, i, o, or u) from STATION. Your result cannot contain duplicates.
<img src="https://images.velog.io/images/robin_dev/post/1c7849d4-d0c4-4739-be8b-19296beed109/image.png" alt=""></p>
<p>[풀이1]</p>
<pre><code>SELECT DISTINCT city
FROM station
WHERE city REGEXP &#39;^[aeiou].*&#39;</code></pre><pre><code>- ^: 문자열의 시작을 매칭함.
- []: 집합에 있는 어떤 문자와 매칭함. 
- .: 어떤 문자와 매칭함. 
- *: 이전 토큰의 0개 이상에 매칭함. </code></pre><p>=&gt; &#39;aeiou&#39; 중 어떤 문자로든 시작하고 이후에 어떤 문자가 0개 이상 등장하는 도시 이름을 중복 없이 선택함.</p>
<p>[풀이2]</p>
<pre><code class="language-sql">SELECT DISTINCT city
FROM station
WHERE city REGEXP &#39;^[aeiou]&#39;</code></pre>
<p>=&gt; &#39;aeiou&#39; 중 어떤 문자로든 시작하는 도시 이름을 중복 없이 선택함.</p>
<ul>
<li>참고: SQL은 대소문자에 민감하지 않기 때문에 [AEIOUaeiou]로 표현하지 않아도 되지만 다른 프로그래밍 언어(예: 파이썬)에서는 대소문자 구분함. </li>
</ul>
<p>출처: <a href="https://www.hackerrank.com/challenges/weather-observation-station-6/problem?h_r=internal-search">https://www.hackerrank.com/challenges/weather-observation-station-6/problem?h_r=internal-search</a></p>
<p>&lt;예제&gt;
[문제]
Query the list of CITY names from STATION that do not start with vowels and do not end with vowels. Your result cannot contain duplicates.
<img src="https://images.velog.io/images/robin_dev/post/1c7849d4-d0c4-4739-be8b-19296beed109/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT DISTINCT city
FROM station
WHERE city NOT REGEXP &#39;(^[aeiou]|[aeiou]$)&#39;</code></pre>
<pre><code>- $: 문자열의 끝에 매칭함.
- (조건1|조건2): 조건1 혹은 조건2에 매칭함. </code></pre><p>=&gt; 도시 이름 중에서 &#39;aeiou&#39;중 어떤 문자로 시작하거나 &#39;aeiou&#39;중 어떤 문자로 끝나는 이름 패턴과 같지 않은 도시 이름을 중복없이 선택함. </p>
<p>출처: <a href="https://www.hackerrank.com/challenges/weather-observation-station-12/problem?h_r=internal-search">https://www.hackerrank.com/challenges/weather-observation-station-12/problem?h_r=internal-search</a></p>
<p>&lt;예제&gt; 프로그래머스 - SQL 고득점 Kit - JOIN - 보호소에서 중성화한 동물</p>
<p>[문제]</p>
<ul>
<li><p><strong>ANIMAL_INS 테이블</strong>
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th align="center">NAME</th>
<th align="center">TYPE</th>
<th align="center">NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td align="center">ANIMAL_ID</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">ANIMAL_TYPE</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">DATETIME</td>
<td align="center">DATETIME</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">INTAKE_CONDITION</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">NAME</td>
<td align="center">VARCHAR(N)</td>
<td align="center">TRUE</td>
</tr>
<tr>
<td align="center">SEX_UPON_INTAKE</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
</tbody></table>
</li>
<li><p><strong>ANIMAL_OUTS 테이블</strong>
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.</p>
<table>
<thead>
<tr>
<th align="center">NAME</th>
<th align="center">TYPE</th>
<th align="center">NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td align="center">ANIMAL_ID</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">ANIMAL_TYPE</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">DATETIME</td>
<td align="center">DATETIME</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">NAME</td>
<td align="center">VARCHAR(N)</td>
<td align="center">TRUE</td>
</tr>
<tr>
<td align="center">SEX_UPON_OUTCOME</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
</tbody></table>
</li>
</ul>
<p><strong>보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.</strong> 중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다.</p>
<p>[풀이] </p>
<pre><code class="language-sql">SELECT i.animal_id, i.animal_type, i.name
FROM animal_ins AS i
INNER JOIN animal_outs AS o ON i.animal_id = o.animal_id
WHERE i.sex_upon_intake REGEXP &#39;^Intact&#39; AND o.sex_upon_outcome REGEXP &#39;^(Spayed|Neutered)&#39;
ORDER BY i.animal_id</code></pre>
<p>=&gt; 보호소에 들어올 때에 성별 및 중성화 여부는 Intact로 시작하고, 보호소에서 나갈 때 성별 및 중성화 여부는 Spayed 혹은 Neutered로 시작하는 동물의 아이디, 종, 이름을 선택함. </p>
<p>출처: <a href="https://programmers.co.kr/learn/challenges">https://programmers.co.kr/learn/challenges</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼자 공부하는 머신러닝 딥러닝] 훈련 세트와 테스트 세트]]></title>
            <link>https://velog.io/@robin_dev/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%9B%88%EB%A0%A8-%EC%84%B8%ED%8A%B8%EC%99%80-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%84%B8%ED%8A%B8</link>
            <guid>https://velog.io/@robin_dev/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%9B%88%EB%A0%A8-%EC%84%B8%ED%8A%B8%EC%99%80-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%84%B8%ED%8A%B8</guid>
            <pubDate>Tue, 31 Aug 2021 09:03:05 GMT</pubDate>
            <description><![CDATA[<h3 id="지도-학습과-비지도-학습">지도 학습과 비지도 학습</h3>
<p><img src="https://images.velog.io/images/robin_dev/post/30df12b7-f321-463c-9306-d1649142a9f2/image.png" alt=""></p>
<h4 id="지도-학습supervised-learning">지도 학습(supervised learning)</h4>
<p>: 입력과 정답 데이터를 사용하는 학습 알고리즘.</p>
<h4 id="비지도-학습unsupervised-learning">비지도 학습(unsupervised learning)</h4>
<p>: 정답 없이 입력 데이터만 사용하는 학습 알고리즘. </p>
<h3 id="훈련-데이터-세트와-테스트-데이터-세트">훈련 데이터 세트와 테스트 데이터 세트</h3>
<h4 id="훈련-데이터-세트-training-dataset">훈련 데이터 세트 (training dataset)</h4>
<p>: 학습에 사용되는 데이터 </p>
<h4 id="테스트-데이터-세트test-dataset">테스트 데이터 세트(test dataset)</h4>
<p>: 평가에 사용되는 데이터</p>
<h3 id="k-nn을-이용한-도미와-빙어-분류-모델---훈련-데이터-세트와-테스트-데이터-세트-분리">K-NN을 이용한 도미와 빙어 분류 모델 - 훈련 데이터 세트와 테스트 데이터 세트 분리</h3>
<h4 id="입력-데이터-정답-데이터-numpy-배열로-변환하기">입력 데이터, 정답 데이터 numpy 배열로 변환하기</h4>
<p><code>numpy.array(리스트 이름)</code>로 리스트를 numpy 배열로 변환할 수 있다. </p>
<p>[코드]</p>
<pre><code class="language-python">import numpy as np
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8, 
                10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7, 
                7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1] * 35 + [0] * 14

input_arr = np.array(fish_data)
target_arr = np.array(fish_target)

print(input_arr.shape)
print(input_arr)
print(&#39;_____________________________________________________________________________&#39;)
print(target_arr.shape)
print(target_arr)</code></pre>
<p>[결과]</p>
<pre><code>(49, 2)
[[  25.4  242. ]
 [  26.3  290. ]
 [  26.5  340. ]
 [  29.   363. ]
 [  29.   430. ]
 [  29.7  450. ]
 [  29.7  500. ]
 [  30.   390. ]
 [  30.   450. ]
 [  30.7  500. ]
 [  31.   475. ]
 [  31.   500. ]
 [  31.5  500. ]
 [  32.   340. ]
 [  32.   600. ]
 [  32.   600. ]
 [  33.   700. ]
 [  33.   700. ]
 [  33.5  610. ]
 [  33.5  650. ]
 [  34.   575. ]
 [  34.   685. ]
 [  34.5  620. ]
 [  35.   680. ]
 [  35.   700. ]
 [  35.   725. ]
 [  35.   720. ]
 [  36.   714. ]
 [  36.   850. ]
 [  37.  1000. ]
 [  38.5  920. ]
 [  38.5  955. ]
 [  39.5  925. ]
 [  41.   975. ]
 [  41.   950. ]
 [   9.8    6.7]
 [  10.5    7.5]
 [  10.6    7. ]
 [  11.     9.7]
 [  11.2    9.8]
 [  11.3    8.7]
 [  11.8   10. ]
 [  11.8    9.9]
 [  12.     9.8]
 [  12.2   12.2]
 [  12.4   13.4]
 [  13.    12.2]
 [  14.3   19.7]
 [  15.    19.9]]
_____________________________________________________________________________
(49,)
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 0 0 0]</code></pre><h4 id="랜덤으로-훈련-데이터-세트와-테스트-데이터-세트-나누기">랜덤으로 훈련 데이터 세트와 테스트 데이터 세트 나누기</h4>
<p><code>numpy.random.shuffle()</code> : numpy random 패키지의 shuffle() 함수는 주어진 배열을 무작위로 섞음. 
<code>numpy.random.seed()</code> : seed의 값을 파라미터로 받음. seed의 값이 같으면 같은 숫자들의 집합이 결과물로 나옴. 즉, 랜덤으로 나오는 숫자들을 예측할 수 있게 함. </p>
<ul>
<li>본 실습에서는 같은 결과물을 얻기 위해 seed = 42를 사용함. </li>
<li><code>numpy.arange(start, stop, step)</code>: 일정한 간격의 정수 혹은 실수 배열을 만듦. start는 범위의 시작을 의미하고, 해당 값을 포함함. 기본값은 0. stop은 범위의 끝을 의미하지만 해당 값을 포함하지 않음. 즉, start 이상 stop 미만까지로 보면 됨. 기본 step은 1.</li>
</ul>
<p>&lt;단계 1&gt; 0부터 48까지 인덱스 만들기</p>
<p>[코드]</p>
<pre><code class="language-python">index = np.arange(49)

print(index)</code></pre>
<p>[결과]</p>
<pre><code>[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
 48]</code></pre><p>&lt;단계 2&gt; 0부터 48까지 인덱스를 랜덤하게 섞기</p>
<p>[코드]</p>
<pre><code class="language-python">np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)

print(index)</code></pre>
<p>[결과]</p>
<pre><code>[13 45 47 44 17 27 26 25 31 19 12  4 34  8  3  6 40 41 46 15  9 16 24 33
 30  0 43 32  5 29 11 36  1 21  2 37 35 23 39 10 22 18 48 20  7 42 14 28
 38]</code></pre><p>&lt;단계 3&gt; 훈련 데이터 세트, 테스트 데이터 세트 나누기</p>
<ul>
<li>훈련 데이터 세트는 35개, 테스트 데이터 세트는 14개</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">train_input = input_arr[index[: 35]]
train_target = target_arr[index[: 35]]

test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

print(train_input.shape)
print(train_target.shape)
print(test_input.shape)
print(test_target.shape)</code></pre>
<p>[결과]</p>
<pre><code>(35, 2)
(35,)
(14, 2)
(14,)</code></pre><h4 id="훈련-데이터-세트-테스트-데이터-세트-분포-확인하기">훈련 데이터 세트, 테스트 데이터 세트 분포 확인하기</h4>
<p>[코드]</p>
<pre><code class="language-python">import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel(&#39;length&#39;)
plt.ylabel(&#39;weight&#39;)
plt.legend((&#39;training dataset&#39;, &#39;test dataset&#39;))
plt.show()</code></pre>
<p>[결과]
<img src="https://images.velog.io/images/robin_dev/post/8d1ba090-5f53-4352-b4e4-3e1fea63ad24/image.png" alt=""></p>
<h4 id="모델-훈련하고-평가하기">모델 훈련하고, 평가하기</h4>
<p>[코드]</p>
<pre><code class="language-python">kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)</code></pre>
<p>[결과]
1.0</p>
<ul>
<li>100%의 정확도로 테스트 세트에 있는 모든 생선을 맞혔다.</li>
</ul>
<h4 id="모델을-이용하여-테스트-데이터-예측하기">모델을 이용하여 테스트 데이터 예측하기</h4>
<p>[코드]</p>
<pre><code class="language-python">kn.predict(test_input)</code></pre>
<p>[결과]
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])</p>
<p>[코드]</p>
<pre><code class="language-python">test_target</code></pre>
<p>[결과]
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])</p>
<ul>
<li>테스트 데이터에 대한 예측 결과가 정답과 모두 일치한다.</li>
</ul>
<br>

<h5 id="--출처-혼자-공부하는-머신러닝딥러닝-박해선">- 출처: 혼자 공부하는 머신러닝+딥러닝 (박해선)</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼자 공부하는 머신러닝 딥러닝] 마켓과 머신러닝]]></title>
            <link>https://velog.io/@robin_dev/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A7%88%EC%BC%93%EA%B3%BC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@robin_dev/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A7%88%EC%BC%93%EA%B3%BC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Mon, 30 Aug 2021 09:58:52 GMT</pubDate>
            <description><![CDATA[<h3 id="k-nn을-이용한-도미와-빙어-분류-모델">K-NN을 이용한 도미와 빙어 분류 모델</h3>
<ul>
<li>도미 35마리와 빙어 14마리의 길이와 무게 데이터를 준비한다. 각 길이와 무게에 대해 도미인지, 빙어인지 정답 데이터를 준비한다. </li>
<li>K-NN을 이용하기 위하여 사이킷런에서 <code>KNeighborsClassifier</code> 클래스의 객체를 생성한다. </li>
<li><code>fit()</code> 메소드로 훈련한다.</li>
<li><code>score()</code> 메소드로 정확도를 확인한다.</li>
<li><code>predict()</code> 메소드로 예측한다. </li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
# 도미 길이, 무게 데이터
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]

# 빙어 길이, 무게 데이터
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

# 도미, 빙어 전체 길이, 무게 데이터
fish_data = [[l, w] for l, w in zip(length, weight)]
# 도미, 빙어 정답 데이터 (도미: 1, 빙어: 0)
fish_target = [1]*35 + [0]*14

# KNeighborsClassifier 객체 생성
kn = KNeighborsClassifier()
# 모델 훈련
kn.fit(fish_data, fish_target)
# 모델 정확도
kn.score(fish_data, fish_target)
# 새로운 데이터 예측
print(kn.predict([[30, 600]]))

# 도미, 빙어, 테스트 데이터 산점도
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.scatter(30, 600, marker=&#39;^&#39;)
plt.xlabel(&#39;length&#39;)
plt.ylabel(&#39;weight&#39;)
plt.legend((&#39;bream&#39;, &#39;smelt&#39;, &#39;test_fish&#39;))
plt.show</code></pre>
<p>[결과]</p>
<p>array([1]) ➡️ 도미로 예측함. </p>
<p><img src="https://images.velog.io/images/robin_dev/post/ffe85a87-cdc2-4b51-9394-a814b8f5daec/image.png" alt=""></p>
<h3 id="키워드">키워드</h3>
<ul>
<li><p><strong>특성(feature)</strong>: 데이터를 표현하는 하나의 성질.
예제에서 생선의 길이, 무게 각각이 특성이 될 수 있음.</p>
</li>
<li><p><strong>훈련(training)</strong>: 머신러닝 알고리즘이 데이터에서 규칙을 찾는 과정을 훈련이라고 함.</p>
<ul>
<li>사이킷런(sklearn)에서 <code>fit()</code>  메소드로 훈련을 시킴. </li>
</ul>
</li>
<li><p><strong>K-최근접 이웃 알고리즘(K-NN: K-Nearest Neighbors)</strong>: 가장 가까운 이웃을 참고하여 정답을 예측하는 머신러닝 알고리즘. 규칙을 찾기보다는 전체 데이터를 메모리에 가지고 있다가 새로운 데이터가 등장하면 가장 가까운 데이터를 참고하여 어디에 분류되는지 예측함.  </p>
<ul>
<li>KNeighborsClassifier는 기본으로 가까운 5개의 데이터를 참고해서 결과를 예측함. 참고할 데이터의 개수는 <code>n_neighbors = n</code> 을 매개변수로 변경할 수 있음. (예: kn = KNeighborsClassifier(n_neighbors = 49))</li>
</ul>
</li>
<li><p><strong>정확도(accuracy)</strong>: 정확한 답을 몇개 맞혔는지 백분율로 나타낸 값. 사이킷런에서는 0~1 사이로 값으로 출력됨.</p>
<p>정확도 = 정확히 맞힌 개수 / 전체 데이터 개수</p>
<ul>
<li>사이킷런에서 <code>score()</code> 메소드로 모델이 잘 훈련되었는지 확인함. </li>
</ul>
</li>
</ul>
<h3 id="추가-문제">추가 문제</h3>
<p>KNeighborsClassifier를 사용할 때 n_neighbors의 기본값인 5부터 49까지 바꿔가면서 점수가 1.0 아래로 내려가기 시작하는 개수를 찾아보세요.</p>
<p>[방법 1] </p>
<p>[코드]</p>
<pre><code class="language-python">from sklearn.neighbors import KNeighborsClassifier

bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]

smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

fish_data = [[l, w] for l, w in zip(length, weight)]
fish_target = [1]*35 + [0]*14

kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)

for n in range(5, 50):
    kn.n_neighbors = n
    score = kn.score(fish_data, fish_target)

    if score &lt; 1:
        print(n, score)
        break
</code></pre>
<p>[결과]
18 0.9795918367346939</p>
<p>[방법 2]</p>
<p>[코드]</p>
<pre><code class="language-python">from sklearn.neighbors import KNeighborsClassifier

bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]

smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

fish_data = [[l, w] for l, w in zip(length, weight)]
fish_target = [1]*35 + [0]*14

for n in range(5, 50):
  kn.n_neighbors = KNeighborsClassifier(n_neighbors = n)
  kn.n_neighbors.fit(fish_data, fish_target)
  score = kn.n_neighbors.score(fish_data, fish_target)

  if score &lt; 1:
    print(n, score)
    break
</code></pre>
<p>[결과]
18 0.9795918367346939</p>
<br>

<h5 id="--출처-혼자-공부하는-머신러닝딥러닝-박해선">- 출처: 혼자 공부하는 머신러닝+딥러닝 (박해선)</h5>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계 이론] z-검정(z-test) ]]></title>
            <link>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84%EC%9D%B4%EB%A1%A0-%ED%91%9C%EC%A4%80%ED%99%94%EC%99%80-z-%EB%B6%84%ED%8F%AC</link>
            <guid>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84%EC%9D%B4%EB%A1%A0-%ED%91%9C%EC%A4%80%ED%99%94%EC%99%80-z-%EB%B6%84%ED%8F%AC</guid>
            <pubDate>Sat, 28 Aug 2021 08:33:03 GMT</pubDate>
            <description><![CDATA[<h3 id="표준화">표준화</h3>
<ul>
<li><p>필요성: 측정하는 단위가 달라서 원점수별 비교가 어려운 문제가 있음. </p>
<p>예) A 테스트는 점수가 0점<del>100점, B 테스트는 점수가 0점</del>80점 일 때 A 테스트에서 80점과 B 테스트에서 80점을 어떻게 비교할 것인가. </p>
</li>
<li><p>원점수(raw score)를 표준점수(standard score)로 변환함. </p>
</li>
</ul>
<h3 id="z-score-z-점수-또는-표준점수">z-score (z-점수 또는 표준점수)</h3>
<ul>
<li>어떤 원점수도 z-점수로 변환할 수 있음.</li>
<li><strong>z-점수는 평균으로부터 몇 <em>SD</em> 큰지, 작은지 나타냄.</strong>
예: z-점수가 1이면 평균보다 1_SD_ 크다. </li>
<li>z-점수가 + 이면 원점수가 평균보다 크다는 것을 의미하고, -이면 원점수가 평균보다 작다는 것을 의미함.</li>
<li>어떤 분포를 가진 점수도 z-점수로 변환할 수 있으며, z-점수로 변환한다고 해서 원점수의 분포가 바뀌지 않음.</li>
<li>정규분포만 z-점수로 변환할 수 있는 것은 아님. 다만, 정규분포에서 z-점수가 유용하게 사용될 수 있음. </li>
</ul>
<p><strong>z-점수 기본 공식</strong></p>
<p>$z = \frac{x – μ}{σ}$</p>
<p><strong>표집분포의 원점수를 z-점수로 표준화하기</strong></p>
<p>$z = \frac{\overline{X} – μ}{\frac{σ}{\sqrt{N}}}$</p>
<ul>
<li>중심극한정리로 인해 $μ<em>{\overline{x}} = μ$, $σ</em>{\overline{x}} = \frac{σ}{\sqrt N}$</li>
</ul>
<h3 id="z-distribution-z-분포">z-distribution (z-분포)</h3>
<ul>
<li>평균은 0, 표준편차는 1인 정규 분포</li>
<li>특정한 값이 평균으로부터 몇 <em>SD</em> 떨어져 있는지 안다면(즉, z-점수를 안다면) 그 값보다 크거나 작은 값을 얻을 확률을 구할 수 있음.
<img src="https://images.velog.io/images/robin_dev/post/52249001-72c6-495f-b02b-e07000ae3f07/image.png" alt=""></li>
</ul>
<p>&lt;예시&gt;</p>
<ul>
<li><p>평균보다 1_SD_ 작은 값보다 작은 값을 얻을 확률은 얼마인가? ➡️ z-점수가 -1인 경우에 그보다 작은 값을 얻을 확률이므로 P = 13.6 + 2.1 + 0.1 = 15.8%</p>
</li>
<li><p>평균보다 1_SD_ 큰 값보다 작은 값을 얻을 확률은 얼마인가? ➡️ z-점수가 1인 경우에 그보다 작은 값을 얻을 확률이므로 P = 34.1 + 34.1 + 13.6 + 2.1 + 0.1 = 84%</p>
</li>
</ul>
<h3 id="z-testz-검정">z-test(z-검정)</h3>
<ul>
<li>z-분포를 이용하여 가설을 검정하는 통계적 방법. </li>
<li>모집단의 평균과 표준편차를 알 수 있어야 함.</li>
<li>표본의 크기가 크거나 (n &gt; 30) 모집단의 정규분포여야 함. </li>
<li>등분산 가정이 충족될 때 사용함. 두 모집단을 비교할 경우 두 모집단의 분산이 같아야 함. </li>
</ul>
<h4 id="1-단일-표본-z-검정-one-sample-z-tset">(1) 단일 표본 z-검정 (one sample z-tset)</h4>
<ul>
<li>모집단을 대표하도록 추출된 표본의 평균을 연구자가 이론적 혹은 경험적으로 얻은 특정한 값과 비교하는 통계적 방법. </li>
</ul>
<p>&lt;예제&gt;
[문제]
백문이불여일타아카데미에서 수년간 파이썬 강의를 통한 파이썬 코딩 평균 점수가 80점이었고 표준편차는 15점이었다. 이번학기에 프로젝트를 활용한 파이썬 수업을 100명의 수강생들에게 실시하였고, 파이썬 코딩 평균 점수는 85점이었다. 새로운 강의 방식에 따른 수강생들의 평균 점수 85점이 80점과 같은지 유의수준 .05에서 검증하라.</p>
<p>[풀이]</p>
<ul>
<li>귀무가설: 새로운 강의 방식에 의한 파이썬 코딩 평균 점수는 80점과 같다.
$\mu = 80$</li>
<li>대립가설: 새로운 강의 방식에 의한 파이썬 코딩 평균 점수는 80점이 아니다.
$\mu ≠  80$</li>
</ul>
<p>z = $\frac{{85} – 80}{\frac{15}{\sqrt{100}}}$ = 3.33</p>
<p>유의수준 .05에서 기각값은 $\pm$ 1.96이다. </p>
<p>새로운 강의 방식에 의한 파이썬 코딩 평균 점수 85점의 z-점수는 3.33이어서 1.96보다 크기 때문에 귀무가설을 기각한다. </p>
<p>따라서 유의수준 .05에서 새로운 강의 방식에 의한 파이썬 코딩 평균 점수는 80점이 아니다. </p>
<h4 id="2-독립-표본-z-검정-independent-sample-z-tset">(2) 독립 표본 z-검정 (independent sample z-tset)</h4>
<ul>
<li>두 모집단의 평균을 비교하기 위해서 각 모집단을 대표하도록 추출된 독립적인 두 표본을 비교하여 두 모집단을 비교하는 통계적 방법.</li>
<li>두 모집단의 분산이 동일하다는 것을 이론적 혹은 경험적 배경을 통해 알고 있어야 함. </li>
</ul>
<p><strong>z-score 공식</strong></p>
<p>$z = \frac{(\overline{X_{1}} - \overline{X_{2}}) - (\mu_{1} - \mu_{2})}{\sqrt{
\frac{\sigma_{1}^{2}}{n_{1}} + \frac{\sigma_{2}^{2}}{n_{2}}}}$</p>
<p>&lt;예제&gt;
[문제]
전국 30세 남녀 각각 100명을 무작위 추출하여 체중을 측정했다. 남성의 체중 평균은 68kg, 여성의 체중 평균은 60kg였다. 연구자는 이론적 배경에 의해 30세 남성 모집단의 체중 표준편차는 10kg이고 여성 모집단의 체중 표준편차는 9kg임을 알고 있다. 30세 성인 남녀의 체중에 차이가 있는지 여부를 유의수준 .05 수준에서 검정하라. </p>
<p>[풀이]</p>
<ul>
<li>귀무가설: 30세 성인 남녀 체중에는 차이가 없다.
$\mu_{1} = \mu_{2}$</li>
<li>대립가설: 30세 성인 남녀 체중에는 차이가 있다.
$\mu_{1} ≠ \mu_{2}$</li>
</ul>
<p>$z = \frac{({68} - {60}) - (0 - 0)}{\sqrt{
\frac{10^{2}}{100} + \frac{9^{2}}{100}}}$ = 5.95</p>
<p>유의수준 .05에서 기각값은 $\pm$ 1.96이다.</p>
<p>30세 성인 남녀의 체중 비교를 위한 z-점수는 5.95여서 +1.96보다 크기 때문에 귀무가설이 기각된다. </p>
<p>따라서 유의수준 .05에서 30세 성인 남녀의 체중은 통계적으로 유의미한 차이가 있다. </p>
<p>참고: </p>
<ul>
<li>현대기초통계학 (성태제 저)</li>
<li><a href="https://sphweb.bumc.bu.edu/otlt/MPH-Modules/PH717-QuantCore/PH717-Module6-RandomError/PH717-Module6-RandomError5.html">https://sphweb.bumc.bu.edu/otlt/MPH-Modules/PH717-QuantCore/PH717-Module6-RandomError/PH717-Module6-RandomError5.html</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python 통계 실습] 일원 분산 분석(one-way ANOVA)]]></title>
            <link>https://velog.io/@robin_dev/Python-%ED%86%B5%EA%B3%84-%EC%8B%A4%EC%8A%B5-%EC%9D%BC%EC%9B%90-%EB%B6%84%EC%82%B0-%EB%B6%84%EC%84%9D-one-way-ANOVA</link>
            <guid>https://velog.io/@robin_dev/Python-%ED%86%B5%EA%B3%84-%EC%8B%A4%EC%8A%B5-%EC%9D%BC%EC%9B%90-%EB%B6%84%EC%82%B0-%EB%B6%84%EC%84%9D-one-way-ANOVA</guid>
            <pubDate>Mon, 23 Aug 2021 06:30:20 GMT</pubDate>
            <description><![CDATA[<h3 id="일원-분산-분석-절차">일원 분산 분석 절차</h3>
<p><strong>1) 집단의 등분산성 검정</strong></p>
<ul>
<li>Levene&#39;s test</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">import pingouin as pg
pg.homoscedasticity(dv = &#39;score&#39;, group = &#39;school&#39;, data = schools_df)</code></pre>
<p>[결과 판별]</p>
<ul>
<li><em>p</em> &lt; .05 : 모든 집단의 분산이 같지 않다.</li>
<li><em>p</em> &gt; .05 : 모든 집단의 분산이 같다.</li>
</ul>
<p><strong>2) 일원 분산 분석</strong></p>
<ul>
<li>등분산성 가정을 충족하면 ANOVA</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.anova(dv = &#39;score&#39;, between = &#39;school&#39;, data = schools_df, detailed=True)</code></pre>
<ul>
<li>등분산성 가정을 충족하지 않으면 Welch&#39;s ANOVA</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.welch_anova(dv = &#39;score&#39;, between = &#39;school&#39;, data = schools_df)</code></pre>
<p>[결과 판별]</p>
<ul>
<li><em>p</em> &lt; .05 : 모든 집단의 평균이 같지 않다. ➡️ <strong>사후 검정을 진행한다.</strong></li>
<li><em>p</em> &gt; .05 : 모든 집단의 평균이 같다. ➡️ <strong>사후 검정을 진행하지 않는다.</strong></li>
</ul>
<p><strong>3) 사후 검정</strong></p>
<ul>
<li>등분산성 가정을 충족하면 Tukey&#39;s test</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.pairwise_tukey(dv = &#39;score&#39;, between = &#39;school&#39;, data = schools_df)</code></pre>
<ul>
<li>등분산성 가정을 충족하지 않으면 Games Howell&#39;s test</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.pairwise_gameshowell(dv = &#39;score&#39;, between = &#39;school&#39;, data = schools_df)</code></pre>
<p>[결과 판별]</p>
<ul>
<li><em>p</em> &lt; .05 : 집단 간 평균 차이가 있다.</li>
<li><em>p</em> &gt; .05 : 집단 간 평균 차이가 없다. </li>
</ul>
<br>

<h3 id="실습">[실습]</h3>
<h3 id="0-데이터-준비">0. 데이터 준비</h3>
<ul>
<li>데이터 셋: 캐글 경매 데이터
<a href="https://www.kaggle.com/onlineauctions/online-auctions-dataset">https://www.kaggle.com/onlineauctions/online-auctions-dataset</a></li>
</ul>
<h3 id="데이터-불러오기">데이터 불러오기</h3>
<p>[코드]</p>
<pre><code class="language-python">import pandas as pd
import pingouin as pg

auction = pd.read_csv(&#39;auction.csv&#39;)

print(auction.shape)
print(auction.head(3))
print(auction.tail(3))</code></pre>
<p>[결과]</p>
<p>auction.shape: 
(10681, 9)</p>
<p>auction.head(3):
<img src="https://images.velog.io/images/robin_dev/post/4a9191c6-9ca8-498d-be58-1eb29ebde7e5/image.png" alt=""></p>
<p>auction.tail(3):
<img src="https://images.velog.io/images/robin_dev/post/9f1ed60e-c075-4947-9a2c-ca6ceadd87a4/image.png" alt=""></p>
<h3 id="1-등분산성homoscedasticity-검정">1. 등분산성(homoscedasticity) 검정</h3>
<ul>
<li>Levene&#39;s test<ul>
<li>귀무가설: 모든 집단의 분산이 같다. </li>
<li>if <em>p</em>-value &lt; .05: 귀무가설 기각 성공. 모든 집단의 분산이 같지 않다. ➡️ <strong>pg.welch_anova</strong> 사용</li>
<li>if <em>p</em>-value &gt; .05: 귀무가설 기각 실패. 모든 집단의 분산이 같다. ➡️ <strong>pg.anova</strong> 사용</li>
</ul>
</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.homoscedasticity(dv = &#39;openbid&#39;, group = &#39;item&#39;, data = auction)</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th></th>
<th>W</th>
<th>pval</th>
<th>equal_var</th>
</tr>
</thead>
<tbody><tr>
<td>levene</td>
<td>471.159381</td>
<td>8.101034e-197</td>
<td>False</td>
</tr>
</tbody></table>
<ul>
<li>Levene&#39;s test를 이용하여 등분산성을 검정한 결과 등분산성 가정을 만족하지 않았다, <em>p</em> &lt; .05.</li>
</ul>
<h3 id="2-일원-분산-분석-one-way-anova">2. 일원 분산 분석 (one-way ANOVA)</h3>
<h4 id="분석-목적">분석 목적</h4>
<p>: item별 평균 open bid가 통계적으로 유의미하게 차이나는지 알아보고자 함. </p>
<h4 id="1--각-그룹의-평균과-표준편차">(1)  각 그룹의 평균과 표준편차</h4>
<p>[코드]</p>
<pre><code class="language-python">watch = auction[auction[&#39;item&#39;]==&#39;Cartier wristwatch&#39;][&#39;openbid&#39;]
PDA = auction[auction[&#39;item&#39;]==&#39;Palm Pilot M515 PDA&#39;][&#39;openbid&#39;]
console = auction[auction[&#39;item&#39;]==&#39;Xbox game console&#39;][&#39;openbid&#39;]

print(&#39;watch 평균 가격:&#39;, watch.mean(), &#39;watch 표준 편차:&#39;, watch.std())
print(&#39;PDA 평균 가격:&#39;, PDA.mean(), &#39;PDA 표준 편차:&#39;, PDA.std())
print(&#39;console 평균 가격:&#39;, console.mean(), &#39;console 표준 편차:&#39;, console.std())</code></pre>
<p>[결과]
watch 평균 가격: 153.44
watch 표준 편차: 360.69</p>
<p>PDA 평균 가격: 31.56
PDA 표준 편차: 60.37</p>
<p>console 평균 가격: 25.48
console 표준 편차: 32.68</p>
<h4 id="2-일원-분산-분석-one-way-anova-1">(2) 일원 분산 분석 (one-way ANOVA)</h4>
<ul>
<li>등분산가정을 만족하지 않으므로 Welch&#39;s ANOVA를 이용함.</li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.welch_anova(dv = &#39;openbid&#39;, between = &#39;item&#39;, data = auction)</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th></th>
<th align="right">Source</th>
<th align="right">ddof1</th>
<th align="right">ddof2</th>
<th align="right">F</th>
<th align="right">p-unc</th>
<th>np2</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td align="right">item</td>
<td align="right">2</td>
<td align="right">4259.671584</td>
<td align="right">136.580677</td>
<td align="right">3.221606e-58</td>
<td>0.080984</td>
</tr>
</tbody></table>
<ul>
<li>세 item간 평균 open bid의 차이가 유의미한지 알아보기 위하여 일원 분산 분석을 하였다. 그 결과, <em>p</em>-value가 .05 보다 작기 때문에 집단 간 평균 open bid 차이가 통계적으로 유의미하였다. </li>
</ul>
<h3 id="3-사후-검정">3. 사후 검정</h3>
<ul>
<li>집단 간 open bid 평균 차이가 어디서 발생하는지 알아보기 위하여 사후 검정을 실시함. 등분산가정을 만족하지 않기 때문에 Games Howell 검정을 이용하여 사후 검정을 실시함. </li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.pairwise_gameshowell(dv = &#39;openbid&#39;, between = &#39;item&#39;, data = auction)</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th></th>
<th align="right">A</th>
<th align="right">B</th>
<th align="right">mean(A)</th>
<th align="right">mean(B)</th>
<th align="right">diff</th>
<th align="right">se</th>
<th align="right">T</th>
<th align="right">df</th>
<th align="right">pval</th>
<th align="right">hedges</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td align="right">Cartier wristwatch</td>
<td align="right">Palm Pilot M515 PDA</td>
<td align="right">153.437184</td>
<td align="right">31.560857</td>
<td align="right">121.876327</td>
<td align="right">8.199491</td>
<td align="right">14.863889</td>
<td align="right">1988.208564</td>
<td align="right">0.001</td>
<td align="right">0.387861</td>
</tr>
<tr>
<td>1</td>
<td align="right">Cartier wristwatch</td>
<td align="right">Xbox game console</td>
<td align="right">153.437184</td>
<td align="right">25.483404</td>
<td align="right">127.953779</td>
<td align="right">8.185081</td>
<td align="right">15.632562</td>
<td align="right">1974.279546</td>
<td align="right">0.001</td>
<td align="right">0.460433</td>
</tr>
<tr>
<td>2</td>
<td align="right">Palm Pilot M515 PDA</td>
<td align="right">Xbox game console</td>
<td align="right">31.560857</td>
<td align="right">25.483404</td>
<td align="right">6.077452</td>
<td align="right">0.997896</td>
<td align="right">6.090267</td>
<td align="right">8587.124045</td>
<td align="right">0.001</td>
<td align="right">0.139500</td>
</tr>
</tbody></table>
<ul>
<li>Games Howell 검정을 이용하여 사후 분석을 실시한 결과, watch와 PDA 사이, watch와 console 사이, 그리고 PDA와 console 사이 평균 open bid 차이가 통계적으로 유의미하였다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] SQL 고득점 Kit - JOIN]]></title>
            <link>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-JOIN</link>
            <guid>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-JOIN</guid>
            <pubDate>Sat, 21 Aug 2021 11:21:09 GMT</pubDate>
            <description><![CDATA[<h3 id="animal_ins-테이블">ANIMAL_INS 테이블</h3>
<p>ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th align="center">NAME</th>
<th align="center">TYPE</th>
<th align="center">NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td align="center">ANIMAL_ID</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">ANIMAL_TYPE</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">DATETIME</td>
<td align="center">DATETIME</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">INTAKE_CONDITION</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">NAME</td>
<td align="center">VARCHAR(N)</td>
<td align="center">TRUE</td>
</tr>
<tr>
<td align="center">SEX_UPON_INTAKE</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
</tbody></table>
<h3 id="animal_outs-테이블">ANIMAL_OUTS 테이블</h3>
<p>ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.</p>
<table>
<thead>
<tr>
<th align="center">NAME</th>
<th align="center">TYPE</th>
<th align="center">NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td align="center">ANIMAL_ID</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">ANIMAL_TYPE</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">DATETIME</td>
<td align="center">DATETIME</td>
<td align="center">FALSE</td>
</tr>
<tr>
<td align="center">NAME</td>
<td align="center">VARCHAR(N)</td>
<td align="center">TRUE</td>
</tr>
<tr>
<td align="center">SEX_UPON_OUTCOME</td>
<td align="center">VARCHAR(N)</td>
<td align="center">FALSE</td>
</tr>
</tbody></table>
<h3 id="없어진-기록-찾기">없어진 기록 찾기</h3>
<h4 id="문제">문제</h4>
<p>천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요. </p>
<h4 id="솔루션">솔루션</h4>
<p>[방법1] LEFT JOIN</p>
<pre><code class="language-sql">SELECT o.animal_id
      , o.name
FROM animal_outs AS o 
LEFT JOIN animal_ins AS i ON o.animal_id = i.animal_id
WHERE i.animal_id IS NULL</code></pre>
<p>[방법2] 서브쿼리</p>
<pre><code class="language-sql">SELECT animal_id
      , name
FROM animal_outs 
WHERE animal_id NOT IN (SELECT animal_id FROM animal_ins)</code></pre>
<h3 id="있었는데요-없었습니다">있었는데요 없었습니다</h3>
<h4 id="문제-1">문제</h4>
<p>관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.</p>
<h4 id="솔루션-1">솔루션</h4>
<pre><code class="language-sql">SELECT i.animal_id
     , i.name
FROM animal_ins AS i
INNER JOIN animal_outs AS o ON i.animal_id = o.animal_id
WHERE i.datetime &gt; o.datetime
ORDER BY i.datetime </code></pre>
<h3 id="오랜-기간-보호한-동물-1">오랜 기간 보호한 동물 (1)</h3>
<h4 id="문제-2">문제</h4>
<p>아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.</p>
<h4 id="솔루션-2">솔루션</h4>
<p>[방법1] LEFT JOIN</p>
<pre><code class="language-sql">SELECT i.name
     , i.datetime
FROM animal_ins AS i
LEFT JOIN animal_outs AS o ON i.animal_id = o.animal_id
WHERE o.animal_id IS NULL
ORDER BY i.datetime
LIMIT 3</code></pre>
<p>[방법2] 서브쿼리</p>
<pre><code class="language-sql">SELECT name
     , datetime
FROM animal_ins 
WHERE animal_id NOT IN (SELECT animal_id FROM animal_outs)
ORDER BY datetime
LIMIT 3</code></pre>
<h3 id="보호소에서-중성화한-동물">보호소에서 중성화한 동물</h3>
<h4 id="문제-3">문제</h4>
<p>보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요. 중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다. </p>
<h4 id="솔루션-3">솔루션</h4>
<p>[방법 1] NOT LIKE</p>
<pre><code class="language-sql">SELECT i.animal_id
     , i.animal_type
     , i.name
FROM animal_ins AS i
INNER JOIN animal_outs AS o ON i.animal_id = o.animal_id
WHERE (i.sex_upon_intake LIKE &#39;Intact%&#39;) AND (o.sex_upon_outcome LIKE &#39;Spayed%&#39; OR o.sex_upon_outcome LIKE &#39;Neutered%&#39;)
ORDER BY i.animal_id</code></pre>
<p>⚠️ 주의: WHERE절에 AND와 OR를 같이 사용할 경우, ()를 통해 AND에 해당하는 조건과 OR에 해당하는 조건을 잘 구분해야함.</p>
<p>⚠️ 한계점: 만약 WHERE절에 column에 들어가는 문자열 조건이 추가된다면 해당 코드처럼 AND나 OR로 연결하다보면 코드가 길어질 가능성이 있음. 그런 경우, 정규표현식을 사용하는 것이 더 가독성이 좋고, 효율적일 수 있음. </p>
<p>[방법 2] 정규표현식</p>
<pre><code class="language-sql">SELECT i.animal_id
     , i.animal_type
     , i.name
FROM animal_ins AS i
INNER JOIN animal_outs AS o ON i.animal_id = o.animal_id
WHERE i.sex_upon_intake REGEXP &#39;^(Intact)&#39; AND o.sex_upon_outcome REGEXP &#39;^(Spayed|Neutered)&#39;
ORDER BY i.animal_id </code></pre>
<ul>
<li>^(Intact) : Intact로 시작되는 것을 매칭함.</li>
<li>^(Spayed|Neutered): Spayed 혹은 Neutered로 시작되는 것을 매칭함.</li>
</ul>
<p>참고: </p>
<ul>
<li>MySQL 정규표현식 문법:
<a href="https://dev.mysql.com/doc/refman/8.0/en/regexp.html">https://dev.mysql.com/doc/refman/8.0/en/regexp.html</a></li>
<li>정규표현식 튜토리얼: <a href="https://regexone.com/lesson/introduction_abcs">https://regexone.com/lesson/introduction_abcs</a></li>
<li>정규표현식 테스트 사이트: <a href="https://regexr.com/">https://regexr.com/</a></li>
</ul>
<br>

<p>출처: </p>
<ul>
<li>문제 풀이 <a href="https://programmers.co.kr/learn/challenges">https://programmers.co.kr/learn/challenges</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 집계 함수 문제 풀이]]></title>
            <link>https://velog.io/@robin_dev/SQL-%EC%A7%91%EA%B3%84-%ED%95%A8%EC%88%98-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@robin_dev/SQL-%EC%A7%91%EA%B3%84-%ED%95%A8%EC%88%98-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Wed, 18 Aug 2021 15:14:38 GMT</pubDate>
            <description><![CDATA[<h3 id="집계-함수-문제-풀이">집계 함수 문제 풀이</h3>
<h4 id="예제-hackerrank-revising-aggregations---the-count-function">&lt;예제&gt; HackerRank: Revising Aggregations - The Count Function</h4>
<p>[문제]</p>
<p>Query a count of the number of cities in CITY having a Population larger than 100,000.
<img src="https://images.velog.io/images/robin_dev/post/196ffafb-1bb8-43ad-9d3d-02fbe4e29ab2/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT COUNT(*)
FROM city
WHERE population &gt; 100000;</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/revising-aggregations-the-count-function/problem">https://www.hackerrank.com/challenges/revising-aggregations-the-count-function/problem</a></p>
<h4 id="예제-hackerrank-revising-aggregations---averages">&lt;예제&gt; HackerRank: Revising Aggregations - Averages</h4>
<p>[문제]</p>
<p>Query the average population of all cities in CITY where District is California.
<img src="https://images.velog.io/images/robin_dev/post/1e7d31e1-a283-4f2d-8e80-3cab5ce437fe/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT AVG(population)
FROM city
WHERE district = &#39;California&#39;;</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/revising-aggregations-the-average-function/problem">https://www.hackerrank.com/challenges/revising-aggregations-the-average-function/problem</a></p>
<h4 id="예제-hackerrank-average-population">&lt;예제&gt; HackerRank: Average Population</h4>
<p>[문제]</p>
<p>Query the average population for all cities in CITY, rounded down to the nearest integer.
<img src="https://images.velog.io/images/robin_dev/post/c33e2b80-498e-48e0-a517-bb0f9840ecbb/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT FLOOR(AVG(population))
FROM city;</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/average-population/problem">https://www.hackerrank.com/challenges/average-population/problem</a></p>
<h4 id="예제-hackerrank-revising-aggregations---the-sum-function">&lt;예제&gt; HackerRank: Revising Aggregations - The Sum Function</h4>
<p>[문제]
Query the total population of all cities in CITY where District is California.
<img src="https://images.velog.io/images/robin_dev/post/12561519-2de5-4efd-aa95-2e35c345d7a3/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT SUM(population)
FROM city
WHERE district = &#39;California&#39;;</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/revising-aggregations-sum/problem">https://www.hackerrank.com/challenges/revising-aggregations-sum/problem</a></p>
<h4 id="예제-hackerrank-weather-observation-station-15">&lt;예제&gt; HackerRank: Weather Observation Station 15</h4>
<p>[문제]</p>
<p>Query the Western Longitude (LONG_W) for the largest Northern Latitude (LAT_N) in STATION that is less than 137.2345. Round your answer to  decimal places.</p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT ROUND(LONG_W, 4)
FROM station
WHERE LAT_N = (SELECT MAX(LAT_N) FROM station WHERE LAT_N &lt; 137.2345)</code></pre>
<blockquote>
<p>⚠️ <strong>주의점</strong>: WHERE절에 바로 집계함수 사용할 수 없음. GROUP BY 하고 HAVING에 집계함수를 쓰거나 아니면 WHERE절의 서브쿼리에 집계함수를 사용할 수 있음.</p>
</blockquote>
<p>출처: <a href="https://www.hackerrank.com/challenges/weather-observation-station-15/problem">https://www.hackerrank.com/challenges/weather-observation-station-15/problem</a></p>
<h4 id="예제-testdome-regional-sales-comparison">&lt;예제&gt; TestDome: Regional Sales Comparison</h4>
<p>[문제]</p>
<p>An insurance company maintains records of sales made by its employees. Each employee is assigned to a state. States are grouped under regions. The following tables contain the data:</p>
<pre><code>TABLE regions
  id INTEGER PRIMARY KEY
  name VARCHAR(50) NOT NULL

TABLE states
  id INTEGER PRIMARY KEY
  name VARCHAR(50) NOT NULL
  regionId INTEGER NOT NULL REFERENCES regions(id)

TABLE employees
  id INTEGER PRIMARY KEY
  name VARCHAR(50) NOT NULL
  stateId INTEGER NOT NULL REFERENCES states(id)

TABLE sales
  id INTEGER PRIMARY KEY
  amount INTEGER NOT NULL
  employeeId INTEGER NOT NULL REFERENCES employees(id)  </code></pre><p>Management requires a comparative region sales analysis report.</p>
<p>Write a query that returns:</p>
<ul>
<li>The region name.</li>
<li>Average sales per employee for the region (Average sales = Total sales made for the region / Number of employees in the region).</li>
<li>The difference between the average sales of the region with the highest average sales, and the average sales per employee for the region (average sales to be calculated as explained above).</li>
</ul>
<p>A region with no sales should be also returned. Use 0 for average sales per employee for such a region when calculating the 2nd and the 3rd column.</p>
<p>[풀이]</p>
<pre><code class="language-sql">WITH c AS (SELECT r.name AS regionName
      ,(CASE WHEN SUM(s.amount) IS NOT NULL THEN SUM(s.amount) / COUNT(DISTINCT e.id) ELSE 0 END) AS averageSales
FROM regions AS r
LEFT JOIN states AS st ON r.id = st.regionId
LEFT JOIN employees AS e ON st.id = e.stateId
LEFT JOIN sales AS s ON e.id = s.employeeId
GROUP BY r.name)
SELECT regionName
      , averageSales
      , (SELECT MAX(averageSales) FROM c) - averageSales AS difference
FROM c</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="center">regionName</th>
<th align="center">averageSales</th>
<th align="center">difference</th>
</tr>
</thead>
<tbody><tr>
<td align="center">East</td>
<td align="center">1200</td>
<td align="center">2800</td>
</tr>
<tr>
<td align="center">Midwest</td>
<td align="center">0</td>
<td align="center">4000</td>
</tr>
<tr>
<td align="center">North</td>
<td align="center">2500</td>
<td align="center">1500</td>
</tr>
<tr>
<td align="center">South</td>
<td align="center">4000</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">West</td>
<td align="center">2400</td>
<td align="center">1600</td>
</tr>
</tbody></table>
<p>&lt;주의할 점&gt;</p>
<ul>
<li>Average sales = Total sales made for the region / Number of employees in the region 으로 정의된다. *<em>AVG 함수를 사용하면 안되고 지역의 sales의 총합을 구하고 해당 지역의 총 직원 수로 나눠야 한다. 직원의 경우, 중복되어 나타날 수 있기 때문에 직원 수를 셀 때 COUNT DISTINCT를 사용해야 한다. *</em></li>
<li>전체 지역 중 averageSales의 최댓값에서 각 지역의 averageSales를 뺀 값을 구해야한다. 이를 위해 CTE에 averageSales를 컬럼을 만들어 두고, 참조하여 사용한다.  </li>
<li>average sales의 최댓값을 구할 때는 SELECT내에 다시 SELECT를 사용해서 SELECT MAX(averageSales) FROM c 으로 가져와야 한다. 만약 SELECT 내에 다시 SELECT를 사용하지 않고, MAX(averageSales)를 바로 사용한다면 결과가 하나의 row로 리턴된다. </li>
</ul>
<p><strong>** 참고</strong>
[코드]</p>
<pre><code class="language-sql">WITH c AS (SELECT r.name AS regionName
      ,(CASE WHEN SUM(s.amount) IS NOT NULL THEN SUM(s.amount) / COUNT(DISTINCT e.id) ELSE 0 END) AS averageSales
FROM regions AS r
LEFT JOIN states AS st ON r.id = st.regionId
LEFT JOIN employees AS e ON st.id = e.stateId
LEFT JOIN sales AS s ON e.id = s.employeeId
GROUP BY r.name)
SELECT regionName
      , averageSales
      , MAX(averageSales) - averageSales AS difference
FROM c</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="center">regionName</th>
<th align="center">averageSales</th>
<th align="center">difference</th>
</tr>
</thead>
<tbody><tr>
<td align="center">South</td>
<td align="center">4000</td>
<td align="center">0</td>
</tr>
</tbody></table>
<p>출처: <a href="https://www.testdome.com/questions/sql/regional-sales-comparison/36141">https://www.testdome.com/questions/sql/regional-sales-comparison/36141</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 집계 함수 개념 정리]]></title>
            <link>https://velog.io/@robin_dev/SQL-%EC%A7%91%EA%B3%84-%ED%95%A8%EC%88%98-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@robin_dev/SQL-%EC%A7%91%EA%B3%84-%ED%95%A8%EC%88%98-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 18 Aug 2021 13:02:19 GMT</pubDate>
            <description><![CDATA[<h2 id="집계-함수">집계 함수</h2>
<ul>
<li><p>집계 함수는 값들의 집합을 계산해서 하나의 값을 리턴하는 함수임. </p>
</li>
<li><p><strong>COUNT(*)를 제외하고, 집계 함수는 NULL 값을 무시함.</strong></p>
</li>
<li><p>집계 함수는 자주 SELECT문에서 <strong>GROUP BY절</strong>과 함께 사용됨. </p>
</li>
<li><p><strong>WHERE절에 바로 집계함수 사용할 수 없음. GROUP BY를 하고 HAVING절에 집계함수를 쓰거나 WHERE절에 서브쿼리에서 집계함수를 사용할 수 있음.</strong>
&lt;예시&gt;</p>
<pre><code class="language-sql"> 잘못된 사용

 SELECT math_score
 FROM scores
 WHERE english_score = MIN(english_score)</code></pre>
</li>
</ul>
<pre><code class="language-sql">   올바른 사용

   SELECT math_score
   FROM scores
   WHERE english_score = (SELECT MIN(english_score) FROM scores)</code></pre>
<h4 id="1-count">1) COUNT</h4>
<ul>
<li>특정한 기준을 충족하는 rows의 수 리턴함.</li>
<li><em>*COUNT(</em>)를 제외하고 NULL 값은 세지 않음. **</li>
</ul>
<p>[기본 코드]</p>
<pre><code class="language-sql">SELECT COUNT(column_name)
FROM table_name
WHERE condition</code></pre>
<p>&lt;예시&gt;</p>
<p>[테이블 생성 및 값 삽입]</p>
<pre><code class="language-sql">CREATE TABLE Customers(Id integer, Name varchar(100), Visits integer);
INSERT INTO Customers(Id, Name, Visits) values(1, &quot;Amy&quot;, 1), (2, &quot;Amy&quot;, 2), (3, &quot;Jake&quot;, 3), (4, &quot;Terry&quot;, 5), (5, NULL, NULL);</code></pre>
<p>Table: Customers</p>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Visits</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Amy</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>Amy</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>Jake</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>Terry</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>NULL</td>
<td>NULL</td>
</tr>
</tbody></table>
<p>[코드] </p>
<pre><code class="language-sql">SELECT COUNT(*) 
FROM Customers</code></pre>
<p>[결과]
5</p>
<ul>
<li>설명: 모든 rows의 수를 세서 총 5를 리턴함. </li>
</ul>
<p>[코드]</p>
<pre><code class="language-sql">SELECT COUNT(Name)
FROM Customers</code></pre>
<p>[결과]</p>
<p>4</p>
<ul>
<li>설명: 이름 중 Amy, Amy, Jake, Terry 를 세서 총 4를 리턴함. (이름에서 NULL 값 제외함.)</li>
</ul>
<p>[코드]</p>
<pre><code class="language-sql">SELECT COUNT(DISTINCT Name)
FROM Customers</code></pre>
<p>[결과]
3</p>
<ul>
<li>설명: 이름 중 중복되는 이름을 제거하여 Amy, Jake, Terry를 세서 총 3을 리턴함. (이름에서 NULL값 제외함.)</li>
</ul>
<h4 id="2-avg">2) AVG</h4>
<ul>
<li>숫자형 column의 평균값을 리턴함.</li>
<li>** NULL 값은 제외됨. **</li>
<li><strong>NULL 값을 데이터에서 제외하고 평균을 구하려면 AVG 쓰면 됨. 그러나 NULL 값을 포함해서 평균을 구하려면 SUM으로 총합을 구하고 COUNT(*)로 나눠야함.</strong> </li>
</ul>
<p>[기본 코드]</p>
<pre><code class="language-sql">SELECT AVG(column_name)
FROM table_name
WHERE condition</code></pre>
<p>&lt;예시&gt;
Table: Customers</p>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Visits</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Amy</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>Amy</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>Jake</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>Terry</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>NULL</td>
<td>NULL</td>
</tr>
</tbody></table>
<h5 id="null값을-제외하고-평균을-구하는-경우">NULL값을 제외하고 평균을 구하는 경우</h5>
<p>[코드]</p>
<pre><code class="language-sql">SELECT AVG(Visits)
FROM Customers</code></pre>
<p>[결과]
2.75 </p>
<ul>
<li>설명: (1+2+3+5)/4 = 2.75</li>
</ul>
<h5 id="null값을-포함하여-평균을-구하는-경우">NULL값을 포함하여 평균을 구하는 경우</h5>
<p>[코드]</p>
<pre><code class="language-sql">SELECT SUM(Visits) / COUNT(*)
FROM Customers</code></pre>
<p>[결과]
2.2</p>
<ul>
<li>설명: (1+2+3+5)/5 = 2.2</li>
</ul>
<h4 id="3-sum">3) SUM</h4>
<ul>
<li>숫자형 column의 총합을 리턴함.</li>
<li>*<em>NULL 값은 제외됨. *</em></li>
</ul>
<p>[기본 코드]</p>
<pre><code class="language-sql">SELECT SUM(column_name)
FROM table_name
WHERE condition</code></pre>
<p>&lt;예시&gt;
Table: Customers</p>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Visits</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Amy</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>Amy</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>Jake</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>Terry</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>NULL</td>
<td>NULL</td>
</tr>
</tbody></table>
<p>[코드]</p>
<pre><code class="language-sql">SELECT SUM(visits)
FROM Customers</code></pre>
<p>[결과]
11</p>
<ul>
<li>설명: 1+2+3+5 = 11</li>
</ul>
<h4 id="4-min">4) MIN</h4>
<ul>
<li>선택한 column의 가장 작은 값을 리턴함.</li>
</ul>
<p>[기본 코드]</p>
<pre><code class="language-sql">SELECT MIN(column_name)
FROM table_name
WHERE condition</code></pre>
<p>&lt;예시&gt;
Table: Customers</p>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Visits</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Amy</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>Amy</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>Jake</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>Terry</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>NULL</td>
<td>NULL</td>
</tr>
</tbody></table>
<p>[코드]</p>
<pre><code class="language-sql">SELECT MIN(visits)
FROM Customers</code></pre>
<p>[결과]
1</p>
<h4 id="5-max">5) MAX</h4>
<ul>
<li>선택한 column의 가장 큰 값을 리턴함.</li>
</ul>
<p>[기본 코드]</p>
<pre><code class="language-sql">SELECT MAX(column_name)
FROM table_name
WHERE condition</code></pre>
<p>&lt;예시&gt;
Table: Customers</p>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Visits</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Amy</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>Amy</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>Jake</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>Terry</td>
<td>5</td>
</tr>
<tr>
<td>5</td>
<td>NULL</td>
<td>NULL</td>
</tr>
</tbody></table>
<p>[코드]</p>
<pre><code class="language-sql">SELECT MAX(visits)
FROM Customers</code></pre>
<p>[결과]
5</p>
<p>참고: 
<a href="https://www.w3schools.com/sql/sql_count_avg_sum.asp">https://www.w3schools.com/sql/sql_count_avg_sum.asp</a>
<a href="https://www.w3schools.com/sql/sql_min_max.asp">https://www.w3schools.com/sql/sql_min_max.asp</a>
<a href="https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15">https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python 통계 실습] t-검정(t-test)]]></title>
            <link>https://velog.io/@robin_dev/Python-%ED%86%B5%EA%B3%84-%EC%8B%A4%EC%8A%B5-t-%EA%B2%80%EC%A0%95</link>
            <guid>https://velog.io/@robin_dev/Python-%ED%86%B5%EA%B3%84-%EC%8B%A4%EC%8A%B5-t-%EA%B2%80%EC%A0%95</guid>
            <pubDate>Tue, 17 Aug 2021 02:45:27 GMT</pubDate>
            <description><![CDATA[<h3 id="0-데이터-준비">0. 데이터 준비</h3>
<ul>
<li>데이터 셋: 캐글 중고차 데이터
<a href="https://www.kaggle.com/austinreese/craigslist-carstrucks-data">https://www.kaggle.com/austinreese/craigslist-carstrucks-data</a></li>
</ul>
<h4 id="데이터-불러오기">데이터 불러오기</h4>
<p>[코드]</p>
<pre><code class="language-python">import pandas as pd
import scipy.stats as stats 
import pingouin as pg

vehicles = pd.read_csv(&#39;vehicles.csv&#39;) # csv 파일을 dataframe으로 읽어옴. 

print(vehicles.shape) # dataframe의 차원 확인함.
print(vehicles.head(3)) # dataframe의 처음 3개 열을 리턴함.
print(vehicles.tail(3)) # dataframe의 마지막 3개 열을 리턴함.</code></pre>
<p>[결과]</p>
<p>vehicles.shape:</p>
<p>(426880, 26)</p>
<p>vehicles.head(3):
<img src="https://images.velog.io/images/robin_dev/post/1f5d6bbb-40ac-48c4-a505-320e9cc21f9d/image.png" alt=""></p>
<p>vehicles.tail(3):
<img src="https://images.velog.io/images/robin_dev/post/f40e2262-4e7a-4a61-aad8-6476cf59a801/image.png" alt=""></p>
<h4 id="데이터-전처리하기">데이터 전처리하기</h4>
<ul>
<li>가격이 0인 데이터들을 결측치로 판단하여 제거함.</li>
<li>가격의 z-score가 3이상인 데이터를 이상치로 판단하여 제거함. </li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">vehicles = vehicles[vehicles[&#39;price&#39;] != 0]
# vehicles의 가격이 0인 rows를 제거함.
vehicles = vehicles.reset_index(drop=True)
# vehicles의 index를 재정렬함.

vehicles = vehicles[(np.abs(stats.zscore(vehicles[&#39;price&#39;])) &lt; 3)]
# vehicles의 가격의 z-score가 3이상인 rows를 제거함. 

vehicles.shape # dataframe의 차원 확인함.</code></pre>
<p>[결과]</p>
<p>vehicles.shape:</p>
<p>(393965, 26)</p>
<h3 id="1-단일-표본-t-검정one-sample-t-test">1. 단일 표본 t 검정(one sample t-test)</h3>
<h4 id="분석-목적">분석 목적</h4>
<p>: auid의 가격이 중고차의 평균 가격인 25000달러와 통계적으로 유의미한 차이가 나는지 확인하고자 함. </p>
<h4 id="1-그룹의-평균과-표준편차">(1) 그룹의 평균과 표준편차</h4>
<p>[코드]</p>
<pre><code class="language-python">audi = vehicles[vehicles[&#39;manufacturer&#39;] == &#39;audi&#39;]

print(&#39;audi 평균 가격: &#39;, audi.price.mean())
print(&#39;audi 가격 표준편차: &#39;, audi.price.std())</code></pre>
<p>[결과]
audi 평균 가격:  24865.23
audi 가격 표준편차:  15600.28</p>
<h4 id="2-단일-표본-t-검정">(2) 단일 표본 t 검정</h4>
<p>[코드]</p>
<pre><code class="language-python">pg.ttest(audi.price, 25000, confidence = 0.95)</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="right"></th>
<th align="right">T</th>
<th align="right">dof</th>
<th align="right">tail</th>
<th align="right">p-val</th>
<th align="right">CI95%</th>
<th align="right">cohen-d</th>
<th align="right">BF10</th>
<th align="right">power</th>
</tr>
</thead>
<tbody><tr>
<td align="right">T-test</td>
<td align="right">-0.73203</td>
<td align="right">7179</td>
<td align="right">two-sided</td>
<td align="right">0.464174</td>
<td align="right">[24504.32, 25226.13]</td>
<td align="right">0.008639</td>
<td align="right">0.017</td>
<td align="right">0.11327</td>
</tr>
</tbody></table>
<h4 id="3-결과-보고">(3) 결과 보고</h4>
<p>auid의 가격이 중고차의 평균 가격인 25000달러와 통계적으로 유의미한 차이가 나는지 확인하기 위하여 단일 표본 t 검정을 실시하였다. audi의 가격(<em>M</em> = 24865.23, <em>SD</em> = 15600.28)은 중고차 평균 가격인 25000달러와 통계적으로 유의미한 차이가 없다, <em>t</em>(7179) = -0.73, <em>p</em> &gt; .05. </p>
<h3 id="2-독립-표본-t-검정independent-samples-t-test">2. 독립 표본 t 검정(independent samples t-test))</h3>
<h4 id="분석-목적-1">분석 목적</h4>
<p>: audi와 lexus의 가격 차이가 통계적으로 유의미한지 확인하고자 함. </p>
<h4 id="1-각-그룹의-평균과-표준편차">(1) 각 그룹의 평균과 표준편차</h4>
<p>[코드]</p>
<pre><code class="language-python">audi = vehicles[vehicles[&#39;manufacturer&#39;] == &#39;audi&#39;]
lexus = vehicles[vehicles[&#39;manufacturer&#39;] == &#39;lexus&#39;]

print(&#39;audi 평균 가격: &#39;, audi.price.mean())
print(&#39;audi 가격 표준편차: &#39;, audi.price.std())

print(&#39;lexus 평균 가격: &#39;, lexus.price.mean())
print(&#39;lexus 가격 표준편차: &#39;, lexus.price.std())</code></pre>
<p>[결과]
audi 평균 가격:  24865.23
audi 가격 표준편차:  15600.28</p>
<p>lexus 평균 가격:  20344.98
lexus 가격 표준편차:  12079.34</p>
<h4 id="2-독립표본-t-검정">(2) 독립표본 t 검정</h4>
<ul>
<li>lexus와 audi의 평균 가격의 차이가 통계적으로 유의미한 차이인지 검증하기 위하여 독립표본 t 검정을 실시함. </li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">pg.ttest(audi.price, lexus.price, confidence = 0.95)</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="right"></th>
<th align="right">T</th>
<th align="right">dof</th>
<th align="right">tail</th>
<th align="right">p-val</th>
<th align="right">CI95%</th>
<th align="right">cohen-d</th>
<th align="right">BF10</th>
<th align="right">power</th>
</tr>
</thead>
<tbody><tr>
<td align="right">T-test</td>
<td align="right">19.682242</td>
<td align="right">13508</td>
<td align="right">two-sided</td>
<td align="right">4.738776e-85</td>
<td align="right">[4070.08, 4970.42]</td>
<td align="right">0.325538</td>
<td align="right">1.728e+81</td>
<td align="right">1.0</td>
</tr>
</tbody></table>
<h4 id="3-효과-크기">(3) 효과 크기</h4>
<h5 id="1-eta-squared">1) eta-squared</h5>
<p>[코드]</p>
<pre><code class="language-python">pg.compute_effsize(audi.price, lexus.price,  eftype = &#39;eta-square&#39;)</code></pre>
<p>[결과]</p>
<p>0.03</p>
<h5 id="2-cohens-d">2) cohen&#39;s d</h5>
<p>[코드]</p>
<pre><code>pg.compute_effsize(audi.price, lexus.price, eftype = &#39;cohen&#39;)</code></pre><p>[결과]</p>
<p>0.33</p>
<h4 id="4-결과-보고">(4) 결과 보고</h4>
<p>audi의 가격과 lexus의 가격에 차이가 있는지 알아보기 위하여 독립 표본 t검정을 실시하였다. audi의 가격(<em>M</em> = 24865.23, <em>SD</em> = 15600.28)이 lexus의 가격(<em>M</em> = 20344.98, <em>SD</em> = 12079.34)보다 통계적으로 유의미하게 높았다, <em>t</em>(13508) = 19.68, <em>p</em> &lt; .05, $$η^2$$ = 0.03.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL JOIN 문제 풀이]]></title>
            <link>https://velog.io/@robin_dev/SQL-JOIN-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@robin_dev/SQL-JOIN-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Sun, 15 Aug 2021 07:29:51 GMT</pubDate>
            <description><![CDATA[<h3 id="inner-join-문제-풀이">INNER JOIN 문제 풀이</h3>
<h4 id="예제-hackerrank-african-cities">&lt;예제&gt; Hackerrank: African Cities</h4>
<p>[문제]</p>
<p>Given the CITY and COUNTRY tables, query the names of all cities where the CONTINENT is &#39;Africa&#39;.</p>
<p>Note: CITY.CountryCode and COUNTRY.Code are matching key columns.</p>
<p><img src="https://images.velog.io/images/robin_dev/post/130a2817-5553-4eed-ad16-5642f2f49a66/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/robin_dev/post/f4d65cb0-59b5-409f-9064-205e1c761b8a/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT city.name
FROM city
INNER JOIN country ON city.countrycode = country.code
WHERE country.continent = &#39;Africa&#39;</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/african-cities/problem">https://www.hackerrank.com/challenges/african-cities/problem</a></p>
<h4 id="예제-hackerrank-population-census">&lt;예제&gt; Hackerrank: Population Census</h4>
<p>[문제]</p>
<p>Given the CITY and COUNTRY tables, query the sum of the populations of all cities where the CONTINENT is &#39;Asia&#39;.</p>
<p>Note: CITY.CountryCode and COUNTRY.Code are matching key columns.</p>
<p><img src="https://images.velog.io/images/robin_dev/post/5e1b70c3-b223-4c67-a955-09199d8e0fe9/image.png" alt="">
<img src="https://images.velog.io/images/robin_dev/post/060ff98b-9400-4841-8f33-087c79fbc66d/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT SUM(city.population)
FROM city
INNER JOIN country ON city.countrycode = country.code
WHERE country.continent = &#39;Asia&#39;</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/asian-population/problem?h_r=internal-search">https://www.hackerrank.com/challenges/asian-population/problem?h_r=internal-search</a></p>
<h4 id="예제-hackerrank-average-population-of-each-continent">&lt;예제&gt; Hackerrank: Average Population of Each Continent</h4>
<p>[문제]</p>
<p>Given the CITY and COUNTRY tables, query the names of all the continents (COUNTRY.Continent) and their respective average city populations (CITY.Population) rounded down to the nearest integer.</p>
<p>Note: CITY.CountryCode and COUNTRY.Code are matching key columns.
<img src="https://images.velog.io/images/robin_dev/post/3722a7a4-847e-4946-a7b7-f43f06426d90/image.png" alt="">
<img src="https://images.velog.io/images/robin_dev/post/17c0adfa-683a-4a1f-b0bc-9c980df57108/image.png" alt=""></p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT country.continent
     , FLOOR(AVG(city.population))
FROM city
INNER JOIN country ON city.countrycode = country.code
GROUP BY country.continent</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/average-population-of-each-continent/problem?h_r=internal-search">https://www.hackerrank.com/challenges/average-population-of-each-continent/problem?h_r=internal-search</a></p>
<h4 id="예제-hackerrank-placements">&lt;예제&gt; HackerRank: Placements</h4>
<p>[문제]</p>
<p>You are given three tables: Students, Friends and Packages. Students contains two columns: ID and Name. Friends contains two columns: ID and Friend_ID (ID of the ONLY best friend). Packages contains two columns: ID and Salary (offered salary in $ thousands per month).
<img src="https://images.velog.io/images/robin_dev/post/34333d84-2bb4-4a58-8dda-7fd8c5646beb/image.png" alt="">
Write a query to output the names of those students whose best friends got offered a higher salary than them. Names must be ordered by the salary amount offered to the best friends. It is guaranteed that no two students got same salary offer.</p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT s.name
FROM students AS s
INNER JOIN friends AS f ON s.id = f.id
INNER JOIN packages AS ss ON s.id = ss.id
INNER JOIN packages AS fs ON f.friend_id = fs.id
WHERE ss.salary &lt; fs.salary
ORDER BY fs.salary </code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/placements/problem">https://www.hackerrank.com/challenges/placements/problem</a></p>
<p>참고: <a href="https://www.sqlshack.com/learn-sql-join-multiple-tables/">https://www.sqlshack.com/learn-sql-join-multiple-tables/</a></p>
<h3 id="self-join-문제-풀이">SELF JOIN 문제 풀이</h3>
<h4 id="예제-leetcode-181-employees-earning-more-than-their-managers">&lt;예제&gt; LeetCode: 181. Employees Earning More Than Their Managers</h4>
<p>[문제]</p>
<p>The Employee table holds all employees including their managers. Every employee has an Id, and there is also a column for the manager Id.</p>
<p>+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+
Given the Employee table, write a SQL query that finds out employees who earn more than their managers. For the above table, Joe is the only employee who earns more than his manager.</p>
<p>+----------+
| Employee |
+----------+
| Joe      |
+----------+</p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT e.name AS Employee
FROM employee AS e
INNER JOIN employee AS m ON e.managerid = m.id
WHERE e.salary &gt; m.salary </code></pre>
<p>출처: <a href="https://leetcode.com/problems/employees-earning-more-than-their-managers/submissions/">https://leetcode.com/problems/employees-earning-more-than-their-managers/submissions/</a></p>
<h4 id="예제-leetcode-197-rising-temperature">&lt;예제&gt; LeetCode: 197. Rising Temperature</h4>
<p>[문제]</p>
<p>Table: Weather</p>
<p>+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| recordDate    | date    |
| temperature   | int     |
+---------------+---------+
id is the primary key for this table.
This table contains information about the temperature in a certain day.</p>
<p>Write an SQL query to find all dates&#39; id with higher temperature compared to its previous dates (yesterday).</p>
<p>Return the result table in any order.</p>
<p>The query result format is in the following example:</p>
<p>Weather
+----+------------+-------------+
| id | recordDate | Temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+</p>
<p>Result table:
+----+
| id |
+----+
| 2  |
| 4  |
+----+
In 2015-01-02, temperature was higher than the previous day (10 -&gt; 25).
In 2015-01-04, temperature was higher than the previous day (20 -&gt; 30).</p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT today.id
FROM Weather AS yesterday
INNER JOIN Weather AS today ON DATE_ADD(yesterday.recorddate, INTERVAL 1 DAY) = today.recorddate
WHERE today.temperature &gt; yesterday.temperature</code></pre>
<p>출처: <a href="https://leetcode.com/problems/rising-temperature/solution/">https://leetcode.com/problems/rising-temperature/solution/</a></p>
<h4 id="참고-mysql-시간-더하기-빼기">참고: MySQL 시간 더하기, 빼기</h4>
<blockquote>
<p><strong>DATE_ADD (기준날짜, INTERVAL)</strong>
: *<em>날짜에 시간/날짜 간격을 더해서 리턴함. *</em></p>
</blockquote>
<p>&lt;예시&gt;</p>
<ul>
<li>SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)</li>
<li>SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE)</li>
<li>SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)</li>
<li>SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)</li>
<li>SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)</li>
<li>SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR)</li>
<li>SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR)</li>
</ul>
<blockquote>
<p><strong>DATE_SUB (기준날짜, INTERVAL)</strong>
: *<em>날짜에 시간/날짜 간격을 빼서 리턴함. *</em></p>
</blockquote>
<p>&lt;예시&gt;</p>
<ul>
<li>SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)</li>
</ul>
<h4 id="예제-hackerrank-symmetric-pairs">&lt;예제&gt; Hackerrank: Symmetric Pairs</h4>
<p>[문제]</p>
<p>You are given a table, Functions, containing two columns: X and Y.
<img src="https://images.velog.io/images/robin_dev/post/82e0615a-ac9c-4856-8dea-b9928b8f6f1e/image.png" alt=""></p>
<p>Two pairs (X1, Y1) and (X2, Y2) are said to be symmetric pairs if X1 = Y2 and X2 = Y1.</p>
<p>Write a query to output all such symmetric pairs in ascending order by the value of X. List the rows such that X1 ≤ Y1.</p>
<p>Sample Input
<img src="https://images.velog.io/images/robin_dev/post/0780509b-7fab-4005-9135-60d27c9f2ea7/image.png" alt=""></p>
<p>Sample Output</p>
<pre><code>20 20
20 21
22 23</code></pre><p>[풀이1]</p>
<pre><code class="language-sql">-- x와 y가 다른 경우
(SELECT f1.x
     , f1.y
FROM functions AS f1
INNER JOIN functions AS f2 ON f1.x = f2.y AND f1.y = f2.x
WHERE f1.x &lt; f1.y)
UNION
-- x와 y가 같은 경우
(SELECT x
      , y
FROM functions
GROUP BY x, y
HAVING COUNT(*) &gt; 1)
ORDER BY x</code></pre>
<p>[풀이2]</p>
<pre><code class="language-sql">SELECT f1.x
     , f1.y 
FROM Functions AS f1
INNER JOIN Functions AS f2 ON f1.x = f2.y AND f1.y = f2.x
GROUP BY f1.x, f1.y 
HAVING COUNT(*) &gt; 1 OR f1.x &lt; f1.y 
ORDER BY f1.x</code></pre>
<p>출처: <a href="https://www.hackerrank.com/challenges/symmetric-pairs/problem">https://www.hackerrank.com/challenges/symmetric-pairs/problem</a></p>
<p><strong>** 참고 (INNER JOIN vs. LEFT JOIN)</strong>
Functions 테이블 </p>
<table>
<thead>
<tr>
<th>id</th>
<th>x</th>
<th>y</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>2</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>3</td>
<td>20</td>
<td>21</td>
</tr>
<tr>
<td>4</td>
<td>23</td>
<td>22</td>
</tr>
<tr>
<td>5</td>
<td>22</td>
<td>23</td>
</tr>
</tbody></table>
<p><strong>(1) LEFT JOIN</strong></p>
<pre><code class="language-sql">SELECT f1.id, f1.x, f1.y, f2.id, f2.x, f2.y    
FROM Functions f1
LEFT JOIN Functions f2 ON f1.x = f2.y AND f2.x = f1.y</code></pre>
<table>
<thead>
<tr>
<th>f1.id</th>
<th>f1.x</th>
<th>f1.y</th>
<th>f2.id</th>
<th>f2.x</th>
<th>f2.y</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>20</td>
<td>20</td>
<td>1</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>1</td>
<td>20</td>
<td>20</td>
<td>2</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>2</td>
<td>20</td>
<td>20</td>
<td>1</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>2</td>
<td>20</td>
<td>20</td>
<td>2</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>3</td>
<td>20</td>
<td>21</td>
<td>null</td>
<td>null</td>
<td>null</td>
</tr>
<tr>
<td>4</td>
<td>23</td>
<td>22</td>
<td>5</td>
<td>22</td>
<td>23</td>
</tr>
<tr>
<td>5</td>
<td>22</td>
<td>23</td>
<td>4</td>
<td>23</td>
<td>22</td>
</tr>
</tbody></table>
<p>➡️ LEFT JOIN을 사용하면 f1의 x = 20, y = 21에 대응하는 x = 21, y = 20인 row가 f2에 존재하지 않아도, null 값으로 채워져서 row를 리턴하게 됨. 이와 같은 대응이 되지 않는 rows를 제거하고, 대응되는 rows만 리턴하기 위해 INNER JOIN을 사용함. </p>
<p><strong>(2) INNER JOIN</strong></p>
<pre><code class="language-sql">SELECT f1.id, f1.x, f1.y, f2.id, f2.x, f2.y    
FROM Functions f1
INNER JOIN Functions f2 ON f1.x = f2.y AND f2.x = f1.y</code></pre>
<table>
<thead>
<tr>
<th>f1.id</th>
<th>f1.x</th>
<th>f1.y</th>
<th>f2.id</th>
<th>f2.x</th>
<th>f2.y</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>20</td>
<td>20</td>
<td>1</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>1</td>
<td>20</td>
<td>20</td>
<td>2</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>2</td>
<td>20</td>
<td>20</td>
<td>1</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>2</td>
<td>20</td>
<td>20</td>
<td>2</td>
<td>20</td>
<td>20</td>
</tr>
<tr>
<td>4</td>
<td>23</td>
<td>22</td>
<td>5</td>
<td>22</td>
<td>23</td>
</tr>
</tbody></table>
<h3 id="left-join-문제-풀이">LEFT JOIN 문제 풀이</h3>
<h4 id="예제-leetcode-183-customers-who-never-order">&lt;예제&gt; LeetCode: 183. Customers Who Never Order</h4>
<p>[문제]</p>
<p>Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL query to find all customers who never order anything.</p>
<p>Table: Customers.</p>
<p>+----+-------+
| Id | Name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+
Table: Orders.</p>
<p>+----+------------+
| Id | CustomerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+
Using the above tables as example, return the following:</p>
<p>+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+</p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT name AS Customers
FROM customers AS c
LEFT JOIN orders AS o ON c.id = o.customerid
WHERE o.id IS NULL</code></pre>
<p>출처: <a href="https://leetcode.com/problems/customers-who-never-order/">https://leetcode.com/problems/customers-who-never-order/</a></p>
<h4 id="예제-leetcode-175-combine-two-tables">&lt;예제&gt; LeetCode: 175. Combine Two Tables</h4>
<p>[문제]</p>
<p>Table: Person</p>
<p>+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
PersonId is the primary key column for this table.
Table: Address</p>
<p>+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
AddressId is the primary key column for this table.</p>
<p>Write a SQL query for a report that provides the following information for each person in the Person table, regardless if there is an address for each of those people:</p>
<p>FirstName, LastName, City, State</p>
<p>[풀이]</p>
<pre><code class="language-sql">SELECT firstname
     , lastname
     , city
     , state
FROM person AS p 
LEFT JOIN address AS a ON p.personid = a.personid</code></pre>
<p>출처: <a href="https://leetcode.com/problems/combine-two-tables/">https://leetcode.com/problems/combine-two-tables/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL JOIN 개념 정리]]></title>
            <link>https://velog.io/@robin_dev/SQL-JOIN-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@robin_dev/SQL-JOIN-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 15 Aug 2021 07:20:51 GMT</pubDate>
            <description><![CDATA[<h3 id="join">JOIN</h3>
<ul>
<li>두개 이상 테이블에서 테이블 사이 연관된 colum을 바탕으로 rows를 결합함. </li>
</ul>
<h4 id="1-inner-join">1) (INNER) JOIN</h4>
<p>두 테이블에 모두 매치되는 값을 가진 rows를 리턴함.
<img src="https://images.velog.io/images/robin_dev/post/fec6e272-f87a-49db-94ba-2065adacd322/image.png" alt=""></p>
<p>[코드]</p>
<pre><code class="language-sql">SELECT * FROM TableA A
INNER JOIN TableB B ON A.key = B.key</code></pre>
<h4 id="2-left-outer-join">2) LEFT (OUTER) JOIN</h4>
<p>왼쪽 테이블의 모든 rows를 리턴하고, 오른쪽 테이블에서는 왼쪽 테이블에 매치되는 rows를 리턴함.
<img src="https://images.velog.io/images/robin_dev/post/f46d5c48-293e-444b-a202-6b37f2a2263b/image.png" alt=""></p>
<p>[코드]</p>
<pre><code class="language-sql">SELECT * FROM TableA A
LEFT JOIN TableB B ON A.key = B.key </code></pre>
<h4 id="3-right-outer-join">3) RIGHT (OUTER) JOIN</h4>
<p>오른쪽 테이블의 모든 rows를 리턴하고, 왼쪽 테이블에서는 오른쪽 테이블에 매치되는 rows를 리턴함.
<img src="https://images.velog.io/images/robin_dev/post/16c77d6d-224c-419c-923c-aacafbfb874a/image.png" alt=""></p>
<p>[코드]</p>
<pre><code class="language-sql">SELECT * FROM TableA A
RIGHT JOIN TableB B ON A.key = B.key </code></pre>
<h4 id="4-full-outer-join">4) FULL (OUTER) JOIN</h4>
<p>왼쪽 테이블 혹은 오른쪽 테이블에 매치되는 모든 rows를 리턴함.
<img src="https://images.velog.io/images/robin_dev/post/eabce235-e115-43f6-9508-db713a1e9138/image.png" alt=""></p>
<p>[코드]</p>
<pre><code class="language-sql">SELECT * FROM TableA A 
FULL OUTER JOIN TableB B ON A.key = B.key</code></pre>
<h3 id="join-예시">JOIN 예시</h3>
<p>[테이블 생성 및 값 삽입]</p>
<pre><code class="language-sql">CREATE TABLE Students(StudentId integer, Name varchar(100));
INSERT INTO Students(StudentId, Name) values(1, &quot;Ted&quot;), (2, &quot;Lily&quot;), (3, &quot;Marshall&quot;);
CREATE TABLE Scores(ScoreId integer, StudentId integer, Math integer, English integer);
INSERT INTO Scores(ScoreId, StudentId, Math, English) values(1, 1, 90, 95), (2, 2, 80, 100), (4, NULL, 75, 100);</code></pre>
<p>&lt;Student 테이블&gt;</p>
<table>
<thead>
<tr>
<th align="center">StudentId</th>
<th align="center">Name</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">Ted</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">Lily</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">Marshall</td>
</tr>
</tbody></table>
<p>&lt;Score 테이블&gt;</p>
<table>
<thead>
<tr>
<th align="center">ScoreId</th>
<th align="center">StudentId</th>
<th align="center">Math</th>
<th align="center">English</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">90</td>
<td align="center">95</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">2</td>
<td align="center">80</td>
<td align="center">100</td>
</tr>
<tr>
<td align="center">4</td>
<td align="center">NULL</td>
<td align="center">75</td>
<td align="center">100</td>
</tr>
</tbody></table>
<h4 id="1-inner-join-1">1) INNER JOIN</h4>
<p>[코드]</p>
<pre><code class="language-sql">SELECT st.StudentId 
     , st.name
     , sc.math
     , sc.english
FROM Student AS st
INNER JOIN Score AS sc ON st.StudentId = sc.StudentId;</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="center">StudentId</th>
<th align="center">name</th>
<th align="center">math</th>
<th align="center">english</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">Ted</td>
<td align="center">90</td>
<td align="center">95</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">Lily</td>
<td align="center">80</td>
<td align="center">100</td>
</tr>
</tbody></table>
<h4 id="2-left-join">2) LEFT JOIN</h4>
<p>[코드]</p>
<pre><code class="language-sql">SELECT st.StudentId 
     , st.name
     , sc.math
     , sc.english
FROM Student AS st
LEFT JOIN Score AS sc ON st.StudentId = sc.StudentId;</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="center">StudentId</th>
<th align="center">name</th>
<th align="center">math</th>
<th align="center">english</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">Ted</td>
<td align="center">90</td>
<td align="center">95</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">Lily</td>
<td align="center">80</td>
<td align="center">100</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">Marshall</td>
<td align="center">NULL</td>
<td align="center">NULL</td>
</tr>
</tbody></table>
<h4 id="3-right-join">3) RIGHT JOIN</h4>
<p>[코드]</p>
<pre><code class="language-sql">SELECT st.StudentId 
     , st.name
     , sc.math
     , sc.english
FROM Student AS st
RIGHT JOIN Score AS sc ON st.StudentId = sc.StudentId;</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="center">StudentId</th>
<th align="center">name</th>
<th align="center">math</th>
<th align="center">english</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">Ted</td>
<td align="center">90</td>
<td align="center">95</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">Lily</td>
<td align="center">80</td>
<td align="center">100</td>
</tr>
<tr>
<td align="center">NULL</td>
<td align="center">NULL</td>
<td align="center">75</td>
<td align="center">100</td>
</tr>
</tbody></table>
<h4 id="4-full-outer-join-1">4) FULL OUTER JOIN</h4>
<p>[코드]</p>
<pre><code class="language-sql">SELECT st.StudentId 
     , st.name
     , sc.math
     , sc.english
FROM Student AS st
FULL OUTER JOIN Score AS sc ON st.StudentId = sc.StudentId;</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th align="center">StudentId</th>
<th align="center">Name</th>
<th align="center">Math</th>
<th align="center">English</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">Ted</td>
<td align="center">90</td>
<td align="center">95</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">Lily</td>
<td align="center">80</td>
<td align="center">100</td>
</tr>
<tr>
<td align="center">NULL</td>
<td align="center">NULL</td>
<td align="center">75</td>
<td align="center">100</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">Marshall</td>
<td align="center">NULL</td>
<td align="center">NULL</td>
</tr>
</tbody></table>
<p>⚠️ <span style='color: red'>주의</span> : MySQL에서는 FULL OUTER JOIN을 제공하지 않음. 
MySQL에서는 다음과 같은 코드로 FULL OUTER JOIN를 구현할 수 있음. </p>
<p>[코드]</p>
<pre><code class="language-sql">SELECT *
FROM Student AS st
LEFT JOIN Score AS sc ON st.StudentId = sc.StudentId
UNION
SELECT *
FROM Student AS st
RIGHT JOIN Score AS sc ON st.StudentId = sc.StudentId;</code></pre>
<p>[결과]</p>
<table>
<thead>
<tr>
<th>StudentId</th>
<th>Name</th>
<th>ScoreId</th>
<th>StudentId</th>
<th>Math</th>
<th>English</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Ted</td>
<td>1</td>
<td>1</td>
<td>90</td>
<td>95</td>
</tr>
<tr>
<td>2</td>
<td>Lily</td>
<td>2</td>
<td>2</td>
<td>80</td>
<td>100</td>
</tr>
<tr>
<td>3</td>
<td>Marshall</td>
<td>NULL</td>
<td>NULL</td>
<td>NULL</td>
<td>NULL</td>
</tr>
<tr>
<td>NULL</td>
<td>NULL</td>
<td>4</td>
<td>NULL</td>
<td>75</td>
<td>100</td>
</tr>
</tbody></table>
<p>참고:
<a href="https://www.w3schools.com/sql/sql_join.asp">https://www.w3schools.com/sql/sql_join.asp</a>
<a href="https://sql-joins.leopard.in.ua/">https://sql-joins.leopard.in.ua/</a>
MySQL online editor: <a href="https://paiza.io/en/projects/new?language=mysql">https://paiza.io/en/projects/new?language=mysql</a>
PostgreSQL online editor: <a href="https://extendsclass.com/postgresql-online.html">https://extendsclass.com/postgresql-online.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계 이론] 통계적 가설 검정]]></title>
            <link>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%ED%86%B5%EA%B3%84%EC%A0%81-%EA%B0%80%EC%84%A4-%EA%B2%80%EC%A0%95</link>
            <guid>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%ED%86%B5%EA%B3%84%EC%A0%81-%EA%B0%80%EC%84%A4-%EA%B2%80%EC%A0%95</guid>
            <pubDate>Fri, 13 Aug 2021 13:02:28 GMT</pubDate>
            <description><![CDATA[<h3 id="통계적-가설-검정-절차">통계적 가설 검정 절차</h3>
<h4 id="1-가설을-설정한다">1) 가설을 설정한다.</h4>
<ul>
<li><p><strong>귀무가설</strong>(null hypothesis/H0)
: 가설 검정의 직접적인 대상이 되는 가설. 기각하고자 하는 가설.
➡️ 연구의 목적은 독립변인에 따라 종속변인에 차이가 난다는 것을  확인하기 위한 경우가 많음. 이로 인해 귀무가설은 &#39;차이가 없다&#39;, &#39;영향을 미치지 않는다&#39; 등으로 표현되는 경우가 많음. 
예) 종이에 필기한 집단과 노트북에 필기한 집단 사이 성적에 차이가 없다. </p>
</li>
<li><p><strong>대립가설</strong>(alternative hypothesis/H1)
: 귀무가설이 기각될 때 받아들여지는 가설. 직접적으로 검정의 대상이 되지 않음. 
예) 종이에 필기한 집단과 노트북에 필기한 집단 사이 성적에 차이가 있다.</p>
</li>
</ul>
<blockquote>
<p>⚠️ 주의: 귀무가설과 대립가설은 모든 가능성을 포함해야 하고, 상호 배타적이어야 한다. </p>
</blockquote>
<ul>
<li><p>가설에는 차이가 특정한 방향에서 나타날 것을 명시하는 <strong>방향적 가설</strong>(directional hypothesis)과 특정한 방향을 포함하지 않는 <strong>비방향적 가설</strong>(nondirectional hypothesis)이 있음.
예) 방향적 가설: 종이에 필기한 집단이 노트북에 필기한 집단보다 성적이 높을 것이다.
비방향적 가설: 종이에 필기한 집단과 노트북에 필기한 집단 사이 성적에 차이가 있다.</p>
</li>
<li><p>선행연구가 존재하여 방향성에 대해 기대할 수 있을 때 방향적 가설을 사용하고, 방향성에 대한 강한 근거가 없다면 비방향적 가설을 사용하는 것이 좋음.</p>
</li>
<li><p>방향적 가설을 검정할 때 단측(one-tailed) 검정, 비방향적 가설을 검정할 때 양측(two-tailed) 검정을 사용함. </p>
</li>
</ul>
<h4 id="2-유의-수준을-설정한다">2) 유의 수준을 설정한다.</h4>
<p><em>p</em>-value와 비교할 유의수준($$α$$)을 설정함. 일반적으로 $$α$$은 .05로 설정함.</p>
<table>
<thead>
<tr>
<th>연구자의 결정 / 실제 상태</th>
<th>귀무가설 참</th>
<th>귀무가설 거짓</th>
</tr>
</thead>
<tbody><tr>
<td>귀무가설 기각</td>
<td><strong>1종 오류($$α$$)</strong></td>
<td>바른 결정(1-$$β$$)</td>
</tr>
<tr>
<td>귀무가설 기각 안함</td>
<td>바른 결정(1-$$α$$)</td>
<td><strong>2종 오류($$β$$)</strong></td>
</tr>
<tr>
<td>- <strong>유의수준</strong>($$α$$): 귀무가설이 참일 때 귀무가설을 기각할 확률(1종 오류를 범할 확률).</td>
<td></td>
<td></td>
</tr>
<tr>
<td>-  검정력(power): 귀무가설이 거짓일 때 귀무가설을 기각할 확률(2종 오류를 범하지 않을 확률). 1-$$β$$임.</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>[양측 검정]
<img src="https://images.velog.io/images/robin_dev/post/5024f8db-f166-43d7-bee9-2309b2b01fa7/image.png" alt=""></p>
<p>[단측 검정]
<img src="https://images.velog.io/images/robin_dev/post/d570df8c-089e-43e1-a6d0-595651e4bb07/image.png" alt="">
<img src="https://images.velog.io/images/robin_dev/post/96cf9664-1e3b-4a7d-9642-4317c07ecf1d/image.png" alt=""></p>
<p>출처: Hartmann, K., Krois, J., Waske, B. (2018): <a href="https://www.geo.fu-berlin.de/en/v/soga/Basics-of-statistics/Hypothesis-Tests/Introduction-to-Hypothesis-Testing/Critical-Value-and-the-p-Value-Approach/index.html">E-Learning Project SOGA: Statistics and Geospatial Data Analysis</a>. Department of Earth Sciences, Freie Universitaet Berlin.</p>
<h4 id="3-표본을-추출하여-검정통계량을-계산한다">3) 표본을 추출하여 검정통계량을 계산한다.</h4>
<h4 id="4-귀무가설을-평가한다">4) 귀무가설을 평가한다.</h4>
<blockquote>
<p><strong><em>p</em>-value</strong>: 귀무가설이 참일 때 관측된 검정통계량이 관찰될 확률</p>
</blockquote>
<p><em>p</em>-value와 유의수준($$α$$)을 비교:</p>
<ul>
<li><strong><em>p</em>-value &lt; $$α$$ 이면 귀무가설을 기각한다.</strong> </li>
</ul>
<blockquote>
<p>⚠️ 주의:</p>
</blockquote>
<ul>
<li><em>p</em>-value는 effect size에 대한 지표로 사용되면 안된다. <em>p</em>-value가 낮다고 해서 effect size가 큰 것이 아니다. </li>
<li><em>p</em>-value가 낮다고 해서 재현(replication)될 확률이 높은 것이 아니다. </li>
<li>일반적으로 표본이 많아지면 <em>p</em>-value가 낮아진다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계 이론] 표집분포와 중심극한정리]]></title>
            <link>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%ED%91%9C%EC%A7%91%EB%B6%84%ED%8F%AC%EC%99%80-%EC%A4%91%EC%8B%AC%EA%B7%B9%ED%95%9C%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%ED%91%9C%EC%A7%91%EB%B6%84%ED%8F%AC%EC%99%80-%EC%A4%91%EC%8B%AC%EA%B7%B9%ED%95%9C%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 12 Aug 2021 17:07:38 GMT</pubDate>
            <description><![CDATA[<h3 id="1-표집-방법">1. 표집 방법</h3>
<ul>
<li><strong>표집</strong>: 모집단에서 표본을 추출<h3 id="1-확률무작위-표집random-sampling">1) 확률(무작위) 표집(random sampling)</h3>
</li>
</ul>
<p>모집단에서 각 사례가 동일한 확률로 추출됨. </p>
<h4 id="1-단순-무작위-표집simple-random-sampling">(1) 단순 무작위 표집(simple random sampling)</h4>
<p>모집단의 모든 사례를 같은 확률로 추출함. 
예)모집단 사례 모두에게 번호를 부여하고 표본의 수만큼 번호를 무작위로 뽑아서 표본을 추출함. </p>
<h4 id="2-체계적-표집systematic-sampling">(2) 체계적 표집(systematic sampling)</h4>
<p>첫번재 사례를 무작위로 추출한 뒤, 매번 k번째 사례를 추출함. 주기성이 없을 때 사용해야함. 
예)출구조사(투표소에서 나오는 사람들 k번째마다 조사)</p>
<h4 id="3-층화-표집stratified-sampling">(3) 층화 표집(stratified sampling)</h4>
<p>모집단을 구성하는 계층별로 무작위로 표집함. 모집단이 서로 다른 집단으로 구성될 때 활용함. 계층은 지역, 연령, 성별 등으로 연구 목적에 따라 달라짐. 
예)</p>
<ul>
<li>비율 층화 표집: 모집단에 대한 각 계층의 비율대로 각 계층에서 사례를 추출. 
예) 모집단 1000명에서 표본 100명을 추출할 때 남자와 여자 비율이 6:4이면 남자 600명 중 60명을, 여자 400명 중 40명을 추출함.  </li>
<li>비비율 층화 표집: 모집단에서 각 계층마다 추출할 때 모집단에 대한 계층의 비율이 아닌 다른 비율로 사례를 추출. 
예) 모집단 10000명에서 표본 100명을 추출할 때 남자와 여자 비율이 1:9이면 남자 100명 중 20명, 여자 900면 중 80명을 추출함.</li>
</ul>
<h4 id="4-집락-표집clustered-sampling">(4) 집락 표집(clustered sampling)</h4>
<p>자연스럽게 형성된 집락에 따라서 무작위로 표집함.
예) 서울시 상인 대상 설문 조사시 특정 구를 5개를 무작위로 선정해서 사례를 추출함. </p>
<h3 id="2-비확률편파된-표집biased-sampling">2) 비확률(편파된) 표집(biased sampling)</h3>
<p>모집단에서 어떤 사례가 다른 사례에 비해 추출될 확률이 높음. </p>
<h4 id="1-의도적-표집-purposive-sampling">(1) 의도적 표집 (purposive sampling)</h4>
<p>특정 집단이 모집단을 잘 대표할 것으로 판단하여 특정 집단에서 사례를 추출함. </p>
<h4 id="2-편의우연적-표집-convenience-sampling">(2) 편의(우연적) 표집 (convenience sampling)</h4>
<p>연구자가 쉽게 얻을 수 있는 사례를 표본으로 추출함. 
예) 심리학 연구 참가자를 심리학 교양 수업을 수강하는 대학생들을 대상으로 함. </p>
<h4 id="3-할당-표집quota-sampling">(3) 할당 표집(quota sampling)</h4>
<p>모집단을 구성하는 계층별로 작위적으로 표집함. 층화 표집과의 차이점은 무작위로 표집하지 않는다는 점임. 층화표집과 마찬가지로 비율, 비비율로 구분됨.</p>
<h4 id="4-눈덩이-표집snowball-sampling">(4) 눈덩이 표집(snowball sampling)</h4>
<p>한 사례로부터 시작하여 표본을 점차적으로 늘려가는 방법. 사례로부터 얻는 다른 사례에 대한 정보를 바탕으로 표본을 늘려감. 모집단에 대한 접근이 어려울 때 활용함.</p>
<h3 id="2-표집분포sampling-distribution-of-the-means">2. 표집분포(sampling distribution of the means)</h3>
<p>동일한 모집단에서 크기가 n인 표본을 무한히 반복 추출한 뒤, 그 평균을 가지고 만든 이론적 분포. </p>
<h4 id="표집분포-시뮬레이션">표집분포 시뮬레이션</h4>
<ul>
<li>n=5인 표본을 1회 추출
<img src="https://images.velog.io/images/robin_dev/post/5b56813e-ba89-49fc-a98b-035a91ce0c8c/image.png" alt=""></li>
<li>n=5인 표본을 10회 추출
<img src="https://images.velog.io/images/robin_dev/post/741b9dc5-6cf0-4493-ab13-13b4d89dd849/image.png" alt=""></li>
<li>n=5인 표본을 10,000회 추출
<img src="https://images.velog.io/images/robin_dev/post/0b21c88c-943c-4a3e-817f-e3fa8fd14d71/image.png" alt=""></li>
<li>n=5인 표본을 100,000회 추출
<img src="https://images.velog.io/images/robin_dev/post/844bec7d-b631-40ca-9e9d-ab5990d431d1/image.png" alt=""></li>
</ul>
<p>출처: <a href="https://onlinestatbook.com/stat_sim/sampling_dist/index.html">https://onlinestatbook.com/stat_sim/sampling_dist/index.html</a></p>
<h4 id="표준오차se-standard-error">표준오차(SE: standard error)</h4>
<p>: 표집분포의 표준편차</p>
<h3 id="중심-극한-정리">중심 극한 정리</h3>
<p>1) 표본의 크기가 충분히 크면(n &gt; 30 이면) 표집분포는 근사적으로 정규 분포이다. 
2) 모집단의 분포가 정규분포이면 표본의 크기와 상관 없이 표집분포는 정규분포이다. 
3) 표집분포의 평균은 $$μ$$ 이다.
4) 표집분포의 표준편차(표준오차)는 $$\frac{σ}{\sqrt N}$$ 이다. </p>
<ul>
<li>표준오차의 특징<ul>
<li>표준오차는 표본의 크기가 커지면 작아진다. 
⬅️ 표본의 크기가 커지면 각 표본의 평균 사이 거리가 가까워지기 때문이다. </li>
<li>표준오차는 모표준편차에 비해 작다. </li>
</ul>
</li>
</ul>
<h3 id="모집단-분포-표본분포-표집분포-평균과-표준편차">모집단 분포, 표본분포, 표집분포 평균과 표준편차</h3>
<table>
<thead>
<tr>
<th>종류</th>
<th>평균</th>
<th>표준편차</th>
</tr>
</thead>
<tbody><tr>
<td>모집단 분포</td>
<td>$$μ$$</td>
<td>$$σ$$</td>
</tr>
<tr>
<td>표본분포</td>
<td>$$\overline{x}$$</td>
<td>$$s_{x}$$</td>
</tr>
<tr>
<td>표집분포</td>
<td>$$μ_{\overline{x}} = μ$$</td>
<td>$$σ_{\overline{x}} = \frac{σ}{\sqrt N}$$</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계 이론] 모집단과 표본]]></title>
            <link>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%EB%AA%A8%EC%A7%91%EB%8B%A8%EA%B3%BC-%ED%91%9C%EB%B3%B8</link>
            <guid>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%EB%AA%A8%EC%A7%91%EB%8B%A8%EA%B3%BC-%ED%91%9C%EB%B3%B8</guid>
            <pubDate>Thu, 12 Aug 2021 12:00:47 GMT</pubDate>
            <description><![CDATA[<h3 id="1-모집단과-표본">1. 모집단과 표본</h3>
<table>
<thead>
<tr>
<th>모집단(population)</th>
<th>표본(samples)</th>
</tr>
</thead>
<tbody><tr>
<td>연구의 관심이 되는 집단 전체</td>
<td>관찰을 위해 추출된 모집단의 부분 집단</td>
</tr>
</tbody></table>
<p>➡️ 대부분의 경우 집단 전체에 대한 전수조사가 가능하지 않으므로 표본을 통해 모집단에 대해 추론함. </p>
<h3 id="2-모수와-통계량">2. 모수와 통계량</h3>
<table>
<thead>
<tr>
<th>모수(population parameter)</th>
<th>통계량(sample statistic)</th>
</tr>
</thead>
<tbody><tr>
<td>모집단의 특성을 나타내는 값</td>
<td>표본의 특성을 나타내는 값</td>
</tr>
<tr>
<td><strong>모평균( $$μ$$ )</strong></td>
<td><strong>표본평균 ( $$\overline{x}$$ )</strong></td>
</tr>
<tr>
<td><strong>모분산( $$σ^2$$ )</strong></td>
<td><strong>표본분산 ( $$s_{x}^2$$ )</strong></td>
</tr>
<tr>
<td><strong>모표준편차( $$σ$$ )</strong></td>
<td><strong>표본표준편차 ( $$s_{x}$$ )</strong></td>
</tr>
</tbody></table>
<p>⚠️ 주의: 표본의 모수, 모집단의 통계량으로 표현하지 않도록 하기. </p>
<h4 id="모표준편차">모표준편차</h4>
<p> <img src="https://images.velog.io/images/robin_dev/post/f5e9f42a-b71b-4cf2-a032-8e53814cd491/image.png" alt=""></p>
<p> &lt;예제&gt;
 4명의 학생들의 수학 성적은 70, 50, 80, 90이다. 다음 성적의 표준편차를 구하라.</p>
<p> (풀이)
  𝜇 = $$\frac{(70 + 50 + 80 + 90)}{4}$$ = 70
 $$SS$$ = $$(70-70)^2$$ + $$(50-70)^2$$ + $$(80-70)^2$$ + $$(90-70)^2$$ = 1000
 $$σ^2$$ = $$\frac{SS}{N}$$ = $$\frac{1000}{4}$$ = 250
 𝜎 = 15.81</p>
<p> 정답: 15.81</p>
<h4 id="표본표준편차">표본표준편차</h4>
<p> <img src="https://images.velog.io/images/robin_dev/post/377cd482-7568-4bf1-8221-a8518bc0a735/image.png" alt=""></p>
<p>&lt;예제&gt; 
학생들이 몇개의 과목을 수강하는지 조사하기 위해 4명을 표본으로 뽑았다. 과목 개수는 4, 6, 7, 3개이다. 다음 과목 개수의 표준편차를 구하라.</p>
<p>(풀이)
$$\overline{x}$$ = $$\frac{(4 + 6 + 7 + 3)}{4}$$ = 5
$$SS$$ = $$(4-5)^2$$ + $$(6-5)^2$$ + $$(7-5)^2$$ + $$(3-5)^2$$ = 10
$$s_{x}^2$$ = $$\frac{SS}{n-1}$$ = $$\frac{10}{(4-1)}$$ = $$\frac{10}{3}$$ = 3.33
$$s_{x}$$ = 1.83</p>
<p>정답: 1.83</p>
<ul>
<li>참고: 모집단과 표본의 평균, 분산, 표준편차를 구할 수 있는 사이트
<a href="https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php">https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] SQL 고득점 Kit - IS NULL]]></title>
            <link>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-IS-NULL</link>
            <guid>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-IS-NULL</guid>
            <pubDate>Wed, 11 Aug 2021 13:57:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>NULL VALUE</strong>
값이 없음을 의미함. 
⚠️ <span style='color:red'>주의</span>: 값이 0이 아님. 값이 비어 있는 것.</p>
</blockquote>
<blockquote>
<p>** IS NULL, IS NOT NULL **
NULL VALUE인지 확인하기 위해 <strong>IS NULL</strong> 혹은 <strong>IS NOT NULL</strong>을 사용함. 
⚠️ <span style='color:red'>주의</span>: 컬럼명 = NULL 형태로 쓰지 않음.</p>
</blockquote>
<h3 id="animal_ins-테이블">ANIMAL_INS 테이블</h3>
<p>ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>INTAKE_CONDITION</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_INTAKE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody></table>
<h3 id="이름이-없는-동물의-아이디">이름이 없는 동물의 아이디</h3>
<h4 id="문제">문제</h4>
<p>동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.</p>
<h4 id="솔루션">솔루션</h4>
<pre><code class="language-sql">SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID;</code></pre>
<h3 id="이름이-있는-동물의-아이디">이름이 있는 동물의 아이디</h3>
<h4 id="문제-1">문제</h4>
<p>동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.</p>
<h4 id="솔루션-1">솔루션</h4>
<pre><code class="language-sql">SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;</code></pre>
<h3 id="null-처리하기">NULL 처리하기</h3>
<h4 id="문제-2">문제</h4>
<p>입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 &quot;No name&quot;으로 표시해 주세요.</p>
<h4 id="솔루션-2">솔루션</h4>
<pre><code class="language-sql">SELECT ANIMAL_TYPE
     , IFNULL(NAME, &#39;No name&#39;) AS NAME
     , SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID</code></pre>
<blockquote>
<p><strong>IFNULL</strong>
SELECT <strong>IFNULL</strong>(expression, alt_value)
: expression의 값이 null이면 alt_value를 리턴함. null이 아니면 expression을 리턴함.</p>
</blockquote>
<p>출처: </p>
<ul>
<li>문제 풀이 <a href="https://programmers.co.kr/learn/challenges">https://programmers.co.kr/learn/challenges</a></li>
<li>개념 설명 <a href="https://www.w3schools.com/sql/sql_null_values.asp">https://www.w3schools.com/sql/sql_null_values.asp</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python 통계 실습] 기술 통계]]></title>
            <link>https://velog.io/@robin_dev/Python-%ED%86%B5%EA%B3%84-%EC%8B%A4%EC%8A%B5-%EA%B8%B0%EC%88%A0-%ED%86%B5%EA%B3%84</link>
            <guid>https://velog.io/@robin_dev/Python-%ED%86%B5%EA%B3%84-%EC%8B%A4%EC%8A%B5-%EA%B8%B0%EC%88%A0-%ED%86%B5%EA%B3%84</guid>
            <pubDate>Wed, 11 Aug 2021 06:38:24 GMT</pubDate>
            <description><![CDATA[<p>기술 통계에 대한 이론은 해당 글에서 확인하실 수 있습니다. 
<a href="https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%EA%B8%B0%EC%88%A0-%ED%86%B5%EA%B3%84">[통계 이론] 기술 통계</a></p>
<h3 id="0-데이터-준비">0. 데이터 준비</h3>
<ul>
<li>데이터 셋: 캐글 중고차 데이터
<a href="https://www.kaggle.com/austinreese/craigslist-carstrucks-data">https://www.kaggle.com/austinreese/craigslist-carstrucks-data</a><h4 id="데이터-불러오기">데이터 불러오기</h4>
[코드]</li>
</ul>
<pre><code class="language-python">import pandas as pd
vehicles = pd.read_csv(&#39;vehicles.csv&#39;) # csv 파일을 dataframe으로 읽어옴. 

vehicles.shape # dataframe의 차원 확인함.
vehicles.head(3) # dataframe의 처음 3개 열을 리턴함.
vehicles.tail(3) # dataframe의 마지막 3개 열을 리턴함.</code></pre>
<p>[결과]</p>
<p>vehicles.shape:</p>
<p>(426880, 26)</p>
<p><img src="https://images.velog.io/images/robin_dev/post/1f5d6bbb-40ac-48c4-a505-320e9cc21f9d/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/robin_dev/post/f40e2262-4e7a-4a61-aad8-6476cf59a801/image.png" alt=""></p>
<h4 id="데이터-전처리하기">데이터 전처리하기</h4>
<ul>
<li>가격이 0인 데이터들을 결측치로 판단하여 제거함.</li>
<li>가격의 z-score가 3이상인 데이터를 이상치로 판단하여 제거함. </li>
</ul>
<p>[코드]</p>
<pre><code class="language-python">import scipy.stats as stats

vehicles = vehicles[vehicles[&#39;price&#39;] != 0]
# vehicles의 가격이 0인 rows를 제거함.
vehicles = vehicles.reset_index(drop=True)
# vehicles의 index를 재정렬함.

vehicles = vehicles[(np.abs(stats.zscore(vehicles[&#39;price&#39;])) &lt; 3)]
# vehicles의 가격의 z-score가 3이상인 rows를 제거함. 

vehicles.shape # dataframe의 차원 확인함.</code></pre>
<p>[결과]</p>
<p>vehicles.shape:</p>
<p>(393965, 26)</p>
<h3 id="1-중심경향값-구하기">1. 중심경향값 구하기</h3>
<h4 id="1-가격의-평균">1) 가격의 평균</h4>
<p>[코드]</p>
<pre><code class="language-python">vehicles.price.mean()</code></pre>
<p>[결과]</p>
<p>19383.20</p>
<h4 id="2-가격의-중앙값">2) 가격의 중앙값</h4>
<p>[코드]</p>
<pre><code class="language-python">vehicles.price.median()</code></pre>
<p>[결과]</p>
<p>15000</p>
<ul>
<li>평균은 극단값의 영향을 많이 받기 때문에 가격의 평균과 중앙값 사이 차이가 많이 나는 것으로 보임. 현재 데이터에서는 평균보다 중앙값이 데이터를 더 잘 대표하는 것으로 판단됨. </li>
</ul>
<h4 id="3-제조사-최빈값">3) 제조사 최빈값</h4>
<p>[코드]</p>
<pre><code class="language-python">vehicles.manufacturer.mode()</code></pre>
<p>[결과]</p>
<p>  0    ford
dtype: object</p>
<ul>
<li>제조사의 최빈값은 ford이다.</li>
</ul>
<h3 id="2-변산도-구하기">2. 변산도 구하기</h3>
<h4 id="1-가격의-범위">1) 가격의 범위</h4>
<p>[코드]</p>
<pre><code class="language-python">  vehicles.price.max() - vehicles.price.min()</code></pre>
<p>[결과]</p>
<p>25002999</p>
<h4 id="2-가격의-사분위수-범위iqr">2) 가격의 사분위수 범위(IQR)</h4>
<p>[코드]</p>
<pre><code class="language-python">vehicles.price.quantile(.75) - vehicles.price.quantile(.25)</code></pre>
<p>[결과]</p>
<p>20571</p>
<h4 id="3-가격의-분산">3) 가격의 분산</h4>
<p>[코드]</p>
<pre><code class="language-python">  vehicles.price.var()</code></pre>
<p>[결과]</p>
<p>5754159737.77</p>
<h4 id="4-가격의-표준편차">4) 가격의 표준편차</h4>
<p>[코드]</p>
<pre><code class="language-python">  vehicles.price.std()</code></pre>
<p>[결과]</p>
<p>75856.18</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[통계 이론] 기술 통계 ]]></title>
            <link>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%EA%B8%B0%EC%88%A0-%ED%86%B5%EA%B3%84</link>
            <guid>https://velog.io/@robin_dev/%ED%86%B5%EA%B3%84-%EC%9D%B4%EB%A1%A0-%EA%B8%B0%EC%88%A0-%ED%86%B5%EA%B3%84</guid>
            <pubDate>Thu, 22 Jul 2021 07:45:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>기술 통계(descriptive statistics)</strong>: 자료를 요약(summarize)하고, 정리(organize)하여 이해하기 쉽게 제시함.</p>
</blockquote>
<h3 id="1-중심경향값central-tendency">1. 중심경향값(central tendency)</h3>
<h4 id="1-평균mean-자료의-모든-숫자를-더한-뒤-값의-개수로-나눈-값">1) 평균(mean): 자료의 모든 숫자를 더한 뒤 값의 개수로 나눈 값</h4>
<p><img src="https://images.velog.io/images/robin_dev/post/8dad95cc-eca9-4c23-895c-0eda38f64820/image.png" alt=""></p>
<ul>
<li>분포에 있는 모든 값에 민감함.</li>
<li>분포에 있는 극단값에 영향을 많이 받음. <pre><code>&lt;예시&gt;
1, 2, 7, 100
평균: (1+2+7+100)/4 = 27.5</code></pre></li>
</ul>
<h4 id="2-중앙값-median-값을-크기-순서대로-나열했을-때-가장-중앙에-있는-값">2) 중앙값 (median): 값을 크기 순서대로 나열했을 때 가장 중앙에 있는 값</h4>
<ul>
<li>자료의 개수가 짝수일 경우, 가장 중앙에 있는 값
자료의 개수가 홀수일 경우, 중앙에 있는 두 값의 평균</li>
<li>평균과 달리 분포에 있는 극단값에 영향을 받지 않음.<pre><code>&lt;예시&gt;
1, 2, 7, 100
중앙값: (2+7)/2 = 4.5</code></pre></li>
</ul>
<h4 id="3-최빈값mode-가장-빈번하게-발생하는-값">3) 최빈값(mode): 가장 빈번하게 발생하는 값</h4>
<ul>
<li>연속 변수보다는 범주형 변수에서 유용함.<pre><code>&lt;예시&gt;
1, 1, 3, 7
최빈값: 1 </code></pre><blockquote>
<p><strong>데이터 분석 적용점</strong> : 데이터 분석에서 일반적으로 평균을 많이 활용함. 평균은 데이터에 있는 모든 값에 민감하고, 특히 극단값에 영향을 많이 받는다는 특징이 있음. *<em>따라서 데이터가 정규분포가 아니거나 극단값이 있는 상황에서는 평균보다 중앙값을 사용하는 것이 자료를 더 잘 대표할 수 있음. *</em></p>
</blockquote>
</li>
</ul>
<h3 id="2-변산도variability">2. 변산도(variability)</h3>
<h4 id="1범위range-분포에서-가장-큰-값에서-가장-작은-값을-뺀-값">1)범위(range): 분포에서 가장 큰 값에서 가장 작은 값을 뺀 값.</h4>
<ul>
<li>양 극단에 있는 값에 의해 구하기 때문에 다른 값들을 반영하지 않음.극단 값의 영향을 많이 받음. </li>
</ul>
<blockquote>
<p><strong>데이터 분석 적용점</strong>: <strong>데이터에 오류가 있는지 확인할 때 유용함.</strong> 척도가 있는 데이터라면 척도 범위를 벗어난 범위의 값이 존재한다면 데이터에 오류가 있을 가능성이 있음. </p>
</blockquote>
<h4 id="2사분위수-범위interquartile-range-75와-25에-위치한-값의-차이">2)사분위수 범위(interquartile range): 75%와 25%에 위치한 값의 차이</h4>
<pre><code>IQR = Q3 - Q1

(Q1 = 25% , Q2 = 50%, Q3 = 75%)
Q2는 중앙값과 동일함.</code></pre><ul>
<li>극단값의 영향이 적음.</li>
</ul>
<pre><code>&lt;예시&gt;
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Q1 --&gt; 3
Q2 --&gt; 5.5
Q3 --&gt; 8

IQR = Q3 - Q1 = 5</code></pre><ul>
<li>집단의 분포가 매우 흩어졌거나 양 극단에 있는 값이 변산도에 크게 영향을 준다고 판단할 때 사용하면 좋음. </li>
</ul>
<h4 id="3분산variance-편차제곱의-평균-값들이-평균에서-떨어진-거리를-제곱한-값의-평균">3)분산(variance): 편차제곱의 평균, 값들이 평균에서 떨어진 거리를 제곱한 값의 평균</h4>
<ul>
<li>편차(deviation): 특정 값이 평균으로부터 떨어진 거리</li>
<li>편차의 합은 0이 되기 때문에 분산 혹은 표준편차를 이용함.</li>
</ul>
<p>[모집단의 분산]
<img src="https://images.velog.io/images/robin_dev/post/c0b9aa2e-5d3a-4ab5-8fc9-b177dc40cd6c/image.png" alt=""></p>
<p>[표본집단의 분산]
<img src="https://images.velog.io/images/robin_dev/post/39fd6a62-2d13-4f54-87a2-df54a2a8b48c/image.png" alt=""></p>
<h4 id="4표준편차standard-deviation-분산의-제곱근">4)표준편차(standard deviation): 분산의 제곱근</h4>
<ul>
<li>가장 신뢰로운 변산도를 원할 때 사용함. 편차를 제곱하면 크기가 커지므로 표준편차를 많이 사용함.</li>
</ul>
<p>[모집단의 표준편차]
<img src="https://images.velog.io/images/robin_dev/post/693942eb-4ea1-400c-87a1-324b8158aa4d/image.png" alt=""></p>
<p>[표본집단의 표준편차]
<img src="https://images.velog.io/images/robin_dev/post/f2a32012-a58e-4781-99ff-9e0cfbd54ad7/image.png" alt=""></p>
<blockquote>
<p><strong>데이터 분석 적용점</strong>: <strong>중심경향값과 변산도를 함께 고려해야함.</strong> 그렇지 않으면 분포에 대해 단편적인 정보만 얻게 됨. 보통 평균과 표준편차를 함께 제시함. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL 쿼리 작성 / 실행 순서]]></title>
            <link>https://velog.io/@robin_dev/SQL-%EC%BF%BC%EB%A6%AC-%EC%9E%91%EC%84%B1-%EC%88%9C%EC%84%9C</link>
            <guid>https://velog.io/@robin_dev/SQL-%EC%BF%BC%EB%A6%AC-%EC%9E%91%EC%84%B1-%EC%88%9C%EC%84%9C</guid>
            <pubDate>Mon, 05 Jul 2021 09:17:14 GMT</pubDate>
            <description><![CDATA[<h3 id="sql-쿼리-작성-순서">SQL 쿼리 작성 순서</h3>
<p>1) <strong>SELECT</strong>
2) <strong>FROM</strong>
3) <strong>JOIN **
4) *<em>ON *</em>
5) **WHERE</strong> 
6) <strong>GROUP BY</strong>
7) <strong>HAVING</strong>
8) <strong>ORDER BY</strong>
9) <strong>LIMIT</strong></p>
<blockquote>
<p>Join을 하는 경우 WHERE은 JOIN ~ ON 뒤에 사용되니 주의하기. </p>
</blockquote>
<h3 id="sql-쿼리-실행-순서">SQL 쿼리 실행 순서</h3>
<p>1) <strong>FROM and JOINs</strong> 
2) <strong>WHERE</strong>
3) <strong>GROUP BY</strong>
4) <strong>HAVING</strong>
5) <strong>SELECT</strong>
6) <strong>DISTINCT</strong>
7) <strong>ORDER BY</strong>
8) <strong>LIMIT / OFFSET</strong></p>
<p>출처: 
<a href="https://mode.com/sql-tutorial/sql-having/">https://mode.com/sql-tutorial/sql-having/</a>
<a href="https://sqlbolt.com/lesson/select_queries_order_of_execution">https://sqlbolt.com/lesson/select_queries_order_of_execution</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] SQL 고득점 Kit - GROUP BY]]></title>
            <link>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-GROUP-BY</link>
            <guid>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-GROUP-BY</guid>
            <pubDate>Mon, 21 Jun 2021 11:50:03 GMT</pubDate>
            <description><![CDATA[<h3 id="animal_ins-테이블">ANIMAL_INS 테이블</h3>
<p>ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>INTAKE_CONDITION</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_INTAKE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody></table>
<h3 id="고양이와-개는-몇-마리-있을까">고양이와 개는 몇 마리 있을까</h3>
<h4 id="문제">문제</h4>
<p>동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.</p>
<h4 id="솔루션">솔루션</h4>
<pre><code class="language-sql">SELECT ANIMAL_TYPE
    , COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;</code></pre>
<h3 id="동명-동물-수-찾기">동명 동물 수 찾기</h3>
<h4 id="문제-1">문제</h4>
<p>동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.</p>
<h4 id="솔루션-1">솔루션</h4>
<pre><code class="language-sql">SELECT NAME
    , COUNT(NAME) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) &gt;= 2
ORDER BY NAME ASC;</code></pre>
<h3 id="animal_outs-테이블">ANIMAL_OUTS 테이블</h3>
<p>ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_OUTCOME</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody></table>
<h3 id="입양-시각-구하기1">입양 시각 구하기(1)</h3>
<h4 id="문제-2">문제</h4>
<p>보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.</p>
<h4 id="솔루션-2">솔루션</h4>
<pre><code class="language-sql">SELECT HOUR(DATETIME) AS HOUR
    , COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR ASC;</code></pre>
<blockquote>
<p><strong>HOUR(datetime)</strong>
: datetime에서 시간(hour) 부분만 리턴함.</p>
</blockquote>
<h3 id="입양-시각-구하기2">입양 시각 구하기(2)</h3>
<h4 id="문제-3">문제</h4>
<p>보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.</p>
<h4 id="솔루션-3">솔루션</h4>
<p>[step1]</p>
<pre><code class="language-sql">WITH RECURSIVE time (HOUR) AS (
    SELECT 0
    UNION ALL
    SELECT HOUR + 1 FROM time WHERE HOUR &lt; 23
)
SELECT * FROM time;</code></pre>
<table>
<thead>
<tr>
<th>HOUR</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
</tr>
<tr>
<td>1</td>
</tr>
<tr>
<td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
<tr>
<td>4</td>
</tr>
<tr>
<td>5</td>
</tr>
<tr>
<td>6</td>
</tr>
<tr>
<td>7</td>
</tr>
<tr>
<td>8</td>
</tr>
<tr>
<td>9</td>
</tr>
<tr>
<td>10</td>
</tr>
<tr>
<td>11</td>
</tr>
<tr>
<td>12</td>
</tr>
<tr>
<td>13</td>
</tr>
<tr>
<td>14</td>
</tr>
<tr>
<td>15</td>
</tr>
<tr>
<td>16</td>
</tr>
<tr>
<td>17</td>
</tr>
<tr>
<td>18</td>
</tr>
<tr>
<td>19</td>
</tr>
<tr>
<td>20</td>
</tr>
<tr>
<td>21</td>
</tr>
<tr>
<td>22</td>
</tr>
<tr>
<td>23</td>
</tr>
</tbody></table>
<p>[step2]</p>
<pre><code class="language-sql">WITH RECURSIVE time AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM time WHERE HOUR &lt; 23
)

SELECT HOUR
     , COUNT(HOUR(ao.DATETIME)) AS COUNT
FROM time
LEFT JOIN ANIMAL_OUTS AS ao
ON time.HOUR = HOUR(ao.DATETIME)
GROUP BY HOUR
ORDER BY HOUR</code></pre>
<table>
<thead>
<tr>
<th>HOUR</th>
<th>COUNT</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>2</td>
<td>0</td>
</tr>
<tr>
<td>3</td>
<td>0</td>
</tr>
<tr>
<td>4</td>
<td>0</td>
</tr>
<tr>
<td>5</td>
<td>0</td>
</tr>
<tr>
<td>6</td>
<td>0</td>
</tr>
<tr>
<td>7</td>
<td>3</td>
</tr>
<tr>
<td>8</td>
<td>1</td>
</tr>
<tr>
<td>9</td>
<td>1</td>
</tr>
<tr>
<td>10</td>
<td>2</td>
</tr>
<tr>
<td>11</td>
<td>13</td>
</tr>
<tr>
<td>12</td>
<td>10</td>
</tr>
<tr>
<td>13</td>
<td>14</td>
</tr>
<tr>
<td>14</td>
<td>9</td>
</tr>
<tr>
<td>15</td>
<td>7</td>
</tr>
<tr>
<td>16</td>
<td>10</td>
</tr>
<tr>
<td>17</td>
<td>12</td>
</tr>
<tr>
<td>18</td>
<td>16</td>
</tr>
<tr>
<td>19</td>
<td>2</td>
</tr>
<tr>
<td>20</td>
<td>0</td>
</tr>
<tr>
<td>21</td>
<td>0</td>
</tr>
<tr>
<td>22</td>
<td>0</td>
</tr>
<tr>
<td>23</td>
<td>0</td>
</tr>
</tbody></table>
<blockquote>
<p><strong>Common Table Expressions</strong>(공통테이블식)
: 공통테이블식은 쿼리 실행동안 존재하는 일시적인 쿼리 실행의 결과물임. 스스로 참조하거나(재귀공통테이블) 혹은 같은 쿼리에서 여러번 참조할 수 있음. </p>
</blockquote>
<p><strong>Recursive Common Table Expressions</strong></p>
<p>[사용법]</p>
<pre><code class="language-sql">WITH RECURSIVE cte_name AS (
    initial_query  -- anchor member
    UNION ALL
    recursive_query -- recursive member that references to the CTE name
)
SELECT * FROM cte_name;</code></pre>
<p>[예시]</p>
<pre><code class="language-sql">WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n &lt; 5
)
SELECT * FROM cte;</code></pre>
<table>
<thead>
<tr>
<th>n</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
</tr>
<tr>
<td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
<tr>
<td>4</td>
</tr>
<tr>
<td>5</td>
</tr>
</tbody></table>
<p>출처: </p>
<ul>
<li>문제 풀이 <a href="https://programmers.co.kr/learn/challenges">https://programmers.co.kr/learn/challenges</a></li>
<li>개념 설명 <a href="https://www.mysqltutorial.org/mysql-recursive-cte/">https://www.mysqltutorial.org/mysql-recursive-cte/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] SQL 고득점 Kit - SUM, MAX, MIN]]></title>
            <link>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-SUM-MAX-MIN</link>
            <guid>https://velog.io/@robin_dev/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EA%B3%A0%EB%93%9D%EC%A0%90-Kit-SUM-MAX-MIN</guid>
            <pubDate>Sun, 20 Jun 2021 10:41:52 GMT</pubDate>
            <description><![CDATA[<h3 id="animal_ins-테이블">ANIMAL_INS 테이블</h3>
<p>ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table>
<thead>
<tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
<tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>INTAKE_CONDITION</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_INTAKE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody></table>
<h3 id="최댓값-구하기">최댓값 구하기</h3>
<h4 id="문제">문제</h4>
<p>가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.</p>
<h4 id="솔루션">솔루션</h4>
<pre><code class="language-sql">SELECT MAX(DATETIME)
FROM ANIMAL_INS;</code></pre>
<h3 id="최솟값-구하기">최솟값 구하기</h3>
<h4 id="문제-1">문제</h4>
<p>동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.</p>
<h4 id="솔루션-1">솔루션</h4>
<pre><code class="language-sql">SELECT MIN(DATETIME)
FROM ANIMAL_INS;</code></pre>
<h3 id="동물-수-구하기">동물 수 구하기</h3>
<h4 id="문제-2">문제</h4>
<p>동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.</p>
<h4 id="솔루션-2">솔루션</h4>
<pre><code class="language-sql">SELECT COUNT(ANIMAL_ID)
FROM ANIMAL_INS;</code></pre>
<h3 id="중복-제거하기">중복 제거하기</h3>
<h4 id="문제-3">문제</h4>
<p>동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.</p>
<h4 id="솔루션-3">솔루션</h4>
<pre><code class="language-sql">SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS;</code></pre>
<blockquote>
<p><strong>COUNT (column)</strong>
: column의 rows의 수를 셈. ** NULL 값 제외하고 수를 셈. **</p>
</blockquote>
<blockquote>
<p><strong>COUNT (DISTINCT column)</strong>
: column의 rows 중 중복된 값을 제외하고 고유한 값의 수를 셈. ** NULL 값 제외하고 수를 셈. **</p>
</blockquote>
<p>출처: <a href="https://programmers.co.kr/learn/challenges">https://programmers.co.kr/learn/challenges</a></p>
]]></description>
        </item>
    </channel>
</rss>