PC01
PC01
PC01
ANALÍTICA DE DATOS
Integrantes:
Lescano Avalos Miguel Angel 20161212D
Pazce Alama Patricia Elena 20162612F
Timana Mendoza Abelardo 20152582G
Obregon Zavaleta Harold André 20161081G
Docente:
2020
ÍNDICE
3. Solución de la práctica 8
3.1 Manejo de filas y columnas: visualización y filtrado 8
3.2 Valores perdidos de cada columnas y filas duplicadas 9
3.3 Outliers 10
3.4 Recta lineal y su correlación R 10
3.5 Gráficos Estadísticos: tablas de frecuencia, diagrama de Pareto, mapa de calor, pie,
etc 13
3.6 Análisis de Componentes Principales 21
3.7 Nube de palabras 29
3.8 Pre Procesamiento de Datos: Variables Dummy (One Hot Encoding) 34
3.9 Algoritmo Apriori 35
Misión
Distribuir los productos y servicios de Claro a las personas del sur de lima, en el menor
tiempo posible, cumpliendo con los estándares de calidad y brindándole una buena
atención y generando confianza al cliente.
Visión
Ser la empresa líder de distribución telefónica en la provincia de Cañete y Lima, brindando
la mejor atención y confianza en sus productos. Además de ofrecer servicios de atención
al cliente para atender consultas y reclamos de los clientes.
Usuario Son las personas que trabajan para telsur comunicaciones entre
ellas tenemos: vendedor, administrador, contador y gerente.
● Vendedor : Brinda información sobre los productos y realiza la
venta de dicho producto.
● Administrador: Solicita los recursos logísticos a Claro para la
venta y gestiona el recurso humano.
● Contador : Encargado de realizar informes financieros y
tributarios de la empresa.
● Gerente : Encargado de tomar decisión como inversión,
nuevos eventos y establecer relaciones con Claro.
1.4 Productos
Los productos se dividen en tres categorías principales: Claro Hogar, Equipos Postpago
e Internet fijo inalámbrico.
Figura 3 : Productos de la Empresa Telsur Comunicaciones S.A.C
A continuación presentamos en la Tabla 1 los campos que son almacenados por el sistema
TIWI para la empresa Telsur Comunicaciones S.A.C.
Lugar de Entrega Indica el lugar de entrega del producto al cliente. Los puntos de
ventas actualmente son 2: Tienda 1 y Tienda 2.
PLAN Indica el plan del celular o chip vendido. Puede ser planes postpago,
prepago,Recuperación, Renovación.
MÉTODO PAGO Indica el método de pago. La empresa actualmente trabaja solo con
efectivo.
TS["FECHA"]= pd.to_datetime(TS["FECHA"])
TS["Dia"]= TS["FECHA"].dt.day
TS["Año"]= TS["FECHA"].dt.year
TS["Mes"]= TS["FECHA"].dt.month
TS["Año"].astype(int)
TS["Mes"].astype(int)
TS["Dia"].astype(int)
a) Eliminando filas con algun elemento Vacios o nulo (NULL / NaN / NaT)
TS = TS.dropna(subset=['NETO'])
Actualizando Indices
TS = TS.reset_index(drop=True)
b) Generando la recta
RES= total_recaudado['FACTURADO_SOLES']-Y
TOT=total_recaudado['FACTURADO_SOLES']-
total_recaudado['FACTURADO_SOLES'].mean()
R2=1-(RES.dot(RES)/TOT.dot(TOT))
print(R2)
El gráfico muestra el monto total facturado en soles por cada tienda. Al igual que el
gráfico anterior, el mes de Septiembre es en el que se realizaron mayor cantidad de
ventas en ambas tiendas.Por otra parte, en el Mes de octubre, se nota una diferencia
de mas de 5 000 soles en ingresos entre las tiendas.
b) Creando Histograma
El histograma muestra la cantidad de ventas de cada mes en todo el negocio
(ambas tiendas). Comparándolo con los gráficos anteriores, en el mes de noviembre
se nota que se realizaron más transacciones que en octubre, sin embargo el monto
facturado de éste es superior al de noviembre. El mes de Diciembre se reportaron
pocas transacciones debido a que la data se recolectó los primeros días de dicho
mes.
plt.hist(TS['Mes'])
plt.show
Este histograma fue hecho usando la librería seaborn. A comparación del anterior, que se
realizó usando Matplotlib, este tiene un diseño más claro debido a la separación de cada
barra.
sns.displot(TS['Mes'])
plt.show
Gráfico que muestra el top 20 de los productos más vendidos. Como se puede
observar, los chips y las recargas son los que abarcan un gran porcentaje de las
transacciones.
df3=TS.copy()
df3=df3.groupby(["PRODUCTO"])["FACTURADO_SOLES"].count().reset_index()
df3=df3.sort_values("FACTURADO_SOLES",ascending=False)
sns.barplot(x="FACTURADO_SOLES",y="PRODUCTO",data=df3[0:20])
plt.xlabel("Top Productos Vendidos")
plt.show()
d) Diagrama de pareto
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter
fig, ax = plt.subplots()
ax.bar(df3["PRODUCTO"], df3["FACTURADO_SOLES"], color="C0")
ax2 = ax.twinx()
ax2.plot(df3["PRODUCTO"], df3["porcentajes"], color="C1", marker="D",
ms=7)
ax2.yaxis.set_major_formatter(PercentFormatter())
ax.tick_params(axis="y", colors="C0")
ax2.tick_params(axis="y", colors="C1")
plt.setp(ax.get_xticklabels(), rotation=90,
horizontalalignment='right')
plt.show()
Tomando los 10 productos principales aplicamos pareto
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter
fig, ax = plt.subplots()
ax.bar(df3["PRODUCTO"], df3["FACTURADO_SOLES"], color="C0")
ax2 = ax.twinx()
ax2.plot(df3["PRODUCTO"], df3["porcentajes"], color="C1", marker="D",
ms=7)
ax2.yaxis.set_major_formatter(PercentFormatter())
ax.tick_params(axis="y", colors="C0")
ax2.tick_params(axis="y", colors="C1")
plt.setp(ax.get_xticklabels(), rotation=60,
horizontalalignment='right')
plt.show()
Más del 80% de los ingresos proviene de celulares de la marca motorola, samsung A1,
Xiaomi y LG K20 mientras que el resto es de A10S y APP IPHXS
e) PIE
Data=df9['CANTIDAD'].reset_index()
Data.head()
my_data=Data['CANTI DAD']
my_labels=Data['VENDEDOR']
plt.pie (my_data, labels = my_labels, autopct = '% 1.1f %%')
plt.title ('Mi título')
plt.axis ('equal')
plt.show ()
my_data=Data['CANTIDAD']
my_labels=Data['VENDEDOR']
my_explode = (0, 0.1, 0)
my_colors = ['lightblue','lightsteelblue','silver']
plt.pie(my_data, labels=my_labels, autopct='%1.1f%%', startangle=15,
shadow = True, colors=my_colors, explode=my_explode)
plt.title('% DE TRANSACCIONES POR CADA VENDEDOR')
plt.axis('equal')
plt.show()
Se observa que la vendedora con más productos vendidos es Sheyla Flores, con
más del 53%. Por otro lado, Julia Chavez es la vendedora con menor rendimiento.
Esto se puede explicar, ya que esta vendedora trabaja por las mañanas, y como se
vió en el mapa de calor, las ventas en esas horas son muy bajas.
ÁREA TIPO
PREPAGO
CHIPS
RECARGA
CLARO
EQUIPOS CELULARES
OTROS
ACCESORIOS
... ...
AUDIFONO
CARGADOR
ACCESORIOS TECLITAS
MICA
PROTECTOR
OTROS
#Librerías básicas
import numpy as np
import pandas as pd
Obtención de Textos
def get_texto_url(list_webs):
try:
web = requests.get(url, headers=headers)
soup = BeautifulSoup(web.text)
parrafos = soup.find_all('p')
for p in parrafos:
long += len(p.text)
texto += " "+ str(p.text)
except:
print("Error en la url {}, response {}".format(url,web))
texto = get_texto_url(webs)
Limpieza
punctuation=[]
for s in string.punctuation:
punctuation.append(str(s))
sp_punctuation = ["¿", "¡", "“", "”", "…", ":", "–", "»", "«"]
punctuation += sp_punctuation
punctuation[:10]
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*']
################
nltk.download('stopwords')
stop_words = stopwords.words('spanish')
for p in punctuation:
clean_texto = clean_texto.replace(p,"")
palabras = []
word_count={}
plot_bar(data=df, top=5)
Nube de Palabras
plt.figure(figsize=(10,8))
plt.imshow(word_cloud)
plt.axis('off')
plt.tight_layout(pad=0)
plt.show()
3.8 Pre Procesamiento de Datos: Variables Dummy (One Hot
Encoding)
Las variables dummy corresponderá a los campos: AREA y TIPO de la tabla (T2)
area_dummy = pd.get_dummies(T2["AREA"],prefix="AREA")
tipo_dummy = pd.get_dummies(T2["TIPO"],prefix="AREA")
T2_dummies =
T2.drop(T2.columns[[0,1,2,3,4,5,6,7,8,9,10,14,15,16,17,18,19,20,21,22,2
3,25,26,27,28,29]], axis = 1)
T2_dummies.head()
Arguments:
transactions -- A transaction iterable object
(eg. [['A', 'B'], ['B', 'C']]).
"""
self.__num_transaction = 0
self.__items = []
self.__transaction_index_map = {}
Arguments:
transaction -- A transaction as an iterable object (eg.
['A', 'B']).
"""
for item in transaction:
if item not in self.__transaction_index_map:
self.__items.append(item)
self.__transaction_index_map[item] = set()
self.__transaction_index_map[item].add(self.__num_transacti
on)
self.__num_transaction += 1
Arguments:
items -- Items as an iterable object (eg. ['A', 'B']).
"""
# Empty items is supported by all transactions.
if not items:
return 1.0
if sum_indexes is None:
# Assign the indexes on the first time.
sum_indexes = indexes
else:
# Calculate the intersection on not the first time.
sum_indexes = sum_indexes.intersection(indexes)
def initial_candidates(self):
"""
Returns the initial candidates.
"""
return [frozenset([item]) for item in self.items]
@property
def num_transaction(self):
"""
Returns the number of transactions.
"""
return self.__num_transaction
@property
def items(self):
"""
Returns the item list that the transaction is consisted of.
"""
return sorted(self.__items)
@staticmethod
def create(transactions):
"""
Create the TransactionManager with a transaction instance.
If the given instance is a TransactionManager, this returns
itself.
"""
if isinstance(transactions, TransactionManager):
return transactions
return TransactionManager(transactions)
Arguments:
prev_candidates -- Previous candidates as a list.
length -- The lengths of the next candidates.
"""
# Solve the items.
item_set = set()
for candidate in prev_candidates:
for item in candidate:
item_set.add(item)
items = sorted(item_set)
Arguments:
transaction_manager -- Transactions as a TransactionManager
instance.
min_support -- A minimum support (float).
Keyword arguments:
max_length -- The maximum length of relations (integer).
"""
# Parse arguments.
max_length = kwargs.get('max_length')
# For testing.
_create_next_candidates = kwargs.get(
'_create_next_candidates', create_next_candidates)
# Process.
candidates = transaction_manager.initial_candidates()
length = 1
while candidates:
relations = set()
for relation_candidate in candidates:
support =
transaction_manager.calc_support(relation_candidate)
if support < min_support:
continue
candidate_set = frozenset(relation_candidate)
relations.add(candidate_set)
yield SupportRecord(candidate_set, support)
length += 1
if max_length and length > max_length:
break
candidates = _create_next_candidates(relations, length)
Arguments:
transaction_manager -- Transactions as a TransactionManager
instance.
record -- A support record as a SupportRecord instance.
"""
items = record.items
for combination_set in combinations(sorted(items), len(items) - 1):
items_base = frozenset(combination_set)
items_add = frozenset(items.difference(items_base))
confidence = (
record.support /
transaction_manager.calc_support(items_base))
lift = confidence / transaction_manager.calc_support(items_add)
yield OrderedStatistic(
frozenset(items_base), frozenset(items_add), confidence,
lift)
Arguments:
ordered_statistics -- A OrderedStatistic iterable object.
Keyword arguments:
min_confidence -- The minimum confidence of relations (float).
min_lift -- The minimum lift of relations (float).
"""
min_confidence = kwargs.get('min_confidence', 0.0)
min_lift = kwargs.get('min_lift', 0.0)
API
Arguments:
transactions -- A transaction iterable object
(eg. [['A', 'B'], ['B', 'C']]).
Keyword arguments:
min_support -- The minimum support of relations (float).
min_confidence -- The minimum confidence of relations (float).
min_lift -- The minimum lift of relations (float).
max_length -- The maximum length of the relation (integer).
"""
# Parse the arguments.
min_support = kwargs.get('min_support', 0.1)
min_confidence = kwargs.get('min_confidence', 0.0)
min_lift = kwargs.get('min_lift', 0.0)
max_length = kwargs.get('max_length', None)
# Check arguments.
if min_support <= 0:
raise ValueError('minimum support must be > 0')
# For testing.
_gen_support_records = kwargs.get(
'_gen_support_records', gen_support_records)
_gen_ordered_statistics = kwargs.get(
'_gen_ordered_statistics', gen_ordered_statistics)
_filter_ordered_statistics = kwargs.get(
'_filter_ordered_statistics', filter_ordered_statistics)
# Calculate supports.
transaction_manager = TransactionManager.create(transactions)
support_records = _gen_support_records(
transaction_manager, min_support, max_length=max_length)
def parse_args(argv):
"""
Parse commandline arguments.
Arguments:
argv -- An argument list without the program name.
"""
output_funcs = {
'json': dump_as_json,
'tsv': dump_as_two_item_tsv,
}
default_output_func_key = 'json'
parser = argparse.ArgumentParser()
parser.add_argument(
'-v', '--version', action='version',
version='%(prog)s {0}'.format(__version__))
parser.add_argument(
'input', metavar='inpath', nargs='*',
help='Input transaction file (default: stdin).',
type=argparse.FileType('r'), default=[sys.stdin])
parser.add_argument(
'-o', '--output', metavar='outpath',
help='Output file (default: stdout).',
type=argparse.FileType('w'), default=sys.stdout)
parser.add_argument(
'-l', '--max-length', metavar='int',
help='Max length of relations (default: infinite).',
type=int, default=None)
parser.add_argument(
'-s', '--min-support', metavar='float',
help='Minimum support ratio (must be > 0, default: 0.1).',
type=float, default=0.1)
parser.add_argument(
'-c', '--min-confidence', metavar='float',
help='Minimum confidence (default: 0.5).',
type=float, default=0.5)
parser.add_argument(
'-t', '--min-lift', metavar='float',
help='Minimum lift (default: 0.0).',
type=float, default=0.0)
parser.add_argument(
'-d', '--delimiter', metavar='str',
help='Delimiter for items of transactions (default: tab).',
type=str, default='\t')
parser.add_argument(
'-f', '--out-format', metavar='str',
help='Output format ({0}; default: {1}).'.format(
', '.join(output_funcs.keys()), default_output_func_key),
type=str, choices=output_funcs.keys(),
default=default_output_func_key)
args = parser.parse_args(argv)
args.output_func = output_funcs[args.out_format]
return args
Arguments:
input_file -- An input file.
Keyword arguments:
delimiter -- The delimiter of the transaction.
"""
delimiter = kwargs.get('delimiter', '\t')
for transaction in csv.reader(input_file, delimiter=delimiter):
yield transaction if transaction else ['']
def dump_as_json(record, output_file):
"""
Dump an relation record as a json value.
Arguments:
record -- A RelationRecord instance to dump.
output_file -- A file to output.
"""
def default_func(value):
"""
Default conversion for JSON value.
"""
if isinstance(value, frozenset):
return sorted(value)
raise TypeError(repr(value) + " is not JSON serializable")
converted_record = record._replace(
ordered_statistics=[x._asdict() for x in
record.ordered_statistics])
json.dump(
converted_record._asdict(), output_file,
default=default_func, ensure_ascii=False)
output_file.write(os.linesep)
def dump_as_two_item_tsv(record, output_file):
"""
Dump a relation record as TSV only for 2 item relations.
Arguments:
record -- A RelationRecord instance to dump.
output_file -- A file to output.
"""
for ordered_stats in record.ordered_statistics:
if len(ordered_stats.items_base) != 1:
continue
if len(ordered_stats.items_add) != 1:
continue
output_file.write('{0}\t{1}\t{2:.8f}\t{3:.8f}\t{4:.8f}
{5}'.format(
list(ordered_stats.items_base)[0],
list(ordered_stats.items_add)[0],
record.support, ordered_stats.confidence,
ordered_stats.lift,
os.linesep))
def main(**kwargs):
"""
Executes Apriori algorithm and print its result.
"""
# For tests.
_parse_args = kwargs.get('_parse_args', parse_args)
_load_transactions = kwargs.get('_load_transactions',
load_transactions)
_apriori = kwargs.get('_apriori', apriori)
args = _parse_args(sys.argv[1:])
transactions = _load_transactions(
chain(*args.input), delimiter=args.delimiter)
result = _apriori(
transactions,
max_length=args.max_length,
min_support=args.min_support,
min_confidence=args.min_confidence)
for record in result:
args.output_func(record, args.output)
transactions = []
for i in range(0, 7501):
transactions.append([str(dataset.values[i,j]) for j in range(0,
20)])
# Resultados
results = list(rules)
def inspect(results):
rh = [tuple(result[2][0][0]) for result in results]
lh = [tuple(result[2][0][1]) for result in results]
supports = [result[1] for result in results]
confidences = [result[2][0][2] for result in results]
lifts = [result[2][0][3] for result in results]
return list(zip(rh, lh, supports, confidences, lifts))