[Analytics] ๋ฏธ๊ตญ ํƒ์‹œ๋กœ ์ƒ์กดํ•˜๋Š” ๋ฐฉ๋ฒ• (1) feat. TLC

2022. 5. 12. 22:08ใ†๐Ÿงช Data Science/Analytics

 

๋‹น์‹ ์€ NEWYORK์—์„œ ํƒ์‹œ ๊ธฐ์‚ฌ๋กœ ์ผํ•˜๊ณ  ์žˆ๋‹ค.

ํƒ์‹œ๋Š” Yellow Taxi์ด๋‹ค.

ํƒ์‹œ ๊ธฐ์‚ฌ๋กœ ์ƒ์กดํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๋‹ค.

 

 

1) ๊ทผ๋ฌด ์‹œ๊ฐ„ ๋™์•ˆ, ์†๋‹˜์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ํƒœ์šธ ๊ฒƒ (์†๋‹˜)

2) ๋งŽ์€ ์š”๊ธˆ + ํ’๋ถ€ํ•œ ํŒ (์š”๊ธˆ)

3) ํ˜„๊ธˆ ๊ฒฐ์ œ๋Š” ์†Œ๋“์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ  ์Šฌ์ฉํ•˜๊ธฐ (์„ธ๊ธˆ ์ ˆ์•ฝ)

 

 

๋‘ ๊ฐ€์ง€๋Š” ๋‹จ์ˆœํžˆ ๋…ธ๋ ฅ๋งŒ์œผ๋ก  ์ด๋ค„์ง€์ง€ ์•Š๋Š”๋‹ค.

๋น…๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์†๋‹˜์ด ๋งŽ์€ ์žฅ์†Œ์™€ ์‹œ๊ฐ„์„ ํŠน์ •ํ•˜๊ณ , ๋ฏธ๋ฆฌ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ ์†๋‹˜์ด ํŠน์ • ์žฅ์†Œ๋ฅผ ์š”๊ตฌํ•ด๋„, ๊ทธ๊ณณ์ด ๋ฐ์ดํ„ฐ ์ƒ ์†๋‹˜์ด ๋งŽ์€ ์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์šฉ๊ธฐ ์žˆ๊ฒŒ Pass ํ•  ํ•„์š”๋„ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉฐ ์ „๋žต์„ ๊ตฌ์ถ•ํ•ด๋ณด์ž.

 

 

 

[Data]

๋ฐ์ดํ„ฐ๋Š” SparkSQL ํฌ์ŠคํŒ…์—์„œ ์ „์ฒ˜๋ฆฌํ•œ Yellow Taxi ๋ฐ์ดํ„ฐ(cleaned)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

NEWYORK Yellow Taxi์˜ ์šดํ–‰์„ 2021.01~2021.07๊นŒ์ง€ ๋ชจ๋‘ ๋ชจ์•„๋†“์€ ๋ฐ์ดํ„ฐ๋‹ค.

