<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sin_98.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 07 Jul 2025 11:32:23 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. sin_98.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sin_98" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[4]]></title>
            <link>https://velog.io/@sin_98/4</link>
            <guid>https://velog.io/@sin_98/4</guid>
            <pubDate>Mon, 07 Jul 2025 11:32:23 GMT</pubDate>
            <description><![CDATA[<p>4</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3]]></title>
            <link>https://velog.io/@sin_98/3</link>
            <guid>https://velog.io/@sin_98/3</guid>
            <pubDate>Thu, 03 Jul 2025 11:06:41 GMT</pubDate>
            <description><![CDATA[<p>3</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2]]></title>
            <link>https://velog.io/@sin_98/2</link>
            <guid>https://velog.io/@sin_98/2</guid>
            <pubDate>Wed, 02 Jul 2025 10:09:23 GMT</pubDate>
            <description><![CDATA[<p>2</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1]]></title>
            <link>https://velog.io/@sin_98/1</link>
            <guid>https://velog.io/@sin_98/1</guid>
            <pubDate>Tue, 01 Jul 2025 11:34:54 GMT</pubDate>
            <description><![CDATA[<p>1</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아티클] 거래 후기 실험을 통해 따뜻한 거래 경험 만들기]]></title>
            <link>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-%EA%B1%B0%EB%9E%98-%ED%9B%84%EA%B8%B0-%EC%8B%A4%ED%97%98%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%94%B0%EB%9C%BB%ED%95%9C-%EA%B1%B0%EB%9E%98-%EA%B2%BD%ED%97%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-%EA%B1%B0%EB%9E%98-%ED%9B%84%EA%B8%B0-%EC%8B%A4%ED%97%98%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%94%B0%EB%9C%BB%ED%95%9C-%EA%B1%B0%EB%9E%98-%EA%B2%BD%ED%97%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 30 Jun 2025 10:14:38 GMT</pubDate>
            <description><![CDATA[<p><a href="https://medium.com/daangn/%EA%B1%B0%EB%9E%98-%ED%9B%84%EA%B8%B0-%EC%8B%A4%ED%97%98%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%94%B0%EB%9C%BB%ED%95%9C-%EA%B1%B0%EB%9E%98-%EA%B2%BD%ED%97%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-3d7ac18d8e3">https://medium.com/daangn/%EA%B1%B0%EB%9E%98-%ED%9B%84%EA%B8%B0-%EC%8B%A4%ED%97%98%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%94%B0%EB%9C%BB%ED%95%9C-%EA%B1%B0%EB%9E%98-%EA%B2%BD%ED%97%98-%EB%A7%8C%EB%93%A4%EA%B8%B0-3d7ac18d8e3</a></p>
<p>요약 : 당근마켓은 거래 후기가 사용자 유지율에 긍정적 영향을 미친다는 데이터를 발견했다. </p>
<p>구매자가 후기를 잘 쓰지 않는 문제를 해결하기 위해, 시스템 메시지로 후기 작성을 유도하는 실험을 진행했다.</p>
<p>실험 결과 후기 작성률이 유의미하게 증가하여 기능으로 정식 적용되었다.</p>
<p>인사이트 : 사소한 피드백 유도로 장기 이용률을 높이는 전략이 될수있고, 후기는 서비스의 마무리가 아니라 재참여의 시작이 될수있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아티클] KPI 분석을 통해 마케팅 성과를 측정하고 신속한 의사결정으로 비즈니스 성장 가속화하기]]></title>
            <link>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-KPI-%EB%B6%84%EC%84%9D%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%A7%88%EC%BC%80%ED%8C%85-%EC%84%B1%EA%B3%BC%EB%A5%BC-%EC%B8%A1%EC%A0%95%ED%95%98%EA%B3%A0-%EC%8B%A0%EC%86%8D%ED%95%9C-%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95%EC%9C%BC%EB%A1%9C-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EC%84%B1%EC%9E%A5-%EA%B0%80%EC%86%8D%ED%99%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-KPI-%EB%B6%84%EC%84%9D%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%A7%88%EC%BC%80%ED%8C%85-%EC%84%B1%EA%B3%BC%EB%A5%BC-%EC%B8%A1%EC%A0%95%ED%95%98%EA%B3%A0-%EC%8B%A0%EC%86%8D%ED%95%9C-%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95%EC%9C%BC%EB%A1%9C-%EB%B9%84%EC%A6%88%EB%8B%88%EC%8A%A4-%EC%84%B1%EC%9E%A5-%EA%B0%80%EC%86%8D%ED%99%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 25 Jun 2025 11:53:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://epart.com/%EC%A3%BC%EC%9A%94-%EC%A7%80%ED%91%9C%EB%A5%BC-%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%9C%BC%EB%A1%9C-%EB%B6%84%EC%84%9D%ED%95%98%EB%8A%94-%EB%8C%80%EC%8B%9C%EB%B3%B4%EB%93%9C-%ED%99%9C%EC%9A%A9%EB%B2%95-kpi/">https://epart.com/%EC%A3%BC%EC%9A%94-%EC%A7%80%ED%91%9C%EB%A5%BC-%EC%8B%A4%EC%8B%9C%EA%B0%84%EC%9C%BC%EB%A1%9C-%EB%B6%84%EC%84%9D%ED%95%98%EB%8A%94-%EB%8C%80%EC%8B%9C%EB%B3%B4%EB%93%9C-%ED%99%9C%EC%9A%A9%EB%B2%95-kpi/</a></p>
