이번 노드에서는 외부 강사님 통해서 '기초 통계'를 배울 수 있었다.
외부 강사님께서는 학부는 공대 출신이고 석사 과정을 빅데이터 관련된
학교를 다니시다가 현업 경력이 좀 있으셨다.
나처럼 제조업, 금융업 경험보다는 IT쪽 이어서 많이 신선했다.
특히 외부 강사님께서 정말 수업자료를 열심히 준비해 오셨다.
import numpy as np
data = [10, 20, 20, 30, 40]
#코드작성
_mean = np.mean(data)
_median = np.median(data)
_var = np.var(data)
_std = np.std(data)
print(f'평균은 {_mean:.3f}')
print(f'중앙값은 {_median:.3f}')
print(f'분산은 {_var:.3f}')
print(f'표준편차는 {_std:.3f}')
import numpy as np
import matplotlib.pyplot as plt
# 속도1 고정 (예: 갈 때 시속 60km/h)
v1 = 60
# 속도2 변화 (예: 돌아올 때 속도)
v2 = np.linspace(1, 120, 500)
# 산술평균
arith_mean = (v1 + v2) / 2
# 조화평균 (왕복 전체 평균 속력)
harm_mean = 2 * v1 * v2 / (v1 + v2)
plt.figure(figsize=(10, 6))
plt.plot(v2, arith_mean, label="Arithmetic Mean", color="blue")
plt.plot(v2, harm_mean, label="Harmonic Mean", color="green")
plt.axhline(v1, color="red", linestyle="--", label="Fixed Speed (v1=60)")
plt.xlabel("Return Speed (v2, km/h)")
plt.ylabel("Average Speed (km/h)")
plt.title("Arithmetic vs Harmonic Mean of Round-trip Speeds")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
# Numpy 방법
import numpy as np
com_a = [76300, 77400, 77900, 77200, 76900, 78800]
com_b = [6400, 7000, 7400, 6900, 7300, 7600]
# Numpy 방법
mean_a_np = np.mean(com_a)
std_a_np = np.std(com_a, ddof=1)
cv_a_np = std_a_np / mean_a_np
mean_b_np = np.mean(com_b)
std_b_np = np.std(com_b, ddof=1)
cv_b_np = std_b_np / mean_b_np
print(f'A회사의 변동계수 {cv_a_np:.3f}')
print(f'B회사의 변동계수 {cv_b_np:.3f}')
# Pandas 방법
import pandas as pd
data = pd.DataFrame({'Company A': com_a, 'Company B': com_b})
mean_a_pd = data['Company A'].mean()
std_a_pd = data['Company A'].std()
cv_a_pd = std_a_pd / mean_a_pd
mean_b_pd = data['Company B'].mean()
std_b_pd = data['Company B'].std()
cv_b_pd = std_b_pd / mean_b_pd
print(f'A회사의 변동계수 {cv_a_pd:.3f}')
print(f'B회사의 변동계수 {cv_b_pd:.3f}')
data = [10, 12, 23, 23, 16, 23, 21, 16, 7, 9]
#코드 작성
data_range = np.max(data) - np.min(data)
iqr = np.percentile(data,75) - np.percentile(data,25)
print(f'최대최소범위 {data_range:.3f}')
print(f'iqr {iqr:.3f}')
import matplotlib.pyplot as plt
plt.boxplot(data)
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
tips = sns.load_datasets('tips')
display(tips.head(3))
display(tips.describe(include = 'all'))
mean = tips['total_bill'].mean()
median = tips['total_bill'].median()
variance = tips['total_bill'].var()
std_dev = tips['total_bill'].std()
print(f"Mean: {mean:.3f}, Median: {median:.3f}, Variance: {variance:.3f}, Std Dev: {std_dev:.3f}")
tips.groupby("day")["tip"].mean().round(3)
tips.groupby("smoker")["total_bill"].agg(["mean","std"])
tips.groupby(["sex", "smoker"])["tip"].mean()
tips.groupby("day")["total_bill"].sum()
# countplot: x축 범주형, y축 관측치
sns.countplot(data = tips, x = 'day')
# barplot: X축이 범주형, Y축이 연속형 값
sns.barplot(data = tips, x = 'sex', y = 'tip', estimator = 'mean')
sns.boxplot(data = tips, x = 'time',y = 'total_bill')
sns.histplot(data = tips, x = 'total_bill')
sns.scatterplot(data = tips, x = 'total_bill', y = 'tip')
sns.pairplot(data = tips)
# 난수 생성
data = np.random.rand(100)
# 평균과 표준편차 계산
mean = np.mean(data)
std_dev = np.std(data)
print(f"Mean: {mean:.3f}")
print(f"Standard Deviation: {std_dev:.3f}")
import numpy as np
import matplotlib.pyplot as plt
# 1. 주사위 던지기 시뮬레이션
rolls = []
for _ in range(100): # 주사위를 100번 던짐
roll = np.random.randint(1, 7) # 1부터 6까지의 정수 중 하나를 무작위로 선택
rolls.append(roll)
# 2. 각 숫자의 빈도 계산
roll_counts = {}
for number in range(1, 7): # 주사위는 1부터 6까지의 숫자를 가짐
roll_counts[number] = rolls.count(number) # 각 숫자가 rolls에 몇 번 등장했는지 계산
# 3. 결과 출력
print("Dice roll counts:", roll_counts)
# 4. 히스토그램 그리기
plt.hist(rolls, bins=np.arange(1, 8) - 0.5, color='skyblue', edgecolor='black')
plt.title("Dice Roll Simulation (100 Rolls)")
plt.xlabel("Dice Number")
plt.ylabel("Frequency")
plt.yticks(range(0, 26,2))
plt.xticks(range(1, 7)) # X축에 1부터 6까지 숫자를 표시
plt.show()
import matplotlib.pyplot as plt
# 정규분포 데이터 생성
data = np.random.normal(loc=50, scale=10, size=1000)
# 히스토그램 그리기
plt.hist(data, bins=30, color='blue', alpha=0.7)
plt.title("Histogram of Normal Distribution")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()
import numpy as np
num_trial = 5 # 5,000원치 기준 (10,000원이면 10을 입력)
result = []
for i in range(1, num_trial+1):
num_list = np.arange(1,46)
chosen_num = np.random.choice(num_list,6,replace=False)
chosen_num.sort()
result.append(chosen_num)
for i in lotto in enumerate(result, i):
print(f"{i}번째 로또번호 {result}")
그러면 결과는 이렇게 나온다.
사실 기초 확률을 배웠으면 다들 알 것이다. 로또 1등 당첨 확률은
800만 분의 1 정도 된다는 것을.
GPT에게 좀 물어봤다. 50년간 매주 1만(10게임) 살 때, 당첨금의
기대값이 어떨지.
GPT에게 이런 것도 물어봤다. 매주 1만원씩 50년간 꾸준히 미국
배당주에 투자할 때(보수적으로 수익률 5-6% 잡아보자.),
어떻게 자산이 변하는지.(리얼티인컴 사면 연배당률 5.5%는 넘으니까,
S&P 500은 배당은 적더라도 연 평균 상승률이 7%쯤 되니까.)
import numpy as np
# 설정
weekly_investment = 10000 # 매주 1만원
years = 50
weeks_per_year = 52
total_weeks = years * weeks_per_year
# 연 수익률 가정
dividend_stock_return = 0.055 # 5.5%
sp500_return = 0.07 # 7%
# 적립식 투자 계산 함수
def future_value_regular_investment(weekly_amount, weeks, annual_return):
r = (1 + annual_return) ** (1 / 52) - 1 # 주간 수익률
return weekly_amount * (((1 + r) ** weeks - 1) / r)
# 계산
fv_dividend = future_value_regular_investment(weekly_investment, total_weeks, dividend_stock_return)
fv_sp500 = future_value_regular_investment(weekly_investment, total_weeks, sp500_return)
fv_dividend, fv_sp500