[Yellow Taxi Data: https://mengu.tistory.com/50]

 

[SparkSQL] ํƒ์‹œ ๋ฐ์ดํ„ฐ ๋‹ค์šด/์ „์ฒ˜๋ฆฌ/๋ถ„์„ feat. TLC

์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๊ณต๋ถ€ํ•œ SparkSQL ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ, ์‹ค์ œ Taxi ๋ฐ์ดํ„ฐ๋ฅผ ์ „์ฒ˜๋ฆฌํ•ด๋ณด์ž. * ์ „์ฒ˜๋ฆฌ๋ž€? ์ด์ƒ์น˜ ์ œ๊ฑฐ, ๊ทธ๋ฃนํ™” ๋“ฑ ๋ฐ์ดํ„ฐ ๋ถ„์„์ด ์šฉ์ดํ•˜๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค. TLC Trip Recor

mengu.tistory.com

 

 

 

 

 

 

Basic Setting

 

from matplotlib import font_manager, rc
font_path = 'C:\\WINDOWS\\Fonts\\HBATANG.TTF'
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

import os
import findspark
findspark.init(os.environ.get("SPARK_HOME"))
import pyspark
from pyspark import SparkConf, SparkContext
import pandas as pd
import faulthandler
faulthandler.enable()
from pyspark.sql import SparkSession

spark = SparkSession.builder.master('local').appName("taxi-analysis").getOrCreate()

# ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ
zone_data = "C:/DE study/data-engineering/01-spark/data/taxi_zone_lookup.csv"
trip_files = "C:/DE study/data-engineering/01-spark/data/trips/*"

# ๋ฐ์ดํ„ฐ ๋กœ๋“œ
trips_df = spark.read.csv(f"file:///{trip_files}", inferSchema = True, header = True)
zone_df = spark.read.csv(f"file:///{zone_data}", inferSchema = True, header = True)

# ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ
trips_df.printSchema()
zone_df.printSchema()

# ๋ฐ์ดํ„ฐ createOrReplaceTempView()
trips_df.createOrReplaceTempView("trips")
zone_df.createOrReplaceTempView("zone")


# ์“ธ๋งŒํ•œ column๋งŒ ๋ชจ์•„๋†“์ž.
query = '''
SELECT
    t.VendorID,
    TO_DATE(t.tpep_pickup_datetime) AS pickup_date,
    HOUR(t.tpep_pickup_datetime) AS pickup_time,
    TO_DATE(t.tpep_dropoff_datetime) AS dropoff_date,
    HOUR(t.tpep_dropoff_datetime) AS dropoff_time,
    t.passenger_count,
    t.trip_distance,
    t.payment_type,
    t.fare_amount,
    t.tip_amount,
    t.tolls_amount,
    t.total_amount,
    pz.Zone as pzone,
    dz.Zone as dzone
FROM
    trips t
    LEFT JOIN 
        zone pz
    ON
        t.PULocationID == pz.LocationID
    LEFT JOIN 
        zone dz
    ON
        t.DOLocationID == dz.LocationID
'''
taxi_df = spark.sql(query)
taxi_df.createOrReplaceTempView("taxi")


spark.sql('select * from taxi').show(5)


+--------+-----------+-----------+------------+------------+---------------+-------------+------------+-----------+----------+------------+------------+-----------------+--------------+
|VendorID|pickup_date|pickup_time|dropoff_date|dropoff_time|passenger_count|trip_distance|payment_type|fare_amount|tip_amount|tolls_amount|total_amount|            pzone|         dzone|
+--------+-----------+-----------+------------+------------+---------------+-------------+------------+-----------+----------+------------+------------+-----------------+--------------+
|       2| 2021-03-01|          0|  2021-03-01|           0|              1|          0.0|           2|        3.0|       0.0|         0.0|         4.3|               NV|            NV|
|       2| 2021-03-01|          0|  2021-03-01|           0|              1|          0.0|           2|        2.5|       0.0|         0.0|         3.8|   Manhattanville|Manhattanville|
|       2| 2021-03-01|          0|  2021-03-01|           0|              1|          0.0|           2|        3.5|       0.0|         0.0|         4.8|   Manhattanville|Manhattanville|
|       1| 2021-03-01|          0|  2021-03-01|           0|              0|         16.5|           1|       51.0|     11.65|        6.12|       70.07|LaGuardia Airport|            NA|
|       2| 2021-03-01|          0|  2021-03-01|           0|              1|         1.13|           1|        5.5|      1.86|         0.0|       11.16|     East Chelsea|            NV|
+--------+-----------+-----------+------------+------------+---------------+-------------+------------+-----------+----------+------------+------------+-----------------+--------------+
only showing top 5 rows



# cleaning -------------------------------------------------------------------

# data clearning
# fare, tip, tolls ์— ๋Œ€ํ•œ ๊ฒƒ์€ ๋‚˜์ค‘์— df ๋งŒ๋“ค๋•Œ ์ „์ฒ˜๋ฆฌํ•ด์ฃผ์ž.
query = '''
SELECT
    *
FROM
    taxi t
WHERE
    t.total_amount < 2000
    AND t.total_amount > 0
    AND t.trip_distance < 100
    AND t.passenger_count < 6
    AND t.pickup_date >= '2021-01-01'
    AND t.pickup_date < '2021-08-01'
    AND t.dropoff_date >= '2021-01-01'
    AND t.dropoff_date < '2021-08-03'
'''

df_c = spark.sql(query)
df_c.createOrReplaceTempView('cleaned')

 

 

 

 

 

 

 

 

์ „๋žต 1. ์†๋‹˜์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ํƒœ์šธ ๊ฒƒ


์†๋‹˜์„ ๋งŽ์ด ํƒœ์šฐ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์†๋‹˜์ด ๋งŽ์€ ์žฅ์†Œ, ์‹œ๊ฐ„์— ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ํ•˜์—ฌ ์†๋‹˜์ด Pick ํ•œ ์žฅ์†Œ์—๋„ ์†๋‹˜์ด ๋งŽ์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋‹ค์Œ ์†๋‹˜์„ ๋ฐ›๊ธฐ๊ฐ€ ์ˆ˜์›”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Pick up์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์žฅ์†Œ์™€ ์‹œ๊ฐ„์„ ์•Œ์•„๋‚ด๊ณ , ํ•˜๋ฃจ์˜ ๊ทผ๋ฌด ๊ฒฝ๋กœ๋ฅผ ์–ด๋–ป๊ฒŒ ์žก์•„์•ผ ํ• ์ง€ ๊ณ„ํš์„ ์งœ ๋ณด์ž.

 

 

 

A. Pick up์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์žฅ์†Œ Top 5

 

# cleaned ๋ฐ์ดํ„ฐ์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœํ•˜๊ธฐ
query = '''
SELECT
    c.pzone,
    COUNT(*) AS trips
FROM
    cleaned c
GROUP BY
    c.pzone
'''
df_pzone = spark.sql(query).toPandas()


# pick-up Top 5
pzone = df_pzone[df_pzone['trips'] > 30000].sort_values('trips', ascending=False)
pzone.head()

 

 

 

1,2๋“ฑ์€ Upper East Side South, Upper East Side North์œผ๋กœ ๋‘˜์„ ํ•ฉ์นœ trips ์ˆ˜๊ฐ€ ๋ฌด๋ ค 144๋งŒ์ด๋‹ค. 3๋“ฑ์€ Midtown, 4๋“ฑ์€ Penn Station ๋ถ€๊ทผ, 5๋“ฑ์€ ๋ง์ปจ ์Šคํ€˜์–ด๋‹ค. ๊ฐ๊ฐ์˜ ์žฅ์†Œ๋ฅผ ์ง€๋„์— ํ‘œ์‹œํ–ˆ๋‹ค.

 

GOOGLE MAP - 'New York' ๊ฒ€์ƒ‰

 

 

๊ฐ๊ฐ ์žฅ์†Œ๋“ค์˜ ํŠน์ง•์„ ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1-2๋“ฑ. Upper East Side South/North: ํ’ˆ๊ฒฉ ๋†’์€ ์ฃผํƒ๊ฐ€. ๋ถ€์œ ์ธต ๊ฑฐ์ฃผ๋ฏผ๋“ค์ด ์—„์ฒญ ๋งŽ๋‹ค. ๊ณ ๊ธ‰ ๋ ˆ์Šคํ† ๋ž‘, ๋งค๋””์Šจ๊ฐ€์˜ ๋ช…ํ’ˆ ๋งค์žฅ์œผ๋กœ ์œ ๋ช…ํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ ํƒ์‹œ๋ฅผ ํƒ„๋‹ค๋ฉด Tip์„ ๋งŽ์ด ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ๋ผ๊ณ  ๊ฐ€์„ค์„ ์„ธ์›Œ๋‘์ž.

3๋“ฑ. Midtown Center: ๋‰ด์š•์‹œ์— ์žˆ๋Š” 4๊ฐœ์˜ Center๋กœ ๋‹ค์–‘ํ•œ ์—ฌ๊ฐ€์™€ ์ˆ˜์—…๋“ค์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.

4๋“ฑ. Penn Station/Madison Sq West: ๋งค๋””์Šจ ์Šคํ€˜์–ด ๊ฐ€๋“  ์•„๋ž˜๋ฅผ ์ง€๋‚˜๋Š” ์ฃผ์š” ๋„์‹œ ๋ฐ ๋„์‹œ ๊ฐ„ ๋„์‹œ์ฒ ๋„์˜ ์ค‘์‹ฌ์ง€. ์‹๋‹น๊ณผ ์ƒ์ ์ด ๋‹น์—ฐํžˆ ์ฆ๋น„ํ•ด ์žˆ๋‹ค.

5๋“ฑ. Lincoln Square East: Upper East Side์— ์žˆ๋Š” ๊ด‘์žฅ๊ณผ ์ฃผ๋ณ€ ์ง€์—ญ์˜ ์ด๋ฆ„์ด๋‹ค. ๊ด€๊ด‘ ๋ช…์†Œ๋กœ ๋‹ค์–‘ํ•œ ์ƒ์ ๊ณผ ๋ฏธ์ˆ ๊ด€, ์Œ์•…๊ด€๋“ค์ด ์œ„์น˜ํ•ด ์žˆ๋‹ค.

 

 

๋‹น์‹ ์ด ๋‰ด์š•์˜ ํƒ์‹œ ๊ธฐ์‚ฌ๋ผ๋ฉด, ์œ„์˜ ์ง€์—ญ์„ ๋Œ์•„๋‹ค๋…€์•ผ ๋ถ€๊ท€ํ•œ ์†๋‹˜๋“ค์„ ํƒœ์šธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์ง€์—ญ๋“ค์€ ๊ตํ†ต์ด ๋ง‰ํ˜€ ์˜คํžˆ๋ ค ๋น„ํšจ์œจ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„ํšจ์œจ์„ ๊ฐ์†Œํ• ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ ‘๊ทผํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

 

B. Pick up์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ๊ฐ„๋Œ€

 

# ์‹œ๊ฐ„๋Œ€๋ณ„ trips ๋นˆ๋„
query = '''
SELECT
    c.pickup_time,
    COUNT(*) AS trips
FROM
    cleaned c
GROUP BY
    c.pickup_time
'''
df_time = spark.sql(query).toPandas()


# ์‹œ๊ฐ„๋Œ€๋ณ„ ์ถœํ‡ด๊ทผ plot ๊ทธ๋ฆฌ๊ธฐ
fig, ax = plt.subplots(figsize=(16,6))
plt.title('trips count by time', fontsize = 30)
sns.barplot(
    x = 'pickup_time',
    y = 'trips',
    data = df_time
)

 

 

์ƒˆ๋ฒฝ 1์‹œ-5์‹œ๊นŒ์ง„ ํƒ์‹œ Pick-up์ด ํ˜„์ €ํžˆ ๋‚ฎ๋‹ค. ๋”ฐ๋ผ์„œ ํ• ์ฆ์„ ๋ถ™์—ฌ์„œ ์šด์˜์„ ํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ตณ์ด ์ƒˆ๋ฒฝ์— 1์‹œ๊ฐ„ ์šด์ „ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ฎ์— 2 ์‹œ๊ฐ„ ํ•˜๋Š” ๊ฒƒ์ด ๊ฑด๊ฐ•, ์ด์ต ์ธก๋ฉด์—์„œ ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค. 

Trips ๋นˆ๋„๋Š” 6์‹œ๋ถ€ํ„ฐ ๊ณ„์†ํ•ด์„œ ์˜ฌ๋ผ๊ฐ€๋‹ค๊ฐ€ 18์‹œ์— Peak๋ฅผ ์ฐ๊ณ  ๋‚ด๋ ค๊ฐ„๋‹ค. 14์‹œ-18์‹œ ์‚ฌ์ด์—๋Š” ๋ฌด์กฐ๊ฑด ์šด์ „๋Œ€๋ฅผ ์žก๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜จ๋‹ค. ๋งŒ์•ฝ Top 5 ์žฅ์†Œ๋“ค์ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ? Upper East Side๋Š” ์•„์นจ์— Peak๋ฅผ ์ฐ๊ณ , Penn Station์€ ์ €๋…์— Peak๋ฅผ ์ฐ๋Š”๋‹ค๋ฉด, ๋‹น์‹ ์€ ์•„์นจ์—” Upper East Side๋กœ ์ถœ๊ทผํ•˜๊ณ  Penn Station์—์„œ ํ‡ด๊ทผํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

 

C. Top 5 ์žฅ์†Œ๋ณ„ ์‹œ๊ฐ„๋Œ€ Trips ๋นˆ๋„์ˆ˜

 

# query
query = '''
SELECT
    pickup_time,
    COUNT(*) AS trips
FROM
    c
GROUP BY
    pickup_time
'''

# ์žฅ์†Œ๋ณ„ ์‹œ๊ฐ„๋Œ€๋ณ„ ํŠน์ง•
for i in ['Upper East Side South', 'Upper East Side North', 'Midtown Center', 'Penn Station/Madison Sq West', 'Lincoln Square East']:
    c = df_c[df_c['pzone'] == i]
    c.createOrReplaceTempView('c')
    df_time = spark.sql(query).toPandas()
    # A. ์‹œ๊ฐ„๋Œ€๋ณ„ ์ถœํ‡ด๊ทผ plot ๊ทธ๋ฆฌ๊ธฐ
    fig, ax = plt.subplots(figsize=(16,6))
    plt.title(f'trips count at {i}', fontsize = 30)
    sns.barplot(
        x = 'pickup_time',
        y = 'trips',
        data = df_time
    )

 

 

[1๋“ฑ Upper East Side South]

ํŠน์ง•: ์•„์นจ์—” trips ์ €์กฐ. 14์‹œ์— ์ตœ๊ณ ์ ์„ ์ฐ๊ณ  ํ•˜๋ฝํ•œ๋‹ค.

 

[2๋“ฑ Upper East Side North]

ํŠน์ง•: 8์‹œ๋ถ€ํ„ฐ trips๊ฐ€ ํ™œ๋ฐœ. 15์‹œ์— ์ •์ ์„ ์ฐ๊ณ  ํ•˜๋ฝ.

 

[3๋“ฑ Midtown Center]

ํŠน์ •: ์˜ค์ „์—๋Š” ๋งŽ์ด ์ €์กฐํ•˜๋‹ค. ์ €๋… 16-19์‹œ์— ํ™œ๋ฐœํ•˜๋‹ค.

 

[4๋“ฑ Penn Station/Madison Sq West]

ํŠน์ง•: ์•„์นจ 6์‹œ์—๋„ ํ™œ๋ฐœํ•˜๋‹ค. ์ถœ/ํ‡ด๊ทผ ์˜ํ–ฅ ๋งŽ์ด ๋ฐ›๋Š”๋‹ค. 18์‹œ์— ์ •์ .

 

[5๋“ฑ Lincoln Square East]

ํŠน์ง•: 8-9์‹œ๋ถ€ํ„ฐ ํ™œ๋ฐœ. 14์‹œ-18์‹œ๊นŒ์ง€ ์ค€์ˆ˜ํ•œ trips ๋นˆ๋„๋ฅผ ๋ณด์ธ๋‹ค.

 

 

Pick up์ด ์ œ์ผ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ญ Top 5๋ฅผ ์•Œ์•„๋ณด๊ณ , ๊ฐ ์žฅ์†Œ๋ณ„ ์‹œ๊ฐ„๋Œ€ ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด์•˜๋‹ค.

์ด๋กœ์จ '์†๋‹˜์„ ๋งŽ์ด ๋ฐ›๊ธฐ ์œ„ํ•œ' ๋‹น์‹ ์˜ ๊ทผ๋ฌด ๊ฒฝ๋กœ๊ฐ€ ์–ผ์ถ” ์งœ์˜€๋‹ค.

 

 

 

 

[Penn Station -> Upper East Side]

์•„์นจ์— ์ถœ๊ทผํ•˜๋ฉด, ๋จผ์ € Penn Station์œผ๋กœ ๋‹ฌ๋ ค๊ฐ€์„œ ์ถœ๊ทผ์ž๋“ค์„ Pick up ํ•ด์•ผ ํ•œ๋‹ค. Penn Station ์ง€์—ญ์€ ๋‹ค๋ฅธ ์ง€์—ญ์— ๋น„ํ•ด ์•„์นจ๋ถ€ํ„ฐ ์ด์šฉ์ž๊ฐ€ ์••๋„์ ์œผ๋กœ ๋งŽ์ด ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์Šฌ์Šฌ ์ ์‹ฌ์‹œ๊ฐ„์ด ๋‹ค๊ฐ€์˜ค๋ฉด, ๋‹ค๋ฅธ ์ง€์—ญ์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฅ์„ ๋จน๋Š”๋‹ค. ์‹๊ณค์ฆ์ด ๋ชฐ๋ ค์˜ฌ ๋•Œ ์ฆˆ์Œ, Upper East Side์—์„œ ์ €๋…๊นŒ์ง€ ๋Œ์•„๋‹ค๋…€์•ผ ํ•œ๋‹ค.

 

 

 

 

ํ•˜์ง€๋งŒ ์‹ค์ œ ์ƒํ™ฉ์—์„  ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๊ตํ†ต์ด ๋ง‰ํ˜€์„œ ์˜คํžˆ๋ ค ์†๋‹˜์„ ๋ชป ๋ฐ›๊ฑฐ๋‚˜, ๊ฒฝ์Ÿ์ž(ํƒ์‹œ ๊ณต๊ธ‰์ž)๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ์˜คํžˆ๋ ค ์†๋‹˜ ์žก๊ธฐ๊ฐ€ ๋น ๋“ฏํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๋˜ ์‹ค์ œ ์ƒํ™ฉ๊ณผ ์ž˜ ์กฐํ™”ํ•˜์—ฌ ์ „๋žต์„ ์งœ์•ผํ•  ๊ฒƒ์ด๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์†๋‹˜์„ ๋งŽ์ด ๋ฐ›๋Š” ์ „๋žต์„ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์งœ๋ณด์•˜๋‹ค. 

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„  ํŒ๊ณผ ์š”๊ธˆ, ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ „๋žต์„ ๋” ์„ธ์„ธํ•˜๊ฒŒ ์งœ ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.