<p>요약 : KPI(핵심성과지표)는 비즈니스 성과를 측정하고 성장 전략을 수립하는 핵심 도구이며, 실시간 대시보드와 데이터 분석을 통해 효과적인 의사결정을 가능하게 한다.</p>
<p>주요포인트 : 데이터는 수집보다 활용이 중요하며 kpi는 그 데이터를 의미있는 행동으로 연결해주는 지표다.</p>
<p>kpi를 단순히 측정의 도구가 아니라 실행을 유도하는 트리거로 삼을때 비로소 데이터 기반의 경영이 가능해진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[이력서 작성 ]]></title>
            <link>https://velog.io/@sin_98/%EC%9D%B4%EB%A0%A5%EC%84%9C-%EC%9E%91%EC%84%B1</link>
            <guid>https://velog.io/@sin_98/%EC%9D%B4%EB%A0%A5%EC%84%9C-%EC%9E%91%EC%84%B1</guid>
            <pubDate>Tue, 24 Jun 2025 12:04:40 GMT</pubDate>
            <description><![CDATA[<p>저는 어릴 때부터 게임을 좋아했고, 게임 개발자가 되기 위해 컴퓨터공학과에 진학했지만, 스스로를 돌아본 결과 게임의 메커니즘과 효율을 분석하고 이를 블로그나 커뮤니티에 공유하는 데 보람을 느꼈던 사람이라는 걸 깨달아 데이터 분석가로 진로를 바꾸었습니다. 현재는 스파르타 코딩클럽 국비 과정을 통해 데이터 분석 역량을 키우고 있으며, 직접 게임을 플레이하고 데이터를 체감하는 것을 가장 중요하게 생각하는 ‘게이머형 데이터분석가’를 목표로 성장하고 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[팀플] KPT 회고]]></title>
            <link>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-KPT-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-KPT-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Mon, 23 Jun 2025 11:59:11 GMT</pubDate>
            <description><![CDATA[<p> Keep / Problem / Try 방식으로 팀 프로젝트를 돌아보며
 배운 점, 아쉬운 점, 다음에 시도해보고 싶은 점을 자유롭게 작성해주세요!</p>
<p>keep </p>
<p>분석을 시작하기전에 컬럼을 쪼개고 쪼개서 파고들고 문제정의를 하는것을 배웠다.</p>
<p>problem</p>
<p>시각화에있어서 강조하고싶은부분을 색상을 달리 배치해서 강조하는게 좋고 AB테스트에 있어서 착각한 부분이 있었던 것 같다. 
그리고 뭔가 분석한건 많았는데 정작 발표에 쓸 자료는 몇개 없었던것같다. 도중에 문제정의 가설 부분에서 계속 바꾸고 많이 헤매서 그런것같다. 다음부터는 명확한 주제에서 문제정의를 명확하게 하고 가설 및 검증을 그 주제에 맞게 세분화해서 진행해야겠다.</p>
<p>try</p>
<p>다음번엔 각자 할 것을 나눠서 누군 a를 맡고 누군 b를 맡아 분업화해서 좀더 폭넓은 분석을 진행하는게 좋을것같다. 다같이 하나에 몰두하다보니 쓴 시간에 비해 결과물의 양이 그리 많지 않았던 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[팀플] 기초프로젝트 ppt 제작 ]]></title>
            <link>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-ppt-%EC%A0%9C%EC%9E%91</link>
            <guid>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-ppt-%EC%A0%9C%EC%9E%91</guid>
            <pubDate>Wed, 18 Jun 2025 11:08:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/sin_98/post/d71a5c72-045a-47a6-959d-bef62c25180a/image.png" alt=""></p>
<p>ppt 80% 정도 다같이 열심히 만들고 중간중간 추가적으로 필요한 데이터들을 다시 코드짜서 파헤쳤다.</p>
<pre><code># 상품코드 → 상품명 딕셔너리 만들기 (중복 제거)
code_to_name = df[[&#39;product_code&#39;, &#39;prod_name&#39;]].drop_duplicates().set_index(&#39;product_code&#39;)[&#39;prod_name&#39;].to_dict()

# 결과 저장용 리스트
results_top1_by_age = []

# 20~50대 각각의 연령대별 Top1 상품코드 찾기
for age in range(20, 60, 10):  # 20, 30, 40, 50
    subset = df_agree[df_agree[&#39;age_group&#39;] == age]
    vc = subset[&#39;product_code&#39;].value_counts().head(1)  # 가장 많이 팔린 상품 1개
    top1 = list(zip(vc.index.tolist(), vc.values.tolist()))

    results_top1_by_age.append({
        &#39;나이대&#39;: f&quot;{age}대&quot;,
        &#39;Top1&#39;: top1
    })

# 출력
for row in results_top1_by_age:
    print(f&quot;{row[&#39;나이대&#39;]} best 상품:&quot;)
    for code, count in row[&#39;Top1&#39;]:
        name = code_to_name.get(code, &quot;(상품명 없음)&quot;)
        print(f&quot;- {name} ({code}) : {count}개&quot;)
    print()
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[팀플] 기초프로젝트 시각화]]></title>
            <link>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EA%B0%81%ED%99%94</link>
            <guid>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%8B%9C%EA%B0%81%ED%99%94</guid>
            <pubDate>Tue, 17 Jun 2025 12:02:47 GMT</pubDate>
            <description><![CDATA[<pre><code>!apt-get -qq install -y fonts-nanum
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 시스템에 설치된 나눔고딕 경로 확인
font_paths = fm.findSystemFonts(fontpaths=[&#39;/usr/share/fonts/truetype/nanum&#39;])
nanumgothic_path = [f for f in font_paths if &#39;NanumGothic.ttf&#39; in f][0]

# 해당 경로를 matplotlib에 수동 지정
fontprop = fm.FontProperties(fname=nanumgothic_path)
plt.rcParams[&#39;axes.unicode_minus&#39;] = False

from collections import Counter
from google.colab import drive
drive.mount(&#39;/content/drive&#39;)

# 데이터 불러오기
df = pd.read_csv(&#39;/content/drive/MyDrive/h&amp;m_dataset/data.csv&#39;)

# 상품별 판매량 집계
product_counts = df[&#39;prod_name&#39;].value_counts()

# 상위 10개 상품 선택
top10 = product_counts.head(10).index.tolist()
top10_print = product_counts.head(10)

# top 10 출력
for product, count in top10_print.items():
    print(f&quot;{product} : {count}개&quot;)

# 추천 세트 저장할 리스트
bundle_sets = []


# 함수: 연관 상품 찾기
def find_bundle(base_product):
    # 해당 상품 구매자 ID 목록
    buyers = df[df[&#39;prod_name&#39;] == base_product][&#39;customer_id&#39;].unique()

    # 그 사람들이 산 다른 상품
    other = df[
        (df[&#39;customer_id&#39;].isin(buyers)) &amp;
        (df[&#39;prod_name&#39;] != base_product)
    ]

    counter = Counter(other[&#39;prod_name&#39;])

    if counter:
        best_match, match_count = counter.most_common(1)[0]
    else:
        best_match, match_count = None, 0

    return best_match, match_count

# 루프 돌면서 base 상품과 연관 상품 + 판매량 함께 저장
used_products = set()  # 이미 세트에 사용된 상품 추적용

for base in top10:
    base_count = product_counts[base]

    if base in used_products:
        continue  # 이미 세트에 포함된 상품은 스킵

    # base 상품을 산 고객들
    buyers = df[df[&#39;prod_name&#39;] == base][&#39;customer_id&#39;].unique()

    # 그 고객들이 산 다른 상품 (base 제외, used 제외)
    other = df[
        (df[&#39;customer_id&#39;].isin(buyers)) &amp;
        (df[&#39;prod_name&#39;] != base) &amp;
        (~df[&#39;prod_name&#39;].isin(used_products))
    ]

    counter = Counter(other[&#39;prod_name&#39;])

    if counter:
        bundle_product, bundle_count = counter.most_common(1)[0]
    else:
        bundle_product, bundle_count = None, 0

    bundle_sets.append({
        &#39;base_product&#39;: base,
        &#39;base_count&#39;: base_count,
        &#39;bundle_product&#39;: bundle_product,
        &#39;bundle_count&#39;: bundle_count
    })

    # 사용된 상품 등록
    used_products.add(base)
    if bundle_product:
        used_products.add(bundle_product)

# 출력
for row in bundle_sets:
    print(f&quot;{row[&#39;base_product&#39;]} ({row[&#39;base_count&#39;]}개 팔림) → {row[&#39;bundle_product&#39;]} ({row[&#39;bundle_count&#39;]}개 팔림)&quot;)

# FN + Active 모두 동의한 유저만 추출
df_agree = df[(df[&#39;FN&#39;] == 1) &amp; (df[&#39;Active&#39;] == 1)].copy()

# 나이대 생성
df_agree[&#39;age_group&#39;] = (df_agree[&#39;age&#39;] // 10 * 10).astype(int)
df_agree = df_agree[df_agree[&#39;age_group&#39;].between(10, 90)]

# 날짜 변환 + 계절 생성
df_agree[&#39;t_dat&#39;] = pd.to_datetime(df_agree[&#39;t_dat&#39;])

def get_season(month):
    if month in [3, 4, 5]: return &#39;봄&#39;
    elif month in [6, 7, 8]: return &#39;여름&#39;
    elif month in [9, 10, 11]: return &#39;가을&#39;
    else: return &#39;겨울&#39;

df_agree[&#39;season&#39;] = df_agree[&#39;t_dat&#39;].dt.month.apply(get_season)

# 결과 저장
results = []

# 나이대, 계절 조합별 Top5 상품코드 + 판매량
for age in range(10, 100, 10):
    for season in [&#39;봄&#39;, &#39;여름&#39;, &#39;가을&#39;, &#39;겨울&#39;]:
        subset = df_agree[(df_agree[&#39;age_group&#39;] == age) &amp; (df_agree[&#39;season&#39;] == season)]
        vc = subset[&#39;product_code&#39;].value_counts().head(5)
        top5 = list(zip(vc.index.tolist(), vc.values.tolist()))  # (코드, 수량)
        results.append({
            &#39;나이대&#39;: f&quot;{age}대&quot;,
            &#39;계절&#39;: season,
            &#39;Top5&#39;: top5
        })

# 출력
for row in results:
    print(f&quot;{row[&#39;나이대&#39;]} {row[&#39;계절&#39;]} Top5 상품코드:&quot;)
    for code, count in row[&#39;Top5&#39;]:
        print(f&quot;- {code} ({count}개)&quot;)
    print()

# 상품코드 -&gt; 상품명으로 변경
# 상품명 매핑 딕셔너리 만들기 중복 제거
code_to_name = df[[&#39;product_code&#39;, &#39;prod_name&#39;]].drop_duplicates().set_index(&#39;product_code&#39;)[&#39;prod_name&#39;].to_dict()

# 결과 저장
results_name = []

# 나이대, 계절 조합별 Top1 상품코드 추출
for age in range(10, 100, 10):
    for season in [&#39;봄&#39;, &#39;여름&#39;, &#39;가을&#39;, &#39;겨울&#39;]:
        subset = df_agree[(df_agree[&#39;age_group&#39;] == age) &amp; (df_agree[&#39;season&#39;] == season)]
        vc = subset[&#39;product_code&#39;].value_counts().head(1)
        top1 = list(zip(vc.index.tolist(), vc.values.tolist()))  # (상품코드, 판매량)
        results_name.append({
            &#39;나이대&#39;: f&quot;{age}대&quot;,
            &#39;계절&#39;: season,
            &#39;Top1&#39;: top1
        })

# 출력
for row in results_name:
    print(f&quot;{row[&#39;나이대&#39;]} {row[&#39;계절&#39;]} best 상품:&quot;)
    for code, count in row[&#39;Top1&#39;]:
        name = code_to_name.get(code, &quot;(상품명 없음)&quot;)
        print(f&quot;- {name} ({code}) : {count}개&quot;)
    print()
plot_data = []
for row in results_name:
    age = row[&#39;나이대&#39;]
    season = row[&#39;계절&#39;]
    for code, count in row[&#39;Top1&#39;]:
        name = code_to_name.get(code, &quot;(상품명 없음)&quot;)
        label = f&quot;{age} {season}&quot;
        plot_data.append({
            &#39;label&#39;: label,
            &#39;count&#39;: count,
            &#39;product_name&#39;: name
        })

plot_df = pd.DataFrame(plot_data)

# 시각화
plt.figure(figsize=(12, 18))
bars = plt.barh(plot_df[&#39;label&#39;], plot_df[&#39;count&#39;], color=&#39;cornflowerblue&#39;)

for bar, name, count in zip(bars, plot_df[&#39;product_name&#39;], plot_df[&#39;count&#39;]):
    width = bar.get_width()
    label = f&quot;{name} ({count}개)&quot;
    plt.text(width + 3, bar.get_y() + bar.get_height()/2, label,
             va=&#39;center&#39;, ha=&#39;left&#39;, fontsize=8, fontproperties=fontprop)

plt.title(&#39;연령대, 계절별 best 상품명 (판매량 포함)&#39;, fontproperties=fontprop)
plt.xlabel(&#39;판매량&#39;, fontproperties=fontprop)
plt.ylabel(&#39;연령대 + 계절&#39;, fontproperties=fontprop)
plt.yticks(fontproperties=fontprop)
plt.tight_layout()
plt.show()


vc2 = df_agree[&#39;product_code&#39;].value_counts().head(10)  # top10 기준, 숫자 조정 가능

# 결과 출력
print(&quot;열혈유저 기준 Top10 인기 상품:&quot;)
for code, count in vc2.items():
    name = code_to_name.get(code, &quot;(상품명 없음)&quot;)
    print(f&quot;- {name} ({code}) : {count}개&quot;)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[팀플] 기초프로젝트 분석]]></title>
            <link>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Mon, 16 Jun 2025 11:27:40 GMT</pubDate>
            <description><![CDATA[<pre><code>import pandas as pd
from collections import Counter
from google.colab import drive
drive.mount(&#39;/content/drive&#39;)

# 데이터 불러오기
df = pd.read_csv(&#39;/content/drive/MyDrive/h&amp;m_dataset/data.csv&#39;)

# 상품별 판매량 집계
product_counts = df[&#39;prod_name&#39;].value_counts()

# 상위 10개 상품 선택
top10 = product_counts.head(10).index.tolist()
top10_print = product_counts.head(10)

# top 10 출력
for product, count in top10_print.items():
    print(f&quot;{product} : {count}개&quot;)

# 추천 세트 저장할 리스트
bundle_sets = []


# 함수: 연관 상품 찾기
def find_bundle(base_product):
    # 해당 상품 구매자 ID 목록
    buyers = df[df[&#39;prod_name&#39;] == base_product][&#39;customer_id&#39;].unique()

    # 그 사람들이 산 다른 상품
    other = df[
        (df[&#39;customer_id&#39;].isin(buyers)) &amp;
        (df[&#39;prod_name&#39;] != base_product)
    ]

    counter = Counter(other[&#39;prod_name&#39;])

    if counter:
        best_match, match_count = counter.most_common(1)[0]
    else:
        best_match, match_count = None, 0

    return best_match, match_count

# 루프 돌면서 base 상품과 연관 상품 + 판매량 함께 저장
used_products = set()  # 이미 세트에 사용된 상품 추적용

for base in top10:
    base_count = product_counts[base]

    if base in used_products:
        continue  # 이미 세트에 포함된 상품은 스킵

    # base 상품을 산 고객들
    buyers = df[df[&#39;prod_name&#39;] == base][&#39;customer_id&#39;].unique()

    # 그 고객들이 산 다른 상품 (base 제외, used 제외)
    other = df[
        (df[&#39;customer_id&#39;].isin(buyers)) &amp;
        (df[&#39;prod_name&#39;] != base) &amp;
        (~df[&#39;prod_name&#39;].isin(used_products))
    ]

    counter = Counter(other[&#39;prod_name&#39;])

    if counter:
        bundle_product, bundle_count = counter.most_common(1)[0]
    else:
        bundle_product, bundle_count = None, 0

    bundle_sets.append({
        &#39;base_product&#39;: base,
        &#39;base_count&#39;: base_count,
        &#39;bundle_product&#39;: bundle_product,
        &#39;bundle_count&#39;: bundle_count
    })

    # 사용된 상품 등록
    used_products.add(base)
    if bundle_product:
        used_products.add(bundle_product)

# 출력
for row in bundle_sets:
    print(f&quot;{row[&#39;base_product&#39;]} ({row[&#39;base_count&#39;]}개 팔림) → {row[&#39;bundle_product&#39;]} ({row[&#39;bundle_count&#39;]}개 팔림)&quot;)

# FN + Active 모두 동의한 유저만 추출
df_agree = df[(df[&#39;FN&#39;] == 1) &amp; (df[&#39;Active&#39;] == 1)].copy()

# 나이대 생성
df_agree[&#39;age_group&#39;] = (df_agree[&#39;age&#39;] // 10 * 10).astype(int)
df_agree = df_agree[df_agree[&#39;age_group&#39;].between(10, 90)]

# 날짜 변환 + 계절 생성
df_agree[&#39;t_dat&#39;] = pd.to_datetime(df_agree[&#39;t_dat&#39;])

def get_season(month):
    if month in [3, 4, 5]: return &#39;봄&#39;
    elif month in [6, 7, 8]: return &#39;여름&#39;
    elif month in [9, 10, 11]: return &#39;가을&#39;
    else: return &#39;겨울&#39;

df_agree[&#39;season&#39;] = df_agree[&#39;t_dat&#39;].dt.month.apply(get_season)

# 결과 저장
results = []

# 나이대, 계절 조합별 Top5 상품코드 + 판매량
for age in range(10, 100, 10):
    for season in [&#39;봄&#39;, &#39;여름&#39;, &#39;가을&#39;, &#39;겨울&#39;]:
        subset = df_agree[(df_agree[&#39;age_group&#39;] == age) &amp; (df_agree[&#39;season&#39;] == season)]
        vc = subset[&#39;product_code&#39;].value_counts().head(5)
        top5 = list(zip(vc.index.tolist(), vc.values.tolist()))  # (코드, 수량)
        results.append({
            &#39;나이대&#39;: f&quot;{age}대&quot;,
            &#39;계절&#39;: season,
            &#39;Top5&#39;: top5
        })

# 출력
for row in results:
    print(f&quot;{row[&#39;나이대&#39;]} {row[&#39;계절&#39;]} Top5 상품코드:&quot;)
    for code, count in row[&#39;Top5&#39;]:
        print(f&quot;- {code} ({count}개)&quot;)
    print()
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[팀플] 기초팀프로젝트 주제선정]]></title>
            <link>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%8C%80%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A3%BC%EC%A0%9C%EC%84%A0%EC%A0%95</link>
            <guid>https://velog.io/@sin_98/%ED%8C%80%ED%94%8C-%EA%B8%B0%EC%B4%88%ED%8C%80%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A3%BC%EC%A0%9C%EC%84%A0%EC%A0%95</guid>
            <pubDate>Fri, 13 Jun 2025 11:50:18 GMT</pubDate>
            <description><![CDATA[<p>프로젝트 명 : 고객의 옷장, 데이터로 여는 전략</p>
<p>주제 : [커머스] H&amp;M 고객/매출 데이터 분석</p>
<p>요약 : 상품판매 증진 및 고객관리</p>
<p><a href="https://www.notion.so/teamsparta/H-M-2112dc3ef51481ada86ed6630459b330">https://www.notion.so/teamsparta/H-M-2112dc3ef51481ada86ed6630459b330</a></p>
<p>세부주제</p>
<ol>
<li>회원 상태(신규, 활성, 탈퇴)에서 신규 유저로 분리 &gt; 신규 유저가 많이 구매한 아이템 분류 &gt; 신규고객 한정 가장 많은 구매가 이루어진 상품 할인 쿠폰 제공</li>
<li>전체 고객 대상으로 주력아이템은 어떤것이 있으며 그 주력아이템을 산 사람은 어떤아이템을 추가로 구매하는지 조사해서 그 둘을 세트아이템으로 할인해서 판매전략</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아티클] 직관적인 데이터 시각화 만들기]]></title>
            <link>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-%EC%A7%81%EA%B4%80%EC%A0%81%EC%9D%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9C%EA%B0%81%ED%99%94-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-%EC%A7%81%EA%B4%80%EC%A0%81%EC%9D%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9C%EA%B0%81%ED%99%94-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 12 Jun 2025 03:25:39 GMT</pubDate>
            <description><![CDATA[<p><a href="https://yozm.wishket.com/magazine/detail/1792/">https://yozm.wishket.com/magazine/detail/1792/</a></p>
<p>요약 : 이 글은 시각 정보가 뇌에서 어떻게 인식되고, 데이터 시각화에서 어떻게 활용되는지를 설명하며, 전주의적 속성과 게슈탈트 원리를 통해 효과적인 데이터 시각화를 만드는 방법을 소개한다. 또한 시각화가 때로는 정보를 왜곡하거나 오해를 불러일으킬 수 있음을 경고하고 있다.</p>
<p>주요포인트 : </p>
<p>시각 정보 인식 과정 3단계</p>
<p>1단계: 색, 형태 등 기본적인 시각 요소 인식</p>
<p>2단계: 패턴 발견 (색상, 방향성, 그룹화 등)</p>
<p>3단계: 의미 부여 및 해석</p>
<p>전주의적 속성의 활용</p>
<p>인간이 즉각적으로 인식할 수 있는 속성들 (색상, 위치, 형태, 움직임 등)을 의도적으로 사용하면 정보를 더 빠르고 명확하게 전달할 수 있음</p>
<p>게슈탈트 원리를 통한 인식 조작</p>
<p>가까이 위치한 것, 유사한 것, 같은 방향으로 움직이는 것 등은 그룹으로 인식됨</p>
<p>데이터 시각화의 힘과 위험성</p>
<p>잘 디자인된 시각화는 이해를 돕지만, 의도된 왜곡은 잘못된 해석을 유도할 수 있음 → 비판적 시각 필요</p>
<p>핵심개념 </p>
<p>전주의적 속성 : 뇌가 의식적 주의 없이도 빠르게 감지하는 시각 요소들 (ex. 색상, 크기, 위치, 방향 등)
게슈탈트 원리 : 인간이 시각 정보를 ‘전체적 패턴’으로 인식하려는 경향을 설명한 심리학 이론</p>
<p>패턴 인식 : 색, 방향성, 밀집도 등을 통해 공통점이나 규칙성을 발견하는 과정</p>
<p>공통 운명 : 같은 방향으로 움직이는 요소를 같은 그룹으로 인식하는 성질</p>
<p>균일한 연결성 : 선 등으로 시각적으로 연결된 요소들은 하나의 그룹으로 인식됨</p>
<p>용어 정리 </p>
<p>유사성 : 비슷한 색, 모양, 크기 등을 가진 요소는 함께 묶여서 인식된다는 원리</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강의] 데이터 분석 파이썬 종합반 1주차]]></title>
            <link>https://velog.io/@sin_98/%EA%B0%95%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A2%85%ED%95%A9%EB%B0%98-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@sin_98/%EA%B0%95%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A2%85%ED%95%A9%EB%B0%98-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Thu, 12 Jun 2025 03:23:56 GMT</pubDate>
            <description><![CDATA[<p>[COLAB 단축키]</p>
<p>코드 셀 실행 : SHIFT + ENTER 
셀 생성 : ctrl + m + a 
셀 삭제 : ctrl + m + d 
실행 되돌리기 : ctrl + m + z 
코드 셀 분할 : ctrl + m + - 
셀 유형 변경(메모,정리) : 코드셀을 마크다운셀로 바꾸려면 ctrl + m + m </p>
<p>[출력문]</p>
<p>print()
문자를 출력할땐 &quot;&quot; 안에 해야함
숫자는 그냥 하면 됨
여러개를 출력하고싶으면 , 로 분할 </p>
<p>[변수]</p>
<p>x = 10 #x에 10을 담아라
print(x) #x를 출력하라 (10출력)</p>
<p>출력은 데이터분석 결과물을 출력할때 자주 씀</p>
<p>age = 25
name = &quot;Alice&quot;
print(name)  # &quot;Alice&quot; 출력
print(&quot;나이:&quot;, age)  # &quot;나이: 25&quot; 출력
double_age = age * 2
print(&quot;나이의 두 배:&quot;, double_age)  # &quot;나이의 두 배: 50&quot; 출력</p>
<p><img src="https://velog.velcdn.com/images/sin_98/post/dd74ddb7-e242-4f63-a61b-0412c8b37017/image.png" alt=""></p>
<p>주요 자료형으로는 정수(int), 실수(float), 문자열(str), 리스트(list), 튜플(tuple), 딕셔너리(dict) 등이 있습니다.</p>
<p>print(type(age))   # &lt;class &#39;int&#39;&gt; 출력
print(type(name))  # &lt;class &#39;str&#39;&gt; 출력</p>
<p>문자열 변수 선언
name = &quot;Alice&quot;
greeting = &#39;Hello, World!&#39; #&#39;&#39; &quot;&quot; 둘다써도됨</p>
<p>문자열 연산
full_greeting = greeting + &quot; My name is &quot; + name
print(full_greeting)  # &quot;Hello, World! My name is Alice&quot; 출력</p>
<p>문자열 메서드 활용
sentence = &quot;python programming is fun&quot;
print(sentence.upper())         # 대문자로 변환하여 출력</p>
<p>숫자열 변수 선언
num1 = 10
num2 = 3.14</p>
<p>숫자열 연산
sum_result = num1 + num2
diff_result = num1 - num2
product_result = num1 * num2
division_result = num1 / num2
integer_division_result = num1 // num2
remainder_result = num1 % num2</p>
<p>print(&quot;합:&quot;, sum_result)
print(&quot;차:&quot;, diff_result)
print(&quot;곱:&quot;, product_result)
print(&quot;나누기:&quot;, division_result)
print(&quot;몫:&quot;, integer_division_result)
print(&quot;나머지:&quot;, remainder_result)</p>
<p>숫자열 함수와 메서드 활용
num3 = -7.89
abs_result = abs(num3)   # 절댓값 계산
round_result = round(num3)  # 반올림 계산</p>
<p>print(&quot;절댓값:&quot;, abs_result)
print(&quot;반올림:&quot;, round_result)</p>
<p>실수형 변수 선언
num3 = 3.14
num4 = -0.5</p>
<p>실수형 변수끼리의 연산
product_result = num3 * num4
print(&quot;곱:&quot;, product_result)  # 출력: 곱: -1.57</p>
<p>실수형 연산 결과
print(&quot;곱의 자료형:&quot;, type(product_result))  # 출력: 곱의 자료형: &lt;class &#39;float&#39;&gt;</p>
<p>Boolean 변수 선언
is_raining = True
is_sunny = False</p>
<p>비교 연산자를 사용하여 Boolean 값 비교
x = 10
y = 5</p>
<p>greater_than = x &gt; y
print(greater_than)  # True 출력</p>
<p>NaN (결측값)
NaN(Not a Number)은 데이터에서 결측치(missing value)를 나타내는 특수한 값입니다. 주로 수치형 데이터에서 발생하며, 특히 데이터 과학이나 머신 러닝 분야에서 데이터 정제 및 처리 과정에서 자주 다루어집니다.
NaN에 대한 설명
NaN은 정의할 수 없는 수치값을 나타냅니다. 예를 들어, 0으로 나누는 연산이나 유효하지 않은 수학적 연산 결과를 나타낼 때 사용됩니다.
데이터프레임과 같은 데이터 구조에서는 결측치를 표현할 때 NaN이 사용됩니다.
NaN의 예시
수학 연산에서 발생하는 NaN</p>
<p>0으로 나누는 연산
result = 1 / 0
print(result)  # 출력: Infinity</p>
<p>import math</p>
<p>유효하지 않은 수학적 연산
result = math.sqrt(-1)
print(result)  # 출력: nan , 제곱근 sqrt 안에 들어가야하는 숫자는 0보다 커야함</p>
<p>데이터프레임에서의 NaN
import pandas as pd</p>
<p>NaN을 포함한 데이터프레임 생성
data = {&#39;A&#39;: [1, 2, None],
        &#39;B&#39;: [3, None, 5]}
df = pd.DataFrame(data)</p>
<p>print(df)
출력:
    A    B
0  1.0  3.0
1  2.0  NaN
2  NaN  5.0</p>
<p>입력문 (input)
<code>input()</code> 함수는 사용자로부터 키보드로 입력을 받는 함수입니다.
이 함수를 사용하면 사용자와 상호작용하여 프로그램을 만들 수 있습니다. 아래에는 <code>input()</code> 함수를 사용한 예시를 제시하겠습니다.</p>
<p>name = input(&quot;이름을 입력하세요: &quot;)
print(&quot;안녕하세요,&quot;, name, &quot;님!&quot;)</p>
<p>num1 = int(input(&quot;첫 번째 숫자를 입력하세요: &quot;))
num2 = int(input(&quot;두 번째 숫자를 입력하세요: &quot;))
sum = num1 + num2
print(&quot;두 숫자의 합은&quot;, sum, &quot;입니다.&quot;)</p>
<p>사용자로부터 입력받는건 기본적으로 문자형으로 받음. 숫자를 입력해도 문자형으로 받음</p>
<p>그래서 숫자를 받을땐 int()로 강제로 정수로 바꿔줘야함</p>
<p>그래야 수학적인 계산이 가능</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[진로고민]]></title>
            <link>https://velog.io/@sin_98/%EC%A7%84%EB%A1%9C%EA%B3%A0%EB%AF%BC</link>
            <guid>https://velog.io/@sin_98/%EC%A7%84%EB%A1%9C%EA%B3%A0%EB%AF%BC</guid>
            <pubDate>Wed, 11 Jun 2025 11:43:25 GMT</pubDate>
            <description><![CDATA[<p>오늘은 공부를 하다가 진로를 좀 고민해봤다.</p>
<p>앞으로 어떤 직무에서 일을 하는게 좋을까</p>
<p>연봉은 어떨지 서울에 가는게 좋을지</p>
<p>gpt랑 얘기나누면서 원티드 사람인 잡코리아 등등에서 고민해봤는데</p>
<p>일단 나는 게임 데이터분석가가 되고싶고</p>
<p>서울에서 시작하는게 좋을것같았다.</p>
<p>서울이 일자리가 많고 연봉인상율도 높을거기때문에</p>
<p>2~3년정도 데이터분석가로 일하다가 </p>
<p>데이터 사이언티스트로 직무변경을 하는걸로 계획을 잡았다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아티클] sql 질문 하는법 ]]></title>
            <link>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-sql-%EC%A7%88%EB%AC%B8-%ED%95%98%EB%8A%94%EB%B2%95</link>
            <guid>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-sql-%EC%A7%88%EB%AC%B8-%ED%95%98%EB%8A%94%EB%B2%95</guid>
            <pubDate>Thu, 05 Jun 2025 12:48:49 GMT</pubDate>
            <description><![CDATA[<p><a href="https://datarian.io/blog/how-to-ask-good-sql-questions">https://datarian.io/blog/how-to-ask-good-sql-questions</a></p>
<p>요약 : SQL 질문을 잘 하기 위해선, 먼저 스스로 문제를 점검하고, 명확하고 구체적인 방식으로 질문을 구성해야 한다. 좋은 질문은 문제 해결뿐 아니라 자신의 실력 향상에도 도움이 된다.
주요포인트 : </p>
<ol>
<li>질문 전에 기본적인 오타, 문법 오류, 요구사항 등을 먼저 확인하자.</li>
<li>구글에서 검색하고 영문으로 검색하는게 좋으며 검색키워드 잘 넣고 신뢰할수있는 사이트를 봐야하며 언제쓰여졌는지도 잘 확인해야한다. </li>
<li>질문은 간결하면서도 충분한 맥락을 제공해야 하며, 코드와 에러 메시지를 함께 제시하는 것이 효과적이다.</li>
</ol>
<p>핵심개념 : </p>
<ol>
<li>사전 점검: 오타, 문법 오류, 요구조건 누락 등을 스스로 확인</li>
<li>검색 역량: 에러 메시지나 유사 문제 상황을 키워드로 검색</li>
<li>구체적 질문 구성: 질문할 때 문제 상황, 시도한 내용, 오류 메시지, 관련 코드 등을 모두 제공</li>
<li>성장의 자세: 질문을 남발하기보다 문제 해결을 위한 시도를 우선하자</li>
</ol>
<ul>
<li>실무 적용 : 본 아티클은 명확하고 구체적인 질문이 문제 해결에 얼마나 중요한지를 보여줍니다. 질문자가 문제 상황을 정확히 전달하고, 자신의 시도와 기대 결과를 함께 공유함으로써, 다른 사람들이 문제를 이해하고 적절한 도움을 줄 수 있는 기반을 마련했습니다.</li>
<li>관련 사례 : 한 데이터 분석가는 업무 중 발생한 SQL 문제를 해결하기 위해 커뮤니티에 질문을 올렸습니다. 그는 문제 상황을 구체적으로 설명하고, 시도한 쿼리와 예상 결과를 함께 공유했습니다. 이러한 명확한 질문 덕분에 다른 전문가들로부터 정확하고 신속한 피드백을 받을 수 있었고, 문제를 효율적으로 해결할 수 있었습니다.</li>
<li>사례 출처 : <a href="https://www.inflearn.com/community/questions/1592305/6-5-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B2%80%EC%A6%9D-%EA%B2%B0%EA%B3%BC-%EC%98%88%EC%8B%9C%EB%AC%B8%EC%A0%9C?focusComment=416083">https://www.inflearn.com/community/questions/1592305/6-5-데이터-검증-결과-예시문제?focusComment=416083</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강의] SQLD 3주차 ]]></title>
            <link>https://velog.io/@sin_98/SQLD-3%EC%A3%BC%EC%B0%A8-sctdn8pt</link>
            <guid>https://velog.io/@sin_98/SQLD-3%EC%A3%BC%EC%B0%A8-sctdn8pt</guid>
            <pubDate>Wed, 04 Jun 2025 11:57:13 GMT</pubDate>
            <description><![CDATA[<p>엔티티 : 데이터모델의 핵심 구성 요소 (개체)
인스턴스 : 엔티티는 인스턴스의 집합</p>
<p>엔티티 과목 : 인스턴스 수학 </p>
<p><img src="https://velog.velcdn.com/images/sin_98/post/f64dcd09-a1c3-41b2-b43a-e3bc53e71e6d/image.png" alt=""></p>
<p>엔티티는 기본적으로 2개 이상의 인스턴스로 구성되어있어야함
한개면 집합이 아니기때문에 엔티티가 아님</p>
<p>어트리뷰트 (속성)을 포함해야함 
주식별자만 존재하고 일반속성이 없는 경우 엔티티가아님 </p>
<p>관계의 존재</p>
<p>유/무형에 따른 분류
유형 엔티티 - 물리적 형태가 존재하는 엔티티 (상품)
개념 엔티티 - 물리적 형태는 아니지만 관리해야할 개념적인 정보 (학과)
사건 엔티티 - 특정 이벤트에 종속되는 엔터티 (주문)</p>
<p>발생시점에따른분류
기본/키 엔티티 - 관계가 아닌  독립적인 생성가능한 부모 엔티티 (상품)
중심 엔티티 - 기본엔티티로부터 업무에서 중심적인 역할 (주문)
행위 엔티티 - 두개 이상의 부모 엔티티로 부터 발생 (주문내역)</p>
<p>엔티티 이름짓기 방식</p>
<ol>
<li>가능하면 업무에서 사용하는 용어를 사용</li>
<li>가능하면 축약어를 사용하지않는다</li>
<li>단수명사를 사용하고 띄어쓰기를 하지않는다</li>
<li>모든 엔티티 이름 중복 X</li>
<li>엔티티 생성 의미대로 이름을 부여합니다</li>
</ol>
<p>속성  : 인스턴스가 가진 어떤 성질이나 성격</p>
<p>업무에서 필요로 하는 인스턴스
더이상 분리되지않는 최소의 데이터단위</p>
<p>한개의 엔티티는 두개이상의 인스턴스 집합
한개의 엔티티는 두개이상의 속성
한개의 속성은 한개의 속성값</p>
<p>속성의 특징</p>
<ol>
<li>속성은 업무에서 필요로 함</li>
<li>속성은 의미상 더이상 분리되지않는 그 자체로 독립성을 유지함</li>
<li>엔티티를 설명하고 인스턴스의 구성요소가 됩니다</li>
<li>정규화이론에 기반을 두고 정해진 주식별자에 함수적 종속성을 가져야함</li>
<li>하나의 속성은 한개의 값만 갖는다</li>
</ol>
<p>속성의 특징에 따른 분류
기본속성 : 업무로부터 추출된 모든 속성
설계속성 : 데이터모델링 업무의 규칙화 등을 위해 새로 만들거나 변형하여 정의하는 속성
파생속성 : 다른속성에 영향을 받아 발생하는 속성으로 보통 계산된 형태의 값이 이에 해당됨.</p>
<p>엔티티구성방식에 따른 분류
PK 속성 : 엔티티를 구분할수있는속성 (주민번호)
FK 속성 : 다른엔티티와의 관계를 포함된 속성<br>일반 속성 : PK FK에 포함되지않은 다른속성</p>
<p>도메인 : 각 속성이 가질수있는 값의 범위</p>
<p>속성의 이름짓는법</p>
<ol>
<li>업무에서 사용하는 용어</li>
<li>축약어 X </li>
<li>서술형말고 명사형</li>
<li>수식어 많이붙지말고 명확하게 의미파악할수있게</li>
<li>전체데이터모델에서 유일하게 작성해야함
속성이름은 중복이되도되긴함 근데 유일하면좋긴함</li>
</ol>
<p>관계 식별자 안했음 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강의] SQLD 2주차 ]]></title>
            <link>https://velog.io/@sin_98/SQLD-2%EC%A3%BC%EC%B0%A8-3dnufvzc</link>
            <guid>https://velog.io/@sin_98/SQLD-2%EC%A3%BC%EC%B0%A8-3dnufvzc</guid>
            <pubDate>Mon, 02 Jun 2025 12:12:45 GMT</pubDate>
            <description><![CDATA[<p>데이터모델링 = 현실의 데이터를 추상화시켜서 저장시키는 것</p>
<p>데이터 모델링의 정의 </p>
<ol>
<li>정보시스템 구축을 위해 데이터 관점의 <strong>업무를 분석하는 과정</strong></li>
<li>현실세계의 데이터를 <strong>약속된 표기법</strong>에 의해 표현하는 과정</li>
<li>데이터베이스를 구축하기 위한 *<em>분석 및 설계의 과정 *</em></li>
</ol>
<p>결국, 데이터 모델링의 목적을 살펴보면 크게 2가지로 정리할 수 있습니다.</p>
<ul>
<li><ol>
<li><p>업무에 필요한 정보를 정확하게 &#39;<strong>정의</strong>&#39;하고 &#39;<strong>표현</strong>&#39;하여 <strong>업무를 분석</strong></p>
<p><strong>→ 개발하기 위해서만 데이터 모델링을 하는 것이 아님 !</strong></p>
</li>
</ol>
</li>
<li><ol start="2">
<li>분석 모델을 통해 실제 데이터베이스를 생성하여 데이터를 관리</li>
</ol>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sin_98/post/61bcae90-f68a-44d6-b3d7-1740a8172f3b/image.png" alt=""></p>
<p> 모델링의 특징</p>
<p> <img src="https://velog.velcdn.com/images/sin_98/post/c8e20e64-c2b7-42ac-9313-85202547d01a/image.png" alt=""></p>
<p>데이터모델링 3단계 진행</p>
<p><img src="https://velog.velcdn.com/images/sin_98/post/3b411a28-8042-4d06-9088-4227e7be40ac/image.png" alt=""></p>
<p>데이터모델링의 관점 </p>
<p><img src="https://velog.velcdn.com/images/sin_98/post/9418af41-d952-4f02-b730-db6fb7aa97d5/image.png" alt=""></p>
<p>데이터 모델링의 중요성</p>
<p>파급효과 : 구체적인 내용은 변해도 큰 구조는 변하지 않도록 만드는 것이죠 쪼끔 바꾸고싶을때 전체가 바뀌어야 하는 모델은 안좋다</p>
<p>간결한표현 : 명확하고 간결하게 표현 </p>
<p>데이터품질 : 데이터품질이 좋으려면 아래와같은짓을 하면안된다.</p>
<p>⓵ 중복 (Duplication)
    ◦ 데이터베이스 여러 곳에 같은 정보를 중복해서 저장하는 행위입니다.</p>
<p>⓶ 비유연성 (Inflexibility)
    ◦ 환경이 바뀌었을 때 데이터가 사용 가능 여부입니다.
    ◦ 데이터 모델을 어떻게 설계했느냐에 따라 사소한 업무의 변화에도 데이터 모델의 유지 보수가 쉬울 수도 있고 어려울 수도 있습니다.</p>
<p>⓷ 비일관성 (Inconsistency)
    ◦ 데이터의 중복이 없다고 해도 일관적이지 않은 데이터가 나타날 수 있습니다.
    ◦ 데이터 모델링을 할 때는 데이터와 데이터 간의 상호 연관 관계에 대한 명확한 정의를 해야 할 필요가 있습니다.</p>
<p>프로젝트 라이프 사이클에서 데이터모델링
폭포수 모델 : 몇월며칠까지 뭐 하자 ,몇월며칠까지 뭐 하고 끊어서하는거. 프로젝트 크기가 작을때 좋음
애자일 모델 : 작게 한번 만들어보고 검토하고 좀더 크게만들고 검토하고 좀더 크게하고 점진적으로 크기를 키워나가는 모델</p>
<p>폭포수 모델 : 분석(논리및개념데이터모델링) - 설계(물리데이터모델링) - 개발 - 테스트 - 전환/이행</p>
<p>데이터 모델링 이해관계자</p>
<p><img src="https://velog.velcdn.com/images/sin_98/post/a0403ad0-06cd-4290-bea4-06480a5ad95d/image.png" alt=""></p>
<p>3층 스키마</p>
<p>데이터 모델링의 과정에서 신경 써야 하는 것 중 하나는 데이터의 일체적 구성입니다. 일체적 구성이라고 하는 것은 일관된 형태로 데이터를 수집하는 것입니다. 다른 말로 표현하자면 데이터의 독립적 구성이라고 할 수 있습니다.</p>
<p>데이터독립성이 필요한 이유
유지보수 비용증가
데이터복잡도 증가
유지보수 중복성 증가
요구사항 대응 저하</p>
<p>3층 스키마 구성 : 사용자, 설계자, 개발자가 데이터베이스를 보는 관점에 따라 데이터베이스를 기술한것 </p>
<p>외부단계(사용자가 보는 프로그램) 
개념단계(DB를 추상화한 단계. 우리 데이터가 어떻게 구성되어있는지 설계자 관점)
내부단계(실제 데이터가 저장되어있는 단계. DB . 개발자 관점)</p>
<p>외부에서 요청하면 개념단계에서 내부단계의 데이터를 가져다주는데 필요한만큼만 떼다 줌  </p>
<p>외부 &lt;-&gt; 개념 : 논리적 독립성
개념 &lt;-&gt; 내부 : 물리적 독립성</p>
<p>데이터모델링에 중요한 개념</p>
<p>엔티티 : 하나의 객체 
속성 : 객체의 특징
관계 : 엔티티와 엔티티와의 관계 (1:N 일수있고 1:1 일수도있고)</p>
<p>ERD란
ENTITY RELATIONNSHIP DIAGRAM</p>
<p>ERD 작성법</p>
<ol>
<li><p>엔티티를 정의하고 그린다</p>
</li>
<li><p>엔티티를 적절하게 배치한다
중요도 \ 느낌으로 그려나간다</p>
</li>
<li><p>엔티티간 관계 설정</p>
</li>
<li><p>관계명 서술</p>
</li>
<li><p>관계의 참여도 기술 (특정엔티티와 엔티티간의 관계수를 의미)</p>
</li>
<li><p>관계의 필수여부 기술</p>
</li>
</ol>
<p>데이터모델 표기법 </p>
<p>엔티티표기법/관계표기법</p>
<p>IE/CORW&#39;S FOOT 표기법<br>BARKER/CASE*METHOD 표기법 </p>
<p><img src="https://velog.velcdn.com/images/sin_98/post/699b3e39-8c3c-423f-a7d8-747c40f4f5cd/image.png" alt=""></p>
<p>좋은 데이터모델의 요소</p>
<ol>
<li>완전성</li>
<li>중복 제재</li>
<li>업무규칙</li>
<li>데이터 재사용</li>
<li>의사소통</li>
<li>통합성</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[아티클] 파이썬 초보자가 저지르는 10가지 실수]]></title>
            <link>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%B4%88%EB%B3%B4%EC%9E%90%EA%B0%80-%EC%A0%80%EC%A7%80%EB%A5%B4%EB%8A%94-10%EA%B0%80%EC%A7%80-%EC%8B%A4%EC%88%98</link>
            <guid>https://velog.io/@sin_98/%EC%95%84%ED%8B%B0%ED%81%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%B4%88%EB%B3%B4%EC%9E%90%EA%B0%80-%EC%A0%80%EC%A7%80%EB%A5%B4%EB%8A%94-10%EA%B0%80%EC%A7%80-%EC%8B%A4%EC%88%98</guid>
            <pubDate>Thu, 29 May 2025 11:46:42 GMT</pubDate>
            <description><![CDATA[<p><a href="https://yozm.wishket.com/magazine/detail/1605/">https://yozm.wishket.com/magazine/detail/1605/</a></p>
<p>를 읽고</p>
<p>요약 : 이 글은 파이썬 초보자들이 자주 저지르는 10가지 나쁜 습관을 소개하고, 그에 대한 해결책과 예시 코드를 통해 올바른 코딩 습관을 제시한다. 성능, 가독성, 유지보수 측면에서 중요한 코딩 습관을 다룬다.</p>
<p>주요 포인트 : 
import * 사용 금지 – 어떤 객체가 들어오는지 알기 어렵고 충돌 위험 있음.</p>
<p>except: 사용 금지 – 예외명을 명확히 지정해야 디버깅 쉬움.</p>
<p>반복 연산 시 for보다 numpy 활용 – 벡터화된 연산이 훨씬 빠름.</p>
<p>open() 후 close() 안함 → with open()으로 해결.</p>
<p>PEP8 코드 스타일을 무시하지 말 것 – 가독성과 유지보수에 필수.</p>
<p>딕셔너리 .keys() .values() → .items()가 더 깔끔함.</p>
<p>컴프리헨션 적극 활용 – 단순 반복문보다 짧고 명확.</p>
<p>range(len()) 대신 enumerate()나 zip() 사용.</p>
<p>문자열 연결에 + 대신 f-string 사용.</p>
<p>함수의 디폴트 매개변수에 mutable 객체(예: 리스트) 사용 금지.</p>
<p>핵심개념 : </p>
<p>PEP8: 파이썬 스타일 가이드. 공백, 줄바꿈, 변수명 등 코드 스타일 표준.</p>
<p>컴프리헨션: 리스트나 딕셔너리를 간결하게 생성하는 문법 [x for x in y].</p>
<p>f-string: 문자열 포매팅 방식으로 f&quot;Hello {name}&quot; 형태.</p>
<p>Mutable Default Arg: 함수 매개변수 기본값으로 리스트/딕셔너리를 쓰는 위험.</p>
<p>with 구문: 파일 작업 후 자동으로 닫아주는 안전한 방식.
용어정리 : </p>
<p>import * : 모든 객체를 가져오지만 어떤 것이 포함됐는지 알기 어려움
bare except : except 뒤에 예외 지정 없이 모든 예외를 잡음
enumerate() : 인덱스와 값을 동시에 반환하는 함수
zip() : 두 개 이상의 시퀀스를 병렬로 묶어 반복
f-string : 문자열 안에 변수 삽입하는 포매팅 방법
mutable : 변경 가능한 객체 (리스트, 딕셔너리 등)</p>
<ul>
<li>실무 적용 : 대용량 데이터 처리에는 numpy를 활용하여 벡터화된 연산을 수행하는 것이 효율적</li>
<li>관련 사례 : 한 개발자는 numpy를 사용하지 않고 반복문으로 데이터를 처리하다가 성능 문제가 발생했습니다. 이후 numpy의 벡터화 연산을 도입하여 처리 속도를 크게 향상시켰습니다.</li>
<li>사례링크 : <a href="https://medium.com/@kuldeepkumawat195/solving-the-off-by-one-error-with-numpy-best-practices-and-common-pitfalls-c146b19de04a">https://medium.com/@kuldeepkumawat195/solving-the-off-by-one-error-with-numpy-best-practices-and-common-pitfalls-c146b19de04a</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[강의] SQLD 강의 (2)]]></title>
            <link>https://velog.io/@sin_98/SQLD-%EA%B0%95%EC%9D%98-2</link>
            <guid>https://velog.io/@sin_98/SQLD-%EA%B0%95%EC%9D%98-2</guid>
            <pubDate>Mon, 26 May 2025 11:40:02 GMT</pubDate>
            <description><![CDATA[<p>모델링</p>
<p>모델 : 데이터베이스의 구조나 형식을 의미하는것 
그걸 만드는게 모델링</p>
<p>데이터베이스 모델링 : 현실세계의 모습들을 추상화해서 데이터로 저장하는 과정 </p>
<p>데이터 모델이 제공하는 기능 </p>
<p>시각화 : 시스템을 원하는 모습으로 시각화해서 보여줄수있또록 한다.
문서화 : 시스템의 구조와 행도을 문서화 한다.
구체화 : 특정한 목표에 따라 구체화된 상세수준의 표현방법을 제공한다
구조화된 틀 제공 : 시스템을 구축하는 구조화된 틀을 제공한다.
다양한 관점 제공 : 다양한 영역에 집중하기 위해 다른 영역의 세부 사항은 숨기는 다양한 관점을 제공한다.</p>
<p>추상화 : 현실세계를 일정한 형식에 맞추어 표현하는 것
단순화 : 복잡한 현실 세계를 약속된 규칙에 기반한 제한된 표기법이나 언어로 표현하여 쉽게 이해할수있또록 한다.
명확화 : 누구나 이해하기 쉽게 대상에 대한 모호함을 제거하고 현상을 정확하게 기술하는것</p>
<p>데이터 모델링 단계</p>
<p><img src="https://velog.velcdn.com/images/sin_98/post/cc1147d7-75e5-49d8-b6d5-3692d14ba604/image.png" alt=""></p>
<p>개념적 데이터 모델링 : 현실 -&gt; 개념 
어떤걸 데이터로 만들어야할까? 
추상화수준이 가장 높음
전사적관점에서 기업의 데이터 모델링</p>
<p>논리적 데이터 모델링 : 누가 어떻게 어떤프로세스로 할까 구상화 하는단계
정규화를 통해 데이터 모델의 독립성 확보</p>
<p>물리적 데이터 모델링 : 구축할 데이터 베이스 관리 시스템에 테이블 ,인덱스 등을 생성하는 단계</p>
]]></description>
        </item>
    </channel>
</rss>